hu:arduino:distant

Differences

This shows you the differences between two versions of the page.

hu:arduino:distant [2018/08/08 11:58]
hu:arduino:distant [2022/04/21 15:02] ()
 1:  1:
 +====== Távolságmérés ======
 +A távolságmérők valamilyen kibocsátott rezgés (hang vagy fény) adott objektumról való visszaverődés távolságát az eltelt idővel mérik. A hangalalpú (sonáros) távolságmérő eszközöknél a fényalapúak pontosabbak, és itt is a lézeres mérés precízebb, mint az infravörös visszaverődés-mérés (elvileg, ha a hardver megbízható). Típusai:
 +
 +**hangalapú (szonár) szenzorok** \\
 +Az angolul //Ultra-Sonic Ranger// nevű technikai megoldás két elemből áll, egy hangszóróból, ami hanginpulzusokat bocsát ki, és egy mikrofonból, ami érzékeli ezeknek a visszaverődését. A kiadás és az érzékelés között eltelt időből -- a hang terjedési sebességét iserve -- a távolság kiszámolható. Ide tartoznak:
 +  * [[#hc%E2%80%91sr04_szonarszenzor|HC‑SR04 szonárszenzor]]
 +  * [[#ultrasonic_tavolsagmero_szenzor|Ultrasonic távolságmérő szenzor]]
 +
 +{{ :hu:arduino:distant.png|A háromszögeléses módszer sémája}}
 +**infravörös távolságérzékelő szenzorok** \\
 +A szenzor az ún. háromszögeléses módszerrel működik. A szenzor egy keskeny infravörös fénnyalábot bocsát ki (az IR fény hullámhossza 850nm ± 70nm). A kibocsátott IR fény a tárgyakról visszaverődik. Az érzékelő egy optikával leképezi a visszavert fényt egy CCD-re. Attól függően hogy milyen messze van a céltárgy, más-más szögben érkezik vissza a visszavert fény, és ennek megfelelően más-más CCD pixelre fókuszálódik. Ebből már meghatározható a távolság. 
 +  * [[#sharp_ir_tavolsagerzekelok|Sharp IR távolságérzékelők]]
 +
 +**lézeres távolságérzékelő szenzorok** \\
 +A lézeres érzékelők is -- csakúgy, mint az IR-esek -- az ún. háromszögeléses módszerrel működnek. A szenzor által kibocsátott lézernyaláb, a mért felületről visszaverődve, egy lencsén át az érzékelő CCD illetve CMOS fényszenzorának felületére vetül. A reflektáló felület közelítésével illetve távolodásával a fényszenzorra vetített pont helyzete is változik, aminek kiértékelésével az elektronika meghatározza a távolságot.
 +  * [[#tof10120_lezeres_tavolsagerzekelo_modul|TOF10120 lézeres távolságérzékelő modul]]
 +
 +{{ :hu:arduino:tof10120.png?120|TOF10120 lézeres távolságérzékelő modul}}
 +===== TOF10120 lézeres távolságérzékelő modul =====
 +A TOF10120 távolságérzékelését a gyártó Sharp SPAD (Single Photon Avalanche Diodes) eljárással valósítja meg, melyet CMOS-alkalmazásával használ. Pontosabb eredményt biztosít, a környezeti fénnyel szemben ellenállóbb és optikai kialakításának köszönhetően a térgyérzékelése is megbízhatóbb.
 +A modul //class 1// 940nm-es lézert alkalmaz a méréshez, érzékelési távolsága 10 .. 180 cm. Kimenete [[hu:main:dict#uart|UART]], kommunikációja lehet [[hu:comm:bus_rs232|RS232]], [[hu:comm:bus_i2c|I²C]] vagy IIC.
 +
 +==== Technikai jellemzők ====
 +  * Érzékelés távolsága: 100 .. 1800 mm 
 +  * Tápfeszültség: 3 .. 5V DC
 +  * Áramfelvétel: 35mA
 +  * Üzemi hőmérséklet:  -20 .. +70 °C
 +  * UART:  9600 baud, 8N1, Flow Control : None
 +
 +==== Vezeték-kiosztás ====
 +  * ①GND Black
 +  * ②VCC Red
 +  * ③RXD Yellow
 +  * ④TXD white
 +  * ⑤SDA blue
 +  * ⑥SCL purple
 +
 +==== Vezetékezés az Arduinoval ====
 +A vezetékezés attól függ, hogy I²C-t vagy Serial-t alkalmazunk. Mind a 6 vezetéket felesleges egyszerre bekötni, 4-nek elégnek kell lennie.
 +
 +^TOF10120^Arduino pin^Megjegyzés|
 +|1.fekete|Arduino GND|GND|
 +|2.piros|Arduino 5v DC|5v DC táp|
 +|3.sárga|Pin 1 Tx|RxD : A serialhoz kell bekötni|
 +|4.fehér|Pin 0 Rx|TxD : A serialhoz kell bekötni|
 +|5.kék|Pin A4|SDA : Az I²C-hez kell bekötni|
 +|6.zöld|Pin A5|SCL : Az I²C-hez kell bekötni|
 +
 +<WRAP center round important 80%>
 +A serial Rx és Tx használata blokkolja a soros letöltést és a serial monitor használatát.
 +</WRAP>
 +
 +{{:hu:arduino:tof10120_arduino.png?500|TOF10120 lézeres távolságérzékelő modul vezetékezése az Arduinoval}}
 +
 +
 +==== Szoftver ====
 +A lenti szoftver az I²C-t használja a kommunikációhoz, azaz a fenti táblázatnak megfelelően az Arduino pin0-t és pin1-et nem kell bekötni.
 +<hidden Szoftver megjelenítése>
 +<code c>
 +/*
 +  TOF10120 Distance Sensor Demonstration
 +  TOF10120-Demo.ino
 +  Demonstrates use of TOF10120 Distance Sensor
 +  Adapted from code from SurtrTech
 +  Displays results on Serial Monitor
 + 
 +  DroneBot Workshop 2019
 +  https://dronebotworkshop.com
 +*/
 + 
 +#include <Wire.h>
 + 
 +unsigned char ok_flag;
 +unsigned char fail_flag;
 + 
 +unsigned short lenth_val = 0;
 +unsigned char i2c_rx_buf[16];
 +unsigned char dirsend_flag=0;
 + 
 + 
 +void setup() {
 +  Wire.begin(); 
 +  Serial.begin(9600,SERIAL_8N1); 
 +  printf_begin();          
 + 
 +}
 + 
 +void loop() {
 +  
 + 
 +   int x=ReadDistance();
 +   
 +   Serial.print(x);
 +   Serial.println(" mm");
 +  
 +}
 + 
 +int serial_putc( char c, struct __file * )
 +{
 +  Serial.write( c );
 +  return c;
 +}
 + 
 +void printf_begin(void)
 +{
 +  fdevopen( &serial_putc, 0 );
 +}
 + 
 + 
 + 
 +void SensorRead(unsigned char addr,unsigned char* datbuf,unsigned char cnt) 
 +{
 +  unsigned short result=0;
 +  // step 1: instruct sensor to read echoes
 +  Wire.beginTransmission(82); // transmit to device #82 (0x52)
 +  // the address specified in the datasheet is 164 (0xa4)
 +  // but i2c adressing uses the high 7 bits so it's 82
 +  Wire.write(byte(addr));      // sets distance data address (addr)
 +  Wire.endTransmission();      // stop transmitting
 +  // step 2: wait for readings to happen
 +  delay(1);                   // datasheet suggests at least 30uS
 +  // step 3: request reading from sensor
 +  Wire.requestFrom(82, cnt);    // request cnt bytes from slave device #82 (0x52)
 +  // step 5: receive reading from sensor
 +  if (cnt <= Wire.available()) { // if two bytes were received
 +    *datbuf++ = Wire.read();  // receive high byte (overwrites previous reading)
 +    *datbuf++ = Wire.read(); // receive low byte as lower 8 bits
 +  }
 +}
 + 
 +int ReadDistance(){
 +    SensorRead(0x00,i2c_rx_buf,2);
 +    lenth_val=i2c_rx_buf[0];
 +    lenth_val=lenth_val<<8;
 +    lenth_val|=i2c_rx_buf[1];
 +    delay(300); 
 +    return lenth_val;
 +}
 +
 +</code>
 +</hidden>
 +
 +
 +{{ :wiki:arduino:gp2y0a21.png?120|GP2Y0A21 IR távérzékelő}}
 +===== Sharp IR távolságérzékelők =====
 +{{anchor:gp2y0a21}}
 +
 +Az Sharp távérzékelők népszerűek olyan projektekhez, melyek pontos távolságmérést igényelnek. Ez az infravörös érzékelő sorozat megbízhatóságával kiemelkedik a többi IR érzékelő sorából. Illesztése a mikrokontrollerekhez egyszerű: az egy analóg kimenet analóg-digitális átalakítóhoz csatlakoztatható távolságmérések elvégzéséhez, vagy a kimenet kompenzátorhoz csatlakoztatható a küszöbérzékeléshez. 
 +
 +A különböző verziónak az érzékelési tartománya nagyjából 10 cm-től 150 cm-ig terjed; a távolságot minden esetben a kimeneti feszültséggel képezik le a mérőegységek.
 +
 +A legtöbb Sharp típus 3 pólusú JST csatlakozót használ, amely a 3 pólusú JST kábelhez csatlakozik az Sharp távérzékelőkhöz. A hátulról nézve a balról jobbra lévő három csatlakozás a táp (piros), a föld (fekete) és a kimeneti jel (sárga).  
 +
 +A Sharp IR távérzékelők méréshez [[hu:main:dict#psd|PSD szenzor]]t használnak:
 +
 +{{:wiki:sensor:psd_sensor.png?350|PSD szenzor}}
 +
 +Fontos tudni, hogy a szenzorok távolság-feszültségkonverziója még véletlenül sem lineáris. A lenti ábrán például a GP2Y0A21YK feszültség -távolsággörbéje látható:
 +
 +{{:wiki:sensor:gp2y0a21yk_volt.png|GP2Y0A21YK feszültség -távolsággörbéje}}
 +
 +==== Néhány Sharp IR távérzékelő típus ====
 +^típus^Üzemi feszültség^Áramfelvetel^Távolságmérési \\ tartomány^megjegyzés|
 +|GP2Y0A60SZ(LF)|2 működési mód \\ 3V: 2,7..3,6V \\ 5V: 2,7V..5,5V|33 mA|10..150 cm-ig|Modul: 3V Pololu \\ Válaszidő: kb. 16.5 ± 4 ms \\ Engedélyező jel is van rajta|
 +|GP2Y0A02(YK0F)|4,5..5,5 V|33 mA|20..150 cm-ig|Kimeneti feszültségkülönbség a távolságtartományon belül: 2,05 V \\ Válaszidő: kb. 38.3ms ± 9.6ms|
 +|GP2Y0A21(YK0F)|4,5..5,5 V|30 mA|10..80 cm-ig (4"..32")|//Talán a leggyakoribb alkalmazott típus// \\ Kimeneti feszültségkülönbség a távolságtartományon belül: 1,9 V \\ Válaszidő: kb. 38.3ms ± 9.6ms|
 +|GP2Y0A41(SK0F)|0,4..2,5 V|12 mA|4..30 cm-ig|Kimeneti feszültségkülönbség a távolságtartományon belül: 2,3 V \\ Válaszidő: kb. 16.5 ± 4 ms|
 +|GP2Y0A51(SK0F)|0,4..2,5 V|12 mA|2..15 cm-ig|Kimeneti feszültségkülönbség a távolságtartományon belül: 1,65 V \\ Válaszidő: kb. 16.5 ± 4 ms|
 +
 +{{:wiki:sensor:sharp_ir.png?300|Sharp IR távérzékelők}}
 +
 +
 +==== Néhány Sharp IR távérzékelő adatlap ====
 +{{:wiki:downloads:distance_ir_analog_sharp_gp2y0a21yk.pdf |distance_ir_analog_sharp_gp2y0a21yk.pdf}} \\
 +{{:wiki:downloads:distance_ir_analog_sharp_gp2y0a21yk_new.pdf |distance_ir_analog_sharp_gp2y0a21yk_new.pdf}} \\
 +{{:wiki:downloads:distance_ir_analog_sharp_gp2y0a41sk0f.pdf |distance_ir_analog_sharp_gp2y0a41sk0f.pdf}} \\
 +
 +==== Vezetékezés ====
 +piros vezeték (táp): Arduino +5V DC \\
 +fekete vezeték (föld): Arduino GND \\
 +sárga vezeték (jel): Arduino analóg input \\
 +
 +<WRAP center round tip 80%>
 +Az IR-LED belső időzítése miatt előfordulhat, hogy a tápvezetéken zavarójelek kerülhetnek ki a mérőegységből. Ezek kiküszöbölésére többen javasolják, hogy érdemes a táp- és földvezeték közé egy 1..10μF-os szűrőkondenzátort beiktatni.
 +</WRAP>
 +
 +==== Szoftver ====
 +**GP2Y0A21(YK0F), GP2Y0A41(SK0F):** \\
 +A szoftverpéldákat ezúttal is a Githubon érdemes keresgélni, például itt: https://github.com/jeroendoggen/Arduino-distance-sensor-library
 +
 +{{ :wiki:arduino:hc_sr04.png?150|HC‑SR04}}
 +===== HC‑SR04 szonárszenzor =====
 +{{anchor:hcsr04}}
 +
 +A modul a hangvisszaverődés idejét mérve következtet a távolságra, azaz szonár-elven működik (mint a tengeralattjárók szonárja). Természetesen ez a modul is több néven ismert, például: **SRF04** - Ultra-Sonic Ranger. 
 +
 +A mérés egy 10 μs-os TTL impulzussal indítható. Ezt követően a modul 8 cikluson keresztül 40 kHz-es hangimpulzusokat ad ki, majd a mikrofonnal érzékeli ezeknek a visszaverődését. A távolság a\\ //válaszidő (μs) / 58 = távolság (cm)//\\ vagy\\ //válaszidő (μs) / 148 = távolság (inch)//\\ képletekkel számolható ki, ennek a számításnak a háttere: 
 +
 +<WRAP center round important 80%>
 +A távolságmérés a hanghullámok visszaverődésének a figyelése alapján történik. A hanghullámok kibocsátási és visszaérkezési idejét ismerve kiszámolható a mérés ideje. 
 +
 +{{ :wiki:proj:hc_sr04.png?250 |HC-SR04 sonárszenzor működési elve}}
 +
 +Ezt kell a hangsebességgel beszorozni. Az ehhez szükséges számolásban a csavar, hogy a hangsebesség a légköri nyomás és hőmérséklet függvényében is változik. Jelen esetben csak a hőmérséklet-korrekciót építjük be a számításba, az ehhez szükséges formula:
 +
 +**331.5 + 0.6 * t**
 +
 +Ha a hőmérséklet például 20° C, akkor a hang terjedési sebessége: 331.5 + 0.6 * 20 = 331.5 + 12 = 343.5 m/s, azaz **0.03435 cm/µs**. Ebből az is átszámolható, hogy a hangnak **29,112 mikroszekundum**ra van szüksége egy centiméter megtételéhez (1/0.03435 cm/µs = 29.112 µs/cm). Nyilván a hang esetén az oda-vissza utat is számolni kell, így jön ki a fenti (kerekített)
 +
 +//válaszidő (μs) / 58 = távolság (cm)//
 +
 +</WRAP>
 +
 +
 +A méréseket nem érdemes 60 ms-on belül ismételni, mert zavarhatják egymást:
 +
 +{{:wiki:arduino:hc_sr04_timing.png|HC‑SR04 működése}}
 +
 +<WRAP center round important 80%>
 +A modult a tapasztalatok alapján érdemes úgy a tápfeszülségre csatlakoztatni, hogy először a grund (GND) kerüljön a modulra. 
 +
 +A mérés bizonytalanná válik, ha a visszaverődési felület kisebb, mint 0,5 m².
 +
 +A legtöbb szoftver, ha kifut a felügyeleti időből, válasz nélkül (azaz túl nagy a távolság), "0" értékkel tér vissza, amit a szoftverben külön vizsgálni kell.
 +</WRAP>
 +
 +==== Technikai adatok ====
 +^jellemző^adat|
 +|Üzemi feszültség|DC 5V|
 +|Áramfelvétel|15 mA|
 +|Üzemi frekvencia|40 kHz|
 +|Maximális távolság|4m|
 +|Minimális távolság|2cm|
 +|Mérés pontossága|> 3mm|
 +|Mérési tartomány (szög)|15°|
 +|Trigger jel|10 μs TTL impulzus|
 +
 +==== Pinek ====
 +^jelölés^leírás|
 +|Vcc|táp, 5V DC|
 +|Trig|"ping" kiküldése|
 +|Echo|válasz (viszhang) a "ping"-re|
 +|GND|grund|
 +
 +==== HC‑SR04 adatlap ====
 +{{:wiki:downloads:distance_ultrasonic_srf04.pdf |distance_ultrasonic_srf04.pdf}} \\
 +
 +==== Vezetékezés ====
 +
 +Arduino 5V ↔ HC-SR04 Vcc \\
 +Arduino GND ↔ HC-SR04 Gnd \\
 +Arduino pin 11 ↔ HC-SR04 "Echo" \\
 +Arduino pin 12 ↔ HC-SR04 "Trig" \\
 +
 +{{:wiki:arduino:hc_sr04_wiring.png?500|HC‑SR04 vezetékezés}}
 +
 +==== Github ====
 +A modulhoz könyvtár és példaprogramok a Github-ról letölthetők:
 +
 +  * https://github.com/JRodrigoTech/Ultrasonic-HC-SR04  \\
 +  * https://bitbucket.org/teckel12/arduino-new-ping/downloads/ \\
 +
 +==== Források ====
 +http://www.micropik.com/PDF/HCSR04.pdf \\
 +
 +===== Ultrasonic távolságmérő szenzor =====
 +{{anchor:ultrasonic}}
 +{{ :wiki:sensor:ultrasonic_1.jpg?400|Ultrasonic távolságmérő szenzor}}
 +Az autóknál tolatóradarként funkcionáló szenzort a fenti HC-SR04 szenzorhoz hasonlóan kell vezetékezni és programozni. Azzal szemben ennek az előnye, hogy nagyobb távolságra érzékel és vízálló. Adatlapja:
 +
 +**Üzemi feszültség:** DC 5V \\
 +**Készenléti áramfelvétel:** 5mA \\
 +**Üzemi áramfelvétel:** 30mA \\
 +**Átviteli frekvencia:** 40KHz \\
 +**Maximális távolság:** 5M \\
 +**Holttér:** 25cm \\
 +**Pontosság:** 0.5cm \\
 +**Látószög:** <50° \\
 +**Üzemi hőmérséklet:** -10 to 70 °C \\
 +**Tárolási hőmérséklet:** -20 to 80°C \\
 +**Méret:** 41x28.5mm \\
 +**Vezetékhossz:** 2.5m \\
 +
 +