障害物を避けて自動走行するロボットカー [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
プチモンテ ※この記事を書いた人
![]() | |
![]() | 💻 ITスキル・経験 サーバー構築からWebアプリケーション開発。IoTをはじめとする電子工作、ロボット、人工知能やスマホ/OSアプリまで分野問わず経験。 画像処理/音声処理/アニメーション、3Dゲーム、会計ソフト、PDF作成/編集、逆アセンブラ、EXE/DLLファイルの書き換えなどのアプリを公開。詳しくは自己紹介へ |
| 🎵 音楽制作 BGMは楽器(音源)さえあれば、何でも制作可能。歌モノは主にロック、バラード、ポップスを制作。歌詞は抒情詩、抒情的な楽曲が多い。楽曲制作は🔰2023年12月中旬 ~ | |











