ATtiny85でサーモスイッチを作ってみた。

冷却用のUSB扇風機を温度制御したくてサーモスイッチを探してみたが、デカくて12V仕様のものばかりだったので自作してみた。

簡単な制御なので手持ちのATtiny85を使うことにしたが、毎度のことながらピン数が少ないので悩ましいことが多い。まず、アップデートをどうするかが問題。MCUに外部回路を接続するとISPが使えなくなる。ICソケットは耐久性がない。digisparkのようにV-USB方式にするとピンが2本も占有されてしまう。あっちをたてればこっちがたたずみたいな状況に陥るが、そこはなんとか妥協点を見つけるしかない。

今回は、V-USB方式で開発してみることにしたが、回路的には、ツェナーダイオード(3.6V)2本、1.5K抵抗1本と68Ω抵抗2本、ブートローダー(micronucleus)書き込み済みのATtiny85が必要なだけ。

【回路図】

※ J3はアップデート時のみ両方ショート。通常時はD+側のみオープンにする。
※ 複数温度センサー対応なので外部温度センサーに合わせて実装部品を変えること。
※ LMT01のExamplesを見てR5を100Kにしたところ電圧的に心もとない。そのままで行くならMCUの入力プルアップ抵抗を併用すべし。って、だったら無くてもいいんじゃね?...た、確かに。(笑)

【完成した基板】

【2018-03-15 USB機器との間に入れるタイプも作ってみた。こっちのほうが便利そう】

このレベルのモジュールを中国で作って売るなら100円以下になりそうな気がする。って、そんなことはどうでもいいんだけど、タクトスイッチと共有できるようにUSB端子をジャンパーで切り離せるようにしたことでオオハマリ...切り離すとなぜかMCUが動作しなくなるのだ。
原因は、USBのD-側をMCUに接続しておかないとV-USB内で永久ループしてしまうことであったが、そんな仕様になってるなんて知るはずもなく思いっきり悩んでしまった。orz

教訓!! 切り離し出来るのはD+側だけ。D-側は常に接続しておくべし。

【仕様】
・開発環境は、Arduino “Digispark (Default – 16.5mhz)”
・V-USB(micronucleus)によるアップデート機能
・温度センサーは、MCU内蔵、LMT01、LM35、LM60、LM61の5種類をサポート。
・センサー自動検出(MCU内蔵, LMT01, LM??)
・センサー手動選択(LM35/60/61)
・温度閾値設定(-30 – +80)
・温度補正値設定(-30 – +30)
・接点出力モード(NO/NC) Max AC-DC 40V, 2A
・接点制御間隔(10秒固定)
・設定初期化
・温度表示(1秒毎計測、Simple Moving Averageにより直近の10データを平均化)
・各種設定値表示
・LED表示方式(点滅回数方式、モールス信号方式)

なお、MCU内蔵センサーは個体差が激しく±20℃もの誤差のものがあったり自己発熱によるドリフトが大きかったり環境温度追従性も良くないのであまりお勧めではないが補正すれば使えなくもないし外部センサーなしの最小部品で構成できるので精度が必要とされないのであれば選択余地はあるかもしれない。そんなセンサーにも対応するべく温度補正範囲が(-30 – +30)になってしまったというかなんか補正とかいうレベルじゃねー。(笑)

データ表示はLED表示器?で行う仕様なのでモールス信号が読めない人は無理せず点滅回数方式をどうぞ。

【参考情報】
ESP-WROOM-32でモールス信号発生器を作ってみた。
micronucleus (firmware/releases/t85_default.hex)

【Arduinoコンパイル結果】

最大6012バイトのフラッシュメモリのうち、スケッチが4952バイト(82%)を使っています。
グローバル変数は100バイトのRAMを使用しています。

【ファームウェア】

digispark-coreと共存しつつも、H/W直接操作で実現している機能。

・※12bit Counter (Timer0 + USI-Counter) … analogWrite()と競合
・1.1 or 2.56V ADC reference Voltage … analogRead()と競合
・1ms core interrupt の利用

※あえて12bit Counterを使う必要もなかったが、なんとなく...