Operácie

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

Zo stránky SensorWiki

Balogh (diskusia | príspevky)
Bez shrnutí editace
DVPS (diskusia | príspevky)
Bez shrnutí editace
 
(Jedna medziľahlá úprava od rovnakého používateľa nie je zobrazená.)
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.
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">
//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>


Vyberte podstatné časti zdrojového kódu, použite na to prostredie ''source'':
Následne získame aj hodnotu z ultrazvukového senzora funkciou getRange(), túto už deklarujeme v našom programe


<source lang="c">
<source lang="c">
/* A nezabudnite zdroják hojne komentovať  */
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


int main(void) {
  range = (highByte << 8) + lowByte;              // Skombinuje ich pre výslednú hodnotu
   
 
    printf("Hello, World!\n"); 
  return(range);                                   // Vráti vzdialenosť
    return(0);
}
}
</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.
 
==== Processing ====


Zdrojový kód: [[Médiá:Serial.h|serial.h]] a [[Médiá:Pip.c|main.c]]
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>


[[Médiá:MojProgram.c|program.c]]
==== 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]]




=== 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.



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.


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

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é.


Späť na zoznam projektov...