ArduinoでシリコンラバーヒーターをPID制御してみた

やってみた

 シリコンラバーヒーターを一定の温度に保つために温度調節器が必要になった。安く市販されているものもあるが、せっかくなのでArduinoで自作してみた。

参考ページ:Temperature PID controller – Arduino

材料

品名購入先価格
Arduino Nano(Clone品)謎な中国バイヤー\500
I2C/SPIキャラクタ液晶モジュール aitendo\500
K型熱電対温度センサモジュールキット(MAX6675)スイッチサイエンス\3,024
カーボン抵抗(炭素皮膜抵抗)秋月電子通商\100
MOSFET(IRFZ44N)aitendo\100
トランジスタ(SS8050)aitendo\100

合計:\4,324

 MAX6675はスイッチサイエンスで昔購入したものだが、最近ではAmazonで中国系バイヤーが\1,000以下で売っていたりする。(ハズレがありそうだが)
これから買うなら秋月電子通商のMAX31855使用 K型熱電対アンプモジュール(\1,620)がおすすめ 。

配線

 arduinoとMOSFETは直結でも動作しそうだが、参考ページのとおり一応トランジスタを挟む形にした。

プログラム

 Arduinoのプログラムは以下のとおり。PID制御部分がややこしいことになっているが、PID制御の関数そのものがややこしいので仕方がない。

使用したライブラリはLCD_ST7032max6675

#include <LCD_ST7032.h>
#include <SPI.h>
#include <max6675.h>

// 液晶キャラクターモジュール関係(ATD1602A-14)
LCD_ST7032 lcd;

// K型熱電対温度センサー(MAX6675)関係
int MAX6675DO  = 12;    // MISO
int MAX6675CS  = 10;    // /SS
int MAX6675CLK = 13;    // SCK
int vccPin = 8;         // VCC
int gndPin = 9;         // GND
MAX6675 thermocouple(MAX6675CLK, MAX6675CS, MAX6675DO);

int PWMPin = 3;
float temperatureRead = 0.0;
float setTemperature = 45;        // 目標温度
float PIDError = 0;
float previousError = 0;
float elapsedTime, Time, timePrev;
int PIDValue = 0;

// PID制御パラメーター(要調整)
int kp = 10;   int ki = 1.0;   int kd = 1.8;
int pp = 0;    int pi = 0;    int pd = 0;

void setup() {
  lcd.begin();
  lcd.setcontrast(5);
  Serial.begin(9600);

  pinMode(vccPin, OUTPUT);
  digitalWrite(vccPin, HIGH);
  pinMode(gndPin, OUTPUT);
  digitalWrite(gndPin, LOW);

  pinMode(PWMPin,OUTPUT);
  TCCR2B = TCCR2B & B11111000 | 0x03;
  Time = millis(); 

  delay(1000);
}

void loop() { 
  temperatureRead = thermocouple.readCelsius(); // 温度センサーから温度を取得

  // 以下PID制御
  PIDError = setTemperature - temperatureRead;
  pp = kp * PIDError;

  if(-3 < PIDError <3){
    pi = pi + (ki * PIDError);
  }

  timePrev = Time;
  Time = millis();
  elapsedTime = (Time - timePrev) / 1000; 
  pd = kd * ((PIDError - previousError) / elapsedTime);
  PIDValue = pp + pi + pd;

  if(PIDValue < 0){
    PIDValue = 0;
  }
  if(PIDValue > 255){
    PIDValue = 255;
  }
  analogWrite(PWMPin, 255 - PIDValue);
  previousError = PIDError;

  delay(300);
 
 // LCDに結果出力 
  lcd.setCursor(0,0);
  lcd.print("PID TEMP control");
  lcd.setCursor(1,0);
  lcd.print("S:");
  lcd.setCursor(1,2);
  lcd.print(setTemperature,1);
  lcd.setCursor(1,9);
  lcd.print("R:");
  lcd.setCursor(1,11);
  lcd.print(temperatureRead,1);
}

動作確認 & チューニング

 PID制御のための3つのパラメータ(上記プログラムのpp、pi、pd)は、実際に動作させた上で適宜チューニングを行う。wikipediaのPID制御に色々とチューニング方法が書かれているが、動作を見ながらP→I→Dの順にパラメータを変更していくことになる。面倒だが試行錯誤が必要。

気が向いたらチューニングについて別記事にするかも

感想

おすすめ度:★★★★☆ 

 PID制御のプログラムについてはググれば沢山見つかるのでマネすれば問題ないのですが、チューニングについては自分で試行錯誤するしかないのでちょっと面倒でした。
ドローンみたいなものだともっとチューニングをしっかりやらないとダメだと思いますが、割と緩い温度調節ならがっつりやらなくてもそこそこ使えるものができると思います。

タイトルとURLをコピーしました