砂の代わりに8個のLEDを使って,実際の「砂時計」のように砂が一定の間隔で落ちるように見える。
人間の目に残像として残るように30ms毎にLEDの表示を切り替えています。砂が落ちるイルミネーションは,パターンのデータをあらかじめプログラム中に用意しておき人の目で確認できるように30ms毎に切り替えてLEDに出力しています。時間を正確に計るために,PICマイコンに内蔵されている「タイマ回路」と「タイマ割り込み」を使って,正確に表示が切り替わるようにしています。
●タイマ回路
- PICが使用することの出来る「タイマ」です。
- CPUから独立してセラロック発振子のクロックを基準に動作しています。
●タイマ割り込み
- CPUが何を実行しているかに関わらず,タイマの時間が来たら勝手に割込んでタイマ用のプログラムを実行します。
- タイマ用のプログラムが終了したら,割込み時のプログラムの続きを実行します。
- 1分または3分のいずれかの時間設定が選べる。
時間設定の切り替えはRA0のスライドスイッチです。電源をONにした時にスイッチの状態をチェックして,OFFの時は1分,ONの時は3分の時間設定になります。 プログラムの中で時間をカウントしているだけなので,1分や3分以外の時間も簡単に設定できます。
- 1分の設定例
-
LEDの表示切り替え時間 = 30ms
1分=60秒(S) =60000ms
60000 ÷ 30 = 2000
-
-
→タイマ割り込みが2000回で1分となります。
また,3分の場合は6000回になります。
- 計測時間の設定プログラム例
-
if (RA0 == 1)
{
//1分のセット
//表示パターンの切り替え回数
TIME_VALUE = 2000;
//残量表示パターンの切り替えタイミング時間
QUANTITY_VALUE = 400;
}
else
{
//3分のセット
//表示パターンの切り替え回数
TIME_VALUE = 6000;
//表示パターンの切り替え回数
QUANTITY_VALUE = 1200;
}
時間になればLEDの動きが止まり,音で知らせる。
LEDの表示切替を止めるには「タイマ割込み」を止めます。
砂時計がスタートした時と,設定時間になった時はRA2の圧電スピーカから音で知らせます。圧電スピーカは中になる圧電素子を振動(周波数)させることにより音が出ます。
今回は約4KHzの周波数で振動させていますが,この周波数を変えることで好きな音階で鳴らせることができます。
音階の周波数例
| ド |
レ |
ミ |
ファ |
ソ |
ラ |
シ |
ド |
| 262Hz |
294Hz |
330Hz |
349Hz |
392Hz |
440Hz |
493Hz |
523Hz |
本体をひっくり返せば「砂時計」と同様で計測がスタート,計測が終了したら再度ひっくり返せば再スタートする。
本体をひっくり返すとRA1の水銀スイッチが感知するようになっています。ガラス管の中にある水銀が上下に動くことでスイッチのON/OFFが行われ,OFFの時は上から下へ,ONの時は下から上へ砂が移動するようにイルミネーションで表現します。スタート時に今の状態を記録して,記録した状態と今の状態を比べて変化を判断します。
点灯パターンについて
LEDの点灯パターンは,砂が落ちていく様子を表現する「砂の落ちるパターン」と,上の砂が減っていく様子と下の砂が増えていく様子を表現する「残量表示パターン」の2つで構成します。
-
砂の落ちるパターン
砂が落ちる様子を図のような①~⑧までのパターンを用意して,パラパラ漫画のように点灯パターンを30ms毎に切替えてLEDを点灯しています。
ところが,これでLEDを点灯させてみると,ボールが落ちるようにしか見えません。そこで①~⑧まで各点灯パターンの間に消灯を入れて,20ms表示しては10msを消します。 これだけで,かなり砂が尾を引くように落ちている自然な流れに見えます・・・。
-
砂の落ちるパターンのデータ化
砂の落ちるパターンの点灯パターンを「0」と「1」の数値データに変換して「配列」という形でプログラムを記述します。この点灯パターンのデータはPICマイコンのメモリに格納されて,プログラムで1パターンずつ取り出してLEDに出力します。
-
砂の落ちるパターンデータの配列のイメージとデータの取り出し例
配列から取り出したデータをそのままLEDに出力すると表示が反転するので,NOT演算子の"~"(チルダ)を使ってデータを反転します。
-
残量表示パターン
残量表示を図のようなパターンでLEDを点灯しています。砂が少しずつ減ったり増えたりするように見せる為にLEDの点灯の明るさを少しずつ変えています。
明るさを変化させるプログラムを簡単にする為に4つ点灯パターンを用意して,順番にLEDに出力する事で点灯時間を変えて明るさを制御しています。ハッキリと点灯させたいLEDは点灯回数を多くします。うっすらと点灯させたい時はLEDの点灯回数を少なくします。
-
残量表示パターンのデータ化
残量表示パターンの各表示パターンを「0」と「1」の数値データに変換して「配列」という形でプログラムを記述します。この残量表示パターンのデータもPICマイコンのメモリに格納されて,プログラムで1パターンずつ取り出してLEDに出力します。
-
残量表示パターンデータの配列のイメージとデータの取り出し例
-
パターンデータの合成
「砂の落ちるパターン」と「残量表示パターン」のパターンデータを「タイマ割り込み」の発生毎に論理演算子の"OR"を使って合成して出力しています。
-
プログラムの流れ図
今回製作した「電子砂時計」のプログラムの流れ図です。プログラムを作成するときの参考にしてください。