Operácie

IMU jednotka s 10DOF: Rozdiel medzi revíziami

Z SensorWiki

 
(43 medziľahlých úprav od 2 ďalších používateľov nie je zobrazených)
Riadok 1: Riadok 1:
 +
Balogh: chyba opis pouzitych senzorov
 +
 
{|
 
{|
 
|Autori:      || '''Martin Supek, Zdenko Pucovski'''  
 
|Autori:      || '''Martin Supek, Zdenko Pucovski'''  
Riadok 4: Riadok 6:
 
|Študijný odbor:  || Aplikovaná mechatronika a elektromobilita || 1. Ing.  ('''2019''')  
 
|Študijný odbor:  || Aplikovaná mechatronika a elektromobilita || 1. Ing.  ('''2019''')  
 
|}
 
|}
 +
 +
 +
 +
__TOC__
 +
  
 
== Zadanie ==
 
== Zadanie ==
  
Úlohou bolo oboznámiť sa s princípom senzora L3GD20H - gyroskop
+
Úlohou bolo oboznámiť sa s princípom senzora Adafruit IMU 10DOF.
  
 
Pripojiť ho k mikrokontroléru a vyčítať s neho dáta ktoré sa potom pomocou zvoleného súboru obj. zobrazia ako vizualizačná aplikácia.
 
Pripojiť ho k mikrokontroléru a vyčítať s neho dáta ktoré sa potom pomocou zvoleného súboru obj. zobrazia ako vizualizačná aplikácia.
 +
  
  
Riadok 42: Riadok 50:
  
  
 +
'''Arduino UNO'''
 +
 +
Vývojová doska s mikroprocesorom ATmega328P s 32KB Flash pamäte, 1 KB EEPROM, 2KB SRAM pamäte.
  
 +
Softvér na programovanie používame Arduino IDE.
  
 +
Popis jednotlivých pinov:
  
 +
[[Súbor:arduino-uno-r3-development-board.jpg|center|600px]]
  
  
'''Arduino UNO'''
 
  
Vývojová doska s mikroprocesorom ATmega328P s 32KB Flash pamäte, 1 KB EEPROM, 2KB SRAM pamäte.
 
Softwér na programovanie používame Arduino IDE.
 
  
[[Súbor:arduino-uno-r3-development-board.jpg|center|600px]]
+
'''Literatúra:'''
  
 +
[https://learn.adafruit.com/adafruit-10-dof-imu-breakout-lsm303-l3gd20-bmp180/design-files Datasheet Adafruit 10DOF]
  
 +
[https://www.terraelectronica.ru/pdf/show?pdf_file=%2Fz%2FDatasheet%2F1%2F10+DOF+IMU+Sensor+User+Manual.pdf IMU 10DOF Manual]
  
[[Médiá:MojZdrojak.c]]
+
https://learn.adafruit.com/ahrs-for-adafruits-9-dof-10-dof-breakout/visualizing-data?fbclid=IwAR3zc6-GW1_TjWuEX6jwo6jEN9aT7xU3RGTmduINXHhos84VY7UjXYnFOTo
  
 +
https://en.wikipedia.org/wiki/Attitude_and_heading_reference_system
  
'''Literatúra:'''
 
* Zoznam použitej literatúry, vrátane katalógových údajov (datasheet), internetových odkazov a pod.
 
  
__TOC__
 
  
 
== Analýza ==
 
== Analýza ==
  
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:
 
  
* popis komunikačnej zbernice (i2c, 1-wire, RS-232 a pod.)
+
* popis komunikačnej zbernice:
* obrázok zapojenia vývodov použitej súčiastky
+
 
* odkaz na katalógový list
+
I2C je počítačová zbernica, vyvinutá firmou Philips. Používa sa na pripojenie rôznych periférií, pričom na prenos údajov sa používajú dva vodiče.
* priebehy dôležitých signálov
+
 
* este jedna polozka
+
Komunikácia prebieha tak, že jedno zariadenia hrá úlohu mastera (ovláda ostatné) a ostatné zariadenia hrajú úlohu slave.
 +
 
 +
V našom prípade budeme predpokladať, že master je Arduino. Slave bude náš senzor.
 +
 
 +
Master - Zahajuje komunikáciu a aktívne posiela alebo číta z podriadených zariadení. Master pozná adresu každého zariadenia a keď potrebuje osloviť konkrétne zariadenie, urobí to pomocou tejto adresy.
 +
 
 +
Slave - Takéto zariadenia čaká na svoje oslovenie a keď ho master osloví, podľa okolnosti si len prečíta, čo za údaje dostalo, alebo odpovie nejakými inými údajmi.
 +
 
 +
 
 +
* orientácia použitého objektu
 +
 
 +
Eulerove uhly (https://adafru.it/ddl) opisujú orientáciu (v stupňoch) okolo jedného referenčného bodu v trojrozmernom priestore.
 +
 
 +
Pre tri uhly sa používajú rôzne názvy, ale najbežnejšia terminológia s lietadlom je Roll (x), Pitch (y) a Yaw (z).
 +
 
 +
Normálne majú kladný aj záporný uhol (-180 ° až 180 °) v závislosti od smeru naklonenia lietadla, s 0 ° v každom
 +
 
 +
smere, ktorý zodpovedá zarovnaniu lietadla s každou osou.
 +
 
 +
[[Súbor:lietadlo.jpg|center|500px]]
 +
 
 +
 
 +
* monitorovanie hodnôt zo snímača
 +
 
 +
Z nasledujúceho obrázka vidíme, že roll je asi 18 °, výška pitch je asi 78 ° a zatáčanie (yaw) je asi 32 °,
 +
skica sa bude aktualizovať s najnovšími hodnotami pri akejkoľvek rýchlosti, ktorú sme nastavili.
 +
 
 +
[[Súbor:monitor.jpg|center|400px]]
  
 
== Popis riešenia ==
 
== Popis riešenia ==
  
Sem opíšete ako konkrétne ste problém vyriešili. Začnite popisom pripojenia k procesoru
 
(nezabudnite na schému zapojenia!) a zdôraznite ktoré jeho periférie ste pritom využili.
 
  
'''Schéma zapojenia snímača'''
+
Pripojenie k zariadeniu Arduino sme vyriešili nasledovne, napájanie Vin a GND s napätím 3-5VDC a zapojenie I2C údajov do SCL a SDA konektorov.
[[Súbor:Zapojenie.png]]
+
 
 +
'''Zapojenie vývodov použitého snímača'''
 +
 
 +
 
 +
[[Súbor:picture1.jpg|center|500px]]
 +
 
 +
Zapojenie pinov senzora IMU jednotky s 10DOF:
 +
* SCL pin na Arduino analógový pin A5
 +
* SDA pin na Arduino analógový pin A4
 +
* VIN pin na napájanie 5V z Arduino UNO
 +
* GND pin na zem GND z Arduino UNO
 +
 
 +
 
 +
[[Súbor:stihacka.png|center|700px]]
  
[[Súbor:Example.jpg]]
 
  
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]]
 
  
 
=== Algoritmus a program ===
 
=== 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'':
 
  
 
<source lang="c">
 
<source lang="c">
/* A nezabudnite zdroják hojne komentovať  */
 
  
int main(void) {
+
// inicializujeme premenne ziskavane zo senzora
      
+
  float roll  = 0.0F;
     printf("Hello, World!\n");   
+
  float pitch = 0.0F;
     return(0);
+
  float yaw  = 0.0F;
 +
  float temp  = 0.0F;
 +
  float alt  = 0.0F;
 +
 
 +
// nacitame .obj 3D model vybraneho objektu - stihacky
 +
  OBJModel model;
 +
  model = new OBJModel(this);
 +
  model.load("stihacka.obj");
 +
  model.scale(20);
 +
 
 +
// nacitanie a spracovavanie dat zo senzora
 +
  void serialEvent(Serial p)
 +
{
 +
  String incoming = p.readString(); //nacitame prichadzajuci string zo senzora
 +
  if (printSerial) {
 +
    println(incoming); //ak je dostupny text, tak ho vypiseme do konzoly
 +
  }
 +
 
 +
  if ((incoming.length() > 8)) //pokial sme nacitali celu ocakavanu dlzku retazca, tak ho spracujeme
 +
  {
 +
     String[] list = split(incoming, " "); // rozdelime string po medzerach na slova do zoznamu
 +
     if ( (list.length > 0) && (list[0].equals("Orientation:")) ) // ak je prve slovo "Orientation:"
 +
    {
 +
      roll  = float(list[1]);  // ulozime dalsie slova zo stringu do premennych na dalsie nasledne spracovanie
 +
      pitch = float(list[2]);
 +
      yaw  = float(list[3]);
 +
      buffer = incoming;
 +
    }
 +
     if ( (list.length > 0) && (list[0].equals("Alt:")) )
 +
    {
 +
      alt  = float(list[1]);
 +
      buffer = incoming;
 +
    }
 +
    // ... podobne nacitame teplotu temp
 
}
 
}
 +
 +
 +
// posunieme objekt dalej od pociatocneho bodu 0,0
 +
  translate(200, 300, 0);
 +
 +
// Pripravime pootoceny objekt podla nacitanych hodnot rotacie osi X/Y/Z(hodnoty su v radianoch, 0..Pi*2)
 +
  rotateX(radians(roll));
 +
  rotateZ(radians(pitch));
 +
  rotateY(radians(yaw));
 +
  ...
 +
  model.draw(); //vykreslime aktulizovanu poziciu modelu
 +
 
</source>
 
</source>
  
 
Nezabudnite však nahrať aj kompletné zdrojové kódy vášho programu!
 
Nezabudnite však nahrať aj kompletné zdrojové kódy vášho programu!
  
Zdrojový kód: [[Médiá:Serial.h|serial.h]] a [[Médiá:Pip.c|main.c]]
+
Zdrojový kód:
  
[[Médiá:MojProgram.c|program.c]]
+
Processing 2: [[Médiá:dof_rotate.pde|dof_rotate.pde]] a [[Médiá:dof-serialconfig.txt|dof-serialconfig.txt]]
  
 +
Arduino: [[Médiá:dofahrs.ino|dofahrs.ino]]
  
 +
Testovací kód pre 10DOF senzor (Arduino): [[Médiá:10dof-test.ino|10dof-test.ino]]
  
 +
3D model stíhačky vo formáte OBJ: [[Médiá:Dof-stihacka.obj|dof-stihacka.obj]]
  
 
=== Overenie ===
 
=== Overenie ===
  
Nezabudnite napísať čosi ako užívateľský návod. Z neho by malo byť jasné čo program robí,  
+
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,  
+
Pre spustenie programu pre IMU jednotku s 10 DOF potrebujeme nasledujúci softvér a doplnky:
odfotografujte ho.  
+
* Processing 2.2.1 - hlavné vývojové prostredie, je potrebné použiť verziu 2.x, kvôli kompatibilite [https://processing.org/ web Processing]
 +
* Saito's OBJ Loader - doplnok na načítanie .obj 3D modelu objektu, [https://code.google.com/p/saitoobjloader/#Download inštalácia]
 +
* G4P GUI library  - doplnok na vizualizáciu v Processing, [http://sourceforge.net/projects/g4p/files/?source=navbar inštalácia]
 +
* Adafruit_AHRS knižnicu - obsahuje Adafruit_10DOF hlavičkové súbory, funkcie a príklady pre 10DOF senzor
 +
* 3D model objektu vo formáte .obj bez textúry, ktorý chceme vizualizovať
 +
 
 +
 
 +
 
 +
 
 +
 
 +
 
  
Kľúčové slová 'Category', ktoré sú na konci stránky nemeňte.
 
  
  

Aktuálna revízia z 09:56, 20. jún 2019

Balogh: chyba opis pouzitych senzorov 
Autori: Martin Supek, Zdenko Pucovski
Študijný odbor: Aplikovaná mechatronika a elektromobilita 1. Ing. (2019)



Zadanie

Úlohou bolo oboznámiť sa s princípom senzora Adafruit IMU 10DOF.

Pripojiť ho k mikrokontroléru a vyčítať s neho dáta ktoré sa potom pomocou zvoleného súboru obj. zobrazia ako vizualizačná aplikácia.



Použité zariadenia

Senzor Adafruit IMU 10DOF

Inerciálna pohybová jednotka (IMU) je elektronické senzorové zariadenie obsahujúce niekoľko senzorov - akcelerometer, gyroskop či magnetometer (kompas).

Je to dôležitý komponent riadenia lietajúcich strojov, ale stáva sa aj súčasťou autonómnych automobilov či spotrebnej elektroniky.

Senzor imu.jpg


Všetky snímače na Adafruit 10DOF komunikujú cez I2C zbernicu. Vďaka tomu je jednoduché nastavenie s minimálnym počtom káblov.

Táto doska využíva existujúce Adafruit ovládače pre LSM303DLHC (akcelerometer a magnetometer), L3GD20 (gyroskop) a BMP180 (snímač tlaku / nadmorskej výšky).



Príručky použitých ovládačov:

 LSM303DLHC
 L3GD20
 BMP180


Arduino UNO

Vývojová doska s mikroprocesorom ATmega328P s 32KB Flash pamäte, 1 KB EEPROM, 2KB SRAM pamäte.

Softvér na programovanie používame Arduino IDE.

Popis jednotlivých pinov:

Arduino-uno-r3-development-board.jpg



Literatúra:

Datasheet Adafruit 10DOF

IMU 10DOF Manual

https://learn.adafruit.com/ahrs-for-adafruits-9-dof-10-dof-breakout/visualizing-data?fbclid=IwAR3zc6-GW1_TjWuEX6jwo6jEN9aT7xU3RGTmduINXHhos84VY7UjXYnFOTo

https://en.wikipedia.org/wiki/Attitude_and_heading_reference_system


Analýza

  • popis komunikačnej zbernice:

I2C je počítačová zbernica, vyvinutá firmou Philips. Používa sa na pripojenie rôznych periférií, pričom na prenos údajov sa používajú dva vodiče.

Komunikácia prebieha tak, že jedno zariadenia hrá úlohu mastera (ovláda ostatné) a ostatné zariadenia hrajú úlohu slave.

V našom prípade budeme predpokladať, že master je Arduino. Slave bude náš senzor.

Master - Zahajuje komunikáciu a aktívne posiela alebo číta z podriadených zariadení. Master pozná adresu každého zariadenia a keď potrebuje osloviť konkrétne zariadenie, urobí to pomocou tejto adresy.

Slave - Takéto zariadenia čaká na svoje oslovenie a keď ho master osloví, podľa okolnosti si len prečíta, čo za údaje dostalo, alebo odpovie nejakými inými údajmi.


  • orientácia použitého objektu

Eulerove uhly (https://adafru.it/ddl) opisujú orientáciu (v stupňoch) okolo jedného referenčného bodu v trojrozmernom priestore.

Pre tri uhly sa používajú rôzne názvy, ale najbežnejšia terminológia s lietadlom je Roll (x), Pitch (y) a Yaw (z).

Normálne majú kladný aj záporný uhol (-180 ° až 180 °) v závislosti od smeru naklonenia lietadla, s 0 ° v každom

smere, ktorý zodpovedá zarovnaniu lietadla s každou osou.

Lietadlo.jpg


  • monitorovanie hodnôt zo snímača

Z nasledujúceho obrázka vidíme, že roll je asi 18 °, výška pitch je asi 78 ° a zatáčanie (yaw) je asi 32 °, skica sa bude aktualizovať s najnovšími hodnotami pri akejkoľvek rýchlosti, ktorú sme nastavili.

Monitor.jpg

Popis riešenia

Pripojenie k zariadeniu Arduino sme vyriešili nasledovne, napájanie Vin a GND s napätím 3-5VDC a zapojenie I2C údajov do SCL a SDA konektorov.

Zapojenie vývodov použitého snímača


Picture1.jpg

Zapojenie pinov senzora IMU jednotky s 10DOF:

  • SCL pin na Arduino analógový pin A5
  • SDA pin na Arduino analógový pin A4
  • VIN pin na napájanie 5V z Arduino UNO
  • GND pin na zem GND z Arduino UNO


Stihacka.png



Algoritmus a program

// inicializujeme premenne ziskavane zo senzora
  float roll  = 0.0F;
  float pitch = 0.0F;
  float yaw   = 0.0F;
  float temp  = 0.0F;
  float alt   = 0.0F;

// nacitame .obj 3D model vybraneho objektu - stihacky
  OBJModel model;
  model = new OBJModel(this);
  model.load("stihacka.obj");
  model.scale(20);

// nacitanie a spracovavanie dat zo senzora
  void serialEvent(Serial p) 
{
  String incoming = p.readString(); //nacitame prichadzajuci string zo senzora
  if (printSerial) {
    println(incoming); //ak je dostupny text, tak ho vypiseme do konzoly
  }
  
  if ((incoming.length() > 8)) //pokial sme nacitali celu ocakavanu dlzku retazca, tak ho spracujeme
  {
    String[] list = split(incoming, " "); // rozdelime string po medzerach na slova do zoznamu
    if ( (list.length > 0) && (list[0].equals("Orientation:")) ) // ak je prve slovo "Orientation:"
    {
      roll  = float(list[1]);  // ulozime dalsie slova zo stringu do premennych na dalsie nasledne spracovanie
      pitch = float(list[2]);
      yaw   = float(list[3]);
      buffer = incoming;
    }
    if ( (list.length > 0) && (list[0].equals("Alt:")) ) 
    {
      alt  = float(list[1]);
      buffer = incoming;
    }
    // ... podobne nacitame teplotu temp
}


// posunieme objekt dalej od pociatocneho bodu 0,0
  translate(200, 300, 0);

// Pripravime pootoceny objekt podla nacitanych hodnot rotacie osi X/Y/Z(hodnoty su v radianoch, 0..Pi*2)
  rotateX(radians(roll));
  rotateZ(radians(pitch));
  rotateY(radians(yaw));
  ...
  model.draw(); //vykreslime aktulizovanu poziciu modelu

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

Zdrojový kód:

Processing 2: dof_rotate.pde a dof-serialconfig.txt

Arduino: dofahrs.ino

Testovací kód pre 10DOF senzor (Arduino): 10dof-test.ino

3D model stíhačky vo formáte OBJ: dof-stihacka.obj

Overenie

Pre spustenie programu pre IMU jednotku s 10 DOF potrebujeme nasledujúci softvér a doplnky:

  • Processing 2.2.1 - hlavné vývojové prostredie, je potrebné použiť verziu 2.x, kvôli kompatibilite web Processing
  • Saito's OBJ Loader - doplnok na načítanie .obj 3D modelu objektu, inštalácia
  • G4P GUI library - doplnok na vizualizáciu v Processing, inštalácia
  • Adafruit_AHRS knižnicu - obsahuje Adafruit_10DOF hlavičkové súbory, funkcie a príklady pre 10DOF senzor
  • 3D model objektu vo formáte .obj bez textúry, ktorý chceme vizualizovať





Späť na zoznam projektov...