Arduinoでステッピングモーターのコントロール
このところ仕事でマイコン関連も少し手を出さねばならなくなり、Raspberry Pi、BeagleBone、Arduino、GR-SAKURA、Edison、mbed、pcDuinoなど、片っ端から使ってみて、結局目的に一番合いそうなArduinoでいろいろやっているところです。本当は私はあまり関わらない予定だったのですが、打ち合わせに参加していると結局ある程度理解していないと議論に参加できず、もともと電子工作も好きなので、結局先行調査は私が一番やっている状態になっている気が・・・
さて、今回マイコンでいくつか扱うものがある中で、一番先に目処をつけておきたかったのがステッピングモーターのコントロールです。やるからにはちゃんと理解しておきたいタイプなので、ちゃんと本も買って勉強し、
モノポーラ駆動、バイポーラ駆動それぞれMOSFETを使って作ってみたりしました。まあ、今どき数百円でHブリッジコントローラが買えますが、自分で試行錯誤してみるのが一番理解できますからね。それに、いざとなればこういう構成で作るのが一番大容量モーターのコントロールまでできますし(当面、不要ですが)。
さて、実際にはMOSFETで面倒な電子工作をチマチマやるわけにはいかないので、ステッピングモーターコントローラーもいろいろ手に入れて評価してみました。今どきの(?)コントローラーはコイルに流す電流を4つコツコツとコントロールしなくても、速度に相当するパルスを与えるだけで上手いこと制御してくれるタイプが主流で、遅い回転速度では欠かせないマイクロステップ駆動も簡単にできます。
ということで、会社でも自分の机の片隅でこんな状態で実験していたりするのですが、自宅に比べて会社では道具が揃っていなくて(自分のところには)、自宅からちょっとずつ持って行ったりしていますが、かなり不自由な状態で無理矢理実験しているので、結構ミスします。モーターのコントロールにはマイコン側より高い電圧を流しますので、大抵ミスするとコントローラーあたりから烽火が上がります。もう少し実験環境を整えなければダメです・・・。趣味だと失敗は小遣いに影響するのが辛いのですが、仕事では経費よりも時間が無駄になることの方が勿体ないのです!
Arduinoでの実験には、やっぱり状態の表示と何らかの入力装置が欲しいということで、Adafruitのkeypadシールドを使ってみました。これは便利!いろいろ探して、一番Arduinoの端子を消費しないI2Cコントロールタイプにしたおかげで、5V,GNDの他にI2Cの2本しか使いません。その代わり、液晶表示もボタン状態取得もI2Cの通信なのでソフト側は面倒です。
自宅の方が工具も電源などの周辺装置も揃っているという多少珍しい人間なので、自宅の方が実験は捗ります。安定化電源は昔ラジコンに凝っていた頃にバッテリー充電用に買ったものです。これは自動車のバッテリーがあがったときにも応急充電に役立ちました(充電には使うなと書いてありますが)。ということで、まずは回転方向と速度用パルスを与えるタイプのコントローラーの評価です。
keypadシールドがあると実験がとても捗ります!
木の台の上でモーターを回すと振動音が大きく聞こえるので、モーターの回転の様子が良くわかって便利です。
なお、keypadシールドのボタン状態をI2Cでチェックして、液晶に表示するのと、モーターにパルスを与えるのをloopの中で一緒に扱うと、I2Cが足を引っ張ってモーターの回転が乱れましたので、モーターのパルスはTimer1を使って割り込みを別にかけてやることで安定しました。ソースを張り付けておきます。Arduinoはサンプルがたくさん公開されているおかげで私も助かっていますので、誰かの役に立つかも知れないということで、お返しに。。DRV8825というチップを使ったコントローラーですが、回転方向とパルスを与えるタイプなら同じ感じでコントロールできます。
なお、動画を撮影した後にソースはさらに変更したので、少し動きが違います。このソースはこの後の動画と同じ感じの動きに変更されています。
さて、同じに見えますが、こちらはさらに新しいタイプのコントローラーです。SPIで設定・コマンドを与えることでモーターをコントロールします。パルスを与え続ける必要がありません。おまけに、アクセラレーションなど自作すると手間がかかる制御も簡単に指示できます。こちらもソースを張り付けておきますが、L6470というコントローラーを使ったもの専用です。パルスを送り続けなくて良いので、ソースは断然シンプルになっています。
こちらの方がモーターが滑らかに回っているのが分かると思います。加減速もソフトですし、低速回転でも滑らかです。PWM制御がとても丁寧に行われています。
この2つのストロベリー・リナックス製コントローラーはモーターのお尻に合体させることができるサイズになっています。小さいのとモーターの発熱の影響もあるので、ハイトルク駆動には適しませんし、モーターのネジを延長しなければならないので、メーカーで推奨しているサイズ以外のモーターだとネジを探すのが大変でしょう。
左がパルスでコントロールする従来タイプのコントローラー、右がSPIでコマンド制御するコントローラーです。見た目はほとんど同じですが、マイコンからの制御はかなり違います。値段はそんなに変わりません。なお、この2つのコントローラーはモーター駆動用の電源がシビアで、8V以上の電圧が必要なのと、電圧が安定していないとまともに動かない感じでした。適当なACアダプターとかではジーとうなるだけでまともに動かなかったりで、モーターの回転だけでなく、コントローラーの電源自体もマイコン側からではなくモーター側の電源から取っていると思われます。会社で何度か慌てて実験した際に動かないことがあり、壊したかと思ったくらいでした。まあ、実際に1個は烽火をあげてしまいましたけど・・・
ということで、久しぶりの技術ネタでした。facebookにはこまめにアップしているのですが、ブログはやっぱりまとめるの面倒で。。