Operácie

Elektronický kompas HMC5883L: Rozdiel medzi revíziami

Zo stránky SensorWiki

StudentDVPS (diskusia | príspevky)
StudentDVPS (diskusia | príspevky)
 
(52 medziľahlých úprav od rovnakého používateľa nie je zobrazených.)
Riadok 5: Riadok 5:
|}
|}


== Zadanie ==
__TOC__


Implementujte HMC5883L elektronický kompas, vytvorte program a vizualizáciu pre jeho používanie.


== Zadanie ==


[[Obrázok:Parallax_HMC5883.jpg|300px|center]]
Implementujte HMC5883L elektronický kompas, vytvorte program a vizualizáciu pre jeho používanie:
 
* [http://www.parallax.com/product/29133 Product page]
* [http://www.adafruit.com/datasheets/HMC5883L_3-Axis_Digital_Compass_IC.pdf Sensor description]
* [http://homepage.hispeed.ch/peterfleury/group__pfleury__ic2master.html i2c library]


* Nájdite si k senzorom datasheet
* Nájdite si k senzorom datasheet
Riadok 24: Riadok 20:




 
[[Obrázok:Parallax_HMC5883.jpg|300px|center]]
[http://www.example.com link title]
 
[[Médiá:MojZdrojak.c]]
 
 
'''Literatúra:'''
* Zoznam použitej literatúry, vrátane katalógových údajov (datasheet), internetových odkazov a pod.
 
__TOC__


== Analýza ==
== Analýza ==
Treba popísať ako funguje samotný senzor, ako sa pripojí k mikropočítaču a čo vlastne meria. Vymyslieť vzorovú aplikáciu s vizualizáciou na PC.
fotky zapojenia, datasheet, screenshot z datasheetu, co meria - mag pole (str. 9 datasheet)
V tejto časti popíšete ako idete daný problém riešiť. Uvediete sem aj všetky potrebné technické údaje,
ktoré sú potrebné na úspešné vyriešenie projektu. Napríklad:


HMC5883L modul je magnetorezistívny obvod pozostávajúci z troch HMC118X senzorov pre tri osi. Integrovaný je 12 bitový AD prevodník pre presnosť kompasu 1 až 2 stupne. Senzor disponuje technoológiou AMR ktorá zaisťuje osovú citlivosť a linearitu. Princíp činnosti modulu spočíva v konverzii Zemského magnetického poľa na diferenciál napätia na troch osiach. Výstup tohto napätia sa dá nasledovne spracovať pre rôzne účely. Senzor sa využíva napríklad pre nízkonákladovú navigáciu alebo magnetometriu.
HMC5883L modul je magnetorezistívny obvod pozostávajúci z troch HMC118X senzorov pre tri osi. Integrovaný je 12 bitový AD prevodník pre presnosť kompasu 1 až 2 stupne. Senzor disponuje technoológiou AMR ktorá zaisťuje osovú citlivosť a linearitu. Princíp činnosti modulu spočíva v konverzii Zemského magnetického poľa na diferenciál napätia na troch osiach. Výstup tohto napätia sa dá nasledovne spracovať pre rôzne účely. Senzor sa využíva napríklad pre nízkonákladovú navigáciu alebo magnetometriu.
Riadok 53: Riadok 34:




'''I2C zbernica'''
[[Súbor:hmc5883l.jpg|center]]
Senzor HMC5883L využíva na komunikáciu zbernicu I2C, na ktorú sa pripojí ako slave zariadenie. Podporuje štandardné (100kHz) aj rýchle módy (400kHz).
 


Na pripojenie senzora k doske sme nepotrebovali externé pull-up rezistory vzhľadom na to, že už sú integrované v samotnom senzore (4k7 na SDA a 2k2 na SCL linke).
'''Zapojenie modulu'''


Senzor HMC5883L využíva na komunikáciu zbernicu I2C, na ktorú sa pripojí ako slave zariadenie pod master zariadením, ako je napríklad mikrokontroler. Podporuje štandardné (100kHz) aj rýchle módy (400kHz).


* popis komunikačnej zbernice (i2c, 1-wire, RS-232 a pod.)(i2c z wikipedie)
[[Súbor:schema_kompas.jpg|center]]
* obrázok zapojenia vývodov použitej súčiastky(fotky, screeny z datasheetu)
 
* odkaz na katalógový list
 
* priebehy dôležitých signálov(datasheet?)
[https://www.parallax.com/sites/default/files/downloads/29133-CompassModuleHMC5883L-v1.1.pdf HMC5883L dokumentácia]
* este jedna polozka
 
[https://cdn-shop.adafruit.com/datasheets/HMC5883L_3-Axis_Digital_Compass_IC.pdf HMC5883L datasheet]


== Popis riešenia ==
== Popis riešenia ==


Sem opíšete ako konkrétne ste problém vyriešili. Začnite popisom pripojenia k procesoru
Z webovej stránky produktu sme stiahli voľne dostupnú dokumentáciu pre náš senzor. Zoznámili sme sa s modulom, zistili jeho vlastnosti a oboznámili sa s jednotlivými pinmi.
(nezabudnite na schému zapojenia!) a zdôraznite ktoré jeho periférie ste pritom využili.  
 
'''Popis pinov:'''
* GND - uzemnenie
* VIN - napätie zdroja
* DRDY - Data Ready, interrupt - nie je nutný pre náš projekt
* SCL - I2C clock
* SDA - I2C data
 
 


'''Schéma zapojenia snímača'''
'''Schéma zapojenia snímača'''
[[Súbor:Zapojenie.png]]


[[Súbor:Example.jpg]]
Po naštudovaní dokumentácie sme senzor zapojili na dosku podľa nasledujúcej schémy.
 
[[Súbor:schema_kompas2.jpg|center]]


Pozn.: Názov obrázku musí byť jedinečný, uvedomte si, že Obr1.jpg už pred vami skúsilo
nahrať už aspoň 10 študentov.


[[Súbor:MojObrazok.jpg|center|250px]]
Na pripojenie senzora k doske sme nepotrebovali externé pull-up rezistory vzhľadom na to, že už sú integrované v samotnom senzore (4k7 na SDA a 2k2 na SCL linke). Samotné zapojenie na doske, ktorú sme dostali, vyzerá nasledovne.


=== Algoritmus a program ===
Uveďte stručný popis algoritmu, v akom jazyku a verzii vývojového prostredia ste ho vytvorili.
Je vhodné nakresliť aspoň hrubú štruktúru programu napríklad vo forme vývojového diagramu.
Rozsiahly program pre lepšiu prehľadnosť rozdeľte do viacerých súborov.


Vyberte podstatné časti zdrojového kódu, použite na to prostredie ''source'':
[[Súbor:zapojenie_kompas.jpg|center]]


<source lang="c">
/* A nezabudnite zdroják hojne komentovať  */


int main(void) {
Overili sme funkčnosť senzora jednoduchým programom pre čítanie dát, ktorý sme ďalej upravili do žiadanej formy (viď nasledujúca kapitola).
   
    printf("Hello, World!\n"); 
    return(0)
}
</source>


Nezabudnite však nahrať aj kompletné zdrojové kódy vášho programu!


=== Algoritmus a program ===


Algoritmus pre mikropočítač bol vytvorený v programovom prostredí Arduino. Údaje namerané senzorom sú z registrov prostredníctvom zbernice I2C načítavané do mikropočítača a následne odosielané na rozhranie sériového portu, kde s nimi pracuje vizualizačná aplikácia vytvorená v programovacom jazyku C#, vo vývojovom prostredí Visual Studio 2015.
Algoritmus pre mikropočítač bol vytvorený v programovom prostredí Arduino. Údaje namerané senzorom sú z registrov prostredníctvom zbernice I2C načítavané do mikropočítača a následne odosielané na rozhranie sériového portu, kde s nimi pracuje vizualizačná aplikácia vytvorená v programovacom jazyku C#, vo vývojovom prostredí Visual Studio 2015.
Riadok 105: Riadok 84:


<source lang="c">
<source lang="c">
/* A nezabudnite zdroják hojne komentovať  */
#include <Wire.h>      /* knižnica pre prácu so zbernicou I2C*/


int main(void) {
void setup(){
  Serial.begin(9600);
  Wire.begin();
 
  Wire.beginTransmission((byte)0x1E);    /*  začiatok komunikácie  */
  Wire.write((byte)0x02);    /*  nastavenie registra*/
  Wire.write((byte)0x00);    /* opakované meranie */
  Wire.endTransmission();
}
 
 
void loop(){
 
  int x,y,z;    /*  premenné v ktorých budú uložené namerané súradnice*/
  /* Zápis dát do registra */
  Wire.beginTransmission((byte)0x1E);
  Wire.write((byte)0x03);    /* zápis do tretieho registra  */
  Wire.endTransmission();
 
/* Čítanie dát, 6B (2B pre každú súradnicu)*/
  Wire.requestFrom((byte)0x1E, 6);
  if(6<=Wire.available()){
      
      
     printf("Tuto je ten kod!\n");   
     x = Wire.read()<<8; /* Most significant byte pre x*/
    return(0);
    x |= Wire.read();  /* Least significant byte pre x*/
 
    z = Wire.read()<<8; /* Most significant byte pre z*/
    z |= Wire.read(); /* Least significant byte pre z*/
 
    y = Wire.read()<<8; /* Most significant byte pre y*/
    y |= Wire.read(); /* Least significant byte pre y*/
  }
 
  // výpis súradníc v správnom formáte
  Serial.print(x);
  Serial.print(",");
  Serial.print(y);
  Serial.print(",");
  Serial.println(z);
   
  delay(500);
}
}
</source>  
</source>  


Riadok 118: Riadok 137:
Vizualizačná aplikácia:
Vizualizačná aplikácia:


[[Súbor:Kompas.jpg]]
[[Súbor:Kompas.jpg|center]]




Vývojový diagram pre funkcionalitu aplikácie:
Vývojový diagram pre funkcionalitu aplikácie:


[[Súbor:Kompas_diagram.jpg]]
[[Súbor:Kompas_diagram.jpg|center]]




Časť kódu pre zobrazenie všetkých dostupných portov v počítači kde beží aplikácia:
Časť kódu pre inicializáciu aplikácie:
(načítanie všetkých dostupných portov v počítači kde beží aplikácia)
(načítanie obrázkov)


<source lang="c">
<source lang="c">
/* A nezabudnite zdroják hojne komentovať  */


int main(void) {
private void Form1_Load(object sender, EventArgs e)
      
        {
    printf("Nacitanie portov!\n");
            foreach (string s in SerialPort.GetPortNames())    /* pre každý nájdený port  */
    return(0);
            {
}
                comboBox1.Items.Add(s);     /*pridá jeho názov do comboBox-u  */
            }
            try
            {
                Bitmap image = (Bitmap)Image.FromFile("Pics/Kompas.bmp");    /*načítanie obrázku ružice kompasu  */
                pictureBox1.Image = (Bitmap)image.Clone();
                Bitmap image2 = (Bitmap)Image.FromFile("Pics/Smer.bmp");   /*načítanie obrázku šípky pre smer natočenia senzoru*/
                pictureBox2.Image = (Bitmap)image2.Clone();
            }
            catch (Exception ex)
            {
                MessageBox.Show("Nebol nájdený obrázok kompasu. (Cesta: Pics/Kompas.bmp)", "Chýbajúci obrázok", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            }
        }
</source>  
</source>  


Riadok 141: Riadok 174:


<source lang="c">
<source lang="c">
/* A nezabudnite zdroják hojne komentovať  */


int main(void) {
string retazec = textBox1.Text;    /* uloženie načítaných dát zobrazených v textBox-e do premennej  */
   
string vzorka = ",";    /* kľúčový znak pre rozdelenie regulárneho výrazu  */
    printf("Nacitanie portov!\n");   
 
    return(0);   
string[] vysledok = Regex.Split(retazec, vzorka);    /*  uloženie rozdeleného reťazca do poľa reťazcov  */
}
double x = Convert.ToDouble(vysledok[0]);  /* konverzia dátového typu a uloženie do premennej x  */
double y = Convert.ToDouble(vysledok[1]);   /* konverzia dátového typu a uloženie do premennej y */
double z = Convert.ToDouble(vysledok[2]);   /* konverzia dátového typu a uloženie do premennej z */
 
</source>  
</source>  


Riadok 153: Riadok 188:


<source lang="c">
<source lang="c">
/* A nezabudnite zdroják hojne komentovať  */


int main(void) {
double deklinacia = 4.1833;    /* uváženie magnetickej deklinácie na základe polohy (http://www.magnetic-declination.com/)*/
      
double uhol=Math.Atan2(x,y)*180/Math.PI;    /* výpočet uhla zo súradníc a prepočet z radiánov na stupne */
    printf("Nacitanie portov!\n");
 
    return(0);
         
}
uhol = uhol + deklinacia;  /* pričítanie zistenej magnetickej deklinácie */
 
uhol = Math.Truncate(uhol * 100) / 100;  /* orezanie vypočítanej hodnoty na 2 desatinné miesta */
 
uhol = 2*(uhol - 100)+25;    /* linearizácia vypočítaného uhla pre aproximovaný uhol natočenia obrázku */
 
            if (uhol < 0)
                uhol += 360;     /* úprava uhla na rozmedzie 0-360° */
 
            if (uhol > 360)
                uhol -= 360;
 
label1.Text = "Uhol: " + uhol.ToString() + "°";   /* pomocný výpis vypočítaného celkového uhla natočenia */
 
</source>  
</source>  


Riadok 165: Riadok 212:


<source lang="c">
<source lang="c">
/* A nezabudnite zdroják hojne komentovať  */
/* otočenie obrázku okolo bodu o príslušný uhol pomocou funkcie*/
public Bitmap RotateImage(Image image, PointF offset, float angle)
        {
            if (image == null)
                throw new ArgumentNullException("image");    /* výnimka pre nenačítaný obrázok*/


int main(void) {
            //nový prázdny obrázok do ktorého sa vloží otočený
   
            Bitmap rotatedBmp = new Bitmap(image.Width, image.Height);
    printf("Nacitanie portov!\n");
            rotatedBmp.SetResolution(image.HorizontalResolution, image.VerticalResolution);
     return(0);
 
}
            //vytvorenie objektu graphics z prázdneho obrázku
            Graphics g = Graphics.FromImage(rotatedBmp);
 
            //presun bodu rotácie do stredu obrázku
            g.TranslateTransform(offset.X, offset.Y);
 
            //samotné otočenie
            g.RotateTransform(angle);
 
            //presun obrázku späť
            g.TranslateTransform(-offset.X, -offset.Y);
 
            //vkreslenie otoceného obrázk do prázdneho objektu graphics
            g.DrawImage(image, new PointF(0, 0));
 
            return rotatedBmp;  /* vráť otočený obrázok*/
        }
 
try
  {            
  Bitmap image = (Bitmap)Image.FromFile("Pics/Kompas.bmp");
  pictureBox1.Image = RotateImage(image, new PointF(200, 200), (float)uhol);
  }
catch (Exception ex)
  {
     MessageBox.Show("Nebol nájdený obrázok kompasu. (Cesta: Pics/Kompas.bmp)", "Chýbajúci obrázok", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
  }
</source>  
</source>  


Riadok 177: Riadok 254:




Zdrojový kód: [[Médiá:Serial.h|serial.h]] a [[Médiá:Pip.c|main.c]]
Zdrojový kód pre Arduino: [[Médiá:Kompas_ard.ino]]
 
[[Médiá:MojProgram.c|program.c]]


=== Overenie ===
Projekt pre vizualizáciu: [[Médiá:Kompas_viz_projekt.zip]]


Nezabudnite napísať čosi ako užívateľský návod. Z neho by malo byť jasné čo program robí,
=== Overenie a používateľská príručka ===
ako sa prejavuje a aké má užívateľské rozhranie (čo treba stlačiť, čo sa kde zobrazuje).
Ak ste namerali nejaké signály, sem s nimi. Ak je výsledkom nejaký údaj na displeji,
odfotografujte ho.


Vytvorená aplikácia pracuje ako elektronický kompas, ktorý ukazuje aktuálnu polohu natočenia senzoru. Namerané dáta sa zo senzoru pripojeného k mikropočítaču prostredníctvom zbernice I2C čítajú do programového prostredia vytvoreného v prostredí Arduino aktuálne nahratého do mikropočítača. Výsledné namerané dáta sú následne odosielané na príslušný sériový port vo forme súradníc (x,y,z). S nimi potom pracuje vizualizačná aplikácia, ktorá bola vytvorená v programovacom jazyku C#.  
Vytvorená aplikácia pracuje ako elektronický kompas, ktorý ukazuje aktuálnu polohu natočenia senzoru. Namerané dáta sa zo senzoru pripojeného k mikropočítaču prostredníctvom zbernice I2C čítajú do programového prostredia vytvoreného v prostredí Arduino aktuálne nahratého do mikropočítača. Výsledné namerané dáta sú následne odosielané na príslušný sériový port vo forme súradníc (x,y,z). S nimi potom pracuje vizualizačná aplikácia, ktorá bola vytvorená v programovacom jazyku C#.  
Riadok 194: Riadok 266:
Ukážka funkcionality aplikácie:
Ukážka funkcionality aplikácie:


[[Súbor:Kompas_animacia.jpg]]


[[Súbor:Kompas_animacia.jpg|center]]
'''Chyby senzora'''
Ako sme sa v dokumentácii senzora dozvedeli, modul je veľmi citlivý na akékoľvek kovové materiály. Vzhľadom na to, že sme projekt realizovali v počítačovom laboratóriu s vysokým množstvom takýchto súčiastok, merania neboli vo všetkých pokusoch presné. O tejto nepresnosti hovorí nasledujúci graf, ktorý zobrazuje nameranú polohu x a y súradníc natočenia na sever a ich vysoké výchylky. V zdrojovom kóde sa počíta pomer týchto dvoch súradníc pre výpočet uhla natočenia, čo negatívne vplýva na výsledný uhol. Ten môže aj po linearizácií dosiahnuť nekorektné hodnoty pre žiadanú svetovú stranu.
[[Súbor:graf_chyby.jpg|center]]


== Literatúra ==


* [https://www.parallax.com/sites/default/files/downloads/29133-CompassModuleHMC5883L-v1.1.pdf HMC5883L dokumentácia]
* [https://cdn-shop.adafruit.com/datasheets/HMC5883L_3-Axis_Digital_Compass_IC.pdf HMC5883L datasheet]
* [http://www.magnetic-declination.com/ Magnetická deklinácia]


Kľúčové slová 'Category', ktoré sú na konci stránky nemeňte.
Kľúčové slová 'Category', ktoré sú na konci stránky nemeňte.

Aktuálna revízia z 17:55, 25. máj 2016

Autori: Tomáš Kováč, Vladimír Šimčák
Študijný odbor: Aplikovaná mechatronika a elektromobilita 1. Ing. (2016)


Zadanie

Implementujte HMC5883L elektronický kompas, vytvorte program a vizualizáciu pre jeho používanie:

  • Nájdite si k senzorom datasheet
  • Nájdite si schémy zapojenia dosky
  • Na základe predošlých vedomostí navrhnite spôsob pripojenia k riadiacej jednotke
  • Napíšte základný demonštračný program využívajúci vaše funkcie
  • Vymyslite a demonštrujte vhodnú aplikáciu
  • Dokumentáciu odovzdajte prostredníctvom tejto wiki stránky.


Analýza

HMC5883L modul je magnetorezistívny obvod pozostávajúci z troch HMC118X senzorov pre tri osi. Integrovaný je 12 bitový AD prevodník pre presnosť kompasu 1 až 2 stupne. Senzor disponuje technoológiou AMR ktorá zaisťuje osovú citlivosť a linearitu. Princíp činnosti modulu spočíva v konverzii Zemského magnetického poľa na diferenciál napätia na troch osiach. Výstup tohto napätia sa dá nasledovne spracovať pre rôzne účely. Senzor sa využíva napríklad pre nízkonákladovú navigáciu alebo magnetometriu.


Špecifikácia senzora:

  • Napájanie: 2.7 až 6.5 VDC
  • Komunikačné prostredie: I2C (do 400kHz)
  • Operačné teploty: -30 až +85 °C
  • Rozmery: 1.9 x 1.7 cm



Zapojenie modulu

Senzor HMC5883L využíva na komunikáciu zbernicu I2C, na ktorú sa pripojí ako slave zariadenie pod master zariadením, ako je napríklad mikrokontroler. Podporuje štandardné (100kHz) aj rýchle módy (400kHz).


HMC5883L dokumentácia

HMC5883L datasheet

Popis riešenia

Z webovej stránky produktu sme stiahli voľne dostupnú dokumentáciu pre náš senzor. Zoznámili sme sa s modulom, zistili jeho vlastnosti a oboznámili sa s jednotlivými pinmi.

Popis pinov:

  • GND - uzemnenie
  • VIN - napätie zdroja
  • DRDY - Data Ready, interrupt - nie je nutný pre náš projekt
  • SCL - I2C clock
  • SDA - I2C data


Schéma zapojenia snímača

Po naštudovaní dokumentácie sme senzor zapojili na dosku podľa nasledujúcej schémy.


Na pripojenie senzora k doske sme nepotrebovali externé pull-up rezistory vzhľadom na to, že už sú integrované v samotnom senzore (4k7 na SDA a 2k2 na SCL linke). Samotné zapojenie na doske, ktorú sme dostali, vyzerá nasledovne.



Overili sme funkčnosť senzora jednoduchým programom pre čítanie dát, ktorý sme ďalej upravili do žiadanej formy (viď nasledujúca kapitola).


Algoritmus a program

Algoritmus pre mikropočítač bol vytvorený v programovom prostredí Arduino. Údaje namerané senzorom sú z registrov prostredníctvom zbernice I2C načítavané do mikropočítača a následne odosielané na rozhranie sériového portu, kde s nimi pracuje vizualizačná aplikácia vytvorená v programovacom jazyku C#, vo vývojovom prostredí Visual Studio 2015.

Algoritmus pre mikropočítač:

#include <Wire.h>       /* knižnica pre prácu so zbernicou I2C*/

void setup(){
  Serial.begin(9600);
  Wire.begin();
  
  Wire.beginTransmission((byte)0x1E);     /*  začiatok komunikácie  */
  Wire.write((byte)0x02);     /*  nastavenie registra*/
  Wire.write((byte)0x00);     /* opakované meranie */
  Wire.endTransmission();
}


void loop(){
  
  int x,y,z;    /*  premenné v ktorých budú uložené namerané súradnice*/
 
  /* Zápis dát do registra */
  Wire.beginTransmission((byte)0x1E);
  Wire.write((byte)0x03);     /* zápis do tretieho registra  */
  Wire.endTransmission();
  
 
 /* Čítanie dát, 6B (2B pre každú súradnicu)*/
  Wire.requestFrom((byte)0x1E, 6);
  if(6<=Wire.available()){
    
    x = Wire.read()<<8; /* Most significant byte pre x*/
    x |= Wire.read();  /* Least significant byte pre x*/

    z = Wire.read()<<8; /* Most significant byte pre z*/
    z |= Wire.read(); /* Least significant byte pre z*/

    y = Wire.read()<<8; /* Most significant byte pre y*/
    y |= Wire.read(); /* Least significant byte pre y*/
  }
  
  // výpis súradníc v správnom formáte
  Serial.print(x);
  Serial.print(",");
  Serial.print(y);
  Serial.print(",");
  Serial.println(z);
 
  delay(500);
}

Vizualizácia riešenia sa skladá z niekoľkých častí, ich podstatné časti sa nachádzajú nižšie.

Vizualizačná aplikácia:


Vývojový diagram pre funkcionalitu aplikácie:


Časť kódu pre inicializáciu aplikácie: (načítanie všetkých dostupných portov v počítači kde beží aplikácia) (načítanie obrázkov)

private void Form1_Load(object sender, EventArgs e)
        {
            foreach (string s in SerialPort.GetPortNames())    /* pre každý nájdený port  */
            {
                comboBox1.Items.Add(s);     /*pridá jeho názov do comboBox-u   */
            }
            try
            {
                Bitmap image = (Bitmap)Image.FromFile("Pics/Kompas.bmp");    /*načítanie obrázku ružice kompasu   */
                pictureBox1.Image = (Bitmap)image.Clone();
                Bitmap image2 = (Bitmap)Image.FromFile("Pics/Smer.bmp");    /*načítanie obrázku šípky pre smer natočenia senzoru*/
                pictureBox2.Image = (Bitmap)image2.Clone();
            }
            catch (Exception ex)
            {
                MessageBox.Show("Nebol nájdený obrázok kompasu. (Cesta: Pics/Kompas.bmp)", "Chýbajúci obrázok", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            }
        }

Časť kódu pre parsovanie vstupu zo zvoleného COM portu:

string retazec = textBox1.Text;     /* uloženie načítaných dát zobrazených v textBox-e do premennej  */
string vzorka = ",";     /* kľúčový znak pre rozdelenie regulárneho výrazu  */

string[] vysledok = Regex.Split(retazec, vzorka);     /*  uloženie rozdeleného reťazca do poľa reťazcov  */
double x = Convert.ToDouble(vysledok[0]);   /* konverzia dátového typu a uloženie do premennej x  */
double y = Convert.ToDouble(vysledok[1]);   /* konverzia dátového typu a uloženie do premennej y  */
double z = Convert.ToDouble(vysledok[2]);   /* konverzia dátového typu a uloženie do premennej z  */

Výpočet uhla natočenia obrázku:

double deklinacia = 4.1833;     /* uváženie magnetickej deklinácie na základe polohy (http://www.magnetic-declination.com/)*/
double uhol=Math.Atan2(x,y)*180/Math.PI;    /* výpočet uhla zo súradníc a prepočet z radiánov na stupne */

          
uhol = uhol + deklinacia;   /* pričítanie zistenej magnetickej deklinácie */
  
uhol = Math.Truncate(uhol * 100) / 100;   /* orezanie vypočítanej hodnoty na 2 desatinné miesta */

uhol = 2*(uhol - 100)+25;    /* linearizácia vypočítaného uhla pre aproximovaný uhol natočenia obrázku */

            if (uhol < 0)
                uhol += 360;     /* úprava uhla na rozmedzie 0-360° */

            if (uhol > 360)
                uhol -= 360;

label1.Text = "Uhol: " + uhol.ToString() + "°";    /* pomocný výpis vypočítaného celkového uhla natočenia */

Otočenie obrázku o príslušný uhol:

/* otočenie obrázku okolo bodu o príslušný uhol pomocou funkcie*/
public Bitmap RotateImage(Image image, PointF offset, float angle)
        {
            if (image == null)
                throw new ArgumentNullException("image");     /* výnimka pre nenačítaný obrázok*/

            //nový prázdny obrázok do ktorého sa vloží otočený
            Bitmap rotatedBmp = new Bitmap(image.Width, image.Height);
            rotatedBmp.SetResolution(image.HorizontalResolution, image.VerticalResolution);

            //vytvorenie objektu graphics z prázdneho obrázku
            Graphics g = Graphics.FromImage(rotatedBmp);

            //presun bodu rotácie do stredu obrázku
            g.TranslateTransform(offset.X, offset.Y);

            //samotné otočenie
            g.RotateTransform(angle);

            //presun obrázku späť
            g.TranslateTransform(-offset.X, -offset.Y);

            //vkreslenie otoceného obrázk do prázdneho objektu graphics
            g.DrawImage(image, new PointF(0, 0));

            return rotatedBmp;   /* vráť otočený obrázok*/
        }

try
   {             
   Bitmap image = (Bitmap)Image.FromFile("Pics/Kompas.bmp");
   pictureBox1.Image = RotateImage(image, new PointF(200, 200), (float)uhol); 
   }
catch (Exception ex)
   {
    MessageBox.Show("Nebol nájdený obrázok kompasu. (Cesta: Pics/Kompas.bmp)", "Chýbajúci obrázok", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
   }

Zvyšná časť programu sa nachádza v priložených súboroch.


Zdrojový kód pre Arduino: Médiá:Kompas_ard.ino

Projekt pre vizualizáciu: Médiá:Kompas_viz_projekt.zip

Overenie a používateľská príručka

Vytvorená aplikácia pracuje ako elektronický kompas, ktorý ukazuje aktuálnu polohu natočenia senzoru. Namerané dáta sa zo senzoru pripojeného k mikropočítaču prostredníctvom zbernice I2C čítajú do programového prostredia vytvoreného v prostredí Arduino aktuálne nahratého do mikropočítača. Výsledné namerané dáta sú následne odosielané na príslušný sériový port vo forme súradníc (x,y,z). S nimi potom pracuje vizualizačná aplikácia, ktorá bola vytvorená v programovacom jazyku C#.

Natívne prostredie aplikácie umožňuje jednoduchý spôsob jej ovládania ako aj takmer okamžité zobrazenie výsledného natočenia senzoru. Po spustení aplikácie sa užívateľovi zobrazí možnosť výberu jedného z aktuálne dostupných sériových COM portov. Tu je nutné aby užívateľ aplikácie správne zvolil port, na ktorý mikropočítač odosiela namerané dáta. V prípade zvolenia jedného s príslušných portov a jeho úspešnom otvorení aplikácia začne okamžite z daného portu čítať dáta. V našom prípade je nevyhnutné aby na zvolený sériový port boli odosielané dáta v správnom tvare súradníc (x,y,z), ktoré zaručí program nahraný v mikropočítači. Načítané súradnice sú pri správnom načítaní zobrazené v príslušnom textovom poli. Aplikácia z nich následne vypočíta uhol natočenia senzora a aproximuje k nemu natočenie "kompasu" reprezentovaného obrázkom ružice kompasu. Červená šípka v aplikácii ukazuje aktuálne natočenie senzora. Teda napríklad ak šípka ukazujúca smer natočenia senzora a smer "W" (west - západ) ležia na jednej priamke prechádzajúcej stredom ružice znamená to, že senzor ja aktuálne natočený na príslušnú svetovú stranu - západ.

Ukážka funkcionality aplikácie:



Chyby senzora

Ako sme sa v dokumentácii senzora dozvedeli, modul je veľmi citlivý na akékoľvek kovové materiály. Vzhľadom na to, že sme projekt realizovali v počítačovom laboratóriu s vysokým množstvom takýchto súčiastok, merania neboli vo všetkých pokusoch presné. O tejto nepresnosti hovorí nasledujúci graf, ktorý zobrazuje nameranú polohu x a y súradníc natočenia na sever a ich vysoké výchylky. V zdrojovom kóde sa počíta pomer týchto dvoch súradníc pre výpočet uhla natočenia, čo negatívne vplýva na výsledný uhol. Ten môže aj po linearizácií dosiahnuť nekorektné hodnoty pre žiadanú svetovú stranu.


Literatúra

Kľúčové slová 'Category', ktoré sú na konci stránky nemeňte.