Innholdsfortegnelse:

Digitalt kompass og Heading Finder: 6 trinn
Digitalt kompass og Heading Finder: 6 trinn

Video: Digitalt kompass og Heading Finder: 6 trinn

Video: Digitalt kompass og Heading Finder: 6 trinn
Video: Digital Compass 2024, November
Anonim
Digitalt kompass og Heading Finder
Digitalt kompass og Heading Finder

Forfattere:

Cullan Whelan

Andrew Luft

Blake Johnson

Bekreftelser:

California Maritime Academy

Evan Chang-Siu

Introduksjon:

Grunnlaget for dette prosjektet er et digitalt kompass med overskriftssporing. Dette gjør at brukeren kan følge en overskrift over lange avstander ved hjelp av et digitalt apparat. Til daglig er en kurs en vinkel målt med klokken fra nord, som regnes som null grader, som angitt av kompasset. Enheten har to hovedfunksjoner: den første viser den nåværende overskriften til enheten på en digital skjermreferanse, og den andre er muligheten til å angi en brukerforespurt overskrift, som vil vises på en ring med LED -er øverst på kompasshus. Brukeren ville deretter justere enhetens orientering relatert til den opplyste LED -en. Etter hvert som apparatets retning endres, vil lysdioden bevege seg til senterlampen, og dermed indikere at riktig retning er etablert.

Rekvisita:

- DIYmall 6M GPS -modul

- HiLetgo MPU9250/6500 9-akse 9 DOF 16 bits

- Adafruit NeoPixel Ring 16

- MakerFocus 4 stk 3.7V litium oppladbart batteri

- ELEGOO MEGA 2560 R3 brett

- Adafruit Mini Lipo m/Mini -B USB -kontakt - USB LiIon/LiPoly lader - v1

- 2,8 TFT LCD -skjerm med berøringsskjerm med MicroSD -kontakt

Trinn 1: Utforming av prosjektets funksjonalitet

Design av prosjektets funksjonalitet
Design av prosjektets funksjonalitet

Det første trinnet er å forstå logikken og den endelige operasjonelle funksjonaliteten. Dette logiske diagrammet viser de tre enhetstilstandene og de to sensortilstandene.

Stat 1: Lastestat

Lastestatusen brukes til å la Arduino Mega få data tilbake fra de to sensorene ved oppstart. Enheten vil vise belastning på skjermen, slette alle tallverdiene på skjermen, og lysdiodene på NeoPixel -ringen lyser i en sirkel.

Tilstand 2: Kompassmodus

I denne tilstanden vil enheten fungere som et digitalt kompass. NeoPixel -ringen lyser for å indikere nordretningen med hensyn til orienteringen til enheten. Den sanne enhetsoverskriften vil også vises på LCD -skjermen sammen med enhetens breddegrad og lengdegrad. Det vil også være innenfor denne tilstanden at brukeren vil kunne angi brukeroverskriften som skal vises i tilstand 3.

Stat 3: Overskriftssporingsmodus

I denne tilstanden vil enheten nå hjelpe brukeren med å etablere seg på ønsket kurs. Enheten vil nå vise enhetens retning og brukerens kurs på LCD -skjermen sammen med dataene for breddegrad og lengdegrad. NeoPixel -ringen lyser nå for å indikere brukerens kurs med hensyn til enhetsretning.

Innenfor både tilstand 2 og tilstand 3 er det to sensortilstander, disse sensortilstandene lar enheten trekke data fra sensoren som gir de mest nøyaktige dataene, avhengig av enhetens driftstilstand.

Sensortilstand 1: MPU

Hvis enheten ikke beveger seg, vil kursdata bli trukket fra MPU -en, ettersom det er de mest nøyaktige dataene når enheten ikke beveger seg.

Sensortilstand 2: GPS

Hvis enheten beveger seg, vil kursdataene bli trukket fra GPS -brikken, ettersom det er de mest nøyaktige dataene i denne tilstanden.

Enheten kan når som helst veksle mellom disse til sensortilstander for å ta hensyn til bruksforholdene til enheten endres. Dette er viktig for driften av enheten ettersom begge de to sensorene som brukes i enheten har forhold som påvirker nøyaktigheten av dataene de gir. Når det gjelder MPU, kan brikken lett påvirkes av lokale magnetiske felt forårsaket av biler og metallkonstruksjonsmaterialer i bygninger. Dermed brukes en GPS -brikke som kan gi en mye mer nøyaktig kurs som ikke påvirkes av de samme påvirkningene. GPS -en kan imidlertid bare gi kursdata når du beveger deg, ettersom den beregner kursen ved å endre bredde- og lengdegraddata. Derfor utfyller sjetongene hverandre og gir de mest nøyaktige og pålitelige enhetsfunksjonalitetene ved bruk av de to sensortilstandene.

Trinn 2: Oppsett og ledningsdiagram

Oppsett og ledningsdiagram
Oppsett og ledningsdiagram
Oppsett og ledningsdiagram
Oppsett og ledningsdiagram
Oppsett og ledningsdiagram
Oppsett og ledningsdiagram

Prosjektet bruker og Arduino Mega klonebrett som ligner på brettet ovenfor. Alle komponenter i prosjektet vil bli koblet til dette kortet. Over er detaljerte diagrammer over hvordan du kobler til komponentene for dette prosjektet. Knappene har ikke en detaljert krets, da disse kan settes opp på mange måter. I dette prosjektet bruker de en 100K nedtrekksmotstand og en enkel knapp for å sende et 3 volt signal til den tildelte pinnen.

Trinn 3: Testing av komponenter og grunnleggende kode

Prosjektet vil hente data fra både MPU og GPS -brikken som beskrevet tidligere. Vedlagt er tre koder som muliggjør testing av data fra MPU, GPS og MPU med skjerm for å verifisere funksjonaliteten til delene. Det er viktig å få komponentene i drift på dette stadiet, da koden er separat for hver brikke, og eventuelle problemer kan løses uten frykt for å forårsake uforutsette feil i den endelige koden.

Nødvendige biblioteker:

Adafruit_ILI9341_Albert.h

SPI.h

Adafruit_GFX.h

Adafruit_ILI9341.h

TinyGPS ++. H

Adafruit_NeoPixel.h

MPU9250.h

Alle disse finner du ved å søke i titlene ovenfor. Jeg kommer ikke til å legge ut koblinger, siden det er mange kopier av disse bibliotekene fra flere kilder, og i henhold til fellesskapsstandarden for bare å koble til originaler, lar jeg deg finne disse selv.

Trinn 4: MPU -kalibrering

MPU -kalibrering
MPU -kalibrering

Overskriften som ble funnet via MPU i stat 2 og stat 3 ble delt opp i fire kvadranter. Dette var nødvendig fordi vår kalibreringsmetode krevde å finne minimum og maksimum størrelser fra magnetometeret langs x- og y -aksene. Dette ble gjort ved å rotere enheten tilfeldig rundt sine tre akser, fri for betydelige andre elektromagnetiske felt enn jordens. Vi tok deretter minimums- og maksimumsverdiene langs x- og y -aksen og koblet dem til en skaleringsligning for å begrense størrelsene mellom verdiene til den negative en og en. I figuren ovenfor er BigX og BigY maksimalverdiene for magnetometerdata langs henholdsvis x- og y-aksen, LittleX og LittleY er minimumsverdiene for magnetometerdata langs henholdsvis x- og y-aksen, IMU.getMagX_uT () og IMU.getMagY_uT () er verdiene som trekkes fra magnetometeret når som helst langs henholdsvis x- og y-aksen, og Mx og My er de nye skalerte verdiene som brukes til å beregne kursen.

Trinn 5: Sluttkode

Endelig kode
Endelig kode
Endelig kode
Endelig kode
Endelig kode
Endelig kode
Endelig kode
Endelig kode

Det siste trinnet er å lage den endelige koden. Jeg har lagt ved en kopi av prosjektets endelige kode. Det er gjort notater for å hjelpe deg med å navigere i koden. Den største utfordringen med denne delen var å få kvadranter til å fungere riktig. Implementeringen av kvadranter viste seg å være mer kjedelig og logisk-trossende enn vi noen gang kunne ha forutsett. Vi implementerte først en grunnleggende arctan (My/Mx) og konverterte deretter fra radianer til grader, siden Arduino -utganger i radianer som standard. Den eneste kvadranten dette fungerte i var imidlertid fra 90 grader til 180 grader, noe som ga oss en negativ effekt og endte med å bli Quadrant III. Løsningen på dette var å ta den absolutte verdien, siden den fortsatt steget riktig. Denne verdien ble deretter trukket fra 360 for å lyse opp den riktige NeoPixel LED i tilstand 2, og en lignende matematisk operasjon ble brukt i tilstand 3 basert på om overskriften var større eller mindre enn brukerens inngangsoverskrift, som begge kan sees i ovenfor kode. I figurene ovenfor tilsvarer Heading NeoPixel -lyset som vil lyse opp basert på forskjellen mellom enhetsoverskriften og avviket fra nord i tilfelle av tilstand 2, og fra brukerens overskrift. I dette tilfellet tilsvarer 90 til 180 grader kvadrant III. I begge tilfeller får tft.print skjermen til å lese enheten på vei nordfra.

For de tre andre kvadranter førte implementering av arctan (My/Mx) til en inversjon av inkrementering ettersom enheten ble rotert, dvs. at kursvinkelen ville telle ned når den skulle telle opp og omvendt. Løsningen på dette problemet var å snu arctangenten til formen av arctan (Mx/My). Selv om dette løste inkrementeringsinversjonen, ga det ikke den riktige enhetsoverskriften, det var her kvadrantene spilte inn. Den enkle løsningen på dette var å legge til et skift basert på den tilsvarende kvadranten. Dette kan sees i de følgende figurene, som igjen er kodebiter fra del 2 og 3 i hver kvadrant.

Den første if -setningen utføres hvis overskriften beregnet av MPU -ligningen er større enn brukeroverskriften. Under denne betingelsen legges brukerens inndatakurs til enhetsoverskriften og den tilsvarende verdien trekkes fra 360. Hvis ellers -setningen blir utført, trekkes MPU -overskriftsligningen fra brukerens inndatakurs. Disse betingelsene ble implementert for ikke bare å få en nøyaktig verdi for NeoPixel, men for å unngå å oppnå en verdi utenfor det akseptable området, som er fra 0 til 359 grader.

Anbefalt: