Cuprins:

Rover controlat prin gesturi folosind un accelerometru și o pereche de emițătoare-receptoare RF: 4 pași
Rover controlat prin gesturi folosind un accelerometru și o pereche de emițătoare-receptoare RF: 4 pași

Video: Rover controlat prin gesturi folosind un accelerometru și o pereche de emițătoare-receptoare RF: 4 pași

Video: Rover controlat prin gesturi folosind un accelerometru și o pereche de emițătoare-receptoare RF: 4 pași
Video: Land Rover Range Rover P400, 2022 - Enciclopedia Britanică 2024, Iulie
Anonim
Rover controlat prin gesturi folosind un accelerometru și o pereche de emițătoare-receptoare RF
Rover controlat prin gesturi folosind un accelerometru și o pereche de emițătoare-receptoare RF

Buna, Ați dorit vreodată să construiți un rover pe care să îl puteți direcționa prin simple gesturi de mână, dar care nu ar putea niciodată să-și adune curajul de a vă aventura în complexitatea procesării imaginilor și a interfața o cameră web cu microcontrolerul dvs., ca să nu mai vorbim de bătălia ascendentă pentru a depăși raza de acțiune și linia de … probleme de vedere? Ei bine, nu vă temeți … pentru că există o cale de ieșire ușoară! Iată, în timp ce vă prezint puternicul ACCELEROMETRU! * ba dum tsss *

Un accelerometru este un dispozitiv foarte cool care măsoară accelerația gravitațională de-a lungul unei axe liniare. Reprezintă acest lucru ca un nivel de tensiune care fluctuează între sol și tensiunea de alimentare, pe care microcontrolerul nostru o citește ca valoare analogică. Dacă ne aplicăm puțin creierul (doar puțină matematică și ceva fizică newtoniană), nu numai că îl putem folosi pentru a măsura mișcarea liniară de-a lungul unei axe, dar îl putem folosi și pentru a determina unghiul de înclinare și vibrațiile de simț. Nu vă supărați! Nu vom avea nevoie de matematică sau fizică; vom avea de-a face doar cu valori brute pe care accelerometrul le scuipă. De fapt, nu trebuie să vă preocupați prea mult în ceea ce privește tehnicitățile unui accelerometru pentru acest proiect. Voi purta doar câteva detalii și voi elabora doar atât cât aveți nevoie pentru a înțelege imaginea de ansamblu. Deși, dacă sunteți interesat să studiați mecanica sa interioară, aruncați o privire aici.

Trebuie doar să țineți cont de acest lucru deocamdată: un accelerometru este dispozitivul (adesea cuplat cu un giroscop) care deschide ușile tuturor acelor jocuri cu senzori de mișcare pe care le jucăm pe smartphone-urile noastre; un joc de curse de mașini, de exemplu, unde conducem vehiculul prin simpla înclinare a dispozitivelor în ambele direcții. Și putem imita chiar acest efect prin lipirea unui accelerometru (cu câțiva auxiliari, desigur) pe o mănușă. Ne-am pus mănușile magice și ne înclinăm mâinile la stânga sau la dreapta, înainte sau înapoi și ne vedem roverii dansând pe melodiile noastre. Tot ce trebuie să facem aici este să traducem citirile accelerometrului în semnale digitale pe care motoarele de pe rover le pot interpreta și concepe un mecanism pentru a transmite aceste semnale către rover. Pentru a realiza acest lucru, apelăm la bunul Arduino și ajutoarele sale pentru experimentul de astăzi, o pereche transmițător-receptor RF care funcționează la 434 MHz, oferind astfel o rază de acțiune de aproximativ 100-150m în spațiu deschis, ceea ce ne salvează și de linia de probleme de vedere.

Un hack destul de ingenios, nu? Hai să ne scufundăm …

Pasul 1: Strângeți-vă consumabilele

Strângeți-vă consumabilele
Strângeți-vă consumabilele
Strângeți-vă consumabilele
Strângeți-vă consumabilele
Strângeți-vă consumabilele
Strângeți-vă consumabilele
Strângeți-vă consumabilele
Strângeți-vă consumabilele
• Arduino Nano x1
• Accelerometru (ADXL335) x1
• Motor 5V DC + roți x2 fiecare
• Roată bovină * x1
• Driver motor L293D + soclu IC cu 16 pini x1 fiecare
• Transmițător RF de 434 MHz x1
• Receptor RF de 434 MHz x1
• Codificator HT-12E IC + soclu IC cu 18 pini x1 fiecare
• Decodor IC HT-12D + soclu IC cu 18 pini x1 fiecare
• Regulator de tensiune LM7805 x1
• Apasă întrerupătorul x2
• LED roșu + rezistor 330O x2 fiecare
• LED galben + rezistor 330O x1 fiecare
• LED verde + rezistor 330O (opțional) x4 fiecare
• Rezistențe de 51kO și 1MO x1 fiecare
• Condensatori radiali 10µF x2
Baterii, conectori de baterii, cablu USB, fire jumper, anteturi femele, terminale cu șurub cu 2 pini, PCB, Chasis și accesoriile obișnuite de lipit

Dacă vă întrebați de ce folosim o roată bovină, chestia este că modulele transmițătorului și receptorului RF au doar 4 pini de date, ceea ce înseamnă că putem conduce doar 2 motoare și, prin urmare, utilizarea unei roți bovine pentru susține structura. Cu toate acestea, dacă simțiți că rover-ul dvs. ar arăta ceva mai tare cu patru roți, nu vă faceți griji, există o lucrare în jur! În acest caz, trebuie doar să zgâriați roata bovină de pe listă și să adăugați o altă pereche de motoare de 5V DC, însoțite de câte o roată și căutați hack-ul simplu discutat spre sfârșitul pasului 3.

În cele din urmă, pentru cei cu inima curajoasă, există posibilitatea unei alte ușoare modificări a designului, care implică un fel de proiectare a propriului Arduino. Mergeți la secțiunea bonus în pasul următor și vedeți singur. De asemenea, veți avea nevoie de câteva consumabile suplimentare: un ATmega328P, o priză IC de 28 pini, un oscilator de cristal de 16 MHz, două capace ceramice de 22pF, un alt regulator de tensiune 7805, încă două capace radiale de 10μF și rezistențe de 10kΩ, 680Ω, 330Ω și da, minus Arduino!

Pasul 2: conectați transmițătorul

Conectați emițătorul
Conectați emițătorul
Conectați emițătorul
Conectați emițătorul
Conectați emițătorul
Conectați emițătorul
Conectați emițătorul
Conectați emițătorul

Vom împărți proiectul în doi constituenți: emițătorul și circuitele receptorului. Transmițătorul constă dintr-un accelerometru, un Arduino și un modul transmițător RF cuplat cu un codificator HT-12E IC, toate conectate conform schemei atașate.

Accelerometrul, așa cum a fost introdus mai devreme, servește la recunoașterea gesturilor noastre de mână. Vom folosi un accelerometru cu trei axe (practic trei accelerometre cu o singură axă într-unul) pentru a ne satisface nevoile. Poate fi folosit pentru a măsura accelerația în toate cele trei dimensiuni și, după cum ați fi ghicit, produce nu una, ci un set de trei valori analogice în raport cu cele trei axe ale sale (x, y și z). De fapt, avem nevoie doar de accelerație de-a lungul axelor x și y, deoarece putem conduce rover-ul doar în patru direcții: în direcție inversă sau înapoi (adică de-a lungul axei y) și stânga sau dreapta (adică de-a lungul axei x). Am fi avut nevoie de axa z dacă construim o dronă, astfel încât să putem controla ascensiunea sau coborârea ei prin intermediul gesturilor. În orice caz, aceste valori analogice pe care le produce accelerometrul trebuie convertite în semnale digitale pentru a putea conduce motoarele. Acest lucru este îngrijit de Arduino, care transmite și aceste semnale, la conversie, către rover prin modulul transmițător RF.

Transmițătorul RF are o singură sarcină: să transmită datele „seriale” disponibile la pinul 3 din antena de la pinul 1. Aceasta susține utilizarea HT-12E, un codificator de date paralel cu serial pe 12 biți, care colectează până la 4 biți de date paralele de la Arduino la liniile AD8 până la AD11, permițându-ne astfel să facem loc până la 24 = 16 combinații diferite I / O, spre deosebire de pinul de date unic de pe transmițătorul RF. Restul de 8 biți, trase de pe liniile A0 până la A7 de pe codificator, constituie octetul de adresă, care facilitează asocierea transmițătorului RF cu un receptor RF corespunzător. Cei 12 biți sunt apoi uniți și serializați și transferați la pinul de date al transmițătorului RF, care la rândul său, ASK-modulează datele pe o undă purtătoare de 434 MHz și le trage prin antenă la pinul 1.

Conceptual, orice receptor RF care ascultă la 434Mhz ar trebui să poată intercepta, demodula și decoda aceste date. Cu toate acestea, liniile de adresă de pe HT-12E și cele de pe omologul HT-12D (un decodor de date de serie pe paralel de 12 biți), ne permit să redăm o pereche transmițător-receptor RF unică prin direcționarea datelor doar către receptorul destinat limitând astfel comunicarea cu toți ceilalți. Tot ce ne este necesar este să configurăm liniile de adresă identice pe ambele fronturi. De exemplu, din moment ce am legat toate liniile de adresă pentru HT-12E, trebuie să facem același lucru pentru HT-12D la capătul de recepție sau altfel roverul nu va putea primi semnalele. În acest fel, putem controla, de asemenea, mai multe rover-uri cu un singur circuit transmițător prin configurarea identică a liniilor de adresă de pe HT-12D la fiecare dintre receptoare. Sau am putea pune două mănuși, fiecare fixată cu un circuit transmițător care conține o configurație distinctă a liniei de adresă (de exemplu, una cu toate liniile de adresare împământate și cealaltă cu toate ținute sus, sau una cu o linie împământată în timp ce restul de șapte sunt ținute înalt și celălalt cu două linii împământate în timp ce restul de șase fiind ținut sus, sau orice altă combinație a acestora) și fiecare direcționând mai multe rover-uri configurate identic. Joacă maestrul la o simfonie Android!

Un lucru important de remarcat în timpul asamblării circuitului este valoarea lui Rosc. HT-12E are un circuit oscilator intern între pinii 15 și 16, care este activat prin conectarea unui rezistor, numit Rosc, între acei pini. Valoarea selectată pentru Rosc determină de fapt frecvența oscilatorului, care poate varia în funcție de tensiunea de alimentare. Selectarea unei valori adecvate pentru Rosc este crucială pentru funcționarea HT-12E! În mod ideal, frecvența oscilatorului HT-12E ar trebui să fie de 1/50 ori mai mare decât cea a omologului HT-12D. Prin urmare, din moment ce funcționăm pe 5V, am ales rezistențe 1MΩ și 51kΩ ca Rosc pentru circuitele HT-12E și respectiv HT-12D. Dacă intenționați să operați circuitele pe o tensiune de alimentare diferită, consultați graficul „Frecvența oscilatorului vs tensiunea de alimentare” la pagina 11 din foaia tehnică atașată HT-12E pentru a determina frecvența și rezistorul oscilatorului exact care trebuie utilizate.

De asemenea, ca o notă laterală, vom folosi aici anteturi de sex feminin (care au un scop similar cu prize IC) pentru a conecta accelerometrul, transmițătorul RF și Arduino în circuit în loc să le lipim direct pe PCB. Intenția este acomodarea unei mici reutilizări componente. Spune, a trecut ceva timp de când ți-ai proiectat rover-ul controlat de gesturi și doar așezat acolo, pe jumătate acoperit de praf, deasupra raftului trofeului și te dai peste un alt instrument instructiv care valorifică eficacitatea unui accelerometru. Deci ce faci? Pur și simplu îl scoateți din rover și îl împingeți în noul dvs. circuit. Nu este nevoie să convoai „Amazoanele” pentru a-ți face unul nou:-p

Bonus: Înlăturați Arduino și totuși nu

Doar în cazul în care vă simțiți puțin mai aventuros și mai ales dacă credeți că cheltuirea acestei minuni frumos proiectate (Arduino, bineînțeles) pentru o sarcină atât de banală ca a noastră este un pic excesivă, purtați-mă puțin mai mult; și dacă nu, nu ezitați să treceți la pasul următor.

Scopul nostru aici este să facem din Arduino (creierul lui Arduino, de fapt; da, vorbesc despre ATmega IC!) Un membru permanent al echipei. ATmega ar fi programat să ruleze doar o singură schiță de mai multe ori, astfel încât să poată servi ca o parte perpetuă a circuitului, la fel ca HT-12E-un simplu IC, doar așezat acolo, făcând ceea ce ar trebui. Nu așa ar trebui să fie vreun sistem încorporat real?

Oricum, pentru a continua cu această actualizare, trebuie doar să modificați circuitul conform celei de-a doua scheme atașate. Aici, înlocuim pur și simplu antetele feminine pentru Arduino cu o priză IC pentru ATmega, adăugăm un rezistor de tracțiune de 10K la pinul de resetare (pinul 1) al IC-ului și îl pompăm cu un ceas extern între pinii 9 și 10 Din păcate, dacă eliminăm Arduino, vom renunța și la regulatoarele de tensiune încorporate; ergo, trebuie să reproducem și circuitul LM7805 pe care l-am folosit pentru receptor. În plus, folosim și un divizor de tensiune pentru a trage 3,3V necesari pentru alimentarea accelerometrului.

Acum, singura altă captură aici este programarea ATmega pentru a-și face treaba. Totuși, va trebui să îl așteptați până la pasul 4. Deci, stați la curent …

Pasul 3: Și receptorul

Și, receptorul
Și, receptorul
Și, receptorul
Și, receptorul
Și, receptorul
Și, receptorul
Și, receptorul
Și, receptorul

Receptorul este format dintr-un modul receptor RF cuplat cu un decodor IC HT-12D și o pereche de motoare de curent continuu acționate cu ajutorul unui driver de motor L293D, toate conectate conform schemei atașate.

Singura sarcină a receptorului RF este de a demodula unda purtătoare (primită prin antena sa la pinul 1) și de a reda datele „seriale” recuperate la pinul 7 de unde este preluată de HT-12D pentru deserializare. Acum, presupunând că liniile de adresă (A0 până la A7) de pe HT-12D sunt configurate identic cu omologul său HT-12E, cei 4 biți paraleli de date sunt extrase și transmise, prin liniile de date (D8 până la D11) de pe HT-12D, către driverul motorului, care la rândul său interpretează aceste semnale pentru a acționa motoarele.

Din nou, acordați atenție valorii Rosc. HT-12D are, de asemenea, un circuit oscilator intern între pinii 15 și 16, care este activat prin conectarea unui rezistor, numit Rosc, între acei pini. Valoarea selectată pentru Rosc determină de fapt frecvența oscilatorului, care poate varia în funcție de tensiunea de alimentare. Selectarea unei valori adecvate pentru Rosc este crucială pentru funcționarea HT-12D! În mod ideal, frecvența oscilatorului HT-12D ar trebui să fie de 50 de ori mai mare decât cea a omologului HT-12E. Prin urmare, din moment ce funcționăm pe 5V, am ales rezistențe 1MΩ și 51kΩ ca Rosc pentru circuitele HT-12E și respectiv HT-12D. Dacă intenționați să operați circuitele cu o tensiune de alimentare diferită, consultați graficul „Frecvența oscilatorului vs tensiunea de alimentare” la pagina 5 din foaia tehnică atașată HT-12D pentru a determina frecvența și rezistorul oscilatorului exact care trebuie utilizate.

De asemenea, nu uitați antetele feminine ale receptorului RF.

Opțional, un LED poate fi conectat printr-un rezistor de limitare a curentului de 330Ω la fiecare dintre cei 4 pini de date ai HT-12D, astfel încât să ajute la determinarea bitului primit la acel pin. LED-ul se va aprinde dacă bitul primit este HIGH (1) și se va estompa dacă bitul primit este LOW (0). Alternativ, un singur LED ar putea fi legat de pinul VT al HT-12D (din nou, printr-un rezistor de limitare a curentului de 330Ω), care s-ar aprinde în cazul unei transmisii valide.

Acum, dacă sunteți în căutarea unui hack cu motoarele despre care vorbeam la primul pas, este al naibii de ușor! Doar conectați cele două motoare din fiecare set în paralel, așa cum se arată în a doua schemă. Acest lucru funcționează așa cum se presupune, deoarece motoarele din fiecare set (motoarele din față și din spate pe stânga și motoarele din față și din spate pe dreapta) nu sunt acționate niciodată în direcții opuse. Adică, pentru a roti rover-ul spre dreapta, motoarele din față și spate din stânga trebuie ambele să fie conduse înainte, iar motoarele din față și din spate din dreapta trebuie să fie conduse înapoi. În mod similar, pentru ca roverul să se întoarcă la stânga, motoarele din față și din spate din stânga trebuie să fie acționate în spate, iar motoarele din față și din spate din dreapta trebuie să fie conduse în față. Prin urmare, este sigur să alimentați în aceeași pereche de tensiuni ambele motoare dintr-un set. Și calea de urmat este prin simpla conectare a motoarelor în paralel.

Pasul 4: Accesați codul

La Cod
La Cod

Mai rămâne un singur lucru de făcut pentru ca roverul să funcționeze. Da, ai ghicit bine! (Sper că ați făcut-o) Trebuie să traducem citirile accelerometrului într-o formă pe care conducătorul motorului o poate interpreta pentru a putea conduce motoarele. Dacă vă gândiți că, deoarece citirile accelerometrului sunt analogice și conducătorul motorului așteaptă semnale digitale, va trebui să implementăm un fel de ADC, nu, din punct de vedere tehnic, dar asta trebuie să facem. Și este destul de simplu.

Știm că un accelerometru măsoară accelerația gravitațională de-a lungul unei axe liniare și că această accelerație este reprezentată ca un nivel de tensiune care fluctuează între sol și tensiunea de alimentare, pe care microcontrolerul nostru o citește ca o valoare analogică variind între 0 și 1023. Dar, din moment ce noi Funcționăm accelerometrul la 3,3 V, este recomandabil să setăm referința analogică pentru ADC pe 10 biți (care vine integrat în ATmeaga la bordul unui Arduino) la 3,3 V. Va face lucrurile mai ușor de înțeles; deși, nu va conta prea mult pentru micul nostru experiment, chiar dacă nu am făcut-o (va trebui doar să modificăm puțin codul). Pentru a face acest lucru, cu toate acestea, conectăm pur și simplu pinul AREF de pe Arduino (pinul 21 de pe ATmega) la 3,3V și denotăm această schimbare de cod apelând analogReference (EXTERNAL).

Acum, când așezăm accelerometrul plat și analog Citiți accelerația de-a lungul axelor x și y (vă amintiți? Avem nevoie doar de aceste două axe), obținem o valoare de aproximativ 511 (adică la jumătatea drumului între 0 și 1023), care este doar un mod de a spune că există 0 accelerație de-a lungul acestor axe. În loc să căutați în detaliile faptului, imaginați-vă doar ca axele x și y pe un grafic, valoarea 511 denotând originea și 0 și 1023 punctele finale așa cum sunt descrise în figură; orientați accelerometrul în așa fel încât pinii săi să fie îndreptați în jos și să fie ținuți mai aproape de dvs., altfel puteți inversa / schimba axele. Aceasta înseamnă că, dacă înclinăm accelerometrul spre dreapta, ar trebui să citim o valoare mai mare de 511 de-a lungul axei x și, dacă înclinăm accelerometrul spre stânga, ar trebui să obținem o valoare mai mică de 511 de-a lungul axei x. În mod similar, dacă înclinăm accelerometrul înainte, ar trebui să citim o valoare mai mare de 511 de-a lungul axei y și, dacă înclinăm accelerometrul înapoi, ar trebui să citim o valoare mai mică de 511 de-a lungul axei y. Și așa deducem, în cod, direcția în care ar trebui să fie condus rover-ul. Dar asta înseamnă, de asemenea, că trebuie să menținem accelerometrul cu adevărat constant și aliniat paralel cu o suprafață plană pentru a putea citi un 511 de-a lungul ambelor axe. pentru ca roverul să parcheze încă. Pentru a ușura puțin această sarcină, definim anumite praguri care formează o graniță, așa cum se arată în figură, astfel încât roverul să rămână staționar atâta timp cât citirile x și y se află în limite și știm cu siguranță că roverul trebuie să fie setat în mișcare odată ce pragul este depășit.

De exemplu, dacă axa y citește 543, știm că accelerometrul este înclinat înainte, trebuie să conducem roverul înainte. Facem acest lucru setând pinii D2 și D4 HIGH și pinii D3 și D5 LOW. Acum, deoarece acești pini sunt conectați direct la HT-12E, semnalele sunt serializate și declanșate de transmițătorul RF doar pentru a fi prins de receptorul RF așezat pe rover, care cu ajutorul HT-12D deserializează semnalele și le transmite L293D, care la rândul său interpretează aceste semnale și conduce motoarele înainte

S-ar putea să doriți să modificați aceste praguri, totuși, pentru a calibra sensibilitatea. O modalitate ușoară de a face acest lucru este să conectați pur și simplu accelerometrul la Arduino și să rulați o schiță care să scuipe citirile x și y pe monitorul serial. Acum, mișcați puțin accelerometrul, aruncați o privire prin citiri și decideți pragurile.

Si asta e! Încărcați codul pe Arduino și bucurați-vă !! Sau, poate nu atât de curând:-(Dacă nu ați omis secțiunea bonus, încărcarea codului în ATmega ar însemna un pic mai mult de lucru. Aveți două opțiuni:

Opțiunea A: Utilizați un dispozitiv USB către serie, cum ar fi placa de bază FTDI FT232. Pur și simplu rulați fire de la antetul TTL la pinii corespunzători de pe ATmega conform mapării de mai jos:

Știfturi de pe panoul Breakout Pinii de pe microcontroler
DTR / GRN RST / Reset (Pin 1) prin capacul de 0,1µF
Rx Tx (Pin 3)
Tx Rx (Pin 2)
Vcc + 5V de ieșire
CTS (nefolosit)
Gnd Sol

Acum, conectați un capăt al unui cablu USB la placa de ieșire și celălalt la computer și încărcați codul așa cum ați face în mod normal: lansați ID-ul Arduino, selectați un port serial adecvat, setați tipul plăcii, compilați schița și apăsați încărcare.

Opțiunea B: folosiți un UNO dacă aveți unul undeva. Conectați ATmega la UNO, încărcați codul așa cum ați face în mod normal, scoateți IC-ul și împingeți-l înapoi în circuitul emițătorului. La fel de ușor ca plăcinta!

Oricare dintre aceste opțiuni ar trebui să funcționeze, presupunând că ați fost suficient de inteligent pentru a arde bootloader-ul înainte de mână pe ATmega sau, dacă ați fost chiar mai inteligent să cumpărați un ATmega cu bootloader-ul deja instalat. Dacă nu, continuați și faceți acest lucru urmând pașii descriși aici.

Și, am terminat oficial! Sper că ți-a plăcut acest lucru extraordinar de instructiv. Acum, continuați, terminați-vă construirea rover-ului dacă nu ați terminat deja, jucați-vă o vreme și reveniți pentru a inunda secțiunea de comentarii de mai jos cu întrebări și / sau critici constructive.

Mulțumiri

P. S. Motivul pentru care nu am încărcat nicio fotografie a proiectului finalizat este, bine, pentru că nu l-am finalizat singur. La jumătatea construcției, m-am gândit la unele augmentări, cum ar fi controlul vitezei, evitarea obstacolelor și poate un LCD pe rover, ceea ce de fapt nu este atât de dificil dacă folosim un microcontroler atât pe capetele de transmisie, cât și pe cele de recepție. Dar, de ce nu o faci în mod greu ?! Deci, în prezent lucrez în această direcție și voi posta o actualizare de îndată ce va da roade. Cu toate acestea, am testat codul și designul cu ajutorul unui prototip rapid pe care l-am construit folosind module dintr-unul din proiectele mele anterioare; puteți arunca o privire la videoclip aici.

Recomandat: