[動画]
今回のプログラムを書き込むとこのように動きます。
前面の目玉のような距離センサから距離を測ります。
また、ArduinoIDEからKTR-1と通信し値を取得する方法も盛り込んでいます。
const int LED1 = 14;
const int LED2 = 15;
const int BUZZ = 5;
const int Trig = 7;
const int AIN1 = 3;
const int AIN2 = 6;
const int BIN1 = 9;
const int BIN2 = 10;
const int VR = A0;
const int SW1 = A1;
const int SW2 = A2;
const int ECHO = 8;
//bool HC_SR04_test = false;
今回この2本のピンが超音波センサHC_SR04と繋がっています。
またbool型でHC_SR04_testという変数を宣言しています。
int HC_SR04_mm() {
float duration, distance;
int time_out = 8000;
digitalWrite(Trig, LOW);
delayMicroseconds(2);
digitalWrite(Trig, HIGH);
delayMicroseconds(10);
digitalWrite(Trig, LOW);
duration = pulseIn(ECHO, HIGH,time_out);
distance = (duration / 2) * 0.340;
return (int)distance;
}
こちら呼び出すと超音波距離センサを使い距離を教えてくれる自作関数です。
ちょっと難解なコードですが簡単に言うと
距離センサの2つの目玉のような物体は指向性のある超音波照射と受信ができる部品で
このセンサは超音波を飛ばし返ってきた時間をArduinoへ渡してくれます。
音は約340m毎秒で飛ぶということを考慮して
(超音波が往復した時間÷2(片道にするため))×音速 =壁までの距離
という計算をArduino側で行い壁との距離を測ります。
超音波センサは光学式センサと違い音を使用しているため透明なアクリル等でも距離を測ることができる一方
物体面に対して垂直に図らないと正確な距離が出ないという弱点もあります。
この関数では呼び出されたら距離をmmで返してくれます。このような関数から返ってくる値は戻り値と呼ばれます。
モータの自作関数には戻り値が無かったですよね。
これでKTR-1が壁を認識できるようになったため、一定の距離以下になったらKTR-1を停止するなどの制御も可能になります。
最後のreturn (int)distance;はfloat型で計算していた結果をint型に変換しています。
void setup() {
Serial.begin(9600);
pinMode(Trig, OUTPUT);
pinMode(ECHO, INPUT);
}
Serial.begin(9600);というなぞの記述があります。
こちらはKTR-1とシリアル通信をするため記述しています。
シリアル通信ができるとArduinoで取得した値をPCより確認することが可能です。
今回は距離センサの値をPCより確認するために使用します。
void loop() {
Serial.print("HC_SR04_mm:");
Serial.print(HC_SR04_mm());
Serial.print(",");
Serial.print(0);
Serial.print(",");
Serial.print(100);
Serial.println(",");
if (HC_SR04_mm() < 100) {
// if (HC_SR04_test == false) {
tone(BUZZ, 440, 50); delay(50);
delay(50);
// HC_SR04_test = true ;
// } else if (HC_SR04_mm() >= 100) {
// HC_SR04_test = false ;
}
}
Serial.printはシリアル通信を行いArduinoIDEに対して値を出力する関数です。
Serial.printlnは改行を含む出力です。
早速出力結果を見てみましょう。
ArduinoとPCを接続し、ArduinoIDEの右上シリアルモニタをクリックします。
するとこのように表示されると思います。
HC_SR04_mm:???,0,100,
ここが現在センサより取得された値です。後ろの文字は今は無視してください。
また、文字だけじゃよくわからんという場合は線グラフでの表示も可能です。
ツール>シリアルプロッタを選択するかShiftキーを押しながら先程の右上アイコンをクリックしてください。
HC_SR04_mm:という書き方をするとシリアルプロッタ表示時線色に名前がついた状態になり見やすいです。
また、0,100,も表示したため、音がなる閾値がシリアルプロッタ上に表示されデバッグが容易になります。
後のif分ですが10cm未満になると音が鳴るコードです。
(冒頭)
const int SW2 = A2;
const int ECHO = 8;
//bool HC_SR04_test = false;
(割愛)
if (HC_SR04_mm() < 100) {
// if (HC_SR04_test == false) {
tone(BUZZ, 440, 50); delay(50);
delay(50);
// HC_SR04_test = true ;
// } else if (HC_SR04_mm() >= 100) {
// HC_SR04_test = false ;
}
}
//でコメントアウトしている箇所を復帰させるとピピピピうるさいのが10cm未満になった立ちさがりの時のみ音がなるようになります。
10cm以上になるともう一度鳴らす準備が整います。
コメントアウト・復帰は右クリックから行うと楽です。
筆者はその上の自動整形もよく使用します。
この項が終わったということはKTR-1上のすべての制御が行えるようになったことを示しています!
ここまでお疲れさまでした。
次の項ではまとめとして乗っているセンサを駆使して自律走行のようなコードを考えてもらいます。
前項の発展問題をボタンでの開始でなく、手が近づいたらをトリガに実行しよう。