ご依頼をいただいたので、超音波測距センサが使い物になるのかを検証してみた。
まずは、m5atomにセンサをつないだ装置で、距離データが出るかテスト。
装置は、m5atomのIOポート(G26,G32)に、センサーを繋げただけの簡単なもの。
このセンサーで対象物をちゃんと測距してくれるかが肝となる。
#include "M5Atom.h"
#define TRIG_PIN 26
#define ECHO_PIN 32
int flush_counter = 0;
// FastLEDライブラリの設定(CRGB構造体)
CRGB dispColor(uint8_t r, uint8_t g, uint8_t b) {
return (CRGB)((r << 16) | (g << 8) | b);
}
void displed(int r, int g, int b) {
for (int i=0;i<25;i++){
M5.dis.drawpix(i, dispColor(r, g, b));
}
}
void setup() {
M5.begin(true, false, true); // 本体初期化(UART有効, I2C無効, LED有効)
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
// LED全消灯(赤, 緑, 青)
displed(0, 0, 0);
delay(50); // Delay 50ms.
}
void loop() {
long duration, distance;
// TRIGピンをLOWにしてからHIGHにする
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
// ECHOピンのパルスの長さを測定
duration = pulseIn(ECHO_PIN, HIGH);
// 距離を計算(音速は約34300 cm/s)
distance = (duration / 2) / 29.1;
// 測定結果をシリアルモニタに送信
Serial.print("Distance: ");
Serial.print(distance);
Serial.println(" cm");
if (distance < 10) {
displed(255, 0, 0);
} else if (distance < 30) {
displed(255, 255, 0);
} else {
flush_counter++;
if (flush_counter > 10) {
flush_counter = 0;
M5.dis.drawpix(12, dispColor(0, 0, 255));
} else {
displed(0, 0, 0);
}
}
delay(100); // 0.1秒待機
M5.update(); //本体のボタン状態更新
}
久しぶりのm5Atomで、思い出しながら。あ、ネットで検索すると概ね同じようなコードが出てきますね。
対象物はまだ手元にないので、装置の前に自分が近づいて、データが出力されているのかどうかを調べる。一応、10cm以内で黄色、30cm以内で赤色になっているっぽい。
シリアルモニタ上の出力