ラベル オーブントースター の投稿を表示しています。 すべての投稿を表示
ラベル オーブントースター の投稿を表示しています。 すべての投稿を表示

2014年10月17日金曜日

Arduinoを用いたテンパー炉、リフロー炉の温度制御装置 (設定温度スイッチ)

前回のテンパー炉自作のブログで、
LCDキャラクタディスプレイモジュール(16×2行バックライト付)
いわゆるSC1602シリーズのキャラクター液晶が無事表示できましたので
テンパー炉の温度設定するためにスイッチを2個付けました。
左のスイッチは100の桁を、右のスイッチは10の桁をインクリメントする。



スイッチの入力はArduinoリファレンスで digitalRead() を見てこれかなと思ったが、
【書籍】作って遊べるArduino互換機で、スイッチでの割り込み処理の方法がありました。
attachInterrupt(interrupt, function, mode) を使うのですが、これもピン使用に癖があった。
お約束であまったピンにつけたが動かない。
まぁ、attachInterruptでピン指定がないのでわかりそうなもんですが、よく読むと

「Arduinoボードは割り込み0(ピン2)と割り込み1(ピン3)の外部割り込みに対応しています」

ということでデジタル2,3ピンにスイッチをつなぐようです。
でつないだところちゃんと動きました。

が、チャタリングのせいでスイッチを押すと設定値が2-3飛んでしまいます。
チャタリングはCRで除去する回路を組むのが一般的です。
が、配線も面倒なので
attachInterruptで指定する処理関数でディレイすればいいかな?
とおもいましたが、ディレイ中でも何度も処理関数を呼んでくれるようです。
ちゃんとした割り込み処理ですね。

なので、一回目にスイッチを押した時間を記憶して、次は0.2秒以上たってないと処理しないようにしました。



void L_Pushed() {
  if ((millis() - inter_time) > 200 ) {
    Setpoint += 100;
    if (Setpoint > 400) {
      Setpoint -= 400;
    }
    inter_time = millis();
  }
}

こんな感じです。


ということで、なんとなく、いまさらながらArduinoのつなぎ方がわかりました。
今のところわかってる指定されたピンは

MAX31855使用 K型熱電対アンプモジュールで使われたSPI通信では
デジタルピン10(変更可)、11,12,13を使います。
 (ATmega168/328を搭載するボード): 10(SS)、11(MOSI)、12(MISO)、13(SCK)

 また、analogWrite(pin, value)でPWMが使えるピンは
ATmega168/328を搭載しているボードでは、デジタルピン3, 5, 6, 9, 10, 11

デジタル0,1ピンはシリアル通信。

I2CのWireライブラリより
SDA(データライン)はアナログ入力ピン4、SCL(クロックライン)はアナログ入力ピン5です。 
→今回はI2C使いません。

とうことでデジタルピンがほとんど埋まってしまったので、前回のブログに書いたように
LCDキャラクタディスプレイモジュール(16×2行バックライト付)
いわゆるSC1602シリーズのキャラクター液晶はアナログピンにつなぐ事になりました。


マイコン基板、液晶、SSR放熱板を板の上にネジ止め

ソリッド・ステート・リレー(SSR)キット 25A(20A)タイプですが、
PC電源の壊れたやつから取った適当なヒートシンクにつけていましたが、結構熱くなってる。
推奨は40度以下に冷やせとのこと。
次に初代ペンティアムCPUで使っていたヒートシンクにネジ穴あけてつけてみましたが、まだあつい。

最終的に、Intel Pentium Ⅲ、Slot1のヒートシンクにつけてみました。





320度の制御をしてみましたが、以下のように少々ハンチングが起きています。

PIDのオートチューニングのライブラリはまだ入れていません。



ついでに、現在温度をシリアル通信でPCに取り込むのがいいだろう。
で、あまっているBluetoothモジュールをSPPでつけました。

回路は HC-06 Bluetooth to serial adapter を参照しました。

以前、中国通販で500円くらいで買ったものです。
5V電源でないと安定しないようです。
また、スケッチの書き込みには対応出来ませんでした。

いちおArduino-PC間 bluetooth接続を参照し、スケッチ書き込みは難しいとのこと。

まぁこれは仕方なし。

今後は温度プロファイルのPCからの書き込みにも使おうかとおもっています。

ちなみに
Bluetoothシールド_SeeedStudio
なるものも買ってしまいましたが、こちらもスケッチ書き込みは出来ないみたい。
BTモジュールはDTR信号ないですからね。

技適に対応している秋月電子¥1,500
マイクロチップ Bluetoothモジュール RN-42-I/RM
も試してみたいです。
いっぱい買えば安くなるかな。

いまのところのスケッチはこんな感じです。



// K型熱電対温度センサモジュールキット(SPI接続)MAX31855使用(5V版/3.3V版)サンプルスケッチ参照
// Switch-Science 2013.5.14(Tue)
#include "Arduino.h"
#include <SPI.h>
#include <Wire.h>
#include <PID_v1.h>
#include <LiquidCrystal.h>

#define SLAVE 10
#define RelayPin 5
//LiquidCrystal(rs, enable, d4, d5, d6, d7)
LiquidCrystal lcd(14, 15, 16, 17, 18, 19);
//PID
double Setpoint, Input, Output;
PID myPID(&Input, &Output, &Setpoint, 2, 5, 1, DIRECT);
int WindowSize = 5000;
unsigned long windowStartTime, inter_time;

void setup() {
  //7ピン 5V設定
  pinMode(7, OUTPUT);
  digitalWrite(7, HIGH);
  //6ピン GND 設定
  pinMode(6, OUTPUT);
  digitalWrite(6, LOW);
  //4ピン GND 設定
  pinMode(4, OUTPUT);
  digitalWrite(4, LOW);

  //2ピン input pullup
  pinMode(2, INPUT_PULLUP);
  //3ピン input pullup
  pinMode(3, INPUT_PULLUP);
  //タクトスイッチ 割り込み処理
  //L push 3ピン
  attachInterrupt(1, L_Pushed, FALLING);
  //R push 2ピン 
  attachInterrupt(0, R_Pushed, FALLING);

  Serial.begin(9600);
  //SPIのSS
  pinMode(SLAVE, OUTPUT);
  digitalWrite(SLAVE, HIGH);
  SPI.begin();
  SPI.setBitOrder(MSBFIRST);
  SPI.setClockDivider(SPI_CLOCK_DIV4);
  SPI.setDataMode(SPI_MODE0);

  //ヒーターへPWM出力
  pinMode(RelayPin, OUTPUT);     
  digitalWrite(RelayPin, LOW);
  Setpoint = 200;
  //turn the PID on
  myPID.SetMode(AUTOMATIC);

  lcd.begin(16, 2);
  lcd.clear();

}

void loop() {
  unsigned int thermocouple; // 14-Bit Thermocouple Temperature Data + 2-Bit
  unsigned int internal; // 12-Bit Internal Temperature Data + 4-Bit
  double disp; // display value
  char buf[16];
  delay(1000);

  digitalWrite(SLAVE, LOW);                             //  Enable the chip
  thermocouple = (unsigned int)SPI.transfer(0x00) << 8;   //  Read high byte thermocouple
  thermocouple |= (unsigned int)SPI.transfer(0x00);       //  Read low byte thermocouple
  internal = (unsigned int)SPI.transfer(0x00) << 8;       //  Read high byte internal
  internal |= (unsigned int)SPI.transfer(0x00);           //  Read low byte internal
  digitalWrite(SLAVE, HIGH);                            //  Disable the chip

  if((thermocouple & 0x0001) != 0) {

    lcd.setCursor(0,0);
    if ((internal & 0x0004) !=0) {
      lcd.print("Short to Vcc");
    }
    if ((internal & 0x0002) !=0) {
      lcd.print("Short to GND");
    }
    if ((internal & 0x0001) !=0) {
      lcd.print("Open Circuit");
    } 
  }
  else {
    if((thermocouple & 0x8000) == 0){ // 0℃以上   above 0 Degrees Celsius
      disp = (thermocouple >> 2) * 0.25;
    }
    else {   // 0℃未満   below zero
      disp = (0x3fff - (thermocouple >> 2) + 1)  * -0.25;
    }

    Serial.print(disp);
    Serial.println();
    //K温度をLCDに表示
    dtostrf(disp, 3, 0, buf);
    lcd.setCursor(0,0);
    lcd.print("P:");
    lcd.print(buf);
    lcd.print((char)0xdf);
    lcd.print('C');
    //設定温度をLCDに表示
    dtostrf(Setpoint, 3, 0, buf);
    lcd.print(" S:");
    lcd.print(buf);
    lcd.print((char)0xdf);
    lcd.print('C');
    //温度センサーの出力をPIDライブラリに渡す
    Input = disp;
    myPID.Compute();            //計算の実行
    analogWrite(RelayPin, Output);      //analogWriteはPWM出力。計算された数値はOutputに入っている

  }

  if((internal & 0x8000) == 0){ // 0℃以上   above 0 Degrees Celsius
    disp = (internal >> 4) * 0.0625;
  }
  else {                          // 0℃未満   below zero
    disp = (((0xffff - internal) >> 4) + 1)  * -0.0625;
  }

  // 室温温度をLCDに表示
  dtostrf(disp, 3, 0, buf);
  lcd.setCursor(0,1);
  lcd.print("R:");
  lcd.print(buf);
  lcd.print((char)0xdf);
  lcd.print('c');

}

