自動走行車に測距センサーを使って衝突回避機能をつけたかった Arduino+HC-SR04

スポンサーリンク
スポンサーリンク

測距センサー(HC-SR04)

測距センサーを使うと距離を測れる。このHC-SR04だと線4本で扱えるのですごく簡単みたい。やってみたけどちょっと中途半端になった。

スポンサーリンク

お買い物

超音波距離センサー HC−SR04: センサ一般 秋月電子通商-電子部品・ネット通販
電子部品,通販,販売,半導体,IC,マイコン,電子工作超音波距離センサー HC−SR04秋月電子通商 電子部品通信販売

秋月で買いました。これの他にもToFっていうなんかレーザー使ったやつみたいなのとかあったけど、ちょっとお高めなのでこっちにした。あとあっちは線が多い。機会があったら使ってみよう。

スポンサーリンク

取り付ける

電源とGNDとトリガーとエコーを接続する。トリガーとエコーでスタートと読み取りを制御するようだ。

目ン玉みたいになった。かわいい。背が高くなってバランスがちと悪い。

スポンサーリンク

スケッチを作成

#define PIN_IN_A1 9
#define PIN_IN_A2 10
#define PIN_IN_B1 1
#define PIN_IN_B2 11
#define TRG_PIN 2
#define ECHO_PIN 3
long randomNum = 0;
double Duration = 0;
double Distance = 0;

void setup() {
  pinMode(PIN_IN_A1, OUTPUT);
  pinMode(PIN_IN_A2, OUTPUT);
  pinMode(PIN_IN_B1, OUTPUT);
  pinMode(PIN_IN_B2, OUTPUT);
  pinMode(TRG_PIN, OUTPUT);
  digitalWrite(TRG_PIN, LOW);
  pinMode(ECHO_PIN, INPUT);
  randomSeed(analogRead(0));
}

double measureDistance() {
  digitalWrite(TRG_PIN, HIGH);
  delayMicroseconds(10);
  digitalWrite(TRG_PIN, LOW);
  Duration = pulseIn(ECHO_PIN, HIGH);
  if (Duration > 0) {
    Duration = Duration / 2; //往復距離を半分にする
    Distance = Duration * 340 * 100 / 1000000; // 音速を340m/sに設定
  }
  return Distance;
}

void forward() {
  digitalWrite(PIN_IN_A1, HIGH);
  digitalWrite(PIN_IN_A2, LOW);
  digitalWrite(PIN_IN_B1, HIGH);
  digitalWrite(PIN_IN_B2, LOW);
}

//略

void loop() {
  double d = 0;

  d = measureDistance();

  if (d < 10) {
    reverse();
    delay(1000);
    coast();
    rotateRight();
    delay(1000);
    coast();
  }

  randomNum = random(0, 7);

  switch (randomNum) {
    case 0:
      forward();
      break;
    case 1:
      reverse();
      break;
    case 2:
      turnLeft();
      break;
    case 3:
      turnRight();
      break;
    case 4:
      rotateLeft();
      break;
    case 5:
      rotateRight();
      break;
    case 6:
      coast();
      break;
    case 7:
      brake();
      break;
  }
  delay(1500);
  brake();


}

距離を取得する部分は参考サイトで公開されているものを使わせていただいた。また、前回は動きを決めてloop内に書いていたが、randomを使って動きを不規則にしてある。で、ですけど。うまくいかない。上記のコードは

  1. 距離を測る。
  2. 距離が閾値以下だったら後退して右旋回する。
  3. ランダムな値を取得する。
  4. 値を元に動きを決める。
  5. 2秒待つ。(2秒間同じ動きのままになる。)
  6. 1に戻る

という感じ。これだと、2秒待ってる間に障害物があった場合、ぶつかる。理想というか考えたのは、測距処理と走行処理を分けて、測距処理がぶつかりそうと判断した場合、走行処理を中断して回避行動を取る、みたいな流れにしたかった。ただそれを実現する方法がわからない。全然わからない。なんとなくマルチスレッドとかマルチタスクとか、割り込みとか、そういうのかなーと思ったけど、どうなんだろ…。ちょっとあんま意味ない感じの、中途半端な機能になっちゃったなぁ。

スポンサーリンク

動画

スポンサーリンク

参考

Arduinoでパーツやセンサを使ってみよう~超音波モジュール編 | Device Plus - デバプラ
今回は、同じ距離を測るセンサとして利用される超音波センサを取り上げます。フォトリフレクタは数センチの至近距離を計測するのに比べ、超音波センサでは大体2cm〜4mまで測ることができます。
Arduino 日本語リファレンス

 

思いついたのでちょっと変える

コメント

タイトルとURLをコピーしました