センサ、ドライバ、マイコンを車体に組み込みライントレーサーとして仕上げる
第1回:モータドライバを作りArduinoからモータ制御をする
第2回:光センサを組み立てて車体へ取り付ける
Arduinoを使った簡単工作を通して、初心者の方向けに電子工作の原理や基本を学ぶ連載の第2回です。教えてくれるのは、メディアアートの分野で、また「ちょっと深い仕組み」を解説する書籍の世界で活躍している、伊藤尚未さんです。それでは早速今回もいってみましょう!
目次
今回の工作で使う部品:
名前、説明 | 部品 |
---|---|
Arduino UNO | |
ツインモーターギヤボックス ユニバーサルプレートセット トラック&ホイールセット (すべてタミヤ) |
|
抵抗器(1kΩ 1/4W) | |
ユニバーサル基板 | |
ピンソケット
(分割ロングピンソケットを6Pに分割) |
|
抵抗器10kΩ | |
抵抗器200Ω | |
赤色LED | |
NJL7502L | |
単4×2電池ボックス | |
電池スナップ | |
プラグ(2.1mm) | |
0.65単芯ビニール線 | |
熱収縮チューブ | |
トランジスタ(2SB1259、2SD2081) |
①ライントレースカーの全体像
こんにちは、伊藤尚未です。今回の連載では、Arduinoを使ったライントレースカーの制作を紹介しています。前回までで仕組みや駆動部品、プログラムなどを作ってきましたが、いよいよ全体の組み立てです。実際に車体を組み上げてみますとこのような形になりました。
Arduinoはキャタピラにコード類が絡まるのを防ぐよう、スチレンボードで作った台(ゲタ)の上に設置。この台にはモータドライバをセンサの上に張り出す形で設置しました。Arduinoの電源は006P形、モータの電源は単4形2本を使い、電池ボックスをギアボックスの上に設置しました。
それぞれの部品は簡易に両面テープで貼り付けています。特に基板はハンダ面に貼り付けていますが、ハンダの凸凹を吸収するためにもクッション付きで厚手の両面テープの方が貼りつきやすいです。
006Pの電池スナップは直接プラグを接続しています。Arduinoの電源は7〜12Vとなっていますから9Vで十分でしょう。この電池スナップに直接プラグを付けているのは結構便利です。
モータのリード線にはピンソケットに差し込み接続するので、0.65φの単芯ビニール線をハンダ付けで接続しています。絶縁のために熱収縮チューブを付けています。
左右のセンサからArduinoへの配線は電源(5V)とGNDが共通ですから、途中で分岐するような形でビニール線を接続しています。
Arduinoとモータドライバを接続するところも、ピンソケットに差し込むように0.65φの単芯ビニール線を使用。このサイズの単芯ビニール線はブレッドボードの配線にも差し込みやすく、しっかり接続できるので、非常に便利でよく使っています。
②全体の回路図とArduinoスケッチ
改めて全体の回路を示しますとこのような形になります。
センサからArduinoへの入力はA1とA2のピンを使い、モータドライバへの出力は9、10、11、12のピンを使っています。ハードウエアとしてはここまでで十分でしょう。もし、モータの回転が逆回転だとか接続が間違っていたとしてもソフトウエア(スケッチ)で調整できるので、大きな問題はないかと思います。
あとは自分の設計、把握できる範囲で接続を修正してもいいですし、もちろんピンソケットの抜き差しでも修正できますから、さまざまな部分で修理が簡単にできるでしょう。
Arduinoスケッチはこのようにしました。
int sensorPin1 = A1; // 右センサー int sensorPin2 = A2; // 左センサー int sensorValue1 = 0; // 右センサーの初期値 int sensorValue2 = 0; // 左センサーの初期値 void setup() { Serial.begin(9600); //シリアルモニター確認用 pinMode(12, OUTPUT); //12~9番ピンを出力にしてモータードライブに送る pinMode(11, OUTPUT); //12、11が右モーター pinMode(10, OUTPUT); //10、9が左モーター pinMode(9, OUTPUT); digitalWrite(12, LOW); digitalWrite(11, LOW); digitalWrite(10, LOW); digitalWrite(9, LOW); } void loop() { sensorValue1 = analogRead(sensorPin1); sensorValue2 = analogRead(sensorPin2); Serial.println(sensorValue1); if ( sensorValue1 > 200 ){ //右センサーが黒を感じたら右モーターを逆転 digitalWrite(12, HIGH); digitalWrite(11, LOW); } else{ digitalWrite(12, LOW); digitalWrite(11, HIGH); } Serial.println(sensorValue2); if ( sensorValue2 > 200 ){ //左センサーが黒を感じたら左モーターを逆転 digitalWrite(10, HIGH); digitalWrite(9, LOW); } else{ digitalWrite(10, LOW); digitalWrite(9, HIGH); } delay(100); //0.1秒ごとの動作 }
前回のセンサの値を参考に200を閾値に線をセンシングしています。床とセンサとの距離やLEDの明るさ、環境照度にもよると思いますので、このあたりは挙動をみながらの閾値を調整ですね。
白いカードに黒い線を太めに描き、車体を台に載せたり手で持つなど浮かせながら、センサと床との距離を考えて、黒い線を読み取れるか確認します。
この時にArduinoの電源を006p電池ではなくパソコンからのUSBケーブルで繋ぎ、ついでにシリアルモニタで値を確認しておきましょう。閾値を変える必要があれば、これも調整範囲ですね。
③実際に走行させてみる
実際に走らせてみるとなかなかどうして、一応線を追って走ってくれました。こういった工作は「ちゃんと動くかな?」「うまく曲がってくれるかな?」とヒヤヒヤしながら見るものですが、やはり思った通りに動いてくれると嬉しさもひとしおです。
ところがテスト走行させると、いろいろな問題も見えてきました。動きを見てもわかるように、線を検知してから左右にちょこちょこと振れることが多いです。
例えば右のセンサが黒い線を検知したときに右のモータを逆回転にすることで、今度は左のセンサが黒い線を検知し、反対周りに旋回する。見ていると進む方向を探しながらきょろきょろと、何度も悩みながら行ったり来たり、ちょっとずつ進むという、まるで自分の人生を見ているようで切なくなりますな…(汗)。
これを分析考察すると、モータを逆回転するということで車体中央を中心に回る超信地旋回になりますので、センサ部分が必要以上に大回りしてしまうことに原因のひとつがあるように思えます。他にユニバーサルプレートの長さを最大限に使うことで、キャタピラの全コマ使ってしまったことで、多少ユルくなり、スプロケットホイールが空回りする場面もありました。こうやって見るとまだまだ改良の余地が多くあるようです。
④さらなる機能追加を目指して
さて、実際に走らせてみると、課題も見えてきましたので沸々とさらに改良、改造したくなるものです。もちろん車体自体をカッコいいものにしたいという衝動もありますが、ここでは機能面で考えましょう。
ライントレースカーの機能的には最低限のことは果たせたとしても、もっとスムーズに動かしたいとか、フェールセーブというのも付加したくなります。ソフトウエア、ハードウエアの両面でさまざまな対応方法が考えられます。
私的にはライントレースカーのお決まりである「床の線が黒」なところも変えてみたいという衝動に駆られます。もちろん黒地に白い線でも構いませんが、赤や青の線にしてセンサで色を判断し、例えば途中で脱線してみて、また戻るという芸当もできるのではないか、などと考えたり…。
ということで、最終回となる次回は、車体の改良とセンサの改造、そして機能追加を紹介していきたいと思います。
お楽しみに!
今回の連載の流れ
第1回:モータドライバを作りArduinoからモータ制御をする
第2回:光センサを組み立てて車体へ取り付ける
第3回:センサ、ドライバ、マイコンを車体に組み込みライントレーサーとして仕上げる(今回)
第4回:ライントレース機能を拡張、改造し、センサー部分とプログラムを変更する