ISTITUTO TECNICO INDUSTRIALE STATALE Leonardo da Vinci Articolo I. a) Via Tambroni - 47900 RIMINI Tel. 0541/384211-384159 Fax 0541/383292 RNTF010004 82007870403 Sito: www.itisrn.it e-mail: [email protected] C.F. EQ2R ROBOT IN EQUILIBRIO SU DUE RUOTE A cura di: Ubaldi Leonardo & Bracalenti Andrea INDICE Descrizione generale Caratteristiche tecniche Principi teorici 1. Teoria della PWM 2. Descrizione del sistema 3. Sistemi di controllo 4. Controllo proporzionale sul pic 5. Problematiche riscontrate Descrizione dei circuiti 1. Circuito microcontrollore 2. Circuito Driver di potenza L298 3. Circuito filtri Descrizione hardware usato 1. 2. 3. 4. 5. 6. Microcontrollore Pic 16F876 Dual Full-Bridge Driver L298 Sensori di prossimità GP2D120 Motori DC Ruote e mozzi Batterie Listato software di controllo Datasheet 1. L298 2. PIC 16F876 3. GP2D120 2 Descrizione generale È un robot a due ruote che ha il suo centro di gravità sopra le ruote. Senza un sistema di controllo attivo, il robot cadrebbe. Quando il robot s’inclina in avanti o indietro avverte la caduta tramite i suoi sensori (di distanza o prossimità) e si muove in modo da compensare la caduta e tornando in posizione eretta. Caratteristiche tecniche Il prototipo si compone di quattro livelli: - la base a cui sono fissati i motori che fanno muovere il robot tenendolo in equilibrio - la parte immediatamente soprastante dove sono poste le batterie ( 2 x 12 V 1.3AH al piombo ) - il ‘piano’ dei circuiti di potenza comprendente driver L298 e filtri antirumore dei motori - la parte superiore dove è installato il microcontrollore PIC che si occupa di gestire il funzionamento dei motori. Inoltre ad una distanza di circa 13 cm dal suolo sono montati i sensori di distanza . Il robot legge i due valori analogici dati da sensori (che sono proporzionali alla distanza tra sensore e suolo) e, dopo averli confrontati ed essersi calcolato angolo e verso di caduta decide con quanta forza (variando il valor medio della tensione in uscita con l’uso della PWM) e in che direzione far muovere i motori. Principi teorici 1. Teoria della PWM La PWM è una tecnica usata in campo digitale per permettere a dispositivi quali, ad esempio, i microcontrollori di generare un segnale adatto a pilotare motori in corrente continua variandone la velocità. I motori DC sono, infatti, sensibili al valor medio del segnale applicato all’armatura e con la PWM si danno impulsi rettangolari costantemente ripetuti nel tempo. Quando si va a variare la lunghezza dell’impulso positivo ossia il duty-cicle (senza alterare il periodo) si cambia anche la velocità del motore a cui è applicato. Chiaramente maggiore è il ducty-cicle, maggiore è la velocità a cui ruotano i motori e viceversa. Il PIC 16F876 può svolgere questa funzione automaticamente e parallelamente al programma eseguito grazie a un dispositivo hardware che manda costantemente il segnale PWM ad un uscita ricevendo dal software solo i valori di periodo e durata del livello alto. Il periodo del segnale deve essere caricato nel registro PR2 (registro di periodo del TRM2) mentre il duty-cicle viene caricato nel registro CCRR1L (gli 8 bit di ordine più alto) e sui bit 4 e 5 del registro CCP1CON (i due bit di ordine più basso) arrivando quindi ad un valore di TMR2 lungo 10 bit e in grado di generare 1024 possibili velocità diverse. Il valore caricato in PR2 viene continuamente confrontato con il valore di TMR2 (che è incrementato con la frequenza fosc/4 ); quando i 2 valori sono uguali viene posto alto il pin RC2/CCP1 (uscita della PWM) e il TMR2 viene azzerato. Poi TMR2 (incrementato alla stessa frequenza) viene confrontato con CCP1L e i bit 4 e 5 del registro CCP1CON. Quando c’è uguaglianza viene posto a 0 il pin RC2/CCP1. Poi il processo inizia da capo generando un nuovo periodo del segnale. 3 2. Descrizione del sistema Il sistema può essere schematizzato come in figura: Inizialmente viene tarato il riferimento che sarà un valore costante: φ=0. Ogni instante di campionamento verrà letto il valore di distanza ricavato dalla lettura dei sensori. Il controllore: Lancia la conversione del valore analogico dato dai due sensori e salva in due registri a 8 bit le due letture Determina quale delle due distanze lette è maggiore e di conseguenza decide il verso in cui far ruotare i motori Calcola il modulo dell’errore sottraendo al valore più grande quello più piccolo In base al modulo dell’errore decide quale valore di duty-cicle dare ai motori Carica il valore in CCP1L facendo ripartire la PWM e ritorna al primo punto Il driver L298 amplifica il segnale PWM del microcontrollore da 5 a 24 V e fornisce la corrente richiesta dai motori. Il filtro serve a tagliare i disturbi generati dai motori La funzione dei due motori è quella di riportare il sistema nel punto di equilibrio instabile del pendolo trasformando il segnale elettrico in una rotazione, facendolo avanzare o indietreggiare (compensando, cioè, eventuali spostamenti del sistema dal suo punto di equilibrio). Consideriamo ad esempio il caso riportato in figura: il sistema si sbilancia cadendo all'indietro. Grazie ai sensore di intensità luminosa viene rilevata la nuova posizione angolare −θ. Mediante la legge di controllo vengono azionati i due motori: questi 4 hanno il compito di fornire al sistema una componente −v per riportarlo nella posizione di riferimento. Dualmente accade se il sistema cade in avanti come vediamo in figura: 3. Sistemi di controllo Il sistema di controllo è il sistema che, letti i dati in ingresso, decide come operare sulle uscite per ottenere il comportamento desiderato del sistema da controllare. Nel caso di progetto di sistema che tenga in equilibrio un robot su 2 ruote, lo schema è quello di figura: Un primo semplice sistema di controllo è il controllo ON / OFF cioè i motori vengono azionati a piena velocità nel verso opposto all’angolo di caduta in modo da correggerlo e far raddrizzare il robot . Questo metodo ha però il notevole svantaggio di bloccare i motori solo nel momento esatto in cui i due sensori danno la lettura tale che il modulo dell’errore è uguale a 0; perciò i motori (che impiegano un certo tempo affinché l’inerzia diventi ininfluente) continuano a ruotare e il robot si inclina nel verso opposto; si viene quindi a creare una condizione di oscillazione che difficilmente porterà il robot a stare in equilibrio. Questo sistema si può migliorare facendo in modo che man mano che la differenza tra i due valori letti si riduce, diminuisca anche la velocità dei motori: così quando il prototipo è in prossimità del punto di equilibrio la bassa velocità dei motori lo fa oltrepassare di un piccolo angolo e l’oscillazione della struttura viene notevolmente ridotta. Questo sistema è detto Controllo Proporzionale. 4. Controllo proporzionale sul PIC Il PIC è un microcontrollore perciò non riesce ad elaborare dati analogici senza prima averli convertiti in forma digitale; questo vale sia per gli ingressi sia per le uscite che sono sempre digitali (infatti per ottenere una variazione del valor medio in uscita, e quindi della velocità dei motori, si opera con la tecnica della PWM). Si può quindi fare un sistema di controllo proporzionale ma approssimato con la filosofia di associare una certa velocità dei motori ad ogni angolo di caduta del robot. In pratica il range di errori (differenza tra valore dato dal sensore anteriore e da quello posteriore) è stato diviso in un certo numero di intervalli (nel nostro caso 6) e ad ogni intervallo in cui cade l’errore è assegnato un certo valore di Ton (tempo in cui l’uscita PWM sta al livello alto in uscita) in modo da dare la velocità adatta a recuperare la caduta. 5 5. Problematiche riscontrate Le spazzole dei motori generano un forte rumore di disturbo che si manifesta come una forza controelettromotrice. Questa contro fem, trasmessa attraverso i cavi di connessione tra driver e motori, va a disturbare il microcontrollore (arrivando anche a resettarlo) e impedisce il corretto funzionamento del circuito. L’inconveniente si poteva risolvere principalmente in due modi: sostituendo il driver con un circuito costituito da relé e con alimentazione separata oppure inserendo un filtro tra driver e motori in modo da bloccare i disturbi e lasciare passare solo la continua. La soluzione scelta prevede l’uso di un filtro LC per ogni motore: Vo varia applicando la legge del partitore di tensione al ramo 2 costituito da 2L e dal secondo C. Sostituendo i valori si ottiene: Si deduce quindi che i filtri hanno ciascuno 2 poli complessi coniugati con parte reale uguale a 0 perciò il sistema filtri è oscillante. Inoltre i sensori utilizzati sono di semplice uso e medio costo ma danno due importanti svantaggi: innanzitutto non permettono la stabilità del robot su superfici inclinate, come discese o salite, in quanto le letture non darebbero un valore di errore proporzionale all’ inclinazione del prototipo impedendone cosi il normale funzionamento. L’altro svantaggio è che le letture effettuate sono sensibili alla superficie sottostante al robot in quanto delle superfici chiare riflettono molto meglio i raggi infrarossi dei sensori di prossimità rispetto a superfici scure quindi ogni qual volta si cambia superficie d'appoggio o viene modificata l'illuminazione della stanza i parametri del sistema di controllo vanno modificati. 6 Descrizione dei circuiti 1. Circuito microcontrollore Il circuito è composto da uno stadio di alimentazione consistente in un regolatore di tensione 7805 che abbassa i 9V della batteria ai 5V utilizzabili dal PIC e dai sensori GP2D120. Il secondo stadio è formato dal microcontrollore PIC 16F876 avente una rete di oscillazione a quarzo da 20MHz e due condensatori da 22pF; agli ingressi del PIC AN0 e AN1 (pin 2 e 3) sono connessi i sensori di prossimità (all’alimentazione sono collegati due diodi di protezione dall’erronea inversione di polarità); le uscite RB1 e RB2 (pin 22 e 23) vanno ai connettori del driver dei motori DC. Inoltre sono presenti 3 led: il verde su RC0 (pin 11) indica l’avvio del programma, il giallo su RC1 (pin 12) visualizza il segnale PWM mandato ai motori e il rosso su RC2 (pin 13) che indica il verso di caduta. 7 2. Circuito driver di potenza L298 Il circuito si basa sul driver L298 e comprende 4 diodi di scarica della tensione generata dagli avvolgimenti dei motori; gli Enable sono cortocircuitati tramite cavi a 5 V in modo da lasciare sempre abilitati tutti i canali; i Sense sono collegati a massa tramite resistori da 1 Ω ma in questo progetto non sono utilizzate le uscite di sense. 8 3. Circuito filtri Il circuito è composto da due filtri passivi a pi-greco (uno per ogni motore). Ognuno di essi comprende 2 condensatori da 100nF posti in parallelo al segnale dato ai motori e 2 induttanze da 160mH poste in serie al segnale. 9 Descrizione hardware usato 1. MICROCONTROLLORE PIC167876 Costruttore: Microchip © Il microcontrollore PIC 16F876 della Microchip © è un integrato a 28 pin in grado di gestire fino a 22 ingressi di cui 5 analogici. Gli ingressi analogici sono internamente collegati ad un multiplexer e sono poi convertiti dall’ADC interno del PIC. Questa famiglia di microcontrollori è programmabile con l’uso di soli 35 diverse istruzioni. In questo progetto è usato con un oscillatore al quarzo da 20 MHz perciò per eseguire ogni istruzione vengono impiegati 200 nsec. Per ulteriori informazioni consultare il datasheet in appendice. 2. DUAL FULL-BRIDGE DRIVER L298 Costruttore: SGSThomsonMicroelettronics L’ integrato L298 è un dual full-bridge driver, vale a dire un integrato in grado di pilotare 2 motori DC contemporaneamente. Può erogare correnti di 2A per canale e 3A di picco per canale (non ripetitivi). Ogni canale è controllato da una logica d’ingresso TTL compatibile e ciascuna coppia di piloti (un intero ponte) è dotata di un ingresso (enable) che inibisce e fa spegnere tutti e quattro i transistor; se l’ingresso enable è al livello logico alto il ponte è attivo. Per la logica di comando è prevista un’alimentazione separata in modo tale che sia possibile sia alimentarla con la stessa alimentazione usata per i motori che alimentarla con un basso voltaggio (per ridurre la dissipazione). Inoltre, l’ L298 è dotato di pin di ‘sense’ ossia un’uscita analogica (da -1 a 2.3V) che da una tensione proporzionale alla corrente assorbita dai motori; tra questi pin e la massa va collegata una resistenza da 1Ω e che possa dissipare una potenza di 1-2W; se non si vogliono usare i ‘sense’ la resistenza va comunque messa in quanto fondamentale al funzionamento dell’integrato (la resistenza inserita tra questi pin e massa permette di controllare la corrente sul carico). Nel circuito devono inoltre essere implementati 4 diodi di scarica delle induttanze degli avvolgimenti per ognuno dei 2 motori (2 diodi per canale). Per ulteriori informazioni consultare il datasheet in appendice. 10 3. SENSORE DI PROSSIMITA’ GP2D120 Costruttore: Sharp È un sensore per la misura di distanza che dà un’uscita analogica in tensione proporzionale alla distanza letta. Funziona utilizzando tecnologia a raggi infrarossi e riesce perciò a misurare un piccolo range di distanze (da 4 a 30cm) e la misura è influenzata dal tipo di superficie su cui si riflettono i raggi. Ha già il condizionatore di segnale e il filtro integrati e richiede un’alimentazione di 5V. 4. MOTORI DC Costruttore: Maxon Sono motori in corrente continua già dotati di riduzioni e decoder HP (non usato per questo progetto). L’albero ha un diametro da 6 mm e il motore è complessivamente lungo 160mm. La tensione massima d’armatura applicabile è di 24V. 11 5. RUOTE E MOZZI Costruttore: Proline e Lynxmotion Ruote Off-Road 44 x 87 mm di diametro usate per equipaggiare Robot che devono affrontare qualsiasi tipo di terreno. Ogni mozzo è utilizzabile per un asse da 6mm e collega l'asse del motore alla ruota, specifico per le ruote da modellismo. Sono realizzati in alluminio. 6. BATTERIE Costruttore: Beghelli Sono batterie ricaricabili al piombo acido da 12 V 1.3 AH e sono poste in serie a formare una tensione di 24V. Le batterie al piombo sopportano bene le richieste dei picchi di corrente dovute all’avviamento della rotazione dei motori 12 Listato software status porta portb portc intcon tmr2 t2con ccpr1l ccp1con adresh adcon0 selreg na ni pwmopt mod_e ton tempo liv1a liv2a liv3a liv4a liv5a liv6a liv1b liv2b liv3b liv4b liv5b liv6b na nc nc n2 n1 n0 option_reg trisa trisb trisc pr2 adcon1 rc0 rc1 ra0 ra1 rp0 rp1 cf zf rb0 rb1 rb2 rb3 verso bitlev cambfr equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ h'03' h'05' h'06' h'07' h'0b' h'11' h'12' h'15' h'17' h'1e' h'1f' h'20' h'21' h'22' h'23' h'24' h'25' h'26' h'29' h'2a' h'2b' h'2c' h'2d' h'2e' h'31' h'32' h'33' h'34' h'35' h'36' h’37’ h’38 h’39’ h'3a' h'3b' h'3c' h'81' ^ h'81' h'85' ^ h'80' h'86' ^ h'80' h'87' ^h'80' h'92'^h'80' h'9f' ^ h'80' d'0' d'1' d'0' d'1' d'5' d'6' d'0' d'2' d'0' d'1' d'2' d'3' d'0' d'1' d'2' 13 ORG H'0000' ;INIZIO PROGRAMMA main call call call call call bsf setup_io set_pwm setup_adc setup_liva setup_livb portc,rc0 ;START ALL’ADC ripe movlw movwf call movf movwf clrf call movf movwf subwf btfss goto b'00000001' selreg ;sceglie conversione an1 adconv ;converte an0 adresh,0 na ;risultato conversione in na selreg ;sceglie conversione su an0 adconv ;converte an2 adresh,0 ni ;risultato conversione in ni na,0 status,cf ;na < ni ? fmagb ;sottoprogrammi di sutup movwf bsf call goto mod_e pwmopt,verso livellib conti ;modulo dell'errore per pwm (na > ni) ;setto il verso avanti bcf movf subwf movwf call pwmopt,verso na,0 ni,0 mod_e livellia ;setto il verso indietro (n1 < na) conti btfsc goto pwmopt,verso avan ;controlla verso motori indi bcf bcf bcf movf movwf goto portb,rb1 portb,rb2 portc,rc1 ton,0 ccpr1l ripe bsf bsf bsf movf sublw movwf goto portb,rb1 portb,rb2 portc,rc1 ton,0 d'255' ccpr1l ripe fmagb avan ;SOTTOPROG DI SETUP set_pwm bsf status,rp0 bcf status,rp1 movlw d'255' movwf pr2 bcf status,rp0 movlw h'0f' movwf ccp1con movlw b'00000101' ;modulo dell'errore x pwm ;verso indietro ;ton→ ccpr1l ;verso avanti ;ton→ ccpr1l ;periodo pwm ;abilita modalita’ pwm ;abilita tmr2 e prescaler a 4 14 movwf t2con return setup_io setup_adc bsf bcf movlw movwf movlw movwf movlw movwf bcf return status,rp0 status,rp1 b'11111111' trisa b'00000000' trisb b'00000000' trisc status,rp0 movlw movwf bsf bcf clrf bcf bcf return b'10000001' adcon0 status,rp0 status,rp1 adcon1 status,rp0 status,rp1 ;portA come ingressi ;portB come uscite ;portC come uscite ;imposta ancon0 ;imposta adconv1 ;IMPOSTA I LIVELLI DEGLI ERRORI setup_liva movlw b'00000101' movwf liv1a movlw b'00001001' movwf liv2a movlw b'00001000' movwf liv3a movlw b'00001100' movwf liv4a movlw b'00010000' movwf liv5a movlw b'00010111' movwf liv6a return setup_livb movlw movwf movlw movwf movlw movwf movlw movwf movlw movwf movlw movwf return b'00000000' liv1b b'00000010' liv2b b'00000011' liv3b b'00000110' liv4b b'00001001' liv5b b'00010101' liv6b ;CONTROLLA I LIVELLI DELL'ERRORE E IMPOSTA TON livellia movf liv1a,0 subwf mod_e,0 btfsc status,cf ;errore < livello1 goto step2a step2a clrf goto ton finliva movf liv2a,0 ;se si motori spenti 15 subwf btfsc goto mod_e,0 status,cf step3a movlw d'88' movwf ton goto finliva step3a movf subwf btfsc goto liv3a,0 mod_e,0 status,cf step4a movlw d'120' movwf ton goto finliva step4a movf subwf btfsc goto liv4a,0 mod_e,0 status,cf step5a movlw d'170' movwf ton goto finliva step5a movf subwf btfsc goto liv5a,0 mod_e,0 status,cf step6a ;errore < livello2 ;se si ton2→ ton ;errore < livello3 ;se si ton3→ ton ;errore < livello4 ;se si ton4→ ton ;errore < livello5 ton5→ ton movlw d'210' movwf ton goto finliva ;se si step6a movlw d'255' movwf ton ;se no motori al massimo finliva return livellib movf subwf btfsc goto liv1b,0 mod_e,0 status,cf step2b clrf goto ton finlivb movf subwf btfsc goto liv2b,0 mod_e,0 status,cf step3b step2b movlw d'88' movwf ton goto finlivb step3b movf subwf btfsc goto liv3b,0 mod_e,0 status,cf step4b ;errore < livello1 ;se si motori spenti ;errore < livello2 ;se si ton2→ ton ;errore < livello3 16 movlw d'120' movwf ton goto finlivb step4b movf subwf btfsc goto liv4b,0 mod_e,0 status,cf step5b movlw d'170' movwf ton goto finlivb step5b movf subwf btfsc goto liv5b,0 mod_e,0 status,cf step6b ;se si ton3→ ton ;errore < livello4 ;se si ton4→ ton ;errore < livello5 ton5 → ton movlw d'210' movwf ton goto finlivb ;se si step6b movlw d'255' movwf ton ;se no motori al massimo finlivb return ;CONVERSIONE ADC adconv btfss goto bsf goto clr bcf conv bcf bcf call bsf btfsc goto return loop selreg,0 clr adcon0,3 conv adcon0,3 adcon0,4 adcon0,5 delay_20u adcon0,2 adcon0,2 loop ;sceglie an0 o an1 ;scelto an0 ;scelto an1 ;ritardo di 20usec per dar modo al ;condensatore del s/h di caricarsi ;inizio conversione ;aspetta fine conversione ;SOTTOPROGRAMMA DI RITARDO delay_20u movlw d'1' movwf na lpa movlw d'1' movwf nb lpb movlw d'32' movwf nc lpc decfsz nc,1 goto lpc decfsz nb,1 goto lpb decfsz na,1 goto lpa return END . 17 Datasheet DATASHEET DRIVER L298 1/2 18 DATASHEET DRIVER L298 2/2 19 DATASHEET PIC16F876 1/2 20 DATASHEET PIC16F876 2/2 21 DATASHEET GP2D120 1/1 22