ラベル 自作 の投稿を表示しています。 すべての投稿を表示
ラベル 自作 の投稿を表示しています。 すべての投稿を表示

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月9日木曜日

秋月電子 ATMEGA168/328用マイコンボード にブートローダー書き込み

前回 【書籍】作って遊べるArduino互換機を作成したものの、FT232RLの表面実装はんだ付けがいまいちだった。
安定したArduino互換機を作りたい。
秋月電子 ATMEGA168/328用マイコンボード(I/Oボード)
の、基板を前回かってあるので、これを使かおうかと。

この基板のUSBシリアル変換の部分は以下のモジュールを利用。
FT232RL USBシリアル変換モジュール
完成品なので表面実装の半田付けは不要!
モジュールは他のマイコン用に2年ほど前に2つかってあるのでこれを使います。

やり方は秋月電子 Arduino互換ボードの使い方を参照した。

ATMEGA168/328用マイコンボードの回路図を見るといらなそうな部品が多い。
まず電源周りだが、DC5VのACアダプタを使っている。
ので、ブリッジダイオードは基板両面で抵抗の切った足のジャンパーでクロス配線。
レギュレーターもいらないのでVin-Voutをジャンパーで飛ばす。
電源セレクタースイッチをつけないので、電源入力とEXTをジャンパーで飛ばす。
(気が付かず、ちょっとはまった)
最初このジャンパーに気が付かず、ICに電源が来てなくてちょっとはまった。
いちおう電解コンデンサを。手持ちで一番背の低いのが330μFの16Vをつけた。

部品を減らしたらスカスカな基板
リセットスイッチは、ほとんど使えわないのでつけなかった。
基板のX4端子、シリアルのジャンパーもしておく。
ワイヤが刺さるように変換モジュールをユニバーサル基板につけ、丸ピンソケットをわきに配置した。ついでにCB0,CB1にLEDをつけて通信状態をモニタできるようにした。

で、ブートローダーの書き込みは基板にあるICSP端子を利用して書き込みした。
  • CTS -> ICSP端子(1:MISO)
  • DSR -> ICSP端子(3:SCK)
  • DCD -> ICSP端子(4:MOSI)
  • RI ->   ICSP端子(5:RESET)
  • GND-> ICSP端子(6:GND)

というわけで、1000円以下の格安で作成できました。

2014年10月7日火曜日

【書籍】作って遊べるArduino互換機を買ってみたものの。

【書籍】作って遊べるArduino互換機を買った。
arduino互換機を作成する為、AVRマイコンにブートローダーを書き込みたかったからだ。
将来的には3.3Vで動くarduino互換機を作成したいし。

書籍には付属基板があり、秋月の部品セット1000円、AVRマイコンを前回購入してある。
『作って遊べるArduino互換機』パーツセット

基板の組み立てはUSB-シリアルコンバータのFT232RLが表面実装ですごく細かい。
amazonのレビューでは「あまりに細かく素人には無理」とのこと。
まぁ、出来るだろうとおもったがはまった。
まず、チップを両面テープで固定してからクリーム半田を盛って加熱。
所々ブリッジしていたので、はんだ吸い取り線で半田を吸い取りなじませた。
半田が取れすぎてしまったようなところは、再度ハンダをもった。
その際、又ブリッジが起きてしまうが、ホームセンターで売ってる半田フラックスを、つま楊枝で足に塗ってから半田コテをあてて直した。
下手にはんだ吸い取り使うより、最初から細い半田コテではんだ付けして、ブリッジしたところだけ直すいつもの方法にしておけばよかった。

半田吸い取り線を強く当てたせいか、基板のパッドが曲がってしまった。
きれいに出来たが、一箇所、基板のパッドが少し曲がってしまった。
半田こての先で加熱しながら矯正。

とりあえず、テスターでは隣の足とのショートしておらず、オープンもしていないのでOK.
その他の部品を付いた。
USBに基板をつなげるとFT232RLのドライバーを認識したので、USB側は、はんだ不良は起きていない様子です。

さっそく書籍にあるようにヒューズの読み込みをはじめましたがエラー。
エラー内容よりUSB変換チップから先のAVRの書き込みが上手くいっていないみたい。

でFT232RLのピン足に半田を当てて再ハンダしてみるがうまくいかない。
(結局、このAVRとの通信エラーの原因は、ICソケット2階建てにしていたため。
(2階建てにして、ブートローダーを書き込んでから、ほかですぐ使えると目論んだ。))

で、いろいろいじっていると、PCでFT232RLを認識しなくなってしまった。
テスターで調べるとUSBの電源マイナスとデータ線がショートしている。
調べるとFT232RLチップの下の部分でショートしている模様。
半田でいじってもどうにも直せず、結局チップの片側の足を全はずしorz...。


ピンセットを差し込みながら加熱してチップのかた側を浮かせた。
パターンに接続されてない基板のパッドはみな取れてしまった。
で、なんとか直して、ヒューズもブートローダーの書き込みはできたけど、不安要素ありすぎ。

なので
秋月電子 ATMEGA168/328用マイコンボード(I/Oボード)
の、基板だけを前回かってあるので、これを使かおうかと。
この基板のUSBシリアル変換の部分は以下のモジュールを利用。
FT232RL USBシリアル変換モジュール
なので表面実装の半田付けは不要!
モジュールは他のマイコン用に2年ほど前に2つかってあるのでこれを使います。

やり方は以下を参照して。
秋月電子 Arduino互換ボードの使い方

備考。
ブートローダーの書き込みはオープンソースで開発されていて、 Atmel AVRシリーズのプログラマ(ライタ)や開発機器をコントロールするプログラム、avrdudeをつかいます。

しかし、avrdude ではFT245R/FT232R をサポートされていない模様ですが、
以下のサイトからavrdude のFT245R/FT232R対応版 を書き込みソフトを入手します。
すzのAVR研究 FT245R/FT232R で avrdude (2)、avrdude-serjtag04e.zip 

又以下のツールを使うとGUIで書き込みできる
avrdude-GUI (yuki-lab.jp Version)
後書き込みに必要なライブラリ
libusb-win32
を入手。
使用法は書籍にあったとおりでやりました。
以下のサイトを始めいろいろ説明があります。
avrdude-serjtag が serjtag-0.3.zipでちょっと情報が古いですが。

ヒューズ読み込みの際のエラー内容は以下。

avrdude.exe: BitBang OK 
avrdude.exe: pin assign miso 3 sck 5 mosi 6 reset 7
avrdude.exe: led pin assign rdy 10 pgm -1 
ft245r_drain called but queue is not empty 1 
avrdude.exe: drain OK 

ft245r:  bitclk 76800 -> ft baud 38400
ft245r: set CBUS 40 -> 0
ft245r: set CBUS 40 -> 0
ft245r: set CBUS 40 -> 0
ft245r: set CBUS 40 -> 0
ft245r: set CBUS 40 -> 0
ft245r: set CBUS 40 -> 0
avrdude.exe: ft245r_program_enable: failed
avrdude.exe: initialization failed, rc=-1
             Double check connections and try again, or use -F to override
             this check.
ft245r: set CBUS 40 -> 0
avrdude.exe done.  Thank you.


ところで、3.3V仕様のarduino互換機を作ろうと思ったが、
使用しようと思った手持ちにあるbluetoothモジュールが5V 電源だった。
I2C接続小型キャラクタLCDモジュール 8x2行 AQM0802Aは3.3Vだが、

MAX31855使用 K型熱電対アンプモジュールは3.3vレギュレータ付属していた。
で、5V電源のマイコンで作れそうです。

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年10月2日木曜日

Arduinoを用いたテンパー炉、リフロー炉の温度制御装置 (1)(白金抵抗素子温度測定編)

さて、オーブントースター内の温度はK型熱電対対応のテスタで測定しました。
Arduinoで温度測定するには、同じように熱電対センサを使う場合はSPI通信対応の
秋月電子MAX31855使用 K型熱電対アンプモジュールがあります。¥1620円 
K型熱電対プローブが400円。
合わせて2000円オーバー。

高いかな?と欲を出したのが運のつき。

秋月電子を調べてると白金抵抗素子が350円であった。

これで温度を測る方法を調べると、温度測定として以下のサイトを見つけて参考にしました。

秋月で売ってる白金抵抗素子で こて先温度計を作る

けっこう小さい白金抵抗素子。
ピンソケットにはんだ付けしてからコードで延長。
ピンソケットの周りにアルミテープ巻いて耐熱処理。
見てみると
多回転半固定ボリューム たて型 3296W は80円で3つ(200Ωはなかったので500Ωで兼用)
68Ωの抵抗がなかったので100本で100円
ほかは部品あるんで 
センサー350円+オペアンプ80円+トリマー抵抗(80X3)240円
合計670円!でできるやないか。
で、アナログ回路のオペアンプはもうほとんど触ってなくてようわからんが、
安さに負けてやることに決定。(ではまってしまった。)

いちお紹介サイトでは、抵抗は誤差1%以内ということでしたが、テスターで測って正確なやつを選別することにして、普通の5%の抵抗で作成しました。

作成した白金抵抗素子での温度表示
温度表示の液晶は
I2C接続小型キャラクタLCDモジュール 8x2行 AQM0802A
を使用。回路は以下のサイト。
AQM0802AをArduinoで使ってみる
を参考にしました。

温度電圧変換のオペアンプで3.3Vの定電圧回路を入れている。
なので、Arduinoの5VのI/OからLCDの3.3VI/Oにプルアップ(ダウン?)して直接つないだ。
このとき、LCD用の1.0μFのセラコン買い忘れて、近くの電気パーツ点にいったら定休日。
仕方なく、実家のガラクタ入れから1.5μFのセラコンらしきものをあさった。
つけてみたら問題なく動いた。

しかし、Arduinoはいろいろなライブラリが充実して公開されてる。
コピペするだけでパソコンと同じようにprintf()とかで液晶表示できて、おおー。
液晶表示するまで悩み続けたあの日々はなんだったのかと。
世間の5年遅れくらいで、びっくりしました。

で、こて先温度計を作る にあるようにトリマー抵抗を調整しました。
トリマーの動きに比例して温度が変わるかと思ったが、ずっとマイナス30度くらい。
誤配線か?と回路を見直したが大丈夫みたい。
根気よくトリマーをいろいろ試していたら、突然表示温度が上がってきた。
どうも、2つの抵抗の微妙なバランスが釣り合うところで温度校正するようだ。
そして、結構調整がシビアだ。
何とか基準抵抗をさした調整を終えて白金抵抗素子にかえたらちょっと室温より高い。

うーん。
校正がシビアで現場で使用できないんじゃないかと。

今度は熱電対と一緒にオーブンにセンサを入れた。
熱電対で300度位で自作センサは270度くらいで30度くらい低い。

ちょっと使えんな。これ以上改善の方法も思いつかない。

おとなしくK型熱電対アンプモジュールを買って実装することにしました。

しかし、ユニーバーサル基板で作成しましたが、こんな簡単なものでも3時間くらいかかった。
こりゃ、大変だ。基板屋さんありがとう!と自画自賛だが、
やってるうちにエッチングでない銅箔の配線方法考え付いた。
ので、今度試してみます。

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時間かってから、数個のばねを炉に入れるのは電気代ももったない。

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

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

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