void L_Pushed() {
  if ((millis() - inter_time) > 200 ) {
    Setpoint += 100;
    if (Setpoint > 400) {
      Setpoint -= 400;
    }
    inter_time = millis();
  }
}

void R_Pushed() {
  if ((millis() - inter_time) > 200 ) {
    Setpoint += 10;
    if ((int)Setpoint % 100 == 0) {
      Setpoint -= 100;
    }
    inter_time = millis();
  }
}

2014年10月15日水曜日

Arduinoを用いたテンパー炉、リフロー炉の温度制御装置(I2C液晶壊れる。)

Arduinoを用いたテンパー炉、リフロー炉の温度制御装置で、
白金抵抗素子の温度表示の液晶は
I2C接続小型キャラクタLCDモジュール 8x2行 AQM0802A
320円と安いし、使用していた。
I2Cで2ピンで制御できるのは便利だけど。3.3V電源も必要。

しかし、こやつはリードの足が1.5㎜ピッチと使いにくい。
なので無理やり2.54㎜ピッチのユニバーサル基板に足を広げて使っていた。
が、白金抵抗素子に取り付けていたI2C接続小型キャラクタLCDは使わなくなった。
ので、液晶もそのままにしときゃーいいのに取り外そうとしたら壊れてもうた。
ちょっと力いれたら割れたorz... 
で、もう一台買ってあったので1.5㎜ピッチに近い1.27㎜ピッチの表面実装変換パッドに実装。


ピンの付け根の少し上にうっすら白い線が…
最初上手く映っていたが、抵抗の位置かえたりと、いじってたら、そのうち表示しなくなった。
どうも,ピンに付け根にストレスかかって、いかれてもうた。
素直にI2C接続小型LCDモジュールピッチ変換キットとか買っとけばよかったけど。
600円だからね。

で、いつ買ったか記憶がないくらい前に買ってあった。
LCDキャラクタディスプレイモジュール(16×2行バックライト付)
いわゆるSC1602シリーズのキャラクター液晶。


表示画面もデカいし、バックライトなければ500円と安い。
しかし、シリアル通信でなく、4ビットパラレルバスで接続する。
rwを常時WriteにGND接続しても rs, enable, d4, d5, d6, d7と接続に6ピンいる。 
キャラクターLCD表示ライブラリ と LiquidCrystal() なんかを参照して接続。
当初デジタルピンを使っていたが、スイッチとか使ったら(後述)液晶につなぐのに足りなくなってしまった。
でアナログピンに液晶が使えるかを以下を調べてみたが、使えるかいまいちわからない。

Arduinoチュートリアル 基礎編 アナログ入力ピンより
Arduinoのアナログ入力ピンA0-A5には、
14から19までのピン番号が割り振られ、デジタルピンとして使える。
Arduinoボードの違いまとめ(Uno, MEGA 2560, Leonardo, Due)よりUnoの場合を確認。

