CategoryAVR

オーブントースターを改造したリフロー炉を製作中(1)

こんにちは、NT京都2016に出展応募したぐりです。

さて、今、学校でオーブントースターを改造したリフロー炉を製作しています。リフロー炉の製作はメインでやっているわけではなく、同じく学校のあるチームで開発しているブツの製造のために仕方なくやっている、といった感じです。そのブツにはBGAの部品があり、手はんだできないということで、先生を説得(?)して製作してます。

今回はSwitch Scienceさんが業務でも利用しているというオーブントースターリフロー炉を参考(というか、パクリ?)にして製作しています。本当は時間に余裕があればもう少ししっかり検討してから開発したいんですがね・・・。

主な部品

  • オーブントースター
    • パナソニック オーブントースター ダークメタリック NT-T500-K

ハードウェア

Switch Scienceさんで実際に製作した際の例をもとにオーブントースター、SSR等を入手しました。コントローラはArduino互換機(一番近いのはPro nanoかな?)で3.3V 8MHz動作のATmega328P-AU、ディスプレイは20列4行のそこそこ大きいもの(バックライト付きだけど非点灯な回路)、温度測定は熱電対(K型?)、電源制御は先ほど挙げたSSRを2つ(上下のヒーターにそれぞれ)使用してます。Arduinoを卒業してmbedに移行したと(脳内で)宣言していた自分としては不本意なArduino復帰となりましたorz。

ちなみに、操作用にタクトスイッチを2つ増設しています。

本体が学校なので写真はまた今度。

ソフトウェア

こちらもSwitch Scienceさんがgithubで公開しているものを・・・と思いましたが、ゼロから自力で書けって(自分が)うるさかったので(ライブラリを除いて)ほぼ自作です。「ほぼ」っていうのは熱電対から温度を取得するルーチンだけ流用したからです。

主な仕様(予定)は以下の通り

  • プロファイルは2つから選択
  • PCでプロファイルを作成し、転送してEEPROMに書き込める
  • PCで温度のグラフを出力できる
  • ヒーターはPID制御(したい)
  • PID制御の係数(Kp, Ki, Kd)の自動チューニング(したい)

上の3つはほぼ実装済み、PIDの自動チューニングは少し厳しいため、自力チューニングしているところです。ここで実際のグラフを見せたいところですが、編集する気力がないのと文字数が増えてきたので、また次回。

ソースコードは現時点で800行。まだまだ少ないですね。プログラムメモリは半分程度埋まっています。

数日後には運用しないといけないのでそのころまでには次を書きますね。

 

ちなみに、前記事のブルースクリーン、今のところ再発していません。やったね。

2016年2月14日 01:10 公開
2016年2月14日 14:21 リンクを追加

【AVR】_delay_ms()がうまく動かない?

AVRで工作していると、1秒待って欲しいって思うときにディレイ関数を使いたくなります。そのノリで使っていたら、100msと指定していたのに10秒以上待たされるという現象が起きました。なぜでしょう。

まずはじめに疑ったのは、クロック周波数です。_delay_ms()関数では指定された時間とクロック周波数から計算されたサイクル数、待つという実装がされています。つまり、クロック周波数が違えば指定した時間通りに動いてくれません。

というわけでクロック周波数を確認しました。筆者が今回使っていたAVRはATmega328Pです。内蔵RC発信器からの8MHzで動作させています。Hzで書くと8,000,000Hzになります。周波数の指定は、F_CPUで定義することでできます。この場合は、

[code lang=”cpp” highlight=”1″]
#define F_CPU 8000000UL

int main(void){
_delay_ms(100);

return 0;
}

[/code]

このように8,000,000Hzである、と宣言します。最後のULはunsigned Long型の定数であると指定するためのものです。8,000,000という値はintの範囲(-32768~32767)を超えているので、これがないと溢れてしまいます。
今回は正しく定義されていたので別の問題である、ということで考えうる他の原因を考えました。

次に疑ったのは、_delay_ms()関数が引数として取りうる値が制限されていることです。調べてみると過去のバージョンのことで当てはまりませんので割愛します。

最終的に考えたことは、_delay_ms()関数は使ってはいけないのではないかということです。つまり、_delay_ms()関数を使っても正確に測ることは不可能な場合があるということです。
それは割り込みを使った時です。

考えてみればわかるのですが、時間から求めた回数だけ「何もしない」を繰り返しているわけです。その間に割り込みが発生してしまえばおかしくなるのはすぐに分かります。

というわけで、原因が割り込みであるというところまでは確認をしていませんが、LEDのダイナミック・ドライブでタイマー割り込みを積極的に利用しているのでこれが原因であるということで間違いないと思います。どのよう解決するかはまたどこかで書こうと思います。

ATmega328PからSC1602互換LCDを使ってみる。1

久しぶりです。ぐりです。
今回は、マルツでSC1602互換のTC1602E-06TというLCDを買ってきたので、AVRから使えるようにしてみたいと思います。

LCDの仕様

このLCDは、ずっと言ってきたとおり、秋月等で売られているSC1602と互換性があるので、SC1602のライブラリをそのまま流用することができます。

マルツで買った液晶

マルツで買った液晶

電源はDC5Vのみ、5×7ドット構成の文字が16桁、2行表示できます。
また、黄緑色のバックライトを搭載しています。

バックライトだけ点灯。

バックライトだけ点灯。

制御方法

I2CとかSPIとか少ない線でつなぐことができるシリアルインターフェイスではなく、8bit幅の普通のパラレルインターフェースみたいです。しかし、コマンドを送信することで、4bitモードに切り替えることができ、2回に分けて8bit分送信するという手間がかかる代わりに、I/Oが節約できるというメリットが有ります。

今回は、4bitモードでArduinoでも使われているATmega328Pから使ってみたいと思います。

配線してみた。

配線してみた。

写真右上のブレッドボードに刺さっている3本の抵抗は、コントラスト用に手持ちの1kΩを直列に3kΩにしてます。これでも悪く無い。

AVR-LCD間の配線は、PORTC(ArduinoのAnalogIN)と、PORTBの1番の7本を使いました(と言うか、サンプル通り)。

RS(レジスタセレクト)、R/W(読み込み・書き込み)、E(イネーブル信号)、DB4~7(データ4bit)文を接続し、使わないDB0~3はオープンにしました。

バックライトLED用の電源は、ICのVDD,VSSからとるように、はんだジャンパをしました。

JP2とJP3をショートさせてあります。

JP2とJP3をショートさせてあります。

次回、表示させてみたいと思います。(上の写真は表示されてますが・・・)

おまけ

12Vを直にかけたため死んでしまったAVR。"died"と書いておいた。

12Vを直にかけたため死んでしまったAVR。”died”と書いておいた。