電子工作の初めの一歩の定番であるLEDチカチカ。PICを使って「たくさんのLEDチカチカ」をやってみた。
LEDを点灯させるには、一般的にはLED1個あたりポート1本、抵抗1個を使う。ただし、マイコンを使うなどしてダイナミック点灯すれば、少ないポートでたくさんのLEDをドライブすることができる。
すでに時計を作っているサイトがある。また、MicrochipTechnologyのTechnicalBriefのTB029(英語版PDF)にも、この手法が紹介されている。
ポートのビット数をnとすると、手堅くいけば、n*(n-1)個、欲張ればn*(n+1)個までのLEDを扱える。
たとえば、GP0=L、GP1=Hとすると、D1のLEDが点く。逆にGP0=H、GP1=LとすればD2が点く。その際、余計な影響が出ないようにGP2=Hi-Z(=入力)としておく。これをピン数分総当たりに接続する。この手法は手堅い版であり、TB029などはこれになる。
さらにGP0=H、GP1=GP2=Hi-Zとしたとき、D7、D18、D17、D16と電流が流れ、D7のLEDが点灯する。同様にGP0=LとすればD10が点灯する。これが欲張り版の拡張部分で、時計を作っているサイトはこれになる。
欲張り版で電源付近にダイオードを連ねているのは、ドライブ電圧を適当な電圧まで下げるため。たとえば、GP0=L、GP1=Hのとき、D1が導通点灯し、D1の両端は1.5Vと3.5Vほどになっている。D8がGNDへ直結だと、こちらも点灯(しかも明るい)してしまう。そこで、D8+(D18+D17+D16)が3.5Vでは導通せず、5V(GP0=GP2=Hi-Z、GP1=H)なら導通するように、ダイオードの数を適当に調整しておく。
ただし実際には、たとえばD1点灯時にD10あたりが、ごくごくわずかに光って見えてしまう。シビアな用途では、何らかの対応が必要になるかもしれない。
手堅い版の点灯では、75Ω2本分の150Ωが制限抵抗になる。LEDのVFを2Vと見積もれば、(5-2)/150=0.02、つまり20mAと計算できる。欲張り版の拡張部分は、合成されたVFがあり容易には見積もれない。ダイオードを0.65V、LEDを2Vとすれば、ドライブ電圧は5-0.65-2-0.65-2=-0.3Vとなってしまう。実際には、ダイオードのV-I特性グラフの折れ曲がった部分あたりが使われていると思われる。
一連のLEDは、VRによってコントロールする。
電源電圧を10kΩBタイプのVRで分圧し、AN3へ入力、A/D変換をして結果をLEDに反映させている。
LEDは秋月の100個入り赤色φ3mmを使った。
コンデジCaplioR2による動画なので汚いのは仕方がない。320*240、30fpsで撮影。AviUtlでガンマ補正と切り貼りを施す。
映像ではわずかにチラつきが見える。肉眼でこれは判らないが、1サイクルを倍の24msほどにすると、明らかにチラついて見えた。現在は12msとしている。
複数同時に点灯しているように見えるが、ダイレクトドライブをしており、実際には一瞬間には1つしか点灯していない。LEDの数を増やす際にはチラつき防止のため、1サイクルの時間を20ms程度に抑えられるように、1個あたりのドライブ時間を調整する必要がある。
手堅い仕様部と欲張り仕様部とでは、やはり明るさが違った。これはソフト側で調整する。
LEDの明るさは、電流量、または点灯時間におおむね比例する。人の目は、明るさが4倍になって初めて2倍明るくなったように見える。そのあたりを考慮しながら、実際に動作させて調整した。
このPICはH出力よりL出力がやや弱いようで、D1~D6の点灯時間を0.5msとすると、D7~D9が1ms、D10~D12が2ms程度で釣り合いがとれて見えた。
ちなみにこれは昨年のゴールデンウィークごろに作ったもの。
MPLABでアセンブルしてHEXファイルを生成、シリアル接続のRCDライタで書き込んだ。
LEDLEDLEDLEDADC.zip (2,013bytes MPLAB用ASMファイルおよびHEXファイル)
0 件のコメント:
コメントを投稿
.