Cuprins:

☠WEEDINATOR☠ Partea 2: Navigare prin satelit: 7 pași (cu imagini)
☠WEEDINATOR☠ Partea 2: Navigare prin satelit: 7 pași (cu imagini)

Video: ☠WEEDINATOR☠ Partea 2: Navigare prin satelit: 7 pași (cu imagini)

Video: ☠WEEDINATOR☠ Partea 2: Navigare prin satelit: 7 pași (cu imagini)
Video: Голубая стрела (1958) фильм 2024, Iulie
Anonim
☠WEEDINATOR☠ Partea 2: Navigare prin satelit
☠WEEDINATOR☠ Partea 2: Navigare prin satelit
☠WEEDINATOR☠ Partea 2: Navigare prin satelit
☠WEEDINATOR☠ Partea 2: Navigare prin satelit
☠WEEDINATOR☠ Partea 2: Navigare prin satelit
☠WEEDINATOR☠ Partea 2: Navigare prin satelit
☠WEEDINATOR☠ Partea 2: Navigare prin satelit
☠WEEDINATOR☠ Partea 2: Navigare prin satelit

Se naște sistemul de navigație Weedinator!

Un robot agricol care poate fi controlat de un telefon inteligent.

… Și, mai degrabă decât să trec prin procesul regulat al modului în care este pus la punct, m-am gândit să încerc să explic cum funcționează de fapt - evident nu TOTUL, ci cele mai importante și interesante biți. Vă rog să scuzați jocul de cuvinte, dar modul în care fluxurile de date între modulele individuale mi se pare interesant și defalcat în cel mai mic numitor ajungem cu „biți” reali - zerouri și unii. Dacă ați fost vreodată confuz cu privire la biți, octeți, caractere și șiruri, atunci poate fi momentul să deveniți neconfuzat? De asemenea, voi încerca să desconfund un concept ușor abstract numit „Anulare erori”.

Sistemul în sine are:

  • GPS / GNSS: Ublox C94 M8M (Rover și bază)
  • 9DOF Razor IMU MO busolă digitală
  • Fona 800H 2G GPRS celular
  • Ecran TFT de 2.2"
  • Arduino Due „Master”
  • Diverse „Sclavi” Arduino.

În mod ciudat, o mulțime de navigatoare satelitare nu au o busolă digitală, ceea ce înseamnă că, dacă ești staționar și pierdut, trebuie să mergi sau să conduci în orice direcție aleatorie înainte ca dispozitivul să îți arate direcția corectă de la sateliți. Dacă te pierzi într-o junglă groasă sau într-o parcare subterană, ești umplut!

Pasul 1: Cum funcționează

Cum functioneaza
Cum functioneaza

În prezent, o pereche simplă de coordonate este încărcată de pe un telefon inteligent sau computer, care sunt apoi descărcate de Weedinator. Acestea sunt apoi interpretate într-un titlu în grade și o distanță de parcurs în mm.

Fona GPRS este utilizată pentru a accesa o bază de date online prin intermediul rețelei celulare 2G și pentru a primi și transmite coordonatele către Arduino Due printr-un Arduino Nano. Due este Master și controlează o serie de alte Arduino ca sclavi prin I2C și autobuze seriale. The Due poate interacționa cu datele live de la Ublox și Razor și poate afișa un titlu calculat de unul dintre sclavii Arduino.

Trackerul de satelit Ublox este deosebit de inteligent, deoarece folosește anularea erorilor pentru a obține remedieri foarte precise - o abatere totală nominală finală de aproximativ 40 mm. Modulul este compus dintr-o pereche identică, dintre care una, „roverul”, se deplasează cu Weedinator, iar cealaltă, „baza” este fixată pe un stâlp undeva în aer liber. Anularea erorilor se realizează prin faptul că baza poate realiza o soluție cu adevărat precisă utilizând o cantitate mare de eșantioane în timp. Aceste probe sunt apoi calculate pentru a compensa schimbarea condițiilor atmosferice. Dacă dispozitivul ar fi în mișcare, evident că nu ar putea obține nicio medie și ar fi la mila completă a unui mediu în schimbare. Cu toate acestea, dacă un dispozitiv static și în mișcare funcționează împreună, atâta timp cât pot comunica între ele, pot beneficia de ambele. În orice moment, unitatea de bază are încă o eroare, dar are și o corecție super precisă calculată anterior, astfel încât să poată calcula eroarea reală scăzând un set de coordonate din altul. Apoi trimite eroarea calculată către rover printr-o legătură radio, care apoi adaugă eroarea pe propriile sale coordonate și hei presto, avem erori de anulare! În termeni practici, anularea erorii face diferența între 3 metri și abaterea totală de 40 mm.

