Sommario:

Rover a controllo gestuale utilizzando un accelerometro e una coppia trasmettitore-ricevitore RF: 4 passaggi
Rover a controllo gestuale utilizzando un accelerometro e una coppia trasmettitore-ricevitore RF: 4 passaggi

Video: Rover a controllo gestuale utilizzando un accelerometro e una coppia trasmettitore-ricevitore RF: 4 passaggi

Video: Rover a controllo gestuale utilizzando un accelerometro e una coppia trasmettitore-ricevitore RF: 4 passaggi
Video: Christmas Lecture 2017 - Prof. Roberto Cingolani: Nanotechnologies for Humans and Humanoids 2024, Luglio
Anonim
Rover a controllo gestuale che utilizza un accelerometro e una coppia trasmettitore-ricevitore RF
Rover a controllo gestuale che utilizza un accelerometro e una coppia trasmettitore-ricevitore RF

Ehilà, Hai mai desiderato costruire un rover che potresti guidare con semplici gesti delle mani ma non potresti mai trovare il coraggio di avventurarti nella complessità dell'elaborazione delle immagini e interfacciare una webcam con il tuo microcontrollore, per non parlare della battaglia in salita per superare la scarsa portata e la linea di… problemi di vista? Bene, non temere… perché c'è una facile via d'uscita! Ecco, mentre vi presento il potente ACCELEROMETRO! *ba dum tss*

Un accelerometro è un dispositivo davvero interessante che misura l'accelerazione gravitazionale lungo un asse lineare. Rappresenta questo come un livello di tensione che fluttua tra la terra e la tensione di alimentazione, che il nostro microcontrollore legge come un valore analogico. Se applichiamo un po' il nostro cervello (solo un po' di matematica e un po' di fisica newtoniana), non solo possiamo usarlo per misurare il movimento lineare lungo un asse, ma possiamo anche usarlo per determinare l'angolo di inclinazione e percepire le vibrazioni. Non preoccuparti! Non avremo bisogno della matematica o della fisica; avremo solo a che fare con i valori grezzi che l'accelerometro emette. In effetti, in realtà non è necessario preoccuparsi molto dei tecnicismi di un accelerometro per questo progetto. Toccherò solo alcuni dettagli ed elaborerò solo quanto è necessario per capire il quadro generale. Tuttavia, se sei interessato a studiarne la meccanica interna, dai un'occhiata qui.

Devi solo tenerlo a mente per ora: un accelerometro è il gizmo (spesso abbinato a un giroscopio) che apre le porte a tutti quei giochi di sensori di movimento che giochiamo sui nostri smartphone; un gioco di corse automobilistiche, ad esempio, in cui guidiamo il veicolo semplicemente inclinando i nostri dispositivi in entrambe le direzioni. E possiamo imitare proprio questo effetto attaccando un accelerometro (con alcuni ausiliari, ovviamente) su un guanto. Mettiamo semplicemente i nostri guanti magici e incliniamo le mani a sinistra oa destra, avanti o indietro e vediamo i nostri rover ballare sulle nostre melodie. Tutto ciò che dobbiamo fare qui è tradurre le letture dell'accelerometro in segnali digitali che i motori del rover possono interpretare e ideare un meccanismo per trasmettere questi segnali al rover. Per fare ciò, facciamo appello al buon vecchio Arduino e ai suoi aiutanti per l'esperimento di oggi, una coppia trasmettitore-ricevitore RF che opera a 434 MHz, producendo così una portata di circa 100-150 m in spazio aperto, che ci salva anche dalla linea di… problemi di vista

Un bel trucco, eh? Immergiamoci…

Passaggio 1: raccogli le tue provviste

