2014年6月11日水曜日

arduinoのPIDライブラリで実験



ライントレーサー倒立振子を調べるとPID制御という制御方法にたいてい触れるわけです。
P:Proportinal 比例
I:Integral 積分
D:Derivative 微分
の頭文字で、「フィードバック制御の一種であり、入力値の制御を出力値と目標値との偏差、その積分、および微分の3つの要素によって行う方法のことである」(wikipedia)
数学的な解説はたくさんあるのですが、自分にはなかなか理解が難しい。

参考
PID制御って何?
モータのPID制御法

arduinoにはライブラリがあるので、簡単な実験でとにかく動かしてみました。


ブレッドボードに余計なものが乗ってますが・・・
写真左、電球の下に温度センサーを敷いています。
以前の記事に上げたFETモータードライバにPWMを入力し電球を制御。

ボリュームで目標値(Setpoint)を設定。この実験では温度。
温度センサーLM60の出力をアナログA0に入力(Input)。
PIDライブラリが計算して5ピンに出力(Output)。
デフォルトで計算結果は0~255で
analogWrite(5,Output);
として電球(バイク用6V)に通電、温度センサを温めます。




実行すると、温度センサーの出力がボリュームで設定した値になるように、PWM出力が調整されて電球の明るさが変化します。

シリアル通信で1秒毎に出力したものをグラフ化。



PID制御の定数Kp、Ki、Kdはサンプルスケッチのままを使いました。
青色は目標値(Setpoint)、赤色は温度センサーの出力(Input)、黄色はPWM出力(Output)です。
中盤、電球と温度センサーが点接触なのと目標値が高すぎなので、温度が上がらなかったので後半下げています。

目的、回路によって定数Kp、Ki、Kdを適切な値に設定しないといけなく、その導き方にも方法があるようで、勉強が必要です。

数学的な理解はともかく、やってみたら思っていたより簡単に使えるかも?
むしろ難しいのはこれからかな。



#include <PID_v1.h>
double Setpoint, Input, Output;
PID myPID(&Input, &Output, &Setpoint,2,5,1, DIRECT);

void setup(){
  Serial.begin(9600);
  pinMode(5, OUTPUT);         //電球へPWM出力
  pinMode(6, OUTPUT);         //モータードライバの操作用
  digitalWrite(5,LOW);
  digitalWrite(6,LOW);
  pinMode(A5,INPUT);          //温度センサーの接続
  Input = analogRead(A5);
  Setpoint = analogRead(A0);
  myPID.SetMode(AUTOMATIC);
}

void loop(){
  Setpoint = analogRead(A0);  //ボリュームで目標値を設定
  Input = analogRead(A5);     //温度センサーの出力をPIDライブラリに渡す
  myPID.Compute();            //計算の実行
  analogWrite(5,Output);      //計算された数値はOutputに入っている
  Serial.print(Setpoint);
  Serial.print("\t");
  Serial.print(Input);
  Serial.print("\t");
  Serial.print(Output);
  Serial.println("");
  delay(1000);
}


ライントレーサーや倒立振子の制御ができたらいいね なんてね。


環境:arduinoUNO、arduinoIDE1.0.5、win7(64)



0 件のコメント:

コメントを投稿