Sistemul complet pare complicat, dar este de fapt destul de ușor de construit, fie slăbit pe o suprafață neconductivă, fie folosind PCB-ul pe care l-am proiectat, ceea ce permite ca toate modulele să fie fixate în siguranță. Dezvoltarea viitoare este construită pe PCB, permițând încorporarea unei game largi de Arduinos pentru a controla motoarele de direcție, mișcarea înainte și o mașină CNC la bord. Navigarea va fi, de asemenea, asistată de cel puțin un sistem de recunoaștere a obiectelor care utilizează camere pentru a detecta obiecte colorate, de exemplu mingi de golf fluorescente, care sunt poziționate cu atenție într-un fel de grilă - Urmăriți acest spațiu!

Pasul 2: Componente

Componente
Componente
Componente
Componente
Componente
Componente
  • Ublox C94 M8M (Rover și bază) x 2 din
  • 9DOF Razor IMU MO busolă digitală
  • Fona 800H 2G GPRS celular 1946
  • Arduino Due
  • Arduino Nano x 2 din
  • SparkFun Pro Micro
  • Adafruit 2.2 "TFT IL1940C 1480
  • PCB (vezi fișierele Gerber atașate) x 2 din
  • 1206 rezistențe SMD zero ohm x 12 din
  • 1206 LED-uri x 24 din

Fișierul PCB se deschide cu software-ul „Design Spark”.

Pasul 3: Cablarea modulelor

Cablarea modulelor
Cablarea modulelor

Aceasta este partea ușoară - în special ușoară cu PCB pe care am făcut-o - trebuie doar să urmați diagrama de mai sus. Este necesară grijă pentru a evita cablarea modulelor 3v la 5v, chiar și pe liniile seriale și I2C.

Pasul 4: Cod

Cod
Cod

Cea mai mare parte a codului este preocupată de obținerea de date în mișcare în sistem în mod ordonat și destul de des este necesară conversia formatelor de date de la numere întregi la flotante în șiruri și în caractere, ceea ce poate fi foarte confuz! Protocolul „Serial” va gestiona numai caractere și în timp ce I2Protocolul C se va ocupa de numere întregi foarte mici, am găsit mai bine să le convertesc în caractere și apoi să le convertesc înapoi la numere întregi la celălalt capăt al liniei de transmisie.

Controlerul Weedinator este practic un sistem pe 8 biți cu o mulțime de Arduino-uri individuale sau „MCU-uri”. Când 8 biți sunt descriși ca zerouri binare reale și unele, poate arăta astfel: B01100101 care ar fi egal:

(1x2) + (0x2)2+ (1x2)3+ (0x2)4+ (0x2)5+ (1x2)6+ (1x2)7+ (0x2)8 =

Valoare cifră zecimală 128 64 32 16 8 4 2 1
Valoarea cifrei binare 0 1 1 0 0 1 0 1

= 101

Iar valoarea maximă posibilă este 255…. Deci „octetul” întreg întreg îl putem transmite peste I2C este 255, ceea ce este foarte limitativ!

Pe un Arduino putem transmite până la 32 de caractere ASCII, sau octeți, simultan folosind I2C, care este mult mai util, iar setul de caractere include numere, litere și caractere de control în format de 7 biți, după cum urmează:

Imagine
Imagine

Din fericire, compilatorul Arduino face toată munca de conversie de la caracter la binar în fundal, dar așteaptă totuși tipul corect de caracter pentru transmiterea datelor și nu va accepta „Șiruri”.

Acum este momentul în care lucrurile pot deveni confuze. Caracterele pot fi exprimate ca caractere unice folosind definiția char sau ca o matrice unidimensională de 20 de caractere folosind char [20]. Un șir Arduino este foarte asemănător cu o matrice de caractere și este literalmente un șir de caractere interpretate adesea de creierul uman ca „cuvinte”.

