Arduino kompas HMC5883L

Arduino kompas a tříosý magnetometr obsahuje měřící senzor HMC5883L. Tento měřící senzor od firmy Honeywell komunikuje po rozhraní I2C a umožňuje měřit sílu magnetického pole ve třech osách, přičemž z těchto údajů lze s poměrně dobrou přesností určit směr, kterým se nachází sever. Můžeme ho tedy použít jako elektronický kompas. Podle údajů výrobce dokáže senzor HMC5883L určit sever s přesností 1-2 stupňů, kdy pro veškerou práci s naměřenými daty je využit speciální ASIC obvod, který je umístěn v pouzdře senzoru. Pro napájení senzoru HMC5883L můžeme použít napájecí napětí o velikosti 3,3 nebo 5 Voltů s proudovým odběrem v řádu stovek mikroAmpér.

Pro úspěšné propojení senzoru HMC5883L a Arduino desky je nutné zapojit 4 propojovací piny. Propojíme VCC s 3,3 nebo 5V Arduina, GND se zemí Arduina, SCL s pinem A5 a SDA s pinem A4. Datové piny SCL a SDA je nutné zapojit na I2C piny použité Arduino desky, kdy například u Arduino Uno desky jsou to zmíněné piny A4 a A5.

Pro správnou funkci uvedeného ukázkového kódu je nutné stáhnout a naimportovat knihovnu HMC5883L, návod jak na to je uveden zde. Ukázkový kód obsahuje na svém začátku připojení potřebných knihoven a inicializaci senzoru z připojené knihovny. Při inicializaci je nutné přiřadit libovolný unikátní kód, v našem případě 12345. V podprogramu setup jako první nastavíme komunikaci po sériové lince a následně zahájíme komunikaci s modulem HMC5883L. Pokud by nebyl senzor detekován, vytiskneme chybovou hlášku po sériové lince a zastavíme program. Nekonečná smyčka loop obsahuje vytvoření a následné načtení balíku dat ze senzoru. Poté jsou pro informaci vytištěny velikosti magnetických sil ve všech směrech v jednotce mikroTesla. Následně proběhne výpočet úhlu natočení z dat os Y a X, kdy mezivýsledek je v radiánech. Pro získání přesnější hodnoty úhlu natočení vůči severu je možné připočíst k vypočtenému úhlu takzvaný magnetický sklon, který je možné získat na stránkách http://www.magnetic-declination.com/. Pokud se tedy rozhodneme využít zpřesnění měření, stačí do proměnné magDeclinRad zapsat hodnotu magnetického sklonu pro naší zeměpisnou polohu v radiánech. V opačném případě stačí oba řádky s proměnnou magDeclinRad zakomentovat. Jako další krok je provedena korekce úhlu natočení, kdy podle aktuálního úhlu přičteme nebo odečteme hodnotu 2 pí a s touto hodnotou provedeme finální přepočet na úhel ve stupních. Na konci programu tedy už jen vytiskneme výsledný úhel natočení vůči severu a vyčkáme 1 vteřinu do dalšího měření.

// Arduino kompas HMC5883L

// připojení potřebných knihoven
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_HMC5883_U.h>

// inicializace senzoru HMC5883L z knihovny,
// 12345 je libovolný unikátní kód, který je nutné přiřadit
Adafruit_HMC5883_Unified mag = Adafruit_HMC5883_Unified(12345);

void setup(void) 
{
  // komunikace po sériové lince rychlostí 9600 baud
  Serial.begin(9600);
  // zahájení komunikace se senzorem HMC5883L,
  // v případě chyby je vypsána hláška po sériové lince
  // a zastaven program
  if(!mag.begin())
  {
    Serial.println("HMC5883L senzor nenalezen, zkontrolujte zapojeni!");
    while(1);
  }
}

