W związku z tym, że mój robot nie był wyposażony w szczypce, nie podjąłem się zadania z piłką. Wybrałem zadanie 'panikarz'. Poniżej kod mojego rozwiązania:
:- consult('plnxt.pl').
start :-
nxt_open,
thread_create(go_on_buddy,_,[detached(true)]).
go_on_buddy :-
nxt_go(150),
sleep(1),
trigger_create(_,clap,run_buddy_run).
run_buddy_run :-
nxt_stop,
random(0,180,Rand),
Angle is 60+Rand,
nxt_rotate(350,Angle),
nxt_go_cm(400,20),
go_on_buddy.
% Sprawdzenie, czy natężenie dźwięku przekracza progową wartość.
clap :-
nxt_sound(Value,force),
Value > 35.
stop :-
trigger_killall,
nxt_stop,
nxt_close.
To zupełnie podstawowe rozwiązanie, działa ono poprawnie. Po skończeniu tego zadania chciałem dopisać do tego kodu modyfikację tak aby robot po zderzeniu z przeszkodą (czujnik nacisku) obracał się o 180 stopni i przechodził do podstawowego trybu (jazda). Chodziło o to żeby w trybie 'panika' nie próbował przejechać przez ścianę, tylko odwracał się i w normalnym już trybie jazdy kontynuował. Niestety pogubiłem się najwyraźniej w wątkach i kod nie działał poprawnie - po kilku poprawnych reakcjach zaczynał wariować. Kody wyglądał następująco:
:- consult('plnxt.pl').
start :-
nxt_open,
thread_create(first_run,_,[detached(true)]).
first_run :-
trigger_create(_,clap,run_buddy_run),
trigger_create(_,press,relax_buddy),
go_on_buddy.
go_on_buddy :-
nxt_go(150),
sleep(1).
run_buddy_run :-
nxt_stop,
random(0,180,Rand),
Angle is 60+Rand,
nxt_rotate(350,Angle),
nxt_go_cm(400,20),
trigger_create(_,clap,run_buddy_run),
go_on_buddy.
relax_buddy :-
nxt_stop,
nxt_play_tone(1000,1000),nxt_play_tone(1500,1000),nxt_play_tone(2000,1000),
nxt_rotate(200,180),
trigger_create(_,press,relax_buddy),
go_on_buddy.
% Sprawdzenie, czy natężenie dźwięku przekracza progową wartość.
clap :-
nxt_sound(Value,force),
Value > 35.
press :-
nxt_touch(Value,force),
Value > 0.
stop :-
trigger_killall,
nxt_stop,
nxt_close.