2014年10月3日金曜日

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

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

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

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

2014年9月5日金曜日

Blogger に Syntax Highlighterを導入する

会社のブログサイトよりプログラムのトピックスは、こちらのブログに移行しました。

プログラム用にコードが多いので、Syntax Highlighter の様なものが用意されたブログはないか探していたら、

BloggerにソースコードをハイライトするSyntaxHighlighterを導入する

という記事を見つけたので早速試してみます。
が、Syntax Highlighter Scripts Generator が404のリンク切れ。
上記ジェネレーターは駄目なようなので、まずはブログ記事内のジェネレート済みのコードを流用しますた。

Bloggerの管理画面→テンプレート→HTMLの編集 へ
</head> の上に先ほどのジェネレート済みのコードを貼り付けます。

なお、先のブログにあるように縦スクロールバーを消す等のカスタマイズはshCore.cssを変更しまが、BloggerはCSSファイル等のアップロードができないので、先ほどのジェネレート済みのコードの一行目
<link href='http://alexgorbatchev.com/pub/sh/current/styles/shCore.css' rel='stylesheet' type='text/css'/>
は貼り付けず、http://alexgorbatchev.com/pub/sh/current/styles/shCore.cssのCSSをコピーして、
Blogger設定画面>テンプレート>カスタマイズ>上級者向け>CSSを追加 へ貼り付けしてから変更します。

Javaのコードテスト
import org.apache.cordova.api.CordovaPlugin;
import org.apache.cordova.api.CallbackContext;
import org.json.JSONArray;
import org.json.JSONException;
import android.util.Log;

public class HelloPlugin extends CordovaPlugin {
    public static final String NATIVE_ACTION_STRING="nativeAction";
    public static final String SUCCESS_PARAMETER="success";

    @Override
    public boolean execute(String action, JSONArray data,
 CallbackContext callbackContext)throws JSONException {
           Log.d("HelloPlugin", "Hello, this is a native function called from PhoneGap/Cordova!");
           //only perform the action if it is the one that should be invoked
           if (NATIVE_ACTION_STRING.equals(action)) {
                 String resultType = null;
                 try {
                       resultType = data.getString(0);
                 }
                 catch (Exception ex) {
                       Log.d("HelloPlugin", ex.toString());
                 }
                 if (resultType.equals(SUCCESS_PARAMETER)) {
                  callbackContext.success("Yay, Success!!!");
                  return true;
                 }
                 else {
                  callbackContext.success("Oops, Error :(");
                  return true;
                 }
           }
           return false;
    }
}
できたぜ。

Bloggerに投稿する際はHTML編集にしないと駄目です。また、プレビューでは表示されません。
記事内でpreタグを使い、class="brush: alias;" としてコードを記述します。
なお。alias には様々な言語が入ります。一覧はこちら
結局、java, C++、CSS, javascript, Perl, PHP, プレーンテキスト、HTML(XML)を読み込むようにしました。

<link href='http://alexgorbatchev.com/pub/sh/current/styles/shThemeDefault.css' rel='stylesheet' type='text/css'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shCore.js' type='text/javascript'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushJava.js' type='text/javascript'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushCpp.js' type='text/javascript'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushCss.js' type='text/javascript'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushJScript.js' type='text/javascript'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushPerl.js' type='text/javascript'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushPhp.js' type='text/javascript'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushPlain.js' type='text/javascript'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushXml.js' type='text/javascript'/>

<script language='javascript' type='text/javascript'>
SyntaxHighlighter.config.bloggerMode = true;
SyntaxHighlighter.all();
</script>

をBloggerの管理画面→テンプレート→HTMLの編集 より </head> の上にコードを貼り付けました。
ページのサイズを変更したら上記の記述が吹っ飛びました。
再度Bloggerの管理画面→テンプレート→HTMLの編集から貼り付けました。
また、言語用スクリプトはサイズが小さい(5kバイト以下)ので気にしないでどんどんはってもよさそうです。

つかったものの一覧
使用言語Brush aliasesfile name
C++cpp, cshBrushCpp.js
CSS css shBrushCss.js
JavaScriptjs, jscript, javascriptshBrushJScript.js
Javajava,shBrushJava.js
Perlperl, pl,shBrushPerl.js
PHPphpshBrushPhp.js
Plain Text, plain, text shBrushPlain.js
XMLxml, xhtml, xslt, html, xhtmlshBrushXml.js

jQuery 1.9対応などはログろいどにありました。
ファイルアップできないので直接記述かな?

なお、本家からスクリプトのダウンロードは
http://alexgorbatchev.com/SyntaxHighlighter/download/
でした。

2013年12月6日金曜日

Cordova(Phonegap)2.9 プラグイン

Cordova(Phonegap)で対応していないスマフォの機能を使うにはプラグインが必要です。
[github phonegap-plugins]でいろいろなのが開発されていますが、インストールで失敗する。cordova-plugman をつかってインストールするんですが、[お笑いプログラマの技術メモ]の状況とおんなじ感じです。
プラグインの仕組みもよくわからないし、ネット上の資料も古い。
こりゃちゃんと理解して自分で設定した方がよさそうだと調べました。
まずネイティブプラグインでPhoneGapを拡張する(Android)をみてプラグインを作成してみた。

がCordova(Phonegap)2.9では動かない。

大体プログラムしょっぱなの
public class HelloPlugin extends Plugin;
のPluginでエラー

public class HelloPlugin extends CordovaPlugin;
とCordovaPlugin となっていないとだめ。

[Developing a Plugin on Android]をみてソースを書き直す

import org.apache.cordova.api.CordovaPlugin;
import org.apache.cordova.api.CallbackContext;
import org.json.JSONArray;
import org.json.JSONException;
import android.util.Log;

public class HelloPlugin extends CordovaPlugin {
    public static final String NATIVE_ACTION_STRING="nativeAction";
    public static final String SUCCESS_PARAMETER="success";
 
    @Override
    public boolean execute(String action, JSONArray data,
 CallbackContext callbackContext)throws JSONException {
           Log.d("HelloPlugin", "Hello, this is a native function called from PhoneGap/Cordova!");
           //only perform the action if it is the one that should be invoked
           if (NATIVE_ACTION_STRING.equals(action)) {
                 String resultType = null;
                 try {
                       resultType = data.getString(0);
                 }
                 catch (Exception ex) {
                       Log.d("HelloPlugin", ex.toString());
                 }
                 if (resultType.equals(SUCCESS_PARAMETER)) {
                  callbackContext.success("Yay, Success!!!");
                  return true;
                 }
                 else {
                  callbackContext.success("Oops, Error :(");
                  return true;
                 }
           }
           return false;
    }
}

で動きました。
あと、2.9からconfig.xmlにpluginタグがデフォでなかった。
ここら辺は [3.0リリースに向け激動のPhoneGap Android のプラグインが動かない!?]が参考になりました。3.0になってまた変わりそうです。
しかし、プラグイン、何とか仕組みが分かったので、手動で設定、コード修正で何とかなりそうです。