![]()
久しぶりのPIC工作としてリハビリ(主にアセンブラの)を兼ねて、キッチンタイマを作ってみた。
キッチンタイマやラーメンタイマはPICの入門工作の題材としてよくあるが、今回はスリープによる電源スイッチ省略、スイッチ長押し判定、PWMによるアラーム音、7セグLEDのアラームアニメ、割り込みによるスリープからの復帰など、少し凝ってみた。
また、実用品の電子工作ではケースをどうするかいつも悩むが、今回はキッチンに置いても違和感のない小型の100均ガラス瓶に収めた。
7セグLED表示ですが、毎日10分使用するとして、単三アルカリ電池で2年程度は使える、はず。
(2014.11.12更新)約2年間使い続けていて電池はまだ大丈夫ですが、スタートボタンを押したのにカウントダウンが始まって無いことがある、との苦情が家族から出始めました。どうやらタクトスイッチのチャタリングが大きくなった感じです。そこでプログラムを更新しました(詳細は下記)。
動画(2分52秒)
![]()
キッチンタイマ
キッチンタイマは100均で売られていて何度か購入したが、途中で壊れて電池寿命まで使ったことがなかった。
安いからかと思って、少し高い多機能のもの(写真左)を入手したが、スイッチの調子が悪くなり使えなくなりつつある。また、せっかくの多機能も使いこなせず単純なタイマとして使っていた。
回路図
簡単な操作性と見やすさを重視し、入力はスイッチ3つのみとして電源スイッチ無し。出力は見やすい7セグLED4桁とアラーム用圧電ブザー。
電気系の部品は手持ちのものを使用することにし、回路図を書いた(拡大図)。PICは16F685(20ピン)、4MHzのX'Talで動作させる。電源は単三電池2本の3Vとしたので、消費電力を押さえるためにLEDの駆動電流を最小限とすると共にドライブ用のトランジスタを省略した。PICのピンで直接駆動できる電流しか使わない。1桁あたり最大20mA。
![]()
ブレッドボード
回路をブレッドボードに仮り組みして、プログラム作りとデバッグに着手。すぐに結果が見たくなるので、ひとつのモジュールを書いてはPICに書き込んでデバッグと動作確認を行う。
作りながら動かしては使いやすい仕様を詰めていく。かっこよく言うとアジャイル開発手法、本当か?
プログラム
メインプログラムの動作を状態遷移図(拡大図)で整理。
今回、入力スイッチは3つだが、長押し状態もあって動作が少し複雑。大まかには、時間設定状態、動作状態、スリープ状態があり、イベントに応じて状態間を遷移して動作する。
ソースプログラムです。バグがあるかも知れません。無保証です。著作権は留保しますが、改変などご自由にどうぞ。
※2013.06.30 バグ修正しました。1秒で9usで進む(カウントダウンが早くなる)バグ(99分で0.05秒なのでキッチンタイマとしては影響ありません)
※2014.11.12 下記の通りプログラムを改善しました。ソースプログラム V3です。
(1) タクトスイッチのチャタリング回避強化のためにサンプリング時間を4msから40msに変更
(2) カウントダウンがスタートしたことがはっきり分かるように、開始時に「ピッ」音を追加
(3) 無操作でのスリープ迄の時間を5秒から10秒に変更
以下、主な機能の実現方法。
- 1秒の作り方
- timer0オーバーフロー割り込み回数をカウントすることで1秒を作る
- 4MHzクロック→マシンサイクル1MHz = 1us
- timer0のプリスケーラを1:16
256Cycleでオーバーフロー * 16倍プリスケーラ * 1us = 4.096ms
約4ms毎の割り込み数をカウントすると、約244回で約1秒(正確には244.140625回)- 244回だと0.140625回が誤差になるので、64秒毎に9回余分にカウントして補正する
244×64 = 15616回 = 63.963136秒
244×63+253 = 15625回 = 64.000000秒
- 蛇足
補正しないと64秒毎に0.036864秒の誤差が生じ、100分だと3.456秒遅れるが、キッチンタイマなら影響は殆どない。しかし時計として使うには、24時間で約50秒遅れるので補正は必須。
7セグLEDのダイナミック表示 約4ms毎のtimer0割り込みで表示桁を順次シフトするダイナミック表示。
4ms×4桁=16ms = 62.5Hz なので目視でLEDがチラチラしない
スイッチ・オンオフ判定 チャタリングの影響を排除するために、4ms毎の割り込み処理内でSWの状態をチェックしてフラグに設定するサンプリング方式のチャタリング抑止。 タクトスイッチのチャタリング時間は1ms程度のようなので、4ms毎のサンプリングで排除できると思われる。
その後、使い続けたらチャタリングが大きくなったようなので40msに変更した(2014.11.12)。
SW長押し判定 約4ms毎の割り込み内で、スイッチの状態を監視し、約0.5秒押し続けられたら 長押しと判定する。
アラーム音 PWMモジュールを使い、2KHz デューティ25%のパルスを作る。 村田製作所のサイト(圧電発音部品のFAQ)で、規定の半分の周波数でデューティ25%にすると音圧が高くなる、とあったので。
![]()
100均のガラス瓶(キャニスタ)
ケースはキッチンに置いて違和感のないガラス瓶とした。同じビンを並べて調味料や香辛料などをいれておくと、多少見栄えがするか?
![]()
基板加工中
デバッグがほぼ終わり、仕様も決まったので、ユニバーサル基板に実装するために、まずは基板外形の決定。
ガラス瓶への格納・固定方法を考えつつ、ユニバーサル基板を本体部とスイッチ部それぞれカットし、T字型にエポキシボンドで接着する。直角に接着するために牛乳の紙パックで簡単な治具をつくった。
![]()
基板完成
できあがり、組み上げた基板の様子。
![]()
部品搭載
写真は部品を基板に搭載し、PICKitを繋いで動作確認している様子。キッチンで使うので湿気によるサビ・接触不良を気にして、PICはソケットを使わずに直づけした(それほど気にしなくてもよいかも)。
5ピンのソケットを使ってICSPでプログラミング。ここで最終の動作検証と、スリープ時の消費電流を測定。手持ちのテスタで2uA程度。電池ボックスは裏側に取り付ける。
![]()
基板裏側
配線完了後に基板裏に電池ボックスをネジ止めした。ネジの頭が出っ張らないように、電池ボックス側を皿形にざぐり、皿ネジ(少し丸みをおびているが)で固定。
![]()
ビンの蓋加工
基板を固定するためにガラス瓶の蓋の加工を行う。スイッチのノブがでる穴3つと、基板取り付け用のビス穴2つ、計5個を開ける。蓋は鉄製だが薄くて固定が難しいため、大きな穴はおむすび型になってしまう。少し小さめに開けたあとで、丸ヤスリでやすって大きく丸くした。
ここでちょっとTIPS。100均のガラス瓶は安く作るために2つに割れる型に入れて作っているようで、瓶の対角に縦の筋が入っている。蓋を閉めたときに7セグLEDの表示面がこの筋にかからないように、閉めたときの位置を気にして取り付け穴を開けた。
![]()
ビンの蓋に取り付け
7セグLEDのコントラストを高めるためにスモークの塩ビ板を取り付ける。これで明るいときでも見やすく表示される。
写真は、基板をガラス瓶の蓋にビスで取り付けた様子。
その後、ビンの蓋を閉めていると圧電ブザーの音が小さくて、キッチンから離れると音が聞こえないことがあった。そこで蓋にφ3mm位の穴を開け、圧電ブザーを両面テープで取り付けるように見直した。
![]()
ほぼ完成
ビンの蓋をねじって閉めてほぼ完成。
![]()
ラベルを貼って完成
カシオネームランドでスイッチ操作説明のラベルを作って、貼り付けて完成。
![]()
設置
キッチンの棚に置いてみたところ。となりの瓶もケースの候補として買ってきたが、口の直径が若干小さく、LEDが入らなかったので採用見送り。
【使い方】
- (1) 3つのスイッチのいずれかを押して電源をオンにする
- 4桁のLEDには、前回設定した時間(前回スタートスイッチを押したときの時間か、時間設定時にオートパワーオフした場合にはその時間)が表示される
- (2) 分、秒スイッチを押して希望の時間を設定
- 必要に応じてSTART/STOPスイッチ長押しで設定時間をリセットし希望の時間を設定し直す 操作しないで5秒経つと、自動的にパワーオフする
- (3) START/STOPスイッチを押して、カウントダウン開始
- 時間がカウントダウンされ、表示される
- (4) カウントダウンを途中で止めるにはSTART/STOPスイッチを押す。
- 再開は再度START/STOPスイッチを押す(止めている間は時間の再設定が可能)
- (5) タイムアップするとアラームが鳴るので、START/STOPスイッチで停止して電源オフ
- アラームを止めないと約10秒で自動停止して電源オフ
完成動画(ニコ動)
時刻設定〜アラームまで(52秒)。
(注)音がでます。
【仕様】
- 計測可能時間
- 00分01秒から99分59秒までの1秒単位
- 7セグLEDの時間表示は分2桁、秒2桁(表示は、MM.SS)の4桁で、分の桁はゼロサプレス表示(10の位がゼロの場合、そのゼロは表示しない)
- 操作スイッチ
- [分設定]、[秒設定]、[START/STOP]の3つ(電源スイッチは無し)
- 時間設定
- 分、秒ともにSWを1回押すことで、それぞれ1分、1秒毎に増加
- 長押し(約0.5秒)すると自動的に増加
- START/STOPスイッチの長押しでリセット(0分00秒)
- スタート/ストップ
- START/STOPスイッチを押す.ただし設定時間が0分00秒の場合にはスタートできない
- 計測中に押すと残り時間を表示してカウントダウン停止、このとき1秒未満は切り捨てる
- 再度、スイッチを押すとカウントダウン開始
- カウントダウン
- 設定時間から1秒毎にカウントダウンし、残り時間をLEDに表示
- タイムアップ
- アラーム(約10秒)と7セグLEDにアニメーション表示
- アラーム中にSTART/STOPスイッチを押すと、アラームを停止しパワーオフ
- 自動パワーオフ
- 時間設定時に無操作5秒でオートパワーオフ、またタイムアップのアラーム(10秒)後、即時パワーオフ
- パワーオフからの復帰
- 操作スイッチのいずれかを押すことで時間設定のモードに戻る
- 消費電力
- 時刻設定・計測時:30mW〜60mW程度(LEDに表示している数字に応じて変化)
- パワーオフ時 :5uW程度(3V×1〜2uA)
- 電池寿命(試算)
- 使用頻度によるが、2年程度は使えるのではないかと推測。以下、試算。
- 稼働時間 10分/日と仮定(パスタをゆでる時間程度)
365日で60.8h- 稼働時の平均消費電流15mA * 60.8h = 912mAh/年
- スリープ時間 (24時間 - 10分) * 365日 = 8,699h
約2uA * 8,699h = 約17mAh/年- 電池容量
単三アルカリ電池 2000mAh程度と仮定- 電池の自己放電
年に3〜5%程度らしい。リニアに放電すると仮定すると、
2,000mAh * 5% = 100mAh/年
- 合計:稼働912mAh/年 + スリープ17mAh/年 + 自己放電100mAh/年= 1,029mAh/年
2,000mAh/1.029mAh/年 = 1.94年 = 約2年弱以上