Progetto bussola e inclinometro [Risolto]

Ciao a tutti,
ho la necessità di realizzare una bussola e inclinometro.
Vi elenco ciò che posseggo:

  • Arduino UNO R3 MEGA328P ATMEGA16U2
  • Display LCD IIC / I2C / TWI LCD 2004/20 x 4 (riuscito a far funzionare con la libreria in allegato "QK51.zip")
  • Bussola GY-271 HMC5883L (QMC5883L) (riuscito a far funzionare con la libreria Mechasolution QMC5883L).
    Se possibile vorrei che sul display, il primo rigo mi indichi il valore Azimut, il secondo rigo indichi i vari punti cardinali in base alla posizione attuale, il terzo rigo i gradi della bussola e il quarto i gradi di inclinazione.
    Mi è stato detto che per i gradi di inclinazione l'hardware HMC5883L non è adatto e che servirebbe abbinare un accelerometro. È vero? Se così fosse quale acquistare?

Ho fatto vari tentativi usando codici trovati in rete ma nessuno di essi ha funzionato a dovere.
Spero che con questi componenti in mio posseggo qualcuno di voi possa realizzare un codice funzionante.
Ringrazio in anticipo.

QK51.zip (18.8 KB)

Mecha_QMC5883L-master.zip (6.06 KB)

Scusa, non conosco quel sensore ma in linea di massima direi di si, con una bussola per quanto ne so non è possibile implementare un sensore per tutti gli assi senza avere anche un accelerometro in quanto il sensore magnetico rileva solamente la direzione (Heading, quindi eventualmente Yaw in gergo aeronautico) mentre l'accelerometro di ti fornisce indicazioni per gli altri due assi di rotazione (Roll e Pitch).
Credo che ti serva qualcosa tipo la MPU6050.

1 Like

docdoc:
Scusa, non conosco quel sensore ma in linea di massima direi di si, con una bussola per quanto ne so non è possibile implementare un sensore per tutti gli assi senza avere anche un accelerometro in quanto il sensore magnetico rileva solamente la direzione (Heading, quindi eventualmente Yaw in gergo aeronautico) mentre l'accelerometro di ti fornisce indicazioni per gli altri due assi di rotazione (Roll e Pitch).
Credo che ti serva qualcosa tipo la MPU6050.

Grazie per il chiarimento. Acquisterò il sensore accelerometro MPU6050 che mi hai indicato.
Il mio problema, però, è quello di non saper sviluppare il codice per ottenere il risultato desiderato (descritto nel 1° post).
Chiedo aiuto per la creazione del codice per i componenti in mio possesso aggiungendo il sensore MPU6050.

Antom17:
Il mio problema, però, è quello di non saper sviluppare il codice per ottenere il risultato desiderato (descritto nel 1° post).
Chiedo aiuto per la creazione del codice per i componenti in mio possesso aggiungendo il sensore MPU6050.

Emmm ... debbo però rammentarti il punto 16.1 del REGOLAMENTO ... che dovresti aver letto ::slight_smile:

Quindi tu studiati la cosa, scrivi il codice e noi ti aiutiamo a sistemalo e correggerlo. :slight_smile:

Guglielmo

Antom17:
Grazie per il chiarimento. Acquisterò il sensore accelerometro MPU6050 che mi hai indicato.
Il mio problema, però, è quello di non saper sviluppare il codice per ottenere il risultato desiderato (descritto nel 1° post).
Chiedo aiuto per la creazione del codice per i componenti in mio possesso aggiungendo il sensore MPU6050.

