|
Appunti tecniche |
|
Visite: 2866 | Gradito: | [ Grande appunti ] |
Leggi anche appunti:Popper e il falsificazionismoPopper e il falsificazionismo Sia la Teoria della Relatività nel suo Numero di giriNumero di giri La potenza massima in un motore è direttamente proporzionale al Tecnica TDM e campionamentoTecnica TDM e campionamento Nelle tecniche AM e FM i segnali analogici in ricezione |
Istituto Tecnico Industriale "Leonardo Da Vinci"
Assemblaggio di
componenti e sviluppo software per un robot cingolato dotato di sensori infrarossi.
La tesi proposta consiste nello sviluppo di un robot il quale sarà capace di muoversi autonomamente all'interno di un piano senza cadere oltre i bordi utilizzando dei sensori ad infrarosso.
Partendo da un'analisi del robot assemblato e delle problematiche connesse al controllo del piano di appoggio, si giunge alle scelte nello sviluppo del software di controllo. L'algoritmo è stato studiato a partire da un modello matematico semplificato del robot e successivamente affinato grazie a prove sperimentali.
Si cercherà quindi una taratura che punti a massimizzare la velocità dei movimenti ed al tempo stesso riduca al minimo il rischio di caduta accidentale del robot.
Il microprocessore riceve in input i dati analogici dei sensori IR ed attua, attraverso i sistemi di controllo dei motori, dei movimenti di risposta.
In questo capitolo analizzeremo parte dell'elettronica presente sul robot (quella utilizzata per realizzare il riconoscimento del piano) a cui sono connesse delle informazioni sulle possibilità di programmazione. Il robot dispone di una scheda interamente progettata da noi su cui è presente la sezione di alimentazione (1), il microcontrollore vero e proprio (ATMEGA 8535) che servirà per l'esecuzione del software utente (2) e una parte per la comunicazione con il PC tramite porta seriale(3) e ISP (4). Infine sono presenti delle sezioni per:
La struttura della scheda costruita può essere riassunta in 4 punti principali:
La scheda è stata progettata per essere alimentata esclusivamente in tensione continua a 6 volt. L'alimentazione proviene da un pacco di 5 batterie (1,2 V ciascuna) con capacità di 1100 mAh.
Dalla batteria sono ricavate le due linee di alimentazione: 5VA e 5VD.
Come è possibile vedere nello schema, la tensione proveniente dal jack di connessione viene ridotta tramite il diodo D1, che protegge anche dal collegamento errato della batteria. Un ulteriore riduzione è ottenuta tramite il diodo D2. Come si può notare, la tensione 5VA è prelevata subito dopo il diodo D1. Questa tensione è utilizzata per l'alimentazione dei motori. La tensione 5VD invece viene utilizzata per alimentare tutti gli altri componenti del circuito.
L'elaborazione del software utente è affidata ad un microcontrollore della famiglia ATMEGA, in particolare al modello 8535. Molto diffusi per i costi ridotti e le buone capacità di calcolo ed interfacciamento, i microcontrollori presentano in un singolo circuito integrato un microprocessore, dei registri RAM ed EEPROM.
Inoltre sono presenti alcuni registri connessi con dei pin di I/O che permettono l'interfacciamento verso l'esterno.
Per ottenere dei pin di tipo bidirezionale, che possono funzionare sia come Input che come Output (non contemporaneamente), è necessario utilizzare uno schema con registri separati di input ed output e porte TRI-STATE.
Infatti una porta di input non può funzionare contemporaneamente come output, e viceversa. Inoltre, forzando un segnale su una porta di output, si rischia di danneggiarla.
Lo schema generale di un microcontrollore è il seguente:
Il cuore del microcontrollore è una CPU, che preleva le istruzioni presenti nella memoria flash e eeprom. La memoria RAM di lavoro contiene soltanto i dati che risultano separati dal programma. Le periferiche più comuni sono:
Vediamo come lavora in particolare l'ATMEGA:
L'ATMEGA 8535 presenta 40 piedini, ognuno con una funzione diversa. Qui sotto sono descritti i più importanti:
|
VCC: alimentazione GND: massa PA0.PA7, PB0.PB7, PC0.PC7, PD0.PD7: sono rispettivamente gli 8 piedini delle porte A, B, C, D. Ogni piedino rappresenta una linea di I/O del microcontrollore. RESET: attivo a livello basso, provoca il reset del microcontrollore. |
Il linguaggio e le regole sintattiche utilizzate per la programmazione sono quelle delle classiche versioni del C per PC. Il linguaggio è compilato, il microcontrollore interroga la memoria flash, da cui preleva il software, ed esegue i comandi richiesti.
La comunicazione con il PC ha la funzione di memorizzare nella memoria FLASH i programmi utente. Può essere usata anche per effettuare il debug dei programmi in fase di sviluppo.
|
|
La porta parallela del PC è utilizzata per interfacciarsi con il microcontrollore al fine di poter trasferire i programmi nella sua memoria. |
La porta seriale del microcontrollore, realizzata con il MAX 232, consente di interfacciare l'ATMEGA8535 con il mondo esterno. Questa porta in particolare consente anche di effettuare il debug dei programmi utente durante la fase di programmazione. |
Per facilitare le connessioni sulla scheda sono presenti una moltitudine di slot di espansione (o collegamento) di cui viene mostrata una panoramica in questo paragrafo.
Ogni slot è identificato dalla sigla Ji oppure MGi dove la i serve all'identificazione dello slot.
J1 |
Attacco per la porta C (non utilizzato) |
J2 |
Attacco per la porta A (non utilizzato) |
J3 |
Cavo per programmatore |
J4 - J5 |
Alimentazione ausiliaria (non utilizzato) |
J6 |
Attacco per la batteria |
J7 - J8 - J9 |
Sensori palla (sinistro, centrale, destro) |
J10 - J11 - J13 - J14 |
Attacchi per sensori e emettitori linea (per rilevare il piano) |
J12 |
Attacco baffo per la palla |
J15 - J16 |
Baffi posteriori |
MG1 - MG2 |
Attacchi per motori destro e sinistro |
Per lo schema dettagliato della posizione dei connettori vedere gli schemi a pagina 5 e 6.
Naturalmente la scheda necessita di componenti per interagire con il mondo esterno: visto che tali componenti devono essere situati in posti diversi e strategici del robot, non è stato possibile implementarli direttamente all'interno della scheda. Per questo risultano connessi tramite gli slot di collegamento descritti in precedenza.
Il nostro robot utilizza dei sensori IR monoblocco per la rilevazione del piano.
In questo paragrafo verrà effettuata inizialmente una trattazione su questi sensori, in un secondo momento si valuteranno le implementazioni.
Con il termine sensore IR si indica un elemento sensibile alla radiazione nell'intorno della lunghezza d'onda infrarossa. Nel nostro caso si indica il gruppo emettitore + ricevitore.
L'emettitore è generalmente un led realizzato in modo da emettere radiazione infrarossa. Il ricevitore è un fototransistor, ovvero un transistor la cui corrente di collettore dipende dalla quantità di radiazione che lo investe.
Il funzionamento della coppia emettitore / ricevitore è quello di un classico transistor.
Una delle soluzioni per usare questo tipo di sensori è disporre emettitore e ricevitore in linea, in questo modo si ottiene una comunicazione a distanza come avviene nei telecomandi. La soluzione impiegata in questo robot è quella di usare un sensore IR con emettitore e ricevitore integrati e sfruttare le proprietà di riflessione dei materiali; in questo modo è possibile ottenere rilevazioni di prossimità. Nell'esempio proposto di seguito i sensori hanno integrato sia l'emettitore che il ricevitore.
Variando la lontananza del materiale, anche se non varia la quantità di radiazione infrarossa riflessa, si modificherà la zona di massima incidenza. Come mostrato nella figura sottostante.
Se la distanza è nell'intorno dei 3 mm la quasi totalità della radiazione riflessa investe il ricevitore, mentre per valori inferiori o superiori si riduce la quantità che investe direttamente il ricevitore.
L'ultimo fattore da considerare è la riflessione dei materiali. Ogni materiale è caratterizzato da tre coefficienti (riflessione, assorbimento, trasmissione) che ne caratterizzano il comportamento se investiti da radiazione. In generale i corpi di colore nero tendono ad assorbire la maggioranza della radiazione, mentre quelli bianchi tendono a riflettere la quasi totalità della radiazione.
Come per ogni sensore, anche per gli IR la misurazione può essere affetta da disturbi. Nel nostro caso ogni fonte di radiazione infrarossa rappresenta un disturbo.
Per rilevare la presenza del piano di appoggio sono utilizzati 4 sensori IR monoblocco che, tramite degli opportuni supporti, possono essere posti a circa 4 mm dal piano del moto. L'uscita dai sensori viene acquisita come segnale analogico.
Per rilevare lo stato dei sensori in parallelo sono necessari 5 pin (4 per i sensori linea, 1 per gli emettitori linea). Questo vuol dire che i led sono attivi tutti contemporaneamente ed è quindi possibile acquisire dati da più fonti contemporaneamente.
I sensori in questione sono i QRD1114 distribuiti dalla FAIRCHILD
I 4 sensori sono stati posizionati sugli angolo del robot grazie a dei supporti fissati direttamente sul telaio.
I connettori garantiscono il collegamento con il microcontrollore che, al momento della rilevazione di un segnale, fa indietreggiare il robot modificando il verso di rotazione dei motori. Successivamente effettua una manovra di rotazione ed una successiva ripartenza.
La locomozione del robot è ottenuta mediante il doppio motoriduttore Tamiya 70097, che viene distribuito direttamente dalla Tamiya. Il kit contiene due piccoli motori DC che trasmettono il moto a due assi esagonali da 3mm separati. Di seguito è riportato un estratto del datasheet con le caratteristiche salienti:
|
Caratteristiche Tecniche: Alimentazione 3Vdc (4.5Max) Tipo Motore FA-130 Coppia 4.6 gcm Velocità 13.230 rpm Corrente 0.5 A Rapporti 58:1 - 203:1 Dimensioni 75 x 50 x 23 mm |
Il comando avviene a mezzo di impulsi di durata variabile dati alla rete di transistor. Nei paragrafi successivi saranno illustrate la struttura dell'apparato motorio e le problematiche legate al controllo ed alla sterzata.
Il classico motore in corrente continua ha una parte che gira, detta rotore (in grigio nelle figure), e una parte che genera un campo magnetico fisso, detta statore (i due magneti colorati). Un interruttore rotante, detto collettore a spazzole (nelle figure l'anello color rame, fissato all'albero rotante del motore, con i due contatti striscianti + e - collegati alla parte ferma), inverte due volte ad ogni giro la direzione della corrente elettrica che percorre i due avvolgimenti, generando un campo magnetico che fa girare il rotore.
|
|
Quando la corrente scorre negli avvolgimenti, si genera un campo magnetico intorno al rotore. La parte sinistra del rotore è respinta dal magnete di sinistra ed attirata da quello di destra. Analogamente fa la parte in basso a destra. La coppia genera la rotazione. |
Quando il rotore sarà allineato orizzontalmente, il commutatore invertirà la direzione della corrente che scorre negli avvolgimenti: invertendo il campo magnetico, inizierà la seconda parte del giro. E così via.. |
La velocità di rotazione dipende dai seguenti fattori:
La coppia generata è proporzionale alla corrente. Il controllo più semplice agisce sulla tensione di alimentazione. Dato che questo tipo di motore può sviluppare una forte coppia a basse velocità di rotazione è stato usato nella trazione elettrica, come, ad esempio, sulle locomotive.
Il motore in corrente continua può essere visto come sistema elettromeccanico, scomponendolo in 2 circuiti, uno elettrico e uno meccanico:
dove Ke è la costante elettrica del motore e ω la velocità angolare dell'asse.
Le variabili che descrivono il sistema sono la tensione e la corrente elettrica; gli elementi devono essere connessi in serie perché attraversati dalla stessa corrente (corrente di armatura Ia).
Il circuito meccanico è composto da:
un generatore di coppia Cm, il cui valore dipende dalla relazione: Cm = Kt · Ia
dove Kt è la costante meccanica del motore e coincide con il valore di Ke (costante elettrica)
una resistenza meccanica Rm, determinata dall'attrito del motore con l'aria
un momento di inerzia J della massa in rotazione
un momento d'inerzia Jl dovuto al carico
Le variabili che descrivono il sistema sono la coppia e la velocità angolare. Gli elementi possono essere connessi in serie in quanto presentano tutti la stessa velocità angolare ω.
La figura sottostante rappresenta il funzionamento del sistema:
|
|
Schema di un motore in corrente continua con carico applicato. |
|
|
|
Schema equivalente della parte elettrica |
Schema equivalente della parte meccanica |
Applicando il principio di Kirchhoff alle due maglie, cominciando dal punto della maglia che si trova al potenziale di riferimento e procedendo in senso orario otteniamo un sistema di due equazioni che descrive la relazione ingresso-uscita:
|
|
|
In questo modo il sistema "motore in corrente continua" è descritto da un sistema di equazioni differenziali; possiamo dire che il sistema:
È del 2° ordine, in quanto descritto da due variabili di stato (corrente di armatura e velocità angolare)
lineare perché le equazioni differenziali sono combinazione lineare delle variabili e delle derivate prime
È invariante in quanto i coefficienti delle incognite sono delle costanti
L'andamento temporale della velocità angolare ω, una volta fissato l'andamento della tensione di ingresso Ea, può essere conosciuto risolvendo il sistema trovato.
Un motoriduttore consiste in una serie di ingranaggi finalizzati ad aumentare la potenza e ridurre sensibilmente i giri del motore a cui viene applicato.
Il motoriduttore usato è assemblabile in due diversi rapporti di riduzione: 58:1 (veloce e poco potente) oppure 203:1 (lento e potente). Questo è possibile scegliendo opportunamente i tipi di ingranaggi tra quelli disponibili. Visto che il nostro interesse era incentrato sulla potenza e non sulla velocità, abbiamo scelto il rapporto 203:1.
La tecnica di controllo basata sulla modulazione a larghezza di impulsi (PWM: pulse width modulation) consente un efficace controllo della velocità del motore.
Quest'ultimo viene alimentato con tensione Va ad andamento rettangolare, con ampiezza Vam, periodo T costante e duty cicle δ variabile (il duty cicle è la percentuale di tempo nella quale un segnale logico si trova a 1, quindi in posizione "ON", rispetto al periodo totale dell'onda quadra).
I motori in continua assestano il loro funzionamento sul valor medio della forma d'onda applicata in ingresso: con il variare del duty cicle del PWM riscontriamo una variazione del valor medio Vam applicato all'ingresso e quindi una corrispondente variazione di velocità.
In altre parole il motore, sia per la velocità che per la coppia, sente sostanzialmente il valore medio Vam della tensione di armatura, che a sua volta dipende dal duty cicle secondo la relazione:
Nell'esempio sotto è rappresentata la tensione di alimentazione con duty cicle rispettivamente del 50%, 75% e 25%. È come se al motore venissero applicate tensioni di armatura continue rispettivamente pari a 0,5 Vam, 0,75 Vam, 0,25 Vam.
Per invertire il senso di rotazione di un motore in continua a magneti permanenti occorre invertire la polarità della tensione di armatura. Questo è facilmente realizzabile con un "ponte H".
|
Per capire come funziona possiamo vederlo come un semplice circuito con 4 interruttori (A,B,C,D), un alimentazione (supply + e -) ed un motorino (M). Nella tabella sottostante possiamo osservare cosa succede quando si chiudono i diversi interruttori: |
|
Combinazione |
Polarità |
Effetto |
A e D chiusi |
Avanti |
Il motore gira in avanti |
B e C chiusi |
Indietro |
Il motore gira all'indietro |
A e B oppure C e D chiusi |
Bloccato |
Motore frenato |
Tutti gli interruttori aperti |
libero |
Motore in folle |
Come si vede, quando A e B sono uguali (entrambi chiusi o entrambi aperti), il motore non gira. Per invertire il senso di marcia bisogna invertire i livelli logici di A e B.
Nel robot l'azionamento dei due cingoli è indipendente, sia dal punto di vista meccanico (sono presenti due motori, uno per cingolo) che elettronico (i motori possono essere comandati in modo indipendente) e quindi è possibile ottenere la sterzata semplicemente modificando la velocità di rotazione di uno dei due motori.
Infatti, se uno dei due motori è azionato in modo da ruotare a velocità inferiore a quella dell'altro, il robot sarà costretto a seguire una traiettoria curvilinea in cui il cingolo più veloce percorre la traiettoria esterna (più lunga) ed ovviamente il cingolo più lento quella interna.
Nella prima parte di questo capitolo sarà illustrata una panoramica sull'assemblaggio e sulle problematiche connesse. In seguito saranno mostrati gli aspetti principali della taratura hardware.
Nei paragrafi seguenti verranno illustrate dettagliatamente le varie fasi che hanno portato al completamento della scheda
Per realizzare il circuito tramite OrCad si utilizzano essenzialmente i footprint e i fili di collegamento. I footprint non sono altro che un disegno in scala reale del componente: una volta che la scheda sarà realizzata il componente potrà essere inserito nello spazio apposito. Per esempio un integrato MAX232 a 16 piedini ha il seguente footprint:
Prima di cominciare il disegno è necessario impostare alcune proprietà del foglio, come la scala, il numero di strati ecc. Di solito è utilizzato solamente uno strato. Ma, visto che il nostro circuito è bi-faccia, sono stati utilizzati due strati: TOP e BOTTOM.
Dopo aver definito le proprietà del foglio, si ha davanti la schermata nera di Layout pronta ad essere trasformata in un master.
Tramite il pulsante è possibile inserire nuovi componenti e, selezionando il pulsante , è possibile inserire nuovi fili collegamento.
E' anche possibile inserire sulla scheda un testo: nel nostro caso abbiamo inserito i due nomi dei realizzatori del progetto, Agostinelli e Gentili, uno per ogni faccia della scheda. Questo piccolo accorgimento è servito per poter distinguere facilmente l'orientamento dei master in fase di "stampa" del circuito.
Prima di
passare allo sbroglio delle piste di
collegamento è necessario impostare alcuni parametri, come la dimensione
delle piste di collegamento, lo spazio mimino fra pista e pista, ecc.
Tramite l'AutoRoute del programma si procede allo sbroglio automatico delle
piste: questo lavoro richiede diverso tempo a seconda della distribuzione dei
componenti sul foglio.
Alla fine di questa fase si passa alla stampa del master che va effettuata su di un foglio lucido. La cosa più importante nella stampa è l'opacità del tracciato. Se questa non fosse sufficiente, infatti, si avrà poco contrasto fra le due zone, con il rischio di corrodere anche le piste nel tentativo di asportare il rame dalle zone vuote. Per ottenere il risultato sperato è consigliabile utilizzare una stampante laser.
La costruzione del circuito stampato è praticamente terminata: il nostro foglio lucido potrà essere usato, con la tecnica della fotoincisione, per la costruzione del circuito stampato. Quindi seguirà la foratura della basetta e la saldatura dei componenti.
|
Master del circuito a doppia faccia. Figura in alto: lato montaggio componenti |
|
Il materiale di base per usare la tecnica della fotoincisione è costituito da una normale basetta per circuito stampato, su cui è stesa in modo omogeneo una particolare pellicola resistente all'incisione: se esposta a luce ultravioletta, questa pellicola diventa solubile in una soluzione basica e può quindi essere rimossa facilmente. Ovviamente il rame protetto dal master stampato sul lucido non viene intaccato, rimanendo sul supporto isolante a formare le piste necessarie per collegare i vari componenti.
Il bromografo è un apparecchio che serve per fotoimpressionare una basetta ricoperta di rame sulla quale è stato applicato uno strato di una speciale vernice fotosensibile.
Dopo aver fissato il lucido alla basetta tramite dei filetti di ferro, la inseriamo all'interno del piano in vetro del bromografo. Dopo aver chiuso il piano creiamo il vuoto al suo interno. In questo modo la basetta con il lucido sopra resterà ferma e bloccata per tutto il tempo dell'esposizione. Questo è molto importante perché, se per caso il lucido dovesse spostarsi anche solo di qualche millimetro, sarebbe compromesso tutto il lavoro. Infatti le piste del circuito sono talmente vicine che un minimo spostamento porterebbe di certo alla sovrapposizione di qualche pista.
|
Una volta che il nostro circuito è fissato bene, capovolgiamo il piano in vetro ed azioniamo le lampade a raggi ultravioletti. A questo punto basterà attendere, dopo 270 secondi, lo spegnimento delle lampade che coinciderà con il termine dell'impressionamento. Dato che il nostro circuito è a doppia faccia è necessario ripetere l'operazione anche per l'altra parte del circuito. Al termine di questa fase possiamo passare allo sviluppo. |
Una volta che la basetta è stata impressionata, è necessario fermare l'immagine sulla superficie di rame. Per fare questo è sufficiente immergere la scheda ramata nella soluzione ed agitare. Durante lo sviluppo noteremo che dal circuito si libera un colore nerastro. È la vernice fotosensibile impressionata che, sotto l'azione dell'acido, si stacca liberando la superficie ramata. Una volta che l'immagine risulta ben nitida sulla scheda, è necessario passare ad un abbondante risciacquo che tolga tutti i residui della soluzione dalla basetta e ne arresti lo sviluppo. Occorre fare molta attenzione quando si maneggia la soluzione, in quanto la soda caustica corrode molto facilmente gli indumenti: ne basta una sola goccia.
|
Ormai la vernice fotosensibile è stata tutta disciolta e ora possiamo lavorare in un ambiente più luminoso. In quest'ultima fase non rimane che eliminare il rame dalle zone vuote utilizzando la soluzione di cloruro ferrico. Per questo scopo nella nostra scuola è presente un macchinario che spruzza dell'acido sia da sopra che da sotto. In questo modo il rame non ricoperto dalla vernice viene "lavato" via. |
|
|
|
Ad ogni lavaggio possiamo notare le condizioni sempre migliori della basetta. Dopo circa 6 lavaggi si comincia ad intravedere la vetronite al di sotto dello strato di rame. |
|
|
|
Una volta uscita dal lavaggio con l'acido, la basetta viene lavata con dell'acqua per eliminare i residui dell'acido. |
|
Ecco come si presenta la basetta al termine di circa 10 cicli di lavaggio: come possiamo vedere il rame di cui era ricoperta la lastra di vetronite è stato lavato via, tralasciando solamente i punti in cui era presente della vernice. Adesso la basetta è quasi pronta: resta solamente da eseguire qualche altro lavaggio per poi procedere all'operazione di foratura. |
L' operazione di foratura risulta più agevole se nei punti in cui vanno praticati i fori il rame è stato asportato nel processo di incisione: in tal modo la punta del trapano non scivolerà sul rame. Per forare la basetta abbiamo utilizzato una punta di 0,8 mm ed un piccolo trapano con un supporto a colonna. E' importante fare attenzione che durante la foratura rimanga una parte di rame attorno al foro per consentire poi un'agevole saldatura dei piedini.
La saldatura a stagno è l'operazione che permette il fissaggio dei componenti al circuito stampato. Consiste nella fusione nel punto di contatto tra rame e componente di una lega metallica che, raffreddandosi, permette la connessione elettrica e meccanica. Il saldatore è lo strumento che permette la fusione della lega saldante (generalmente stagno). La saldatura di ciascun punto deve durare pochi secondi, ma senza fretta. Si inserisce il componente nei fori e si gira lo stampato in modo da vedere il lato rame: quindi si applica lo stagno fuso che andrà a collegare il componente con la piazzola in rame. La quantità di stagno deve essere appena sufficiente per coprire interamente la piazzola. Si procede in questo modo per tutti i componenti. A questo punto il circuito stampato è finito.
Per costruire il telaio del robot abbiamo pensato di utilizzare i mattoncini LEGO®. Questi mattoncini, estremamente versatili, si adattano perfettamente alle nostre esigenze. Infatti in questo modo è possibile modellare il telaio a nostro piacimento. Se ci sarà un problema nella struttura del robot, basterà semplicemente fare qualche modifica qua e là, smontando e rimontando i pezzi interessati. Dopo varie modifiche e miglioramenti strutturali suggeriti dalle varie prove effettuate il risultato è il seguente:
|
|
|
Come si può osservare dalle foto il motore è posizionato nella parte posteriore del telaio.
Non essendo perfettamente uguali, i motori non possono garantire un funzionamento identico. Per far ruotare i due motori a velocità quanto più possibile simile è stato necessario tarare in modo opportuno i comandi .
Dalle diverse prove di taratura è risultato che il servomotore sinistro doveva essere comandato in modo da funzionare con il 98% della tensione di comando del servomotore destro. In questo modo abbiamo ottenuto una percorrenza senza significative deviazioni.
Ciò è dovuto ad inevitabili differenze tra i componenti dei due circuiti di comando (ponti H) dei motori.
La taratura del software per il controllo dei motori sarà discussa in un secondo momento.
Dopo aver approfondito le tematiche riguardanti la locomozione e l'hardware a disposizione, verranno affrontate quelle connesse al controllo del piano di appoggio.
Nel capitolo si cercherà di dare una modellazione del robot.
Il trasduttore è un dispositivo elettronico che converte grandezze meccaniche e fisiche in segnali elettrici.
La modellazione, nel nostro caso, è riferita all'interpretazione che può essere data alle informazioni provenienti dai sensori IR, che da ora in poi verranno visti come un unico blocco di trasduzione. Come abbiamo visto, il valore presente all'uscita dei sensori è inversamente proporzionale alla quantità di radiazione riflessa dalla superficie su cui si muove il robot. La taratura consiste nella regolazione della soglia di un comparatore software. In questo modo è possibile adattare i sensori alle caratteristiche di riflessione del pavimento.
Questa prima operazione è stata molto semplice, anche se per avere un risultato ottimale abbiamo dovuto fare moltissime prove ed è stata necessaria quasi un'intera giornata di lavoro.
Considerando che il riferimento di interesse è la presenza del piano di appoggio, è possibile assegnare ad ogni combinazione proveniente dai sensori un valore numerico che ne rappresenti lo stato. In pratica la lettura del trasduttore ci fornirà direttamente il segnale di errore da elaborare per ottenere un'azione di controllo.
Noto il significato delle informazioni provenienti dal trasduttore, è necessario valutare quale tipo di azione di controllo sarà necessaria. Nel nostro caso le azioni di controllo sono la marcia indietro e la sterzata e gli attuatori sono i motori.
L'azione di controllo indicata dall'algoritmo ovviamente non sarà una sterzata, ma il risultato sarà quello. Questo avviene utilizzando il metodo descritto nei precedenti capitoli, ossia far ruotare un motore più velocemente dell'altro.
Dovrà quindi essere valutato il valore massimo dei giri che il motore può effettuare ed associarlo alla massima azione di controllo. Le azioni di entità minore dovranno corrispondere proporzionalmente ai giri del motore.
Definita la struttura (meccanica ed elettronica) complessiva del robot e le problematiche sul rilevamento del piano di appoggio, resta da implementare il software di controllo basato sull'algoritmo presentato nel capitolo precedente.
Saranno inoltre trattate le problematiche connesse al funzionamento dell'algoritmo, come per esempio i controlli da effettuare per determinare la presenza di un angolo, presentando poi le soluzioni adottate per eliminare tali problemi.
Un qualsiasi software di controllo ha una struttura articolata su tre punti
L'acquisizione delle informazioni consiste nel controllo di sensori di riferimento in modo da poter elaborare il segnale di errore: nel nostro caso le informazioni provengono dai sensori IR e possiamo interpretare il segnale come la presenza o meno del piano di appoggio. A questo punto il software elaborerà secondo l'algoritmo di controllo predefinito un azione da intraprendere. La variabile di controllo fornita dall'algoritmo verrà modificata e, nel nostro caso, applicheremo una sterzata oppure una marcia indietro.
Da quanto detto fino ad ora possiamo così schematizzare il nostro sistema controllato:
Il robot, finché rileva la presenza del piano di appoggio, si muove in avanti. Quando i sensori indicano che il piano non è più presente, vengono attuate una serie di manovre per aggirare il problema. L'algoritmo di controllo dovrà quindi fornire direzione e velocità con i quali i motori dovranno essere azionati.
Esempio: se il sensore FSx non rileva più il piano di appoggio si dovrà attuare una sterzata verso destra. Il motore destro dovrà avere velocità zero (la direzione è indifferente), mentre quello sinistro dovrà avere velocità media e muoversi in avanti.
Utilizzando un processo di discretizzazione possiamo ottenere, a partire da una legge di controllo, un algoritmo che ne emuli il comportamento.
In questo paragrafo verrà quindi presentato il software di controllo per intero. Nei vari sottoparagrafi di seguito verranno analizzate le varie parti del software punto per punto.
#include <avr/io.h> //libreria per sensori e motori
#include <inttypes.h> //libreria per motori
#include <avr/interrupt.h> //libreria per motori
#include <avr/sleep.h> //libreria per motori
//---------definizioni variabili di uso comune PER I SENSORI------------
#define EM_PIN 4
#define EM_DDR DDRB
#define EM_PORT PORTB
#define SENS_FS 3 //sensore frontale sinistro
#define SENS_FD 4 //sensore frontale destro
#define SENS_BS 5 //sensore posteriore sinistro
#define SENS_BD 6 //sensore posteriore destro
//-------definizione variabili di uso comune PER I MOTORI----------
#define MOT_PORT PORTD
#define MOT_DDR DDRD
#define DIR1A 3 //direzione del motore sinistro
#define DIR1B 2 //direzione del motore destro
#define PWM1A 4 //PWM del motore sinistro
#define PWM1B 5 //PWM del motore destro
void adc_init( void //funzione per inizializzare l'ADC interno dell'ATMEGA
uint16_t adc_read( uint8_t pin ) //funzione per leggere il valore in uscita dall'ADC
void Wait( uint32_t n ) //funzione che genera un ritardo con un ciclo for
uint8_t MOT_dirA; //direzione motore sinistro
uint8_t MOT_dirB; //direzione motore destro
Funzione per settare i motori: accetta come parametri quale motore deve attivarsi, direzione e velocità.
mot
dir
vel
void MOT_set( uint8_t mot, uint8_t dir, uint8_t vel )
if mot & //se il motore destro è selezionato
void MOT_init( void
void down_check(uint8_t sensore1, uint8_t sensore2)
while (contatore < && flag==
MOT_set( //si ferma un attimo
Wait(
if (flag==
MOT_set( sensore1-
Wait(
MOT_set(
Wait(
MOT_set( sensore2-
Wait(
MOT_set(
Wait(
}
else //se non è in un angolo
MOT_set( //ferma i motori e attende un attimo
Wait(
}
int main( void
Le funzioni qui presentate servono per analizzare i dati provenienti dai sensori IR. L'ADC converte il segnale analogico proveniente dai sensori in un segnale digitale. In questo modo sarà possibile definire una soglia entro la quale il piano viene considerato presente.
void adc_init( void |
Questa funzione si occupa di inizializzare i parametri dell'ADC interno al microprocessore. I valori utilizzati sono stati scelti in base a quanto scritto all'interno del datasheet dell'ATMEGA. |
uint16_t adc_read( uint8_t pin ) |
Questa è la funzione che ritorna il valore digitale risultante dalla conversione del segnale analogico proveniente dai sensori. Il valore restituito dalla funzione può andare da un minimo di 0 (piano di appoggio presente) ad un massimo di 1023 (piano di appoggio assente). |
Queste funzioni si occupano di gestire il segnale PWM per azionare i motori.
void MOT_init( void |
È la funzione che inizializza i motori: Per cominciare imposta come uscite e disattiva tutti i piedini del microcontrollore che riguardano i motori. Dopodiché si occupa di inizializzare i registri del timer 1. Infine setta i motori come fermi. |
void MOT_set( uint8_t mot, uint8_t dir, uint8_t vel ) if mot & //se il motore destro è selezionato |
Questa funzione riceve come parametri di ingresso quale motore azionare, la direzione in cui esso deve girare e la velocità. Per i motori è possibile scegliere: 1 - motore destro 2 - motore sinistro 3 - entrambi i motori. Per quanto riguarda la direzione si può scegliere tra: 0 - avanti 1 - indietro La velocità invece può variare da un minimo di 0 ad un massimo di 255. |
Questa è la funzione che si occupa di attuare una manovra di risposta alle condizioni rilevate dai sensori frontali
void down_check(uint8_t sensore1, uint8_t sensore2) while (contatore < && flag== MOT_set( //si ferma un attimo Wait( if (flag== MOT_set( sensore1- Wait( MOT_set( Wait( MOT_set( sensore2- Wait( MOT_set( Wait( } else //se non è in un angolo MOT_set( //ferma i motori e attende un attimo Wait( } |
Questa funzione accetta come parametri i numeri identificativi dei 2 sensori anteriori: il primo viene considerato come principale e l'altro come secondario. Per prima cosa viene controllato se il primo sensore passato nei parametri (quello principale) rileva la presenza del piano di appoggio: in caso negativo tutti e due i motori vengono fermati altrimenti la funzione ha il suo termine qui. A questo punto si controlla se anche l'altro sensore (quello contraddistinto come secondario) ha perduto il segnale: se è così ci troviamo di fronte ad un angolo del piano e la soluzione prevista è la marcia indietro con una sterzata molto ampia. Se invece il sensore ha ancora il segnale, tutti i passaggi descritti di seguito vengono saltati e si passa direttamente alla fase finale della funzione che verrà descritta in seguito. Una volta innescata la retromarcia si entra in un ciclo di ritardo che ha termine solo in due casi: il conteggio ha raggiunto una data soglia (15000) la variabile di controllo dei sensori posteriori è stata attivata (valore = 1) perché uno dei sensori posteriori non rileva più il piano. Al termine del ciclo di ritardo i motori vengono fermati. Se la variabile di controllo dei sensori posteriori è stata attivata, si effettua una manovra in avanti per allontanarsi dal bordo del piano. A questo punto il robot effettua una manovra per cambiare direzione (attua una rotazione su se stesso). Le istruzioni descritte fino ad ora vengono saltate se il controllo del sensore secondario ha dato esito positivo. Infatti in questo caso verrà eseguita solamente una piccola sterzata verso il lato opposto del sensore principale. In questo modo il robot "si rimetterà in carreggiata". La funzione termina con la fermata del robot. |
Il main è la funzione principale di ogni programma in linguaggio C.
int main( void |
La funzione main, come prima cosa, imposta come uscita e attiva il piedino corrispondente agli emettitori dei sensori IR. In questo modo il led a infrarossi di ogni sensore sarà attivato. Subito dopo inizializza, tramite le funzioni presentate in precedenza, l'ADC e i motori. Seguendo l'evolversi della funzione entriamo in un ciclo infinito (infatti le istruzioni inserite dentro al while verranno eseguite finché 1=1, cioè per sempre). All'interno di questo ciclo comincia l'algoritmo di controllo vero e proprio: entrambi i motori vengono azionati con direzione avanti e velocità media. In seguito viene richiamata 2 volte la funzione down_check descritta in precedenza: la prima volta passando come sensore principale FSx e come secondario FDx. La seconda volta facendo il contrario. Alla fine della fase di controllo dei sensori il ciclo ricomincia dall'inizio, e così via. |
Dalle prove realizzate si evince che il robot riesce senza problemi a restare su di un tavolo in assenza di bordi protettivi. Riesce ad affrontare curve con oscillazioni praticamente assenti.
Un'applicazione di questo tipo (fatte le debite proporzioni) può trovare seguito in grandi magazzini automatizzati, in cui possono essere utilizzati dei carrelli per il trasporto della merce. In questo caso i sensori dovrebbero essere tarati per distinguere una linea colorata situata sul pavimento. Il tutto garantendo la massima flessibilità, poiché il percorso potrà essere variato in poco tempo ad un costo molto basso.
Appunti su: vale5va@liberoit mail, invertire rotazione con doppio deviatore, |
|
Appunti Aeronautica | |
Tesine Automobile | |
Lezioni Silvicoltura | |