わからないのでやってみようとアナログ入力ピンA0-A5の6本に液晶を接続。


#include <LiquidCrystal.h>
//LiquidCrystal(rs, enable, d4, d5, d6, d7)
LiquidCrystal lcd(14, 15, 16, 17, 18, 19);


とアナログピンを指定したらすんなり表示した。やったね。
で、無事デジタルピンはあいてくれた。


2014年10月3日金曜日

Arduinoを用いたテンパー炉、リフロー炉の温度制御装置(3) (PID制御)

前回のK型熱電対アンプモジュールでの温度測定がうまくいきました。
ので、早速オーブントースターのヒーターを秋月のソリッド・ステート・リレー(SSR)キット 25A(20A)タイプでPID制御してみます。
秋月のSSRキットをはんだ付けして組み立ててから、適当なヒートシンクにつけます。
サーモスタットの片方を半田ごてで取り外してSSRの出力にはんだ付け、もう片方に銅線をはんだ付けして、サーモスタットの線を取ったところにはんだ付けします。
サーモスタットは必要ないのですが、どこか適当な温度になるところにつけて安全装置にする予定です。

SSRの入力は以下のサンプルスケッチにあるように6ピンにしました。
これも前回と同じく、やりやすいように0ピンにしましたがうまくいかず。
実はデジタル0,1ピンはシリアル通信用に使用してるとのことで、使えないことが判明。
素人ですね。

PID制御とは
P:Proportinal 比例、I:Integral 積分、D:Derivative 微分
の頭文字。
「フィードバック制御の一種であり、入力値の制御を出力値と目標値との偏差、その積分、および微分の3つの要素によって行う方法のことである」(wikipedia)
ということなんですが、前の会社にいるとき、理化工業の温調器で薬品槽の温度管理をしており、それがPID制御でしたので名前と簡単な原理は知っています。しかしどうゆう数式でやってるかとかは知らない。
最近は倒立振子やクアッドコプターのモータのPID制御が流行ってるっぽい。

PIDのスケッチは、まず、ArduinoのPID Libraryをダウンロード
解凍したフォルダ内の \PID_v1 フォルダをArduinoのインストールフォルダー内のlibraries\以下のにフォルダごとコピー。
スケッチはPID RelayOutput ExampleのBasicをもとに、設定温度200度にしてやってみます。

測定温度を一秒置きにシリアル出力させた。
コンソールで受信したデータをエクセルにコピペしてグラフにしたのが以下


2分くらいで240度位までオーバーシュートしました。
が、3分くらいから200度で安定しました。
スケッチ内のPIDに設定値をいろいろいじるとあまりオーバーシュートせずうまくいくようです。
が、とりあえずわからないのでデフォ。
ライブラリのサンプルではPID Adaptive Tuning とか、 there is also now a PID Autotune Library that can help you determine tuning parameters.とかある、説明を見たがが、どうやるかわからん。AutoTune_Example.pdeがあったので何とかオートチューニングできそうだ。

ヒーターオンオフがSSRなので、PWM制御でもってヒーターの中途半端な加熱が可能です。
しかしハンダごて温度コントローラの製作より、
「秋月のSSRキットは、制御部にゼロクロスタイプのフォトトライアックを使っているので、出力波形は必ずゼロクロスのタイミングでON/OFFされ、従ってスイッチングノイズの発生がありません。
」ということ、60hzの分解能のPWMになるのだろうか。


PIDライブラリのサンプル RelayOutputにはリレー用のON,OFF制御のスケッチがありました。
やってみましたが、温度が上昇しすぎてうまくいきません。

PID設定値の加減でしょうが、わからないので、とりあえずPWMでやろうと思います。
 
次回はオーブントースターを組み立ててとりあえず納品しようと思います。ファンなんかはまたあとで。

今回ちょっとはまった、というか、間違え。
PID LibraryのOlder Versions からダウンしてしまった。
以下のエラーがでてコンパイルできない。