Se prendi quel sensore comprende sia il giroscopio a 3 assi sia l'accelerometro a 3 assi, e con questo hai l'assetto grazie alla combinazione delle due cose (c'è molta matematica comunque ti aiutano le librerie...), se ti serve anche la direzione (heading) rispetto al Nord devi aggiungere anche l'attuale bussola, altrimenti no.

Ma per la creazione del codice, oltre che dagli esempi presenti nella pagina che ti ho linkato nel primo post, ti conviene sempre iniziare dagli esempi delle librerie, quindi quando ti arriva l'MPU6050 sperimenta un poco con quelli, e quando vedi che tutto corrisponde a quanto ti attendi, aggiungerai anche la bussola (se necessario). In entrambi i casi devi prima iniziare tu a scrivere qualcosa, ed in caso di problemi posta qui il tuo codice e cercheremo di aiutarti.

PS: ma più che dire cosa vuoi misurare, magari se ci spiegassi cosa vuoi realizzare potrebbe darci qualche ulteriore indicazione utile per darti consigli...

A proposito di bussole ed altre simili "bestioline" (:D) ... potrebbero diventare interessanti anche il BNO055 della Devantech, che c'e' sia su schedina minimalista, sia assemblato insieme ad un PIC come CMPS12 (probabilmente il secondo tramite il PIC fornisce direttamente i dati in formato "umano", mentre il primo andranno elaborati, o almeno mi sembra di aver capito questo) ... come sensore, a parte l'autocompensazione della bussola fatta dal software interno della Bosch, dal datasheet mi sembra che fornisca un sacco di dati, sia relativi che assoluti ... potrebbe perfino diventare interessante, per qualche applicazione ...

Grazie docdoc, in effetti non avevo spiegato il motivo del progetto. Cerco di essere breve.
Sul camper ho, anzi avevo, una parabola con puntamento automatico. Sfortunatamente il decoder che fa anche da centralina per il puntamento, si è bruciato e per ripararlo o sostituirlo converrebbe acquistare la parabola nuova.
Ho già modificato il circuito della parabola aggiungendo dei fine corsa sia per la rotazione che elevazione/discesa creando anche la chiusura automatica da qualsiasi punto essa si trovi. Per il puntamento però ho trovato molte difficoltà anche aiutandomi con il satfinder. La parabola si trova sul tetto del camper ed è quasi impossibile stabilire sia l'orientamento che i gradi di elevazione quindi per questo motivo vorrei realizzare questo progetto in modo che mi possa aiutare, anche se in parte, a centrare nel minor tempo possibile il segnale certamente non in modo automatico ma manuale.

Stamattina ho acquistato la bussola HMC5883L GY-273 (L5883 2108) e il sensore MPU6050.
Come consigliato da Guglielmo cercherò di studiare Arduino e cercare di scrivere qualcosa anche se sarà dura.

Ah ok, capito. Interessante!

Per l'elevazione, a meno che tu non vada da nord a Sud Italia o fuori dell'Italia, più o meno è relativamente costante, visto che dipende dalla latitudine. Ma forse vuoi compensare eventuali dislivelli del posto dove fermi il camper, per questo ti serve qualcosa che misuri l'inclinazione esatto?
il problema maggiore è l'orientamento in effetti, purtroppo non ho un sensore bussola per provare per cui aspetta che ti arrivino, e come detto inizia a sperimentare con UNA cosa alla volta, poi alla fine metti insieme.

E se hai problemi, quindi, posta qui fino a dove sei arrivato e cosa fa o non fa..

PS Ma con i motori come ti interfacci? Che tipo di motori sono, degli stepper?

docdoc:
Scusa, non conosco quel sensore ma in linea di massima direi di si, con una bussola per quanto ne so non è possibile implementare un sensore per tutti gli assi senza avere anche un accelerometro in quanto il sensore magnetico rileva solamente la direzione (Heading,

Quel sensore fornisce il campo magnetico su tre assi.

L'azimuth dipende dalla precisione che vuoi ottenere poiché non solo il polo Nord magnetico non coincide con il polo Nord ma anche si sposta nel tempo. Inoltre se ti trovi in una zona di anomalia magnetica, ad esempio rocce vulcaniche, ti trovi con dati ballerini.

zoomx:
Quel sensore fornisce il campo magnetico su tre assi.

Esatto, ma parliamo sempre dell'indicazione del polo Nord magnetico, quindi non credo abbia le informazioni necessarie per il posizionamento della parabola.

L'azimuth dipende dalla precisione che vuoi ottenere poiché non solo il polo Nord magnetico non coincide con il polo Nord ma anche si sposta nel tempo. Inoltre se ti trovi in una zona di anomalia magnetica, ad esempio rocce vulcaniche, ti trovi con dati ballerini.

Eh, certamente, ma la compensazione del Nord magnetico con quello geografico si fa facilmente, almeno per longitudini non troppo ampie (diciamo per l'Europa ci siamo con una costante).

Per lo spostamento del Polo Nord Magnetico direi che ci possiamo riflettere tra una ventina d'anni come minimo.

Se infine ti trovi in una zona con anomalie magnetiche, quindi, o vedi il satellite o preoccupati perché sei finito nel triangolo delle Bermuda. :slight_smile:

PS su, non esageriamo con la pignoleria, deve solo puntare più o meno una parabola, non comunicare con un rover su Marte... :smiley:

Ho scritto

zoomx:
L'azimuth dipende dalla precisione che vuoi ottenere

Se la precisione è di 2-3 gradi allora va benissimo la correzione fissa.

In quanto alle zone di anomalia magnetica basta andarsi a guardare le carte IGM. Le rocce vulcaniche effusive contengono magnetite in quantità sufficiente da alterare le bussole.
Secondo questo articolo
https://link.springer.com/content/pdf/10.1007/BF01999934.pdf
nell'area alpina del Piemonte-Valled'Aosta si raggiungono i 5 gradi di anomalia, Etna e Vesuvio raggiungono valori maggiori, ma non c'è scritto quanto. Si tratta di valori variabili anche nel raggio di decine di metri, per questo parlavo di letture ballerine.
Questa carta è molto più aggiornata
http://roma2.rm.ingv.it/it/risorse/rete_magnetica_italiana/36/cartografia_magnetica_nazionale
ma non sono riuscito a trovarla a dimensioni maggiori.

docdoc:
PS su, non esageriamo con la pignoleria, deve solo puntare più o meno una parabola, non comunicare con un rover su Marte... :smiley:

Hai detto giusto, alla fine vorrei solo riuscire ad avere un piccolo aiuto dalla bussola e dall'accelerometro per agganciare il segnale, niente di più.

docdoc:
Ma forse vuoi compensare eventuali dislivelli del posto dove fermi il camper, per questo ti serve qualcosa che misuri l'inclinazione esatto?

In genere il camper si tende sempre a metterlo in bolla. L'inclinazione che dovrei stabilire è quella della parabola in fase di elevazione. Ad esempio nella mia zona l'elevazione è sui 45°, a Milano sui 37,5° (se non erro) e questo dovrei ottenerlo dal sensore MPU6050 che installerò in un punto ben preciso sulla parabola. Alla fine a me serve solo conoscere i gradi di un singolo asse.
Il satellite che mi interessa puntare è Hot Bird 13 che è posizionato a 13° Est e per puntare questo satellite dall’Italia, l’azimut deve essere circa di 180°. Qui dovrebbe entrare in gioco la bussola HMC5883L che dovrebbe indicarmi, sul display, i gradi di azimut e in che direzione è puntata la parabola man mano che io la faccio ruotare (sud, est, ovest .. e così via).

docdoc:
PS Ma con i motori come ti interfacci?

I motori sono dei motoriduttori già presenti nella parabola. Io ho solo modificato l'impianto riuscendo, tramite 2 pulsanti a comandare la rotazione, con altri 2 elevazione e discesa e infine con il terzo pulsante avvio la chiusura automatica da qualsiasi posizione la parabola si trovi.
Alla fine i due sensori dovrebbero solo comunicarmi sul display i gradi di inclinazione e in che posizione si trova la parabola man mano che ruota e si eleva.
Mi è venuta l'idea di usare Arduino, per me un mondo nuovo, e non buttare la parabola semimorta perchè sul web ho visto vari progetti su bussole e inclinometri, da lì è iniziato tutto.

Ciao, finalmente dopo vari tentativi, varie guide lette e studiate, e con l'aiuto di alcune librerie sono riuscito, per il momento, a far funzionare il sensore HMC5883L e ad inviare i dati sul display.

Ho però riscontrato che dopo poco la bussola si blocca come se venisse disconnessa da Arduino.
Ho controllato più volte i collegamenti dei cavi e non ho riscontrato nessun problema infatti mi basta resettare Arduino e tutto ritorna funzionante ma solo per pochi minuti.
Non so se c'è qualche errore nel codice:

#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x3f,20,4);

#define HMC5883L_Address 0x1E /* L'indirizzo del modulo I2C */
#define X 3 // Registra l'indirizzo per i dati X Y e Z
#define Y 7
#define Z 5
double angle;


void setup()
{
  lcd.begin(20,4);
  lcd.init();  /* Inizializza Display */
  lcd.backlight();  /* Apri la retroilluminazione */
  Serial.begin(9600);
 Wire.begin(); /* Inizializza la libreria Wire */
 Init_HMC5883L(); /* Inizializza il modulo HMC5883L */
}
void loop()
{
 angle= (atan2((double)HMC5883L_Read(X),(double)HMC5883L_Read(Y)) * (180 /
3.14159265)) + 180; /* Angolo in gradi */

 Serial.print(HMC5883L_Read(X)); /* Leggi entrambi i dati dell'asse del sensore e inviali all'unità porta seriale */
 Serial.print(", ");
 Serial.print(HMC5883L_Read(Y));
 Serial.print(", ");
 Serial.print(HMC5883L_Read(Z));
 Serial.print(", ");
 Serial.print(angle,0);
 Serial.print(", ");

 lcd.clear();
 lcd.setCursor(0,0);
lcd.print("Bussola");

 lcd.setCursor(0,1);
 if((angle <= 22.1) || (angle >= 337.1 )){
 Serial.print("Nord"); 
 lcd.print("Nord");}
 if((angle >= 22) && (angle <=67.1 )){
 Serial.print("Nord-Est");
 lcd.print("Nord-Est");}
 if((angle >= 67) && (angle <= 112.1 )){
 Serial.print("Est");
 lcd.print("Est");}
 if((angle >= 112) && (angle <= 157.1 )){
 Serial.print("Sud-Est");
 lcd.print("Sud-Est");}
 if((angle >= 157) && (angle <= 202.1 )){
 Serial.print("Sud");
 lcd.print("Sud");}
 if((angle >= 202) && (angle <= 247.1 )){
 Serial.print("Sud-Ovest");
 lcd.print("Sud-Ovest");}
 if((angle >= 247) && (angle <= 292.1 )){
 Serial.print("Ovest");
 lcd.print("Ovest");}
 if((angle >= 292) && (angle <= 337 )){
 Serial.print("Nord-Ovest");
 lcd.print("Nord-Ovest");}

 Serial.println(" ");

 lcd.setCursor(0,2);
 lcd.print("   Azimuth= ");
 lcd.print(angle,0);
 lcd.print((char)223);

delay(250); /* Aspetta un pò prima di leggere di nuovo */
 
}
/* Questa funzione inizializzerà il modulo e dovrà essere eseguito solo una volta
 dopo che il modulo è stato acceso o resettato per la prima volta */
 
void Init_HMC5883L(void)
{
 /* Impostare il modulo su media 8x e frequenza 15Hz */
 Wire.beginTransmission(HMC5883L_Address);
 Wire.write(0x00);
 Wire.write(0x70);

 /* Imposta un guadagno di 5 */
 Wire.write(0x01);
 Wire.write(0xA0);
 Wire.endTransmission();
} 
/* Questa funzione verrà letta una sola volta da uno dei registri a 3 assi
e restituire il risultato firmato a 16 bit */
int HMC5883L_Read(byte Axis)
{
 int Result;

 /* Iniziare una singola misurazione */
 Wire.beginTransmission(HMC5883L_Address);
 Wire.write(0x02);
 Wire.write(0x01);
 Wire.endTransmission();
 delay(6);

 Wire.beginTransmission(HMC5883L_Address);
 Wire.write(Axis);
 Wire.endTransmission();

 /* Leggi i dati dai registri */
 Wire.requestFrom(HMC5883L_Address, 2);
 Result = Wire.read() << 8;
 Result |= Wire.read();
 return Result; 
 }

Altra cosa che ho notato che i dati visualizzati sul display hanno dei piccolissimi e continui impulsi.

Spero che qualcuno possa consigliarmi come risolvere questi problemi.

>Antom17: Il codice va chiuso tra i tag CODE e NON i tag quote ...
... per questa volta ho corretto io il tuo post, ma tienilo presente per il futuro :slight_smile:

Guglielmo

gpb01:
>Antom17: Il codice va chiuso tra i tag CODE e NON i tag quote ...
... per questa volta ho corretto io il tuo post, ma tienilo presente per il futuro :slight_smile:

Guglielmo

Chiedo scusa. Avevo letto questo regolamento ma stupidamente ho sbagliato.

gpb01:
[... per questa volta ho corretto io il tuo post, ma tienilo presente per il futuro :slight_smile:

Ehm.. Forse non hai salvato perché veramente lo vedo ancora sotto "quote"... :slight_smile:

docdoc:
Ehm.. Forse non hai salvato perché veramente lo vedo ancora sotto "quote"... :slight_smile:

Fatto

Antom17:
Altra cosa che ho notato che i dati visualizzati sul display hanno dei piccolissimi e continui impulsi.

Ho notato che cambiando il valore di “delay(250)“ il lampeggio delle scritte cambia.
Aumentando il valore l’impulso del lampeggio diminuisce, viceversa diminuendo il valore aumenta.
Questo avviene soprattutto sulla scritta dei gradi azimuth. E’ normale?
Ho notato inoltre che aumentando questo valore, ad esempio a 1000, e spostando il sensore HMC5883L l’aggiornamento dei gradi azimuth non è istantaneo cosa che avviene invece se il valore è basso.

Ringrazio tutti, alla fine sono riuscito ad ottenere il risultato desiderato.
Ho risolto da solo