sako_DIY が 2021年06月08日01時05分15秒 に編集
コメント無し
本文の変更
# 概要 電子工作をしている際にマイコン等で対象物との距離を測定したい場面ありませんか? 私も過去のコンテスト応募作品で、水面との距離を測定して満水を知らせるデバイスや、カーテンを開閉するデバイスで距離センサーを扱いました。 また近年では、自動運転技術の発達で、新たにLiDARセンサーと呼ばれるものが注目され始めました。 この記事では、電子工作でよく用いられる3種類の測定方式のデバイスのメリットデメリットを勉強した備忘録として残そうと思います。 # 赤外線距離センサー その名の通り、赤外線を用いて距離を測定するセンサーです。 有名なものとして、シャープ製のGP2Y0Aシリーズが挙げられます。  (引用 秋月電子 GP2Y0A21YK0F販売ページ https://akizukidenshi.com/catalog/g/gI-02551/) ### 測定原理 測定原理は、赤外線を利用した三角測量です。 三角形は、一片の長さとその両端の角度がわかれば、形が決定する性質を持っていて、三角形の形が決定すれば、未知の辺の長さが分かるというもので、建設現場での測量等でも使われる測定方法です。 シャープ製のGP2Y0A21YK0Fを例にとると、以下のようになっています。  (引用 シャープ GP2Y0A21YK0Fアプリケーションノート https://jp.sharp/products/device/lineup/selection/opto/haca/diagram.html) 赤外線LEDとPSD(Position Sensing Device)の2つの部品構成です。 赤外線LEDから発生した赤外線が物に反射して、距離に応じた角度をもって、PSDセンサへ入射します。 PSDセンサーは、光の入射した位置(角度)に応じて出力が変化するセンサーですので、 マイコン等でPSDセンサーの値を測定し計算すれば、距離が分かるという原理です。 ### メリット ・光を用いているので、検出速度が速い。 ・仕組みが単純なため比較的安価。 ### デメリット ・レンズを使用しているので、レンズが汚れると誤検知の原因となる。 ・光の反射率が極端に低いもの(黒色)、透明なもの検出には向かない。 ・測定範囲は、比較的短い。(GP2Y0A21YK0Fの場合 10cm~80cm) ### サンプルプログラム(GP2Y0A21YK0F) 配線は以下の通りです。 | GP2Y0A21YK | Arduino | |:---:|:---:| | Vcc | 5V | | GND | GND | | Vo | A0 |  ==秋月等で購入した場合ついてくる配線の色がややこしい場合があります、データシートを必ず確認しましょう。== ```arduino:サンプル #define SensorPin 0 int tmp=0; float val = 0; float voltage =0; float distance =0; void setup() { Serial.begin(9600); // シリアル通信の初期化 } void loop() { tmp=0; for(int i=0;i<10;i++){ tmp += analogRead(SensorPin); //10回センサーを読み取る } val=(float)tmp/10.0;//平均する voltage=5.0/1023.0*val; //電圧[V]に換算する distance=190.0/(8.0*voltage-1.0)-0.42; //距離[cm]に換算する Serial.print("val="); Serial.print(val); Serial.print(" voltage="); Serial.print(voltage); Serial.print(" distance="); Serial.println(distance); delay(100); } ``` 距離の換算式は、データシートのグラフを直線に近似して作成しました。  (引用 シャープ GP2Y0A21YK0Fアプリケーションノート https://jp.sharp/products/device/lineup/selection/opto/haca/diagram.html) 実際の個体で換算式を作り直すと誤差が小さくなると思われます。  このように距離を取得することができました。 # 超音波センサー 超音波を用いた、距離センサーです。 よく使われるものに、HC-SR04があります。  (引用 秋月電子 HC-SR04販売ページ https://akizukidenshi.com/catalog/g/gM-11009/ ) ### 測定原理 測定原理は、超音波を発信し、物体に反射して受信するまでの時間を測定して、音速より距離を逆算するというものです。 HC-SR04を例にとると、以下のようになっています。  (引用 秋月電子 HC-SR04 データーシート https://akizukidenshi.com/download/ds/sainsmar/hc-sr04_ultrasonic_module_user_guidejohn_b.pdf ) 測定指令(Trigger)があると送信側の超音波モジュールより、40kHzの超音波を8回送信し、受信するまでの間、ECHO出力がhighになります。 マイコン等より、trigger信号送信後、ECHOピンのHighの時間を測定して、計算することにより距離が求まります。 ### メリット ・対象物の色や材質に影響されにくい(透明でもOK) ・赤外線式に比べて測定距離が比較的広い(HC-SR04の場合 2~400cm) ・ミスト・汚れ等に強い。 ### デメリット ・測定精度が低い。 ・音波を使用するため検出速度は遅い。 ### サンプルプログラム(HC-SR04) 配線は以下の通りです。 | HC-SR04| Arduino | |:---:|:---:| | Vcc | 5V | | Trig | D8 | | Echo | D9 | | GND | GND |  ```arduino:サンプル #define Trig 8 #define Echo 9 int dt; float distance; void setup() { Serial.begin(9600); pinMode(Trig,OUTPUT); pinMode(Echo,INPUT); digitalWrite(Trig,LOW); } void loop() { digitalWrite(Trig,HIGH); //trigger送信 delayMicroseconds(15); digitalWrite(Trig,LOW); dt = pulseIn(Echo,HIGH); //echoがhighの時間を測定 if (dt>0) { distance = (float)dt*340/20000; //音速を340m/sとしてcmに換算 Serial.print("dt="); Serial.print(dt); Serial.print(" distance="); Serial.println(distance); } delay(500); } ``` 音速を340[m/s]と仮定して、 距離[m]=往復時間[s]/2×340[m/s] で距離が求まります。 ※プログラム上はcmに換算しています。  このように距離を取得することができました。 # LiDARセンサー LiDARとは、Light Detection And Rangingの頭文字とをったもので、レーザー光により距離を測定します。 よく使われるものにVL53L1X等があります。  (引用 秋月電子 VL53L1X 使用 レーザー測距センサモジュール 販売ページ https://akizukidenshi.com/catalog/g/gM-14249/ ) ### 測定原理 LiDARセンサーは、様々な方式が現在研究されていますが、実用化されているものの1つとしてToF方式のものがあります。 ToFとは、Time of Flighの略称で、レーザー光を発信して、対象物から反射して受信するまでの時間で距離を測定します。 VL53L1Xもtof方式のLiDARセンサーです。 ### メリット ・光を用いているので、検出速度が速い。
・測定範囲が広い(VL53L0X の場合 10~400cm)
・測定範囲が広い(VL53L1X の場合 10~400cm)
・測定精度が高い ・距離による測定精度が一定 ### デメリット ・比較的高価である ・空気中のミスト等に弱い。 ### サンプルプログラム(VL53L1X 使用 レーザー測距センサモジュール) | VL53L1X| Arduino(Nano) | |:---:|:---:| | Vin | 5V | | GND | GND | | SDA | SDA(A4) | | SCL | SCL(A5) |  pololu社のライブラリを使用しました。(https://github.com/pololu/vl53l1x-arduino) ```arduino:サンプルスケッチContinuous #include <Wire.h> #include <VL53L1X.h> VL53L1X sensor; void setup() { Serial.begin(115200); Wire.begin(); Wire.setClock(400000); // use 400 kHz I2C sensor.setTimeout(500); if (!sensor.init()) { Serial.println("Failed to detect and initialize sensor!"); while (1); } sensor.setDistanceMode(VL53L1X::Long); sensor.setMeasurementTimingBudget(50000); sensor.startContinuous(50); } void loop() { Serial.print(sensor.read()); if (sensor.timeoutOccurred()) { Serial.print(" TIMEOUT"); } Serial.println(); } ```  このように距離を取得することができました。 # まとめ それぞれの距離センサーのメリットデメリットを知ることで、今後のセンサー選定の参考になればと思います。 ++本投稿の情報の利用、内容によって、利用者にいかなる損害、被害が生じても、著者は一切の責任を負いません。ユーザーご自身の責任においてご利用いただきますようお願いいたします++