ultimo aggiornamento  14 gennaio 2012

JLCPCB - 2$ per prototipi di PCB, di qualsiasi colore. Produzione in 24 ore!
L'Azienda di prototipi PCB più popolare, con oltre 700.000 clienti in tutto il mondo!
Sorridi a tutto il mondo qualunque cosa accada!

 

Per la compilazione e il trasferimento del programma si utilizzerà l’apposito Editor scaricabile gratuitamente dal sito della Parallax.
 

Una volta caricato il programma, si dovrà trasferire quest’ultimo nel processore della scheda.

homotix

Si utilizzerà un cavo per realizzare un collegamento seriale tra il computer e la scheda.
Nel caso, sul computer in uso (per esempio un portatile), non fosse disponibile un connettore seriale, ma solo USB, si potranno utilizzare degli appositi convertitori seguendo le indicazione riportate sulle istruzioni di quest’ultimi.
Una volta realizzato il collegamento si accenderà la scheda, e si potrà verificare l’esistenza del collegamento utilizzando il comando 1 presente nel programma

Si aprirà una finestra analoga a quella sotto, che segnalerà su quale porta COM è stato trovato il Basic Stamp.

Potremmo cosi passare a trasferimento del programma utilizzando questa volta il comando 2, si aprirà in questo caso una finestra che mostrerà lo stato d’avanzamento del trasferimento del programma.

A questo punto si procederà a spegnere la scheda, si scollegherà il cavo seriale.
Si posizionerà il robot a terra in una zona libera e si accenderà nuovamente la scheda e si toccherà uno dei sensori.
A questo punto il robot dovrebbe avanzare in avanti e in linea retta, se questo non avvenisse il motivo potrebbe essere quello che risultano invertiti i cavi dei motori.
Semplicemente si dovranno invertire i cavi sulla morsettiere della scheda di controllo dei motori.
Nel caso invece l’andatura del robot non fosse rettilinea, ma questo tenderà ad andare verso destra o sinistra, occorrerà modificare i valori delle variabili:
SPEED_R e SPEED_L all’interno del programma, trasferendolo nuovamente sulla scheda di controllo con la procedura vista sopra.
Questo sino a quando l’andamento sarà soddisfacente.
Si verificherà poi il comportamento del robot nel caso dello scontro con degli oggetti, questo deve compiere le azioni imposte dal programma per aggirare l’ostacolo.

 


Programma BUG

Listato del programma di prova

'{$stamp BS2}
'*************************************************************************
'bug_program Ver 1.0
'Programma per Robot BUG
'di Adriano Gandolfo
'sito www.adrirobot.it
'*************************************************************************
'P0 Libera
'P1 Libera
'P2 Libera
'P3 Libera
'P4 Baffo Destro (X6)
'P5 Libera
'P6 Baffo Sinistro (X5)
'P7 Libera
'P8 Libera
'P9 Libera
'P10 Libera
'P11 Libera
'P12 Libera
'P13 Libera
'P14 Pololu micro dual serial motor controller linea di controllo
'P15 Pololu micro dual serial motor controller linea di reset
'--I/O linee
RBUMP VAR IN4
LBUMP VAR IN6
MC_RESET CON 15 'Porta reset
MC_SOUT CON 14 'Porta di controllo
DIRS = (1<<MC_RESET) | (1<<MC_SOUT)
'***Variabili
SPEED_R VAR Byte
SPEED_L VAR Byte
SPEED VAR Byte
SLOWSPEED VAR Byte
TURNTIME VAR Byte
'***Numero motore e direzione per il controllo del Pololu
LFWD CON 0 'Motore sinistro avanti
LBAK CON 1 'Motore sinistro indietro
RFWD CON 2 'Motore destro avanti
RBAK CON 3 'Motore destro indietro
'***Programma
HIGH MC_SOUT 'serial line idle state
LOW MC_RESET 'reset motor controller
HIGH MC_RESET
PAUSE 100
SPEED_R = 50 'Velocità motore Destro da 0 a 127
SPEED_L = 62 'Velocità motore Sinistro da 0 a 127
SPEED = 55 'Velocità motore per rotazione da 0 a 127
SLOWSPEED = 20 'Velocità per entambi i motori lenta
TURNTIME = 37 'Tempo per rotazione
twiddling: 'Premere un sensore per far muovere il robot
IF RBUMP = 0 THEN go
IF LBUMP = 0 THEN go
GOTO twiddling
go:
PAUSE 1000
loop: 'Vai avanti sino a che il sensore tocca qualcosa
SEROUT MC_SOUT, 84, [$80, 0, LFWD, SPEED_L]
SEROUT MC_SOUT, 84, [$80, 0, RFWD, SPEED_R]
'Motori DX e SX avanti alle rispettive velocità
IF (RBUMP = 0) THEN rbumped
IF (LBUMP = 0) THEN lbumped
'Se il sensore si attiva il robot ruota nell'appropriata direzione
GOTO loop
rbumped: 'Routine per contatto sensore Destro
SEROUT MC_SOUT, 84, [$80, 0, LBAK, SPEED]
SEROUT MC_SOUT, 84, [$80, 0, RBAK, SLOWSPEED]
PAUSE 1000
SEROUT MC_SOUT, 84, [$80, 0, LBAK, SPEED]
SEROUT MC_SOUT, 84, [$80, 0, RFWD, SPEED]
RANDOM TURNTIME
PAUSE (TURNTIME*5) + 250 'pausa tra 0.25 e 1.5 secondi
GOTO loop
lbumped: 'Routine per contatto sensore Sinistro
SEROUT MC_SOUT, 84, [$80, 0, LBAK, SLOWSPEED]
SEROUT MC_SOUT, 84, [$80, 0, RBAK, SPEED]
PAUSE 1000
SEROUT MC_SOUT, 84, [$80, 0, LFWD, SPEED]
SEROUT MC_SOUT, 84, [$80, 0, RBAK, SPEED]
RANDOM TURNTIME
PAUSE (TURNTIME*5) + 250
GOTO loop

