自動走行ロボットカー(ライントレースカー) [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電池ボックスをモーターの電源としてプラスマイナスを逆に使用するとダイオードが熱くなって危険ですので注意して下さい。 [使用例] |
画用紙(白) | ¥100 | 100円ショップ |
黒紙 | ¥100 | 100円ショップ |
9V電池 | ¥100 | Arduino本体用 |
単3電池 2本 | ¥50 | モーター用 |
2.1mmDCプラグ付バッテリースナップ | ¥60 | 9V電池用。 秋月電子の通販コード(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Ωになります。
※今回は多めに220Ωを使用しています。
RL - (4)のコントローラー
2枚目の図を見る限り「1kΩ」が基準です。
1kΩの固定抵抗器の他に10kの可変抵抗を追加するものアリだと思います。
Arduinoの最大電流
参考サイト
ライントレーサーを作ろう
フォトセンサーで物体の存在を検出する
最後に
タイトルの「自動走行ロボットカー」とは誇大表現です :-)
今回の作品ではセンサーは2つでしたが「左、中央、右」で3つあると自動走行の安定性が増します。また、モーターを使用していますので、電圧の安定化やノイズ対策にコンデンサを追加するなど改良の余地があります。
掲示板
ArduinoやRaspberry Piなどの電子工作の掲示板を作成しました。質問やわからない事は電子工作 (Arduino・ラズパイ等)でユーザー同士で情報を共有して下さい。