23 Ott 2009

Robot ampliabile

Submitted by Galaxi93
Robot ampliabile

Premessa introduttiva

Ecco una piccola guida per costruire un robot controllato da un PIC 16F877 programmato interamente in C. Questo robot è completamente ampliabile, e quindi è personalizzabile al massimo ed è possibile aggiungere qualsiasi tipo disensore e funzione. Il progetto è adatto a tutti coloro che hanno sempre desiderato costruire un robot. In questa pagina vedremo come preparare una base solida al nostro futuro robot e i primissimi circuiti che lo faranno funzionare. Il progetto è adatto ai principianti che si avvicinano al mondo della robotica-elettronica. Infatti spiegherò in modo chiaro e semplice tutti i vari procedimenti, e se avrete bisogno di chiarimenti su qualche dubbio o quant'altro non esitate a chiedere nei commenti.

 

Vediamolo subito in azione

 

Telaio e sistema di Locomozione

Prima di iniziare con i "fatti", dobbiamo pensare come fare e che forma dare al nostro robot. Come materiale da utilizzare per la base ce ne sono molti. Si può utilizzare il plexiglass, il compensato, il PVC, le basette forate o qualsiasi altro materiale vi venga in mente. Personalmente, ve ne consiglio uno, che poi è quello che ho usato, ovvero il compensato dallo spessore di 5 mm. Perché l'uso di questo materiale? Semplice. E' facilissimo da lavorare, infatti si taglia con un taglierino e si può bucare con la punta di un cacciavite. Tutti gli altri materiali o sono difficili da lavorare o hanno un costo elevato, anche se sono un pò più resistenti.
 

Scelto il materiale, bisogna pensare la forma e la dimensione per il futuro robot. Per le dimensioni consiglio 20x15 cm più o meno; poi dovete decidere la forma. Potete prendere spunto dai vari robot in commercio o altri, e dar loro la forma che più vi piace, anche semplicemente rettangolare, o, se volete fare qualcosa di originale, una base rotonda o ovale. Per esempio io l'ho fatta rettangolare, con la parte frontale arrotondata e le ruote interne al telaio.

Particolare attenzione si deve porre al sistema di locomozione, che deve essere il più preciso possibile (la perfezione non esiste, specialmente nella robotica). Io consiglio l'uso di un servocomando modificato in modo da funzionare da motoriduttore (al più presto metterò un articolo a riguardo), poiché, con la sua squadretta a forma di croce, può essere attaccata ogni tipo di ruota.

Purtroppo io non avevo due servocomandi (ne avevo solo uno, che sfiga!), allora ho utilizzato dei motoriduttori presi da qualche giocattolo (naturalmente di mio fratello...).

La parte più difficile è stata quella di adattare le ruote al perno del motore. Infatti esso aveva un perno strano (rotondo ma con dei lati tagliati parallelamente) e io dovevo farlo entrare nelle ruote prescelte, ovvero ruote del lego (sempre di mio fratello ) che hanno l'attacco a croce.

Per fortuna ho trovato un "adattatore" (penso smontato sempre dallo stesso giocattolo) e ho forato la ruota.

E' venuto fuori un bel lavoro!

Ecco delle foto:

Ruota e Perno.JPG

Ruota e Perno.JPG

Ruota e motore.JPG

Ruota e motore.JPG

Un consiglio per forare la plastica (specialmente quella dei lego e nei punti dove più sottili): usate prima una punta più piccola, poi quella più grossa e, ai primi giri (di trapano), girate la punta nel senso opposto (Antiorario) per evitare di rompere per sempre la plastica e farvi urlare dal nervoso.)

Scelto il motore e la ruota dovete fissarli alla base.

Potete metterli davanti o dietro, oppure al centro. Potete metterli all'esterno o all'interno, applicando gli eventuali tagli in corrispondenza della ruote. Questo procedimento deve essere eseguito con la massima precisione. Dovrete fare in modo che le ruote siano parallele tra loro e con la base, e non che una spara di qua e l'altra nella direzione opposta. Mi raccomando! Questo è molto importante! Poi, dato che con due ruote non può stare in piedi da solo (anche se tutto è possibile!) dovete fornirgli una terza ruota. Essa deve essere in grado di ruotare il proprio asse di 360° ovvero deve essere "pivotante". Si può comprare o si può costruire (utilizzando materiali di recupero). Si può utilizzare anche una sfera, come questa:

Ruotino.JPG

Ruotino.JPG

Va posta nel lato opposta a quella delle ruote, e nel caso in cui voi le abbiate messe al centro, scegliete voi la parte dove metterle (più avanti vedremo come bilanciare il peso). Naturalmente dovrete essere precisi, ovvero dovrete metterla al centro e non spostata su un lato. Ecco la mia base:

Base sopra.JPG

Base sopra.JPG

Base sotto.JPG

Base sotto.JPG

Potete notare le righe fatte a matita e le viti di fissaggio. Quando fissate la ruota o palla, controllate che la base sia in pano (aiutatevi con una bolla o anche così ad occhio) non deve aver il muso più alto della coda o viceversa.

Finito con la base, potete fare un sospiro di sollievo, perché la parte più grossa del lavoro è fatta. Ora potete anche testare se il vostro "robot" va dritto. Se va perfettamente dritto siete dei maghi!! Se invece gira leggermente da una parte, non vi scoraggiate, è quasi impossibile che vada perfettamente dritto. Anche se i motori sono uguali, uno dei due andrà sempre un po' più veloce dell'altro, è inevitabile! Se invece gira di molto da una parte controllate che sia tutto a posto e date una bella sgrassata al motore che gira piano.

Ora, dopo esservi riposati un po', dovrete decidere dove mettere i seguenti oggetti:

  • Scheda elettronica,
  • gruppo batterie da 6 V o 12 V (in funzione della tensione nominale del motore), e
  • batteria da 9 V per elettronica.