Raccogli i tuoi rifornimenti
Raccogli i tuoi rifornimenti
Raccogli i tuoi rifornimenti
Raccogli i tuoi rifornimenti
Raccogli i tuoi rifornimenti
Raccogli i tuoi rifornimenti
Raccogli i tuoi rifornimenti
Raccogli i tuoi rifornimenti
• Arduino Nano x1
• Accelerometro (ADXL335) x1
• Motore 5V CC + Ruote x2 ciascuno
• Ruota di bovino* x1
• Driver motore L293D + presa IC a 16 pin x1 ciascuno
• Trasmettitore RF a 434 MHz x1
• Ricevitore RF 434 MHz x1
• HT-12E Encoder IC + presa IC a 18 pin x1 ciascuno
• CI decodificatore HT-12D + presa CI a 18 pin x1 ciascuno
• Regolatore di tensione LM7805 x1
• Interruttore a pulsante x2
• LED rosso + resistenza 330O x2 ciascuno
• LED giallo + resistenza 330O x1 ciascuno
• LED verde + resistenza 330O (opzionale) x4 ciascuno
• Resistori 51kO e 1MO x1 ciascuno
• Condensatori Radiali 10µF x2
Batterie, connettori per batterie, cavo USB, cavi jumper, connettori femmina, terminali a vite a 2 pin, PCB, chassis e i soliti accessori per saldatura

Se ti stai chiedendo perché stiamo usando una ruota bovina, il fatto è che i moduli trasmettitore e ricevitore RF hanno solo 4 pin dati, il che significa che possiamo azionare solo 2 motori e quindi l'uso di una ruota bovina per sostenere la struttura. Tuttavia, se ritieni che il tuo rover sembrerebbe un po' più bello con le quattro ruote, non preoccuparti, c'è una soluzione! In questo caso, gratta semplicemente la ruota bovina dall'elenco e aggiungi un'altra coppia di motori da 5 V CC, accompagnati da una ruota ciascuno, e cerca il semplice trucco discusso verso la fine del passaggio 3.

Infine, per i coraggiosi, c'è spazio per un'altra leggera modifica nel design, che implica l'ingegnerizzazione del proprio Arduino. Vai alla sezione bonus nel passaggio successivo e verifica tu stesso. Avrai anche bisogno di alcune forniture extra: un ATmega328P, una presa IC a 28 pin, un oscillatore a cristallo da 16 Mhz, due condensatori in ceramica da 22 pF, un altro regolatore di tensione 7805, altri due condensatori radiali da 10 μF e resistori da 10 kΩ, 680, 330 e sì, meno l'Arduino!

Passaggio 2: collegare il trasmettitore

Collegare il trasmettitore
Collegare il trasmettitore
Collegare il trasmettitore
Collegare il trasmettitore
Collegare il trasmettitore
Collegare il trasmettitore
Collegare il trasmettitore
Collegare il trasmettitore

Suddivideremo il progetto in due componenti: il trasmettitore e i circuiti del ricevitore. Il trasmettitore è costituito da un accelerometro, un Arduino e un modulo trasmettitore RF accoppiato con un IC encoder HT-12E, tutti cablati secondo lo schema allegato.

L'accelerometro, come introdotto in precedenza, serve a riconoscere i nostri gesti delle mani. Useremo un accelerometro a tre assi (fondamentalmente tre accelerometri a un asse in uno) per soddisfare le nostre esigenze. Può essere usato per misurare l'accelerazione in tutte e tre le dimensioni e, come avrai intuito, non fornisce uno, ma un insieme di tre valori analogici relativi ai suoi tre assi (x, yez). In realtà, abbiamo solo bisogno dell'accelerazione lungo gli assi x e y poiché possiamo guidare il rover solo in quattro direzioni: avanti o indietro (cioè lungo l'asse y) e sinistra o destra (cioè lungo l'asse x). Avremmo avuto bisogno dell'asse z se stessimo costruendo un drone, in modo da poterne controllare anche la salita o la discesa tramite i gesti. In ogni caso, questi valori analogici che fornisce l'accelerometro devono essere convertiti in segnali digitali per poter pilotare i motori. A questo provvede l'Arduino che trasmette anche questi segnali, al momento della conversione, al rover tramite il modulo trasmettitore RF.

Il trasmettitore RF ha un solo compito: trasmettere i dati "seriali" disponibili al pin 3 fuori dall'antenna al pin 1. Questo suggerisce l'uso dell'HT-12E, un codificatore di dati parallelo-seriale a 12 bit, che raccoglie fino a 4 bit di dati paralleli dall'Arduino alle linee da AD8 a AD11, consentendo così di fare spazio a fino a 24=16 diverse combinazioni di I/O rispetto al singolo pin di dati sul trasmettitore RF. I restanti 8 bit, prelevati dalle linee da A0 a A7 sull'encoder, costituiscono il byte di indirizzo, che facilita l'abbinamento del trasmettitore RF con un corrispondente ricevitore RF. I 12 bit vengono quindi messi insieme e serializzati e passati al pin dati del trasmettitore RF, che a sua volta, ASK modula i dati su un'onda portante a 434 MHz e li trasmette tramite l'antenna al pin 1.

Concettualmente, qualsiasi ricevitore RF in ascolto a 434 Mhz dovrebbe essere in grado di intercettare, demodulare e decodificare questi dati. Tuttavia, le linee di indirizzo sull'HT-12E e quelle sulla controparte HT-12D (un decodificatore di dati da seriale a parallelo a 12 bit), ci consentono di rendere unica una coppia trasmettitore-ricevitore RF instradando i dati solo al destinatario designato limitando così la comunicazione con tutti gli altri. Tutto ciò che ci viene richiesto è configurare le linee di indirizzo in modo identico su entrambi i fronti. Ad esempio, poiché abbiamo messo a terra tutte le linee di indirizzo per il nostro HT-12E, dobbiamo fare lo stesso per l'HT-12D all'estremità ricevente, altrimenti il rover non sarà in grado di ricevere i segnali. In questo modo, possiamo anche controllare più rover con un singolo circuito trasmettitore configurando in modo identico le linee di indirizzo sull'HT-12D su ciascuno dei ricevitori. Oppure, potremmo indossare due guanti, ciascuno apposto con un circuito trasmettitore contenente una configurazione di linea di indirizzo distinta (diciamo, uno con tutte le linee di indirizzo a terra e l'altro con tutte le linee tenute in alto, o uno con una linea a terra mentre le restanti sette sono tenute alto e l'altro con due linee messe a terra mentre le restanti sei sono tenute alte, o qualsiasi altra combinazione di esse) e ciascuna sterza più rover configurati in modo identico. Suona il maestro in una sinfonia di Android!

Una cosa importante da notare durante l'assemblaggio del circuito è il valore di Rosc. L'HT-12E ha un circuito oscillatore interno tra i pin 15 e 16, che viene abilitato collegando un resistore, chiamato Rosc, tra quei pin. Il valore selezionato per Rosc determina effettivamente la frequenza dell'oscillatore, che può variare a seconda della tensione di alimentazione. La selezione di un valore appropriato per Rosc è fondamentale per il funzionamento dell'HT-12E! Idealmente, la frequenza dell'oscillatore dell'HT-12E dovrebbe essere 1/50 volte quella della controparte dell'HT-12D. Pertanto, poiché stiamo operando a 5V, abbiamo scelto resistori da 1MΩ e 51kΩ come Rosc rispettivamente per i circuiti HT-12E e HT-12D. Se si prevede di far funzionare i circuiti con una tensione di alimentazione diversa, fare riferimento al grafico "Frequenza dell'oscillatore rispetto alla tensione di alimentazione" a pagina 11 della scheda tecnica HT-12E allegata per determinare l'esatta frequenza dell'oscillatore e il resistore da utilizzare.

Inoltre, come nota a margine, utilizzeremo qui le intestazioni femminili (che servono a uno scopo simile alle prese IC) per collegare l'accelerometro, il trasmettitore RF e l'Arduino nel circuito invece di saldarli direttamente sul PCB. L'intenzione è la sistemazione di una piccola riutilizzabilità dei componenti. Dimmi, è passato un po' di tempo da quando hai progettato il tuo rover controllato dai gesti ed è semplicemente seduto lì, mezzo coperto di polvere, in cima alla tua mensola dei trofei e ti imbatti in un altro grande istruttivo che sfrutta l'efficacia di un accelerometro. Allora cosa fai? Lo tiri semplicemente fuori dal tuo rover e lo spingi nel tuo nuovo circuito. Non c'è bisogno di convocare le "Amazzoni" per averne uno nuovo:-p

Bonus: elimina Arduino, eppure no

Nel caso ti sentissi un po' più avventuroso, e soprattutto se pensi che spendere questa meraviglia dal design accattivante (l'Arduino, ovviamente) per un compito così banale come il nostro sia un po' eccessivo, sopportami ancora un po'; e in caso contrario, sentiti libero di passare al passaggio successivo.

Il nostro obiettivo qui è rendere Arduino (il cervello di Arduino, in effetti; sì, sto parlando dell'IC ATmega!) Un membro permanente del team. L'ATmega sarebbe programmato per eseguire solo un singolo schizzo più e più volte in modo che possa fungere da parte perpetua del circuito, proprio come l'HT-12E, un semplice IC, seduto lì, a fare ciò che dovrebbe. Non è così che dovrebbe essere un vero sistema embedded?

Ad ogni modo, per procedere con questo aggiornamento, è sufficiente modificare il circuito come da secondo schema allegato. Qui, sostituiamo semplicemente le intestazioni femminili per l'Arduino con una presa IC per ATmega, aggiungiamo un resistore di pull-up da 10K al pin di ripristino (pin 1) dell'IC e lo pompamo con un orologio esterno tra i pin 9 e 10 Sfortunatamente, se eliminiamo Arduino, lasciamo andare anche i suoi regolatori di tensione incorporati; ergo, dobbiamo replicare anche qui il circuito LM7805 che avevamo impiegato per il ricevitore. Inoltre, utilizziamo anche un divisore di tensione per prelevare i 3,3 V necessari per alimentare l'accelerometro.

Ora, l'unico altro problema qui è programmare l'ATmega per fare il suo lavoro. Dovrai aspettare fino al passaggio 4, però. Quindi, restate sintonizzati…

Passaggio 3: e il ricevitore

E, il ricevitore
E, il ricevitore
E, il ricevitore
E, il ricevitore
E, il ricevitore
E, il ricevitore
E, il ricevitore
E, il ricevitore

Il ricevitore è costituito da un modulo ricevitore RF accoppiato con un IC decodificatore HT-12D e una coppia di motori CC azionati con l'aiuto di un driver motore L293D, tutti cablati secondo lo schema allegato.

L'unico compito del ricevitore RF è demodulare l'onda portante (ricevuta tramite la sua antenna al pin 1) e rendere i dati "seriali" recuperati al pin 7 da dove viene prelevato dall'HT-12D per la deserializzazione. Ora, supponendo che le linee di indirizzo (da A0 a A7) sull'HT-12D siano configurate identiche alla sua controparte HT-12E, i 4 bit di dati paralleli vengono estratti e passati, tramite le linee dati (da D8 a D11) sul HT-12D, al driver del motore, che a sua volta interpreta questi segnali per guidare i motori.

Ancora una volta, presta attenzione al valore di Rosc. Anche l'HT-12D ha un circuito oscillatore interno tra i pin 15 e 16, che viene abilitato collegando un resistore, chiamato Rosc, tra quei pin. Il valore selezionato per Rosc determina effettivamente la frequenza dell'oscillatore, che può variare a seconda della tensione di alimentazione. La selezione di un valore appropriato per Rosc è fondamentale per il funzionamento dell'HT-12D! Idealmente, la frequenza dell'oscillatore dell'HT-12D dovrebbe essere 50 volte quella della controparte dell'HT-12E. Pertanto, poiché stiamo operando a 5V, abbiamo scelto resistori da 1MΩ e 51kΩ come Rosc rispettivamente per i circuiti HT-12E e HT-12D. Se si prevede di far funzionare i circuiti con una tensione di alimentazione diversa, fare riferimento al grafico "Frequenza dell'oscillatore rispetto alla tensione di alimentazione" a pagina 5 della scheda tecnica HT-12D allegata per determinare l'esatta frequenza dell'oscillatore e il resistore da utilizzare.

Inoltre, non dimenticare le intestazioni femminili per il ricevitore RF.

Facoltativamente, un LED può essere collegato tramite un resistore limitatore di corrente da 330 a ciascuno dei 4 pin di dati dell'HT-12D in modo da aiutare a determinare il bit ricevuto su quel pin. Il LED si accende se il bit ricevuto è ALTO (1) e si attenua se il bit ricevuto è BASSO (0). In alternativa, è possibile collegare un singolo LED al pin VT dell'HT-12D (sempre tramite un resistore limitatore di corrente da 330Ω), che si accenderebbe in caso di trasmissione valida.

Ora, se stai cercando l'hack con i motori di cui parlavo nel primo passaggio, è dannatamente facile! Basta collegare i due motori in ogni set in parallelo come mostrato nel secondo schema. Funziona come dovrebbe perché i motori in ogni set (i motori anteriore e posteriore a sinistra e i motori anteriore e posteriore a destra) non vengono mai guidati in direzioni opposte. Cioè, per far girare il rover a destra, i motori anteriore e posteriore a sinistra devono essere entrambi guidati in avanti e i motori anteriore e posteriore a destra devono essere entrambi guidati all'indietro. Allo stesso modo, per far girare il rover a sinistra, i motori anteriore e posteriore di sinistra devono essere entrambi guidati all'indietro e i motori anteriore e posteriore di destra devono essere entrambi guidati in avanti. Pertanto, è sicuro alimentare la stessa coppia di tensioni a entrambi i motori in un set. E il modo per farlo è semplicemente collegare i motori in parallelo.

Passaggio 4: al codice

Al codice
Al codice

C'è solo una cosa da fare per far funzionare il rover. Sì, hai indovinato! (Spero che tu l'abbia fatto) Dobbiamo ancora tradurre le letture dell'accelerometro in una forma che il conducente del motore possa interpretare per essere in grado di guidare i motori. Se stai pensando che, poiché le letture dell'accelerometro sono analogiche e il driver del motore si aspetta segnali digitali, dovremo implementare una sorta di ADC, beh, non tecnicamente, ma è quello che dobbiamo fare. Ed è abbastanza semplice.