// Construiește caracterul „distanceCharacter”:

Inițiator de șir = ""; șir de distanță = inițiator + șir de distanță; int n = distanceString.length (); for (int aa = 0; aa <= n; aa ++) {distanceCharacter [aa] = distanceString [aa]; }

Codul de mai sus poate converti un șir lung de caractere într-o matrice de caractere de caractere care pot fi apoi transmise prin I2C sau serial.

La celălalt capăt al liniei de transmisie, datele pot fi convertite înapoi într-un șir folosind următorul cod:

distanțăString = distanțăString + c; // șir = șir + caracter

O matrice de caractere nu poate fi convertită direct într-un număr întreg și trebuie să meargă mai întâi în formatul șirului, dar următorul cod se va converti dintr-un șir într-un număr întreg:

int result = (distanceString).toInt ();

int distanceMetres = rezultat;

Acum avem un număr întreg pe care îl putem folosi pentru a face calcule. Flotantele (numere cu punct zecimal) trebuie convertite în numere întregi în etapa de transmisie și apoi împărțite la 100 pentru două zecimale, de exemplu:

float distanceMetres = distanceMm / 1000;

În cele din urmă, un șir poate fi creat dintr-un amestec de caractere și numere întregi, de exemplu:

// Aici datele sunt compilate într-un caracter:

dataString = inițiator + "BEAR" + zbearing + "DIST" + zdistance; // Limitat la 32 de caractere // Șir = șir + caractere + intereger + caractere + întreg.

Restul codului este standard Arduino, care poate fi găsit în diferitele exemple din bibliotecile Arduino. Consultați exemplul „exemple >>>> Șiruri” și exemplele de bibliotecă „fir”.

Iată întregul proces de transmitere și primire a unui float:

Convertiți Float ➜ Număr întreg ➜ Șir ➜ Matrice de caractere … apoi TRANSMITEȚI matrice de caractere de la Master ➜➜

➜➜ PRIMĂ personaje individuale pe Slave…. apoi convertiți Caracterul ➜ Șirul ➜ Întregul ➜ Float

Pasul 5: Baza de date și pagina web

Baza de date și pagina web
Baza de date și pagina web
Baza de date și pagina web
Baza de date și pagina web

Mai sus este afișată structura bazei de date și fișierele de cod php și html sunt atașate. Numele de utilizator, numele bazelor de date, numele tabelelor și parolele sunt blocate pentru siguranță.

Pasul 6: Teste de navigare

Teste de navigare
Teste de navigare
Teste de navigare
Teste de navigare
Teste de navigație
Teste de navigație

Am reușit să conectez un datalogger la placa de control Weedinator prin I2C și să îmi fac o idee despre performanța de poziționare prin satelit Ublox M8M:

Pe „Pornire la rece”, arătat de graficul verde, modulul a început cu multe erori, destul de asemănător cu un GPS „normal” și treptat eroarea s-a redus până când, după aproximativ 2 ore, a obținut o remediere RTK între rover și baza (prezentată ca cruce roșie). În acea perioadă de 2 ore, modulul de bază construiește și actualizează continuu o valoare medie pentru latitudine și longitudine și după ce intervalul de timp preprogramat decide că are o soluție bună. Următoarele 2 grafice arată comportamentul după un „Pornire la cald” 'unde modulul de bază a calculat deja o medie bună. Graficul de sus este pe o perioadă de 200 de minute și, ocazional, remedierea se pierde, iar rover-ul trimite un mesaj NMEA către Weedinator că soluția a devenit temporar nesigură.

Graficul albastru inferior este un „zoom in” pe caseta roșie din graficul de sus și arată o imagine reprezentativă bună a performanței Ublox, cu o abatere totală de 40 mm, care este mai mult decât suficientă pentru a-l ghida pe Weedinator către locația sa, dar nu este suficient de bun pentru a cultiva solul în jurul plantelor individuale?

Al treilea grafic prezintă datele colectate cu Rover și Base la 100 de metri distanță - Nu a fost detectată nicio eroare suplimentară - distanța de separare nu a făcut nicio diferență în ceea ce privește precizia.

Pasul 7: Final

Recomandat: