2025年9月号 シンプル倒立振子で理解するPID制御

●キット販売

販売するキットに付属するのは,ボディだけです.完成させるには次の部品を別途入手し,組み立てる必要があります.

・M5StickC PlusまたはM5StickC Plus2

・FS90R(FEETECH RC Model)×2

・タイヤ FS90R対応×2

・ピン・ヘッダ1×6(オス)

表(倒立振子 正面側)

裏(倒立振子 背面側)

 

 

 

 

 

 

 

●動かした様子

 

 

 

●組み立て方

▲配線

RCサーボモータとM5StickC Plucとの配線部分は自作する必要があります.使うのは1×5のオス・ピンヘッダです.

RCサーボの配線を途中で切断して(コネクタは使わない),ピンヘッダにはんだ付けします.

信号の接続を次に示します.

(RCサーボ1)PWM<橙> - G0(M5StickC Plus)

(RCサーボ1)VCC<赤> - 5V(M5StickC Plus)

(RCサーボ1)GND<茶> - GND(M5StickC Plus)

(RCサーボ2)PWM<橙> - G26 (M5StickC Plus)

(RCサーボ2)VCC<赤> - 5V(M5StickC Plus)

(RCサーボ2)GND<茶> - GND(M5StickC Plus)

 

施工例

 

●Arduino IDEにインストールするライブラリ

ファームウェアをビルドするために,ライブラリ・マネージャを使って,次のライブラリをインストールします.

KalmanFilter
https://github.com/TKJElectronics/KalmanFilter

RemoteXY
https://remotexy.com/en/help/

M5StickCPlus

https://github.com/m5stack/M5StickC-Plus

 

これ以外に,ボードマネージャでM5Stackをインストールしておく必要があります.

M5Stack

https://github.com/m5stack

 

※Arduino IDE 2.2.1で動作を確認しています(編集部).

 

 

●PID係数調整方法

PIDの係数を調整する場合に,1度で変更する量は一概に決められませんが,最初は0.1づつ変更し様子を見るのがよいでしょう.

デフォルトで入っている数値を次に示します.

float kpower = 0.001;
float kp = 21.0;
float ki = 7.0;
float kd = 1.6;
float kdst = 0.07;
float kspd = 2.5;

※このパラメータで立ちました(編集部).

 

一番最初に係数を決める際は,適切な係数値を全く予想できないと思います.

次のように,二分探索法的によさそうなところを探します.

例えば,kp = 21の場合,1を入れて足りない,

10を入れて足りない(最初は感度が分からないので桁上げで係数を振ってみる).

100入れてすごく発振,大き過ぎるので,50入れて,まだかなり発振.

25入れてちょっと発振,10と25の間なので,17.5入れて足りない…

この辺でどのくらいの値が適正値なのかが分かってきます.

17.5と25の間なので,20くらいを入れて,微妙に足りない.

21………いい感じかな…

と,こんなイメージです.

 

およそパラメータは非線形なので,調整幅は定数で幾つずつとはならず,少し慣れと経験が必要かもしれません.

実際の開発現場でも,ハードウェアもソフトウェアもそんなに悪くないけど,

係数が調整できないために同定できず,立てられない……ということはすごく多いです.

筆者も何度も見てきました.

 

特に実際の物理的機械・構成数値の簡単な制御則での式そのままなので桁が各々かなり違うことがあります.

係数ごとに0.001単位で感度が出るもの,10単位で設定するものなど非常にダイナミックレンジが幅広くなりがちです.

▲スマートフォンから変更する方法

本稿のM5StickC Plus用ファームウェアには,BLE経由でPIDパラメータを調整する機能が入っています.

これを使うためにはスマートフォンなどにRemoteXYというアプリケーションをインストールし,M5StickC Plusと接続します.

おおむね倒立振子が立ちそうな数値にkp,ki,kdを合わせた上で,スマートフォンから微調整を行います.

本稿のArduinoスケッチ(プログラム)は次のようになっており,gain[1~6] をRemoteXYアプリから変更することになります.

Speed += kpower * gain[1] * power;
P_Angle = kp *        gain[2] * Angle;
I_Angle += ki *         gain[3] * Angle + kdst * gain[5] * Speed;
D_Angle = kd *         gain[4] * dAngle;
k_speed = kspd *      gain[6] * Speed;
power = P_Angle + I_Angle + D_Angle + k_speed;

 

●オプションとして選べる構成

▲タイヤ

筆者はφ30mm程度のタイヤでも倒立動作に成功しています.

使用するタイヤ直径が1/2になると,10倍程度は制御が難しくなります.

▲M5StickCの種類

マイコンとして,M5StickC Plus2も使えます.ただし,M5StickC Plus2の場合,5Vの電源出力が弱いので,RCサーボモータの電源はBAT端子から取ります.

 

 

 

 

 

M5Stick(Plus以前のもの)は,初期のものはIMUとして別な製品を使

っているので,同じファームウェアでは動きませ

ん.後期のM5StickCのIMUはM5StickC Plusと同じMPU6886です.同じファームウェアで動くと思いますが,重心が異なるため,パラメータの調整が必要です.