SimpleFOC用の基板ができ(てい)た

こんにちは.
秋から冬にかけての時期です.

前に言うてたSimpleFOC用ドライバ基板は6月くらいに出来ていて,テストも終わっていました.
今更新しているのは単純に別のことしてたからです.

基本的に前回貼っていたPowerDriverをパク参考にして,ドライブ用のMOSFETを取り換えやすいように国内で入手可能なTO-220パッケージのTK100E08N1にした.
NchパワーMOSFET 80V100A TK100E08N1: 半導体(モジュール) 秋月電子通商-電子部品・ネット通販
基板はJLCPCBで頼んだのでそこのパーツ実装サービスで在庫のあるものに変えたりしつつ,回路図はこんな感じに.

基板はこんな感じになった.
結局,シールド形式にすると若干取り回しが悪くなったのと別のマイコンを使う案が出ているので独立基板に.

で,届いて回しているとこ.

単純にPWMを流し込んでいるだけですが元気よく回っているのでよしとします.

中華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を勉強しながら大電流ドライバをつくる.

VRChatでのボイチェン環境 [Morph VOX Jr + VST]

いい加減まとめようと思っていたので...自分の環境です。

ちなみに、ちょっと前にKinect環境を書きましたがすぐにやめてしまって現在はVIVE+トラッカー環境です。ダンスとVR睡眠がしたかった。

*本記事はVSTを利用する環境を構築するためのものであり、ボイトレとかの解説ではありません*
*雑な備忘録です。何の責任も負いません*

なんの記事

MorphVOXの無料版(Jr)とVSTプラグインを使用して、VRChatでボイチェン環境を構築します。
VIVE標準のマイクだとちょっとアレだったのでマイクを別途購入しています。

つかうソフト・VSTプラグイン

・Morph VOX jr (Free Voice Changer Software - MorphVOX Junior)
・VoiceMeeterBanana (VB-Audio VoiceMeeter Banana)
・Cantabile Lite (Free VST Host - Cantabile Lite - Cantabile - Software for Performing Musicians) x86版をDL
・VBCable (VB-Audio Virtual Apps)
VSTプラグイン
・Reafir
・Reaxcomp
※上記二つはReaPlugsに同封(REAPER | ReaPlugs) x86版をDL
・SPITFISH (digitalfishphones.com - audio freeware plugins by Sascha Eversmeier) ページ下部のthe fish fillets PC (Win) version 1.1から
・SanfordReverb (Leslie Sanford - VST Plugins)

VST is 何

音源に様々な効果を付与するもので、VSTHostと呼ばれるカテゴリのソフトウェアにプラグインとして導入すると利用可能になります。
今回はCantabile LiteをVSTHostとして使用し、ノイズ除去(Reafir)・音量調整(Reaxcomp)・歯擦音軽減(SPITFISH)・残響(SanfordReverb)のプラグインを乗せます。

全体の構成

f:id:Mijinko:20190215123822p:plain
マイクから入力した音声をBanana経由でCantabileに渡し、音声処理をかけてBananaに戻します。
そこからVBCableでMorph(ボイチェン)に渡して変換、出力をVRChatとプレイバックのためにBanana経由でスピーカー(VIVEのイヤホン)へ流します。
これで自分の声を確認しながら喋ることができます(おすすめしますが、慣れないうちは脳が混乱して喋りづらい)。

IN1とかIN5とかあるのはBananaとCantabileで使用するポートのようなもので、これらのソフトウェア間ならポート番号を合わせることで別途ケーブルいらずで受け渡しができます。
A1,A2はBanana内のみで利用できるポートです。HardwareINPUTからHardwareOUTに渡すことができます。
Morphはオーディオドライバが同封されていて、インストールすると自動的にScreaming Bee Audioが追加されます。
これを既定のデバイスにしておくとVRChat側がマイク入力として受け取ってくれます。
今現在はわかりませんが、デバイス名に日本語が入っているとダメっぽいのでサウンドの録音タブから"VC"とか適当にリネームしておきます。
f:id:Mijinko:20190215125548p:plain

Bananaの設定

各ソフトウェアのインストール後、それぞれ設定します。
f:id:Mijinko:20190215124828p:plain
まず右上のHardwareOUTにA1[スピーカー(VB-Audio Virtual Cable)], A2[スピーカー(HTC VIVE)] を選択。
次にHardwareINPUT1にマイクを選択し、HardwareINPUT2にMorphの出力(Screaming Bee Audio)を選択。INPUT2のA2をクリックしてスピーカーに渡しておきます。
真ん中あたりのVoiceMeeter AUXからはVBCableに渡すためA1をクリック。

f:id:Mijinko:20190215130625p:plain
右上のMenuからSystem Settings / Options...から上記設定画面を開く。
設定画面下部のPATCH INSERTにあるin5 Leftとin5 Rightをクリックしポートを繋ぐ。そのまま×を押して設定画面を閉じてOKです。

Cantabile Liteの設定

まずToolsからOptionを開く。
f:id:Mijinko:20190215131235p:plain
Audio Engineタブ->Audio Driverを"ASIO - Voicemeeter Insert Virtual ASIO"に設定。
f:id:Mijinko:20190215131420p:plain
Audio Portsタブからinとoutを設定する。
下部のAddからStereo Input Port..をクリックして名前を適当に入れてOK。inが追加される。
LeftとRightの(unassigned)を右クリックで"IN#1 Left","IN#1 Right"をそれぞれ選択。
同様にAddからStereo Output Port..でoutを追加し、"IN#5 Left", "IN#5 Right"をそれぞれ選択。
上記画像のようになればOK(metronomeは無視で構わない)。

これでBananaとの受け渡しができるようになったはずなので、VSTプラグインを繋ぐ。
f:id:Mijinko:20190215132056p:plain
Input Portsの下にあるAdd Routeをクリック、先ほど設定したinを選択。
Add ObjectからPlugin..を選択し、下部のMoreからbrowse for Plugin...をクリックしダウンロードしてきたVSTプラグインのDLLファイルを開く。
RealPlugsはインストールしたフォルダにDLL群がある。

それぞれのファイル名は
Reafir:reafir_standalone.dll
Reaxcomp:reaxcomp_standalone.dll
SPITFISH:SPITFISH.dll
SanfordReverb:SanfordReverb32.dll
間違ってたらごめん

f:id:Mijinko:20190215133506p:plain
それらを追加後、赤枠で囲った箇所をクリックして繋いでいく。
繋ぐ順番は好みとかたぶん色々あるので、私の例だけ
in -> reafir -> SPITFISH -> SanfordReverb -> reaxcomp -> out

繋ぎ終わったら、テストのためBananaのAUXをA2にも渡します。
画面右上の電源ボタンを押してマイクに喋ってみて通じてるかテストします。上手くいってたら残響かかりまくりの自分の声が聞こえます。
何回かON/OFFすると繋がったりするので、左端のin,outの音量インジケーターが動かないときはポチポチしてみてください。なんか出力がガタガタするときも同様。

無事通じたら各VSTの設定です。
ReafirとReaxcomp以外は個人差や好みが大きい部分なので、参考程度です。
いらないプラグインがある場合は外しましょう。

Reafirの設定

ノイズ除去です。マイクの特性や個体差なんかでホワイトノイズが乗ってたりするのでそれらを除きます。
Cantabileの電源をONにしたまま、reafirをダブルクリックして設定画面を出します。
デフォルトでModeがEQになっているのでSubtractに変えます。すると黄色の波形で現在の入力が表示されますが、何も喋ってない時の持続的な波形がノイズです。
Modeの横のチェックボックス(Automaticallyなんとか)をクリックすると、入力波形に沿って赤色のフィルタを生成してくれます。チェックが入っている間の入力を見るため、ノイズが消えたらチェックを外して完了です。
f:id:Mijinko:20190215134531p:plain

SPITFISHの設定

よくわからない...(本音)
ここら辺は個人差が出てくるので詳細な設定は検索してください()
私は周波数8k[Hz]あたりにかけています。
f:id:Mijinko:20190215140528p:plain

SanfordReverb

声をちょっと柔らかくする程度にかけてます。
デフォルトでは残響しゅごいので設定値を小さく。
f:id:Mijinko:20190215140941p:plain

Reaxcomp

コンプレッサーです。
Morphでは、入力の音量が一定以上ないとうまく変換してくれません。
なので語尾や小さく漏れた声などはそこだけ変換がかからず男性っぽいになることがたまにあります(あった)。
対策として、コンプレッサーで入力音声を底上げして変換後の音量をその分調整しています。

設定画面を開くとバンド(数字の描いてある赤いバー)が5つくらいあるので、それぞれ右クリックしてDelete Bandを押し1つにまとめます。
小声で喋りながらバーの位置を下げ、緑色の入力に合わせれば多分OKです。
f:id:Mijinko:20190215141905p:plain
入力そもそもが小さい場合はBananaのマイク音量を上げましょう。

Morphの設定

先ほどテストのために設定したBananaのAUXからA2を外しておきます。
まずMorphを起動すると初期設定が出てきますが、これは後から設定可能なのでとりあえずcancelを押します。
メニューバーのMorphVOX -> PreferencesからDevice Settingsに入ります。
f:id:Mijinko:20190215143553p:plain
MicrophoneにVBCableを選択し、Echoなんとかのチェックボックスがついていたら外します。
Sound SettingsからSoundThresholdを最低にし、OK。Cantabileで音声処理をした後の声が入力されます。


メニューバーのTools -> Voice Learning -> Run Voice Doctor..でVoiceDoctorを起動します。
f:id:Mijinko:20190215143950p:plain
Recordを押して「あーーーー」と緑色になるまで喋ります。
この時、地声より少し喉を締めてほんの少し高めの声で喋るといいかもしれません。
緑色になったら、Stopを押してからNextを押します。すると自動的になんやかんやしてくれて設定が完了します。
f:id:Mijinko:20190215144823p:plain
Listenをオフにして、Womanをクリックするとボイチェンがかかります。
納得できる声が出なかった場合、再度VoiceDoctorを起動して声の高さを変えて設定してみてください。ここは試行錯誤です。

自己流声の出し方メモ

あくまで自分用のメモです。
きちんとした発声法に関しては、メラニー法などの女声の出し方を調べてください。
体感的には、
地声---×---------〇----裏声
VoiceDorctorには×程度の高さで設定し、〇らへんの高さで喉仏を震わせないように喋るとそれっぽい声になります。喉の筋肉を鍛えていけ。
あくまでボイチェンはピッチ補助的な役割と捉えて、フォルマントのボイトレをがんばりましょう。フォルマントさえ女性的に近づけば、ピッチは低くても綺麗に変換されます。
口角を上げて、アヒル口のようにして喋ると猫撫で声がでたりでなかったりします。
喋り方・イントネーションに関してはゲームやメディアなどで女性キャラクターのセリフ真似をしていると掴めるかもしれません。アバターになりきって感情込めてあげましょう。
だからみんなロシアンワールドいこう。いこうね。

おわり

最初のころは喉が疲れまくってましたが、最近はいつでもある程度は出せるようになりました。
別のボイチェンソフトでも環境構築はだいたいこれでいけますが、プラグインや設定、声の出し方は人それぞれです。
Morphが合わない場合は恋声やバ美声を試してみましょう。その場合はケーブルを増やす必要があったりします(VBCableは$5~くらいの寄付で増やせる)。NETDUETインストールしても1本ついてくるとか。
良きボイチェンライフを....

VRChatにOculusDK2+JoyCon+Kinectで潜り込む

自分用備忘録。

いいよね、VR. 私もしたい

でもOculusRiftもVIVEもちょっとお高い。
WindowsMRは比較的安めだけど手のトラッキング範囲が限られている。

サークル室に転がっていたOculusDK2

Kinect for Windows

これにswitchのJoyConを買ってきてなんちゃってVRする。

! Windows10でないと、JoyConが認識されず動きません !

なにをしたの

OculusDK2とKinect、JoyConでVRした。
一般的なVR機器には遠く及びませんが、身振り手振りで話すくらいには使える。
お金あるならVIVEのほうが...いいかな!

準備したもの

・OculusDK2
Kinect for Windows
・KinectSDK1.8 - Kinect使うためのSDK。MSから無料で持ってこれる
・JoyCon - 7000円くらい
・JoyCon充電器 - 1500円くらい
BlueToothアダプタ - 必要であれば
・Driver4VR - 2500円くらい 試用版ありのソフトウェア
・いい感じのマイク
・USB/オーディオ延長ケーブル

手順

OculusDK2を使えるようにする

まずはOculusソフトウェアをインストール。デバイスの設定はスキップを押す。
DeviceタブにてHMDとセンサーがconnectになってればOK.

SteamVRを導入

DK2をつないでSteamを起動すれば勝手にダイアログが出て入れてくれる。
SteamVRを起動して、HMDとセンサーが緑色になっていることを確認。

Driver4VRを導入

試用版は15分程度? でソフトの再起動が必要になる。テストして納得したら買おうね。アカウントは作っておこう。
SteamVRを認識してドライバまでインストールするので、SteamVRインストールした後に入れましょう。

Kinectを接続

インストールするだけ。今回のようにv1とかfor Windowsの場合は1.8を入れる。
KinectをPCに接続して、デバイスマネージャからきちんと認識されていることを確認する。

JoyConを接続

BlueToothで接続。JoyConの側面にある黒い小さな丸ボタンを長押しでペアリング。
接続済みと出たらOK.

VRChatを導入

おもむろにインストール。

SteamVRを起動

一緒にDriver4VRが起動するので、アカウントにログイン。
頭の動きはDK2で取得できるのでHeadTrackingはオフ。
HandTrackingをONにして、BodyTrackingはお好みで。BodyをONにした場合はキャリブレーションが必要です。
恐らくD4VRを再起動しろと言われるので、D4VRとSteamVRも再起動。
D4VRのDeviceManagerからJoyConのタブへ行き、ONにした後Updateを押すと接続したJoyConがリストに表示される。
それぞれをleftとrightにAssignして割り当てる。
Startを押すと、SteamVRにてD4という表記とコントローラーらしきマークが緑になるはず。これでエミュレート完了。

VRChatを起動

遊ぼうね。
JoyConは回転とボタンを割り当てているだけなので、Kinectとのズレで手首が頻繁に折れます。なので+,-ボタンを押して戻してやる必要があります(かなり高頻度)。
Bodyもトラッキングしている場合は最初に四肢を合わせてキャリブレーションしますが、この時のボタンはトリガーではなく↓+Bです。

キーバインド

これがマジでわかんない。自動割り当てのようだけど使いづらいことこの上なし。
物を選択(パネルとかスイッチとか) : トリガー
物をつかむ : ↓ or B
物をつかんだ状態で使用する : 掴んでいるほうのコントローラーでトリガー
移動 : 左のジョイスティック
視点回転 : 右のジョイスティックにて左右
後ろを向く : ← , → or Y , A
メニュー : ↑ or Y 選択はトリガー

ここまではええのじゃ..でもジョイスティックに表情などのエモーションが割り当てられていて、アバターによりピースしながら走ったり舌出したりすることになる。つらい。
色んなアバターワールド周ったけど、ほとんどこれのせいで通常時でもにっこりしてたりとか移動/スティックでの視点移動をすると顔芸を始める。つらいことこの上ない。

なのでこの方法を使う人は、自作アバターを用意することをお勧めします。表情できないのつらいね。
キーコンフィグがあればいいんだけど、よくわからないです(よわい)

おわり

VRChatよりBlender使ってるほうが長い

お寿司ツイートボタン(Processing+Arduino+twitter4j)

おすしたべたいです。

 

食べたすぎておすしツイートしてしまう🍣

 

そういうわけで、お寿司の絵文字をツイートするボタンをつくりました。

(という名目でProcessing+Arduinoを試したかった)

 

・なにをしたの

Arduinoにスイッチつないで、Firmata接続したProcessing側で"スイッチが押されたらお寿司の絵文字をツイートする"という動作をさせただけ。

純正ArduinoじゃなくてJapaninoだけど許して。わりと備忘録。

 

・準備

1. ProcessingにArduinoのライブラリを入れる

2. Processingにtwitterライブラリのtwitter4jを入れる。

 -注意: 公式から落としてきたまま放り込むと認識されないので、ちゃんとわかってくれるようにフォルダ構造を作ってあげる必要があり。ググると作ってアップしてくださってる方がいるので、それをDLして最新版と.jarを入れ替えるといいかも。

3. ArduinoにはFirmataのStandardFirmataを書き込んでおく。

4. TwitterAPIを取得して、KeyとかTokenを用意しておく。

 

Arduino

スイッチをプルダウンで接続、今回は12番ピン。

f:id:Mijinko:20180417040722j:plain

こっちはこれでおわりです。

 

・Processing側

ライブラリをインポートして、処理はこっちで全部書きました。

import twitter4j.conf.*;
import twitter4j.internal.async.*;
import twitter4j.internal.org.json.*;
import twitter4j.internal.logging.*;
import twitter4j.http.*;
import twitter4j.internal.util.*;
import twitter4j.api.*;
import twitter4j.util.*;
import twitter4j.internal.http.*;
import twitter4j.*;
import processing.serial.*;
import cc.arduino.*;
Arduino arduino;
Twitter twitter;
int pin = 12;

String consumerKey = "***";
String consumerSecret = "***";
String accessToken = "***";
String accessSecret = "***";

void setup() {
size(400,200);
arduino = new Arduino(this, Arduino.list()[1], 57600);
arduino.pinMode(pin,Arduino.INPUT);
ConfigurationBuilder cb = new ConfigurationBuilder();
cb.setOAuthConsumerKey(consumerKey);
cb.setOAuthConsumerSecret(consumerSecret);
cb.setOAuthAccessToken(accessToken);
cb.setOAuthAccessTokenSecret(accessSecret);

twitter = new TwitterFactory(cb.build()).getInstance();
}

void draw() {
background(0);
fill(255);
if(arduino.digitalRead(pin) == Arduino.HIGH) {
tweetSUSHI();
delay(100);
}
}

//ツイートする関数 void tweetSUSHI() { try{ String sushi = "🍣"; twitter.updateStatus(new StatusUpdate(sushi+" at"+hour()+":"+minute())); println("Successfully Post SUSHI"); } catch(TwitterException e){ e.printStackTrace(); } }

***の箇所はご自分のものに。

ツイート内容に時刻が入っているのは、APIによる同一内容連投はどうやら403で弾かれるようなので。

"Status is a duplicate"とか言われます。

 

ArduinoをPCと接続したまま実行し、ボタンを押すとお寿司がツイートされます。

 (36:40になってるのは分:秒にしてたため)

 

・おわり

私は数回で飽きた。