今回から実際に部品を弄っていきます。とりあえずESCを使ってブラシレスモータを回した経験が希薄なため、その部分を手当します。
前回記事です。
ktd-prototype.hatenablog.com
ESCの仕組み
PWMを送ると回る・・・らしい
職場でドローンを齧った時に、PWMで回していますと誰かが言っていたのをうっすら覚えています。
5年位前にドローンを作ろうとした時も、たしかにそのように回した記憶があります。
当時はArduinoから直接PWMを出すのではなく、外付けのPWM発生器(というのかな)を使っていました。
www.switch-science.com
はてなブログの機能で目次というのがあることを割と最近知って、それが面白くて見出しをついつけてしまうのですが、何も書くことが無いですね。
Arduinoから回してみる
参考にしたサイト
何箇所か見て回ったのですが、一番分かりやすかった以下のサイト様を参考にさせてもらいました。
akiracing.com
PWMの仕様
ArduinoのPWM周波数は490Hz(一部ピンは980Hz)だったように記憶しています。
www.arduino.cc
1周期の中でのHI比率(デューティ比)をいくらにするかは別として、そのHI-LOWを1セットとして、それが1秒あたり何回出せるかというのが490Hzということですね。
大体500 Hzだとすれば1周期2000 μsecですから、実際は490 Hzだとするとそれよりちょっとだけ長いくらいですね。
ESCを動かす流れ
上記サイトによると、以下の2ステップで動くようです。(2ステップ目は実際に回す段階なので実質1ステップ)
- 初期化
- 入力し得る最小のパルス幅(HIの幅)を一定時間入力する
- 上述の最小幅〜最大幅の間で好きなパルス幅を入れれば、その幅の大きさなりの強さでモータが回る
単純ですね。
最小のパルス幅は、上記サイトによると800 μsec以上である必要があるらしいです。サイトに倣って1000 μsecとしました。
ここはESCの型番によるのかも知れません。
最大パルス幅は初期化に使っていない以上なんでも良いのだと思いますが、そもそも前述の通りPWM周期が2000 μsec強であることから2000 μsec以上に設定するのは現実的でありません。こちらもサイトに倣って2000 μsecとします。
デューティ比で言えば、大体0.5〜1の間で動かすことになります。
ちなみに、最小1000 μsecのPWM幅ではモーターは回らないようで、多分1050とかから回り始めます。
実際のコード
いきなり回りだすのも困るので、スイッチを押したら回るようにしました。
スイッチは2個で、スイッチ#1を押すと1100 μsec、#2を押すと1200 μsec、両方押すと1300 μsec、何も押さないと1000 μsecが出ます。
github.com
モーターサイズが小さいので怪我とかのリスクは低いかも知れませんが、ものすごい勢いで回るのでちょっと暴れます。万力か何かで押さえておいたら確実です。
配線
図を作ると大変でブログ投稿のハードルが上がるので省略です。(Fritzingは購入したけど・・・)
スイッチが押されているかいないかのピン(#5と#7)をプルダウンしなかったため、最初はスイッチの値がメチャクチャに暴れて大変でした。
意味ない気がしますが(サムネが無いのも寂しいので)実験の様子を貼ります。>
回っている様子
見ても仕方ないかも知れませんが一応アップロードしました。
ドローン用ESCを使ってArduinoからブラシレスモータを回す
初期化プロセスの実際?
ESCのマニュアルを見つけた
初期化プロセスはESCによるかも、と上で述べましたが、今回使っているSimonkのマニュアルを見つけました。
これの第8項にESCキャリブレーションというやり方が載っています。これがこの記事で言う所の初期化ということでしょうか?
マニュアルに見るキャリブレーションの流れ
簡単に言うと以下のような流れです。
- バッテリを外す
- スロットルを最大にする
- スロットル最大のまま、バッテリを繋ぐ(ビープ音が聞こえる 短✕3回)
- そのまま1秒待つ(ビープ音が聞こえる 短✕1回)
- スロットルを最小にする(ビープ音が聞こえる 短✕2回)少し待つとキャリブレーション完了する(ビープ音が聞こえる 長✕1回。なお、ビープ音が短かったらキャリブレーション失敗している)
- バッテリを外す
Arduinoを起動してスロットルを最大にセットしてからバッテリを繋ぐなど手順が煩雑ですが、逆に一度やれば、次からは一切初期化プロセスは不要なようです。次からは初期化関連操作なしに動きました。
逆に、バッテリを繋いだり切ったりという本来の手順を守らずにキャリブレーションプロセスを走らせてしまうとその後モータが回らなくなります。
一度キャリブレーションをしたら、電源を切り、その処理をコメントアウトしてArduinoに再アップロードし、改めて動かすと良さそうです。
まとめ
Arduinoから自由自在(?)にESCを介してドローン用のブラシレスモータを回せるようになりました。
実際にはIMUの値などから4つのESCに送るPWM信号を生成しなければならないのでまだ先は長いですが、うんともすんとも言わない、ということは避けられると思います。少なくともモーターは回るでしょう。