Niccolò Francato AUTOMA SCANSA OSTACOLI
Indice: pag. Introduzione 2 Descrizione 3 Alimentazione 3 Sensori IR OMRON e adattamento del segnale 4 Fotodiodi IR, trattazione del segnale, comparazione e stadio emettitore IR 5 Stadio di potenza per il controllo dei motori e meccanica 7 Microcontrollore, generazione del clock e reset 9 Programma per la gestione del robot 11 Lista componenti 16 Foto, schemi e PCB 18 1
Introduzione: Il progetto da me realizzato consiste in un robot che attraverso dei sensori ottici evita ostacoli. Per realizzarlo ho utilizzato quattro sensori ottici IR della OMRON e quattro coppie diodo IR fotodiodo IR per la rilevazione degli ostacoli, due LM358 e un 4050 per adattare e trattare i segnali, un PIC16F876A per elaborare i segnali ricevuti dai sensori e comandare i motori e un L298 come stadio di potenza per il pilotaggio dei motori. In oltre sono presenti anche uno stadio di alimentazione formato da un 7805 e due condensatori per abbassare la tensione da 12 a 5 volt e un oscillatore astabile realizzato con un NE555. L alimentazione è fornita da una batteria da 12V al piombo-gel, che, attraverso un interruttore, alimenta il circuito e i motori. Il diagramma qui sotto mette in evidenza le varie connessioni tra i 5 blocchi che costituiscono l elettronica del robot, in particolar modo le alimentazioni e i segnali dei dati e di controllo. L alimentazione a 12V che va ai sensori IR OMRON non è diretta ma è controllata dal PIC tramite un MOSFET STP9NK60ZD, per questo motivo non è diretta nello schema ma passa dal blocco del microcontrollore. 2
Descrizione: La realizzazione si può scomporre in 6 fasi: 1- Alimentazione 2- Sensori IR OMRON e adattamento del segnale 3- Fotodiodi IR, trattazione del segnale, comparazione e stadio emettitore IR 4- Stadio di potenza per il controllo dei motori e meccanica 5- Microcontrollore, generazione del clock e reset 6- Programma per la gestione del robot 1- Alimentazione: Lo stadio di alimentazione è composto dalla batteria, l interruttore generale di alimentazione, 2 condensatori, il 7805, un led che indica l accensione e un diodo di protezione contro l inversione di polarità dei collegamenti della batteria. La batteria è una Fiamm FG20121 da 12V 1,2Ah, la corrente massima prelevabile per 5 secondi è 12A e il peso circa 600G, da essa il circuito assorbe circa 250mA. Il 7805 è un regolatore integrato di tensione, esso fornisce in uscita una tensione di 5V stabili con una corrente massima di 1A, è stato utilizzato in contenitore TO-220 per poter dissipare il calore prodotto tramite un dissipatore, accetta in ingresso massimo 35V, in oltre è protetto contro i sovraccarichi e i cortocircuiti. I condensatori C3 e C4 servono per non far entrare in autooscillazione il 7805, che potrebbe danneggiare il PIC16F876A a causa degli sbalzi di tensione. Il diodo D10, un STTH12R06, serve per proteggere tutti i circuiti del robot dall inversione di polarità, che verrebbero danneggiati, anche se per breve tempo senza di esso i circuiti sarebbero protetti dagli 1n4007, che servono per scaricare sovratensioni prodotte dal motore durante la marcia e l arresto, essi infatti limiterebbero la tensione a 1,2V, però la corrente che circolerebbe in essi, cioè quella di cortocircuito della batteria, che è circa 15A, li distruggerebbe in brevissimo tempo. Il diodo inserito ha una caduta di tensione di 752 mv, che influiscono pochissimo sul funzionamento del robot, e una corrente massima di 12A e 600 volt di tensione inversa. 3
2- Sensori IR OMRON e adattamento del segnale I 4 sensori IR OMRON E3S-AD61 sono di tipo industriale, cioè hanno un elevata resistenza meccanica e alle interferenze, un campo di rilevamento massimo di 20 cm (che può variare in base al colore dell oggetto, a causa della differenza della riflessione della luce infrarossa), in oltre hanno un range di funzionamento compreso tra 10 e 30V cc, e un consumo di circa 30mA. Essi sono posti ai 4 angoli del robot, in modo che ogni sensore copre parzialmente due lati del robot. L alimentazione è presa dalla batteria, può essere interrotta tramite un mosfet siglato STP9NK60ZD, che è comandato dal pic tramite il pin 4 della porta C, il mosfet regge 7A e 600V, ha in oltre integrato un diodo di ricircolo in antiparallelo, è stato scelto perché ha una resistenza interna nello stato di on inferiore a 0,95Ω. Le fotocellule quando rilevano un oggetto portano a massa il filo del segnale, che è tenuto a 5V dalle resistenze di pull-up da 10kΩ. Il 4050 è un buffer CMOS, serve a mandare un segnale pulito e stabile al pic, oltre che a proteggerlo da eventuali malfunzionamenti, è stato utilizzato in tecnologia CMOS perché oltre a assorbire molta meno corrente, parametro indispensabile per poter far durare il più possibile le batterie, ha la possibilità di sopportare in ingresso tensioni superiori a quella di alimentazione. Dal 4050 il segnale delle fotocellule va alla porta B del pic, l anteriore destra va al pin 0, anteriore sinistra al pin 1, posteriore destra al pin 2 e posteriore sinistra al pin 3. 4
3- Fotodiodi IR, trattazione del segnale, comparazione e stadio emettitore IR Le 4 coppie diodo IR fotodiodo IR sono state inserite dopo che è stato notato che alcuni ostacoli non venivano rilevati, soprattutto se in posizione centrale sia davanti che dietro e lateralmente durante le curve. Tramite un oscillatore astabile realizzato con un NE555 si crea un onda quadra con frequenza di circa 20kHz, che pilota un transistor NPN BFY50, esso cortocircuita verso massa quattro gruppi diodo IR resistenza, attraverso i diodi IR si creano dei flash di luce infrarossa che verranno poi captati dai fotodiodi. Il BFY50 ha come tensione massima 35V e come corrente 1A, è stato scelto perché anche se fosse stato necessario il dissipatore occuperebbe meno posto. Il circuito per la ricezione degli impulsi è formato da: fotodiodi per la ricezione del segnale, un filtro passa alto per eliminare le tensioni continue e le basse frequenze, tipo le luci domestiche al neon o il sole, che emettono degli impulsi a una frequenza di 100Hz o continua nel caso della solare, un filtro passa basso per livellare il segnale ottenuto e un comparatore con trimmer per regolare la sensibilità della ricezione. I fotodiodi IR sono polarizzati inversamente per sfruttare la caratteristica della variazione della resistenza in base alla luce, con una resistenza si limita la corrente che circola in essi e si crea in oltre un punto in cui è possibile prelevare la tensione modulata dalla frequenza di emissione dei diodi IR, la tensione ottenuta viene filtrata dal filtro passa basso formato da un condensatore da 470nF in serie al circuito e una resistenza da 1 MΩ tra l uscita del condensatore e la massa; il successivo filtro passa basso è formato da un altra coppia CR con gli stessi valori, solo che in questo caso è la resistenza in serie al circuito e il condensatore verso massa. Il segnale ottenuto in uscita è praticamente continuo, il cui valore però varia con la quantità di luce che riceve il fotodiodo, anche se è ancora leggermente sensibile alle brusche variazioni di luce, che comunque vengono filtrate in circa 3-4 secondi. 5
Come comparatori sono stati utilizzati due LM358, che al proprio interno contengono 4 amplificatori operazionali La parte sinistra di questo schema è il connettore per il modulo radio per il controllo a distanza, ma non è stata realizzata. Questa modifica è stata pensata per un modulo radio modello Cy2198TR-A, che funziona con tensioni di 3,3V, e quindi necessitando di questa alimentazione è stato inserito un LM317, che è un regolatore di tensione variabile, con un potenziometro si può regolare il valore della tensione in modo da ottenere 3,3V, l interfacciamento con il pic, funzionante a 5V, è realizzato tramite una resistenza da 1kΩ posta tra il pin del pic per la trasmissione dei dati (TX, pin 6 porta C)e il pin del modulo radio, mentre per i dati trasmessi dal modulo non è necessario inserire niente. Sensore Anteriore Sensore Posteriore Sensore destro Sensore sinistro 6
4- Stadio di potenza per il controllo dei motori e meccanica Per la movimentazione sono stati utilizzati 2 motori a 12V con motoriduttore con rapporto di riduzione di 43:1. Lo stadio di potenza dei motori è realizzato con un L298, cioè un doppio ponte H, che è stato progettato per il controllo di motori passo-passo bipolari, ma si presta benissimo anche per il controllo di motori in cc. Esso può funzionare con una tensione massima di 46V e una corrente di 2A a canale, in oltre ha bisogno di una tensione di 5V per la logica di controllo, dispone di due ingressi di abilitazione dei singoli canali, che potrebbero essere utilizzati per controllare i motori in PWM; dispone anche di pin da cui se non collegati a massa direttamente ma tramite due resistenze di shunt si può prelevare una tensione proporzionale alla corrente che scorre nel carico. Per evitare sovratensioni che potrebbero danneggiare il chip sono stati utilizzati 4 diodi 1N4007 per motore, collegati 2 tra massa e il motore, e gli altri due tra il motore e i 12V, per assicurare una migliore protezione sarebbero più consigliati diodi veloci tipo 1N4148 o shottky, gli 1N4148 sono stati scartati a causa della bassa corrente che possono sopportare, per questo utilizzo sarebbero invece consigliati i BYV10-40, che 7
hanno una corrente massima di 1A e una tensione massima di 40V. È stato messo un dissipatore a contatto con il chip per asportare il calore che esso genera, il dissipatore è stato ricavato da una lamina di alluminio di spessore 1,5mm circa e adattato al chip, con i motori utilizzati non sarebbe necessario, perché la potenza dissipata dall L298 è molto piccola, infatti i motori assorbono circa 10mA a vuoto e circa 50mA a albero bloccato. Sui motori non arriva 12V ma circa 10 a causa delle cadute interne del chip e del diodo di protezione nello stadio di alimentazione, a ciò si potrebbe ovviare aumentando la tensione di alimentazione a circa 15V, ad esempio mettendo due batterie da 1,5 volt in serie alla batteria al piombo, oppure sostituendo la batteria al piombo con un pacco di batterie al NI-CD o Li- Poly da 14,4V. Le ruote posteriori sono state recuperate da una macchina radiocomandata e collegate ai motori tramite dei supporti in rame ricavati da dei mammut, i perni interni sono delle viti M4 con relativo dado di fissaggio. La ruota anteriore è un ball-caster, cioè una sfera all interno di un supporto, in questo caso di ottone, che fa da 3 punto di appoggio. 8
5- Microcontrollore, generazione del clock e reset Tutto il robot è gestito tramite un PIC16F876A, un microcontrollore con architettura a 8bit e set di istruzioni ridotto (RISC), anche esso è in tecnologia CMOS per ridurre l assorbimento. Questo microcontrollore dispone di 14,3kB di memoria flash per il programma, di 368B di ram e 256B di EEPROM, 5 canali con ingresso analogico, 3 moduli timer, che possono essere usati come contatori, timer e prescaler, 2 possono anche essere usati come generatori PWM, dispone anche di una porta seriale implementata hardware e di 2 comparatori analogici. Il range di funzionamento è tra 2,0 e 5,5V e il clock massimo che può supportare è 20MHz. Nel robot è utilizzato un clock da 8 MHz, generato con un quarzo da 8,000MHz e 2 condensatori da 15pF. Del pic è stato utilizzato completamente le porte B e C, mentre della A solo il pin 5, a cui è collegato a un interruttore che serve a fermare i motori. Il reset è stato realizzato con una resistenza di pull-up e un pulsante che cortocircuita il pin MCRL a massa. Tutti i pin non utilizzati sono stati settati come ingressi nel programma, per diminuire il rischio di danneggiare il pic se dovessero andare a contatto con collegamenti o piste a tensioni diverse. 9
È presente anche un led rosso che lampeggia durante il caricamento del programma e nel caso che non ci siano direzioni possibili, cioè nel caso che tutti e 4 i sensori OMRON rilevino degli ostacoli. 10
6- Programma in formato MikroBasic: Le scritte in verde che iniziano con un sono commenti al programma, servono per semplificare la scrittura e interpretazione del programma. program Robot3 dim a as byte 'Fotocellule 'portb.0 = anteriore dx 'portb.1 = anteriore sx 'portb.2 = posteriore dx 'portb.3 = posteriore sx 'Motore 'portc.0 = motore dx avanti 'portc.1 = motore dx indietro 'portc.2 = motore sx avanti 'portc.3 = motore sx indietro main: TRISA = $FF 'Porta A in ingresso TRISB = $FF 'Porta B in ingresso TRISC = $C0 'Porta C in uscita + predisposizione per porta seriale ADCON0 = $80 'Convertitore A/D disabilitato ADCON1 = $47 'Porta A digitale a = 0 portc.5 = 0 portc.4 = 1 delay_ms(250) portc.4 = 0 delay_ms(250) portc.4 = 1 delay_ms(250) portc.4 = 0 delay_ms(250) portc.4 = 1 portc.5 = 1 delay_ms(100) portc.4 = 0 delay_ms(100) portc.4 = 1 delay_ms(100) portc.4 = 0 delay_ms(100) portc.4 = 1 while true while porta.5 = 1 'direzione 'ostacoli su tutti i lati while (((portb.0 = 0) and (portb.1 = 0)) and ((portb.2 = 0) and (portb.3 = 0))) 'motore dx fermo 'motore sx fermo if a = 1 then 'lampeggia led su portb.4 portc.4 = 0 a = 0 else portc.4 = 1 a = 1 end if delay_ms(250) 'controlla lo stato ogni 250ms 11
'ostacolo davanti if (((portb.0 = 0) and (portb.1 = 0)) and ((portb.2 = 1) and (portb.3 = 1))) then portc.1 = 1 'motore dx indietro portc.3 = 1 'motore sx indietro while (((portb.0 = 0) and (portb.1 = 0)) and ((portb.2 = 1) and (portb.3 = 1))) if portb.7 = 1 then portc.0 = 1 portc.3 = 1 'motore sx indietro delay_ms(500) end if delay_ms(500) portc.0 = 1 portc.3 = 1 'motore sx indietro delay_ms(1000) end if 'Ostacolo dietro (si può omettere...) 'while (((portb.0 = 1) and (portb.1 = 1)) and ((portb.2 = 0) and (portb.3 = 0))) ' portc.0 = 1 ' ' portc.2 = 1 ' ' 'ostacolo anteriore dx while (((portb.0 = 0) and (portb.1 = 1)) and ((portb.2 = 1) and (portb.3 = 1))) portc.0 = 1 'motore sx fermo 'ostacolo anteriore sx while (((portb.0 = 1) and (portb.1 = 0)) and ((portb.2 = 1) and (portb.3 = 1))) 'motore dx fermo portc.2 = 1 'ostacolo posteriore dx while (((portb.0 = 1) and (portb.1 = 1)) and ((portb.2 = 0) and (portb.3 = 1))) portc.0 = 1 portc.2 = 1 'ostacolo posteriore sx while (((portb.0 = 1) and (portb.1 = 1)) and ((portb.2 = 1) and (portb.3 = 0))) portc.0 = 1 portc.2 = 1 12
'libero posteriore sx while (((portb.0 = 0) and (portb.1 = 0)) and ((portb.2 = 0) and (portb.3 = 1))) portc.1 = 1 'motore dx indietro portc.2 = 1 'libero posteriore dx while (((portb.0 = 0) and (portb.1 = 0)) and ((portb.2 = 1) and (portb.3 = 0))) portc.0 = 1 portc.3 = 1 'motore sx indietro 'libero avanti dx while (((portb.0 = 1) and (portb.1 = 0)) and ((portb.2 = 0) and (portb.3 = 0))) portc.1 = 1 'motore dx indietro portc.2 = 1 'libero avanti sx while (((portb.0 = 0) and (portb.1 = 1)) and ((portb.2 = 0) and (portb.3 = 0))) portc.0 = 1 portc.3 = 1 'motore sx indietro 'libero a sx while (((portb.0 = 0) and (portb.1 = 1)) and ((portb.2 = 0) and (portb.3 = 1))) portc.0 = 1 portc.3 = 1 'motore sx indietro 'libero avanti sx e dietro dx while (((portb.0 = 0) and (portb.1 = 1)) and ((portb.2 = 1) and (portb.3 = 0))) portc.0 = 1 portc.3 = 1 'motore sx indietro 'libero avanti dx e dietro sx while (((portb.0 = 1) and (portb.1 = 0)) and ((portb.2 = 0) and (portb.3 = 1))) portc.1 = 1 'motore dx indietro portc.2 = 1 'libero a dx while (((portb.0 = 1) and (portb.1 = 0)) and ((portb.2 = 1) and (portb.3 = 0))) portc.1 = 1 'motore dx indietro portc.2 = 1 13
'Fotodiodi 'Portb.4 = Sinistro 'Portb.5 = Destro 'Portb.6 = Anteriore 'Portb.7 = Posteriore 'sensore a sx while (((portb.4 = 1) and (portb.5 = 0)) and ((portb.6 = 0) and (portb.7 = 0))) 'while (((portb.4 = 1) and (portb.5 = 0)) and ((portb.6 = 0) and (portb.7 = 0))) portc.1 = 1 'motore dx indietro portc.2 = 1 ' 'delay_ms(500) ' 'portc.1 = 1 'motore dx indietro 'portc.2 = 1 ' 'delay_ms(1000) 'sensore a dx while (((portb.4 = 0) and (portb.5 = 1)) and ((portb.6 = 0) and (portb.7 = 0))) 'while (((portb.4 = 0) and (portb.5 = 1)) and ((portb.6 = 0) and (portb.7 = 0))) portc.0 = 1 portc.3 = 1 'motore sx indietro ' 'delay_ms(500) 'portc.0 = 1 ' ' 'portc.3 = 1 'motore sx indietro 'delay_ms(1000) 'sensore davanti while (((portb.4 = 0) and (portb.5 = 0)) and ((portb.6 = 1) and (portb.7 = 0))) while (((portb.4 = 0) and (portb.5 = 0)) and ((portb.6 = 1) and (portb.7 = 0))) portc.1 = 1 'motore dx indietro portc.3 = 1 'motore sx indietro delay_ms(1500) portc.1 = 1 'motore dx indietro portc.2 = 1 delay_ms(2500) 'sensori dx e sx while (((portb.4 = 1) and (portb.5 = 1)) and ((portb.6 = 0) and (portb.7 = 0))) while (((portb.4 = 1) and (portb.5 = 1)) and ((portb.6 = 0) and (portb.7 = 0))) portc.1 = 1 'motore dx indietro portc.3 = 1 'motore sx indietro delay_ms(2500) portc.1 = 1 'motore dx indietro 14
portc.2 = 1 delay_ms(2500) portc.4 = 0 portc.0 = 1 portc.2 = 1 'motore dx fermo 'motore sx fermo ** end. Totale: 277 righe. I cicli while si attivano per il tempo in cui la condizione è vera, cioè per il tempo in cui il o i sensori restano attivi. Una soluzione più funzionale sarebbe di utilizzare dei cicli if then end if, ma l ottimizzazione del codice è più bassa e il programma non sarebbe entrato nella memoria flash del pic, infatti questo programma utilizza circa 1681 byte della flash cioè circa il 20% dello spazio disponibile, mentre se realizzato con cicli if then end if sarebbe entrato circa la metà del codice. Alla porta A pin 5 c è collegato un interruttore che da programma è utilizzato per attivare i sensori senza pilotare i motori, in modo da poter regolare più facilmente i sensori tramite i potenziometri. I registri ADCON0 e ADCON1 sono stati settati in modo che la porta A sia tutta con segnali digitali, e che il modulo A/D sia disattivato. 15
Lista componenti: Integrati: 1 x PIC16F876A 1 x 4050 1 x L298 1 x 7805 1 x NE555 2 x LM358 Transistor: BFY50 Mosfet: STP9NK60ZD Diodi: 8 x 1N4007 1 x STTH12R06 5 x led verdi 5mm 1 x led rossi 5mm 4 x diodi IR 5mm 4 x fotodiodi IR 3mm Resistenze: 4 x 220Ω ½W 5 x 560Ω ¼W 3 x 1kΩ ¼W 11 x 10kΩ ¼W 4 x 100kΩ ¼W 8 x 1MΩ ¼W 4 x trimmer ¾ giro 100kΩ Condensatori: 2 x 15pF 2 x 10nF 8 x 470nF 3 x 10uF 1 x 470uF Connettori: 5 x 2 poli passo 5.08 a vite 1 x 3 poli passo 5.08 a vite 3 x 4 poli passo 5.08 a vite 2 x 10 poli per stampato maschio 2 x 10 poli per flat cable femmina Altro: 2 x interruttori 1 via N.C. - N.A. 1 x pulsante da c.s. N.A. 2 x motoriduttori 12V rapporto 43:1 1 x quarzo 8.000 MHz 16
4 x sensori OMRON E3S-AD61 1 x ball caster ø 15 mm 2 x Ruote ø 80 mm Viti M3 e M4 Dadi M3 e M4 1 x Scatola da impianti elettrici 20 x 15 cm Tubetto rigido ø 3mm Guaina ø 5 mm 1 x Batteria al piombo-gel 12V 1,2-1,3 Ah 3 x zoccoli per integrati 8 poli 1 x zoccoli per integrati 14 poli 1 x zoccoli per integrati 28 poli 1 x dissipatore per case TO-220 Lamina in allumino spessore 1mm 2 x connettori fast-on 2 x basette millefori 10 x 16 cm 2 x mammut ø 4mm 17
Foto, schemi e PCB: Principale: Comparatori: 18
Fotosensori IR OMRON Oscillatore e diodi IR 19
PCB scheda principale PCB scheda comparatori: 20
Interno: Esterno: 21