Il risultato deludente della precisione del modulo compass non mi ha dato pace per parecchio tempo.

Così ho voluto cercare di capire meglio questo problema e fare ulteriori tests.

 

Raccolta dati per elaborare una soluzione

Innanzitutto ho disegnato su un foglio delle righe in corrispondenza dei vari angoli. La posizione del Nord non è rilevante per questo test, ho voluto in ogni caso verificare se in qualche modo il mio cellulare era influenzato da qualche campo magnetico che non avevo considerato.

test angoli setup

 

Ho predisposto BigWheely parallelo ai rispettivi angoli che ho disegnato e ne ho rilevato i valori trasmessi.

Ho raccolto i dati in un foglio excel e fatto alcune considerazioni:

tabella funzione compass

 grafico funzione compass

 

Interpretazione dei dati raccolti

Innanzitutto, l'asse orizzontale mostra l'angolo REALE di posizionamento, mentre l'asse verticale indica il valore MISURATO.

La linea retta BLU denominata "Teorico" indica il comportamente ideale, ad ogni angolo reale corrisponde lo stesso angolo misurato.

Le curve VERDI e ROSSE sono molto simili tra loro, ho provato infatti a rilevare le identiche misurazioni ma assegnando alla funzione SetScale (libreria HMC5883L.h descritta in precedenza) valori differenti (prima 8.1 Ga e poi 1.3 Ga).
Il risultato, come si può notare dalla sovrapposizione delle curve, non cambia di molto.

 

Calcolo delle funzioni di compensazione

Ho aggiunto delle linee di tendenza in corrispondenza della curva ROSSA, e ho identificato una funzione di quinto grado che aderiva molto bene, ho dovuto scartare subito l'idea di integrare questa funzione in Arduino in quanto risolverla sarebbe stato un calcolo eccessivo (i numeri in gioco erano davvero molto grandi).
Ho quindi optato per utilizzare funzioni lineari e di suddividerle in segmenti più piccoli.

Calcolando i coefficienti k1, k2, k3 che determinano l'inclinazione e b1,b2,b3 (descritti erroneamente sempre con b) che influenzano lo spostamento verticale della retta, ne ho ricavato 3 funzioni F(x).
Da queste funzioni F1(x), F2(x), F3(x) ho potuto calcolare le rispettive funzioni inverse G1(x), G2(x), G3(x).

Si può notare come la curva risultante delle funzioni inverse G(x) rappresentata in AZZURRO seguono piuttosto bene la linea teorica.

 

Ho infine applicato queste funzioni in uno sketch su Arduino e ho provato ad effettuare di nuovo i rilevamenti.
Nelle immagini seguenti sono riportate le posizioni di BigWheely (sinistra), dei rispettivi angoli misurati (Campo Movement) e l'angolo rappresentato dopo le compensazioni appena descritte (campo Angle). 
NOTA: Il campo Movement mostra l'angolo moltiplicato per 10 (es: 3580 ==> 358.0 gradi)

 

 

 ANGOLO RIFERIMENTO: 0 GRADI  
 test angolo 0 misura angolo 0 
 ANGOLO RIFERIMENTO: 90 GRADI  
 test angolo 90  misura angolo 90
ANGOLO RIFERIMENTO: 180 GRADI  
test angolo 180 misura angolo 180
ANGOLO RIFERIMENTO: 270 GRADI  
test angolo 270 misura angolo 270

 

 

Generalmente le misurazioni si sono rilevate decisamente migliorate, in corrispondenza degli angoli dei punti cardinali (0; 90; 180; 270) sembra esserci una buona precisione.

 

Per concludere l'esperimento ho riapplicato l'identico test fatto in precedenza per constatare il comportamento durante la rotazione continua, ecco il video:

 

 

Se ben sviluppato, un controllo diventa molto utile e semplice da integrare nei progetti. Questo tipo di soluzione offre infatti uno "strumento" riutilizzabile N volte.
controllo utente tutorial

Allego l'esempio VB di controllo che mi ha ispirato e aiutato a capire come fare, e questa guida che ragguaglia sul metodo per la creazione di controlli.

 

 

Come previsto, in breve tempo ho integrato e associato la lettura dell'angolo di BigWheely su computer.

È qui che mi sono accorto che i dati letti dal modulo compass risultano essere del tutto inutilizzabili. Il comportamento è davvero strano e incontrollato.

Ho iniziato a fare verifiche e tests, questo video dimostra bene il problema:

 

Allegati:
Scarica questo file (esempio_controllo.zip)esempio_controllo.zip[ ]224 kB

Dopo i primi test fatti con l'esempio della libreria HNC5883L.h e man mano che anche il software VB prende forma, ho deciso di voler rappresentare graficamente la direzione della bussola.

Ho quindi iniziato a progettare un controllo in VB.NET in grado di indicare una direzione e in cui sia possibile rappresentare un range di tolleranza nel quale una direzione possa ritenersi accettabile.

teoria trigo controlloVBcompass r

Essendo un po' arruginito con la geometria e il calcolo trigonometrico, ho dovuto spolverare qualche manuale tecnico e qualche sito come questo che trattasse questi argomenti. Infine però ho delineato il problema e ho programmato il nuovo controllo VB.NET.

NOTA: prima di mettermi a programmare, ho fatto alcune ricerche per verificare se ci fosse qualcosa di già fatto, ma non ho trovato niente di interessante e soprattutto FREE e open source.

 

Questo è il primo prototipo funzionante del nuovo controllo:

prototipo controllo compass

 

e questo è il banco di prova per testare il nuovo controllo:

banco test controlloVB compass

Ora sono pronto ad utilizzarlo per leggere i valori di Arduino ...

 

Il modulo HMC5883L è un magnetometro digitale a 3 assi.

Sembra incredibile poter avere una bussola tra le mani e racchiudere tutto questo in un piccolissimo chip grande circa 4mm x 4mm !

Questo tema è decisamente interessante, anche perchè potrebbe dare un utile informazione a BigWheely per identificare o correggere le direzioni da prendere. Determinarne la posizione di un oggetto nello spazio, (o perlomeno nel piano) è un argomento complesso, e anche se non ho ancora analizzato fino in fondo come sarà possibile conoscere l'esatta posizione di BigWheely nel salotto di casa, sono sicuro che una bussola potrà dare un sostanzioso aiuto.

IMG 0079 r IMG 0080 r

Ho acquistato questo modulo qui, dove viene fornito il datasheet (nella pagina hardware dedicato a questo modulo ho allegato un datasheet simile, ma cone alcune informazioni che su quello del sito di acquisto non sono indicate).

Come si collega

A differenza di altri moduli e sensori che generalmente utilizzano porte digitali, in questo caso è necessario utilizzare le porte di Arduino destinate per l'interfaccia di comunicazione I2C che corrispondono alle entrate analogiche A4 e A5.

Lo scheda seguente mostra come collegarlo (questo sito spiega un po' di teoria e come si collega):

Compass-6 0


Inoltre è possibile scaricare e installare anche una apposita libreria denominata HMC5883L.h correlata da un esempio che permette di muovere i primi passi con questo IC.

Attenzione da dove viene scaricata la libreria, io l'avevo trovata sul sito LoveElectronics, un sito che offre un interessante Tutorial e che affronta piuttosto bene l'argomento in modo semplice da capire. Questa versione della libreria credo sia piuttosto vecchia e obsoleta, per funzionare infatti ho dovuto (dopo ore di debug) apportare delle modifiche ai sorgenti della libreria perchè non veniva compilata correttamente.

In particolare è stato necessario sostituire il comando send --> write e il comando receive --> read su tutto il codice scritto in C++, la libreria Wire utilizzata non usa più i comandi send e receive da tempo.

Consiglio quindi di utilizzare la libreria allegata in fondo a questa pagina presa direttamente dal sito del rivenditore.

Ho trovato sul web molto materiale e siti che spiegano più o meno bene il funzionamento di questo dispositivo e delle influenze esterne che può subire. Spesso infatti viene utilizzato assieme ad un accelerometro in grado di compensare l'inclinazione rispetto il piano. Mi rendo conto che non è facile spiegare queste teorie in poche righe, per questo è forse il caso di approfondire l'argomento direttamente su internet. Una pagina sul sito Love Electronics spiega abbastanza bene questi concetti.

 tiltcompass-calc2

 

Calcolare il Magnetic declination

Il Tutorial del sito LoveElectronics spiega meglio di altre fonti come calcolare la "magnetic declination" del luogo in cui ci si trova. Questo valore compensa la differenza tra Nord Magnetico e Nord Geografico.

Seguendo alla lettera questo Tutorial, ottengo quindi i dati necessari per il calcolo della declinazione magnetica terrestre, nel mio caso:

declinazione magnetica mappa

Utilizzando il sito suggerito infine ottengo il valore richiesto.

declinazione magnetica conversione

 

Finalmente si può così ottenere una direzione espresso in gradi.

hmc5883l-tut1-4