Cuprins:

Busolă digitală și Căutare de antet: 6 pași
Busolă digitală și Căutare de antet: 6 pași

Video: Busolă digitală și Căutare de antet: 6 pași

Video: Busolă digitală și Căutare de antet: 6 pași
Video: Video in diretta del venerdí pomeriggio! Cresciamo tutti insieme su YouTube! @SanTenChan 2024, Iulie
Anonim
Busolă digitală și Căutare de antet
Busolă digitală și Căutare de antet

Autori:

Cullan Whelan

Andrew Luft

Blake Johnson

Mulțumiri:

California Maritime Academy

Evan Chang-Siu

Introducere:

Baza acestui proiect este o busolă digitală cu urmărirea titlurilor. Acest lucru permite utilizatorului să urmeze o direcție pe distanțe mari folosind un aparat digital. În mod colocvial, un titlu este un unghi măsurat în sensul acelor de ceasornic de la nord, care este considerat zero grade, așa cum este indicat de busolă. Dispozitivul are două funcții principale: prima este afișarea antetului curent al dispozitivului pe o referință de afișaj digital, iar a doua este capacitatea de a introduce un antet solicitat de utilizator, care va fi afișat pe un inel de LED-uri din partea de sus a carcasa busolei. Utilizatorul va regla apoi orientarea dispozitivului legată de LED-ul luminat. Pe măsură ce direcția dispozitivului este schimbată, LED-ul se va deplasa către LED-ul central, indicând astfel că a fost stabilită poziția corectă.

Provizii:

- Modul GPS DIYmall 6M

- HiLetgo MPU9250 / 6500 9-Axis 9 DOF 16 Bit

- Adafruit NeoPixel Ring 16

- Baterie reîncărcabilă litiu MakerFocus 4buc 3.7V

- Placă ELEGOO MEGA 2560 R3

- Adafruit Mini Lipo cu mufa USB Mini-B - Încărcător USB LiIon / LiPoly - v1

- LCD TFT de 2,8 cu placă cu ecran tactil cu soclu MicroSD

Pasul 1: Proiectarea funcționalității proiectului

Proiectarea funcționalității proiectului
Proiectarea funcționalității proiectului

Primul pas este înțelegerea logicii și funcționalității operaționale finale. Această diagramă logică descrie cele trei stări ale dispozitivului și cele două stări ale senzorului.

Statul 1: Statul de încărcare

Starea de încărcare este utilizată pentru a permite Arduino Mega să recupereze date de la cei doi senzori la pornire. Dispozitivul va afișa încărcarea pe ecran, va șterge toate valorile numerice de pe ecran, iar LED-urile de pe inelul NeoPixel se vor aprinde în cerc.

Starea 2: Mod busolă

În această stare dispozitivul va acționa ca o busolă digitală. Inelul NeoPixel se va aprinde pentru a indica direcția spre nord în raport cu orientarea dispozitivului. Adevăratul titlu al dispozitivului va fi afișat, de asemenea, pe ecranul LCD, împreună cu latitudinea și longitudinea dispozitivului. De asemenea, în această stare, utilizatorul va putea introduce titlul utilizatorului care va fi afișat în starea 3.

Starea 3: Mod de urmărire a antetului

În această stare, dispozitivul va ajuta acum utilizatorul să se stabilească pe poziția dorită. Dispozitivul va afișa acum direcția dispozitivelor și utilizatorii care se îndreaptă pe ecranul LCD, împreună cu datele de latitudine și longitudine. Inelul NeoPixel se va aprinde acum pentru a indica utilizatorii care se îndreaptă cu privire la orientarea dispozitivelor.

Atât în starea 2, cât și în starea 3, există două stări ale senzorului, aceste stări ale senzorului permit dispozitivului să extragă date de la senzor, care furnizează cele mai precise date, în funcție de starea operațională a dispozitivului.

Starea senzorului 1: MPU

Dacă dispozitivul nu se deplasează, datele antetului vor fi extrase din MPU, deoarece sunt cele mai exacte date atunci când dispozitivul nu se mișcă.

Starea senzorului 2: GPS

Dacă dispozitivul este în mișcare, datele antetului vor fi extrase de pe cipul GPS, deoarece acestea sunt cele mai precise date în această stare.

Dispozitivul poate comuta între acestea la stările senzorului în orice moment pentru a ține cont de condițiile de utilizare ale schimbării unității. Acest lucru este important pentru funcționarea dispozitivului, deoarece ambii senzori utilizați în dispozitiv au condiții care afectează acuratețea datelor pe care le furnizează. În cazul MPU, cipul poate fi ușor influențat de câmpurile magnetice locale cauzate de mașini și materiale de construcții metalice din clădiri. Astfel se folosește un cip GPS care poate oferi un titlu mult mai precis care nu este afectat de aceleași influențe. Cu toate acestea, GPS-ul poate furniza date de direcție numai atunci când se deplasează, deoarece calculează direcția utilizând modificarea datelor de latitudine și longitudine. Prin urmare, cipurile se completează reciproc și prin utilizarea celor două stări ale senzorilor oferă cea mai precisă și mai fiabilă funcționalitate a dispozitivului.

Pasul 2: Configurare și diagramă de fir

Configurare și diagramă de sârmă
Configurare și diagramă de sârmă
Configurare și diagramă de sârmă
Configurare și diagramă de sârmă
Configurare și diagramă de sârmă
Configurare și diagramă de sârmă

