Sommario:

Bussola digitale e cercatore di rotta: 6 passaggi
Bussola digitale e cercatore di rotta: 6 passaggi

Video: Bussola digitale e cercatore di rotta: 6 passaggi

Video: Bussola digitale e cercatore di rotta: 6 passaggi
Video: Questa purtroppo è Milano....😔 #ruzzaorologi #orologio #rapina 2024, Dicembre
Anonim
Bussola digitale e cercatore di direzione
Bussola digitale e cercatore di direzione

Autori:

Cullan Whelan

Andrew Luft

Blake Johnson

Ringraziamenti:

Accademia marittima della California

Evan Chang-Siu

Introduzione:

La base di questo progetto è una bussola digitale con tracciamento della rotta. Ciò consente all'utente di seguire una rotta su lunghe distanze utilizzando un apparato digitale. Colloquialmente una direzione è un angolo misurato in senso orario dal nord, che è considerato come zero gradi, come indicato dalla bussola. Il dispositivo ha due funzioni principali: la prima è visualizzare la rotta corrente del dispositivo su un riferimento del display digitale, e la seconda è la possibilità di inserire una rotta richiesta dall'utente, che verrà visualizzata su un anello di LED nella parte superiore del alloggiamento della bussola. L'utente dovrebbe quindi regolare l'orientamento del dispositivo relativo al LED illuminato. Quando viene cambiata la direzione del dispositivo, il LED si sposterà sul LED centrale, indicando così che è stata stabilita la rotta corretta.

Forniture:

- Modulo GPS DIYmall 6M

- HiLetgo MPU9250/6500 9 assi 9 DOF 16 bit

- Anello Adafruit NeoPixel 16

- Batteria ricaricabile al litio MakerFocus 4 pezzi da 3,7 V

- Scheda ELEGOO MEGA 2560 R3

- Adafruit Mini Lipo con jack USB Mini-B - Caricabatterie USB LiIon/LiPoly - v1

- LCD TFT da 2,8 con scheda breakout touchscreen con presa MicroSD

Passaggio 1: progettare la funzionalità del progetto

Progettare la funzionalità del progetto
Progettare la funzionalità del progetto

Il primo passo è comprendere la logica e la funzionalità operativa finale. Questo diagramma logico rappresenta i tre stati del dispositivo e i due stati del sensore.

Stato 1: Stato di caricamento

Lo stato di caricamento viene utilizzato per consentire ad Arduino Mega di recuperare i dati dai due sensori all'avvio. Il dispositivo visualizzerà il caricamento sullo schermo, cancellerà tutti i valori numerici sullo schermo e i LED sull'anello NeoPixel si illumineranno in un cerchio.

Stato 2: Modalità bussola

In questo stato il dispositivo agirà come una bussola digitale. L'anello NeoPixel si accenderà per indicare la direzione del Nord rispetto all'orientamento del dispositivo. La vera intestazione del dispositivo verrà visualizzata anche sullo schermo LCD insieme alla latitudine e alla longitudine del dispositivo. Sarà anche all'interno di questo stato che l'utente potrà inserire l'intestazione dell'utente da visualizzare nello Stato 3.

Stato 3: Modalità di monitoraggio della rotta

In questo stato il dispositivo ora aiuterà l'utente a stabilirsi sulla rotta desiderata. Il dispositivo ora visualizzerà la direzione del dispositivo e la direzione dell'utente sullo schermo LCD insieme ai dati di latitudine e longitudine. L'anello NeoPixel ora si illuminerà per indicare la direzione degli utenti rispetto all'orientamento dei dispositivi.

Sia nello Stato 2 che nello Stato 3 ci sono due stati del sensore, questi stati del sensore consentono al dispositivo di estrarre i dati dal sensore che fornisce i dati più accurati a seconda delle condizioni operative del dispositivo.

Stato del sensore 1: MPU

Se il dispositivo non si muove, i dati di prua verranno estratti dall'MPU poiché sono i dati più accurati quando il dispositivo non si muove.

Stato del sensore 2: GPS

Se il dispositivo si sta muovendo, i dati di prua verranno estratti dal chip GPS in quanto sono i dati più accurati in questa condizione.

Il dispositivo può passare tra questi e gli stati del sensore in qualsiasi momento per tenere conto del cambiamento delle condizioni di utilizzo dell'unità. Questo è importante per il funzionamento del dispositivo poiché entrambi i due sensori utilizzati nel dispositivo presentano condizioni che influiscono sull'accuratezza dei dati forniti. Nel caso dell'MPU il chip può essere facilmente influenzato da campi magnetici locali causati da automobili e materiali da costruzione metallici negli edifici. Quindi viene utilizzato un chip GPS in grado di fornire una rotta molto più accurata che non è influenzata dalle stesse influenze. Tuttavia, il GPS può fornire solo dati di prua durante lo spostamento poiché calcola la prua utilizzando la variazione dei dati di latitudine e longitudine. Pertanto i chip si completano a vicenda e utilizzando i due stati del sensore forniscono la funzionalità del dispositivo più accurata e affidabile.

Passaggio 2: configurazione e schema elettrico

Configurazione e schema elettrico
Configurazione e schema elettrico
Configurazione e schema elettrico
Configurazione e schema elettrico
Configurazione e schema elettrico
Configurazione e schema elettrico

Il progetto utilizza una scheda clone Arduino Mega simile alla scheda sopra. Tutti i componenti del progetto saranno collegati a questa scheda. Sopra ci sono diagrammi dettagliati su come cablare i componenti per questo progetto. I pulsanti non hanno un circuito dettagliato in quanto possono essere impostati in molti modi. In questo progetto usano un resistore pull down da 100K e un semplice pulsante per inviare un segnale a 3 volt al pin assegnato.

Passaggio 3: test dei componenti e del codice di base

Il progetto estrarrà i dati sia dall'MPU che dal chip GPS come descritto in precedenza. In allegato sono tre codici che consentono di testare i dati da MPU, GPS e MPU con schermo per verificare la funzionalità delle parti. È importante rendere operativi i componenti in questa fase poiché il codice è separato per ogni chip e qualsiasi problema può essere risolto senza timore di causare errori imprevisti nel codice finale.

Librerie richieste:

Adafruit_ILI9341_Albert.h

SPI.h

Adafruit_GFX.h

Adafruit_ILI9341.h

TinyGPS++.h

Adafruit_NeoPixel.h

MPU9250.h

Tutti questi possono essere trovati cercando i titoli sopra. Non pubblicherò collegamenti poiché ci sono molte copie di queste librerie da più fonti e aderendo allo standard della comunità di collegare solo gli originali ti lascerò trovare da solo.

Passaggio 4: calibrazione MPU

Calibrazione MPU
Calibrazione MPU

L'intestazione trovata tramite l'MPU nello Stato 2 e nello Stato 3 è stata suddivisa in quattro quadranti. Ciò era necessario perché il nostro metodo di calibrazione richiedeva di trovare le grandezze minima e massima dal magnetometro lungo i suoi assi x e y. Ciò è stato fatto ruotando il dispositivo in modo casuale attorno ai suoi tre assi, libero da qualsiasi campo elettromagnetico significativo diverso da quello della Terra. Abbiamo quindi preso i valori minimo e massimo lungo l'asse xey e li abbiamo inseriti in un'equazione di scala per restringere le grandezze tra i valori di uno negativo e uno. Nella figura sopra, BigX e BigY sono i valori massimi dei dati del magnetometro rispettivamente lungo l'asse x e y, LittleX e LittleY sono i valori minimi dei dati del magnetometro rispettivamente lungo l'asse x e y, IMU.getMagX_uT() e IMU.getMagY_uT() sono i valori estratti dal magnetometro in qualsiasi momento rispettivamente lungo l'asse x e y, e Mx e My sono i nuovi valori in scala utilizzati per calcolare la direzione.

Passaggio 5: codice finale

Codice finale
Codice finale
Codice finale
Codice finale
Codice finale
Codice finale
Codice finale
Codice finale

Il passaggio finale consiste nel creare il codice finale. Ho allegato una copia del codice finale dei progetti. All'interno sono state fatte note per aiutare a navigare nel codice. La sfida più grande di questa sezione è stata far funzionare correttamente i quadranti. L'implementazione dei quadranti si è rivelata più noiosa e sfidante la logica di quanto avremmo mai potuto prevedere. Inizialmente abbiamo implementato un arctan di base (My/Mx) e quindi convertito da radianti in gradi, poiché Arduino emette in radianti per impostazione predefinita. Tuttavia, l'unico quadrante in cui ha funzionato è stato da 90 gradi a 180 gradi, il che ci ha dato un output negativo e ha finito per essere il quadrante III. La soluzione a questo stava prendendo il valore assoluto, poiché è ancora incrementato correttamente. Questo valore è stato quindi sottratto da 360 per accendere il LED NeoPixel corretto nello stato 2 e un'operazione matematica simile è stata utilizzata nello stato 3 in base al fatto che l'intestazione fosse più grande o più piccola dell'intestazione immessa dall'utente, entrambe le cose possono essere viste nel codice sopra. Nelle figure sopra, Rotta corrisponde alla spia NeoPixel che si accenderà in base alla differenza tra la rotta del dispositivo e la deviazione dal nord nel caso dello stato 2, e da quella della rotta dell'utente. In questo caso, da 90 a 180 gradi corrisponde al quadrante III. In entrambi i casi, il tft.print fa sì che lo schermo legga il dispositivo in direzione nord.

Per gli altri tre quadranti, l'implementazione di arctan (My/Mx) ha portato a un'inversione dell'incremento quando il dispositivo veniva ruotato, ovvero l'angolo di prua avrebbe effettuato il conto alla rovescia quando avrebbe dovuto contare verso l'alto e viceversa. La soluzione a questo problema era capovolgere l'arcotangente nella forma di arctan (Mx/My). Sebbene questo risolvesse l'inversione dell'incremento, non forniva l'intestazione del dispositivo corretta, ed è qui che entravano in gioco i quadranti. La semplice soluzione a questo era aggiungere uno spostamento basato sul quadrante corrispondente. Lo si può vedere nelle figure seguenti, che sono ancora una volta pezzi di codice degli Stati 2 e 3 di ciascun quadrante.

La prima istruzione if viene eseguita se l'intestazione calcolata dall'equazione MPU è maggiore dell'intestazione utente. In questa condizione l'intestazione dell'input dell'utente viene aggiunta all'intestazione del dispositivo e il valore corrispondente viene sottratto da 360. Se viene eseguita l'istruzione else, l'equazione dell'intestazione dell'MPU viene sottratta dall'intestazione dell'input dell'utente. Queste condizioni sono state implementate non solo per ottenere un valore accurato per il NeoPixel, ma per evitare di ottenere un valore al di fuori dell'intervallo accettabile, che va da 0 a 359 gradi.

Consigliato: