床拭きロボットの製作(5)- Blynkアプリでリモートコントロール
Posted by arms22 on 2017年03月28日

「ボタン1つで勝手に掃除」というレベルにはまだまだ先が長いのでとりあえずBlynkアプリで操縦できるようにしました。
今回2つの動作モードを用意しました。左右のモータを別々に制御するダイレクトドライブモードと運動モデルに基づくモーションコントロールモードです。モーションコントロールモードはロボットの運動を併進速度・角速度で制御するモードで独立2輪ロボットでよく使われる運動モデルです。詳しくは下記を参照してください。
車輪移動ロボット - 機械知能工学科 - 東北学院大学
実際に走行させてみました。速度が速くて操縦が難しいです。台形加速の制御を入れてないと、、
BlynkアプリのUI

左がダイレクトドライブモード、右がモーションコントロールモードのUIです。ダイレクトドライブモードでは移動速度をパルス/毎秒で左右のモータに直接指令を出します。モーションコントロールモードでは併進速度をmm/毎秒、角速度を角度/毎秒で指令を出し、マイコン側でパルス/毎秒に変換してモータを制御しています。
ソースコード
arms22/blynk_motor_controller
https://github.com/arms22/blynk_motor_controller
関連記事
Blynkを使ってスマートフォンからAdafruit Feather M0 Bluefruit LEを制御する方法
床拭きロボットの製作(2)- DCモータの制御
床拭きロボットの製作(4)- エンコーダパルスの誤差
Posted by arms22 on 2017年03月14日

一定の速度でモータを回した時に速度が少しバラつくので原因を調べてみました。次の図はPID制御をオフにして40%ぐらいの電圧をかけて空転させた時の結果です。横軸は時間(ミリ秒)、縦軸はパルス間隔(マイクロ秒)です。
パルス間隔は徐々に短くなってきて1800〜1750あたりで安定になります。この時50マイクロ秒ほどパルス間隔に変動があります。
速度が安定したあたりを拡大すると振幅が一定周期で現れているのがわかります。また1回転先の結果を重ね合わせてみると振幅がピッタリ一致することも確認できました。どうやらエンコーダの誤差のようです。振幅は常に一定なのでパルス間隔の平均をとって1パルスごとの変動率を求めれば簡単に補正できそうですね。
でも今回は簡単に移動平均をかけて平滑します。パルス間隔を取得するコードに下記の処理を加えます。_pulseWidthが前回までの値で_pulseWidthRawが今回の値。それぞれ0.7と0.3の重みをつけて足しあわせています。
_pulseWidth = _pulseWidth * 70 + _pulseWidthRaw * 30;
_pulseWidth = _pulseWidth / 100;

移動平均をかけた状態でのPID制御の結果です。縦軸の単位がパルス秒に変わっています。速度安定時の制御量の振幅が随分小さくなりました。これで低速時も回転が安定するようになるかも。
参考記事
気まぐれ備忘録 磁気式エンコーダ
該当の記事は見つかりませんでした。