予算3万円でつくる BLDC 2足歩行ロボット 創刊号 
ーSimpleFOCでBLDC動作を楽しむー

Home > 電子工作 > 予算3万円でつくる BLDC 2足歩行ロボット 創刊号 ーSimpleFOCでBLDC動作を楽しむー
すき 2
うんこ 0

気軽に作れるブラシレスモータ(BLDC)による2足歩行ロボットを紹介したく、この度 本主題で創刊をさせていただきました。

近頃ドローン向けのBLDCが低価格で流通されるようになり、ギアで減速すればロボにも活用できることを確認しました。

 

まだまたロボット用のアクチュエータは高額ですので、本格ロボ製作の前段階の学習として本連載を活用いただければ幸いです。

全6号を予定しており4号まででロボが完成する予定です。
ロボ筐体は3Dプリント品で構成され、毎号必要なモデルデータを販売させていただきます
(低額で販売させていただきますので何卒宜しくお願い致します 子がお腹を空かせているもので….)。

 

AudiostockでBGM・効果音を販売中!

はじめに

初回の今回はBLDCの駆動に使用しているSimpleFOCライブラリについて紹介をさせていただきます。

ブラシレスモータのベクトル制御 (FOC) を自身で実装となるとそれだけでも大変でモータを回すだけで疲弊してしまいます。

ESP32でベクトル制御 ーブラシレスモータ駆動への道9ー

 
そこでSimpleFOCライブラリを活用して、サクッとFOC駆動で応用していきましょう。
SimpleFOCライブラリは各種駆動モードが用意されており、ここでSimpleFOCを体に入れておけば、本ロボット以外の他のプロジェクトにも利用できると思います。

 

本号で必要な部品

本号では2足歩行ロボットの足の駆動に必要なFOC回転位置制御を中心に紹介します。
使用する部品は以下の通りです。

  • BLDCコントローラ MKS ESP32 FOC V2.0 :1個

      
  • BLDC 5010 360KV:2個

     
  • 磁気エンコーダ AS5600:2個


     

  • LiPoバッテリ 3セル 11.1V:1個
    本号では安定化電源 (12V)の使用を想定していますが、完成ロボはLiPoバッテリを使用します。

     
  • PS4コントローラ
    本ロボは基本的にはPS4コントローラでの操作となります。必須ではないですがあると便利です。

     
  • その他
    10mm以上のねじスペーサ:4個
    M3 6mm なべネジ:16本
    M3 5mm なべネジ:8本
    M3 25mm なべネジ:2本
    M2 14mm なべネジ:2本

 

ロボット完成に必要な主な部品

AliExpressでの部品購入は到着までに日数がかかるので、あらかじめロボ完成までの部品を購入しておきたい方のために主な必要部品をまとめておきます。

# 品目 数量
1 MKS ESP32 FOC V2.0 3
2 BLDC 5010 360KV 6
3 磁気エンコーダ AS5600 6
4 ATOM Matrix 1
5 CANコントローラボード 4
6 4ピン GHコネクタケーブル 150mm 4
7 LiPoバッテリ 3セル 11.1V 1

 

MKS ESP32 FOC V2.0

ブラシレスモータのコントローラとして MKS ESP32 FOC V2.0 を使用します。
ESP32が搭載され2個のBLDCを駆動できます。

 

V1.0からV2.0で変更点がいくつかありました。

 

USBがCコネクタとなり、電流センサに変更がありました。

 

USBシリアル変換ICとしてCH340Kが採用されWinPCの場合はドライバのインストールが必要です。
以下を参考にドライバインストールしてください。

 

V1.0はモータ電源を供給しないとUSBシリアル書き込みができませんでしたが、
V2.0はUSB給電で書き込みができるようになったので不便さは改善されています。
しかし外部電源供給前にUSBを接続するとモータ駆動で過電流が流れる可能性があるので注意が必要です。

コード書き込み前にモータを接続するとプリドライバの入力が不定で貫通電流が流れ壊れる可能性があるため、モータ接続前にプリドライバの入力を確定したコードを書き込む必要があります。

GitHub
 https://github.com/makerbase-motor/MKS-ESP32FOC

 

3Dモデル

今回使用する筐体の3Dモデルデータは以下で販売しております。
zipファイルでダウンロードされますので解凍してご利用ください。

[予算3万円でつくる BLDC 2足歩行ロボット] 創刊号用 3Dモデルデータ

データには7つのstlファイルがあり motorFix.stlとgear56-70-L.stl, gear56-70-R.stlは1個プリントし、その他は2個づつ印刷してください。

gear10.stlとgearFix.stlは小型で強度が求められる部品のため、硬いPETGフィラメントで充填率100%で出力することをおすすめします。
その他の部品はPLAなどで通常通りのプリントで問題ありません。

 

FOC回転位置制御

ここからはいよいよSimpleFOCによるBLDC回転位置制御実施に向けて手順通り記載いたします。

筐体組み立て

motorFix.stlにモータやエンコーダを固定します。
M3ネジで固定するので固定穴をねじ切りします。

