Operácie

Senzory HMC5883L Kompas a VNCL4000 Proximity: Rozdiel medzi revíziami

Z SensorWiki

(Algoritmus a program)
 
Riadok 1: Riadok 1:
 
{|
 
{|
|Autori:      || '''Ján Mrkvička, Jozef Kuleha'''  
+
|Autori:      || '''Peter Melek, Peter Juhász'''  
 
|-
 
|-
|Študijný odbor:  || Aplikovaná mechatronika || 2. Ing.  ('''2013''')  
+
|Študijný odbor:  || Aplikovaná mechatronika || 1. Ing.  ('''2018''')  
 
|}
 
|}
  
  
'''A.''' '''Proximitný snímač VCNL4000'''
+
'''A.''' '''Ultrazvukový snímač SRF08'''
  
Treba popísať ako senzor funguje, čo všetko sa ním merať, pripojiť ho k procesoru a vymyslieť
+
Senzor funguje na základe prepočtu času návratu odrazenej zvukovej vlny od prekážky. Pri známej rýchlosti zvuku
ukážkovú aplikáciu.
+
sa tento čas následne prepočítať na vzdialenosť vo zvolených jednotkách, v našom prípade pracujeme s cm.
 +
Pre lepšiu presnosť senzora je možné brať do úvahy aj teplotu okolia. K mikropočítaču je senzor pripájaný zbernicou I2C.
  
[[Obrázok:SparkFun_Vcnl4000.jpeg |300px|center]]
+
Senzorom je možné merať všeobecnú vzdialenosť prekážok do vzdialenosti v jednotkách metrov (spolahlivosť do vzdialenosti
 +
cca 2 metre), čo je pre našu aplikáciu postačujúce. Senzor zároveň dokáže merať intenzitu svetla, čo môže byť opäť
 +
užitočné pri vyhodnocovaní prekážok.
  
* [https://www.sparkfun.com/products/10901 Product page]
+
 
* [http://dlnmh9ip6v2uc.cloudfront.net/datasheets/BreakoutBoards/vcnl4000.pdf Sensor datasheet]
+
[[Obrázok:SRF08_ultrazvuk_senzor01.jpg |300px]]
* [http://dlnmh9ip6v2uc.cloudfront.net/datasheets/BreakoutBoards/vcnl4000App.pdf Application note]
+
 
* [http://homepage.hispeed.ch/peterfleury/group__pfleury__ic2master.html i2c library]
+
* [https://www.robot-electronics.co.uk/htm/srf08tech.html Technická špecifikácia SRF08]
 +
 
 +
* [https://playground.arduino.cc/Main/SonarSrf08 Arduino zapojenie SRF08]
  
  
 
'''H.''' ''' Compass Module 3-Axis HMC5883L'''
 
'''H.''' ''' Compass Module 3-Axis HMC5883L'''
  
Treba popísať ako funguje samotný senzor, ako sa pripojí k mikropočítaču a čo vlastne meria.  
+
Modul kompasu funguje na základe merania intenzity magnetického poľa v troch osiach. Na základe magnetického poľa vyhodnocuje
Naprogramujte nejakú aplikáciu
+
rozdielové napätie v troch osiach, ktoré následne môžeme prepočítať na uhlové výchylky. Rovnako ako ultrazvukový senzor, aj
 +
senzor kompasu komunikuje s mikropočítačom cez I2C zbernicu.
 +
 
 +
Senzor je možné využiť na všeobecné riadenie natočenia pri akýchkoľvek pohybujúcich sa aplikáciách v 2D alebo 3D priestore.
 +
Môže byť využitý napr. pri pohybe robotov. V našej aplikácii bude pohyb zabezpečovaný ručne a budeme pracovať v rovine.
  
 
[[Obrázok:Parallax_HMC5883.png|300px]]
 
[[Obrázok:Parallax_HMC5883.png|300px]]
  
'''Literatúra:'''<br>
+
* [https://www.parallax.com/product/29133 Stránka produktu]
<!-- * Zoznam použitej literatúry, vrátane katalógových údajov (datasheet), internetových odkazov a pod.-->
+
 
[https://www.parallax.com/product/29133 Stránka produktu]
+
* [https://www.parallax.com/sites/default/files/downloads/29133-CompassModuleHMC5883L-v1.1.pdf Datasheet modulu senzora kompasu]
<br>
+
 
[https://www.parallax.com/sites/default/files/downloads/29133-CompassModuleHMC5883L-v1.1.pdf Datasheet modulu senzora]
+
* [https://www.parallax.com/sites/default/files/downloads/29133-HMC5883L-3-Axis-Digital-Compass-IC-Datasheet.pdf Datasheet čipu kompasu]
<br>
 
[https://www.parallax.com/sites/default/files/downloads/29133-HMC5883L-3-Axis-Digital-Compass-IC-Datasheet.pdf Datasheet čipu]
 
<br>
 
  
  
 
== Zadanie ==
 
== Zadanie ==
  
# Sem príde text zadania...
+
* Úlohou je skombinovať vyššie uvedené senzory a vytvoriť aplikáciu, ktorá zmysluplne kombinuje ich údaje.  
# Druhy '''riadok'''
 
  
[http://www.example.com link title]
+
* Nami zvolená aplikácia bude sonar, ktorý bude mapovať okolitý priestor zariadenia do vzdialenosti desiatok cm.
  
[[Súbor:MojObrazok2.jpg|center|300px]]
+
__TOC__
  
[[Médiá:MojZdrojak.c]]
+
== Analýza ==
  
 +
Sonar je zariadenie, ktoré slúži na echolokáciu t.j. zisťovanie polohy a tvaru predmetov v priestore s využitím ultrazvukového signálu. Našou úlohou je podobné zariadenie zostrojiť. Využívať pritom budeme ultrazvukový senzor SRF08, ktorý ultrazvukovú vlnu vysiela a zároveň i prijíma.
  
'''Literatúra:'''
+
Na určenie polohy respektíve uhla, v ktorom je senzor natočený budeme využívať kompas HMC5883L. Funguje na princípe snímania malých magnetických polí. Kompas rozoznáva natočenie vo všetkých troch osiach karteziánskom súradnicovom systéme ale v našom prevedení Sonaru budeme využívať iba natočenie v horizontálnej rovine.
* Zoznam použitej literatúry, vrátane katalógových údajov (datasheet), internetových odkazov a pod.
 
  
__TOC__
+
Oba snímače budú zapojené do zariadenia Arduino Uno, resp. do jeho klonu, cez zbernicu I2C.
  
== Analýza ==
+
Výstupom zo zariadenia bude graf sledovanej oblasti.
  
V tejto časti popíšete ako idete daný problém riešiť. Uvediete sem aj všetky potrebné technické údaje,
+
== Popis riešenia ==
ktoré sú potrebné na úspešné vyriešenie projektu. Napríklad:
 
  
* popis komunikačnej zbernice (i2c, 1-wire, RS-232 a pod.)
+
Snímače sme pripojili k Arduino Uno, resp. do jeho klonu podľa schémy zapojenia. Je veľmi dôležité zbernicu (obe časti, SDA aj SCL) ukončiť pripojením rezistorov o dostatočnom odpore, my sme zvolili 4,7kΩ, na GND.  
* obrázok zapojenia vývodov použitej súčiastky
 
* odkaz na katalógový list
 
* priebehy dôležitých signálov
 
* este jedna polozka
 
  
== Popis riešenia ==
+
Po pripojení napájania sme zistili adresu pripojených snímačov na zbernicu I2C. Pomocou I2C skenera sme vyčítali adresy na ktorých sú snímače pripojené. Následne sme v knižnici zdrojových kódov na nižšie uvedených odkazoch našli kódy k danému snímaču.
  
Sem opíšete ako konkrétne ste problém vyriešili. Začnite popisom pripojenia k procesoru
+
Kódy sme vhodne skombinovali a nastavili výstup na formát ''uhol_natocenia,vzdialenost_cm'' oddelené čiarkou a každá hodnota na novom riadku. Výstup na sériovú linku teda vyzerá nasledovne
(nezabudnite na schému zapojenia!) a zdôraznite ktoré jeho periférie ste pritom využili.  
 
  
'''Schéma zapojenia snímača'''
+
<source>180,10</source>
[[Súbor:Zapojenie.png]]
 
  
[[Súbor:Example.jpg]]
+
'''Zapojenie snímača'''
  
Pozn.: Názov obrázku musí byť jedinečný, uvedomte si, že Obr1.jpg už pred vami skúsilo
+
[[Súbor:Sonar_schema.png|500px]][[Súbor:Sonar_znazornenie_zap.png|300px]]
nahrať už aspoň 10 študentov.  
 
  
[[Súbor:MojObrazok.jpg|center|250px]]
+
'''Vychádzame zo zdrojových kódov'''
 +
* [https://www.robot-electronics.co.uk/htm/arduino_examples.htm#SRF02,%20SRF08,%20SRF10,%20SRF235 SRF08]
 +
* [https://learn.adafruit.com/adafruit-hmc5883l-breakout-triple-axis-magnetometer-compass-sensor/wiring-and-test HMC5883L]
  
 
=== Algoritmus a program ===
 
=== Algoritmus a program ===
  
Uveďte stručný popis algoritmu, v akom jazyku a verzii vývojového prostredia ste ho vytvorili.
+
==== Arduino ====
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'':
+
Program inicializuje oba senzory, následne pomocou knižnice pre kompas načíta hodnoty súradníc X, Y, Z a prevedie ich na radiány. Toto sa deje funkciami v knižniciach, v programe len voláme funkciu a spracujeme jej hodnoty. Nižšie uvedený úsek popisuje toto spracovanie.
  
 
<source lang="c">
 
<source lang="c">
/* A nezabudnite zdroják hojne komentovať  */
+
//Z eventu z knižnice načítame X a Y hodnoty, prepočítame na uhol
 +
float heading = atan2(event.magnetic.y, event.magnetic.x);
 +
 
 +
  // Odchýlka mag. pola pre Bratislavu, možno nájsť na http://www.magnetic-declination.com/
 +
  float declinationAngle = 0.07;
 +
  // Uhol upravený o odchýlku
 +
  heading += declinationAngle;
 +
 
 +
  // Dorovnanie pre prípad záporných hodnôt
 +
  if(heading < 0)
 +
    heading += 2*PI;
 +
   
 +
  if(heading > 2*PI)
 +
    heading -= 2*PI;
 +
 
 +
  // Prevod radiánov na stupne pre čitateľný serial výstup
 +
  float headingDegrees = heading * 180/M_PI;
 +
</source>
  
int main(void) {
+
Následne získame aj hodnotu z ultrazvukového senzora funkciou getRange(), túto už deklarujeme v našom programe
   
+
 
    printf("Hello, World!\n");
+
<source lang="c">
    return(0);
+
int getRange(){                                
 +
 
 +
  int range = 0;
 +
 
 +
  Wire.beginTransmission(SRF_ADDRESS);            // Zahájenie komunikácie s I2C
 +
  Wire.write(CMD);                                // Odošle Command Byte
 +
  Wire.write(0x51);                                // Odošle 0x51 pre zahájenie merania
 +
  Wire.endTransmission();
 +
 
 +
  delay(100);                                      // Delay aby meranie prebehlo
 +
 
 +
  Wire.beginTransmission(SRF_ADDRESS);            // Opätovné zahájenie komunikácie
 +
  Wire.write(RANGEBYTE);                          // Nastaví register na Range Byte
 +
  Wire.endTransmission();
 +
 
 +
  Wire.requestFrom(SRF_ADDRESS, 2);                // Vyžiadame si 2 bajty
 +
  while(Wire.available() < 2);                    // Počkáme, kým prídu
 +
  highByte = Wire.read();                          // Získa high bajt
 +
  lowByte = Wire.read();                          // Získa low bajt
 +
 
 +
  range = (highByte << 8) + lowByte;               // Skombinuje ich pre výslednú hodnotu
 +
 
 +
  return(range);                                   // Vráti vzdialenosť
 
}
 
}
 
</source>
 
</source>
  
Nezabudnite však nahrať aj kompletné zdrojové kódy vášho programu!
+
Následne vypíšeme obe hodnoty na sériovú linku. Tu končí časť pre Arduino.
  
Zdrojový kód: [[Médiá:Serial.h|serial.h]] a [[Médiá:Pip.c|main.c]]
+
==== Processing ====
 +
 
 +
Na vykreslovanie grafu využívame Processing aplikáciu. Tá číta hodnoty zo sériovej linky. Číta po riadkoch, hodnoty rozdelí na základe čiarky a prepočtom uhla a vzdialenosti zo sférického systému späť na X-Y súradnice vykreslujeme charakter okolia senzora.
 +
 
 +
<source lang="c">
 +
void draw() {
 +
while (myPort.available() > 0) {
 +
    String myString = myPort.readStringUntil(lf);                // Načítame riadok (lf je char kód pre nový riadok)
 +
    if (myString != null) {                                      // Ak sa podarí načítať hodnoty
 +
                                         
 +
      String[] list = split(myString, ',');                      // Rozdelíme string čiarkou
 +
      float x1 = float(list[1])*sin(radians(float(list[0])));    // Prepočítame X súradnicu
 +
      float y1 = float(list[1])*cos(radians(float(list[0])));    // Prepočítame Y súradnicu
 +
      ellipse(250+3*int(x1),250+3*int(y1),5,5);                  // Vykreslujeme malé elipsy na pozícii prekážky vztiahnuté na stred [250,250] pre canvas 500x500, 3x zosilnenie
 +
      delay(100);
 +
    }
 +
}
 +
}
 +
</source>
 +
 
 +
==== Zdrojové súbory ====
 +
 
 +
Nakoľko využívame rôzne knižnice, pre funkčnosť prikladáme celú štruktúru
 +
 
 +
Zdrojový kód: [[Médiá:Sonar_Arduino.7z|Zdrojové kódy]]
  
[[Médiá:MojProgram.c|program.c]]
 
  
 
=== Overenie ===
 
=== Overenie ===
  
Nezabudnite napísať čosi ako užívateľský návod. Z neho by malo byť jasné čo program robí,
+
Po nahratí programu na Arduino stačí otvoriť Processing kód a spustiť ho. Na obrazovke sa zobrazí 500x500 graf s horizontálnou a vertikálnou osou prechádzajúcimi stredom, ktoré reprezentujú osi X a Y. Následne sa začnú vykreslovať body okolo stredu na základe prekážok pred ultrazvukovým senzorom.
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,
+
Na nižšie uvedenom obrázku je výstup z Processingu prekrytý fotkou prekážok, ktoré boli snímané.
odfotografujte ho.  
+
 
 +
[[Súbor:Sonar_fotka.png]]
  
Kľúčové slová 'Category', ktoré sú na konci stránky nemeňte.
 
  
 
[[MEMS_projekty#Projekty_2018|Späť na zoznam projektov...]]
 
[[MEMS_projekty#Projekty_2018|Späť na zoznam projektov...]]
  
 
[[Category:MEMS2018]] [[Category:AVR]]
 
[[Category:MEMS2018]] [[Category:AVR]]

Aktuálna revízia z 08:54, 10. máj 2018

Autori: Peter Melek, Peter Juhász
Študijný odbor: Aplikovaná mechatronika 1. Ing. (2018)


A. Ultrazvukový snímač SRF08

Senzor funguje na základe prepočtu času návratu odrazenej zvukovej vlny od prekážky. Pri známej rýchlosti zvuku sa tento čas dá následne prepočítať na vzdialenosť vo zvolených jednotkách, v našom prípade pracujeme s cm. Pre lepšiu presnosť senzora je možné brať do úvahy aj teplotu okolia. K mikropočítaču je senzor pripájaný zbernicou I2C.

Senzorom je možné merať všeobecnú vzdialenosť prekážok do vzdialenosti v jednotkách metrov (spolahlivosť do vzdialenosti cca 2 metre), čo je pre našu aplikáciu postačujúce. Senzor zároveň dokáže merať intenzitu svetla, čo môže byť opäť užitočné pri vyhodnocovaní prekážok.


SRF08 ultrazvuk senzor01.jpg


H. Compass Module 3-Axis HMC5883L

Modul kompasu funguje na základe merania intenzity magnetického poľa v troch osiach. Na základe magnetického poľa vyhodnocuje rozdielové napätie v troch osiach, ktoré následne môžeme prepočítať na uhlové výchylky. Rovnako ako ultrazvukový senzor, aj senzor kompasu komunikuje s mikropočítačom cez I2C zbernicu.

Senzor je možné využiť na všeobecné riadenie natočenia pri akýchkoľvek pohybujúcich sa aplikáciách v 2D alebo 3D priestore. Môže byť využitý napr. pri pohybe robotov. V našej aplikácii bude pohyb zabezpečovaný ručne a budeme pracovať v rovine.

Parallax HMC5883.png


Zadanie

  • Úlohou je skombinovať vyššie uvedené senzory a vytvoriť aplikáciu, ktorá zmysluplne kombinuje ich údaje.
  • Nami zvolená aplikácia bude sonar, ktorý bude mapovať okolitý priestor zariadenia do vzdialenosti desiatok cm.

Analýza

Sonar je zariadenie, ktoré slúži na echolokáciu t.j. zisťovanie polohy a tvaru predmetov v priestore s využitím ultrazvukového signálu. Našou úlohou je podobné zariadenie zostrojiť. Využívať pritom budeme ultrazvukový senzor SRF08, ktorý ultrazvukovú vlnu vysiela a zároveň i prijíma.

Na určenie polohy respektíve uhla, v ktorom je senzor natočený budeme využívať kompas HMC5883L. Funguje na princípe snímania malých magnetických polí. Kompas rozoznáva natočenie vo všetkých troch osiach karteziánskom súradnicovom systéme ale v našom prevedení Sonaru budeme využívať iba natočenie v horizontálnej rovine.

Oba snímače budú zapojené do zariadenia Arduino Uno, resp. do jeho klonu, cez zbernicu I2C.

Výstupom zo zariadenia bude graf sledovanej oblasti.

Popis riešenia

Snímače sme pripojili k Arduino Uno, resp. do jeho klonu podľa schémy zapojenia. Je veľmi dôležité zbernicu (obe časti, SDA aj SCL) ukončiť pripojením rezistorov o dostatočnom odpore, my sme zvolili 4,7kΩ, na GND.

Po pripojení napájania sme zistili adresu pripojených snímačov na zbernicu I2C. Pomocou I2C skenera sme vyčítali adresy na ktorých sú snímače pripojené. Následne sme v knižnici zdrojových kódov na nižšie uvedených odkazoch našli kódy k danému snímaču.

Kódy sme vhodne skombinovali a nastavili výstup na formát uhol_natocenia,vzdialenost_cm oddelené čiarkou a každá hodnota na novom riadku. Výstup na sériovú linku teda vyzerá nasledovne

180,10

Zapojenie snímača

Sonar schema.pngSonar znazornenie zap.png

Vychádzame zo zdrojových kódov

Algoritmus a program

Arduino

Program inicializuje oba senzory, následne pomocou knižnice pre kompas načíta hodnoty súradníc X, Y, Z a prevedie ich na radiány. Toto sa deje funkciami v knižniciach, v programe len voláme funkciu a spracujeme jej hodnoty. Nižšie uvedený úsek popisuje toto spracovanie.

//Z eventu z knižnice načítame X a Y hodnoty, prepočítame na uhol
float heading = atan2(event.magnetic.y, event.magnetic.x);
  
  // Odchýlka mag. pola pre Bratislavu, možno nájsť na http://www.magnetic-declination.com/
  float declinationAngle = 0.07;
  // Uhol upravený o odchýlku
  heading += declinationAngle;
  
  // Dorovnanie pre prípad záporných hodnôt
  if(heading < 0)
    heading += 2*PI;
    
  if(heading > 2*PI)
    heading -= 2*PI;
   
  // Prevod radiánov na stupne pre čitateľný serial výstup
  float headingDegrees = heading * 180/M_PI;

Následne získame aj hodnotu z ultrazvukového senzora funkciou getRange(), túto už deklarujeme v našom programe

int getRange(){                                  
  
  int range = 0; 
  
  Wire.beginTransmission(SRF_ADDRESS);             // Zahájenie komunikácie s I2C
  Wire.write(CMD);                                 // Odošle Command Byte
  Wire.write(0x51);                                // Odošle 0x51 pre zahájenie merania 
  Wire.endTransmission();
  
  delay(100);                                      // Delay aby meranie prebehlo
  
  Wire.beginTransmission(SRF_ADDRESS);             // Opätovné zahájenie komunikácie
  Wire.write(RANGEBYTE);                           // Nastaví register na Range Byte
  Wire.endTransmission();
  
  Wire.requestFrom(SRF_ADDRESS, 2);                // Vyžiadame si 2 bajty
  while(Wire.available() < 2);                     // Počkáme, kým prídu
  highByte = Wire.read();                          // Získa high bajt
  lowByte = Wire.read();                           // Získa low bajt

  range = (highByte << 8) + lowByte;               // Skombinuje ich pre výslednú hodnotu
  
  return(range);                                   // Vráti vzdialenosť
}

Následne vypíšeme obe hodnoty na sériovú linku. Tu končí časť pre Arduino.

Processing

Na vykreslovanie grafu využívame Processing aplikáciu. Tá číta hodnoty zo sériovej linky. Číta po riadkoch, hodnoty rozdelí na základe čiarky a prepočtom uhla a vzdialenosti zo sférického systému späť na X-Y súradnice vykreslujeme charakter okolia senzora.

void draw() {
 while (myPort.available() > 0) {
    String myString = myPort.readStringUntil(lf);                 // Načítame riadok (lf je char kód pre nový riadok)
    if (myString != null) {                                       // Ak sa podarí načítať hodnoty
                                          
      String[] list = split(myString, ',');                       // Rozdelíme string čiarkou
      float x1 = float(list[1])*sin(radians(float(list[0])));     // Prepočítame X súradnicu
      float y1 = float(list[1])*cos(radians(float(list[0])));     // Prepočítame Y súradnicu
      ellipse(250+3*int(x1),250+3*int(y1),5,5);                   // Vykreslujeme malé elipsy na pozícii prekážky vztiahnuté na stred [250,250] pre canvas 500x500, 3x zosilnenie
      delay(100); 
    }
 }
}

Zdrojové súbory

Nakoľko využívame rôzne knižnice, pre funkčnosť prikladáme celú štruktúru

Zdrojový kód: Zdrojové kódy


Overenie

Po nahratí programu na Arduino stačí otvoriť Processing kód a spustiť ho. Na obrazovke sa zobrazí 500x500 graf s horizontálnou a vertikálnou osou prechádzajúcimi stredom, ktoré reprezentujú osi X a Y. Následne sa začnú vykreslovať body okolo stredu na základe prekážok pred ultrazvukovým senzorom.

Na nižšie uvedenom obrázku je výstup z Processingu prekrytý fotkou prekážok, ktoré boli snímané.

Sonar fotka.png


Späť na zoznam projektov...