RobotZero di Roberto
Vediamo come realizzare un semplice robot.
Dopo aver realizzato la 628Board ho pensato che il modo migliore per testarla
sarebbe stato realizzare un semplice Robot. Quindi mi sono guardato un po' intorno, recuperando materiale qua e la ho
realizzato "RobotZero", questo nome mi è venuto in mente proprio ora che sto scrivendo, visto che non è proprio un
primo robot, ma una vera e propria base di partenza sulla quale fare esperimenti di ogni genere, infatti la prossima cosa
che farò e montare un telemetro a infrarossi, per studiarne il funzionamento.
Ma torniamo a noi eccovi una foto completa dell'accrocco.
Come si può vedere il termine "accrocco" non è sbagliato, ma come dicevo prima serve per studiare. Il circuito è composto
da una 628Board, "cervello" del sistema, da un ponte H realizzato con L293D per
pilotare i motori e due baffi, che altro non sono che semplici interruttori per evitare gli ostacoli.
Il circuito è alimentato da 4 batterie stilo, quelle che ho usato io sono batterie ricaricabili da 1,2V, per un totale di 4,8V
questo mi da la possibilità di alimentare direttamente tutta l'elettronica senza la necessità di montare uno stabilizzatore.
Spesso il problema principale per realizzare un robot sta nella realizzazione della meccanica, io in questo caso ho usato
qualcosa di già pronto, la base del primo robot della De Agostini, comunque in caso avete difficolta ora se ne trovano
anche in commercio. La base che ho utilizzato monta 2 motori con relativa riduzione e un ruotino piroettante d'appoggio.
Ho sfruttato la grande base per montarci il porta pile e una breadboard per realizzare il circuito del ponte H e la
628Board, ma se avete una base più piccola potete pensare sempre ad un montaggio a
strati. I baffi sono degli switch di contatto ai quali ho fissato con dei faston del comune filo di ferro come si può
vedere nella foto, il funzionamento dei baffi è quello di un comune interrutore, il PIC ne controlla lo stato per capire
se è a contatto con un ostacolo o no.
I motori sono pilotati con un segnale PWM, questo permette di realizzare una semplice accelerazione, e non richiedere
troppa corrente alle batterie alla partenza. La soluzione migliore sarebbe stata avere 2 PWM, ma il PIC 16F628 ne ha soltanto
uno. Se desiderate approfondire il discorso sul PWM, vi consiglio di leggere il tutorial di Giovanni Giannetti al seguente
link: http://www.tmasi.com/robotica/pwmtut/PWMTut_H.htm.
Lo schema seguente è quello relativo al circuito, riporta le indicazioni dei collegamenti alla 628Board.
Esaminiamo ora il codice:
Analizziamo prima il codice della funzione main. Al solito per prima cosa vengono inizializzati i registri per il funzionamento
delle porte, poi vengono richiamate le funzioni per inizializzare il display. La funzione "lcd_puts("PWM DMS SBD ???");"
viene usata per stampare sulla prima riga del display delle etichette, di variabili che utilizzeremo per il debug del
robot. I valori di tali vaiabili, vengono stampati sotto le etichette nella seconda righa, ad esempio l'etichetta PWM
indica la variabile che contiene il valore del PWM generato dal PIC che varia da 0 a 255. Per scrivere questi valori
sotto le etichette viene usata la funzione "lcd_put_uchar(valore,riga, colonna);", dove valore è la
variabile che si vuole visualizzare (di tipo unsigned char), riga è la riga del display su cui scrivere, e
colonna è la colonna dove va posizionato il valore. Attenzione il valore viene sempre stampato con 3 caratteri
a partire dalla posizione colonna, ad esempio se la variabile da visualizzare contiene zero il risultato sarà
"000".
Il passo successivo è l'inizializzazione del PIC per la generazione del segnale PWM, il primo registro da valorizzare è
CCPR1L questo registro contiene gli 8 bit più significativi per la regolazione del duty-cycle, in questo esempio
si useranno solo questi bit tralasciando i 2 meno significativi esclusivamente per semplicità di realizzazione. Per gli
altri registri è possibile vedere in tutorial indicato in precedenza o il data sheet, per una spiegazione più dettagliata.
Vediamo ora la funzione motori(0,0,100); richiamata prima del loop infinito. Questa funzione molto grezza, serve
semplicemente a generare una rampa di accelerazione per i motori, ed impostare la direzione in cui devono girare. I
valori impostati del duty cycle iniziale nel ciclo for(vedi variabile "duty") e il controllo iniziale sulla variabile
"rit_acc", sono definiti in base alla caratteristiche dei motori utilizzati, potrebbe essere necesario modificarli, se
le caratteristiche dei motori che utilizzate sono diverse da quelle che ho usato io. Comunque controllando i dati
visualizzati sul display, avanzando per tentativi si può trovare facilmente il valore più adatto.
Nel loop infito che chiude il programma, viene controllato continuamente lo stato dei baffi e nel caso in cui uno di
questi risultasse premuto, il robot retrocede per un periodo di tempo indicato nella funzione motori, poi gira nella
direzione opposta al baffo premuto e successivamente riprende ad andare avanti. Anche in questo caso le temporizzazioni
potrebbero avere la necessità di essere modificati in base alle caratteristiche dei vostri motori.
A questo punto non vi resta che divertirvi a fare delle prove con il vostro nuovo robot.
:: Scarica i sorgenti di RobotZero ::
|