MT00_HM01.GIF - 463BYTES  MT00_GB01.GIF - 603BYTES

アナログ・ディジタルハイブリッド表示型
LEDクロックの製作

LEDクロックの製作LEDクロックの製作

LEDで時刻表示する時計「LEDクロック」を製作しました。(製作期間:2009年6月1日〜7月20日)

1.はじめに

PICの開発環境整備の仕上げに電子工作の定番でもあるLEDで時間表示するLEDクロックを作りました。ただし、普通の7セグメントLED表示のLEDクロックでは面白くないので、少しデザイン性(?)を重視してみました。ページトップの写真で、中央の2桁の7セグメントLEDは、「分」を表示していて、周りの12個のLEDが「時」または「秒」を表示します(「時」表示と「秒」表示を切り替えることができます)。つまりアナログ・ディジタル混在型、大げさに言えばハイブリッド型の表示です。その他に、以下のような特徴を持たせました。

  1. 超高精度クリスタルモジュールを使用(公称±1ppm/年≒10日で±1秒程度)
  2. カウントダウンタイマー機能(〜12分59秒)
  3. 周囲の明るさに応じてLEDの輝度を調整
  4. 周囲の明るさを表示する「照度計」機能(おまけ)

2.LEDクロックの動作仕様

LEDクロックにどんな動作をさせるかを決めます。実際には最初にきっちりと仕様設計をしたわけではなく、ブレッドボードで作ったハードウェア上でソフトウェアを作りながら、徐々に機能追加していった結果として、こんな仕様になったわけですが、説明の都合上、最初におおよその動作仕様を説明します。

動作モード 動作概要 表示例
時分表示モード

中央の7セグメントLEDで現在時刻の「分」を表示し、周りの12個のLEDで「時」を表示します。右の表示例では、「9時9分」です。

時分表示
分秒表示モード

中央の7セグメントLEDで現在時刻の「分」を表示し、周りの12個のLEDで「秒」を表示します。「秒」の表示は5秒刻みで、1秒周期で点滅します。「時」の表示はありません。右の表示例では、「x時7分10秒」です(実際には「10秒〜15秒の間のどこか」)。

分秒表示
時刻設定モード

現在時刻を設定します。設定する桁のLEDが点滅します。「MODE」スイッチで桁を進め、「+」スイッチで数字がひとつ増えます。数字を戻すことはできませんが、最大数まで行くと、次は0に戻ります。右の表示例では、「12時4X分」の「X」の部分を設定中(点滅表示で消灯中)です。

時刻設定
タイマーモード カウントダウンする「分」の桁を周りの12個のLEDの点灯数で表示し、「秒」の桁を中央の7セグメントLEDで表示します。右の表示例では、「9分25秒」です。 タイマー
照度計モード 中央の7セグメントLEDでA/Dコンバータの出力の上位8ビットを16進数表示します。A/Dコンバーターの出力は回路の都合で、明るいと数字が減ります。周りの12個のLEDは、明るさに応じて点灯数が変化します(明るいと点灯数が増える)。 照度計

これだけのモードの切り替えと、時刻/タイマー設定などを二つの押しボタンスイッチ「MODE」と「+」だけで操作することになります。変更する桁を点滅させたりしますが、正直なところ、非常に「分かりづらい」仕様ですので、図にまとめておきます(LEDクロックの操作方法)。

3.LEDクロックの回路設計

LEDクロックとしての肝心な動作はすべてソフトウェアで実現しますので、回路は非常にシンプルです。CPUはPIC16F88を使います。今回の機能の実現にはオーバースペックですが、18ピンPICの中では汎用性の一番高いPIC16F88を手元にストックしているので、これを使います。

周りの12個のLEDは6個ずつに分けて、7セグメントのLED(2桁分)と合わせて4桁のマトリックスとし、ダイナミック点灯します。LEDには点灯時に1〜2mA程度の電流を流しています。1桁分のLED全部が点灯すると10〜20mAが流れることになり、PIC16F88ではドライブしきれませんので、トランジスタのドライバを入れます。LEDに流す電流は、使用するLEDに合わせて適当な明るさになるように直列の抵抗(R5〜R11)を調整します。

あとはスイッチ2ビットと照度計用のcdsの入力、発振器(クリスタルモジュールKTXO-18)をつなぐのみです。注意点としては、クリスタルモジュールKTXO-18の出力は直流カットされているので、10KΩでプルアップ/プルダウンしてディジタルの信号レベルに合わせる必要がある点です(秋月電子通商の説明書に記載されているとおり)。また、明るさの変化によるA/D入力の電圧の変化範囲が適切になるように、cdsの抵抗値の可変範囲を調べて、通常の使用環境での最大抵抗値と同じぐらいの抵抗でプルアップします(今回はcdsの可変範囲がおよそ500Ω〜10kΩだったので、10kΩに決定。cdsの仕様上の暗抵抗はもっと大きい)。

PICのクロック周波数が12.8MHzになっているのは、秋月電子通商で高精度クリスタルモジュールが簡単に入手できるということとは別にも理由があります。もうひとつの理由は「4.ソフトウェア設計」に記します。

