自作電子小物/TIPS/I2C接続7セグLEDドライバ
自作電子小物/TIPS/I2C接続7セグLEDドライバ
安価なATMELのATtiny2313を、7セグメントLED表示制御ICにしてしまうソフトウエアです。接続はI2Cなので、必要なI/Oピンは2本だけ、複数接続や他のI2Cデバイスとの混在も可能です。表示方式はダイナミック表示、最大8桁まで対応します。8×8のドットマトリックスLEDにも使用可能です。回路構成によっては、8桁表示でLED代を含めても約230円でを実現できます。
I2C 7Segment LED Driver
2010年6月27日
キャラクタ型LCDモジュールを使う程の情報量もない場合や、大きめの表示を行いたい場合、7セグメントLEDは大変重宝します。ただ、I/Oポートのピンをたくさん使ってしまうのが使いにくい所でした。ピン数を少なくする為に、ラッチやシフトレジスタ等の汎用ロジックICを追加するのが普通なのですが、これらのICは意外と値段が高いのです。場合によってはマイクロコントローラの方が安かったりします。そこで、安価なAtmel AVR ATtiny2313にダイナミック表示機能を持たせ、7セグメントLEDコントローラにしてしまおうと考えました。
ATtiny2313は20ピンで、電源に2ピン、ホストインターフェースをI2Cにすれば2ピン、残り16ピンをLED用に当てられるとすれば、ドット付7セグ8桁もしくは8×8ドットマトリックスのLEDを制御する事が出来ます。実際はそう簡単にはならない部分がありましたが、最終的には実現出来ました。またATtinyは、I/Oの電流駆動能力がマイクロコントローラとしては比較的大きいので、LEDの直接接続し易いのは部品数削減に好都合でした。
主な仕様
ホストインタフェース:I2C(ATtiny2313がスレーブデバイスとなります)
転送速度:〜100kHz(正確にはATtiny2313のUSI性能による)
スレーブアドレス:0x08〜0x7b(ソフトで決定)
書込みデータ:コマンドバイト+表示データ(ビットイメージ)×nバイト
LEDポート:
制御方法:単純ダイナミックスキャン、カラム方向時間差走査
共通線:アノードコモン/カソードコモンいずれも対応可能
セグメントポート:8本、アクティブハイ/ロー任意設定(ソフトで決定)*1
カラムポート:8本、アクティブハイ/ロー任意設定(ソフトで決定)*1
リフレッシュレート:約540Hz
デューティ比:12.5%(1/8)
電源:
電圧:1.8〜5.5V
自己消費電流:約3mA/5V(実測)
書込みデータ:
コマンド 意味
0x00 0桁目からの表示を、後続の表示データに置き換える
0x01 1桁目からの表示を、後続の表示データに置き換える
:
0x07 7桁目からの表示を、後続の表示データに置き換える
0x10 表示輝度を100%にする
0x11 表示輝度を50%にする
0x12 表示輝度を25%にする
0x13 表示輝度を12.5%にする
0x14 表示輝度を6.8%にする
0x15 表示輝度を3.4%にする
0x20 表示リフレッシュを再開始する
0x21 表示リフレッシュを停止する(ノイズ対策)
表示データは1セグメント=1ビットに対応したビットマップとなる
セグメントdp=b7 g=b6 f=b5 ... a=b0
細かい仕様についてはソースコード内のコメントを見て下さい。
*1)電流は1ピン当り40mA、全ピン合計が200mAを一瞬でも越えないよう余裕を持って設計して下さい。
ダウンロード
デバイス作成方法
プロジェクトファイルをダウンロードし、AVR Studioでリビルド出来る様にして下さい。
ATtiny2313本体とAVRISP等のプログラムライタを、ブレッドボード等を利用して電気的に接続し、AVR Studioから認識できるような状態にしておいて下さい。
ソースコード内に、スレーブアドレスと、駆動ピンのアクティブハイ/ローの設定が、#define文で指定されていますので、必要に応じて修正します。リビルドしてオブジェクトを生成します。そのオブジェクトをATtiny2313に書込んで下さい。
RESETピンもI/Oポートとして使いますので、RESETを無効化する必要があります。具体的にはヒューズビットのRSTDISBLをライタで変更して下さい。AVRISP等のシリアル型の書込み器を使用している場合、RESETピンで書込みを制御している関係上、それ以降二度と書込み出来なくなります。つまり、一発勝負になりますので慎重に行って下さい。ホストプログラムが安定してからこの作業をした方が良いでしょう。RESETピンにはdp(ドット表示)を割り当てていますので、小数点を表示する必要がなければ、ヒューズビットの変更は不要です。
使用回路例
本編の活動中に何パターンか作ってみました。
(1)超高輝度4桁ダイナミック表示専用の7セグLEDを使用
LEDは超高輝度のOSL-40562-IG(OptSupply)を使用する事で、駆動回路を省き、かつ配線量も減らす事が出来るのがこの回路の特徴です。1セグメントに流す電流は3.75mAにしています。コネクタのピン並びはStrawberryLinuxのSB1602に合わせました。部品代約500円。基板サイズは50.8x25.4mmで片面のみ。蛇の目基板でも全く問題なし。
(2)駆動回路なしの4桁×2行レイアウト
1セグメントに流す電流は3.75mAなので、超高輝度タイプのLEDを前提にしています。GL9A040G(シャープ)にした事により部品代約300円で済みます。8桁でこの価格は魅力的ですが、配線がかなり多くなるので専用プリント基板を作らないとしんどいです。基板サイズは58.4x35.6mm。片面では配線を通しきれませんでしたので、ジャンパ線(赤線)10カ所を手配線して下さい。もちろん両面(2層)にしてもOKですが、交差したままなので修正して下さい。
(3)アノードコモン型で4桁×2行レイアウト
一番一般的な回路で、アノードコモン型LED+PNPトランジスタを使用した駆動を行う構成です。ATtiny2313は総電流が200mAまで流せますが、安いPNPトランジスタでは150mAまでなので、 余裕も持たせてセグメント当り10mAの設計にしました。光量不足になる事も少ないでしょう。部品代約400円。基板サイズは59.7x45.7mmで、ジャンパ線が10カ所あります。
(4)アノードコモン型で4桁×2行レイアウト(小型、2枚版)
回路は同一で、正面の面積を最小にするために基板2枚重ねの構造にしました。基板サイズは45.7x33mmで、StrawberryLinuxのSB1602Bと同じ大きさとなるようにしました。LCDからLEDへの変更を想定しています。ジャンパ線が14カ所あります。LED側の基板は単純にダイナミック表示用の結線をしているだけなので、他へ流用し易いと思います。
(5)アノードコモン型で4桁×2行レイアウト(小型、2枚、SMD版)
SMD(表面実装)部品に変更した基板です。回路に大きな変更はありません。
(6)ドットマトリックス8x8(SMD版)
出物のドットマトリックスLEDのTOM-1588BH-B(PARALIGHT)での回路例です。あまり明るいLEDではないので、トランジスタで駆動する形にしました。LEDの裏に全て収まる様にするにはSMD部品を使わざるを得ませんでした。基板サイズは38x38mmです。ATtiny2313をICソケットを使わないで直づけすれば、LEDの裏の窪みにすっぽり収まります。
(7)ドットマトリックス8x8の直接駆動
一応、駆動回路なしの直接接続版も設計してみましたが実際作った事も試した事もありません。多分、暗くて実用にならないと思います。
上記、全ての設計データ(回路設計、基板設計)ファイルです。
ホスト側プログラム例
(USBブートローダが前提です)
設計情報
開発環境
IDE: AVR Studio 4.18.700
Compiler: WinAVR 20100110(GCC 4.3.3)
ソースファイル
I2C_LED7SEG_x8.c メインを含んだ全てのプログラム
割込処理中心のプログラムフローになっており、メインはスリープの空ループだけです。I2CはUSIを使いハードウエアで通信制御し、ISR(Interrupt Service Routine)内で、データ処理させています。また、LEDのリフレッシュもタイマ割込で行っています。 割込中心のため、プログラムフローでI2Cプロトコルを処理するのは解りにくくなるので、通信状態と発生イベントをコード化し、デシジョンテーブルにぶつけて次の処理を決定するという、通信処理では良く使われる手法にしています。書込みパターンしかテストしていないので、テーブルの精査が十分ではないかもしれません。
余談
初めてのAVRなので、おかしなソースコードになっていると思います。一番違和感があったのが、constがROM上に配置されない事でしたが、よく考えれば普通のコンピュータでは当たり前、こちらの方が楽なのでした。デシジョンテーブルなど固定値のメモリテーブルの場合、貴重なRAMを大量消費してしまうのが難点ですが、全体的には大変良いデバイス/開発環境だと感じました。