障害物を避けて自動走行するロボットカー [Arduino]
前方に障害物があると自動的に回避して走行するロボットカーです。
あくまでも簡易的です。超音波センサーで前方の距離を計測して15cm以内ならば、車体をバックしてから左旋回をするようにしています。
写真
使用部品・材料
総額で約4,304円です。(Arduino本体の値段を除く)
部品/材料 | 値段 | 備考 |
---|---|---|
サンハヤト SAD-101 ニューブレッドボード (2個) | ¥1000 | Amazon.com |
超音波距離センサー HC-SR04 | ¥400 | 秋月電子の通販コード(M-11009) |
モータードライバ(TA7291P) (2個) | ¥300 | 秋月電子の通販コード(I-02001) |
タミヤ ユニバーサルプレート 2枚セット (70157) | ¥468 | Amazon.com |
3mmプラネジ(7mm)+六角スペーサー(14mm)セット | (任意) | ユニバーサルプレートの結合用。 秋月電子の通販コード(P-01861) |
タミヤ ツインモーターギヤーボックス (70097) | ¥587 | ギアは低速ギヤー比203:1のCタイプを使用。 Amazon.com |
タミヤ ボールキャスター(2セット入)ボールキャスター(2セット入) | ¥300 | 前輪用。 右側がボールキャスター。左はホームセンターで購入。どちらでもOKです。 秋月電子の通販コード(K-10372) |
タミヤ マンモスダンプ 17013 | ¥819 | 後輪用にタイヤ2個のみを使用しています。 Amazon.com |
電池ボックス 単3x3本 リード線 | ¥60 | モーター用。 秋月電子の通販コード(P-02667) |
単3電池 3本 | ¥100 | モーター用。 100円ショップ |
9V電池 | ¥100 | Arduino用。 100円ショップ |
2.1mmDCプラグ付バッテリースナップ(縦型) | ¥60 | Arduino用。 秋月電子の通販コード(P-07356) |
コネクタ付コード(みの虫×ジャンパーワイヤ) | ¥110 | 電池ボックス用。 秋月電子の通販コード(C-08916) |
マスキングテープ | (任意) | ユニバーサルプレートにArduinoやら電池ボックスなどをこのテープで取り付けます。マスキングテープなので後から綺麗に剥がせます。 ホームセンター |
※超音波距離センサー及びモータードライバの詳細は表内のリンク先をご覧ください。
モーターにはリード線がありませんので「耐熱電子ワイヤー」(P-06756)や片側をカットした「ジャンパーワイヤー」を半田付けして下さい。その2本を繋ぐ場合は2本のリード線をつなぐをご参考にして下さい。
配線図
2つのタイヤが同じ回転方向になるように、モーターの配線を状況に応じて変更して下さい。(配線図で言うと、モーターの黄色・緑色を逆にする)
※前回の自動ブレーキの配線と同じです。
スケッチ(プログラム)
超音波センサーで障害物が15cm以内に出現すると、3秒間後進(車体をバック)して、1.25秒間左旋回をします。
int PIN_R_IN1 = 3; int PIN_R_IN2 = 4; int PIN_R_VREF = 5; // PWM int PIN_L_IN1 = 7; int PIN_L_IN2 = 8; int PIN_L_VREF = 9; // PWM int TRIGGER_PIN = 10; int ECHO_PIN = 11; boolean OnFlg = false; void setup(){ Serial.begin(9600); pinMode(PIN_R_IN1,OUTPUT); pinMode(PIN_R_IN2,OUTPUT); pinMode(PIN_L_IN1,OUTPUT); pinMode(PIN_L_IN2,OUTPUT); pinMode(TRIGGER_PIN, OUTPUT); pinMode(ECHO_PIN, INPUT); // モーターの回転速度を中間にする analogWrite(PIN_R_VREF,127); analogWrite(PIN_L_VREF,127); } void loop(){ // [超音波の発射] // ※トリガーとなるHIGH時間は「10us ~ 60ms」まで digitalWrite(TRIGGER_PIN, LOW); delayMicroseconds(5); digitalWrite(TRIGGER_PIN, HIGH); delayMicroseconds(18); digitalWrite(TRIGGER_PIN, LOW); // [距離の取得] // ※echoピンに入力されるパルスの長さを検出する(HIGH時間の取得/μ秒) int duration = pulseIn(ECHO_PIN, HIGH); if (duration > 0) { // 距離(cm) = ECHOのHIGH時間 x 超音波速度(0.034cm/μ秒) / 2 float distance = (duration * 0.034) / 2; Serial.print(distance); Serial.println("cm"); if(distance >= 15){ if (!OnFlg){ // モーター回転 Serial.println("ok"); digitalWrite(PIN_R_IN1,HIGH); digitalWrite(PIN_R_IN2,LOW); digitalWrite(PIN_L_IN1,LOW); digitalWrite(PIN_L_IN2,HIGH); OnFlg = true; } }else{ // モーター停止 OnFlg = false; digitalWrite(PIN_R_IN1,HIGH); digitalWrite(PIN_R_IN2,HIGH); digitalWrite(PIN_L_IN1,HIGH); digitalWrite(PIN_L_IN2,HIGH); // 後ろへ戻る digitalWrite(PIN_R_IN1,LOW); digitalWrite(PIN_R_IN2,HIGH); digitalWrite(PIN_L_IN1,HIGH); digitalWrite(PIN_L_IN2,LOW); delay(3000); // 左へ旋回 digitalWrite(PIN_R_IN1,HIGH); digitalWrite(PIN_R_IN2,LOW); digitalWrite(PIN_L_IN1,HIGH); digitalWrite(PIN_L_IN2,HIGH); delay(1250); } } delay(200); }
あくまでも簡易的ですので、各自の環境に合わせて調整をして下さい。
スポンサーリンク
掲示板
ArduinoやRaspberry Piなどの電子工作の掲示板を作成しました。質問やわからない事は電子工作 (Arduino・ラズパイ等)でユーザー同士で情報を共有して下さい。
関連記事
公開日:2017年12月03日 最終更新日:2017年12月09日
記事NO:02616