ultimo aggiornamento 14 gennaio 2012 |
|
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.
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.
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à:
SPEED_R e SPEED_L che modificano la velocità dei singoli motori
SOGLIA regola la sensibilità del microfono.
L’istruzione SEROUTSintassi : SEROUT Tpin, Baudmode, [OutputData] Tpin è una
variabile/costante/espressione (0 - 16) è rappresenta in numero del pin
da cui i dati seriali saranno trasmessi Nel
nostro caso Start Byte. Device Type. 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 Motor Speed. |
'{$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 |