void loop(void) 
{
  // vytvoření a následné načtení balíku dat ze senzoru
  sensors_event_t magData; 
  mag.getEvent(&magData);
  // vytištění informací o velikostech magnetických sil v osách x,y,z
  // hodnoty jsou v jednotce uT (mikroTesla)
  Serial.print("X: "); Serial.print(magData.magnetic.x); Serial.print(" ");
  Serial.print("Y: "); Serial.print(magData.magnetic.y); Serial.print(" ");
  Serial.print("Z: "); Serial.print(magData.magnetic.z); Serial.print(" ");
  Serial.println("uT");
  // výpočet velikosti úhlu natočení ze sil v osách x a y
  float uhelNatoceni = atan2(magData.magnetic.y, magData.magnetic.x);
  // pro přesnější získání úhlu natočení je nutné navštívit tento odkaz:
  // http://www.magnetic-declination.com/
  // na zmíněné stránce zadáte svoji lokaci a z ní zjistíte údaj
  // "magnetic declinaction" - magnetický sklon, ten je ještě nutné převést z úhlů na radiány
  // tedy např. v Brně je tento úhel cca 4 stupně = 0.07 radiánů
  // pokud se vám nepodaří najít mag. sklon, stačí 2 řádky pod komentářem vymazat
  float magDeclinRad = 0.07;
  uhelNatoceni += magDeclinRad;
  
  // korekce výpočtu úhlu natočení
  if(uhelNatoceni < 0)
    uhelNatoceni += 2*PI;
  if(uhelNatoceni > 2*PI)
    uhelNatoceni -= 2*PI;
  // konečný přepočet úhlu natočení z radiánů na stupně
  float uhelNatoceniSt = uhelNatoceni * 180/M_PI; 
  // vytištění údajů o úhlu natočení, 0 stupňů znamená sever
  Serial.print("Uhel natoceni: "); Serial.print(uhelNatoceniSt);
  Serial.println(" stupnu");
  Serial.println();
  // volitelná pauza po dobu 1 vteřiny
  delay(1000);
}

Po nahrání ukázkového kódu do Arduino desky s připojeným modulem HMC5883L dostaneme například tento výsledek:

X: -16.45 Y: -33.73 Z: -22.55 uT
Uhel natoceni: 248.00 stupnu

X: -19.18 Y: -36.45 Z: -18.06 uT
Uhel natoceni: 246.26 stupnu

X: -20.00 Y: -4.82 Z: -11.33 uT
Uhel natoceni: 197.56 stupnu

X: 0.55 Y: 0.00 Z: -16.43 uT
Uhel natoceni: 4.01 stupnu

Arduino kompas a tříosý magnetometr se senzorem HMC5883L je zajímavý a jednoduše použitelný modul pro Arduino, který nám umožňuje s poměrně dobrou přesností vytvořit vlastní elektronický kompas. Díky přítomnost tříosého magnetometru je pak také možné provozovat tento modul v různých natočeních, kdy v uvedeném příkladu je umístěn senzor rovnoběžně s podložkou a tím tedy osa Z míří vzhůru. Pokud bychom chtěli provozovat senzor v pootočeném stavu, stačí v programu zaměnit při výpočtu úhlu použité osy za jiné, tedy například při ose X mířící vzhůru použijeme pro výpočet osy Z a Y. Pro dosažení zmíněné přesnosti je ale nutné zdůraznit, že je nutné dát si pozor na okolní zdroje magnetického pole, jako jsou magnetické materiály či vysílací zařízení. Nepoužitý výstup ze senzoru DRDY slouží jako označení přítomnosti nových dat, ale v našem případě vyčítání informací každou vteřinu je pro nás zbytečný, protože dle výrobce jsou nová data přístupná přibližně každých 6 milisekund.

 

Seznam použitých komponent:

http://dratek.cz/arduino/974-arduino-uno-r3-atmega328p-1424115860.html

http://dratek.cz/arduino/1194-arduino-kompas-hmc5883l-1456049841.html

Další podobné články