以下の図で示す穴をM3サイズでねじ切りしてください。

穴の数が多いので電動ドリルでの実施がおすすめです。手作業だと腱鞘炎なるで。。。

 

 

モータ動作試験が実施しやすくなるのでスペーサをつけることをおすすめします。

 

BLDC 5010 360KVの回転軸裏面に磁気エンコーダ付属の磁石を接着します。ここでは瞬間接着剤を使用しました。

 

5010 360KV 2個を筐体にねじ止めします (M3 6mm なべネジ:8本)。

 

磁気エンコーダAS5600に MKS ESP32 FOC V2.0付属の5ピンコネクタラインを加工して配線します。

MKS ESP32 FOC V2.0とAS5600が以下のようにつながるよう配線してください。
1線余るので切断なりで除去
 3.3V-VCC
 GND-GND
 SDA-SDA
 SCL-SCL

 

コネクタを付けた磁気エンコーダを筐体にねじ止めします (M3 6mm なべネジ:8本)。

MKS ESP32 FOC V2.0

モータ接続前にFOC回転位置制御用のコードを書き込みます。

Arduinoコード

今回の環境バージョンは以下の通りです。
 Arduino IDEバージョン:ver. 1.8.19
 ESP32ライブラリ:ver. 2.0.13
 SimpleFOCライブラリ:ver. 2.3.3
 PS4Controllerライブラリ:ver. 1.1.0

このコードはFOC(ベクトル制御)によってモータの回転位置を指定して制御します。
回転位置はWiFiを介してブラウザからもしくはPS4コントローラで指定します。

L. 12~18 WiFi APモード用設定。SSIDやパスワード、IPを指定 (それぞれ任意)。

L. 20 Preferencesライブラリを使用して各設定値をフラッシュに記憶して電源OFF後も保持します。

L. 23~51 モータやエンコーダ、電流センサおよび各パラメータの設定
 ちなみにBLDC 5010 360KVは14極の7ペアです。

L. 55~309 ブラウザアプリ表示設定
 APモード接続時の各パラメータ設定用の表示を記述しています。 

L. 312~364 core0動作
 ESP32 デュアルコアのcore0でブラウザ表示とPS4コントローラ処理を実行します。

L. 367~518 setup関数
 冒頭でモータのプリドライバの入力が不定にならないようにプルアップしで貫通電流防止

 PS4コントローラ接続のために Bluetooth Mac Addressをシリアル出力しています。 (L. 378~381)

 アプリで設定した各設定値はPreferences機能でフラッシュに記録します。
 電源起動時にフラッシュに記録されたオフセット値を読み出します (L. 384~396)

 モータ駆動の設定 (L. 399~495, 509~516)
 モータの電圧と電流はここではそれぞれ3Vと2Aで制限しています。
 今回はベクトル制御 (FOC)の回転位置制御としています

 制御ブロックは以下のとおり

 モータ回転位置(角度)と回転速度がPID制御され、さらにトルク制御ループ内で電流値もPID制御されます。

 

L. 521~527 loop関数
 モータ角度を指定します。
 初期位置は-π (-180°)で angleはPS4コントローラでangleOffsetはブラウザで指定して回転させます。

書き込み

ボードは”ESP32 Dev Module”を選択
PS4Controllerライブラリのサイズが大きいのでPartition Schemeは”Huge APP”を選択

モータ、エンコーダ接続

以下の図のように右側がmotor0 (M0)、左側がmotor1 (M1)となるようにモータ配線と磁気エンコーダのコネクタをMKS ESP32 FOC V2.0に接続します。

 

モータ配線はここでは左から黄色、黒、赤の順で接続します。

動作

MKS ESP32 FOC V2.0の電源コネクタに安定化電源 (12V)や3セルLiPoバッテリを接続して給電するとモータの初期化動作が実行されます。

初期化動作時にモータの回転方向や電気角オフセットの同定がなされます。

初期化動作時にモータに大きな電圧がかかると過電流が流れてしまうため0.5Vに指定しています (Arduinoコード L. 484, 487)。

 

初期化動作がフェイルなしに終了するとモータが初期位置の-π (-180°)で停止し回転位置制御モードとなります。

ブラウザやPS4コントローラで回転位置を指定できます。

ブラウザ指定

ESP32のAPモードでWiFi接続してブラウザから回転位置を指定します。

  • スマホもしくはPCのWiFi接続設定でSSID ”BLDC-L”に接続
     パスワード:password

  • ブラウザで”192.168.22.91”にアクセス

angleOffset0とangleOffset1の値 [°]を変更することでモータ回転位置をそれぞれ制御できます。

制御ループの角度PIDや速度PIDパラメータも調整できるのでぜひご自身で調整して動きをご確認ください (以下に演習あり)。

PS4コントローラ指定

PS4コントローラとペアリングすることでコントローラのアナログスティックでモータを回転させます。

Lスティックの上下でモータを±128°回します (Arduinoコード L. 353~356)。

 

