光センサを組み立てて車体へ取り付ける
第1回:モータドライバを作りArduinoからモータ制御をする
Arduinoを使った簡単工作を通して、初心者の方向けに電子工作の原理や基本を学ぶ連載の第2回です。教えてくれるのは、メディアアートの分野で、また「ちょっと深い仕組み」を解説する書籍の世界で活躍している、伊藤尚未さんです。それでは早速今回もいってみましょう!
目次
①はじめに
こんにちは、伊藤尚未です。今回の連載では、Arduinoを使ったライントレースカーを作っていきますが、前回はモータドライバまでを作り、ギヤボックスの組み立てで終わってしまいました。とにかくタミヤさんの製品は子供のころより慣れ親しんでおりますし、洗練された部材と説明書で、まず間違いなく組み立てることができます。問題なのは、細かいものがメガネなしでできない私でございまして…(笑)。
ギヤボックスの組み立てに特に大きな問題はないのですが、ライントレースカーの鉄則としてギヤ比は大きな方、つまり遅く走るようにするのが良いようです。これは車体自体があまりにも速く走りすぎると、センサが反応しても車体の走行慣性により制御する前に行き過ぎてしまう可能性があるからです。
ですから、ここではツインモーターギヤーボックスはギヤ比を低速(203:1)にした組み合わせで組み立てました。
次にユニバーサルプレートとトラック&ホイールセットで車体自体を組み上げます。トラック&ホイールセットのキャタピラーはセットの中にある全コマ使っています。
今回の工作で使う部品:
名前、説明 | 部品 |
---|---|
Arduino UNO | |
モータ(FA-130RA) | |
ブレッドボード(400穴) | |
ツインモーターギヤボックス ユニバーサルプレートセット トラック&ホイールセット (すべてタミヤ) |
|
抵抗器(1kΩ 1/4W) | |
ユニバーサル基板 | |
ピンソケット
(分割ロングピンソケットを6Pに分割) |
|
トランジスタ(2SB1259、2SD2081) |
②光センサの組み立て
床のラインを読み取るために光センサを使うのですが、今回はフォトトランジスタの「NJL7502L」を使いました。このフォトトランジスタは人間の視覚に近い感度特性を持っているので、扱いやすく、工作しやすい素子として、自分は良く使っています。
ざっくりと説明しますと、トランジスタはベースに入力があればコレクタ~エミッタ間に増幅出力します。…と言っても分かりにくいかもしれないので、こういう言い方ではどうでしょう。
例えばNPN型トランジスタのスイッチングという機能の面で考えてみます。
通常、コレクタ~エミッタ間はスイッチOFFの状態ですが、ベースにプラスの電気を流し込むことで、コレクタ~エミッタ間をスイッチONの状態にするというものです。
フォトトランジスタはベースへの入力が電気ではなく光ということになります。つまり明るければコレクタ~エミッタ間が導通し、暗ければ導通しません。増幅ということであれば、明るければ明るいだけ電気の流れが大きくなるということです。
今回は床の線を読みたいので、まずLEDで光を当てて反射する光を読み取るようにしました。LEDは床の状態や車体の走行に関わらず点灯していて欲しいので、Arduinoから電源として5v~GND間に電流制限抵抗器200Ωと直列に接続しています。この光を読みとれるよう、フォトトランジスタを並べてArduinoに入力しましょう。この時にフォトトランジスタのエミッタ~GND間に10kΩの抵抗器を接続し、プルダウンしています。まずはこれを使いArduinoに接続する回路図を描きました。
プルダウンは入力の待機状態を強制的にマイナス側につなげる役割をします。対して強制的にプラス側にすることをプルアップと言います。マイコンなどデジタル機器の場合、入力がHigh(プラス)なのか、Low(マイナス)なのか不定の場合があるとエラーを起こす可能性があるので、回避のためにもプルダウン、プルアップという方法を取りましょう。
さて、これで床の線が読み取れるようになるのでしょうか?
③床の線が読み取れるか?
センサ基板をひとつ取り出し、Arduinoにつなげてみます。スケッチはこんなカンジです。
int sensorPin1 = A1; // 右センサー int sensorPin2 = A2; // 左センサー int sensorValue1 = 0; // 右センサーの値 int sensorValue2 = 0; // 左センサーの値 void setup() { Serial.begin(9600); } void loop() { sensorValue1 = analogRead(sensorPin1); sensorValue2 = analogRead(sensorPin2); Serial.println(sensorValue1); Serial.println(sensorValue2); delay(500); }
実際に白い紙に黒い線を描いて、センサで読み取れるものか実験してみます。ライントレースの鉄則のひとつですが、線は太い方が読み取りやすいです。反射した光がセンサ側ではっきりと分かるようにする必要があり、線が細いとセンサで読み取りにくくなってしまうからです。実際に太さ20㎜ほどの線を描き、シリアルモニタで一部を見てみますと…
369 91 254 26 371 41 421 60 430 48 401 51 387 60 400 226 398
確かに反応していますね。数値がかなり正確に反応していることが分かります。白いところでは200から400の数値になりますが、黒い線のところでは100以下になります。もちろん、環境照度やセンサと紙(床)の距離などにも影響するかと思いますが、数値で明らかに別だと判断できれば、機能としては十分でしょう。
これで動くはずです!
④車体への組み込み
これらを車体に組み込むとライントレースカーができるはず!ということで、ユニバーサルプレートにそれぞれを組み込みます。車体前方にセンサを設置し、線の幅よりちょっと広くするように基板をハの字に取り付けます。
Arduinoの幅はキャタピラの位置側に入りそうですが、コード類が絡まってしまうと大変なので、ゲタで底上げしましょう。電池類はギヤボックスの上など、各ユニットの配置も重要になりますね。
というところで第2回はここまで。次回は、光センサによりライントレースロボットが走るようにするため、センサ、ドライバ、マイコンを車体に組み込み、ライントレーサーとしての機能を確認していきます。
お楽しみに!
今回の連載の流れ
第1回:モータドライバを作りArduinoからモータ制御をする
第2回:光センサを組み立てて車体へ取り付ける(今回)
第3回:センサ、ドライバ、マイコンを車体に組み込みライントレーサーとして仕上げる
第4回:ライントレース機能を拡張、改造し、センサー部分とプログラムを変更する