Opis układu
Jak widać na rysunku 1, sercem układu jest moduł Arduino Nano, do którego dołączone są: klawiatura i elementy wykonawcze. W projekcie użyta została klawiatura starego typu – ze złączem DIN, która jest elektrycznie zgodna z nowszymi urządzeniami zaopatrzonymi w złącza PS/2. Taki wybór podyktowany został łatwością użycia – zastosowany procesor nie ma sprzętowego modułu obsługi USB (w szczególności obsługującego tryb pracy jako host, umożliwiający podłączanie innych urządzeń), tak więc wymagana byłaby programowa implementacja komunikacji.
Ponieważ przez pewien czas dostępne na rynku były klawiatury dwusystemowe – z możliwością dołączenia tak do portu PS2, jak i USB (przy użyciu pasywnego konwertera – przykładowy dostępny obecnie układ tego typu to HT82K629A), układ zaopatrzono także w złącze USB typu A. Jednak jak się okazało, żadna z posiadanych przez Autora klawiatur USB nie ma już takiej funkcji, tak więc możliwość dołączenia klawiatury USB nie jest gwarantowana i wymaga każdorazowych testów.
Opisywany układ pracuje jako enkoder kodu Morse’a połączony z reflektorem LED, gdzie prędkość wysyłania znaków (WPM – words per minute) jest konfigurowana i możliwa do zmiany w trakcie nadawania. Znaki wpisywane na klawiaturze wyświetlane są na wyświetlaczu LCD oraz – po zakodowaniu – są asynchronicznie transmitowane przy użyciu elementów wykonawczych z wykorzystaniem światła. Głównym elementem nadajnika jest matryca LED z reflektorem (zdemontowana ze starej latarki czołowej), zbudowana z 28 białych diod elektroluminescencyjnych.
Oprócz tego na potrzeby lokalnego odsłuchu sygnał podawany jest na dodatkową diodę LED i głośnik piezoelektryczny. Jako że jednym z założeń projektu była możliwość ustalenia tonu generowanego dźwięku (w chwili obecnej nie jest on jednak modyfikowany w trakcie działania układu, a jedynie zapisany w kodzie programu), zastosowano głośnik bez generatora, sterowany oddzielnie od diod LED.
W obu torach wykonawczych zastosowano tranzystory pracujące w układzie otwartego kolektora, których zadaniem jest zwiększenie obciążalności prądowej wyjść procesora. Ze względu na oczekiwany różny stopień obciążenia użyte zostały tranzystory różnych typów: w torze głośnika zastosowano typowy tranzystor BC237, a w torze reflektora BC635 o dopuszczalnym prądzie kolektora 1A. Dioda świecąca lokalnego monitorowania połączona jest równolegle do elementu nadawczego.
Montaż i uruchomienie
Jak pokazują fotografie, układ można zmontować z wykorzystaniem płytki uniwersalnej. W Elportalu wśród materiałów dodatkowych do tego numeru umieszczone jest oprogramowanie (szkic i opisane dalej biblioteki) oraz dwie dodatkowe fotografie.
Prawidłowo zmontowany układ po zaprogramowaniu powinien od razu pracować. Głośność sygnału dźwiękowego regulowana jest potencjometrem R3, a zadaniem elementów R4 i R7 jest rozładowanie pojemności rezonatora piezoelektrycznego w czasie, gdy tranzystor nie przewodzi. Efektem ubocznym zastosowania potencjometru R7 jest możliwość – w pewnym zakresie – regulacji tak tonu, jak i głośności sygnału (uzyskany obwód RC może ograniczać amplitudę drgań rezonatora oraz filtrować wyższe harmoniczne sterującego przebiegu prostokątnego).
Jako że potencjalnie układ może pobierać więcej prądu niż jest dopuszczalne z portu miniUSB modułu Arduino Nano (gdzie nawet w przypadku użycia zasilacza sieciowego ograniczenie stanowi dioda przełączająca źródła zasilania, specyfikowana do pracy z prądem 500mA oraz – w niektórych wykonaniach – bezpiecznik polimerowy 500mA), układ zaopatrzono w dodatkowe gniazdo zasilające, jednak jak wykazały pomiary, jego użycie nie jest tutaj konieczne:
- zastosowana klawiatura zużywa około 100mA prądu,
- po zastosowaniu rezystora R2 o wartości 22Ω prąd reflektora jest także rzędu 100mA (co przy średnim prądzie około 4mA/diodę daje możliwość dalszego zwiększenia jasności, jednak nawet w takiej konfiguracji reflektor daje bardzo jasne światło).
Obsługa modułu jest bardzo prosta: akceptowane są znaki odpowiadające podstawowemu zakresowi kodów Morse’a (A-Z, 0-9), których naciśnięcie powoduje wyświetlenie odpowiedniego znaku na wyświetlaczu i skolejkowanie go do wysyłki.
Strzałki „w górę” i „w dół” powodują odpowiednio zwiększenie i zmniejszenie tempa nadawania, a klawisz ESC czyści wyświetlacz jednocześnie wstrzymując wysyłkę zakolejkowanych znaków.
Oprogramowanie
Oprogramowanie modułu przygotowano przy użyciu środowiska Arduino.
Jako bibliotekę obsługującą kodowanie Morse’a użyto biblioteki Lewis autorstwa Patricka Fennera (https://git.defproc.co.uk/DefProc/Lewis/), rozpowszechnianej na licencji MIT, którą następnie rozszerzono o:
- możliwość zmiany tempa nadawania podczas pracy,
- obsługę drugiego toru wyjściowego z możliwością generowania sygnału o zadanej częstotliwości.
Asynchroniczny tryb pracy biblioteki Lewis wspierany jest przez bibliotekę TimerOne (autorzy: Toyko Dimitrov, Jesse Tane, Jérôme Despatis, Michael Polli, Dan Clemens, Paul Stoffregen, https://github.com/PaulStoffregen/TimerOne), implementującą konfigurację pierwszego układu czasowego procesora ATmega do generowania przerwań o zdefiniowanej częstości wywołań, podczas obsługi których wywoływana jest funkcja wysyłająca kolejne znaki z kolejki. Biblioteka ta licencjonowana jest licencją Creative Commons Attribution 3.0 US (https://creativecommons.org/licenses/by/3.0/us/).
Do obsługi klawiatury użyto biblioteki PS2KeyAdvanced, licencjonowanej na warunkach LGPL.
Jako że użyty moduł wyświetlacza zaopatrzony był w (dość ubogą w symbole graficzne) wersję pamięci znaków (A00), symbole strzałek zostały zaimplementowane jako znaki kodowane przez użytkownika. Kody symboli zostały załadowane bezpośrednio z pamięci programu celem ograniczenia niepotrzebnego zużycia pamięci RAM modułu Arduino.
Pojawia się pytanie, na jakiej licencji należałoby udostępnić tak przygotowany program. Potencjalne ograniczenia w tym zakresie dotyczą różnego licencjonowania użytych bibliotek. Udało się określić trzy typy licencjonowania komponentów zewnętrznych:
- licencja MIT użyta w bibliotece enkodera – tutaj problem jest najmniejszy, gdyż jedynym wymaganiem jest publikowanie informacji o twórcy oraz tekstu licencji,
- licencja Creative Commons Attribution 3.0 użyta w bibliotece TimerOne – tutaj także głównym, praktycznie jedynym wymaganiem twórców jest jasne podanie listy autorów,
- licencja LGPL w wersji 2.1, użyta w bibliotece obsługi klawiatury oraz (zgodnie z dokumentacją) w bibliotekach dostarczonych w ramach oprogramowania Arduino (informacja ta, jak się okazuje, jest zresztą pewnym uproszczeniem, gdyż każda z bibliotek może być licencjonowana oddzielnie i zdarzają się wyjątki od deklarowanego sposobu licencjonowania).
W przypadku licencji LGPL pojawia się dodatkowa komplikacja, gdyż licencja zakłada prawo do modyfikacji przez użytkownika komponentów jej podlegających, więc nie tylko należy je dostarczyć (lub udostępnić) w wersji umożliwiającej wprowadzenie zmian, ale także pozostałe części programu należy przygotować w sposób umożliwiający powtórne zbudowanie z użyciem zmodyfikowanej lokalnie biblioteki.
Oznacza to, że w celu dystrybucji oprogramowania należałoby:
- podać informacje o użytych bibliotekach wraz z danymi autorów, wskazaniami na oryginalne projekty, tekstami licencji oraz informacjami o ewentualnych modyfikacjach (licencje CC BY 3.0 US i MIT),
- dostarczyć oryginalne kody źródłowe wraz z informacją o licencjonowaniu dla komponentów licencjonowanych LGPL,
- dostarczyć kody źródłowe lub pliki obiektowe pozostałych komponentów w celu możliwości realizacji prawa użytkownika do użycia zmienionych wersji bibliotek licencjonowanych LGPL.
W związku z tym:
- zmiany w bibliotece Lewis zostały wydzielone do osobnego modułu i opatrzone licencją MIT (tak jak oryginał),
- zmiany w bibliotece LiquidCrystal (dostarczanej wraz z oprogramowaniem Arduino) zostały wydzielone do oddzielnego modułu pełniącego funkcję biblioteki oraz opatrzone licencją LGPL (zgodnie z wymaganiami oryginalnej licencji),
- reszta kodu została opatrzona licencją MIT.
Czyli, jak widać, ważnym zagadnieniem przy użyciu dostępnego w sieci oprogramowania jest analiza sposobów i kompatybilności licencjonowania, co może zaważyć tak na możliwości użycia określonych komponentów, jak i sposobie licencjonowania tak powstałej całości.