LeJOS NXJ: Nowy sterownik dla sensora HiTechnic IRLink.

Mindstorms, WeDo, Lego Digital Desinger, Stud.io

Moderatorzy: Mod Team, Mod Team

Autor
Wiadomość
Awatar użytkownika
szimonek
Posty: 118
Rejestracja: 2006-06-06, 13:24
Lokalizacja: Legionowo
Kontakt:

LeJOS NXJ: Nowy sterownik dla sensora HiTechnic IRLink.

#1 Post autor: szimonek »

Witam,

Jakiś czas temu zabrałem się za przebudowę sterownika do sensora HiTechnic IRLink zawartego w LeJOS NXJ. Obecnie nową wersję tego sterownika mogę uznać za zakończoną, przetestowaną i gotową do podzielenia się nią.

Sterownik do IRLink zawarty w LeJOS 0.9.1 nie uległ zmianie od czasu wydania tej wersji 6 lutego 2012 roku. Kod tego sterownika znajdujący się w repozytorium SVN projektu jest identyczny z kodem z tego wydania. Sterownik ten umożliwia:
1. Sterowanie Power Function w trybie Combo Direct Mode.
2. Emulację pilota do MINDSTORMS RCX.

Mi przede wszystkim brakowało dwustronnej komunikacji z RCX oraz obsługi PF w trybie bez timeoutów. Moja wersja sterownika zawiera następujące przetestowane funkcjonalności:
1. Sterowanie Power Function w każdym z 4 trybów jego pracy opisanym w dokumentacji:
- Extended Mode
- Combo Direct Mode (kod przebudowany w celu uzyskania uniwersalnych wywołań)
- Single Output Mode (włączając komendy PWM i CSTID)
- Combo PWM Mode
2. Emulację pilota do RCX (kod nie był zmieniany).
3. Sterowanie silnikami podpiętymi do portów RCX:
- Start-Stop-Float (metoda motorStartStop)
- sterowanie kierunkiem obrotu (metoda motorDirection)
- sterowanie prędkością obrotu (na tyle na ile umożliwia to firmware, metoda motorPower)
4. Ustawianie typów sensorów i trybu ich pracy podpiętych do portów RCX (metody setSensorType, setSensorMode i setSensorModeWithSlope)
5. Odgrywanie predefiniowanych dźwięków systemowych (metoda playSystemSound)
6. Ustawianie mocy odbiornika IR (metody setTXRange oraz bazujące na niej setShortRange i setLongRange)
7. Utrzymywanie aktywności kostki (metoda sendAlive)
8. Sprawdzenie poziomu naładowania baterii w RCX (metoda getBatteryLevel)
9. Odczytywanie wartości z dowolnego źródła (dla prawidłowych par source-value, metoda pollSourceValue)
10. Czytanie wartości z sensorów. Zwracanych jako wartość logiczna, liczba całkowita lub zmiennoprzecinkowa (metody pollFromSensor oraz bazujące na niej getSensorIntValue, getSensorBooleanValue i getSensorDoubleValue)
11. Czytanie nieprzetworzonych wartości zwracanych przez sensory (metody getSensorUnprocessedRawValue i getSensorUnprocessedBooleanValue)
12. Odgrywanie tonów (metoda playTone)

Na kostkę RCX musi być wgrany oryginalny firmware LEGO. Ponieważ sygnał zwrotny zawierający odczytaną wartość sensora jest dość długi, to pojedynczy odczyt trwa około 150ms. Oznacza to maksymalną rozdzielczość około 6 odczytów wartości sensora na sekundę, a jeśli chcemy czytać wartości ze wszystkich 3 sensorów to przeczytamy je tylko 2 razy na sekundę. Ograniczenie to wynika z prędkości transmisji sygnału przez podczerwień i sposobu jego kodowania.
Wszystkie (poza jedną: odgrywaniem tonów) metody komunikacyjne z RCX, pracują w trybie weryfikacji sygnału zwrotnego. Korzystają ze wspólnej metody rcxCommLoop, która dba o powtórzenie komendy jeśli zwrócona wartość nie jest zgodna z oczekiwaniem (co się zdarza bardzo żadko w przypadkach zaburzonej widoczności pomiędzy sensorem IRLink a kostką RCX), oraz o ustawianie prawidłowych naprzemiennych wartości bitu 4 (0x08) który jest w komunikatach IR RCX tzw. bitem zmiany. Bez zmieniania tego bitu , RCX zignoruje dwie identyczne komendy występujące jedna po drugiej nawet jeśli posiadają różne wartości parametrów.
W przypadku odgrywania tonów, ważna jest nie tyle wartość zwrócona przez RCX ile czas trwania tonu. Dlatego jest to jedyna metoda, która nie używa rcxCommLoop i w ogóle nie czyta zwracanej przez RCX wartości. Co jest zresztą zrozumiałe, bo prawidłowe odebranie przez RCX tego polecenia natychmiast usłyszymy.

Ponieważ nie posiadam żadnego pociągu LEGO R/C, to chociaż teoretycznie wiem jak to zrobić, to nie jestem w stanie przetestować tej funkcjonalności sensora IRLink. Tak więc ten tryb pracy sensora IRLink był i jest nieobsługiwany przez sterownik IRLink dla LeJOS NXJ.

Jak chciałem się pochwalić rozbudowanym sterownikiem do sensora IRLink, to okazało się że ponieważ korzystam z kodu pobranego z repozytorium SVN to oprócz dołożenia sterownika do struktury klas i ich skompilowania, muszę jeszcze zbudować firmware dla NXJ.
Pobrałem i skompilowałem narzędzia, oraz skompilowałem przy ich użyciu firmware. Po wgraniu go na kostkę NXT, udało mi zamienić ją w cegłę. Jedyną opcją był twardy reset kostki i ponowne wgranie firmware 0.9.1 które działało. Okazuje się, że z kodu znajdującego się w repozytorium SVN projektu LeJOS NXJ, nie da się zbudować działającego firmware dla NXT. W związku z tym użyłem źródeł ostatniego oficjalnego firmware dla NXT i do nich dołożyłem swoje sterowniki. Całość po skompilowaniu działa prawidłowo, a sprawę spójności kodu zawartego w SVN muszę zgłosić na forum LeJOS-a.

Jeśli ktoś ma sensor IRLink i ma ochotę skorzystać z tego sterownika to opublikowałem go po tym adresem.
Zainteresowani znajdą tam też kilka artykułów na temat protokołów komunikacyjnych LEGO wykorzystujących podczerwień i ich wykorzystania w IRLink, oraz prosty sterownik dla IRReceiver, kolejnego sensora HiTechnic, którego obsługi nie ma w LeJOS NXJ. W chwili wolnej postaram się wrzucić na YT jakiś film pokazujący ten sterownik w działaniu.
Pozdrawiam
Szymon

ODPOWIEDZ