HaLake Magazine

コワーキングスペースHaLakeの技術情報発信サイト!IoT,AR,VRなど最新技術情報をお届け!

ミニ四駆(Nyampass風)をBLEで走らせよう

f:id:takumishinoda:20181229145900j:plain

今回はちょっと変わった見た目のミニ四駆をBLEで走らせたいと思います。
ゴールとしてはラズベリーパイ3BからBLE接続で定時にミニ四駆を前進・後進させることです。

今回主に使用したもの

  • ミニ四駆
  • BLE nano v1.5(nRF51822)
  • リチウムポリマー電池 400mAh
  • モータドライバ md08a
  • 抵抗10kΩ 2本
  • 電気二重層コンデンサ 1F(1000,000uf)
  • 10Ω抵抗 2本(必要に応じて)
  • ノイズ除去コンデンサ(必要に応じて)
  • スイッチ(必要に応じて)

また今回使用したミニ四駆はこちら

https://www.amazon.co.jp/%E3%82%BF%E3%83%9F%E3%83%A4-%E3%83%AC%E3%83%BC%E3%82%B5%E3%83%BC%E3%83%9F%E3%83%8B%E5%9B%9B%E9%A7%86%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-No-90-%E3%83%9F%E3%83%8B%E5%9B%9B%E9%A7%86-18090/dp/B07C4WX8M5www.amazon.co.jp

BLE nanoにプログラムを書き込む

今回はmbedを利用して書き込んでいきました。
簡単な仕組みとしてはBLE UARTを使ってBLE nanoに特定の文字列が届いたらモータを回転させるといった仕組みです。
mbedでの開発準備などは記事が長くなってしまうので、下記のブログでわかりやすく説明されているのでブログを参考に各自セットアップしてください。

jellyware.jp


また今回作成したプログラムは下記のURLにて確認できますので、気になる方はご覧ください。

os.mbed.com

内蔵させる回路の作成

回路の方はシンプルでBLE nanoとモータドライバの接続が主な回路となっています。
接続は以下のようにします。

BLE nano モータドライバ
VIN(電源) VCC と VMOT
GND GND
P06 AIN2
P07 AIN1

さらにモータドライバはPWMAとSTBYがHIGHの状態でないと走らないので、モータドライバのVCCと10kΩでそれぞれ接続しておきます。
* 今回はPWMでの速度操作は目的としていないのでモータドライバのPWMAピンをHIGH状態にしています。
この回路を半田付けすると、図のようになります。

f:id:takumishinoda:20181229122319p:plain
BLE nanoとモータドライバの接続

図ではBLE nanoのCLK、DIO、VIN、GND、TXからも線が出ていますが、これはBLE nanoにプログラムを書き込むために必要な最低限のピンになります。
ミニ四駆に合体させた後にもプログラムを書き換えられるようにするためにつけました。
必要なければつけなくても良いです。

ミニ四駆側の下準備

ミニ四駆側では電池ボックスに回路を入れ込みたいので、モーターと電池の接点に半田付けで線を取り付けます。
この時モータから発生するノイズを考慮する際はモーターの接点に無極コンデンサを並列に挟んでおくと良いでしょう。

f:id:takumishinoda:20181229123628j:plain
接点に半田付け

回路をミニ四駆に組みこむ

次は作成した回路を実際にミニ四駆に組み込んでいきます。
さらにバッテリーや電気二重層コンデンサも回路に追加していきます。
バッテリーを半田付けする際はショートしない様に細心の注意を払って作業しましょう。


配線は以下の様になります。
モーターの線は先ほどの図のから見ての向きになります。
* 赤色の部分が追加の配線です。

BLE nano モータドライバ モーター バッテリー
VIN(電源) VCC と VMOT プラス
GND GND マイナス
P06 AIN2
P07 AIN1
AO1 左の線
AO2 右の線

この時必要に応じてバッテリーのBLE nanoのVCCとバッテリーのプラスの間にスイッチを入れることで電源を落とすことができます。
この状態でも動作しますが、モーターによる急激な電力消費によってBLE nanoに供給される電圧が下がってしまい、高確率でBLE nanoが落ちてしまいます。
対策として、電源をマイコン用とモータ用で分けるなどが挙げられますが、今回はスペースがないので分けるのは厳しそうです。
そこで電源に電気二重層コンデンサという大容量のコンデンサを並列に挟むことで電源が強化され落ちる確率を減らすことができました。
しかしこの方法でも落ちることが多かったのでモーターのノイズを疑いましたが、モータードライバのVMOTとBLE nanoのVIN(バッテリーのプラス)の間に5Ω(10Ω抵抗を並列接続)抵抗を直列に挟んだところ、モーターに流す電流を抵抗で制限することでBLE nanoが落ちる回数を減らせました。
下の表が追加した回路です。
* 赤色の部分が追加の配線です。

BLE nano モータドライバ モーター バッテリー 電気二重層コンデンサ 抵抗5Ω
VIN(電源) プラス プラス 片足
VCCとVMOT もう片足
GND GND マイナス マイナス
P06 AIN2
P07 AIN1
AO1 左の線
AO2 右の線

下の図が配線した後の図になります。

f:id:takumishinoda:20181229135318j:plain
ミニ四駆に組み込み

さらに書き込みのために半田付けした線はミニ四駆のバッテリーボックスの下部の穴から外に出してピンヘッダなどを半田付けすればより書き込みが楽になります。
また、バッテリーのプラスとマイナスから線を出せば、バッテリ充電用として使えます。

f:id:takumishinoda:20181229142444j:plain
背面に出した書き込み線と充電線

f:id:takumishinoda:20181229141851j:plain
最終形態

ミニ四駆完成

f:id:takumishinoda:20181229150306j:plain

これらの配線ができればひとまず動作できる様になります。
私はmacOSでの開発だったので、BLEのデバッグに使ったのはLight Blueというソフトでした。

LightBlue

LightBlue

  • Punch Through
  • 開発ツール
  • 無料

実際に動かしている様子はこちらです。

f:id:takumishinoda:20181229140624g:plain
前進

f:id:takumishinoda:20181229140634g:plain
後進

マイコンと電源を共用しているので速度は電池駆動のミニ四駆には程遠いですが、これで前進と後進をBLEで遠隔操作できる様になりました。

操作側プログラム

今回はラズパイ3Bを使っていくので、内蔵のBluetoothモジュールをしていきます。
紹介するプログラムはNodejsのnobleを使用しますので、適宜以下のURLを参考にnobleのインストールをお願いします。

hawksnowlog.blogspot.com

こちらが今回作成したプログラムになります。

github.com

起動手順は、 1. プログラムを$ git cloneしたら$ npm installで必要パッケージをインストールします。
2. local_propaty.js.exampleというファイルをlocal_property.jsに名前を変更します。
3. $ sudo node app.js forwardで起動するとBLEアドバタイジングを飛ばしているミニ四駆が前に走り出します。
プログラムを見てもらうとわかる様に、コマンドの第一引数に"forward"を渡すと前進、"back"を渡すと後進します。
* nobleを使ったプログラムは実行に管理者権限を要します。
* 上記のリポジトリにforward.shとback.shがあるのでそちらを利用するとより安定して操作できます。

cron(クーロン)で定時に走らせる。

ラズパイでcronを使って定時に上記のNodejsプログラムを起動して走らせる様にします。
cronの編集は$ crontab -eコマンドで行います。
書き方は何分 何時 何日 何月 何年 コマンド といった具合です。
編集画面に出たら、
20 8 * * * sudo node {プロジェクトディレクトリ}/app.js forward
と記述しましょう。 これは、毎日の午前8時20分にミニ四駆を前に走らせるという命令になります。
書き終えたら、開いたエディタを閉じればこれで毎日午前8時20分にミニ四駆が走る様になりました。
この様に、cronを応用すれば電車が駅に到着する時間の何分間か前にミニ四駆を走らせて知らせてくれる様なシステムも簡単に作れます。

まとめ・学んだこと

  • モーターからはノイズが出るため、無極コンデンサを並列に挟んだ方が良い。
  • モーターを回すと急激に電気が消費されるため、出来るだけ電源は分けた方が良い。
  • cron(クーロン)を使えば定時にコマンドを実行できる。