Sappiamo che un accelerometro misura l'accelerazione gravitazionale lungo un asse lineare e che questa accelerazione è rappresentata come un livello di tensione fluttuante tra la massa e la tensione di alimentazione, che il nostro microcontrollore legge come un valore analogico variabile tra 0 e 1023. Ma, poiché stiamo facendo funzionare l'accelerometro a 3,3V, è consigliabile impostare il riferimento analogico per l'ADC a 10 bit (che viene integrato nell'ATmeaga a bordo di un Arduino) a 3,3V. Renderà le cose più semplici da capire; anche se, non importerà molto per il nostro piccolo esperimento anche se non l'abbiamo fatto (dovremo solo modificare un po' il codice). Per farlo, tuttavia, colleghiamo semplicemente il pin AREF sull'Arduino (pin 21 sull'ATmega) a 3.3V e denotiamo questo cambiamento nel codice chiamando analogReference(EXTERNAL).

Ora, quando appoggiamo l'accelerometro piatto e analogicoLeggi l'accelerazione lungo gli assi x e y (ricordate? abbiamo solo bisogno di questi due assi), otteniamo un valore di circa 511 (cioè a metà strada tra 0 e 1023), che è solo un modo di dire che c'è 0 accelerazione lungo questi assi. Piuttosto che scavare nei dettagli del fatto, immagina questo come gli assi xey su un grafico, con il valore 511 che denota l'origine e 0 e 1023 i punti finali come illustrato nella figura; orienta l'accelerometro in modo tale che i suoi pin siano rivolti verso il basso e siano tenuti più vicini a te, altrimenti potresti invertire/scambiare gli assi. Ciò significa che, se incliniamo l'accelerometro a destra, dovremmo leggere un valore maggiore di 511 lungo l'asse x, e se incliniamo l'accelerometro a sinistra, dovremmo ottenere un valore inferiore a 511 lungo l'asse x. Allo stesso modo, se incliniamo l'accelerometro in avanti, dovremmo leggere un valore maggiore di 511 lungo l'asse y, e se incliniamo l'accelerometro all'indietro, dovremmo leggere un valore inferiore a 511 lungo l'asse y. Ed è così che deduciamo, in codice, la direzione in cui dovrebbe essere guidato il rover. Ma questo significa anche che dobbiamo mantenere l'accelerometro davvero fermo e allineato parallelamente a una superficie piana per poter leggere un 511 lungo entrambi gli assi per avere il rover ancora parcheggiato. Per facilitare un po' questo compito, definiamo alcune soglie che formano un confine, come mostra la figura, in modo che il rover rimanga fermo finché le letture x e y si trovano entro i limiti e sappiamo per certo che il rover deve essere impostato in movimento una volta superata la soglia.

