TOP > カテゴリ > ロボット・電子工作・マイコン >

自動走行ロボットカー(ライントレースカー) [Arduino]

黒いレールの上を自動制御で走行するロボットカー。

車の先端に2つのセンサー(フォトリフレクタ)を設置して、黒いレールを読み取り「走行する向き」を自動制御しています。

[自動制御の仕組み]

左方向へ左のセンサーが黒を認識したら、右のモーターを回す。
右方向へ右のセンサーが黒を認識したら、左のモーターを回す。

写真

[表]

[裏]

使用部品・材料

総額で約3000円です。(Arduino本体の値段を除く)

部品/材料値段備考
ブレッドボード¥270秋月電子の通販コード(P-00315)
ミニブレッドボード(BB-601)¥130秋月電子の通販コード(P-05155)
フォトリフレクタ(LBR-127HLD)
2個
¥50光の反射をアナログ値で取得するセンサー。
秋月電子の通販コード(P-04500)
NchパワーMOSFET 2SK703
2個
¥60このトランジスター(MOSFET)はモーターを動作させる為の電気的なスイッチです。

秋月電子の通販コード(I-11616)
秋月電子の通販コード(I-11616)
ダイオード(IN4007 MIC)
2個
数円ダイオードはモーターから発生する逆起電力でトランジスターやArduinoが壊れないように防ぎます。

The Arduino Starter Kit(日本語版)に付属していたダイオードを使用しています。(IN4007シリーズならほぼ同じだと思います)
カーボン抵抗器数円220Ω(2個)と1KΩ(2個)を使用
前輪用のキャスター¥100大きなホームセンターで白いキャスターを購入。アマゾンだと「タミヤ ボールキャスター 2セット入 (70144)」(903円)も検討すると良いです。
タミヤ
ユニバーサルプレート 2枚セット (70157) 
¥468
タミヤ
ツインモーターギヤーボックス (70097)
¥587ギアは低速ギヤー比203:1のCタイプを使用します。

1つのモーターの電圧は恐らく1.5Vから3Vです。9Vでモーターを回すと超高速になりますのでモーターが壊れる可能性が高いのでご注意ください。
タミヤ
マンモスダンプ 17013
¥819タイヤ2個単3電池ボックスのみを使用しています。

単3電池ボックスをモーターの電源としてプラスマイナスを逆に使用するとダイオードが熱くなって危険ですので注意して下さい。

[使用例]
画用紙(白)¥100100円ショップ
黒紙¥100100円ショップ
9V電池¥100Arduino本体用
単3電池
2本
¥50モーター用
2.1mmDCプラグ付バッテリースナップ¥609V電池用。
秋月電子の通販コード(P-07357)
コネクタ付コード(みの虫×ジャンパーワイヤ)¥110単3電池ボックス用。
秋月電子の通販コード(C-08916)

配線図

※大きい配線図はZIPで提供しています。

FritZingで配線図を作成する時にMOSFET/フォトリフレクタのパーツがないので、他のパーツで代用しています。特にフォトリフレクタは次の実際の写真のように設置して下さい。

1アノード(長いリード)
2カソード
3エミッター(長いリード)
4コレクター

電子部品を扱う前に型番などからデータシートをネットで検索して詳細をご確認ください。

スケッチ(プログラム)

ロボットカーの走行テスト時には「床は白色/ラインは黒色」で昼間でも部屋の電気を点けてやると良いです。また、環境によってセンサーの取付位置、センサーの閾値(しきいち)などを適宜、変更してください。

 const int r_motorPin =    9;  // 右のモーター
 const int l_motorPin =   10;  // 左のモーター
 const int threshold  = 1000;  // センサーの閾値
 
 void setup() {
     Serial.begin(9600) ;   
     pinMode(r_motorPin, OUTPUT); 
     pinMode(l_motorPin, OUTPUT);  
 }
 
 void loop() {
  
  // 起動10秒でモーターを停止する
  if(millis() < 10000){

    // 左のセンサーの値
    int green = analogRead(A0)  ;  
    // 右のセンサーの値
    int white = analogRead(A1)  ;  

    Serial.print(" L");
    Serial.print(green);
    Serial.print(" R");
    Serial.print(white);
    Serial.print("\r\n");
    
    digitalWrite(r_motorPin, LOW);
    digitalWrite(l_motorPin, LOW);
    
    // 直進
    if(green < threshold && white < threshold){
      digitalWrite(r_motorPin, HIGH);
      digitalWrite(l_motorPin, HIGH); 
    
    // 左へ  
    }else if(green >= threshold && white < threshold){
      digitalWrite(r_motorPin, HIGH);
      digitalWrite(l_motorPin, LOW); 
    
    // 右へ  
    }else if(white >= threshold && green < threshold){
      digitalWrite(r_motorPin, LOW);
      digitalWrite(l_motorPin, HIGH); 
    }
  }else{
    // モーターの完全停止
    digitalWrite(r_motorPin, LOW);
    digitalWrite(l_motorPin, LOW);   
  }
 }

※電源を投入すると自動で走りますので注意して下さい。

ハンダ付け

ツインモーターギヤーボックスのモーターにはリード線がありませんので、ハンダ付けでリード線を付けます。

さらに、ブレッドボードに差しやすいようにジャンパーワイヤーの先端を「熱収縮チューブ」(秋月電子の通販コード P-08635)で接着すると良いです。(半田ごてを使用すると接着しやすいです)

※最初から長いジャンパワイヤーがある場合は片方の先端を切り落として、モーターにハンダ付けをする方が早いかもです。

抵抗値の計算

フォトリフレクタ(LBR-127HLD)に使用するカーボン抵抗器の算出です。

[LBR-127HLDのデータシート]
※次の2枚の図は公式データシートから引用しています。

この図から抵抗はRDとRLに設置します。RD(Dynamic resistance)は動作抵抗。RL(Load resistance)は負荷抵抗です。

こちらはRL(Load resistance)の表です。

RD - (1)のアノード

Arduinoの電源5V(V)。フォトリフレクタのデータシートに記載されている順方向電圧(Forward voltage/VF)は1.5V。電流を20mA(IF)にするとオームの法則で175Ωになります。

175Ω = (5V - 1.5V) / 0.020A

※今回は多めに220Ωを使用しています。

RL - (4)のコントローラー

2枚目の図を見る限り「1kΩ」が基準です。

1kΩの固定抵抗器の他に10kの可変抵抗を追加するものアリだと思います。

Arduinoの最大電流

Arduinoでは1つのI/Oピン当り最大電流20mA。I/Oピン全部の合計で100mAまで。1ピンに40mAを流すとArduinoが壊れるようです。

参考サイト

ライントレーサーを作ろう
フォトセンサーで物体の存在を検出する

最後に

タイトルの「自動走行ロボットカー」とは誇大表現です :-)

今回の作品ではセンサーは2つでしたが「左、中央、右」で3つあると自動走行の安定性が増します。また、モーターを使用していますので、電圧の安定化やノイズ対策にコンデンサを追加するなど改良の余地があります。





関連記事



公開日:2017年03月26日 最終更新日:2017年08月20日
記事NO:02307