Edoardo Vignali
Bussola Digitale
Tutorials -
Mercoledì 04 Agosto 2010 13:18
Scritto da Edoardo Vignali

Le bussole digitali, o compassi digitali, o magnetometri sono dispositivi elettronici molto utilizzati in applicazioni in cui è richiesto di conoscere l'orientazione di un determinato oggetto. Vengono utilizzati soprattutto negli UAV insieme a schede gps, accelerometri e giroscopi per conoscere l'esatta posizione del velivolo e la direzione in cui si sta dirigendo.

Come funziona una bussola digitale

Il sensore vero e proprio è costituito da una striscia di Permalloy, ovvero una lega al 19% di ferro e 81% di nickel, che ha la capacità di variare la sua resistenza a seconda dell'inclinazione tra il vettore della corrente che circola nel permalloy e il vettore del campo elettromagnetico che la colpisce.

Permalloy

Queste resistenze vengono montate in una configurazione a ponte e il sensore viene calibrato con delle piccole induttanze.

Sensore configurazione ponte

Le bussole elettroniche però sono influenzate molto dalla loro inclinazione e per ricalibrare l'uscita del nostro sensore in funzione dell'inclinazione troviamo dei dispositivi di correzione integrati nel chip. Come possiamo vedere sono presenti 2 ponti di magneto-resistenze, uno serve per misurare Hex mentre l'altro serve per misurare Hey.

Schema a blocchi bussola digitale

L'azimut deviation si estrapola da un calcolo vettoriale che serve a correggere appunto i dati del sensore,

Calcolo vettoriale di correzione del nord

dove α = atan(Hey/Hex) e rappresenta l'angolo azimutale, δ rappresenta l'angolo di dipolo ovvero l'angolo tra il vettore campo elettromagnetico della terra e il piano orizzontale e λ è detto declinazione e rappresenta l'angolo tra il nord geografico e il nord magnetico, perchè il nord magnetico molto lentamente tende ad allontanarsi dal nord geografico (attualmente il nord magnetico si trova nel nord del canada). Anche la nostra posizione sulla terra influenza molto il comportamento di questi sensori infatti, come possiamo vedere nel grafico, man mano che ci avviciniamo all'equatore il campo magnetico cambia diventando più debole. L'intensità del campo elettromagnetico della terra all'equatore è di circa 20 000 nT mentre ai poli è di 70 000 nT.

Campo elettromagnetico terrestre

Codice e Connessioni

Finita la parte teorica che comunque l'utente finale di una bussola digitale potrebbe tralasciare tranquillamente, passiamo alla parte pratica. La bussola digitale che prenderò in considerazione è l'HMC6352 che utilizza il protocollo I2C.

Nello schema sono rappresentati i collegamenti ad arduino.

Collegamenti Bussola digitale Arduino

ed eccovi il codice per far funzionare questo oggetto.

Includete la libreria Wire.h

int HMC6352Address = 0x42;
// This is calculated in the setup() function
int slaveAddress;
int ledPin = 13;
boolean ledState = false;
byte headingData[2];
int i, headingValue;
void setup()
{
// Shift the device's documented slave address (0x42) 1 bit right
// This compensates for how the TWI library only wants the
// 7 most significant bits (with the high bit padded with 0)
slaveAddress = HMC6352Address >> 1;   // This results in 0x21 as the address to pass to TWI
Serial.begin(9600);
pinMode(ledPin, OUTPUT);      // Set the LED pin as output
Wire.begin();
}
void loop()
{
  // Flash the LED on pin 13 just to show that something is happening
  // Also serves as an indication that we're not "stuck" waiting for TWI data
  ledState = !ledState;
  if (ledState) {
    digitalWrite(ledPin,HIGH);
  }
  else
  {
    digitalWrite(ledPin,LOW);
  }
  // Send a "A" command to the HMC6352
  // This requests the current heading data
  Wire.beginTransmission(slaveAddress);
  Wire.send("A");              // The "Get Data" command
  Wire.endTransmission();
  delay(10);                   // The HMC6352 needs at least a 70us (microsecond) delay
  // after this command.  Using 10ms just makes it safe
  // Read the 2 heading bytes, MSB first
  // The resulting 16bit word is the compass heading in 10th's of a degree
  // For example: a heading of 1345 would be 134.5 degrees
  Wire.requestFrom(slaveAddress, 2);        // Request the 2 byte heading (MSB comes first)
  i = 0;
  while(Wire.available() && i < 2)
  { 
    headingData[i] = Wire.receive();
    i++;
  }
  headingValue = headingData[0]*256 + headingData[1];  // Put the MSB and LSB together
  Serial.print("Current heading: ");
  Serial.print(int (headingValue / 10));     // The whole number part of the heading
  Serial.print(".");
  Serial.print(int (headingValue % 10));     // The fractional part of the heading
  Serial.println(" degrees");
  delay(500);
} 

Immagini tratte da "Electronic Compass Design using KMZ51 and KMZ52" e playground inglese di arduino

CC

 

Gioblu Robotics © 2010 - 2012 · Sitemap · privacy

gioscarab@gmail.com

Gioblu BOTServer è online dal 10 Aprile 2010 - 319.232 Visite - 1.027.175 Pagine visualizzate - 182.309 Visitatori unici - 536 utenti attivi