なんでも作っちゃう、かも。

Arduino/Make/フィジカルコンピューティング/電子工作あたりで活動しています。スタバの空きカップを使ったスタバカップアンプなど製作。最近はもっぱらArduinoと3Dプリンタの自作に興味があります。

床拭きロボットの製作(4)- エンコーダパルスの誤差

Posted by arms22 on 2017年03月14日 0  0

一定の速度でモータを回した時に速度が少しバラつくので原因を調べてみました。次の図はPID制御をオフにして40%ぐらいの電圧をかけて空転させた時の結果です。横軸は時間(ミリ秒)、縦軸はパルス間隔(マイクロ秒)です。

パルス幅-起動時

パルス間隔は徐々に短くなってきて1800〜1750あたりで安定になります。この時50マイクロ秒ほどパルス間隔に変動があります。

パルス幅-安定時

速度が安定したあたりを拡大すると振幅が一定周期で現れているのがわかります。また1回転先の結果を重ね合わせてみると振幅がピッタリ一致することも確認できました。どうやらエンコーダの誤差のようです。振幅は常に一定なのでパルス間隔の平均をとって1パルスごとの変動率を求めれば簡単に補正できそうですね。

パルス幅-安定時_移動平均ありなし

でも今回は簡単に移動平均をかけて平滑します。パルス間隔を取得するコードに下記の処理を加えます。_pulseWidthが前回までの値で_pulseWidthRawが今回の値。それぞれ0.7と0.3の重みをつけて足しあわせています。

_pulseWidth = _pulseWidth * 70 + _pulseWidthRaw * 30;
_pulseWidth = _pulseWidth / 100;


PID制御-移動平均あり

移動平均をかけた状態でのPID制御の結果です。縦軸の単位がパルス秒に変わっています。速度安定時の制御量の振幅が随分小さくなりました。これで低速時も回転が安定するようになるかも。


参考記事

気まぐれ備忘録 磁気式エンコーダ

床拭きロボットの製作(3)- フィードバック制御でDCモータの回転速度を制御する

Posted by arms22 on 2017年02月26日 0  0

フィードバック制御を組み込んで速度制御を行えるようになったので、その制御方法と結果についてまとめておきます。


速度制御


速度制御処理

速度指令は1秒あたりのパルス数=パルス秒としました。エンコーダ入力との差分をPID制御器に入力し、PID制御器の演算結果をPWMのデューティーとして使用しています。
 PID制御器の出力はPWMデューティー幅に制限し、リセットワインドアップの対策としてPID制御器の出力がPWMデューティーの範囲を超えたら積分の演算を止めるようにしました。
 エンコーダからの入力はA相のパルス間隔をタイマーのインプットキャプチャ機能を使って計測し、速度(パルス秒)に変換しています。


制御成績

実験に使用したモータはPololu社のエンコーダ付きギアードモータで、負荷としてタミヤのスポーツタイヤを取り付けています。計測はタイヤを浮かした状態(空転)で行いました。PIDのパラメータはステップ応答法、またステップ応答法の1種であるCHR法で求めました。縦軸は速度(パルス秒)、横軸は時間(ミリ秒)です。

ステップ応答法で求めたPIDパラメータを使用した場合のP制御とPI制御それとPID制御の結果を以下に示します。またCHR法で求めたPIDパラメータを使用したPID制御の結果も以下に示します。

Pololu 20.4:1 金属ギヤードモータ 25Dx50L mm LP 6V 48CPRエンコーダ付き
タミヤ スポーツタイヤセット(56mm径)


P制御 Kp 3.74491
P制御


PI制御 Kp 3.37042 Ki 127.66741
PI制御


PID制御 Kp 4.49389 Ki 280.86830 Kd 0.01798
PID制御


CHR法(目標追従:0%)Kp 2.24695 Ki 54.80357 Kd 0.00899
PID制御-CHR法目標追従0%


CHR法(目標追従:0%)Kp 2.24695 Ki 54.80357 Kd 0.00899 1200ppsから1000pps
PID制御-CHR法目標追従0%-1200_1000


ソースコード

ソースコードはgithubで公開しています。
arms22/motor_pid_test: DC motor PID control test code


参考URL

PID制御 - Wikipedia
PID controller - Wikipedia
PID制御 - MATLAB & Simulink
モータの制御法
滑らかで安定したライントレースを実現する (1/2)

床拭きロボットの製作(2)- DCモータの制御

Posted by arms22 on 2017年01月26日 0  0



DCモータを使うのは初めてなのでとりあえず回して感触を掴んでみることにします。タクトスイッチを押すと低速・中速・高速と速度を変えてDCモータが回転するスケッチを書きました。analogWrite関数を使ってモータドライバにPWM波形を入力し速度を調整しています。PWM周波数が732Hzと低く可聴域にあるのでモータからヴーという音が聞こえる。



クイックルワイパーを装備して実際にフローリングを走らせています。本体が軽いせいか思った以上に速度がでています。モータのトルクが足りるか心配だったのですが問題なさそう。2つのモータの回転数は合わせていないので、斜めに走っているのが分かる。


回路図


床拭きロボット_モータテスト回路図
今回使用するモータは静止電流が2.4A@6Vと少々電流多めなので、モータドライバ(以下、TB6612FNG)の出力を並列にして1つのモータに入力して電流を稼ぐようにしました。TB6612FNGの出力電流の定格は1つのモータにつき最大1Aですが、Peakは3.2A(たぶん2つの出力合わせて)なので回転始めの一瞬だけなら大丈夫と踏んでいます。DCモータは回転数が上がると電流が減るので、実際は並列とかいらんかもしれない。


TB6612FNGの制御ロジック

TB6612FNG H-SW制御ファンクション

IN1/IN2で回転方向を指定して、PWMで回転速度を制御します。IN1←H、IN2←LとしてPWMに矩形波を入力するとCW→ショートブレーキ→CW→ショートブレーキ…を繰り返すします。

このロジック表を見るとPWMをH固定にして、IN1またIN2にPWM波形を入力しても制御できるように見える。そうすると制御ピンを1本減らせるんだけど、PWMをH固定にする作例を探してみたけど見つからなかったので、無難に3本使って制御することする。


スケッチ





参考記事


DCモータードライバの使い方
https://trac.switch-science.com/wiki/DCMotorDriver


実験で学ぶDCモータのマイコン制御術 (メカトロ・シリーズ)
萩野 弘司 井桁 健一郎
CQ出版
売り上げランキング: 492,730


床拭きロボットの製作(1)

Posted by arms22 on 2016年12月30日 0  0

IMGP1354

DCモータのフィードバック制御をやりたくなったので、その実験用に床拭きロボットを作ることにしました。現状、木のフレームにブレッドボードとやっつけ感満載ですが、ある程度仕様が固まってきたらフレームは3Dプリンタで作って、専用の基板も起こしたいと思います。

IMGP1361

メインのマイコンモジュールはAdafruit Feather M0 Bluefruit LE、モータドライバはPololu TB6612FNGデュアルモータドライバを採用しました。TB6612FNGの出力は2つありますが、並列にして電流を稼ぐつもり。

IMGP1356

Pololuの直径25mmのエンコーダ付きギアードモータにタミヤのスポーツタイヤを付けています。バッテリーはニッケル水素直列6本の7.2Vを予定。ゆくゆくはラジコン用のリチウムイオンバッテリーに置き換えたい。

IMGP1365

スポーツタイヤ付属のホイールハブがPololuのモータシャフトに合わなかったので3Dプリンタでホイールハブを作りました。タイヤとホイールも3Dプリンタで作れるといいな。


部品リスト




該当の記事は見つかりませんでした。