====== Laboratorium (zapoznanie z PLNXT) ======
===== Opis =====
Cel: zapoznanie z interfejsem programistycznym PLNXT i budowa prostych algorytmów.
Środki:
* zestaw LEGO,
* adapter BT,
* PLNXT.
===== Przygotowanie stanowiska =====
__UWAGA!__ Przed rozpoczęciem ćwiczeń należy starannie przygotować swoje stanowisko pracy [[lab215|zgodnie z instrukcją]].
===== Wstęp =====
PLNXT to API w języku Prolog dla LEGO Mindstorms NXT.
Praca nad PLNXT jest wciąż w toku. **Państwa uwagi w sprawozdaniach (także krytyczne) będą dla nas cenne.**
API jest podzielone na następujące wartswy:
* najniższa warstwa (nxt_actions),
* średnia warstwa (nxt_sensomoto),
* najwyższa warstwa (nxt_movement).
==== Warstwa nxt_actions ====
Warstwa odpowiada za komunikację z NXT. Mamy do dyspozycji predykaty poruszające silnikami, odczytującymi dane z sensorów, itp. W tej warstwie można zastosować różne systemy komunikacji. Na zajęciach będziemy używać komunikacji po porcie szeregowym z wykorzystaniem protokołu komunikacji LEGO.
==== Warstwa nxt_sensomoto ====
Warstwa bazuje na nxt_actions. To, co zostało zaimplementowane w niższej warstwie, w tej jest obudowane w logikę (np. sprawdzanie, czy wartość prędkości jest dopuszczalna).
==== Warstwa nxt_movement ====
**Warstwa, z której Państwo będziecie bezpośrednio korzystać.** Warstwa dostarcza predykaty realizujące złożoną pracę silników: ruch pojazdu do przodu, do tyłu, skręcanie, obracanie.
Dokumentacja: {{:pl:mindstorms:lab:nxt_movement.pdf|nxt_movement.pdf}}
===== Budowa robota =====
Należy zbudować robota opisanego w instrukcji QuickStart i dołączyć sensory.
===== Praca w powłoce SWIPL =====
Proszę uruchomić powłokę SWIPL (polecenie xpce) i załadować plik plnxt.pl ([plnxt].), a następnie:
* Otworzyć połączenie: nxt_open.
* Wykonać serię wybranych z dokumentacji poleceń (przemieszczanie, odczyt sensorów). Np.:
* nxt_go(300). % Jazda do przodu z prędkością 300 stopni/sekundę.
* nxt_stop.
* nxt_go_cm(400,80). % Jazda do przodu z prędkościa 400 stopni/sekundę. Zatrzymanie po 80 cm.
* nxt_touch(Value). % Odczyt sensora dotyku.
* nxt_sound(Value). % Odczyt sensora dźwięku.
* nxt_light(Value). % Odczyt sensora światła.
* nxt_light_LED(activate). % Włączenie diody sensora światła.
* nxt_light(Value).
* nxt_light_LED(passivate).
* nxt_ultrasonic(Value).
* nxt_rotate(350,360). % Obrót w prawo o 360 stopni z prędkością 350 stopni/sekundę.
* nxt_play_tone(500,2000). % Wydanie dźwięku o częstotliwości 500 Hz i czasie trwania 2000 ms.
* nxt_voltage_millivolt(Voltage). % Odczyt napięcia baterii.
* Zamknąć połączenie: nxt_close.
===== Programy w pliku =====
Większość predykatów ma swoją wersję z opcją 'force' (np. nxt_go(400,force).), która wymusza natychmiastowe wykonanie polecenia.\\
Brak tej opcji sprawia, że polecenie oczekuje z wykonaniem do zatrzymania robota.\\
To pozwala na pisanie sekwencyjnych programów, jak przykład niżej.
Proszę skopiować poniższy kod do pliku i załadować w SWIPL.
:- consult('sciezka_do_plnxt.pl').
start :-
nxt_open,
nxt_go_cm(400,80), % Jazda 80 cm do przodu z prędkością 400 stopni/sekundę.
nxt_go_cm(-400,80), % Jazda 80 cm do tyłu z prędkością 400 stopni/sekundę.
nxt_close.
:- start.
===== Do czego w takim razie przydaje się 'force'? =====
Proszę przetestować proste przykłady programów z wykorzystaniem mechanizmu trigger (dokumentacja: {{:pl:mindstorms:lab:threads.pdf|threads.pdf}}).
==== Przykład ====
:- consult('sciezka_do_plnxt.pl').
start :-
nxt_open,
trigger_create(_,check_distance,[nxt_stop,nxt_close]),
nxt_go(300).
check_distance :-
nxt_ultrasonic(Distance,force),
Distance < 15.
Trigger będzie wyzwolony, gdy check_distance będzie prawdziwe. Wtedy zostanie wykonane zatrzymanie robota i zamknięcie połączenia.\\
Zatem jest to prosty program: robot porusza się do przodu do napotkania przeszkody.\\
Pomiar odległości odbywa się cyklicznie. Bez opcji 'force' odbyłby się po zatrzymaniu silników (w tym przypadku "nigdy").\\
Robota czekałoby bolesne spotkanie z przeszkodą.
===== Implementacja algorytmu =====
Proszę zaimplementować poniższe algorytmy:
==== Algorytm 1 ====
Robot porusza się dowolnie wewnątrz obszaru ograniczonego czarną linią (można wykorzystać planszę testową). Nie może poza niego wyjechać! Gdy najedzie na czarną linię, powinien zawrócić -- niekoniecznie o 180 stopni, żeby było ciekawiej. Podpowiedź: można użyć formuły typu "//Angle is 120 + random(120)//".
==== Algorytm 2 ====
Robot podąża wzdłuż czarnej linii (można wykorzystać planszę testową). Nie może jej zgubić! Gdy napotka przeszkodę, powinien się zatrzymać i poinformować o problemie sygnałem dźwiękowym. Po usunięciu przeszkody robot powinien kontynuować jazdę.
===== Zakończenie =====
__UWAGA__! Prosze nie rozmontowywać robota!
**__UWAGA__**! Jeżeli należycie Państwo do ostatniej tego dnia grupy ćwiczeniowej, należy //wyciągnąć baterie z robota// i przekazać je prowadzącemu do naładowania!
===== Sprawozdanie =====
W przypisanej grupie przestrzeni nazw stworzyć stronę, na której umieścić:
* kod Państwa programów,
* spostrzeżenia, napotkane problemy, wnioski,
* uwagi dotyczące funkcjonalności PLNXT.
[[pl:dydaktyka:piw:2010:wykaz_sprawozdan|Wykaz sprawozdań]]