https://senzor.robotika.sk/sensorwiki/index.php?title=Ultrazvukov%C3%BD_radar_s_kompasom&feed=atom&action=historyUltrazvukový radar s kompasom - História úprav2024-03-28T19:09:15ZHistória úprav pre túto stránku na wikiMediaWiki 1.29.0https://senzor.robotika.sk/sensorwiki/index.php?title=Ultrazvukov%C3%BD_radar_s_kompasom&diff=9207&oldid=prevBalogh na 09:18, 29. máj 20182018-05-29T09:18:52Z<p></p>
<table class="diff diff-contentalign-left" data-mw="interface">
<col class='diff-marker' />
<col class='diff-content' />
<col class='diff-marker' />
<col class='diff-content' />
<tr style='vertical-align: top;' lang='sk'>
<td colspan='2' style="background-color: white; color:black; text-align: center;">← Staršia verzia</td>
<td colspan='2' style="background-color: white; color:black; text-align: center;">Verzia zo dňa a času 09:18, 29. máj 2018</td>
</tr><tr><td colspan="2" class="diff-lineno" id="mw-diff-left-l1" >Riadok 1:</td>
<td colspan="2" class="diff-lineno">Riadok 1:</td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins style="font-weight: bold; text-decoration: none;">__NOTOC__</ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins style="font-weight: bold; text-decoration: none;"></ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins style="font-weight: bold; text-decoration: none;"> '''Balogh:''' </ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins style="font-weight: bold; text-decoration: none;"> * chýba podrobnejší popis senzorov, na akom princípe pracujú, čo merajú a čo je výstupná hodnota, čo posielate...</ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins style="font-weight: bold; text-decoration: none;"> * softvér je síce jednoduchý, ale funguje, pekne spracovaný výstup dát</ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins style="font-weight: bold; text-decoration: none;"></ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins style="font-weight: bold; text-decoration: none;"></ins></div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>{|</div></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>{|</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>|Autori:      || '''Peter Melek, Peter Juhász'''  </div></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>|Autori:      || '''Peter Melek, Peter Juhász'''  </div></td></tr>
</table>Baloghhttps://senzor.robotika.sk/sensorwiki/index.php?title=Ultrazvukov%C3%BD_radar_s_kompasom&diff=8405&oldid=prevBalogh: Vytvorená stránka „{| |Autori: || '''Peter Melek, Peter Juhász''' |- |Študijný odbor: || Aplikovaná mechatronika || 1. Ing. ('''2018''') |} '''A.''' '''Ultrazvukový sníma…“2018-05-14T14:19:46Z<p>Vytvorená stránka „{| |Autori: || '''Peter Melek, Peter Juhász''' |- |Študijný odbor: || Aplikovaná mechatronika || 1. Ing. ('''2018''') |} '''A.''' '''Ultrazvukový sníma…“</p>
<p><b>Nová stránka</b></p><div>{|<br />
|Autori: || '''Peter Melek, Peter Juhász''' <br />
|-<br />
|Študijný odbor: || Aplikovaná mechatronika || 1. Ing. ('''2018''') <br />
|}<br />
<br />
<br />
'''A.''' '''Ultrazvukový snímač SRF08'''<br />
<br />
Senzor funguje na základe prepočtu času návratu odrazenej zvukovej vlny od prekážky. Pri známej rýchlosti zvuku<br />
sa tento čas dá následne prepočítať na vzdialenosť vo zvolených jednotkách, v našom prípade pracujeme s cm.<br />
Pre lepšiu presnosť senzora je možné brať do úvahy aj teplotu okolia. K mikropočítaču je senzor pripájaný zbernicou I2C.<br />
<br />
Senzorom je možné merať všeobecnú vzdialenosť prekážok do vzdialenosti v jednotkách metrov (spolahlivosť do vzdialenosti<br />
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äť<br />
užitočné pri vyhodnocovaní prekážok.<br />
<br />
<br />
[[Obrázok:SRF08_ultrazvuk_senzor01.jpg |300px]]<br />
<br />
* [https://www.robot-electronics.co.uk/htm/srf08tech.html Technická špecifikácia SRF08]<br />
<br />
* [https://playground.arduino.cc/Main/SonarSrf08 Arduino zapojenie SRF08]<br />
<br />
<br />
'''H.''' ''' Compass Module 3-Axis HMC5883L'''<br />
<br />
Modul kompasu funguje na základe merania intenzity magnetického poľa v troch osiach. Na základe magnetického poľa vyhodnocuje<br />
rozdielové napätie v troch osiach, ktoré následne môžeme prepočítať na uhlové výchylky. Rovnako ako ultrazvukový senzor, aj <br />
senzor kompasu komunikuje s mikropočítačom cez I2C zbernicu.<br />
<br />
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.<br />
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.<br />
<br />
[[Obrázok:Parallax_HMC5883.png|300px]]<br />
<br />
* [https://www.parallax.com/product/29133 Stránka produktu]<br />
<br />
* [https://www.parallax.com/sites/default/files/downloads/29133-CompassModuleHMC5883L-v1.1.pdf Datasheet modulu senzora kompasu]<br />
<br />
* [https://www.parallax.com/sites/default/files/downloads/29133-HMC5883L-3-Axis-Digital-Compass-IC-Datasheet.pdf Datasheet čipu kompasu]<br />
<br />
<br />
== Zadanie ==<br />
<br />
* Úlohou je skombinovať vyššie uvedené senzory a vytvoriť aplikáciu, ktorá zmysluplne kombinuje ich údaje. <br />
<br />
* Nami zvolená aplikácia bude sonar, ktorý bude mapovať okolitý priestor zariadenia do vzdialenosti desiatok cm.<br />
<br />
__TOC__<br />
<br />
== Analýza ==<br />
<br />
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.<br />
<br />
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.<br />
<br />
Oba snímače budú zapojené do zariadenia Arduino Uno, resp. do jeho klonu, cez zbernicu I2C. <br />
<br />
Výstupom zo zariadenia bude graf sledovanej oblasti.<br />
<br />
== Popis riešenia ==<br />
<br />
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. <br />
<br />
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. <br />
<br />
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<br />
<br />
<source>180,10</source><br />
<br />
'''Zapojenie snímača'''<br />
<br />
[[Súbor:Sonar_schema.png|500px]][[Súbor:Sonar_znazornenie_zap.png|300px]]<br />
<br />
'''Vychádzame zo zdrojových kódov'''<br />
* [https://www.robot-electronics.co.uk/htm/arduino_examples.htm#SRF02,%20SRF08,%20SRF10,%20SRF235 SRF08]<br />
* [https://learn.adafruit.com/adafruit-hmc5883l-breakout-triple-axis-magnetometer-compass-sensor/wiring-and-test HMC5883L]<br />
<br />
=== Algoritmus a program ===<br />
<br />
==== Arduino ====<br />
<br />
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.<br />
<br />
<source lang="c"><br />
//Z eventu z knižnice načítame X a Y hodnoty, prepočítame na uhol<br />
float heading = atan2(event.magnetic.y, event.magnetic.x);<br />
<br />
// Odchýlka mag. pola pre Bratislavu, možno nájsť na http://www.magnetic-declination.com/<br />
float declinationAngle = 0.07;<br />
// Uhol upravený o odchýlku<br />
heading += declinationAngle;<br />
<br />
// Dorovnanie pre prípad záporných hodnôt<br />
if(heading < 0)<br />
heading += 2*PI;<br />
<br />
if(heading > 2*PI)<br />
heading -= 2*PI;<br />
<br />
// Prevod radiánov na stupne pre čitateľný serial výstup<br />
float headingDegrees = heading * 180/M_PI; <br />
</source><br />
<br />
Následne získame aj hodnotu z ultrazvukového senzora funkciou getRange(), túto už deklarujeme v našom programe<br />
<br />
<source lang="c"><br />
int getRange(){ <br />
<br />
int range = 0; <br />
<br />
Wire.beginTransmission(SRF_ADDRESS); // Zahájenie komunikácie s I2C<br />
Wire.write(CMD); // Odošle Command Byte<br />
Wire.write(0x51); // Odošle 0x51 pre zahájenie merania <br />
Wire.endTransmission();<br />
<br />
delay(100); // Delay aby meranie prebehlo<br />
<br />
Wire.beginTransmission(SRF_ADDRESS); // Opätovné zahájenie komunikácie<br />
Wire.write(RANGEBYTE); // Nastaví register na Range Byte<br />
Wire.endTransmission();<br />
<br />
Wire.requestFrom(SRF_ADDRESS, 2); // Vyžiadame si 2 bajty<br />
while(Wire.available() < 2); // Počkáme, kým prídu<br />
highByte = Wire.read(); // Získa high bajt<br />
lowByte = Wire.read(); // Získa low bajt<br />
<br />
range = (highByte << 8) + lowByte; // Skombinuje ich pre výslednú hodnotu<br />
<br />
return(range); // Vráti vzdialenosť<br />
}<br />
</source><br />
<br />
Následne vypíšeme obe hodnoty na sériovú linku. Tu končí časť pre Arduino.<br />
<br />
==== Processing ====<br />
<br />
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.<br />
<br />
<source lang="c"><br />
void draw() {<br />
while (myPort.available() > 0) {<br />
String myString = myPort.readStringUntil(lf); // Načítame riadok (lf je char kód pre nový riadok)<br />
if (myString != null) { // Ak sa podarí načítať hodnoty<br />
<br />
String[] list = split(myString, ','); // Rozdelíme string čiarkou<br />
float x1 = float(list[1])*sin(radians(float(list[0]))); // Prepočítame X súradnicu<br />
float y1 = float(list[1])*cos(radians(float(list[0]))); // Prepočítame Y súradnicu<br />
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<br />
delay(100); <br />
}<br />
}<br />
}<br />
</source> <br />
<br />
==== Zdrojové súbory ====<br />
<br />
Nakoľko využívame rôzne knižnice, pre funkčnosť prikladáme celú štruktúru<br />
<br />
Zdrojový kód: [[Médiá:Sonar_Arduino.7z|Zdrojové kódy]]<br />
<br />
<br />
=== Overenie ===<br />
<br />
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.<br />
<br />
Na nižšie uvedenom obrázku je výstup z Processingu prekrytý fotkou prekážok, ktoré boli snímané.<br />
<br />
[[Súbor:Sonar_fotka.png]]<br />
<br />
<br />
[[MEMS_projekty#Projekty_2018|Späť na zoznam projektov...]]<br />
<br />
[[Category:MEMS2018]] [[Category:AVR]]</div>Balogh