Ad esempio, se l'asse y legge 543, sappiamo che l'accelerometro è inclinato in avanti, quindi dobbiamo guidare il rover in avanti. Lo facciamo impostando i pin D2 e D4 HIGH e i pin D3 e D5 LOW. Ora, poiché questi pin sono collegati direttamente all'HT-12E, i segnali vengono serializzati ed emessi dal trasmettitore RF solo per essere catturati dal ricevitore RF seduto sul rover, che con l'aiuto dell'HT-12D deserializza i segnali e li trasmette all'L293D, che a sua volta interpreta questi segnali e fa avanzare i motori

Potresti voler cambiare queste soglie, però, per calibrare la sensibilità. Un modo semplice per farlo è semplicemente collegare il tuo accelerometro al tuo Arduino ed eseguire uno schizzo che sputa le letture x e y sul monitor seriale. Ora basta spostare un po' l'accelerometro, dare un'occhiata alle letture e decidere le soglie.

E questo è tutto! Carica il codice sul tuo Arduino e divertiti!! O, forse non così presto:-(Se non hai saltato la sezione bonus, caricare il codice sul tuo ATmega significherebbe un po' più di lavoro. Hai due opzioni:

Opzione A: utilizzare un dispositivo da USB a seriale come la scheda breakout di base FTDI FT232. Basta eseguire i cavi dall'intestazione TTL ai pin corrispondenti sull'ATmega secondo la mappatura seguente:

Spille sulla Breakout Board Pin sul microcontrollore
DTR/GRN RST/Reset (Pin 1) tramite cappuccio 0.1µF
Rx Tx (pin 3)
Tx Rx (pin 2)
Vcc Uscita +5v
CTS (non utilizzato)
Gnd Terreno

Ora, collega un'estremità di un cavo USB alla scheda breakout e l'altra al PC e carica il codice come faresti normalmente: avvia l'IDE Arduino, seleziona una porta seriale appropriata, imposta il tipo di scheda, compila lo schizzo e premi carica.

Opzione B: usa un UNO se ne hai uno in giro da qualche parte. Basta collegare il tuo ATmega all'UNO, caricare il codice come faresti normalmente, estrarre l'IC e reinserirlo nel circuito del trasmettitore. Facile come una torta!

Entrambe queste opzioni dovrebbero funzionare, supponendo che tu sia stato abbastanza intelligente da masterizzare il bootloader prima sul tuo ATmega, o, se fossi ancora più intelligente da acquistare un ATmega con il bootloader già installato in primo luogo. In caso contrario, procedi e fallo seguendo i passaggi descritti qui.

Anddd, abbiamo ufficialmente finito! Spero che ti sia piaciuto questo tutorial bizzarramente lungo. Ora, continua, finisci di costruire il tuo rover se non hai già finito, giocaci per un po' e torna a inondare la sezione commenti in basso con domande e/o critiche costruttive.

Grazie

P. S. Il motivo per cui non ho caricato alcuna foto del progetto finito è, beh, perché non l'ho completato da solo. A metà della sua costruzione, ho pensato ad alcuni miglioramenti, come il controllo della velocità, l'evitamento degli ostacoli e forse un LCD sul rover, che in realtà non è così difficile se usiamo un microcontrollore sia in trasmissione che in ricezione. Ma perché non farlo nel modo più duro?! Quindi, attualmente sto lavorando in quella direzione e pubblicherò un aggiornamento non appena darà i suoi frutti. Tuttavia, ho testato il codice e il design con l'aiuto di un rapido prototipo che ho costruito utilizzando i moduli di uno dei miei progetti precedenti; puoi dare un'occhiata al video qui.

Consigliato: