2014年7月21日月曜日

STM32F3DISCOVERYでステッピングモーターとサーボモーターを動かす

ステッピングモーターに連結したレゴの歯車に、サーボモーターを無理やり付けてみた。コレで、刺身にタンポポを載せるような単調作業が楽になるかもしれない。

 最初はいい調子に動いたと思ったが、何度か動かしていると原点がずれていく。回転角が大きいときに、慣性に負けて脱調してしまうらしい。脱調しない速度に固定すると遅すぎるので、目標までの距離に応じて加減速させてみた。スピードと安定性のバランス が難しい。



秋月電子で買ったステッピングモーターを、LEGOで羽交い絞めにして固定している。負荷が軽いので、これで全く問題なし。サーボとLEGOは、輪ゴムで巻いただけ。

STM32F3DISCOVERYでステッピングモーターを動かす

STM32F3DISCOVERYでステッピングモーターを動かしてみた。
モータードライバはTIのDRV8830。I2Cインターフェースなので、MCUからの制御用配線は2本。ドライブ用ブレッドボードへの配線は、電源を入れても4本。

 モーターのステップ角は3.75°で、96step/rev。DRV8830は極性と同時に出力電圧を設定できるので、動作が滑らかになるのを期待して、極性を反転させる際に階段状に電圧を変化させてマイクロステップの真似事をしてみたが、スムーズになったようには見えない。




2014年7月15日火曜日

STM32CubeのUSBハンドラの中でosMessagePut()したら固まった

 Lチカできるようになったので、色気を出してOSのメッセージキューに手を出して見た。受信データの有無を知るために、グローバル変数のバッファデータ長をポーリングするのをやめて、USBの受信ハンドラの中でバッファ構造体をメッセージキュー経由で渡すことにした。んでもって、100%フリーズするバグの出来上がり。
 デバッガで追って見ると、優先度をチェックするconfigASSERT()でFAILして、無限ループの刑を受けているらしいことがわかった。ぐぐってみたら、ハンドラの中でFreeRTOSのシステムコールを呼ぶには、USBハンドラの優先度を下げないといけないらしい。
 ソースはココ→ マイコン徹底入門 割込み優先度の設定
STM32CubeMXのNVIC設定でUSBの優先度を下げて(priorityの数字を増やして)、一件落着。


STM32CubeMXをJava8(x64)で使うとコード生成でフリーズする

 STM32CubeMXのコード生成機能(Generate source code based on user settings)でソースコードを出力すると、100%の確立でフリーズするようになった。STM32CubeMXはJavaで動いているので、試しに64bit版のJava 8をアンインストールして32bit版を使うようにしたら、問題なく出力できるようになった。いつまで経っても信頼できないx64版Javaって悲しすぎ。

2014年7月13日日曜日

STM32F3DISCOVERY的なLチカ

 STM32F3DISCOVERYのVCP疎通確認用に作ったEchoBackが動いたので、F3DiscoveryらしいLチカを書いてみた。LD3~LD10が入力した文字コードの各ビットに対応する。

STM32CubeF3のUSB CDCミドルウェアがバグってる

STMicroelectronicsが用意したSTM32のUSB CDCミドルウェアが、少々バグってるらしい。
 PCからVCP(仮想COMポート)に送信した文字を、STM32F3DISCOVERYからエコーバックするだけのプログラムを書いたが、最初の1文字しかエコーバックされない。デバッガで調べると、2文字目以降でコールバック関数が呼ばれていないようだ。ぐぐってみたら、ズバリの現象を特定したスレがフォーラムに見つかった。
 USB middleware issue with CDC/VCP: only x packets receivable (HAL 1.1.0 and Host-Device_Lib 2.1.0)

 受信処理の中で、受信完了のコールバックを呼んでいないらしい。HeapSizeが小さすぎるという罠もあったらしいけど、これは試す前に書き換えた。

 VCPが通るようになったので、PCからコマンドを送る経路が確保する目処が立った。でも、リセットの度にUSB抜き差しして再接続は面倒。いずれFT232RLのUSB-UART変換に逃避してしまうかもしれない。

2014年7月8日火曜日

Keil 5.11aはST-LINK2の最新ファーム(V2.J21)に未対応

 STM32用のファームの雛形は、今年リリースされたSTM32CubeMXで用意することにした。クロックの選択やピンアサイン、タイマーの設定がGUIでできて、禁則もチェックしてくれる。
 開発環境は、コードサイズが32kBを越えないと踏んで、STM32CubeMXが対応しているKeil MDK-ARM Liteにした。が、ここに落とし穴があった。

 Keil  MDK-ARMと別にインストールしたST-LINK UtilityをSTM32F3DISCOVERYに初めて接続したとき、「ファームが古いからアップデートせい」と表示されたので言うとおりにしたのだが、これが罠。現在最新のKeil 5.11aは、ST-LINK2の最新ファームに対応していない事を後で知った。お陰で、ビルドしたファームウェアをダウンロードさせようと何度試しても、「USB communication error」で失敗する。これで一晩無駄にした。
 ぐぐって見つけた解決策は、 ファームウェアのダウングレードだった。
 "Keil 5.11 st-link usb communication error"
  http://www.keil.com/forum/58066/
 Keil 5.11aのインストール先にアップデータがあるので、これを使うとダウングレードが出来る。答えを見つけて3分で解決。

 今この時期だけに存在する旬なバグを踏んでしまった。天に見放されているのかもしれない。先が思いやられる。

初めてのSTM32F3DISCOVERY

マイコンでモーターを制御するために、STM32F3DISCOVERYその他一式を秋月電子で買ってみた。ファームウェアは、まだ1行も書いていない。


最終目標は、薄いカードをエアーポンプで吸引して動かす、卓上版リフティングマグネットもどき。ステッピングモーターで台座、サーボモーターでアームをを動かし、DCモーターで動く水槽用エアーポンプの吸引側を使ってカードを吸い付ける。
 ステッピングモーターのドライバとして選んだのは、DRV8830。I2Cで制御するので、配線数が少なくて済む。サーボモータはSTM32のPWMで直接制御。ポンプのDCモーターは、GPIOでモータードライバDRV8832に指令を出してON/OFFする。ドライバをDRV8830に統一しなかったのは、STM32の学習を兼ねるので、複数の方式を使いたかったから。

 STM32も、I2Cも、ステッピングモーターも、サーボモーターも、PWMも初めて使うものばかり。初物ばかりで、長い道のりになりそうだ。