LEDクロック回路図(gifファイル)   LEDクロック回路図(CE3ファイル)

LEDクロック試作中

ブレッドボードによる試作

4.LEDクロックのソフトウェア設計

LEDクロックのソフトウェアの詳細は、書き出すときりがないので、ここではポイントのみ絞って紹介します。

時刻表示の精度を高めるためのポイントはタイマー割り込み処理の使い方です。ここを間違えると、折角高精度のクリスタルモジュールを使ったのが帳消しになってしまいます。

Timer0を使って「正確な」周期で割り込みを発生させるためには、TMR0レジスタは最初に「0」に設定して、それ以降(割り込みごとに)再設定を行わずに、フリーランさせる必要があります(つまり常に256カウントごとに割り込みを発生させる)。PICのマニュアルのTimer0のプリスケーラーの説明の注意書き(Note)には間接的にしか書いてないのですが、TMR0レジスタの変更を行うと、その時点でプリスケーラーがリセットされます。このため、TMR0を再設定すると、その時点までにプリスケーラーがカウントしていた分だけ誤差が発生してしまいます。したがって、精度の高い割り込み周期を得るためには、Timer0は途中で再設定せずに(TMR0の書き込みを行わずに)フリーランさせる必要があります。

この制約条件を守ると、Timer0で発生させることができる割り込み周期はかなり制限を受けることになります。そのため、PICのクロック周波数は10MHzなどのきりの良い値ではなく、12.8MHzなどの2のべき乗で割り切れる周波数を選択しなければなりません。これがクロック周波数を12.8MHzにしている最大の理由です。

Timer0の割り込み周期は、4クロックで1インストラクションサイクルとなり、プリスケーラー設定をx2、TMR0=0 (256)とすると

1/12.8MHz x 4 x 2 x 256 = 160 μsec

になります。これをソフトカウンタで5回カウントして800μsecを全体処理の基本周期としています。

この基本周期でLEDのダイナミック点灯処理を行い、さらにソフトカウンタで100msec、1secの各周期を作り出して処理しています。周囲の明るさに応じたLEDの輝度調整は、ダイナミック点灯を間引きすることによってPWM処理を行っています。

カウントダウンタイマーは、時刻をカウントしている1秒ごとの処理を利用するため、実際には最大-1秒のカウント誤差があります。言い換えると、タイマースタート後1秒経過しないうちに、1秒の桁が減ってしまう可能性があります。時刻処理とは別にタイマー処理を作れば解決できますが、1秒単位の精度は期待していないので、手を抜いています。

LEDクロックソフトウェアHEXファイル

LEDクロックのソースコードとその詳細は別ページの「付録:ソフトウェア設計詳細編」(工事中:ソースコードのみ掲載)にまとめておきます(予定)。

5.LEDクロックの製作

電子サイコロの製作でも使用している100均のダイソーで入手した6cm x 6cm x 6cmの小型プラスチックケースに組み込みます。LEDを取り付ける表示ボードと、その他の部品を取り付けるメインボードの2枚に分けて組み立てます。各基板は市販のユニバーサルボードを適当な大きさに切断して使用しています。

LEDクロックメインボード LEDクロックメインボード裏 LEDクロック表示ボード LEDクロック表示ボード裏

メインボード(部品面)

メインボード(配線面)

表示ボード(部品面)

表示ボード(配線面)

各種操作用のスイッチはメインボードに直接取り付けてしまいました。操作のためにはケースを開ける必要がありますが、簡単に開けられるケースなので、普通に使う分には特に不自由はありません。

2つのボードはL字アングルで直角に取り付け、ケースに組み込んでいます。

LEDクロック組立1 LEDクロック組立2 LEDクロックケース組込み

組み立てた状態(1)

組み立てた状態(2)

ケースへ組込み

LEDクロック完成1 LEDクロック完成2

LEDクロック完成(1)

LEDクロック完成(2)

6.最後に

このLEDクロックが完成してから2週間ほど連続動作させて見ましたが、時刻の誤差は1秒程度でした。ここで惜しくも停電があり、再度設定し直して、連続稼動中です。電池動作できれば、良いのですが、LEDの消費電流が大きいので、電池があまりもたないと思われます。

「時分表示モード」では普通に時刻を読み取ることができますが、表示に変化が無く、あまり面白くないので、普段は「分秒表示モード」にしてあります。時刻を知るには不便ですが、動きがあるのでインテリア的に使えます。

周囲の明るさによるLED輝度調整は、ダイナミック点灯周期の都合で、あまり大きな輝度の差をつけることができませんでしたので、気休め程度の動作です。また、ちょうどスレッショルドに掛かるような明るさになると、輝度が頻繁に変化してチラチラした感じになります。ヒステリシスを持たせれば解決できますが、「そこまでやらなくても・・・」というところでしょうか。

 

付録: ソフトウェア設計詳細編(ソースコード掲載) >>


リンクについて: このページには自由にリンクして下さって構いません。
ページ作成: 2009年7月28日〜8月19日

Home

inserted by FC2 system