Proiectul utilizează o placă de clonare Arduino Mega similară cu placa de mai sus. Toate componentele din proiect vor fi conectate la această placă. Mai sus sunt diagrame detaliate despre modul de conectare a componentelor pentru acest proiect. Butoanele nu au un circuit detaliat, deoarece acestea pot fi configurate în mai multe moduri. În acest proiect, ei folosesc un rezistor de tracțiune de 100K și un buton simplu pentru a trimite un semnal de 3 volți pinului atribuit.

Pasul 3: Testarea componentelor și a codului de bază

Proiectul va extrage date atât de pe MPU, cât și de pe cipul GPS așa cum s-a descris anterior. Sunt atașate trei coduri care permit testarea datelor de pe MPU, GPS și MPU cu ecran pentru a verifica funcționalitatea pieselor. Este important să puneți componentele în funcțiune în această etapă, deoarece codul este separat pentru fiecare cip și orice problemă poate fi soluționată fără teama de a provoca erori neprevăzute în codul final.

Biblioteci obligatorii:

Adafruit_ILI9341_Albert.h

SPI.h

Adafruit_GFX.h

Adafruit_ILI9341.h

TinyGPS ++. H

Adafruit_NeoPixel.h

MPU9250.h

Toate acestea pot fi găsite căutând în titlurile de mai sus. Nu voi posta linkuri, deoarece există multe copii ale acestor biblioteci din mai multe surse și aderând la standardul comunitar de legare numai la originale, vă voi lăsa să le găsiți singuri.

Pasul 4: Calibrarea MPU

Calibrarea MPU
Calibrarea MPU

Titlul găsit prin MPU în statul 2 și statul 3 a fost împărțit în patru cadrane. Acest lucru a fost necesar, deoarece metoda noastră de calibrare a necesitat găsirea mărimilor minime și maxime din magnetometru de-a lungul axelor sale x și y. Acest lucru s-a făcut prin rotirea dispozitivului în mod aleatoriu în jurul celor trei axe ale acestuia, liber de orice câmp electromagnetic semnificativ, altul decât cel al Pământului. Am luat apoi valorile minime și maxime de-a lungul axelor x și y și le-am conectat la o ecuație de scalare pentru a restrânge magnitudinile dintre valorile unu și unul negativ. În figura de mai sus, BigX și BigY sunt valorile maxime ale datelor magnetometrice de-a lungul axelor x și respectiv axa Y, LittleX și LittleY sunt valorile minime ale datelor magnetometrului de-a lungul axelor x și respectiv axa y, IMU.getMagX_uT () și IMU.getMagY_uT () sunt valorile extrase din magnetometru în orice moment de-a lungul axelor x și respectiv axa y, iar Mx și My sunt noile valori scalate utilizate pentru a calcula titlul.

Pasul 5: Cod final

Cod final
Cod final
Cod final
Cod final
Cod final
Cod final
Cod final
Cod final

Ultimul pas este crearea codului final. Am atașat o copie a codului final al proiectelor. În cadrul notelor au fost făcute pentru a ajuta la navigarea codului. Cea mai mare provocare a acestei secțiuni a fost de a face cadranele să funcționeze corect. Implementarea cadranelor s-a dovedit a fi mai plictisitoare și mai sfidătoare a logicii decât am fi putut anticipa vreodată. Am implementat inițial un arctan de bază (My / Mx) și apoi am convertit din radiani în grade, deoarece Arduino produce în radiani în mod implicit. Cu toate acestea, singurul cadran în care a funcționat a fost de la 90 de grade la 180 de grade, ceea ce ne-a dat o ieșire negativă și a ajuns să fie Cadrantul III. Soluția la acest lucru a fost luarea valorii absolute, deoarece încă a crescut corect. Această valoare a fost apoi scăzută din 360 pentru a aprinde LED-ul NeoPixel corect în starea 2 și o operație matematică similară a fost utilizată în starea 3 bazată pe dacă titlul a fost mai mare sau mai mic decât titlul de intrare al utilizatorului, ambele putând fi văzute în deasupra codului. În figurile de mai sus, Heading corespunde luminii NeoPixel care va fi aprinsă pe baza diferenței dintre poziția dispozitivului și abaterea de la nord în cazul stării 2 și de la cea a poziției utilizatorului. În acest caz, 90 până la 180 de grade corespund Cuadrantului III. În ambele cazuri, tft.print face ca ecranul să citească dispozitivul care se îndreaptă din nord.

Pentru celelalte trei cadrane, implementarea arctanului (My / Mx) a dus la o inversare a creșterii pe măsură ce dispozitivul a fost rotit, adică unghiul de direcție ar număra în jos când ar trebui să numere în sus și invers. Soluția la această problemă a fost de a întoarce arctangentul la forma de arctan (Mx / My). În timp ce acest lucru a rezolvat inversarea incrementării, nu a dat direcția corectă a dispozitivului, care este locul în care cadranele au intrat în joc. Soluția simplă la acest lucru a fost adăugarea unei schimbări bazate pe cadranul corespunzător. Acest lucru poate fi văzut în figurile următoare, care sunt din nou bucăți de cod din statele 2 și 3 ale fiecărui cadran.

Prima declarație if se efectuează dacă titlul calculat de ecuația MPU este mai mare decât titlul utilizatorului. În această condiție, antetul de intrare al utilizatorului este adăugat la antetul dispozitivului și valoarea corespunzătoare este scăzută din 360. Dacă se execută instrucțiunea else, ecuația de antet MPU este scăzută din antetul de intrare al utilizatorului. Aceste condiții au fost implementate pentru a obține nu numai o valoare exactă pentru NeoPixel, ci pentru a evita obținerea unei valori în afara intervalului acceptabil, care este de la 0 la 359 grade.

Recomandat: