La struttura
del programma Insegue_Luce.bs2 è commentata e descritta anche
nel listato.
Il programma è costituito da una parte dichiarativa iniziale (variabili e
costanti), dalla verifica del tasto start/stop (chiamato anche pulsante
restart o tasto di reset) della scheda madre e infine dal ciclo infinito
all'interno del quale si svolge l'algoritmo di navigazione.
Per quanto riguarda quest'ultimo aspetto si è stabilito che il robot
cambierà la direzione di marcia in funzione dell'intensità luminosa
percipita dai due fotoresistori: il robot si muoverà nella direzione
corrispondente al fotoresistore (destro o sinistro) che ha ricevuto la
maggior quantità di radiazione luminosa.
Per avere un indicatore della luce rilevata occorre far riferimento a un
parametro caratteristico del circuito formato da condensatore e
fotoresistore, la costante di tempo.
Il valore di tale parametro risulta essere (per ragioni fisiche)
inversamente proporzionale all'intensità luminosa rilevata.
Attraverso l'istruzione PBasic rctime è possibile stimarne il
valore e memorizzarlo in un'opportuna variabile.
Confrontando i valori delle costanti di tempo dei due fotoresistori è
quindi possibile stabilire in quale direzione debba ruotare il robot: il
valore più piccolo indica la direzione da seguire.
È opportuno definire un valore di soglia tra i due valori delle costanti
di tempo, al di sotto del quale il robot non modifica la direzione di
marcia. In questo modo è possibile rendere il robot più o meno sensibile
alla diversa intensità luminosa percepita dai fotoresistori.
Invertendo
il confronto tra le due
costanti di tempo, decidendo cioè che il robot si muova nella direzione
corrispondente al fotorestistore con costante di tempo maggiore, si otterrà un
comportamento opposto da parte del robot che, anzichè inseguire la luce,
cercherà di evitarla
Modificare il valore della soglia per rendere il robot più o meno
sensibile alla differenze di luminosità.
|
|
' {$Stamp BS2}
' Programma che consente al robot di seguire una fonte luminosa: puoi
guidarlo puntando
' il fascio di una torcia elettrica sui fotoresistori montati sulla
bread-board.
'
Insegue_Luce.bs2
'-------------------
Variabili --------------------------
foto_SX VAR Word
' variabili nelle quali verrà memorizzato il valore
foto_DX VAR Word
' della costante di tempo relativa a ciascun fotoresistore
'------------------- Costanti ---------------------------
SOGLIA CON 5 '
serve a rendere più o meno sensibile il robot alla
' differenza di illuminazione dei fotoresistori.
' Aumentando il valore diviene meno sensibile.
'-------------------------- Programma principale
----------------------------------
main:
' Occorre misurare un parametro specifico del circuito formato da
capacitore e
' fotoresistore, la costante di tempo: questo parametro dipende, in
maniera inversamente
' proporzionale, dall'intensità luminosa che colpisce il fotoresistore,
più è intensa la
' luce minore è il valore della costante di tempo e viceversa.
' Misura la costante di tempo relativa al fotoresistore di destra
HIGH 9 ' Imposta
P9 al valore logico alto.
PAUSE 3
RCTIME 9,1,foto_DX
' Misura il valore della costante di tempo
' del fotoresistore e lo memorizza nella variabile foto_DX.
' Misura la costante di tempo relativa al fotoresistore di sinistra.
HIGH 10 '
Imposta P10 al valore logico alto.
PAUSE 3
RCTIME 10,1,foto_SX
' Misura il valore della costante di tempo
' del fotoresistore e lo memorizza nella variabile foto_DX.
' Controlla la differenza tra le due costanti di tempo; se il valore
assoluto (abs)
' della differenza è maggiore della soglia procede al confronto,
altrimenti le due costanti
' di tempo vengono considerate uguali e si lascia avanzare il robot.
IF ABS(foto_SX - foto_DX) > SOGLIA THEN
controlla_direzione
' routines per far avanzare il robot
avanza:
.............' inserire routines di movimento
GOTO main
controlla_direzione:
' se la costante di tempo di sinistra è maggiore di quella di destra
significa che il
' fotoresistore di sinistra ha ricevuto una minore quantità di luce e
quindi occorre
' girare verso destra per inseguire la luce
IF foto_SX > foto_DX THEN deviaDestra
' se la costante di tempo di sinistra è minore di quella di destra
significa che il
' fotoresistore di destra ha ricevuto una minore quantità di luce e quindi
occorre
' girare verso sinistra per inseguire la luce
IF foto_SX < foto_DX THEN deviaSinistra
deviaDestra:
' esegue una rotazione sul posto verso destra
..............'
inserire routines di movimento
GOTO main
deviaSinistra:
' esegue una rotazione sul posto verso sinistra
.............'
inserire routines di movimento
GOTO main |