Listato del programma con utilizzo della scheda sensori

Per la gestione del robot dotato della nuova scheda sensori occorrerà caricare nella memoria del processore il nuovo programma riportato nel Listato 1.
Questo utilizza tutti i sensori presenti.  Il robot navigherà autonomamente sfruttando FOTORESISTENZE, IR e BAFFI.
Il funzionamento è il seguente: il programma controlla il livello di luce (se ad esempio risulta maggiore a sinistra gira cercando luce di pari livello).
Se poi incontra oggetti li schiva con gli IR e se incontra oggetti più bassi i baffi permettono di evitarli.
Per far partire il robot occorre premere il pulsante posto sulla scheda.  Quando viene eseguita una retromarcia viene emesso un suono.
Se il microfono capta un suono il robot fa una pausa emettendo il suono di una sirena di polizia quindi ricomincia la navigazione.
Nel programma si potranno modificare le seguenti variabili per adattarle alle proprie necessità:

PDF del listato Programma BUG2

 

L’istruzione SEROUT

 Sintassi : SEROUT Tpin, Baudmode, [OutputData]

Tpin è una variabile/costante/espressione (0 - 16) è rappresenta in numero del pin da cui i dati seriali saranno trasmessi
Baudmode è una variabile/costante/espressione (0 - 65535) e specifica i parametri di trasmissione nel nostro caso è pari a 84 che significa 9600 baud, 8 bit nessuna parità segnale non invertito.
[OutputData] è una lista di variabili, costanti espressioni che devono essere trasmessi.

Nel nostro caso
1.Start Byte
2.Device Type
3.Motor Number and Direction
4.Motor Speed

Start Byte.
Deve essere SEMPRE 0x80 e indica al Pololu che stiamo per inviargli dei comandi.

Device Type.
Identifica il tipo di dispositivo ed in questo controllore corrisponde a 0x00 (0 in decimale). Anche questo è sempre zero.

Motor Number and Direction.

In questo caso entrano in gioco i singoli bit.    Della parola a otto bit che identifica questo particolare byte il bit0 indica la direzione di rotazione.    Se a 1 indica avanti, se a 0 indica indietro. I bit da 1 a 6 indicano il motore, ma i nostri sono solo 2.    Quindi se 0 significa M1 e se 1 indica M2. Il bit7 è sempre a zero.

Portato in decimale avremo:

0 = M1 indietro
1 = M1 avanti
2 = M2 indietro
3 = M2 avanti
 

Motor Speed.
Dei 256 valori che può assumere questo byte, sono usati solo i primi 127 (il bit7 è sempre a zero). Quindi un valore 0 significa motore fermo, mentre 127 significa motore a tutta velocità.

 

