Inhoudsopgave:

Digitaal kompas en koerszoeker: 6 stappen
Digitaal kompas en koerszoeker: 6 stappen

Video: Digitaal kompas en koerszoeker: 6 stappen

Video: Digitaal kompas en koerszoeker: 6 stappen
Video: Maak een digitaal kompas met je Microbit 2024, November
Anonim
Digitaal kompas en koerszoeker
Digitaal kompas en koerszoeker

Auteurs:

Cullan Whelan

Andrew Luft

Blake Johnson

Dankbetuigingen:

California Maritime Academy

Evan Chang-Siu

Invoering:

De basis van dit project is een digitaal kompas met koersbepaling. Hierdoor kan de gebruiker een koers volgen over lange afstanden met behulp van een digitaal apparaat. In de volksmond is een koers een hoek gemeten met de klok mee vanuit het noorden, die wordt beschouwd als nul graden, zoals aangegeven door het kompas. Het apparaat heeft twee hoofdfuncties: de eerste is het weergeven van de huidige koers van het apparaat op een digitale displayreferentie, en de tweede is de mogelijkheid om een door de gebruiker gevraagde koers in te voeren, die wordt weergegeven op een ring van LED's aan de bovenkant van de kompas behuizing. De gebruiker zou dan de oriëntatie van het apparaat aanpassen aan de verlichte LED. Als de richting van het apparaat wordt gewijzigd, gaat de LED naar de middelste LED, wat aangeeft dat de juiste koers is bepaald.

Benodigdheden:

- DIYmall 6M GPS-module

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

- Adafruit NeoPixel-ring 16

- MakerFocus 4 stuks 3.7V oplaadbare lithiumbatterij

- ELEGOO MEGA 2560 R3-kaart

- Adafruit Mini Lipo met Mini-B USB-aansluiting - USB LiIon/LiPoly-oplader - v1

- 2,8 TFT LCD met Touchscreen Breakout Board met MicroSD-aansluiting

Stap 1: De functionaliteit van het project ontwerpen

De functionaliteit van het project ontwerpen
De functionaliteit van het project ontwerpen

De eerste stap is het begrijpen van de logica en de uiteindelijke operationele functionaliteit. Dit logische diagram toont de drie apparaatstatussen en de twee sensorstatussen.

Staat 1: Laadstatus

De laadstatus wordt gebruikt om de Arduino Mega bij het opstarten gegevens van de twee sensoren terug te laten halen. Het apparaat geeft het laden op het scherm weer, wist alle getalwaarden op het scherm en de LED's op de NeoPixel-ring gaan in een cirkel branden.

Staat 2: Kompasmodus

In deze toestand zal het apparaat werken als een digitaal kompas. De NeoPixel-ring licht op om de richting van het noorden aan te geven ten opzichte van de oriëntatie van het apparaat. De werkelijke richting van het apparaat wordt ook weergegeven op het LCD-scherm, samen met de breedte- en lengtegraad van het apparaat. Het zal ook binnen deze status zijn dat de gebruiker de gebruikerskop kan invoeren die in status 3 moet worden weergegeven.

Staat 3: Modus voor het volgen van koersen

In deze toestand helpt het apparaat de gebruiker nu om zich op de gewenste koers te vestigen. Het apparaat geeft nu de richting van het apparaat en de richting van de gebruiker weer op het LCD-scherm, samen met de lengte- en breedtegraadgegevens. De NeoPixel-ring licht nu op om de richting van de gebruiker aan te geven met betrekking tot de oriëntatie van het apparaat.

Binnen zowel State 2 als State 3 zijn er twee sensorstatussen. Met deze sensorstatussen kan het apparaat gegevens van de sensor halen die de meest nauwkeurige gegevens leveren, afhankelijk van de operationele toestand van het apparaat.

Sensorstatus 1: MPU

