Realizziamo una semplice piattaforma motorizzata su due ruoteData di pubblicazione: 17-10-2003 | Versione Italiana | (No English Version) Parole chiave: - Domotica - PIC - |
Rielaborazione e traduzione in italiano di Sergio Tanzilli da un articolo originale
di Jan Malasek della Pololu Corporation.
La versione originale di questo articolo è disponibile su
http://www.pololu.com/projects/prj0001/.
Introduzione
La piattaforma motorizzata che andremo a presentare in questo articolo può essere utile per effettuare
i nostri primi esperimenti di movimentazione robotica e come base per la realizzazione di progetti
più complessi.
Figura 1 - Aspetto finale della piattaforma motorizzata
La meccanica
Come visibile in figura 1 la piattaforma è costituita da un telaio circolare in PVC del diametro di 125mm e spessore pari a 2.5mm.
Questo telaio viene fornito dalla Pololu (modello POCHS) già forato per fissare tutta la meccanica necessaria
alla movimentazione.
La movimentazione è affidata ad un doppio motoriduttore Tamiya mod. T70097 (vedi figura 2) disponibile in
scatola di montaggio e dotato di due motorini in corrente continua ed un doppio asse per il fissaggio di due ruote
in PVC e gomma Tamiya mod. T70101.
Figura 2 - Il Tamiya 70097 Twin-Motor Gearbox
In base a come vengono montati gli assi è possibile ottenere un rapporto di riduzione 58:1 o 203:1 (vedi figura 3).
Figura 3 - I rapporti di riduzione del Twin-Motor Gearbox
Per mantenere in equilibrio la base viene utilizzato un Ball Caster Tamiya mod. T70144 (vedi
figura 4) ovvero un cestello in PVC contenente alla sua estremità una biglia in acciaio che funziona da
terzo punto di appoggio della piattaforma.
Figura 4 - Il Tamiya 70144 Ball caster
L'elettronica
In figura 5 viene riportato lo schema elettrico della sezione di controllo del robot.
Figura 5 - Schema elettrico dell'elettronica di controllo
Per il governo della movimentazione abbiamo usato un PICmicro modello PIC16F627 o PIC16F628
dotato di UART (Universal Asynchronous Receiver and Transmitter) per la gestione della
seriale con cui inviare comandi al controller motori. In questo modo delle 13 linee di I/O del PICmicro
solo due sono necessarie per azionare i motori lasciando le rimanenti disponibili per i sensori per
le nostre evetuali estensioni.
Nove linee di I/O del PICmicro rimangono disponibili per le vostre espansioni. Aggiungendo altra elettronica
potrebbe essere necessario aggiungere un condensatore da 0.1 uF sull'alimentazione.
Il controllo di potenza dei due motori CC viene effettuato tramite il versatile controller
Pololu modello POMSMC riportato in figura 5. Questo controller consente di pilotare due motori CC
fino ad 1A di assorbimento con 127 passi di velocità in due direzioni tramite semplici comandi
su una normale porta asincrona.
Figura 6 - Il controller per due motori Pololu MOMSMS
Per inviare comandi al controller Pololu è sufficiente il piedino TX della UART del micro.
Il collegamento di RB3 con pin di reset del controller in realtà è opzionale e serve solo a
prevenire errori di interpretazione dei comandi inviati dal PICmicro.
Il software del PICmicro
Grazie al controller Pololu è veramente semplice controllare i motori persino in assembler.
Questo semplice programma fa camminare il nostro robot in avanti finché non incontra un
ostacolo, quindi una volta rilevato, gira e si allontana dal punto dove è avvenuta la collisione.
Tutto il codice è stato scritto in assembler Microchip standard e compilato con i tool MPLAB.
Prima di tutto nominiamo i registri ed i bit che verranno usato nel resto del
programma:
;****** Equates ****************************************************************
Bank0RAM equ 020h ;start of bank 0 RAM area
SMC_PORT equ PORTB ;motor controller on port b
BMP_PORT equ PORTB ;bumper switches on port b
;bit equates
SOUT equ 2 ;serial output to motor controller
SRST equ 3 ;to reset pin on motor controller
LBMP equ 4 ;left bumper switch
RBMP equ 5 ;right bumper switch
;****** Variables **************************************************************
cblock Bank0RAM
ARG1L
ARG1H
BYTE3 ;for storing bytes 3 and 4 in the serial protocol
BYTE4
endc
Quindi abbiamo utilizzato una routine per poter ottenere dei ritardi precisi. Questa routine
utilizza un valore a 16-bit nei registri ARG1H e ARG1L per ottenere ritardi
di qualche millisecondo con un clock a 4 MHz.
milliDelay
movlw .250 ;outer loop
addlw 0xFF ;inner loop
btfss STATUS,Z
goto $-2 ;goto inner loop
movlw 1 ;16-bit decrement
subwf ARG1L,f
btfss STATUS,C
decf ARG1H,f
movf ARG1H,f ;16-bit test if zero
btfsc STATUS,Z
movf ARG1L,f
btfsc STATUS,Z
return
goto milliDelay
A questo punto inizia la parte principale del nostro programma il quale inizia con il configurare la
UART ed inviare il reset al controller motori. Viene quindi inserito un ritardo di 2 ms prima di iniziare
ad inviare comandi sulla linea seriale.
org 0x05
startMain
;set up I/O ports and serial port for 19,200 baud UART
bsf STATUS,RP0
movlw b'11110111' ;smc reset is the only normal
movwf TRISB ; output--all others inputs or serial out
bcf OPTION_REG,NOT_RBPU ;enable PORTB pull-up resistors
movlw .12 ;set baud rate to 19,200 (assuming BRGH=1)
movwf SPBRG ;(address 99h)
movlw b'00100100' ;bit 6 clear - 8-bit transmission
;bit 5 set - enable transmit
;bit 4 clear - UART asynchronous mode
;bit 2 set - high baud rate mode
;bits 7, 3, 1, 0 - don't care
movwf TXSTA ;address 98h
bcf STATUS,RP0 ;select bank 0
movlw b'10010000' ;bit 7 set - enable serial port
;bit 6 clear - 8-bit reception
;bit 4 set - continuous receive
;bits 5, 3:0 - don't care
movwf RCSTA ;address 18h
;reset motor controller
bcf SMC_PORT,SRST
nop
nop
bsf SMC_PORT,SRST
movlw 0x00
movwf ARG1H
movlw 0x02
movwf ARG1L
call milliDelay
Il programma è ora pronto per entrare nel suo loop principale il quale controlla lo stato degli switch
per il controllo delle collisioni ed effettua le azioni relative. Nel loop principale
vengono richiamate le seguenti due subroutine:
- updateMotor che si occupa di inviare un comando a 4 byte al controller motori usando
i registri BYTE3 e BYTE4.
- pause che ferma i motori per 50 ms ed è utilizzata per evitare lo spunto di assorbimento
dei motori durante il cambio della direzione di marcia che potrebbe eccedere il limite consentito dal controller.
mainLoop
btfss BMP_PORT,LBMP
goto left_bump
btfss BMP_PORT,RBMP
goto right_bump
;no bumps, so just go straight
movlw 0x00 ;right motor, forward
movwf BYTE3
movlw 0x7F ;full speed
movwf BYTE4
call updateMotor
movlw 0x02 ;right motor, forward
movwf BYTE3
movlw 0x7F ;full speed
movwf BYTE4
call updateMotor
goto mainLoop
left_bump
call pause
movlw 0x03 ;right motor, backward
movwf BYTE3
movlw 0x7F ;full speed
movwf BYTE4
call updateMotor
movlw 0x01 ;left motor, backward
movwf BYTE3
movlw 0x3F ;half speed
movwf BYTE4
call updateMotor
movlw HIGH .1500 ;pause 1.5 seconds (1500 ms)
movwf ARG1H
movlw LOW .1500
movwf ARG1L
call milliDelay
call pause
goto mainLoop
right_bump
call pause
movlw 0x03 ;right motor, backward
movwf BYTE3
movlw 0x3F ;half speed
movwf BYTE4
call updateMotor
movlw 0x01 ;left motor, backward
movwf BYTE3
movlw 0x7F ;full speed
movwf BYTE4
call updateMotor
movlw HIGH .1500 ;pause 1.5 seconds (1500 ms)
movwf ARG1H
movlw LOW .1500
movwf ARG1L
call milliDelay
call pause
goto mainLoop
Vediamo quindi in dettaglio il funzionamento della subroutine updateMotor.
updateMotor invia al controller motori la sequenza di 4 byte costituira da uno 0x80, un 0x00
seguito dal numero del motore e dalla direzione (registro BYTE3) e dalla velocità (registro BYTE4).
Per motivi di semplicità questa subroutine non rilascia il controllo finché non sono stati
spediti tutti e quattro i byte. Una soluzione più efficiente potrebbe sfruttare la capacità
di generare interrupt in trasmissione della UART a bordo del PICmicro.
updateMotor
btfss PIR1,TXIF
goto updateMotor
movlw 0x80
movwf TXREG
nop
updateMotor2
btfss PIR1,TXIF
goto updateMotor2
movlw 0x00
movwf TXREG
nop
updateMotor3
btfss PIR1,TXIF
goto updateMotor3
movf BYTE3,W
movwf TXREG
nop
updateMotor4
btfss PIR1,TXIF
goto updateMotor4
movf BYTE4,W
movwf TXREG
return
pause
movlw 0x02 ;right motor off
movwf BYTE3
movlw 0x00
movwf BYTE4
call updateMotor
movlw 0x00 ;left motor off
movwf BYTE3
movlw 0x00
movwf BYTE4
call updateMotor
movlw HIGH .50 ;pause 0.05 second (50 ms)
movwf ARG1H
movlw LOW .50
movwf ARG1L
call milliDelay
return
Assicuratevi, durante la programmazione del PICmicro, che il watchdog timer sia disabilitato e che
il brown-out sia anch'esso inattivo per consentire al PICmicro di lavorare a 3.6 volt.
Realizzazione pratica
Visto il limitato numero di componenti elettronici abbiamo utilizzato una semplice basetta millefori
per cablare l'elettronica di controllo. In alternativa è possibile anche usare una breadboard per esperimenti.
Figura 7 - L'elettronica di controllo
Per la parte meccanica iniziamo con l'assemblare, sul telaio circolare POCHS il Ball Caster i motori Tamya e le
relative ruote quindi fissiamo, con del nastro biadesivo, un pacco batterie sotto il robot
vicino al Ball Caster per bilanciare il peso dei motori.
Figura 8 - Montaggio del pacco batterie
Quando salderemo i terminali dei motori fate attenzione a non dannegiarli. L'uso di un piccolo
condensatore dal 0.1uF sui terminali dei motori può aumentarne le performance e abbassare
le interferenze elettriche.
In figura 9 viene mostrata anche una resistenza da 10K da inserire in serie al condensatore.
Questa resistenza serve a limitate la corrente dispersa dal PWM (pulse width modulation) nel caricare e
scaricare il condensatore. Data la frequenza relativamente bassa del PWM (600 Hz) l'uso di questa
resistenza non è in reltà indispensabile.
Figura 9 - Montaggio del condensatore e della resistenza sui terminali dei motori
Vista la fragilità dei terminali del motore è importante bloccare i fili di alimentazione
su un lato del motore con una goccia di colla come mostrato nella figura seguente. Questo
ci consente di maneggiare i fili durante il montaggio senza strattonare i terminali dei motori.
Sarebbe inoltre opportuno proteggere in qualche modo i componenti saldati sui terminali dei motori
per evitare il più possibile che possano essere strattonati durante l'uso delle piattaforma.
Figura 10 - Fissaggio dei fili di alimentazione motori
Per semplificare il più possibile questo progetto, abbiamo limitato la sensoristica a bordo di
questo robot ai soli due switch frontali per il rilevamento delle collisioni frontali. Ovviamente è possibile
aggiungere sensori più sofisticati per rendere il comportamento del robot più interessante.
Figura 11 - Gli switch frontali per il rilevamento delle collisioni
Conclusioni
Il nostro robot esegue dignitosamente i sui compiti ma è ovviamente ampiamente perfezionabile. Il rilevamento
dello collisioni, ad esempio, effettuate tramite i due switch frontali non è certo la soluzione migliore
e potrebbe essere migliorato aumentanto il numero di switch o la tipologia di sensore adottato (Vedi ad esempio
il sensore di distanza a ultrasuoni SRF08 riportato in fondo a questo articolo).
Un serio problema che abbiamo incontrato inizialmente è stato il repentino cambio di marcia dei motori.
In particolare quando il robot si muoveva in ambienti pieni di ostacoli, i frequenti cambiamenti
di direzione portava il controller ad un progressivo surriscaldamento con conseguente blocco
dei motori per qualche secondo. L'inserimento del ritardo di 50 ms durante i cambi di direzione
ha consentito di superare questo problema ed evitare il sovraccarico di corrente sul controller.
Links
Segnala questo articolo:
Parole chiave: - Domotica - PIC -
|