Alogrytm: Śledzenie lini
Robot umieszczony na planszy testowej dojeżdża do grubej czarnej linii.
Od tego momentu jedzie wzdłuż tej linii.
Jeżeli wykryje brak linii, zatrzymuje się i obraca się w losowym kierunku.
Tak długo się obraca, aż znajdzie czarną linię.
Przerywa wtedy szukanie linii i zaczyna wzdłuż niej jechać.
Problem występuje głównie w przypadku szukania linii.
Skoro jest to losowe szukanie, może obracać się w złą stronę i w konsekwencji oddalać się od niej.
Wtedy, co raz nam się zdarzyło, obrócił się o 180% i zaczął jechać wzdłuż czarnej linii w przeciwnym kierunku.
Robot zatrzymuje się po wykryciu sygnału na czujniku dotyku.
:- consult('plnxt.pl').
start :-
nxt_open,
thread_create(first_run,_,[detached(true)]).
first_run :-
% dodac TID
nxt_light_LED(activate),
trigger_create(_,white_check,search_for_line),
% trigger_create(_,black_check,line_found),
trigger_create(_,press,stop),
go_on_buddy.
go_on_buddy :-
nxt_play_tone(1500,500),
nxt_go(150),
sleep(1).
press :-
nxt_touch(Value,force),
Value > 0.
white_check :-
nxt_light(Value,force),
Value > 45.
black_check :-
nxt_light(Value,force),
Value < 45.
search_for_line :-
nxt_stop,
nxt_play_tone(1000,1000),
trigger_create(_,black_check,line_found),
nxt_rotate(150,-15),
nxt_rotate(150,30).
line_found :-
% trigger_kill(TID),
nxt_stop,
nxt_play_tone(1500,1000),
% dodac TID
trigger_create(_,white_check,search_for_line),
go_on_buddy.
stop :-
trigger_killall,
nxt_stop,
nxt_close.
start.
Alogrytm: Sprzątacz
Robot ustawiony jest na środku obszaru, który ma posprzątać.
Powoli obraca się w jednym kierunku i jednocześnie sprawdza czujnikiem odległości, czy nie ma przeszkód przed nim.
Jeżeli taką wykryje zaczyna jechać w jej kierunku 40cm wypychając ją poza ustalony obszar i wraca.
Robot zatrzymuje się po wykryciu sygnału na czujniku dotyku.
:- consult('plnxt.pl').
start:-
nxt_open,
go_on_buddy,
trigger_create(_,pushed,[nxt_stop,nxt_close]).
go_on_buddy :-
nxt_turn(200,720),
% wpisujac 360 stopni robot obraca sie o 180
sleep(0.1), % Chwila przerwy, żeby jedno klaśnięcie nie zostało rozpoznane jako dwa.
trigger_create(Checkdistance,check_distance,[nxt_stop, nxt_go_cm(600,8), nxt_go_cm(-600,8)]).
clean_buddy :-
trigger_killall,
nxt_stop,
nxt_go_cm(600,8),
sleep(0.1),
nxt_play_tone(1500,1000),
nxt_go_cm(-600,8),
go_on_buddy.
% Sprawdzenie, czy sensor dotyku jest wciśnięty.
pushed :-
nxt_touch(Value,force),
Value=1.
check_distance :-
nxt_ultrasonic(Distance,force),
Distance < 40.
Używaliśmy dyrektywy nxt_play_tone aby rozpoznać który fragment kodu jest wykonywany.