M5StackでHC-SR04を使う
Grove 超音波距離センサー編
センサー
SEEEDから発売されているGROVE - 超音波距離センサモジュールを使います.
M5Stack
Grove端子が使えるCore2を使います.
BASICもGroveの端子がありますが,HC-SR04では使えませんでした.
プログラム
ライブラリ
SEEEDのライブラリGrove_Ultrasonic_Rangeをダウンロードして,IDEに追加しておきます.
ソース
距離計測だけではなく,センサーから得られる超音波を発信してから反射して戻ってくるまでの時間を計測したかったので,MeasureDuration()を追加(ライブラリの関数を修正して,距離を返さずに時間を返しているだけ)しています.距離のみ計測して表示するなら不要です.
#include <M5Core2.h>
#include "Ultrasonic.h"
#define PIN G33
Ultrasonic ultrasonic(PIN);
void setup()
{
M5.begin(true, true, true, false); // I2C無効(PORTA をGPIOで使用するため)
//M5.Power.begin();
M5.Lcd.setTextSize(2);
M5.Lcd.println("Ultrasonic HC-SR04");
M5.Lcd.setCursor(10, 30);
M5.Lcd.println("Distance to obstacles");
}
void loop()
{
long duration;
long RangeInCentimeters;
const double soundvelocity = 34350./1000000.; //[cm/usec at 20 degrees Celsius]
duration = MeasureDuration(); // two measurements should keep an interval
M5.Lcd.setCursor(0,46);
M5.Lcd.printf("%10d usec \n", duration);
RangeInCentimeters = duration * soundvelocity / 2.;
M5.Lcd.printf("%10d cm \n", RangeInCentimeters);//0~400cm
//M5.Lcd.print(RangeInCentimeters);
delay(500);
}
/*The measured distance from the range 0 to 400 Centimeters*/
long MeasureDuration(void)
{
pinMode(PIN, OUTPUT);
digitalWrite(PIN, LOW);
delayMicroseconds(2);
digitalWrite(PIN, HIGH);
delayMicroseconds(5);
digitalWrite(PIN,LOW);
pinMode(PIN,INPUT);
long duration;
duration = pulseIn(PIN,HIGH);
//long RangeInCentimeters;
//RangeInCentimeters = duration/29/2;
return duration;
}
完成
HC-SR04編
Groveと違って,センサーの出力が5Vなので,抵抗をつかって降圧させる必用があります.
M5StackGrayで超音波距離センサ(HC-SR04)の動作テストなど,多くのページで情報があるので参考にしました.