Senzory HMC5883L Kompas a VNCL4000 Proximity: Rozdiel medzi revíziami
Zo stránky SensorWiki
Bez shrnutí editace |
|||
Riadok 1: | Riadok 1: | ||
{| | {| | ||
|Autori: || ''' | |Autori: || '''Peter Melek, Peter Juhász''' | ||
|- | |- | ||
|Študijný odbor: || Aplikovaná mechatronika || | |Študijný odbor: || Aplikovaná mechatronika || 1. Ing. ('''2018''') | ||
|} | |} | ||
'''A.''' ''' | '''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. | |||
* [ | [[Obrázok:SRF08_ultrazvuk_senzor01.jpg |300px]] | ||
* [ | * [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''' | ||
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. | |||
[[Obrázok:Parallax_HMC5883.png|300px]] | [[Obrázok:Parallax_HMC5883.png|300px]] | ||
* [https://www.parallax.com/product/29133 Stránka produktu] | |||
[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] | ||
[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] | ||
[https://www.parallax.com/sites/default/files/downloads/29133-HMC5883L-3-Axis-Digital-Compass-IC-Datasheet.pdf Datasheet čipu] | |||
== Zadanie == | == 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. | |||
__TOC__ | |||
== 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 | |||
<source>180,10</source> | |||
'''Zapojenie snímača''' | |||
[[Súbor:Sonar_schema.png|500px]][[Súbor:Sonar_znazornenie_zap.png|300px]] | |||
[[ | '''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 === | ||
==== 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. | |||
<source lang="c"> | <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> | |||
int | Následne získame aj hodnotu z ultrazvukového senzora funkciou getRange(), túto už deklarujeme v našom programe | ||
<source lang="c"> | |||
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> | ||
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. | |||
<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]] | |||
=== Overenie === | === 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é. | |||
[[Súbor:Sonar_fotka.png]] | |||
[[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é.