CharlieplexingでBinary Clock
Charlieplexingの話(2012/12/28)でマイコンの3つのポートで12個のLEDを駆動する方法について書いたので、Chipiplexing 方式を使ったバイナリクロックを作ってみた。
バイナリクロックは時刻を2進数で表示する時計で、例えば10:39分は
○ | ● | ||
○ | ○ | ○ | |
○ | ● | ○ | |
● | ○ | ● | ● |
1 | 0 | 3 | 9 |
のように表示する。
LEDで表示しようとすると12個のLEDが必要である。これをATTiny45でCharlieplexで3つのI/Oを使って実現しようというもの。
最初にAVRでI/Oポートを3つ持つ品種AT90S2323を使おうと考えたが、AT90Sシリーズのデータシートを見るとソース(電流吐出し)とシンク(電流吸込み)のドライブ能力が対象でない。と
いうことでATTiny45を使うことにした。
ATTiny45はRESET#、XTAL1,XTAL2をI/Oポートとして使用できるのだが、
RESET#はドライブ能力がかなり低いのでピークで10数mAの出力が必要な今回のような用途には使えないし、外部X'talを使うのでXTAL1、XTAL2も使えないということでI/O
ポートは3つである。
(水晶発振器出力を#2PIN (CLKI)に入れて#3PIN(XTAL2)をI/Oに使えば、い~じゃん。というツッコミは無しである!)
R1、R2、R3にマイコンの出力ポートの内部抵抗が使えないかと思い、ATTiny45の内部抵抗をデータシートで確認すると30数Ωくらい
だったので、R4=R6=510Ω、R5=5.6kΩで作ったら、P0=H、P1=LにしたときD1、D8、D9が点灯してしまう。
SPICEさんはD1点灯(緑)のときD3(青)には200uA流れるとおっしゃる。200uAでは明々とは点灯しないような気がするのだけれど...
D1、D8、D9に関係する部分だけ抜き出してVcc=3.3V、D1,D8,D9のVf=2V、Q1,Q2のVbe=0.7として計算した各ポイントの電圧は↓のとおりである。
D1のアノード電圧=2.65V、Q2のエミッタ電圧=0.95Vだから、D9のA-K間の電圧=1.7Vである。これはD9のVfより小さいのでD9は点灯しないはずだ。(D8も同様)
2日くらい考えたところ、
昔のLEDは10m以上流さないと点灯しなかったが、最近のLEDは高輝度と謳っていなくても1mAも流すと点灯する。物によっては0.1mAでも点灯する。
!よく考えたら、Vf=2VはおおよそIf=20mAの場合のVfである。(D1のA-K間は2V)
ところがD8,D9に少ない電流が流れているとすると当然Vfも小さい値になる。
普通の赤色LEDで電流が流れ始める電圧は1.7V付近だから点灯するくらいの電流が流れているのではないか。
D8、D9が完全にOFFになるようにQ1のエミッタ電圧を下げ、Q2のエミッタ電圧を上げることにした。
アルカリ電池×2を使った場合を考えてVcc=3.4V、D8、D9が完全にOFFになる電圧を1.5Vとして計算すると、R4=R5=1.2kにしたときに1.49VになるのでD8,D9は完全に消えるだろう。
出力ポートの内部抵抗をあてにすると、I/Oピン入出力電流の絶対最大規格40mAに引っ掛かる恐れがあるのだけれど、R1、R2を大きくするとD8、D9を単独で点灯したときの電流が減るので痛し痒しだ。
D1~D8を点灯した時とD9~D12を点灯したときの電流の差があるのでLEDによって明暗の差が出てしまう。明らかに分かるようならPWMで補正しよう。
LED表示のソースはこんな感じ
|
ポート(PB(x))をHにするときはDDR(x)←1、PORTB(x)←1
ポート(PB(x))をLにするときはDDR(x)←1、PORTB(x)←0
ポート(PB(x))をHizにするときはDDR(x)←0、PORTB(x)←0
このデータをLED0-LED11毎にテーブルで用意しておいて、表示するLED番号で出力データを検索して、上位4bitをDDRBに、下位4bitをPORTBに出力する。
そうしているうちに完成
↑11:54を表示
後ろは学研のArduino、もっぱらISPに使っている。
リセット時には、全てのLEDが右下から順に点灯し、11:40からカウントが始まる。
時分しか表示できないので撮影用に1秒毎にカウントアップするようにしている。
まあ動いたから良しとしよう。
I/Oポートがもう一個あって4個あるなら普通にCharlieplexingで駆動するのが簡単だと思う。
本当に時計として使うならC3をトリマに変えて発振周波数を合わせる必要がある。
« 採用基準 | トップページ | USB DAC (2) »
「日記・コラム・つぶやき」カテゴリの記事
- 修理(4) <とうとう修理不能>(2022.11.08)
- LANケーブルテスター(2022.05.18)
- 今時のWebサイトを構築してみた(2022.05.16)
- Type-C 充電器(2022.04.29)
- 全館停電 <ネットワークトラブル訓練>(2022.03.12)
「AVR」カテゴリの記事
- Google日本語モールス入力(2020.05.01)
- Digispark(3) <RAMが一番大事>(2016.09.19)
- Digispark(2) <ATtiny85+V-USB+Arduino>(2016.09.05)
- Digispark (1)(2016.09.03)
- Atmel買収 <AVRは無くなるのか>(2016.03.01)
コメント