中華STM32F103C8でSimpleFOCをつかう

TL;DR

ブラシレスモータをロボットに使いたい.SimpleFOCというオープンハード/ライブラリが良さそう.

中華系STM32F103C8ボードにSimpleFOCのサンプルを書き込んだ.

ArduinoIDE1.8.5とSTM32duinoを使用.

PinStatus関係のエラーはsrc/communications/StepDirListener.hに以下を追記して解決.

#if defined(__STM32F1__)
#define PinStatus ExtIntTriggerMode
#endif

 

こんにちは

春ですね.

 

最近ブラシレスの機運が高まっているので,何もわかってないけど5010 360kVをひとつ買ってみました.

制御とかモジュール化がうまくいったらデカめのロボット(某OpenDynamicsとか)に使いたいなぁという気持ちだったので,電流が多く流せて高トルクで安いのを探していたらAmazonにあった怪しげなやつ.

 

商品説明欄は全く関係ないマウスピースの説明だった

ラボの予算でもいいよと言われていたけど,流石にちゃんと届かなかったら怖いので...

どうやら40Aまでイケるらしいが本当か怪しい.

ちゃんと届いたので回るものなのかテストしたいけど,ブラシレスモータは三相電流と複雑な制御が必要になる.

メインボードと通信できるいい感じのドライバがないだろうかと探していたら,SimpleFOCなるものが.

docs.simplefoc.com

トルク重視のFOC(フィールド指向制御)をしてくれる.簡単に言えば固定子とロータの磁界を直行させ,高い効率で最大トルクを発生させようというもの,らしい.

Arduinoシールド形式で,1シールド1モータを制御できる.

"真の"FOC制御らしくかなり使い勝手が良さそうなものの,公式ボードでは最大電流が5A,モータ内部抵抗が10Ω以上じゃないと電流制限が必要になるなど小さめのBLDC向けだった.

某Solo12のマイクロドライバは15A(ピーク20A)なので同じように使うには出力が足りない上に,内部抵抗も270mΩとある.

出所不明,あやしい5010のデータシート

 

24Vで動かすとすれば,単純に最高電流はI_max = 24V / 0.27Ω = 88A

ンマ高い.

15~20Aでドライブするとして,SimpleFOCのシールドの最大電流値を上げなければならない.

と,コミュニティを漁っていると出てきたPower増強版.

oshwlab.com

すばらしい.

ピーク30Aまでドライブ可能,コストも安いんだって.

完全に回路図もガーバーデータもオープンなのでこれを参考にしてドライブ基板を試してみようかなと思っている.

 

本題.

使用するマイコンについて.

ArduinoUnoシールドの形状をしているのでUnoを使えば早いのだが,如何せん数が必要になる(3Dofの足を何本か付けたい).

SimpleFOCシールドは積み上げることで複数制御可能だが,15Aでドライブすることを考えると発熱の関係であまり積み上げたりしたくない.

そうなると,なるべくコストは抑えてかつ小型に押し込みたい.その上でシールド形式という使い勝手の良さは残したい.

 

というわけで机に転がっていた中華STM32F103C8マイコンボードを一旦使ってみることにした.

みんな大好きMapleやBlackPillの系列である.

しかしF103C8なので,フラッシュメモリが64kbしかない.(中華系のC8は大抵128kbだったりするという話も聞いたことがある)

FOCに加えてSPIか何かでマスターボードとも通信して欲しい,結構ギチギチではないだろうか.

ひとまずサンプルコードだけでも書き込んで空き具合を見ることにした.

 

ArduinoIDEは諸事情あって1.8.5

STM32F103を使う設定をして,SimpleFOCをライブラリマネージャからインストール.

サンプルの中からmotion_control -> torque_control -> encoder -> current_control

電流FOCのエンコーダ用サンプルを読み込んで,ピンの名称をA0, A2からPA0, PA2に変更する.ボードによってGPIOの予約語が違うので注意.

コンパイルするも通らない.

error: 'PinStatus' does not name a type

コミュニティにSAMD21マイコンを使った際に同じようになったと報告があった(十数日前,タイムリー)

community.simplefoc.com

このトピックでは以下の記述をsrc/communications/StepDirListener.hに追加して回避している.

#define PinStatus int

で,これについてちょっと調べると.

どうやらHIGH/LOW割り込みについての話らしい,型はenum

Arduinoで使うGPIO状態割り込みのPinStatusがSAMD21ではそもそも定義されていないので見つからなくてエラーになる.

ので,defineでPinStatusをintに読み替えちゃってくださいということらしい.

 

STM32F103の場合はどうかというと,どうやら定義されているものの名称が異なる.

素直に上記コードを追記すると,

error: invalid conversion from 'int' to 'ExtIntTriggerMode'

STM32duino内ではExtintTriggerModeが使われるそうな.

scrapbox.io

見に行くと,確かにenum型でRISING,FALLING,CHANGEがある.

多分これかなぁと思いつつ,

#if defined(__STM32F1__)
#define PinStatus ExtIntTriggerMode
#endif

をStepDirListener.hの冒頭に追記.

__STM32F1__でF103を指定している.

で,コンパイルが通った.

書き込んでみるとフラッシュメモリ64kbのうち,68%ほどを使用している模様.

FOCするサンプルだけで70%近いので結構ギリギリかもしれない..

 

ひとまず,SimpleFOCを中華STM32F103C8ボードに書き込めた.

つぎはFOCを勉強しながら大電流ドライバをつくる.