Als het apparaat niet beweegt, worden de koersgegevens van de MPU gehaald, omdat dit de meest nauwkeurige gegevens zijn wanneer het apparaat niet beweegt.

Sensorstatus 2: GPS

Als het apparaat beweegt, worden de koersgegevens van de GPS-chip gehaald, omdat dit de meest nauwkeurige gegevens zijn in deze toestand.

Het apparaat kan op elk moment tussen deze naar sensorstatussen schakelen om rekening te houden met de veranderende gebruiksomstandigheden van het apparaat. Dit is belangrijk voor de werking van het apparaat, aangezien beide sensoren die in het apparaat worden gebruikt, omstandigheden hebben die de nauwkeurigheid van de gegevens die ze leveren beïnvloeden. In het geval van de MPU kan de chip gemakkelijk worden beïnvloed door lokale magnetische velden veroorzaakt door auto's en metalen constructiematerialen in gebouwen. Er wordt dus een GPS-chip gebruikt die een veel nauwkeurigere koers kan bieden die niet door dezelfde invloeden wordt beïnvloed. De GPS kan echter alleen koersgegevens verstrekken tijdens het bewegen, aangezien het de koers berekent met behulp van de wijziging in de breedte- en lengtegraadgegevens. Daarom vullen de chips elkaar aan en bieden ze door het gebruik van de twee sensorstatussen de meest nauwkeurige en betrouwbare apparaatfunctionaliteit.

Stap 2: Installatie en bedradingsschema

Opstelling en bedradingsschema
Opstelling en bedradingsschema
Opstelling en bedradingsschema
Opstelling en bedradingsschema
Opstelling en bedradingsschema
Opstelling en bedradingsschema

Het project maakt gebruik van een Arduino Mega-kloonbord vergelijkbaar met het bovenstaande bord. Alle componenten in het project worden op dit bord aangesloten. Hierboven vindt u gedetailleerde diagrammen van het aansluiten van de componenten voor dit project. De knoppen hebben geen gedetailleerd circuit omdat deze op vele manieren kunnen worden ingesteld. In dit project gebruiken ze een 100K pull-down weerstand en een eenvoudige knop om een 3 volt signaal naar de toegewezen pin te sturen.

Stap 3: Componenten en basiscode testen

Het project zal gegevens van zowel de MPU- als de GPS-chip halen, zoals eerder beschreven. Bijgevoegd zijn drie codes die het testen van gegevens van de MPU, GPS en MPU met scherm mogelijk maken om de functionaliteit van de onderdelen te verifiëren. Het is belangrijk om de componenten in deze fase operationeel te krijgen, aangezien de code voor elke chip apart is en eventuele problemen kunnen worden aangepakt zonder angst voor onvoorziene fouten in de uiteindelijke code.

Vereiste bibliotheken:

Adafruit_ILI9341_Albert.h

SPI.h

Adafruit_GFX.h

Adafruit_ILI9341.h

TinyGPS++.h

Adafruit_NeoPixel.h

MPU9250.h

Al deze kunnen worden gevonden door de bovenstaande titels te doorzoeken. Ik zal geen links plaatsen omdat er veel exemplaren van deze bibliotheken zijn uit meerdere bronnen en ik volg de gemeenschapsnorm om alleen naar originelen te linken. Ik zal je deze zelf laten vinden.

Stap 4: MPU-kalibratie

MPU-kalibratie
MPU-kalibratie

De gevonden koers via de MPU in Staat 2 en Staat 3 is opgesplitst in vier kwadranten. Dit was nodig omdat onze kalibratiemethode vereiste het vinden van de minimale en maximale magnitudes van de magnetometer langs de x- en y-assen. Dit werd gedaan door het apparaat willekeurig rond zijn drie assen te draaien, vrij van andere significante elektromagnetische velden dan die van de aarde. Vervolgens namen we de minimum- en maximumwaarden langs de x- en y-as en stopten ze in een schaalvergelijking om de grootheden tussen de waarden van negatief één en één te beperken. In de bovenstaande afbeelding zijn BigX en BigY de maximale waarden van magnetometergegevens langs respectievelijk de x- en y-as, LittleX en LittleY zijn de minimumwaarden van magnetometergegevens langs respectievelijk de x- en y-as, IMU.getMagX_uT() en IMU.getMagY_uT() zijn de waarden die op elk moment langs de x- en y-as van de magnetometer worden gehaald, en Mx en My zijn de nieuwe geschaalde waarden die worden gebruikt om de koers te berekenen.

Stap 5: Definitieve code

Definitieve code
Definitieve code
Definitieve code
Definitieve code
Definitieve code
Definitieve code
Definitieve code
Definitieve code

De laatste stap is het maken van de definitieve code. Ik heb een kopie van de definitieve code van het project bijgevoegd. Binnenin zijn aantekeningen gemaakt om te helpen bij het navigeren door de code. De grootste uitdaging van deze sectie was om de kwadranten correct te laten werken. De implementatie van kwadranten bleek vervelender en logischer te zijn dan we ooit hadden kunnen vermoeden. We hebben aanvankelijk een basis arctan (My/Mx) geïmplementeerd en vervolgens geconverteerd van radialen naar graden, aangezien Arduino standaard radialen uitvoert. Het enige kwadrant waarin dit werkte, was echter van 90 graden tot 180 graden, wat ons een negatieve output opleverde en uiteindelijk Kwadrant III werd. De oplossing hiervoor was het nemen van de absolute waarde, omdat deze nog steeds correct werd verhoogd. Deze waarde werd vervolgens afgetrokken van 360 om de juiste NeoPixel-LED te laten oplichten in status 2 en een vergelijkbare wiskundige bewerking werd gebruikt in status 3 op basis van of de kop groter of kleiner was dan de ingevoerde kop van de gebruiker, die beide te zien zijn in de bovenstaande code. In de bovenstaande afbeeldingen komt Koers overeen met het NeoPixel-lampje dat gaat branden op basis van het verschil tussen de koers van het apparaat en de afwijking van het noorden in het geval van toestand 2, en van die van de koers van de gebruiker. In dit geval komt 90 tot 180 graden overeen met kwadrant III. In beide gevallen zorgt de tft.print ervoor dat het scherm de richting van het apparaat vanuit het noorden leest.

Voor de andere drie kwadranten leidde de implementatie van arctan (My/Mx) tot een inversie van de incrementatie terwijl het apparaat werd geroteerd, d.w.z. de koershoek zou aftellen wanneer deze zou moeten optellen en vice versa. De oplossing voor dit probleem was om de arctangens om te draaien in de vorm van arctan (Mx/My). Hoewel dit de incrementatie-inversie oploste, gaf het niet de juiste richting van het apparaat, en dat is waar de kwadranten in het spel kwamen. De eenvoudige oplossing hiervoor was om een verschuiving toe te voegen op basis van het bijbehorende kwadrant. Dit is te zien in de volgende figuren, die wederom stukjes code zijn uit staten 2 en 3 van elk kwadrant.

De eerste if-instructie wordt uitgevoerd als de door de MPU-vergelijking berekende kop groter is dan de kop van de gebruiker. Onder deze voorwaarde wordt de ingevoerde kop van de gebruiker toegevoegd aan de kop van het apparaat en wordt de corresponderende waarde afgetrokken van 360. Als de else-opdracht wordt uitgevoerd, wordt de MPU-kopvergelijking afgetrokken van de ingevoerde kop van de gebruiker. Deze voorwaarden zijn geïmplementeerd om niet alleen een nauwkeurige waarde voor de NeoPixel te krijgen, maar ook om te voorkomen dat een waarde buiten het acceptabele bereik ligt, namelijk van 0 tot 359 graden.

Aanbevolen: