[トップページへ戻る]

Shuttle K45 改造 自作デジタル時計

2009年9月 ※2013/02 ページデザイン変更
Shuttle K45 改造 レベルメータ+デジタル時計」で組み込んだキット物のデジタル時計を自作の物に置き換えました。時刻合わせなどの設定はAVR-CDCによるシリアル通信で操作できるようにしたので、PCのケースを空けなくて済みます。基板上のスイッチでも操作できます。
7セグを使ったデジタル時計の製作はありふれています。ここでは部品数を少なく、小さく作ることをテーマとしました。ポイントは7セグの電流制限抵抗を省略したことです。

このページでは7セグ4桁デジタル時計の回路図、部品一覧、プログラムのソースを公開しています。シリアル通信で制御するためのWindowsアプリもソースごと公開しています。

2009/11 追記:
時計とは関係無しに、7セグ/LEDのダイナミックドライブ(パルス点灯)のパラメータの決め方を知りたい人には、この記事の後半が参考になるかもしれません。

【関連記事】
Shuttle K45 改造 レベルメータ+デジタル時計
 …これが事の始まりです。ただし今回、レベルメータは関係ありません。
今から始めるAVR #2 ATtiny2313 7セグ4桁ボード〜そこ(7セグ)んとこ、詳しく
 …7セグ/LEDのダイナミックドライブの原理について解説しています。
AVR USB接続の周辺機器をPCから操作する〜仮想COMポート〜
 …AVR-CDCを使ってLCDカレンダー時計を制御しています。
雑談:Shuttle K45 マザーボードのコンデンサを交換した (2010/09 追記)
 …コンデンサが膨張、破裂して壊れたマザーボードの修理方法を解説しています。

【関連リンク】
Shuttle K45 …最近K45の販売が終了し、同等のケースKP10が発売されました。
AVR-CDC …PCに仮想COMポートを作るモジュールです。


製作物紹介
K45に組み込んだ自作デジタル時計(7セグ時計)をWindowsアプリから操作している様子です。
両側のレベルメータは今回の製作と関係ありません。(レベルメータの記事はこちら→「PCオーディオレベルメーターの製作」)

画像クリックで動画再生
動画
0'05" 24時間制と12時間制を切り替え。
0'12" 明るい状態から暗い→明るい→暗い→明るいと変更。
0'23" 時刻更新。「分」がスクロールして17.24→17.25へ。
0'34" 時刻更新。3桁がスクロールして17.59→18.00へ。
0'41" 最後にまた24時間制と12時間制を切り替え。


制御部(緑の基板)と表示部(7セグ)。
黒いケーブルはUSBコネクタへつながっている。
シリアル通信で制御しなくても時計は単独で動作する。
PCに組み込まず単品の時計として使えるということで、その場合必要なのは基板の右半分だけ。とても小さい。

23時13分はATtiny2313に引っかけて。



左:
Shuttle K45 改造 レベルメータ+デジタル時計」でチラリと書いた7セグソケットがこれ。IC用ピンソケットを利用。高さ15mm。このときはUEWを使わず配線し、楽しくも大変な目にあった。よい思い出なので作り直さずそのまま再利用した。それで途中からリボンケーブル継ぎ足しになっている。
右:
この7セグ時計はUSB接続で使う物だが、PC内蔵のためケーブルの先はマザーボード上のUSBコネクタ(ピンヘッダ)に差せるようにしてある。ただし開発中はこれだと不便だったので、ミニUSB-Bコネクタに変換して使っていた。


K45内部。左写真・真ん中の基板がこれまで使用していた秋月の「PIC16F57マイコンデジタル時計キット Ver.3(卓上型)」。それを今回製作した7セグ時計に置き換えた(右写真)。
左のレベルメータ基板上にあるオーディオケーブル接続コネクタの向きが悪く、7セグ時計基板の設置で少々困った。レベルメータ製作時、このコネクタを後ろに向けるか横に向けるか迷った末に後ろ向きにしたのだが、読みが外れたようだ。


おまけ:
秋月の時計キットが本来の表示部を付けて動作する様子。
全力で光!光!光!

制御ボードと表示ボードを接続するコネクタのオス/メスは説明書と逆にしてあります。制御ボードの高さを低くするためです(背が高いとK45のケース天板にぶつかる可能性がある)。電解コンデンサやクリスタルを倒してあるのもそのためです。


ハードウェアの説明
基板の構成
全体で25x15穴(72x47mm)の片面基板に収まっています。
赤線を境に左側がAVR-CDC、右側が7セグ時計の制御部で、ここで真っ二つに切り離してもそれぞれ独立して動作します。これらは電源ラインと通信線だけでつながっています。
電源は+5V、USBバスパワーで使います。PCの電源を切ってもUSBからの給電は途切れないので、時計は動作し続けます。
また、この時計は通信と関係無しでも動作するよう作ってあり、時刻合わせなどを操作するボタンが付いています。



K45のスリムドライブベイから出し入れするには高さ15mm以内に収める必要があります。実はベイからの出し入れにこだわらなくてもケースを開けてメンテナンスすればよいのですが、それでも全体の背を低くしないとケース天板にぶつかります。このような事情から、部品選びと取り付けには一工夫が必要です。
一番背が高い部品、電解コンデンサは倒します。実装面積が広く取られるので向きと位置でまた悩みます。コストが数十円ほど上がりますが、背が低いタイプを使った方がよいかも知れません。
時計の表示部を付けるピンヘッダはL型を使い、ソケットを横から差せるようにします。また、小さくまとめるため2列タイプにします。

AVR-CDCについて
ATtiny2313を使っています。「AVR USB接続の周辺機器をPCから操作する〜仮想COMポート〜」で製作したものと同じです。USBのD+線からプルダウンしている1MΩの抵抗は省略しました。
シリアル通信の機能が欲しいだけならCDC-232でよいのですが、”my K45”の今後のさらなる拡張を考え、CDC-IOにしています。…拡張計画は未定です。

7セグ時計について
今回の製作テーマ「部品数を少なく、小さく作る」はここに掛かってきます。以下、ポイントを説明します。AVRはこちらもATtiny2313を使っています。その他部品個々の詳細は割愛します。

■デジトラを使う
7セグをダイナミックドライブするのに、桁数分のトランジスタを使います。トランジスタの使い方として、ベース電流を制限する抵抗と、ベース−エミッタ間に渡す抵抗が付きものなので、1桁につきトランジスタ+抵抗2個が必要となります。
部品数を減らすため、ここにデジトラ(デジタルトランジスタ)を使いました。あらかじめ抵抗2個が内蔵されたトランジスタです。デジトラの大きさは2SC1815などのトランジスタより頭が若干小さいので、見た目に配置の窮屈さが軽減されます。

■発振器を使う
AVR内蔵のクロック供給源はRC発振回路で構成されていて、温度や電圧の変化に弱く(=精度が悪く)、時計には使えません。精度が要求される場合は水晶発振子(いわゆるクリスタル)を使います。さらに、時計のように一層正確さが求められる場合は発振器を使います。
クリスタルを使うには数十pFのコンデンサ(負荷容量)が2個付きものです。一方、発振器にコンデンサは不要なので部品数を減らすことができます。
ところが発振器は発振回路を内蔵している分、8ピンICほどの大きさになり(8ピンのICソケットに刺さる)、クリスタル+コンデンサ2個の場合と実装面積は大して変わりません。…が、嬉しいことにクリスタルと同じ大きさの発振器があったりします。ここではそれを使いました。
基板表面の写真で見比べてみてください。AVR-CDCではクリスタル+コンデンサ2個を使っています。7セグ時計ではクリスタル発振子と同サイズの発振器を使っています。

■電流制限抵抗を省略する
7セグ(LED)をスタティック点灯させるときは電流制限抵抗が必要ですが、その抵抗値でダイナミックドライブすると明るさが落ちるので、ダイナミックドライブのときは抵抗値を小さく見積もります。
さらに進めて、ダイナミックドライブで7セグをパルス点灯させれば電流制限抵抗を省略することもできます。もちろんパルス点灯可能な条件下で使用することが前提ですし、上手くやるにはソフトウェアで工夫が必要です。
ここでは8個の抵抗(セグメントA-G,DPの分)が省略できました。

■操作スイッチの必要性
この時計をシリアル通信による制御のみで使うなら操作スイッチは不要です。また、PCに内蔵する物なのでスイッチを付けても普段は操作できません。しかし何らかの理由でAVR-CDCが使用不能となっても、時計のメンテナンスはできるようにスイッチを付けました。
タクトスイッチは案外大きい部品です。基板上で3x4穴を占めます。小型化を考えて1個で済ませたいところですが、操作性の面から2個付けました。滅多に使用しないスイッチであっても、使用せざるを得ない状況(非常事態)であればこそ操作性は大切だろう、という考えです。


回路図
7セグ時計の回路図です。AVR-CDCについては「AVR USB接続の周辺機器をPCから操作する〜仮想COMポート〜」を参照してください。
7セグ時計 LEDボード
アノードコモン/カソードコモン
の7セグ共通
7セグ時計 制御ボード(A)
アノードコモンの7セグ用
7セグ時計 制御ボード(K)
カソードコモンの7セグ用

(800x600)

(1000x750)

(1000x750)

使用する7セグがアノードコモンかカソードコモンかで制御ボードが違います。デジトラ(トランジスタ)をPNP型にするかNPN型にするかの違いです。LEDボードの回路自体は7セグのタイプによらず同じです。
今回、カソードコモン用のハードを製作していません。回路図に間違いはないと思いますが、動作検証していない点をご了承ください。

LEDボードで7セグの配線が面倒だと思うので、UEW(ポリウレタン線)を使って楽をしましょう。
詳しくは「今から始めるAVR #3 ATtiny2313 7セグ4桁ボード〜製作、動作チェック」を参照してください。

制御ボードではクロックの供給源を発振器としています。「OSC」はオシレータ(発振器)のことです。発振器のクロック出力をATtiny2313のPA0に接続します。PA1は空きます。
クリスタル(発振子)を使う場合はコンデンサ2個を付けた上でATtiny2313のPA0,PA1に接続します。

デジトラの代わりにトランジスタ+抵抗2個でも構いません。代替えの回路を参考にしてください。上記リンク先の「7セグ4桁ボード」と同じ回路です。

ソフトウェアの説明
ダウンロード
7セグ時計のファームウェア Seg7ClockCom_v100.zip
7セグ時計を制御するWindowsアプリ Seg7ClockControler_v101.zip

プログラムの説明
AVR-CDC(USB-COM変換モジュール)
AVR-CDCのサイトから「CDC-IO」のファイルをダウンロードして、ATtiny2313用の.hexファイルを(AVR-CDCの)ATtiny2313に書き込みます。

7セグ時計のファームウェア Seg7ClockCom
Seg7ClockCom_A.hex または Seg7ClockCom_K.hex を(7セグ時計の)ATtiny2313に書き込みます。
「A」はアノードコモンの7セグ用、「K」はカソードコモンの7セグ用です。

解凍して出てくるSeg7ClockComフォルダはAVR Studioのプロジェクトフォルダです。
アノードコモン用とカソードコモン用の切り替えは、Seg7ClockCom.cの先頭付近にある、
#define _CATHODE_CMN_ 0 //1:カソードコモン 0:アノードコモン
の行で01かを変更するだけです。ソースのその他の箇所に変更点はありません。
今回、カソードコモン用のハードを製作していないため、ファームもカソードコモン用の方は動作検証していません。ご了承ください。

【注意】
このhexファイルは制御ボードの発振器が11.776MHzであるとしてビルドしています。異なるクロックの発振器(またはクリスタル発振子)で製作する場合、ボーレート(シリアル通信の速度)の設定やスイッチ押下のチャタリング回避タイミングなどを変更し、ビルドしなおす必要があります。

7セグ時計を制御するWindowsアプリ Seg7ClockControler
インストール作業はありません。Seg7ClockControler.exe実行でアプリが起動します。操作方法はmanual.htmlを読んでください(後述の説明文を抜粋したもの)。

解凍して出てくるSeg7ClockControler_VS2008proj.zipはVisual Studio 2008 Exp.EditionのC#のプロジェクトフォルダを圧縮したものです。


7セグ時計の機能
この時計は多くの機能を取り入れないことにしました。表示するのは時刻のみで、カレンダー機能はありません。アラームやタイマー機能もありません。
機能
  • 時刻表示は12時間制/24時間制/30時間制に対応。
  • 明るさ調節が2段階。
  • 1分ごとの時刻更新時に表示エフェクトあり(なしの設定も可)。
各時間制において時刻は次のように表示されます。
12時間制では午後に4桁目のDPが点灯します(例:昼の1時「 1.00.」、夜の1時「 1.00」)。




12時間制 12 1 5 6 12 1 11 12
24時間制 0 1 5 6 12 13 23 0
30時間制 24 25 29 6 12 13 23 24

プログラム内容
時計のプログラム(アルゴリズム)自体は何も特別なことがなく、誰が組んでも同じようなものになります。0.5秒ないし1秒を計って加算し、秒、分、時と繰り上げていくだけです。
ここでは今回製作した時計独自の内容について説明します。

■操作方法の判定
シリアル通信で制御するかスイッチで操作するかを判定します。電源投入時またはリセット時にどちらかのスイッチを押していればスイッチ操作モードになります。スイッチが共にオフであればシリアル通信モードで動作します。
スイッチ操作モードではシリアル通信で信号を送信しても無反応です。シリアル通信モードではスイッチを操作しても無反応です。

■7セグのパルス点灯
7セグ(LED)をダイナミックドライブするとLED 1つ1つはパルス点灯で光ることになります。今回の製作では電流制限抵抗なしにパルス点灯させようとしています。パルス点灯の条件を守らずにLEDをドライブすると、大きめの電流が想定時間以上流れてLEDが焼けてしまうので、安全にパルス点灯できる条件に収まるようプログラムで点灯周期を調節する必要があります。後述。

■時刻更新のエフェクト
何か面白いことを1つ入れたくて実装しました。メーター機器のように数字がスクロールして入れ替わります。スクロール中の文字パターンは基本フォントから計算して合成しています。


7セグ時計をシリアル通信で制御するアプリ
動作環境:
ここで製作した7セグ時計がAVR-CDCとともに内蔵されていて、.NET Framework 3.5がインストールされているPC
開発環境:
WindowsXP / Visual Studio 2008 Express Edition - C#
AVR USB接続の周辺機器をPCから操作する〜仮想COMポート〜」で公開している同内容のアプリを流用しました。

Windowsのレジストリは使いません。インストール/アンインストール作業もありません。
Seg7ClockControler.exe実行で上記ダイアログ画面が起動します。

1.COMポート選択
AVR-CDCを接続して出現したCOMポートを選択して[接続]ボタンを押します。
接続すると[解除]表示に変わります。
2.時間設定
「現在の時刻」のチェックで、PCのシステム時刻が表示されます。[時刻をセットする]ボタンで、7セグ時計がこの時刻に設定されます。
「任意の時刻」をチェックすると、PCのシステム時刻と関係なく自由な時刻を7セグ時計にセットすることができます。
いずれにしても「秒」は7セグで表示されませんが、時計内部では設定されています。
3.時間制
12時間制/24時間制/30時間制で表示できます。
リストボックスから選択決定すると、自動的に7セグ時計に反映されます。
4.明るさ
7セグの明るさを「明るい」「暗い」の2段階で変更します。
バーをスライドさせると直ちに7セグ時計の明るさが変化します。
5.更新エフェクト
「分」の更新時に数字がスクロールするエフェクトの「あり/なし」を設定します。
チェックを入れるとエフェクト「あり」に設定されます。設定は自動的に7セグ時計に反映されます。
6.アプリ終了
設定が完了したらアプリを終了してOKです。ずっと起動しておく必要はありません。
7.その他
バージョン表示をクリックしてみてください。特に意味はありませんが。

1.で「COMnのオープン失敗.」と表示される場合(WindowsXPの例)
Windowsのデバイスマネージャを開き、「ポート(COMとLPT)」から対象とする「通信ポート(COMn)」を選択して右クリック。無効をクリック→有効をクリック。そして手順1.からやり直してください。
これでもまだCOMnに接続できない場合、PCを再起動して手順1.からやり直してください。


スイッチによる操作
ATtiny2313のPD0に接続したスイッチをswL、PD1の方をswRとします。どちらかのスイッチを押しながらATtiny2313を電源投入またはリセットするとスイッチ操作モードで時計が起動します。このとき表示は「 0.00」で、2桁目のDPが点滅し、時計は動作しています。

■時刻合わせの手順
時計表示中
swL押下
0 00.」 4桁目のDPが点灯。swR押下で「分」を合わせる。
     (例:27回押して「27分」にする 「 0 27.」)
swL押下
0.27」 2桁目のDPが点灯。swR押下で「時」を24時間制で合わせる。
     (例:14回押して「14時」にする 「14.27」)
swL押下
24 」 時間制を設定する。swR押下ごとに24→30→12→24→30→…と変化する。
     (例:1回押して「30時間制」にする 「30 」)
swL押下
時計表示に戻る
     (例:「14.27」 2桁目のDPが点滅し、時計が動作している。)

スイッチ操作モードでは明るさは「明るい」、時刻更新エフェクトは「あり」に設定され、変更はできません。時計として使えるだけの操作に絞っています。

パルス点灯について
7セグ(LED)のパルス点灯について、今回の製作でやったことを説明します。

パルス点灯とは
LEDに100mA流してスタティックドライブすると、恐らくLEDは焼損します。しかし一瞬だけなら100mA流しても壊れません。パパパッ!と高速にon/offを1:9の割合で繰り返せば、計算上は10mAの明るさで光ることになります。
100mA * {1 / (1+9)} = 10mA
これがパルス点灯の理屈です。説明のために「100mA」や「1:9」と書きましたが、実際には7セグ(LED)のデータシートに記載された条件に従ってパルス点灯させます。

例えば、LN516RAという7セグのデータシートには
「Pulse width 1 msec. The condition of IFP is duty 10%, Pulse width 1 msec」 (IFP=100mA)
と書いてあります。デューティ比10%で100mAを1msecなら流してよいようです。これは最大条件なので、これよりもデューティ比を小さくするか(offの割合を増やす)、電流を小さくするか、点灯時間を短くするのは問題なしです。
他に、今回使用したHDSP-F401という7セグのデータシートには
「Maximum Tolerable Peak Current vs. Pulse Duration」という、パルス点灯で流せる電流の大きさと流せる時間の関係を表すグラフが掲載されています(右図:クリックで拡大)。パルス点灯できる条件はこのグラフから読み取ります。
ちなみに図中のHERはHigh Efficiency Red、超高輝度赤のことです。

まとめると、7セグ(LED)をパルス点灯でドライブするときは
電流の値、点灯周期、点灯時間、この3点の条件を守るということです。

ところで、どのLEDでも直流(スタティックドライブ)では通常20mA以下、10〜15mA程度で使うという”お約束”みたいなものがあります。パルス点灯にもそんなお約束的な値がないかと上記引用を見ていて、LN516RAの「デューティ比10%、100mA、1ms」はHDSP-F401のグラフで安全領域にあることが分かりました。この条件をパルス点灯の一つの目安にできそうです(注:保証はありません)。もちろんデータシートに条件が書いてあればそちらを優先します。
点灯時間1msでデューティ比10%→10msに1回点灯→1秒間に100回点灯→100Hz
100Hzの線上で1ms(=1000us)との交点を見ると I_F_PEAK / I_DC_MAX = 3倍強(3.3倍くらいに見える) …[*1]
このグラフの7セグは I_DC_MAX = 30mA。瞬間的に100mA流すとすると 100mA / 30mA = 3.3倍 …[*2]
[*1]←→[*2]で値が一致。セーフ。この条件はすでにLED業界のお約束(典型的な値)として通用しているのだろうか。


パルス点灯の条件(値)を決める
点灯周期、点灯時間はプログラムの1ループにかかる時間を単位として、何ループごとに点灯/消灯するかで調節します(マイコンの動作クロックに依存する方法)。またはタイマー割り込みで時間を決めて点灯/消灯させます(メイン処理と関係なくLEDのドライブに専念する関数を作る)。
電流の値はプログラムで調節できません。いや、LEDのパルス点灯はマイコンから見ればPWM制御ですから、その意味ではプログラムで電流を調節できると言えます。しかしそのPWM制御の値(周期)をどう決めるかという話を今しているので、結局あらかじめ調節することはできないのです。
※(2011/03補足) PWMではなくPFMと言った方が正しい説明かもしれません。
ところで、それとは別の目的からトランジスタのデータシートでコレクタ電流の絶対最大定格を確認しておきます。デジトラRN2205では100mAでした。これにより、パルス点灯の条件を満たしてドライブする範囲なら、電流は上手い具合にトランジスタの定格に収まり(パルス点灯で最大100mAと見積もっている)、トランジスタは壊れないだろうということが分かりました。

それでは7セグを壊す覚悟で実験してみましょう!
…闇雲に試すと本当に壊してしまうので、一応安全そうな条件を検討して実験します。
いま、AVRが1MHzで動作しているとします。メインループ内に計算処理を入れず、ただ4桁の7セグをダイナミックドライブすると、
 1桁あたりの点灯時間は 1MHz → 0.001(ms) = 1(us)
 1桁あたりの点灯周期は 1 / 4 → デューティ比 25%

本番の時計プログラムではメインループ内の処理数が増え、1桁あたりの点灯時間が延びます。コードサイズが2KBあったとして、これが丸ごとメインループで処理されるとしても1msまでには余裕があります。点灯時間の条件は満たせると考えてよさそうです。

デューティ比は目安の10%を大分オーバーしています。デューティ比は1ループにかかる時間とは関係なく、4桁ごとのループ数で調節します。いま勝手に、メイン処理の4ループ=1点灯ループと呼ぶことにします。4桁点灯させて1点灯ループです。ここに1点灯ループ休憩を入れてみましょう。7セグを8桁ドライブしていることになります。
 1桁あたりの点灯時間は 1MHz → 0.001(ms) = 1(us)
 1桁あたりの点灯周期は 1 / 8 → デューティ比 12.5%

デューティ比的にはこれで行けそうです(あくまで実験する値として)。
点灯間隔が空く(=消灯時間が長くなる)ので最初の検討パターンより暗くなると思いますが、明るさの感じ方は見てみないと分からないです。

果たしてパルス点灯は成功するのか、上記2つの検討パターンで実験してみました。
パターン1
メイン処理ループ 7セグ点灯状態
1周目 888
2周目 88
3周目 88
4周目 888
5周目 888
6周目 88
パターン2
メイン処理ループ 点灯ループ 7セグ点灯状態
1周目 1周目
点灯させる周回
888
2周目 88
3周目 88
4周目 888
5周目 2周目
休憩する周回
8888
6周目 8888
7周目 8888
8周目 8888
9周目 3周目
点灯させる周回
888
10周目 88
11周目 88
12周目 888
13周目 4周目
休憩する周回
8888
14周目 8888
【実験環境】
AVR:ATtiny2313 約1.4MHz、7セグ:HDSP-F401オレンジを4桁、トランジスタ:RN2205、
コードサイズ:約1600bytes(時計処理を含む内容)

【結果】
7セグのセグメント1つに流れる電流は、パターン1で20mA前後、パターン2で11mA前後、でした。
実験で使った7セグはスタティックドライブで順方向電流30mAまで流せるものなので、20mAを超えても心配いりません。パターン1は明るすぎるほどに光りました。パターン2は良好な明るさでした。

以上より、7セグを電流制限抵抗なしにパルス点灯させる際の、制御プログラムの目処が立ちました。この内容でプログラムを組み、時計として半日間テスト運用したところ、7セグもトランジスタも壊れることなく動作しました。
しかし新たな問題に気付いてしまいました。「'1'が妙に明るい!?」

数字によって明るさが違う
7セグの各セグメントに電流制限抵抗が付いている場合、数字の形によらずセグメントに流れる電流は一定となります。それでどの数字も同じ明るさに見えます。
今回製作したものには電流制限抵抗が付いていません。この場合、数字の形によらずコモンに流れる電流が一定となり、それが7セグの各セグメントに分かれることになります。すると、数字の形によって明るさが変わってしまいます。
下図はアノードコモンの7セグで適当な電流を仮定した説明図です。


数字の形と点灯するセグメントの個数の関係はこのようになっています。
数字の形
点灯するセグメントの個数 6個 2個 5個 5個 4個 5個 6個 4個 7個 6個

半分以上の数字は点灯するセグメントの個数が5,6個で、これらが並んでも明るさの違いはほとんど分かりません。その中に「4」「7」(点灯するセグメントの個数が4個)か「8」(同7個)が並ぶと、明るさが少し違うことに気付きます。数字「1」はセグメントが2個しか点灯せず、どの数字と並ぼうがズバ抜けて明るく見えます。
さらに、時計として動作しているとき2桁目にはDPが1秒周期で点滅していて、これによって2桁目の数字の明るさがピコピコ変わります。大変目障りです。この明るさのばらつきが我慢できないので、明るさを統一する処理を入れます。

明るさを統一する
パルス点灯の点灯周期を決めたときと同じ考え方で解決できます。
7セグは最大8個のセグメントが点灯するので(「8.」)、8点灯ループ単位で見たときに、どの数字も電流の合計が等しくなるよう点灯/消灯する周回数を決めればよいのです。
数字の形 点灯するセグメントの個数 点灯/消灯ループの回数
0 6個 6点灯ループのあいだ点灯、2点灯ループのあいだ消灯
1 2個 2点灯ループのあいだ点灯、6点灯ループのあいだ消灯
2 5個 5点灯ループのあいだ点灯、3点灯ループのあいだ消灯
8 7個 7点灯ループのあいだ点灯、1点灯ループのあいだ消灯
9 6個 6点灯ループのあいだ点灯、2点灯ループのあいだ消灯
-- -- --
8. (8+DP) 8個 8点灯ループのあいだ点灯

これで数字によらず、またDPの有無にもよらず、さらに言えば字形によらず、全桁が同じ明るさになります。この内容でプログラムを組み、時計を動作させたところ、明るさは均一になりました。
しかし対策前より表示が暗くなりました。原因は消灯するループ数が増えたことです。

パルス点灯の点灯周期を決めたとき、「明るすぎ」を抑えるため1点灯ループごとに「休憩」を入れました。今、明るさ統一のために、休憩に当たるループをさらに追加したことになります。ということで「明るすぎ」を抑えるために入れた休憩ループを廃止し、明るさを回復させました。この状態でもパルス点灯の条件は満たしているので、7セグやトランジスタの動作に問題はありません。

最後に1つ注意することがあります。
ここまででやっていることはソフトウェアPWM制御なのですが(*)、何につけても点灯/消灯のタイミングが処理ループ単位になります。従って、AVRの動作があまり遅いと7セグの表示がちらつきます。かすかに瞬く程度ではなく点滅するほどです。そのため上記プログラム内容で正常に表示させるには、最低でも1MHzでAVRを動作させる必要がありそうです。運用テストから経験的に得た結論です。(*) 2011/03補足: PWMではなくPFMと言った方が正しい説明かもしれません。
逆に、高速で動作させるならば、「休憩ループ」をわざと挟むことにより数段階の明るさ調節ができるようになります。
1.4MHz動作では休憩ループを1回入れて1段階暗くすることができました。休憩ループを2回入れて2段階暗くしようとしたところ、表示がちらつきました。動作クロック1.4MHzでは1段階が限度です。
このページで公開しているWindowsアプリで、明るさの設定がスクロールバーでいじれる割に「明るい/暗い」の2段階しかないのは、実はこのような理由からなのです。開発途中では8段階の明るさ調節ができたりしました。…と、こんなところで開発裏話。

部品について
ここでは7セグ時計の部品について説明します。
AVR-CDCの製作については「AVR USB接続の周辺機器をPCから操作する〜仮想COMポート〜」を参照してください。

発振器
マイコン内蔵の発振器は不正確なので時計の製作には使いません。外付け部品を使います。時計目的ではより正確さが求められるので、発振より発振がお勧めです。
マイコンに発振子をつなぐとき、それはマイコン内蔵の発振回路に接続していることになります。一方、発振器は発振回路込みの部品で、こちらの方がより正確なクロックを発生させます。
時計の製作では如何にして正しい1秒(ないし0.5秒)を計るかが重要です。マイコンは動作クロックを分周してカウントし、これで1秒を計ります。ということで発振器は速さより、分周しやすいクロックかどうかで選びます。

超高精度で有名なクリスタル発振器KTXO-18Sがあります。しかしこの部品は大きいので小型の時計を目指すには向きません。ここでお勧めしたいのが秋月で売っている11.776MHzの発振器です。
※(2011/04追記) 現在では販売されていないようです。
・様々な2のべき乗(2^n)を組み合わせても割りきれる
 →AVRの動作クロックを決める分周とカウンタの比較値を決める分周の組み合わせの幅が広い。
・小さい
 →よくあるクリスタル発振子と同じ大きさ。
・安い
 →5個100円。KTXO-18Sは1個200円。クリスタル発振子でも安くて1個40〜50円。

今回製作した時計は11.776MHzの8分周 11.776 / 8 = 1.472MHzで動作しています。これより遅いと7セグの点灯で問題が出る可能性があると製作記事に書きました。発振器でも発振子でも、どれを選ぶにしろ、AVRの動作クロックがこれより高くなるものを選んだ方がよいでしょう。

(発振子)
発振器で製作することを勧めますが、発振子でも製作できます。部品一覧表で「4MHz以上」としているのは、1.4MHz以上で適当にということです。それを分周せずにAVRの動作クロックとします。精度の点から、セラミック発振子(セラミック振動子とも。村田製作所の製品名ではセラロック)ではなくクリスタル発振子を使ってください。
クリスタルに付けるコンデンサは15pF〜22pFでよいと思います。詳しくはATtiny2313のデータシートを参照してください。

7セグLED
K45に組み込むなら外形の高さ12.8mmサイズの7セグを使います。これ以上大きいとスリムドライブベイの高さに収まりません。大きさを気にせず作るなら好みで自由に選んでください。
7セグは4桁分必要です。1桁の7セグを4個でも、2桁組みの7セグを2個でも、4桁組みの7セグでも、どれでも構いません。当然ですがアノードコモンとカソードコモンを混ぜて4桁ではいけません。アノードコモンかカソードコモンか揃えて4桁分用意してください。
7セグの配線にはUEW(ポリウレタン線)がお勧めです。これも用意しましょう。
ちなみに秋葉原では鈴商が7セグを豊富に扱っています。大小各色様々です。
赤色の7セグは格安セットで販売されていることもあります。通販や店頭で探してみてください。

デジタルトランジスタ
コレクタ電流を稼ぎたいので、ベース電流の制限抵抗が小さいRN2205/RN1205を選んでいます。
この時計では部品数削減、小型化のためにデジトラを使っています。どうしてもデジトラでないといけない、というわけではありません。回路図の代替え回路を参考にしてください。
代替え回路のR1は2.2kΩか4.7kΩ、R2は10kΩ〜47kΩのどれでもよいでしょう。

ピンヘッダ/ピンソケット
この時計をK45に組み込むものとして部品一覧表にお勧めの形状を書きました。最低12ピンあればピン数や形状が違ってもよいです。PCに組み込まず卓上時計として製作するなら、大きさや形は何でもよいです。もちろん制御部とLED部を同一基板上に作ればコネクタはいりません。

7セグ時計 部品一覧 (回路図の案内はここをクリック
部品名 部品番号 個数 参考価格/備考
AVR(マイコン) U ATtiny2313 1 100円(秋月電子
発振器 OSC (11.776MHz) 1 5個100円(秋月電子)
積層セラミックコンデンサ C1 0.1uF [104] 1 10個100円
タクトスイッチ SW1,SW2 -- 2 10個180円
千石電商 店頭価格)
7セグLED LED1-LED4 -- 4桁分 1個100円など
ピンヘッダ(制御ボード側) CN 2x7 L型 1 長いものを折って使う
ピンソケット(LEDボード側) CN 2x7 1 同じサイズがなければ
長いものを切って使う
発振器の代わりに
クリスタル発振子 -- 4MHz以上 1 1個50〜200円程度
(積層)セラミックコンデンサ -- 22pFなど 2 1個20円
7セグがアノードコモンの場合
デジタルトランジスタ Tr1-Tr4 RN2205 4 10個100円(鈴商
RN2205の代わりに
トランジスタ(PNP型) Tr 2SA1015 4 20個100円(秋月電子)
抵抗 R1 2.2kΩ [赤赤赤金] 4 1個5円/100個100円
抵抗 R2 47kΩ [黄紫橙金] 4 1個5円/100個100円
7セグがカソードコモンの場合
デジタルトランジスタ Tr1-Tr4 RN1205 4 10個100円(鈴商
RN1205の代わりに
トランジスタ(NPN型) Tr 2SC1815 4 20個100円(秋月電子)
抵抗 R1 2.2kΩ [赤赤赤金] 4 1個5円/100個100円
抵抗 R2 47kΩ [黄紫橙金] 4 1個5円/100個100円


◆ ◆ ◆
K45のスリムドライブベイにレベルメータとデジタル時計を付けようと考えたのが
2008年7月でした。そのときはすぐに完成させたくてキット物の時計を使いました。
AVRの勉強を始めたのは7セグでデジタル時計を作るためでした。
あれから一年。一番最初の目的だった自作のデジタル時計を組み込むことができ、
気持ちがスッキリしました。最高です。


(C) 『昼夜逆転』工作室 [トップページへ戻る]
inserted by FC2 system