Prima di fissarli fate delle prove. Seguendo il mio robot, io ho messo la batteria da 9 V vicino ai motori sotto, la scheda sopra ai motori e le batterie davanti alla scheda (lasciando un po' si spazio tra il bordo del telaio e a quello della scheda (per futuri sensori o altro)). Le batterie le ho messe davanti perché altrimenti mi si impennava il robot!! Voi dovete fare della prove e vedere dove è meglio mettere i vari componenti.

Ecco le immagini:

Telaio sopra.JPG

Telaio sopra.JPG

Telaio sotto.JPG

Telaio sotto.JPG

La prima scheda e i sensori di contatto

Bene, iniziamo subito a dire il perché di due pacchi di batterie invece che uno solo: tutto dipende dai tipi di motori che utilizzate. Ad esempio io uso due motori che vanno a 6-9 V e quindi ho bisogno di un pacco batterie che eroghi tale tensione. L'elettronica (PIC, Integrati ecc.) funzionano con 5 V. Per evitare cali di tensione, dovute ai motori e alle batterie non pienamente cariche, ho adottato questi due pacchi batterie, anche per il fatto che il regolatore di tensione, inizia a stabilizzare la tensione a partire da 7-8 Volt. Per l'elettronica ho usato una batteria da 9 V (quelle quadrate, per intenderci), mentre per i motori un batteria ricaricabile (presa da una macchinina telecomandata da 9,6 V.

Come tutti i robot, anche il nostro ha bisogno di un interruttore (altrimenti come salvare l'umanità, nel caso in cui il vostro robot si ribelli!?!).

Dato che abbiamo due batterie diverse, direi di utilizzarne uno bipolare (con due pin separati). Se invece avete solo uno unipolare (con un solo pin), non c'è problema! Attaccherete i due poli negativi insieme così da spegnere entrambi. Ecco un esempio di interruttore bipolare:

Bipolare.jpg

Bipolare.jpg

 

Ora! In mano il saldatore e via con lo stagno!! 

Saldate 4 fili sui vari pin del bipolare (due in caso dell'unipolare o di un singolo pacco batteria). Dopo aver saldato i fili, copriteli con della guaina termo-restringente (oppure con il nastro isolate). Fissate l'interruttore dove più vi piace e attaccatelo con un po' di Super Attack. Fatto ciò, io vi consiglio di utilizzare dei connettori per ogni "dispositivo" (batterie, sensori, interruttori) da poter attaccare e staccare dalla scheda di controllo. In questo modo darete in grado di poter sconnettere tutti i cavi e lavorare liberamente con la scheda. Potete anche utilizzare delle morsettiere se preferite. Io ho adottato questo metodo:

Connettore.JPG

Connettore.JPG

Ho utilizzato dei pezzi di strip femmina, a cui ho saldato sopra i fili, e dei strip maschio saldati sulla scheda. Poi dobbiamo fare dei sensori di contatto, visto, che adesso, ci sono solo gli switch che servono a poco niente, messi così. Dobbiamo mettergli dei "baffi". Il materiale potete sceglierlo come volete, usate quello che avete in casa e un po' di fantasia e manualità. Io ho usato dei fili di ferro del diametro di 2 mm elastico (che poi ho scoperto essere di acciaio inossidabile e quindi non saldabile…). Non utilizzate materiali troppo rigidi o pesanti, perché potrebbero essere di intralcio allo stesso robot.

Ecco un baffo:

Baffo.JPG

Baffo.JPG

La prima scheda: L'alimentazione

Per poter controllare i motori, dobbiamo utilizzare circuito di potenza che amplifichi il debole segnale del pic o integrato, e indirizzarlo ai motori. Quindi ci serve un ponte ad H. Il ponte ad H può essere costituito da transistor oppure da un integrato.

Ecco il mio schema:

Ponte H.JPG

Ponte H.JPG

 

Lista Componenti

  • R1-R6=1,2 KΩ
  • R7=220 Ω
  • C1=Elettrolitico 100 uF 64 V
  • T1-T8=BC547 (variabile).
  • T9-T12=BC557 (variabile).

Il funzionamento del ponte H è molto semplice: ogni ponte ad H è controllato da due segnali: uno di direzione e uno di accensione. Infatti per evitare cortocircuiti causati da un errore di programmazione, è stato usato un inverter, che inverte solo un ramo del ponte, facendo in modo che siano sempre di uno stato differente. Per la scelta dei transistor, bisogna conoscere l'assorbimento massimo dei motori (vi consiglio di misurare l'assorbimento del motore, quando esso è parzialmente o del tutto bloccato). Volendo si poteva benissimo usare uno di quei comodissimi ponti H integrati. Come ad esempio il L293Ddi cui riporto il pinout:

L293D.jpg

L293D.jpg

Questo invece è lo schema dello stabilizzatore a 5 V per l'elettronica di comando:

Alimentazione.JPG

Alimentazione.JPG

Lista componenti

  • IC1=LM7805
  • R1=180 Ω
  • C1=Ceramico 100 pF
  • C2=Elettrolitico 100 uF 64 V

Non c'è molto da spiegare. E' il classico circuito per stabilizzare la tensione a 5 V, con un led indicatore. In più c'è il connettore dei tasti di contatto, che devono essere collegati in maniera che il contatto NC (normalmente chiuso), sia collegato alla massa, quello NA (normalmente aperto) alla vdd e il comune è il segnale che va al PIC.

Ecco come appare la schema montata:

Scheda Alim..JPG

Scheda Alim..JPG

Volendo, a questo punto, si può testare il circuito appena fatto, facendo dei ponticelli "volanti" nel connettore principale. Infatti collegando a massa (pin 1-2) i pin 5-6-7-8, dovreste vedere il robot avanzare indietro o avanti (dipende da come avete collegato i motori). I pin 5 e 7 controllano l'accensione e lo spegnimento del ponte H, mentre i pin 6-8 la direzione. Segnatevi tutte queste informazioni, che vi serviranno poi in seguito per programmare il vostro robot.

Il cervello del robot

Questa scheda è costituita principalmente dal PIC16F877A che è un microcontrollore e i vari componenti di gestione. Ecco lo schema:

Scheda PIC.JPG

Scheda PIC.JPG

 

Lista Componenti

  • R1=1 kΩ
  • R2=10 kΩ
  • C1-C2=ceramico 22 pF
  • D1=diodo 1N4148
  • Q1=Quarzo da 16 Mhz

Come schema è semplice. L'unica accortezza che dovete avere è quella della posizione del quarzo al pic: devono essere il più vicini possibile, precedenza assoluta, altrimenti rischiate di avere interferenze per l'elevata frequenza e quindi comportamenti anomali del robot. Il pulsante S1 serve per il reset senza spegnere tutto il robot e il connettore ICSP serve per programmare il pic senza rimuovere il bestione dalla scheda.

Questa è la piedinatura del pic:

16F877A.JPG

16F877A.JPG

E questa è come si presenta la schema montata:

Scheda PIC.JPG

Scheda PIC.JPG

Il connettore maschio:

Connettore pic.JPG

Connettore pic.JPG

Avrete notato che c'è molto spazio inutilizzato sulla scheda. Questo per il motivo che è un robot ampliabile e quindi è consigliabile lasciare molto spazio per modifiche e aggiunte future. (una cosa che ho imparato è che meglio abbondare che risparmiare, perché risparmiare spazio porta più malefici che benefici, ve ne parla un esperto…di schede non funzionanti…).

Due Schede.JPG

Due Schede.JPG

Sensori di luce

Oltre ai sensori meccanici che rilevano un ostacolo e lo evitano, esistono molti altri sensori per "orientarsi" dello spazio circostante, ad esempio la luce. Infatti è possibile equipaggiare il robot con sensori che rilevano la luce per seguirla o evitarla (questo tipo di sensore viene utilizzato molto nei Beam robot, per cercare la luce che serve ad alimentarli attraverso un pannello solare).

Esistono principalmente due tipi di sensori: le foto-resistenze e foto-diodi. Essi hanno caratteristiche uguali e differenti. Entrambi variano la loro resistenza in base alla luce che ricevono. Le foto-resistenze si comportano come vere e proprie resistenze variabili (tipo potenziometro) mentre i foto-diodi si comportano come diodi, facendo scorrere la corrente solo in un senso. Io ho utilizzato dei foto-diodi perché avevo solo quelli, ma nessuno vi vieta di utilizzare le foto-resistenze.

Il circuito è molto semplice:

Sensori_luce.JPG

Sensori_luce.JPG

Le resistenze sono da 270 kΩ. Il circuito è semplicissimo e non necessita di molte spiegazioni. In pratica è un partitore di tensione dove varia la tensione al variare della luminosità. Ho deciso di mettere tre sensori, due davanti e uno dietro per avere una percezione migliore della luce. Ecco alcune immagini:

Luce.JPG

Luce.JPG

Robot01.JPG

Robot01.JPG

Robot03.JPG

Robot03.JPG

La programmazione del robot

Premesse

Premetto che io sono ancora un principiante, sia in elettronica che in programmazione. Tutti i programmi che ho fatto per il robot sono scritti in C e compilati con MikroC. Tutti gli esempi che citerò nel corso di questo tutorial, sono contenuti nel file alla fine della pagina, sia il sorgente che il file hex.

Primo programma

Per iniziare, ho deciso di far evitare gli ostacoli al robot, in maniera semplice, senza complicarsi troppo la vita. Siccome questa guida è rivolta particolarmente a tutti coloro che non sanno quasi nulla o poco di programmazione, vi aiuterò passo-passo nel riadattare il codice. Scaricatevi il file compresso alla fine della pagina e apritelo. Aprite il file "Programma_robot_v01" con MikroC (scaricabilequi ). Alle prime righe c'è un intestazione che viene ignorata al momento della compilazione (al pic non gli importa niente dei nostri commenti!). Poi, dalla 11° alla 22° riga ci sono una serie di define che ci facilitano la programmazione. Vi spiego cosa voglio dire quei numeri: Dato che per controllare i due motori, abbiamo bisogno di 4 segnali in totale, ho racchiuso in un unico numero binario a 4 bit, lo stato di quei segnali per effettuare una determinata manovra. Il primo bit (i bit si contano da destra) corrisponde al segnale di direzione del motore sinistro, il secondo di quello destro, il terzo corrisponde al segnale di accensione/spegnimento del motore destro e il quarto di quello sinistro. Quindi per andare diritto, io, devo mettere cosi: 0b1111. Voi dovete controllare bene come sono i vostri collegamenti e se sono diversi dovrete cambiare tutti i define. Poi più in basso c'è la funzione motori. Essa è fondamentale, perché fa muovere il robot, decodificando i define che gli vengono passati. Sotto c'è il main e tutta la procedura per evitare gli ostacoli che è già ben commentata nel file.

Secondo programma

Il nostro bel pic, è dotato di belle funzioni molto utili e diverse tra loro. Una di queste è il modulo PWM (o CCP ). Ne ha ben due, giusti giusti per il nostri due motori. Prima di cominciare, mi sembra doveroso spiegare il funzionamento del pwm. Il PWM (Pulse-Width Modulation) è un onda quadra che viene appunto modulata modificandone il duty cycle che è la durata dell'impulso (segnale alto). Quindi avendo un duty cycle al 0% avremo un impulso di durata nulla (teoricamente). Il contrario se lo avremo al 100% avremo un impulso che finisce quando ne inizia un altro (infinito). Aprite il file "Programma_robot_v02". Il file è molto simile al primo programma: alle prime righe c'è un'intestazione, seguono i soliti define che dovete modificare come i precedenti, e poi c'è la funzione "motori" che è cambiata. Adesso non basta fornire solo la direzione, ma si deve inserire anche la velocità, espressa in un numero che va da 0 a 3. Ecco le istruzioni che regolano la velocità:

pwm1_set_duty(255-(motore_sx*velocita*83));
pwm2_set_duty(255-(motore_dx*velocita*83));

Praticamente con l'istruzione pwm1_set_duty(); si passa il valore di duty cycle da applicare al modulo CCP 1 (RC2). Quel 255-(..) c'è perché i transistor che controllano l'accensione e lo spegnimento dei motori sono PNP e quindi deve essere invertito. Se avete messo dei transistor NPN togliete quel 255- e le parentesi aggiuntive. Poi, motore_sx*83 serve ad inidicare se il motore deve essere spento o acceso per la manovra scelta. Invece l'83 è il valore minimo che permette ai motori di girare. Il resto del programma è uguale, con le dovute modifiche.

Terzo programma

Aprite il file Programma_robot_v0. Come gli altri programmi, c'è l'intestazione, i define, la funzione che controlla i motori. Ora in più c'e anche la funzione Segui_luce che confronta i valori rilevati dai tre sensori, e controlla chi è il più elevato. C'è anche una funzione assoluto che mi converte un numero relativo (positivo o negativo) in assoluto (solo positivo), che è usata dalla funzione Segui_luce. Oltre a modificare i define come nei scorsi programmi, dovete anche cambiare i numeri tra parentesi dei vari adc_read(n) . I numeri corrispondo alle porta analogiche del pic. Dovete controllare a quali porte lo avete collegato e controllare sul datasheet a quale porta analogica corrisponde. Per maggiori informazioni guardate il codice che è ben commentato. Nel video si vede che sono stati applicati dei piccoli "coni" sui foto-diodi frontali. Questi servono per far ricevere al diodo solo la luce proveniente da una determinata direzione. Infatti ho notato che adesso riesce a seguire con più precisione la luce. Per farli basta usare un compasso e del cartoncino.

 Il file con gli esempi e programmi citati sopra, lo potete scaricare qui.

Conclusioni

Ovviamente il robot non è completo, e ci sono ancora un sacco di porte libere del pic. Sto già lavorando al progetto, e sto aggiungendo nuovi sensori, tra cui dei sensori segui-linea ed evita ostacoli. 
Sono molto graditi commenti e critiche costruttive riguardanti l'intero progetto. 

Sezione: