VESCを使って大きなモータを回す

ラジコンサイズで自動運転の実験をするのは楽しいですが,可搬重量に限界があります.

自動運転技術をつかったサービスを検討する上で,色々試してみたい時にPC載せたり,ポータブルバッテリーせたり,ということがしたくなりますが,ラジコンサイズではなかなかしんどい.

Low RPM with VESC

人が乗ることを考えるなら,WHILLを改造したり,物流用ならHakobotや,Thouzer といった,汎用性高く,研究にも使えそうな製品もあります.どれもよくできていて,研究などに使いやすいバージョンも出してくれていますが,個人で手をだすにはちょっとお値段が.(研究でつかうにはちゃんとできていて素晴らしい性能です!).

あと,少し重い(以前デモでWHILLを一人で自分の車で運んだ時は本体+研究機材で結構大変だった.でもできない重さじゃないところはすごい)

じゃあ,勉強も兼ねて自作してみよう,ということで,周りのロボティクスの先生に色々きくと,彼らは彼らで研究用にたくさん自作されていて,どの部品もきちんとした部品を使っています(研究なので,ちゃんと指示通りに動いて,ちゃんと安定した性能が出せる精度の良いものを使います).

となると,これはこれでお値段が...

ラジコンより少し大きめ(力の強い)のモータをそれなりに色々情報が取れたり、設定できたりお手軽に(お安く)回す方法はないでしょうか?

そこで,VESCというオープンソースのモータコントローラを使用して,人が乗っても動くクラスのモータを回します.

!注意!

かなり強力な運動エネルギーを扱うことになるので,ぶつけて怪我をする,ものを壊すなどリスクを十分に考慮すること

他に人のいない安全な空間で行うこと(公道走らせてはダメ)

用意するモノ

  • VESC またはVESC互換品(Flipsky ESCとか)
  • VESCTool(ソフトウエア)
  • ブラシレスモータ(センサ付きが良い.タイヤに内蔵されているようなものもある)たとえばこんなの
  • 12Vまたは24Vバッテリー,あるいは同程度の電源

お値段,大体1セットで2万円(良いラジコンとそんなに変わらない!圧倒的タミヤ派ですが,TRAXXASとかだとラジコンなのに10万超えるし!)Amazonだと値段が乱高下するけど,モータ1万円,VESC(FSESC)1万円くらいのときが狙い目.

VESCの説明は,素晴らしい説明ページが日本語でもすでにあるので,簡単にすると,オープンソースのハードウエアで,ブラシレスモータを回すことができる50A程度流せる強めのモータードライバです.

VESC互換のFSESC(左)とAmazonで売ってた適当なモータ(右).ブラシレスモータの3線と,センサ用のコネクタが見える

もともとは電動スケボーの自作などに使うことを想定しているようですが,汎用性が高く便利に使うことができます.設定に使うVESCToolというソフトウエアもフリーでダウンロードできます(なぜか0円でチェックアウトするというプロセスはありますが)

使い方も簡単で,

まず,VESCとブラシレスモータをセンサ信号線も含めて繋いで,VESCツールで,キャリブレーションを行う.

FSESCにバナナプラグが実装されていなかったのでストックから半田付け(モーターについてたのが4mmオスだったので同じ4mmメス)
入手したモーターのセンサ線は温度センサピンがないので5ピン。VESCは6ピンなので変換しつつ延長

モータサイズとかタイヤ径,ギヤ比など必要な設定をすれば全自動でキャリブレーションしてくれる優れもの.

制御や状態取得のためのインタフェースは,USB, CAN, シリアル(BluetoothモジュールをつければBluetoothでも)の3種類から選べる.簡単操作用にラジコンサーボとおなじPWM制御のインタフェースもあります.

USBで接続し右上の接続ボタンをクリック。真ん中にある「Setup Motors FOC」で出てくるチュートリアルに従ってモータのサイズやギヤ比(使ってる場合)などを設定していくと自動でキャリブレーション
キャリブレーション時に実際にモーターが回転するので、適当なマウント作って固定する。今回は3Dプリントで作成

キャリブレーションが終われば,あとは,回転数を指示するRPMでのコントロール方法,Duty比で制御する方法,電流値で指示する方法の3つが選べる.

たとえばArudinoで制御したい場合,この辺りのライブラリを使うと簡単に制御できる.ドキュメントがアレなので,ソースコードを見る必要があるが,setRPM(回転数)で任意の回転数で回すことができる.

ただしここでハマりポイント.

900RPM以下がどうしてもRPM制御では指定できない.どう設定をいじっても確か700RPM以下にはならない.できると言ってる情報もあるけどできない(おそらく古いバージョン).

右下のωと書いてあるところで任意のRPMを設定して回すことができる。この場合1750RPMで回転させ、センサー情報で概ね1750±50rpmくらいで回転していることがわかる。
700RPMを設定しても回転しない(センサーデータでも0RPM、実際も動かない)

RPM制御だと,速度指示しやすい(タイヤ外径と回転数で計算できる)のでいいのだけど,700RPM以下が出せないとなると,発進時にグン!っと少し心地悪い.

解決方法として,ファームウエアを改造しろ,とか内蔵のホールセンサではなく,外付けでもっといいロータリーエンコーダをつけろとか色々言われていますが,要するに,内蔵のホールセンサでは速度が遅いと回転数の値の精度が下がるため,700RPM以下は受け付けないFWになっているようです.(スケボー用途だと,RPM指示することはないので,問題にならない)

そこで解決策としては,700RPM以上の場合はRPM制御,それ以下の場合は,精度は低いけ現在のRPMを取得して(取得自体はできる),所望のRPMになるように自前のコードでラフにでもDuty制御すると発進時にスムーズな加速を得られます.

左下のDの部分でDuty比を設定できる。この場合0.06で大体200RPMで回転している.モーター自体は安定して回転しているが、センサデータでは不安定に見える。

ロボットなどの用途の場合ギヤなどを噛ませて減速するのですが,やはり初速で一気に700RPMで回すと1:5程度で減速しても多少のグイッと感が出ます.低回転域では取得するRPMの精度も低いし,どうせ700RPMまで,と割り切って単純にDuty比0から1までを目標RPMより低ければ+0.05とかするだけでも結構スムーズに発進できます.

あとは用途に応じてフレームを設計したり、お楽しみタイム。

Leave a comment