Area SX srl - Informatica e Microelettronica
0
Torna a: Home Page Soluzioni Robotica Varie Realizziamo una semplice piattaforma motorizzata su due ruote

Realizziamo una semplice piattaforma motorizzata su due ruote

Data di pubblicazione: 17-10-2003 | Versione Italiana  | (No English Version)The English version of this article does not exists
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 -

Data di pubblicazione: 17-10-2003Hits: 46546
I marchi citati sono propriet� dei titolari dei relativi diritti. Le caratteristiche tecniche e i prezzi riportati sono indicativi e soggetti a variazioni senza preavviso. Le foto non hanno valore contrattuale. Nonostante accurate verifiche, il presente documento pu� contenere prezzi o specifiche errati. Area SX si scusa in anticipo e si impegna ad evitare tali imprecisioni.

 Area SX store
In questa sezione puoi ordinare direttamente i prodotti descritti in questo articolo
POMSMC;T70097;T70101;POCHS;T70144;GP60AA;PCBRND
Tutti i prezzi indicati sono espressi in Euro con IVA e spese di trasporto escluse. I prezzi si riferiscono al singolo pezzo
DescrizioneCodicePrezzo

Rivenditori Social Contatti Condizioni
Area SX s.r.l
Via Stefano Longanesi 25
00146 Roma

Tel: +39.06.99.33.02.57
Fax: +39.06.62.20.27.85
P.IVA 06491151004
Condizioni di vendita
Procedura di rientro in garanzia
Condizioni per i rivenditori