libraries/PID_v1/PID_v1.cpp: In constructor 'PID::PID(double*, double*, double*, double, double, double, int)':
libraries/PID_v1/PID_v1.cpp:26: error: 'millis' was not declared in this scope
libraries/PID_v1/PID_v1.cpp: In member function 'void PID::Compute()':
libraries/PID_v1/PID_v1.cpp:43: error: 'millis' was not declared in this scope
調べてみると
http://forum.arduino.cc/index.php?topic=158261.0 より Latest version (now hosted on GitHub)からダウンせよとのこと。
そうするとコンパイルできた。


Arduinoを用いたテンパー炉、リフロー炉の温度制御装置(2) (K型熱電対アンプモジュールでの温度測定編)

前回の教訓より、秋月電子のMAX31855使用 K型熱電対アンプモジュールを購入。
秋月電子の通販は朝に注文すれば翌日朝には届くので便利です。
けど、いくら買っても送料がかかる。
つい余計なものをいろいろ買って送料を浮かせたいという衝動に駆られ、今回もいろいろ買ってしまった。
ひとつはArduino uno 純正品です。
Arduino uno 届いたのみたら、チッちゃ。
いわれて見ればそのサイズなんだけど。
箱がキャラメル箱の少し多きいくらいでちょっとびっくり。
想像ではPCのマザボの小さいくらいのケースだとおもってたんが。

けど基板のデザインがかっこいい。ちょっとハイソな気分。

よくわからないけど、純正品でないとArduinoといってはいけないとか。
ブログタイトルが”Arduinoを用いた”とあるので、いちお写真のすみっこにいれておこう。


さて、本題です。
MAX31855使用 K型熱電対アンプモジュール届きましたが秋月にしては珍しく説明書がなかった。
早速、純正モデル君の出番。
参考ページのAdafruit Industries(エイダフルート)のリンクを見たが、回路図が無くて、よくわからんぞ。

なので、スイッチサイエンス様の

MAX31855 K型熱電対温度センサ 5V版(SPI接続)

を参照する。

しかし、秋月のモジュールは 通信形式:3線式出力専用SPIとのことですが、基板のシルクにDO,CS,CLKとある。
上記スイッチサイエンスのサイトや Maxim社のMAX31855 データシートでは MISO、SCK、SSの記述。


大体想像つきそうですが、ICのデータシートより、モジュールのICの足ピンからのパターンを追って
DO, → MISO
CS, → SS
CLK、→ SCK 
のようです。

で配線しました。
スケッチはスイッチサイエンスのをコピペ。
が、ちょっとはまりました。


・はまり一
 モジュールに近い0ピンでグランド取りたいので
  pinMode(0, OUTPUT);
  digitalWrite(0, LOW); 
 としましたがグランドにならなかった。
 深く考えずにモジュールまでグランド線を引っ張った。
(実はデジタル0,1ピンはシリアル通信用に使用してるとのことで、使えないことが判明。素人だ。)





・はまり二
モジュールに近い4ピンからSPI通信したく

#define SLAVE 4
  pinMode(SLAVE, OUTPUT);
  digitalWrite(SLAVE, HIGH);


とすれば 
 4(SS)、5(MOSI)、6(MISO)、7(SCK)
 になると思ったが、つないだら0度表示でたまにエラー。
又誤配線かと何度か配線しなおし。

答えは Arduino 日本語リファレンス 【SPIの概要】 にあった。

【接続】 SPI通信で使われるピンは次のとおりです。 
Arduino Duemilanove(ATmega168/328を搭載するボード): 10(SS)、11(MOSI)、12(MISO)、13(SCK) 

ということで、11,12,13は不動なのね。まぁそうだよな。
接続しなおしたらOKだった。 よかった。

早速、液晶のライブラリ入れて、修正してテスタの温度計と比較。


大体10度くらいの誤差。センサの位置が同じところにないせいだと思われる。

モジュールの方は室温も計っており、いわゆる冷接点温度補正をしています。
室温も表示できます。

とりあえず、温度測定は可能になった。
次はソリッド・ステート・リレー(SSR)キット 25A(20A)タイプ
でPID温度制御してみます。

2014年9月30日火曜日

Arduinoを用いてオーブントースターでテンパー炉、リフロー炉自作。(0)
ついでにコンベクションオーブン化

「試作のテンパー用で市販のオーブンを買おうとしたが最高300度までのものしかない」とのこと。
たぶん、サーモスタットがあるから外せば350度くらいまで行くのでは?と話をしたら、作ってほしいとのこと。
で、最高350度で10分以上は安定した温度でとのことで、Arduinoを使いPID制御してみよう。
ついでに前々から作りたかったプロファイル対応のリフロー炉にもしてみよう。 
またまた、コンベクションオーブン化も可能か。


まず、オーブントースターを家電屋で1600円で購入。
たぶん250度くらいまで温度が上がると切れるようにサーモスタットがついている。
で、内側の鉄板についているをサーモスタット取り外す。


で、熱電対温度計付テスターで、熱電対をオーブンの中に入れて電源オン。
約5分で350度近くまで上がった。これは意外。
想像では、ヒーター熱量が足りず、350度まで温度を上がらないかと。
その場合はヒーターの追加などが必要かと一つヒーターも分解していたが。
余裕の設計なのね。
まぁ室温が25度くらいあったので冬場とかはこう順調ではないかも


当然ながら、買った日に製品保証は無効に。
そして、想定外の使用なので故障や火災やもろもろの心配があります。
真似てみる人は自己責任でお願いします。

さて、テンパー炉は循環用のファンがついている模様。で、オーブンにもファンをつけようかと。
家電屋でオーブンをいろいろ見たら、コンベクション(対流)オーブンなるものがあるらしい。
展示品を見たらファンが後方に斜め下に向かって風が吹くようについていた。
どっかで見たことのあるファンとモーターだな?としばらく思い出せなかった。
翌日、こたつのヒーターについているファンとモーターと思い出した。
こたつについているファンとモーターは壊れたこたつでもないと簡単には入手できない。
何とかしよう。
モーターはなるべくオーブンから離したいので何かシャフトがいるな。
ホームセンターで物色していたら内径2㎜のアルミチューブが売っていた。
長さ80㎝で160円くらい。
内径2㎜なら、いわゆるマブチモーターのシャフト2㎜に刺さるのではないか。
モーターはArduinoのPWMで調整できるし!
やってみたらうまく圧入できた。
ファンは80円の穴あき鉄板をまげて作成し、M2.3ねじの下穴径が1.9㎜でジャスト。
ファン鉄板はM2.3 のねじで固定してみた。
しかし、アルミのシャフトはやわらかく、いろいろしているとすぐに曲がってしまう。
なのでモーターで回すと結構偏心している。


いけるかなとオーブンの斜め後ろにドリルで穴開けて回す。
と、あけた穴に偏心しているシャフトがぶつかってドカドカうるさい。
こりゃ、なにか耐熱テフロンのような滑るものいるかな。
いろいろ物色していたら、PCの冷却ファンの使っていないのが目に入った。
そういやー、小さいベアリングはいっているだろと分解。

でベアリングを出してみると、ちょうどアルミチューブの外形3㎜と同じ。
アルミチューブをたたいて圧入したらいい具合で入った!


で途中にベアリングを入れて、銅テープでベアリングを固定。
再度つけてみましたが結局偏心でブーブー音がうるさい。

よくよく考えてみたら、プロペラ重すぎだろと。
プロペラ軽くして再度挑戦をしたいがいいアイデアがない。
で、Arduinoの方を先に手を付けることにして、次回に。


次回は白金抵抗素子の温度測定編です。


製作にいたる背景を説明すると、
嫁はんの勤める会社(嫁はんは家具部門ですが。)のバネ部門での話。

バネを巻いた後にテンパー炉で最高350度位で焼き付けを行っている。

テンパーというのは”temper”【不可算名詞】 (鋼鉄などの)鍛え; 硬度,弾性. とのこと。

テンパー炉に入れると巻いたばねのサイズが変わってくるので、量産の前にどれだけサイズが変わるかテストして確認したい。

しかし大きい炉なので、300度近くになるのに1時間かってから、数個のばねを炉に入れるのは電気代ももったない。

なので通常は炉の設定が同一条件の量産があるときに、数個のばねを一緒に入れて、テストして確認している。

しかし、急ぎのものがあったり、数個だけの試作の場合もあり、卓上炉を検討したがちとお高い。

で、話をしていていたら依頼された話。