前回に引き続き、ロボットカーを組み立ててみたいと思います。ロボットカーの組み立てには、電子工作は勿論のこと、普通に「工作」の部分も必要になります。その辺り、筆者が苦手とする部分なので、出来合いのキットを活用して凌ぎたいと思います。
制御用のマイコンとしては、以前作成した「UNO 3.3V化328duino」を使います(下図およびリンクを参照)。
Arduino UNO(5V版)でも良いのですが、将来、3.3V定格部品との接続を予定しているので、3.3V版UNOとして使用可能な、「UNO 3.3V化328duino」を使います。そうしておくと、3.3V定格部品との通信信号線に一々レベルシフタ(L/S)を挟まなくて済みます。
※それに、コンパクトなロボットカープラットフォームに搭載するには、UNOだと筐体が大きいので難儀です。
ところが早速、こちらのL293Dデータシート等から明らかな様に、モータドライバL293Dの制御信号は5V定格なのでした。L293Dの電源端子VsおよびVssの電気的特性は以下の通り規定されています。
マイコン側328duinoは3.3V駆動なので、本来ならばレベルシフタ(L/S)を通して接続しなくてはなりません。この制御信号がL/Sを通さずに直結できるか?検討してみます。
各々、データシートの電気的特性から抜き出しました。
Vol → Vilは、マージンも十分あり、問題なく接続できます。
Voh → Vihが、同じ2.3Vでギリギリセーフって感じですね。ATmega328の方はVcc=3Vでのスペックなので、Vcc=3.3Vで駆動する場合には、少しだけマージンを確保できます。
本来ならば、間にレベルシフタ(L/S)を挟む所ですが、以上検討の結果、L/S無しで接続できると判断いたしました。
小さなロボットカーの上にL/Sを実装するスペースが必要な場合と、不要な場合では大分違いますから、ちょっとした事ですが大事な所だと考えています。
※3.3V信号を5V定格のICに接続するのは、スペック上問題なしと判断したのですが、逆のケースはダメですよ。5V信号を3.3V定格のICに接続する時は、間にL/Sが必要です。双方のデータシートで良く確認して使いましょう。
モータ駆動電圧Vsは、電池ボックスから充電池1.2V×4直列=4.8Vを供給します。付属していたモータは、データシートによると3〜6[V]入力なので、問題ありません。
以上の検討結果を踏まえて、マイコンまで含めた電源ネットワーク図を以下に示します。
本来、安全策を取って、別々に分離しておくべきモータ駆動用とマイコン制御用の電源を、故意犯で共通に使用している点については、念頭において進めます。何か、電源周りの不具合で正常動作できなかった場合に、すぐ対処できるようにするためです。
328duinoからL293Dへ接続する制御信号は、モータ1個当たり3本(ENB12,IN1,IN2)必要です。今回はモータ2個なので、合計6本(ENB12,IN1,IN2,ENB34,IN3,IN4)です。
※こちらのL/Sは1個当たり信号線4本分なので、6本だと、L/S×2個も実装しなくては、ならない所でした。
ENB信号には、PWMを出力して回転速度を制御します。IN信号は普通にLOW/HIGHで出力する汎用I/Oポートを割り当てたらOKです。
ENB,IN信号でL293DからブラシDCモータを制御する方法については、「#3-8 ブラシDCモータ」で解説済みですので、リンクからご参照ください。
完成したプログラムを以下にリンクしておきます。
実験用プログラム:robot_car.ino
コンパイルして328duinoへ書き込むと、シリアルモニタから以下のコマンドを受け付けています。
シリアルモニタコマンド仕様:
シリアルモニタを接続した場合に使用可能なコマンドです。ロボットカーとして、独立動作させる場合には、シリアルモニタを使えない事に留意してください。
なお、モータのリード線の極性を合わせて黒線・赤線同士を接続した場合、互いに逆方向へ回転するので、ロボットカーが、その場で旋回🔄してしまいます。モータとタイヤが左右鏡像の位置関係で固定されているためです。
解決策は、以下二点の何れかです。
プログラムでは、2)の対策をパラメータで選択可能になっているので、モータドライバへの接続方法(対策1)と合わせて、適切に設定してお使いください。
const bool mtr_ROT_REVS=false; // 回転方向を逆転する。
const bool mtr_ROT_REVS_MUT=false; // 左右の回転方向を逆転する。
左右両方同時に逆転させるオプションと、片側だけ逆転させるオプションの、計4通りに設定可能です。
まず最初に、シリアルモニタを接続してモータの制御が期待通りに行えることを確認しておきます。
==== まだロボットカーは走行させません。====
以下表に従って、328duino、モータドライバモジュール、電池ボックス、モータ、USB⇔UART変換モジュール(FTDI等)を接続してください。
328duino as UNO3V3 |
接続 |
モータドライバ モジュール(L293D) |
接続 |
電池ボックス /モータ |
Vs | ← | +電極 | ||
Vss(Vcc) | ||||
GND | ⇔ | GND | ⇔ | −電極 |
D5(OC0B) | → | ENB12 | ||
D2 | → | IN1 | ||
D4 | → | IN2 | ||
D6(OC0A) | → | ENB34 | ||
D7 | → | IN3 | ||
D8 | → | IN4 | ||
CN3 | → | モータ#1 | ||
CN4 | → | モータ#2 | ||
328duino | 接続 |
USB⇔UART変換 モジュール(FTDI等) |
||
Vcc | ← | 5V | ||
GND | ⇔ | GND | ||
RXD | ← | TX | ||
TXD | → | RX | ||
DTR | ← | DTR |
※FTDIの電圧ジャンパは3.3V側。
モータを回転させるので、ロボットカーが走行してしまわない様に、以下図の通り、タイヤを浮かせて実験します。
モータにはんだ付けされていたケーブルの先端には、メスのピンソケットが付いていました。ブレッドボードで使うのに、ピンソケットは使い難いので、先端に連結用ピンヘッダを取り付けて性転換しました。そう言えば、手持ちのサーボモータSG90も、接続ケーブルの先端はメスのピンソケットでしたね……。ブレッドボードでは使い難いの……。
実験サンプル:【 】内はシリアルモニタからの送信データ
【mtr1,255】
OK: motor #1 duty=255 turn=1
【mtr2,255】
OK: motor #2 duty=255 turn=1
2個のモータが同じ方向(前進する方向)に回転しましたか?モータの回転方向に着目して、もし、回転方向が正しくなかった場合には、プログラムのパラメータまたはモータの配線で調整してください(調整方法はこちらを参照)。
【mtr1,0】
OK: motor #1 duty=0 turn=0
【mtr2,0】
OK: motor #2 duty=0 turn=0
モータが停止しましたか?各々【mtr1】【mtr2】コマンド送信のタイムラグによって、2個のモータが個別に制御できていることも確認できたはずです。
逆方向に回転させたり、PWMデューティ指定によって回転速度が変化するかどうかも確認して見てください。
次はいよいよ、独立動作で自動走行させてみましょう。
USB⇔UART変換モジュール(FTDI等)との接続を解消した上で、以下の接続に変更してください。
328duino as UNO3V3 |
接続 |
モータドライバ モジュール(L293D) |
接続 |
電池ボックス /モータ |
Vs | ← | +電極 | ||
Vcc | ← | Vss(Vcc) | ||
GND | ⇔ | GND | ⇔ | −電極 |
D5(OC0B) | → | ENB12 | ||
D2 | → | IN1 | ||
D4 | → | IN2 | ||
D6(OC0A) | → | ENB34 | ||
D7 | → | IN3 | ||
D8 | → | IN4 | ||
CN3 | → | モータ#1 | ||
CN4 | → | モータ#2 |
※FTDIとの接続を解消した上で、ピンク色着色セルが変更点。
以下、完成したロボットカーの外観図です。
電池ボックスは、ねじで固定しましたが、制御・モータドライバモジュール(ブレッドボード)は固定していません。最終的には、紐や結束バンドなどで固定した方が良いのでしょうが、まだデバッグ中なので、このまま実験します。
※ブレッドボードにも、ねじ穴が開いているのですが、部品や配線が這って、ねじ穴は使い難いのです。
こうして見ると(上図)、随分小さな筐体だとお解りになるでしょう?
色々な機能をモリモリに盛っても、筐体に載りきらなくなってしまうので、欲張ることはできません。増して、電源を複数搭載したり、UNOのような比較的大きい機体を搭載するのも、なかなか難しいと思われます。機能を盛りたい方は、もう少し筐体の大きなロボットカーを選択した方が良いと思われます。
プログラム先頭付近の「#define DEMO_ENBL」マクロを有効にしてコンパイル&書き込んでおくと、電源投入後、デモ走行モードに入るようなプログラムに、なっています。電源を投入したら、5秒以内にロボットカーを障害物の無い平らな広い場所に設置してください。
上にリンクした動画の様に動いたら成功です。
もし、動作しなかったり、動画の様に動かない場合、電源電圧降下によって、マイコン(328duino)が異常動作している可能性があります。
前節、最初の実験では、FTDIからマイコン用電源を供給しており、モータ用とは電源を分離した状態でした。前節の状態で正常動作していて、今回不具合動作となったのなら、電源の問題である可能性が濃厚です。個体差の影響もあるので、もし、正常動作しなかった場合には、モータ用とマイコン用の電源を分離して見てください。
電流喰らいのモータ用と、制御(マイコン)用の電源を、同じ電池ボックスから供給している上、マイコンの3.3V出力信号を5V定格のモータドライバL293Dへ直結している事にも留意してください。しっかりとGNDを取っておかないと、信号のやり取りができずに誤動作する場合もあるので、その辺りも要チェックです。
なお、当方の実験では上動画の通り、マイコン制御による自動走行を確認できました。
まず、最初の走行実験が成功したわけですが、前節の動画からも、すぐに判る、対策すべき点が有ります。それは、止まる時の音から明らかです。
今回の自動走行パタンは以下の通りです。
動画では、1)〜4)の手順を4回繰り返しています。
問題は、特に2)で停止する時です。
1)では、PWMのデューティ最大255で全速前進していたのですが、2)の【stp】コマンドでデューティ0となって、いきなり回転が止まってしまいます。いわば、急ブレーキをかけたような感じです。このため、ロボットカーが一瞬、前方に前のめりとなって、後輪代わりのユニバーサルベアリングが地面から浮き上がり、それが着地する時に「ガタン」と言う音を立てていることが判りました。
この状態を緩和するためには、停止する前に、PWMのデューティを255から少しづつ下げて行って、スピードを落としてから停止するという制御が必要となります。
まあ、これが最初の走行実験ですので、未対策のまま、「色々と対策が必要ですね」と言う結論で終わっておきます。
実測したところ、タイヤの直径D≒6cmでしたので、タイヤ一周で進む距離はD×π≒18.8cmです。モータの無負荷回転数は130rpm @3Vで、ギア比が1:48ですので、ロボットカーの移動スピードは、130rpm÷48×D×π≒0.85[cm/s]程だと推定できます。
計算に使った回転数は無負荷状態ですが、ロボットカーの筐体を動かすという負荷がかかっていますので、回転数は130rpmよりも少し低下しているはずです。一方、モータを回転させる電圧は、充電池1.2V×4直列=4.8Vと、条件の3Vより少し高いので、その分回転数は増加するはずです。
どうでしょう?回転数プラスとマイナスの効果が打ち消し合って、ざっくり、〜1[cm/s]前後の移動速度と、なっているのではないでしょうか?→ 動画で再度確認して見てください。
と、いう視点で動画を見直してみると……、1cm/sよりも、だいぶ速い様な気もしますね……。スペックの130rpmがMINまたはTYP条件で、実力では、もっと高速に回転する、と考えれば良いのかな?
※逆に、移動距離と、移動に要した時間を測定すると、ロボットカーと言う負荷に於けるモータの回転数などを逆算することもできます。PWM出力のデューティ毎に計測しておくと、より精密な制御が可能となります。
いずれにしても、走行させた速度(動画を参照)から判断して、充電池1.2V×4直列=4.8Vにて、電源電圧としては十分だと考えられます。
ふと気が付きました。シャシの金属板に空いた四角い穴、もしかして、サーボモータ取り付け用の穴??そうだとすると、市販のロボットカーに良く見られる、サーボモータに超音波センサを取り付けて、前方障害物との距離を測ったりとかするための物かな?
その認識が正しければ、四角い穴の開いた方を「前」にしないとならない。
そして、3輪目の代わりとなる、ユニバーサルベアリングは、「後」だよね??3輪目が「前」??どっちだ?
むむむむ。何だか全体的に、前後の考え方を間違っている様な……。以下図にシャシの図を示して、整理してみよう。
うぅ〜ん、そうかぁ〜。動画では「前・後」の認識が間違っていたために、絶賛、後退(バック)走行させていたのね……(1^^;)っ。次の機会から、ちゃんとした向きで走行させますね。幸い、モータとモータドライバの接続か、プログラムの設定で反転できますので、いつでも正しい向きに修正することができます。
今回のお買い物は、以下の通りです。
「今回のお買い物」と言ってみたものの、実はずいぶん昔、こちらのお買い物と一緒に購入してあった部品です。ようやくご紹介出来ました。両方共長めのピンヘッダなので、本来の基板同士を連結する使い方以外にも、メスのジャンパ線に挿すとオスのジャンパ線に早変わり、という使い方もできます。
ロボットカーのプラットフォームキットと、手持ちの部品を組み合わせて、自動走行まで到達できました。こうやって「動く物」が工作できると、やっぱり楽しいですね。センサなども接続してみたいし、まだまだ遊べそうです。