AbudoriLab.

自律ロボットで誰でも遊べるよう試行錯誤するブログです。

初心者でも出来たPIDを用いたモータ制御

AbudoriLab.です。
我々のロボット: Lapinを、設定した方向と速度で移動させることに成功しました。
上記の実現にはPID制御を用いています。
本ブログでは、実装するまでの過程で得た知識を紹介します。

はじめに

本シリーズは2部構成です。

  • PID制御について調査して分かった知識の共有 ← 今回はココ
  • アルゴリズムやパラメータチューニングなどノウハウの紹介

PIDやモータ制御については解説本や記事が山ほど存在するため、技術的な詳しい話は他の文献にお任せします。
本稿では筆者がモータ制御を実装するにあたり、疑問に思い調査したことをまとめています。

モータ制御って実際何をやるの?

筆者は当初モータの動かし方すら知らかったため、モータを制御すると言っても何をコントロールしたらよいのか?というのが最初の疑問でした。
Lapinでも使っているDCモータを回してみることで、電流を流す方向やその量によって回転方向や速度を変更できるとわかりました。

左: モータを時計回りに回す 中: モータを反時計回りに回す 右: 直列つなぎで速く回す

上図の詳細解説はモータ制御回路の記事で紹介しています。
www.abudorilab.com

よって結論としては、モータ制御とは指示値(回転方向,回転速度)通りに動かすため電流を制御することです。
制御のフローを下図に示しました。
制御によって、モータの回転方向や速度の計測値と指示値の差分(ずれ)から電流を流す向きや量を調整しています。

モータ制御システムのフロー図

電流量はどうやって調整するの?

モータの回転速度を変えるには電流を流す量を変更する必要があることは分かりましたが、どうやったら量の変更を実現できるかが次の疑問でした。
こちらも先程紹介した別記事でまとめ済みなので結論だけ述べると、電流量はモータに印加する電圧の大きさで変わります。
そして、印加する電圧は電源をオン/オフする時間を変えることで調整できます。

電源のオン/オフの割合とモータ回転速度の関係


オン/オフの時間割合をDuty比と呼びます。
Duty比を決めることができればモータ制御を実現することができそうです。

PIDでDuty比を計算

Arduino等のマイコンはHIGH(5V),LOW(0V)の2値を切り替えて出力することができます。(マイコンによってはHIGHの電圧値は異なります。)
これはまさに電源のオン/オフに該当します。
よって、1周期にどれくらいの割合をHIGHとするかを制御することでモータに印加する電圧を調整できます。

ちなみにマイコンでHIGH,LOWを切り替えるためにパルス波を用います。

1のときにHIGHとし0のときにLOWに切り替え、1をどれくらいの割合にするか(=Duty比)をPIDで算出します。
Duty比 = k_p*P + k_i*I+k_d*D
P,I,Dはモータ回転速度の目標値と現在値から算出され、ゲインk_p,k_i,k_dでそれぞれの値をどれくらい強く出力に反映させるかを調整します。

PIDの解説は山ほどネットに溢れているので、詳細は他の記事に任せて概要だけをご説明します。

PID制御の概要

P(proportional : 比例),I(Integral : 積分),D(differential : 微分)の3要素から構成されるためPID制御と呼ばれています。

  • P制御

目標値と計測値の差分(ズレ)の大きさに比例して速度を変更させ、目標値に近づけるPIDでは基本となる制御になります。
P制御のみでは出力が振動することや目標値よりも低いところで安定してしまうことがあります。
wikipediaにわかりやすいgifがあるので参考までリンクを提示します。
ja.wikipedia.org

  • I制御

P制御と組み合わせて使用され目標値に到達できない場合にアシストするなどの役割がある項目です。
振動をより大きく誇張してしまうことがあります。

  • D制御

P制御とI制御と組み合わせて使用され振動を抑制する役割がある項目です。

さいごに

モータ制御の概要を理解することが出来ました。次回はプログラムの実装や、ゲインのパラメータチューニングの方法などをまとめていきます。