MKS ESP32 FOC V2.0の起動時に Bluetooth Mac Addressをシリアル出力させています。
アドレスを控えてコントローラと接続します。

 

PS4コントローラとESP32のペアリング方法の詳細は以下を参照ください。

 

PS4ペアリング後にはアプリによるWiFi接続ができませんので、両方実施したい場合はWiFiアプリ接続後にBluetoothコントローラペアリングしてください。

 

ギアを楽しむ

FOC回転位置制御ができるようになったのでロボ足に近づくべくギアをつけて回転を確認します。

エンコーダオフセット初期値設定

ギアを導入する前に電源投入のたびに初期化動作でモータが回転してしまうのが具合が悪いので回転方向とエンコーダオフセット値をあらかじめ指定して初期化時の回転チェックをパスします。

初期化動作時にチェック結果はシリアル出力されるので値を控えます。

 

Arduinoコードの初期化動作設定部 (L. 484~489)にシリアル出力で得たオフセット値と回転方向を記載しコメントアウトを解除して書き込みます。

これで初期化動作時のモータ回転はなくなります。

モータは初期位置の-π (-180°)で停止しますので、位置をわかりやすくするために以下のようにマーキングすることをおすすめします。

ギア接続

gearFix.stlの中心穴をM2ネジサイズでねじ切りします。

 

ねじ切りしたgearFix.stl 2個をモータにねじ止めします (M3 5mm なべネジ:8本)。

 

以下のようにgear56-70-L.stl、gear56-70-R.stlをleg1.stlの筒穴に通してM3 25mm なべネジでmotorFix.stlにねじ止めします。

 

gear56-70-L.stl、gear56-70-R.stlのアームがだいたい45°になる位置でgearFix.stlにgear10.stlをはめます。
この際にモータは初期位置であることをご確認ください。

 

45°の目安としてgear56-70にマーキングを入れてあります。
逆三角マークの下頂点がleg1.stlの上辺にかかる点が傾き45°となります。
ここではだいたい45°で問題ありません。ブラウザアプリのangleOffsetで微調整できます。

 

gear10.stlをはめたのちにleg1.stlの穴にM2-52.stlを通してM2 14mm なべネジでギアを固定します

動作

まずはWiFIブラウザアプリでギアのアーム角度を刻印されたマーキングを目安に45°に調整します。

アプリのangleOffsetで”-“, “+”ボタンをクリックして調整ください。

 

調整後にPS4コントローラを接続してLスティックの上下でモータを動かします。

接続したギアはモータのギアの歯数が10でアームのほうが56となり、ギア比が5.6となります。

PS4コントローラでモータを±128°動かすとアームは±128 / 5.6 = 23° 動きます。
動きが狭くなった分トルクは5.6倍となっておりますのでぜひ実際に体感ください。

モータ初期位置やギア固定位置を誤るとギアが上限以上に動いて過電流が流れる可能性があるので十分に気を付けてください。

 

FOCトルク制御

ここまででSimpleFOCによるFOC回転位置制御を実施いただきました。
製作する2足歩行ロボットの足動作は回転位置制御で実施するので、準備はOKなのですが、せっかくなのでさらにSimpleFOCを楽しんでいただくべく ここではトルク制御を紹介いたします。

FOCトルク制御のシステム図は以下の通りです。

モータ電流 (トルク)を検知して2相変換された電流の誤差で制御となるためシステム自体は非常にすっきりします。

Arduinoコード

 

MotionControlTypeをtorqueと指定しています(L. 84, 86)。

PID制御パラメータも2相変換された電流値のもののみになります(L. 89~102)。

loop関数内のmoveでトルクを指定してモータを動かします(L. 135, 136)。
双方のモータの位置をshaft_angleで検知してその差分の3倍をトルクとしています。
したがってモータは互いの回転位置に追従して動きます。

初期化のモータの回転方向やオフセット値をコメントアウトしているので
ギアは外してコードを書き込んでください。

動作

 

演習問題

さらにさらにSimpleFOCを堪能していただきたく以下に演習問題を挙げますので是非トライしてみてください。

1-パラメータ調整

FOC回転位置制御でアプリやコードを修正するなどして各PIDパラメータ値を変更すると動作にどう影響するのか体験してみよう。

2-ほかの動作モードに挑戦

ここではFOCによる回転位置制御とトルク制御を紹介しましたが是非ほかの動作モードも試してみてください。

たとえばモータ回転スピードを指定する制御など。

 
以下に大変に参考になるリンクを挙げます、ご参照ください。

 

おわりに

記念すべき 予算3万円でつくる BLDC 2足歩行ロボット 創刊号としてSimpleFOCについて紹介させていただきました。

simpleFOCライブラリは大変充実しており、BLDCを活用する際の大きな助けになると考えております。
本号が読者様のBLDC応用のきっかけとなればうれしく思います。

次回はここでのFOC回転位置制御を発展させて ロボットの足のIK(逆運動学)を楽しみたいと思います。

 

コメントはこちらから

メールアドレスが公開されることはありません。コメントのみでもOKです。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください