NOBのArduino日記!

NOBのArduino日記!

趣味は車・バイク・自転車・ラジコン・電子工作です。

PID制御!(PID_v1.hのインストール編)

イメージ 2
 Arduinoのサイトを探したところArduinoIDEで使えるPID制御のライブラリを発見したのでインストールしてみました

※PID制御とは、制御工学におけるフィードバック制御の一種であり、入力をセットポイントに向かって自動で出力を調整する方法です。産業用制御システムでは今でも広く使用されています。

1. PIDライブラリのインストール

 前回の記事ではサンプリング方式のPID制御をプログラム化してみましたが、実はArduinoには既にPID制御のライブラリが用意されています!
 さすがArduino痒い所に手が届きます、早速使わせて頂きました!
 
1.1 ダウンロード
 GitHubと言うサイトに「br3ttb/Arduino-PID-Library」と言うページが有ります。
 PIDライブラリはこのページで入手出来ます。
 ダウンロード方法はこのサイト(図1)にアクセスし、右側に有る緑のボタン「Clone or download」をクリックし、次に「Download ZIP」をクリックすれば「Arduino-PID-Library-master」と言うPIDライブラリが含まれたZIPファイルがダウンロードされます。
イメージ 1
図1:GitHubでライブラリを入手!

1.2 フォルダ名の変更
 1.1でダウンロードしたZIPフォルダそのままではArduinoIDEにインストール出来ませんので、一度ZIPファイル(図2)から中身(図3)を取り出します。
 次に「Arduino-PID-Library-master」と言うフォルダ名を「PID」に変更します。
イメージ 2 → イメージ 3 → イメージ 4
     図2:ZIPファイル    図3:中身    図4:リネイム
 
1.3 インストール
 図4で用意した「PID」フォルダを、ArduinoIDEがインストールされているフォルダ(図5)中の「Libraries」フォルダ中に移動するだけでインストール終了です!
イメージ 5
図5:ライブラリのインストールフォルダ

2. 実験!

 PIDライブラリがどんな感じか実験してみました!
 
2.1 接続
 図6,黄色線部の様に、ArduinoUNOの2番ピンと3番ピンをジャンプワイヤーで接続するだけでOKです!
イメージ 2
図6:ArduinoUNO接続図

2.2 プログラム
 図6の様に接続したArduinoUNOに下記プログラムを書き込みます。
 プログラムの内容としては、3番ピンで発生したPWM信号を2番ピンで測定し、その結果から3番ピン出力を、設定したDuty比70.6%(180)となるように操作量をPIDライブラリで求め出力します。
/*NOBのArduino日記!_PID制御!PIDライブラリインストール編_20170331*/
#include <PID_v1.h>
double Setpoint, Input, Output;
PID myPID(&Input, &Output, &Setpoint, 0.04, 0.04, 0.04, DIRECT); //初期値設定

// PWMのD比測定
volatile float Duty;
volatile unsigned long UpNew, UpOld, DownNew, DownOld;
void SUB() {
  if (digitalRead(2) == LOW) {
    DownOld = DownNew; DownNew = micros();
    Duty = ((DownNew - UpNew) * 1000) / ((UpNew - UpOld)) * 0.1;
  }
  else {
    UpOld = UpNew; UpNew = micros();
    Duty = ((DownNew - UpOld) * 1000) / (UpNew - UpOld) * 0.1;
  }
}

void setup() {
  pinMode(3, OUTPUT); pinMode(2, INPUT_PULLUP); //3ピン出力2ピン入力設定
  attachInterrupt(0, SUB, CHANGE);
  Serial.begin(9600);
  Setpoint = 180;//目標値設定
  myPID.SetMode(AUTOMATIC);
}//PID関数を実行

void loop() {
  Input = map(Duty, 0, 100, 0, 255); //2ピン入力値取得
  myPID.Compute();
  analogWrite(3, Output);
  Serial.print("Input=");
  Serial.print(Input);
  Serial.print(",Output=");
  Serial.println(Output); delay(100);
}
イメージ 1
図1:プログラム例

  

2.3 測定
 上記プログラムを実行すると、現在の測定値(input)と、出力値(output)が図7の様にPCのシリアルモニタ上に出力されます。
イメージ 6
図7:Arduino IDE シリアルモニター

2.4 結果
 図7で得られた出力結果をEXCELでグラフ化したものを図8に示します。
 グラフより、今回設定した180と言う目標に対してPIDライブラリが自動的に制御量を調整し、測定値が180に達した時点で安定している様子が確認されました!
イメージ 7
図8:図7グラフ化

3. まとめ

 ライブラリを使ったほうが数式を書かなくて良い分プログラムがスッキリして良い感じです!
イメージ 1 イメージ 3
励みになりますのでよければクリック下さい(^o^)/

↩【PID制御!】目次に戻る