Operácie

Senzory HMC5883L Kompas a VNCL4000 Proximity

Zo stránky SensorWiki

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