マイコン&距離センサでプラレールの自動ブレーキ制御
2歳の子どもが遊ぶプラレールが、しばしば前方車両や壁に衝突するのをみて(そもそも対象年齢じゃないのですが^^;)、自動で減速するように改造できないかと思っていたところに以下の記事を発見。電子工作は経験が浅いのですが、自分でもトライしてみました。
製作物紹介(使用部品、回路図)
先の記事の例に倣って先頭車両の単2電池の代わりに単4電池2本と電子回路を収めました。マイコンは手元にあったATtiny2313、赤外線距離センサは最大10cmまで計測可能なVL6180Xを搭載したセンサモジュールを選びました。マイコンと距離センサはI2Cで接続します。電源はDC-DCコンバータで電池の3V(充電式なら2.4V)を3.3Vに昇圧してマイコンとセンサに供給し、モータードライバICには電池から直接供給します。
少しわかりづらいですが、フロントのセンサ部分をくり抜いています。
基板1枚には収まらなかったため、マイコンの上側にモータドライバICをスタックしています。
ATtiny2313はプログラム書き込み用のポートとI2Cポートが共用になっているため、距離センサはコネクタで取り外しできるようにしました。
回路図です。
動画
動いている様子です。前方車両との接近を検出して減速しています(動画の後半は制御が間に合わず衝突してしまっているので、ソフトは改善の余地がありそうです)。なお、PWM制御により、モータにかかる電圧は1.5Vに制限しています。制限を外せばMAX 3Vまで上げられるので、カーブで脱線するくらい高速で走ることもできます(※モータの定格を超えるので壊れるかもしれません)。
以下のような応用も楽しそうですね。
・せっかくHブリッジなので、壁を検出するなどしたら後進させてみる。
・距離センサVL6180Xは環境光も測れるので、部屋が暗くなったらLEDを点灯する。
・Bluetoothモジュールを搭載してスマホアプリから遠隔操縦できるようにする。
苦労したこと
・単2電池のスペースはそこそこ広く見えますが、実際やってみると電池ボックスと回路を収めるのにとても苦労しました。高さがぎりぎりで、部品を出来る限り低く付けたり電池ボックスの底を削ったりしてなんとか収めました。
・単4電池2本(3V)ですべての電源を賄うのも、初めてだったので少し迷走しました。最初に選定したモータドライバIC(TB67H450FNG)が4.5V以上でないと動作しないことに後で気付き、低電圧動作するNJU7386を選びなおしました。
・ATtiny2313のフラッシュメモリ2Kバイト、RAM 128バイトという制限が、これまた思いの外厳しいです。デバッグ用のコードをいろいろ入れたせいでもありますが、すでにフラッシュメモリのプログラム領域は97%を使用しています。RAMも小さいため、スタックのサイズに気を付けないと、関数を入れ子にしたり割り込みをかけたりしたときにプログラムが暴走しました。もし同じことをしてみたいという方がいらっしゃれば、もう少し高スペックなマイコンを選んでもよいかもしれません。
このように思いの外苦労したので、2歳の怪獣に壊されるのが惜しくなってきました(笑)。見せてあげるのはもう少し対象年齢に近づいてからにしたいと思います…
参考情報
ATtiny2313の開発環境構築
こちらで一通り解説してくださっており、迷わずプログラム書き込みまでできました。
なお、開発環境Microchip Studioは新しくなっているのでこちらを参考にダウンロード、インストールしました。
なお、今回はFuseは出荷時のままで問題ありません。間違って書き換えると動作しなくなったりするのでご注意ください。
ATtiny2313のI2C Masterの実装
ATtiny2313はSCLとSDAのポートがありますが、ハードウェアは最低限の機能しかなく、ソフトウェアでI2Cを実装する必要があります(自分も作りながら気付きました...)。ネットでいろいろ調べてみると、本家のサンプルコードがあったのでこちらを利用しました。
サンプルコードはサイト内で”I2C”で検索して出てくる”AVR310 USI as I2C master”をダウンロードし、その中のUSI_TWI_Master.cとUSI_TWI_Master.hを自分のプロジェクトに追加すると使えました。