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

測距センサー(HC-SR04)

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

お買い物

http://akizukidenshi.com/catalog/g/gM-11009/

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

動画

参考

https://deviceplus.jp/hobby/entry016/

http://www.musashinodenpa.com/arduino/ref/index.php

 

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

カテゴリー: したい タグ: , , , パーマリンク

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です