カラクリの館

関西学院大学神戸三田キャンパスにて活動しているものづくり団体「機巧堂」です。メンバーが思い思いに綴ります。

ArduinoのPIDライブラリ

 初投稿となります。シャチです。

一年生の頃はArduinoMATLABでフィーッドバック制御をやろうと思っていたのですが、なんとArduinoにはPIDライブラリが存在します。

初めから使っとけばよかったですねこれ(泣)

さて、自分のメモ帳の代わりとしてライブラリで使用可能な関数と、その機能をまとめておこうと思います。伝わりにくい日本語になってしまうかと思いますが。

 

PID(入力、出力、セットポイント、Kp、Ki、Kd、Direction)

これがPID制御のクラス。

PID myPID(&input, &output, &setpoint, &kp, ki, kd, DIRECT)

このようにオブジェクト化する。kp,ki,kdは1,2,3などの数字でも良いらしい。

またこの時点でinput, output, setpointはdouble型で宣言しておく必要があるがこの時点では値を代入してなくてもいいらしい。(あとで実験します)

setupとloopの中にinputとoutputとsetpointの値を代入する式を書けばいいらしい。ちなみにsetpointは目標値のこと。

最後のDIRECTはDIRECTモードを選択していることを表すらいいが、DIRECTモードが何なのかは不明。REVERSEモードも存在するらいしいが、一般的には用いないらしい。

 

Comoute()

void loop()の{}の中に書くことで、ループが回るたびに一回だけブロック線図をループする。つまり一回分フィードバッックする。myPID.Compute(); という感じで。SetSampleTime で計算の間隔を調整する。詳しくは後述。

 

SetMode(mode)

これはvoid setup()の{}の中に書く。これも上のやつと同じように、オブジェクト名.SetMode(mode);と書く。引数にManualかAutomaticを書いて、PIDのオンオフを決定できるらしい。多分Automaticにしとけば問題ないと思われる。

 

SetOutputLimits(min,max)

これはArduinoの出力の変化範囲を指定できる。デフォルトは0~255。maxを255以上の値に変化させることはできない。使うことあるのだろうか。

 

SetTunings()

まだ使ってないので分からないが、自動的にkp,ki,kdの値を調整してくれる?らしい。正直使う必要はあまりなさそうに思える。自分で実験しながら決めれば良い気もする。

 

 SetSampleTime(サンプリング時間)

サンプリング時間はミリ秒単位で決定する。これはPIDの評価頻度を決定できるらしい。正直使い所はまだ不明。

 

SetControllerDirection(Direction)

どうやらオブジェクト化した時のモードを後から決めることもできる模様。入力が設定値を超えてる場合に、出力を減らすのがDIRECTで、増やすのがREVERSEらしい。よくわかりませんね。

 

何ができるのかなどは未知数なので、今から早速ダウンロードして試してみたいと思います。

 実際に使ってみた感想なども今後書いていく予定です。

また他の人がArduinoでロボットの制御をする時の助けに少しでもなれれば...嬉しいですね。

 

来年の春には倒立振子作りたいなぁ...