今回は、Arduinoと超音波センサで距離を測定し、距離に応じてLEDの明るさを変化させる方法を紹介します。LCDの使用方法については、以前の記事(ArduinoでSTEM教育-基礎編:LCD)を参照してください。
目次
使用する部品一覧
使用する部品は図のとおりです。これらの部品は、すべて「ELEGOO Arduino用のMega2560スタータキット」に含まれています。
- Arduino MEGA2560 R3 …1個
- 830穴 ブレッドボード …1個
- LCD1602モジュール …1個
- ポテンショメータ(10kΩ) …1個
- 超音波センサ(HC-SR04) …1個
- LED …1個
- 抵抗(220Ω) …1個
- ジャンパワイヤ(オス-メス) …4個
- ジャンパワイヤ(オス-オス) …18個
超音波センサ(HC-SR04)の特徴や取り扱い方法
超音波センサ(HC-SR04)は、測定可能距離が2cm~400cmのモジュールです。モジュールから超音波を送信し、物体にあたって跳ね返ってくるまでの時間を計測することで、距離を算出しています。リードは、電源、GND、トリガ、エコーの4本あります。
超音波センサの測定原理
超音波センサの測定原理について説明します。トリガ端子にHighを10us以上入力すると、モジュールは40kHzの超音波を8回出力します。その超音波が物体にあたって、反射波が帰ってくるまで、エコー端子はHighを出力します。40kHzの反射波が帰ってくると、エコー端子はLowを出力します。したがって、エラー端子のHigh期間の時間を計測することで、測定距離を計算できます。音の速度は室温でおよそ340m/sなので、次の式で計算します。
測定距離 = Highレベル時間×音速(340m/s)÷2
回路図
超音波センサ(HC-SR04)の電源(VCC)端子は5Vに接続、グランド(GND)はGNDに接続、トリガ(Trig)端子はD2端子に接続、エコー(Echo)端子はD3端子に接続します。
LEDのアノード(LED端子の長い方)はD6端子に接続し、カソード(LED端子の短い方)は電流制限抵抗(220Ω)と直列に接続してGNDに落とします。
配線図
ブレッドボードを使用した配線は図のとおりになります。
組立完成写真
実際に組み立てた写真です。同じようにできましたか?
プログラム
最初に、超音波センサモジュール用のライブラリ(SR04.h)を#includeで読み込みます。そして、SR04クラスを使用するために、SR04(ECHO_PIN, TRIG_PIN)で準備をします。センサで測定した距離を格納する変数をdとして宣言しておきます。
メインループでは、sr04.Distance()で測定距離を得て、変数dに値を格納します。LEDの輝度を設定するために、map(value, fromLow, fromHigh, toLow, toHigh)関数を使用して、測定距離0cm~200cmの範囲を0~255の値(PWMの範囲)に変換します。最後に、LCDに測定距離を表示させるためのプログラムを記述します。
//www.stemship.com //2019.10.14 #include <LiquidCrystal.h> #include <SR04.h> #define TRIG_PIN 2 #define ECHO_PIN 3 #define LED_PIN 6 SR04 sr04 = SR04(ECHO_PIN,TRIG_PIN); long d; //センサ測定距離[cm] // BS E D4 D5 D6 D7 LiquidCrystal lcd(7, 8, 9, 10, 11, 12); void setup() { lcd.begin(16, 2); lcd.print("<Ultrasonic>"); } void loop() { //センサ測定距離[cm] d = sr04.Distance(); //LEDの輝度設定 int intensity = map(d, 0, 200, 0, 255); analogWrite(LED_PIN, intensity); //LCD表示 lcd.setCursor(0, 1); lcd.print("Distance= cm"); lcd.setCursor(10,1); lcd.print(d); //500ms待つ delay(100); }
動かしてみよう
プログラムを書き込んで、実際に動かしてみてください。
今回学んだポイント
- 超音波センサは、超音波を送信して反射波が帰ってくるまでの時間を測定することで、距離を計算している。
- 超音波センサモジュール用のライブラリ(SR04.h)を使用すれば、上記の計算後の値[cm]を得ることができる。
- map()関数を使用することで、ある範囲から別の範囲に変換することができる。
改造してみよう
もう少し理解を深めるために、自分で改造してみてください。
- 測定距離が100cm以上のときは、LEDがOFFになるようにしてみよう。
- さらに、測定距離が近づくにつれて、LEDが明るくなるようにしてみよう。
コメントを残す