'{$stamp BS2}
'bug_program 2 Ver 1.0
'Programma per Robot BUG
'-----Dichiarazione variabili e costanti-----
SPEED_R CON 50 'Velocità motore Destro da 0 a 127
SPEED_L CON 55 'Velocità motore Sinistro da 0 a 127
SOGLIA CON 4 'Valore soglia per microfono
RCsinistra VAR Word 'Conterrà RC delle FotoRes
RCdestra VAR Word 'Conterrà RC delle FotoRes
StatoIR VAR Nib 'Tiene Conto dello stato degli IR
StatoBaffi VAR Nib 'Tiene Conto dello stato dei baffi
Periodo CON 1 'Periodo dell'impulso
Frequenza CON 38500'Frequenza dell'impulso riconosciuta
Alto CON 1 'Valore logico Alto
Basso CON 0 'Val logico Basso
LFWD CON 0 'Motore sinistro avanti
LBAK CON 1 'Motore sinistro indietro
RFWD CON 2 'Motore destro avanti
RBAK CON 3 'Motore destro indietro
x VAR Word 'Contatore loop
time VAR Word 'variabile misurazione pulsin
'-----Mappa piedini usati-----
R_DX VAR IN0 'Ricevitore IR DX
T_DX CON 1 'Trasmettitore IR DX
Pulsante VAR IN2 'Pulsante
PORTA_MIC CON 3 'Microfono
BaffoDx VAR IN4 'Baffo destro
spkr CON 5 'Buzzer
BaffoSx VAR IN6 'Baffo sinistro
T_SX CON 7 'Trasmettitore IR SX
R_SX VAR IN8 'Ricevitore IR SX
FotoRDx CON 9 'Fotoresistenza Dx
FotoRSx CON 10 'Fotoresistenza Sx
MC_SOUT CON 14 'Porta di controllo
MC_RESET CON 15 'Porta reset scheda motore
'-----Programma Principale-----
attesa:
IF Pulsante = 1 THEN attesa
FREQOUT spkr, 500, 3000
Main:
HIGH MC_SOUT
LOW MC_RESET
HIGH MC_RESET
PAUSE 100
GOSUB ControllaLuce
GOSUB ControllaBaffi
GOSUB ControllaIR
GOSUB ControllaSuono
GOTO main
'---SENSORI LUCE----
ControllaLuce:
HIGH FotoRSx
PAUSE 10
HIGH FotoRDx
PAUSE 10
RCTIME FotoRDx, Alto, RCdestra
RCTIME FotoRSx, Alto, RCsinistra
RCdestra=RCdestra/2
PAUSE 200
IF (RCsinistra<RCdestra) AND (ABS(RCsinistra-RCdestra)>7) AND (((RCsinistra+RCdestra)/2)<70) THEN Luce_Dx
IF (RCsinistra>RCdestra) AND (ABS(RCsinistra-RCdestra)>7) AND (((RCsinistra+RCdestra)/2)<70) THEN Luce_Sx
RETURN
Luce_Dx:
GOSUB ruota_destra
RETURN
Luce_Sx:
GOSUB ruota_sinistra
RETURN
'---SENSORI BAFFI----
ControllaBaffi:
statoBaffi.BIT0=BaffoSx
statoBaffi.BIT1=BaffoDx
BRANCH statoBaffi,[Frontale,Sensore_Dx,Sensore_Sx,Avanti]
RETURN
'---SENSORI INFRAROSSO----
ControllaIR:
FREQOUT T_SX,Periodo,Frequenza
statoIR.BIT0=R_SX
FREQOUT T_DX,Periodo,Frequenza
statoIR.BIT1=R_DX
BRANCH statoIR,[Frontale,Sensore_DX,Sensore_SX,Avanti]
RETURN
'---SENSORE SUONO----
controllaSuono:
PULSIN PORTA_MIC, ALTO, time
IF time > SOGLIA THEN allarme
RETURN
'-----MOVIMENTI-----
Avanti:
SEROUT MC_SOUT, 84, [$80, 0, LFWD, SPEED_L]
SEROUT MC_SOUT, 84, [$80, 0, RFWD, SPEED_R]
PAUSE 500
RETURN
Frontale:
GOSUB motori_indietro
GOSUB ruota_sinistra
GOSUB motori_indietro
GOSUB ruota_sinistra
RETURN
Sensore_Sx:
GOSUB motori_indietro
GOSUB ruota_sinistra
RETURN
Sensore_Dx:
GOSUB motori_indietro
GOSUB ruota_destra
RETURN
'-----AZIONAMENTO MOTORI-----
Motori_indietro:
SEROUT MC_SOUT, 84, [$80, 0, LBAK, SPEED_L]
SEROUT MC_SOUT, 84, [$80, 0, RBAK, SPEED_R]
PAUSE 300
GOSUB Suono_retromarcia
RETURN
Ruota_sinistra:
SEROUT MC_SOUT, 84, [$80, 0, RFWD, SPEED_R]
SEROUT MC_SOUT, 84, [$80, 0, LBAK, SPEED_L]
PAUSE 300
GOSUB Suono_retromarcia
RETURN
Ruota_destra:
SEROUT MC_SOUT, 84, [$80, 0, LFWD, SPEED_L]
SEROUT MC_SOUT, 84, [$80, 0, RBAK, SPEED_R]
PAUSE 300
GOSUB Suono_retromarcia
RETURN
'------------------------------------
Suono_retromarcia:' retromarcia
FREQOUT spkr, 500, 1900
RETURN
'------------------------------------
allarme:
SEROUT MC_SOUT, 84, [$80, 0, LFWD, 0]
SEROUT MC_SOUT, 84, [$80, 0, RFWD, 0]
FOR x = 1 TO 4
FREQOUT Spkr,1000,1400,2060
FREQOUT Spkr,1000,2450,2600
NEXT
RETURN

 

Elenco revisioni
14/01/2012 Aggiornato pagina
27/12/2011 Aggiornato pagina
14/09/2006 Inserito programma di gestione della scheda sensori
01/06/2006 Emissione preliminare