[戻る]

AVR ATtiny2313 レベルメータードライバー 10LED/5LED VU/3dB

2009年6月製作/7月記事編集
ATtiny2313をLM3915/LM3916のようなレベルメータードライバーにしました。
このページでは機能や使い方を説明します。
ファームウェア、ソースファイル、レベルメーター製作例の回路図などを公開しています。
写真拡大

関連記事
AVR ATtiny2313 レベルメーターテスト ←このページのとっかかり段階です。
PCオーディオレベルメーターの製作(完成編) ←LM3915を使った製作記事です。
Shuttle K45 改造 レベルメータ+デジタル時計 ←上記製作の元になった記事です。

キーワード
ATtiny2313、レベルメーター、VUメーター、
レベルメータードライバー、Level Meter Driver

動画で概要を紹介

ATtiny2313 レベルメータードライバー 内容
ATtiny2313 レベルメータードライバー 内容

このレベルメータードライバーの内容紹介。
(15fpsから変換。無音)
0'00"〜0'16" ノーマル点灯
0'16"〜0'33" リバース点灯
0'33"〜0'53" ピークホールド(+リバース点灯)
0'53"〜1'09" ドット表示(+リバース点灯)
dB: -20 -10 -7 -5 -3 -1 0 +1 +2 +3 です。
LM3916と同じです。
動画ではブレッドボードの都合でLEDの色の並びが逆に設置されています。こんなときにリバース機能が役に立ちます。
さらにシンク/ソースどちらでも使えるので基板上でのレイアウトの自由度が高いです。

ATtiny2313 レベルメータードライバー 5LED
ATtiny2313 レベルメータードライバー 5LED


5LED動作の例。
(ケータイ撮影5fpsから変換。無音)
10LED動作のうちの5個を点灯しているというわけではありません。入力電圧を5段階でスケーリングしています。
dB: -10 -5 0 +3 +6 です。
赤が弱いのはこのLEDの特性です。

ATtiny2313 レベルメータードライバー



【動作条件】
VCC=5V/内蔵発振器1MHz

【機能】
・LED10個動作/5個動作の自動認識
・VUメーター/3dBステップでスケーリング変更
・バー/ドット表示の切り替え
・ピークホールドあり/なし
・リバース点灯する/しない

LEDの点灯方法を変更できる。
・シンク電流で点灯/ソース電流で点灯
・ダイナミックドライブで点灯/スタティックドライブで点灯

ATtiny2313 Level Meter Driver
ピン 名前 内容 5LED動作時
1 RESET GND接続でリセット。通常未使用。
2 LED-8 LED 8番 未使用
3 LED-7 LED 7番 未使用
4 LED-6 LED 6番 5LED動作決定
シンク電流回路:GND接続
ソース電流回路:オープン
[電源投入時に判定]
5 LED-5 LED 5番 ←(最上位LED)
6 LED-4 LED 4番
7 LED-3 LED 3番
8 LED-2 LED 2番
9 LED-1 LED 1番(最下位LED)
10 GND GND
11 A/D-CTRL A/Dコンバータ相当機能
(コンデンサの制御)
12 A/D-CTRL A/Dコンバータ相当機能
(アナログ比較器のAIN0)
13 SIGNAL-IN 信号入力
(アナログ比較器のAIN1)
14 (BAR)/DOT LED表示
オープン:バー表示/GND接続:ドット表示
[動作中の切り替え有効]
15 PEEKHOLD ピークホールド
オープン:オフ/GND接続:オン
[動作中の切り替え有効]
16 REVERSE リバース
オープン:オフ/GND接続:オン
[動作中の切り替え有効]
17 (VU)/3dB dB刻み
オープン:VUメーター/GND接続:3dB刻み
[電源投入時に判定]
未使用
(VUメーターで動作)
18 LED10 LED 10番(最上位LED) 未使用
19 LED9 LED 9番 未使用
20 VCC VCC (+5V)

ダウンロードはここをクリック attiny2313_lmdrv_v100.zip(下の3項目をまとめたzipファイル)

・ファームウェア/ソースファイル(.hex/.c)
ファームウェア(.hex)とプログラムのソースファイルです。
LEDの点灯方法の組み合わせでファームウェアは4種類考えられますが、この.hexファイルはシンク電流/ダイナミックドライブでビルドしたものです。詳細は以下の説明記事にて。

・LED接続パターン図(10LED/5LED)
4種類のファームウェアの使い分けを説明する図です。
この図を見る→10LED/5LED

・10LED VUメーター 回路図
このレベルメータードライバーを使った製作例です。
この図を見る→回路図

以下の説明記事で赤文字のタイトルはこれらの図を指しています。

機能の説明

ATtiny2313レベルメータードライバー(以下、「このドライバー」)の機能について説明します。

LED10個動作/5個動作の自動認識
このドライバーはLM3915等のように、基本的にLED10個接続で使用します。レベルメータードライバーにはLED5個動作のものも多くあり、それと同様に扱えるよう、このドライバーもLED5個接続に対応しています。
2つの動作の切り替えにファームの書き換えは不要です。その回路がシンク電流でLEDを点灯させる回路の場合、LED-6ピン(ICの4番ピン)をGNDに接続してください。ソース電流の回路の場合はオープン(どこにも接続しない)にしてください。詳しくは「LED接続パターン図(10LED/5LED)」を見てください。
電源投入時、このドライバーはLED-6ピンの接続状態をチェックして10LED動作/5LED動作を切り替えます。

VUメーター/3dBステップでスケーリング変更
このドライバーがLEDを点灯させる電圧の閾値は、LM3915をイメージした3dBごとの刻み幅と、LM3916をイメージしたVUメーターらしい刻み幅があります。
スケーリングの切り替えにファームの書き換えは不要です。3dB刻みにする場合、(VU)/3dBピン(ICの17番ピン)をGNDに接続してください。VUメーターの刻みにする場合はオープン(どこにも接続しない)にしてください。
電源投入時、このドライバーは(VU)/3dBピンの接続状態をチェックしてVUメーター/3dBステップを切り替えます。
動作中にスケーリングを切り替えることはできません。通常、そのような使い方はないので電源投入時のみ判定していますが、動作中に切り替える必要がある場合はプログラムを改造してください。どこにどう記述すればよいかはソースファイルを見れば見当がつくと思います。
5LED動作時は(VU)/3dBピンの接続状態によらずVUメーターになります。LED-6〜LED-10のピンはオープンにしておきます。
3dBステップで5段階ではレンジが狭く、使い道が少なそうなのでVUメーター専用にしました。

VUメーター
LED-1
最下位
LED-2 LED-3 LED-4 LED-5 LED-6 LED-7 LED-8 LED-9 LED-10
最上位
-20dB -10dB -7dB -5dB -3dB -1dB 0dB +1dB +2dB +3dB
LED-7を基準に見たVUメーターのdB刻みです。LM3916と同じです。
マスの色はVUメーターをイメージした配色の一例です。

3dBステップ
LED-1
最下位
LED-2 LED-3 LED-4 LED-5 LED-6 LED-7 LED-8 LED-9 LED-10
最上位
0dB →3dB →3dB →3dB →3dB →3dB →3dB →3dB →3dB →3dB
最下位を基準に見て3dBごとにLEDが点灯するdB刻みです。LM3915と同じです。
オーディオレベルメーターにも使えます。

VUメーター(5LED動作)
LED-1
最下位
LED-2 LED-3 LED-4 LED-5
最上位
-10dB -5dB 0dB +3dB +6dB
5LED動作時のVUメーターです。LED-3を基準に見たdB刻みで、LB1403Nなどと同じです。
マスの色はVUメーターをイメージした配色の一例です。

バー/ドット表示の切り替え
このドライバーはLM3915/LM3916と同様、LEDの点灯をバー表示/ドット表示で切り替えることができます。バー表示は最下位から先端までのLEDを点灯します。ドット表示は先端のLEDのみ点灯します。
表示の切り替えにファームの書き換えは不要です。バー表示にする場合、(BAR)/DOTピン(ICの14番ピン)をオープン(どこにも接続しない)にしてください。ドット表示の場合はGNDに接続してください。
動作中に表示を切り替えることができます。スイッチを介して(BAR)/DOTピンをGNDに接続するとよいでしょう。

ピークホールドあり/なし
ピークホールドは刻々と変化するLED表示の先端を短時間保持する機能です。
ピークホールドすると瞬間的な変化でも「いまどこまで点灯したか?」が分かるようになります。
表示の切り替えにファームの書き換えは不要です。ピークホールドありにする場合、PEEKHOLDピン(ICの15番ピン)をGNDに接続してください。ピークホールドなしにする場合はオープン(どこにも接続しない)にしてください。
動作中に「あり/なし」を切り替えることができます。スイッチを介してPEEKHOLDピンをGNDに接続するとよいでしょう。

リバース点灯する/しない
デフォルトではLED-1が最下位、LED-10が最上位ですが(5LED動作時はLED-5が最上位)、このドライバーは点灯方向を逆向きにすることができます。これがリバース(逆向き)機能です。2組のレベルメーターを使い、左右対称にLEDを配置する際にこの機能が役立つかも知れません。
点灯方向の切り替えにファームの書き換えは不要です。リバース点灯する場合、REVERSEピン(ICの16番ピン)をGNDに接続してください。リバース点灯しない場合(順方向)はオープン(どこにも接続しない)にしてください。
動作中に「する/しない」を切り替えることができます。スイッチを介してREVERSEピンをGNDに接続するとよいでしょう。

機能まとめ
該当ピンを↓ スケーリング LED表示 ピークホールド リバース点灯
オープン VUメーター バー なし しない
GND接続 3dBステップ ドット あり する

回路の説明

ATtiny2313レベルメータードライバー(以下、「このドライバー」)を使った回路について説明します。「10LED VUメーター 回路図」はこのドライバーを使ったVUメーターの作例です。

1.2Vフルスケール
入力信号レベルはLM3915/LM3916を参考に、1.2V(正確には1.25V)でフルスケールとなるようファームを組んでいます。それ未満の入力ではLEDを全点灯させることができません。適切なレベルまで入力信号を増幅し、SIGNAL-INピン(ICの13番ピン)に入力してください。
OPアンプLM358を使った増幅回路を「PCオーディオレベルメーターの製作(完成編)」で紹介しています。
5Vを1kΩと3kΩの抵抗で分圧して1.25Vが取り出せます。開発中はこれでA/D変換のパラメータを調整していました。

ATtiny2313にA/Dコンバータはありません。アナログコンパレータをA/Dコンバータに応用しています。2つのA/D-CTRLピン(ICの11番,12番ピン)には0.1uFのコンデンサと10kΩの抵抗を接続してください(回路図のC2,R2)。その状態で正常に動作するよう、ファームを組んでいます。

LEDの明るさを決める抵抗
LM3915/LM3916の最もシンプルな応用回路では、抵抗1個でLEDの明るさを決められます。これ相当のことをするため、このドライバーはLEDをダイナミックドライブで点灯しています。
回路図のR1がLEDの明るさを決める抵抗です。R1=10ΩのときLEDに流れる電流は実測で約4mAでした。
テスターで測定しました。ダイナミックドライブで点灯するLEDの1個に流れる電流を、果たして正しく測定できているかは疑問です(時間解像度的に)。

ダイナミックドライブゆえに暗くなってしまうのは仕方ありません。…と思ったのですが、見た目はスタティック点灯で8〜10mA流しているような明るさに見えます。まずまずの明るさです。
複数のLEDをダイナミックドライブするということは、LED1個あたりはパルス点灯してるとも言えます。LEDのデータシートでパルス点灯について最大100mA、パルス幅1ms、デューティー比10%などと書かれていれば、実は抵抗R1なしでも構いません。実際に試したところ、LED1個あたり実測で約5mA流れていました。10Ωのときと明るさはほとんど変わりません。
なお、回路図でR1=10Ωとしている意味は特にありません。強いて言えば形式的に付けているものなので、1Ωでも構いません。逆に200Ωなど大きい値にするとLEDは薄暗くなります。

このドライバーはスタティックドライブでもLEDを点灯させることができます。その場合はLEDごとに電流制限抵抗を入れる必要があります。「LED接続パターン図(10LED/5LED)」では220Ωとなっていますが、好みの明るさになるよう470Ω程度までを目安に変更して構いません。青や白のLED(VF=3.6V付近)では100Ω程度になるでしょう。また、ソースファイルの書き換えが必要です(後述)。

シンク電流/ソース電流
大抵のレベルメーターはシンク電流でLEDを点灯させるように作られています。このドライバーも基本的にシンク電流で使用しますが、ソース電流で点灯させることもできます。その際は回路の配線パターンも変わってくるので、「LED接続パターン図(10LED/5LED)」を参考にしてください。また、ソースファイルの書き換えが必要です(後述)。
あまり役立つ機能ではないかも知れませんが、後ほど使用例を紹介します。

コンデンサの容量について
増幅した音声信号をそのままSIGNAL-INピンに入力しても、LEDのちらつきが目立ったり、あまりバーが伸びなかったりします。これはLM3915/LM3916でも同様です。SIGNAL-INピンの手前でコンデンサと抵抗を並列にGNDへ接続してください。回路図のC3,R3です。
主にコンデンサの容量によってLEDの点灯の様子(反応の過敏さやちらつき具合)が変わります。回路図の値でイマイチであれば、C3=1u〜10uF、R3=1k〜10kΩ程度で好みの光り方を探ってみてください。
この辺は好みの問題なので「正解の値」はありません。VUメーターと3dBステップで最適なコンデンサ容量、抵抗値が違ったりもします。

ファームウェア(ソースファイル)の説明

ATtiny2313レベルメータードライバー(以下、「このドライバー」)のファームウェア(ソースファイル)について説明します。

#defineによる動作の変更
ソースファイルの先頭付近に、電流の制御に関する#defineが2つあります。設計する回路に合わせて変更、ビルドし、ATtiny2313に書き込んでください。

シンク電流/ソース電流によるLED点灯の切り替え
#define _SINK_CURRENT_ …… 1:シンク電流 0:ソース電流
配布している.hexファイルでは「1:シンク電流」になっています。

ダイナミックドライブ/スタティックドライブによるLED点灯の切り替え
#define _DYNAMIC_DRIVE_ …… 1:ダイナミックドライブ 0:スタティックドライブ
配布している.hexファイルでは「1:ダイナミックドライブ」になっています。

動作クロック
このドライバーはATtiny2313の内蔵発振器1MHz動作(8MHzの8分周)で使います。これはATtiny2313のデフォルトのヒューズ設定です。

ビルドとATtiny2313への書き込みについて
配布しているLvMeter.hex v1.00は、AVR Studio 4.14 (build 589)、WinAVR-20080610、
最適化オプション「-Os」でビルドしています。
SCK/MISO/MOSIにLED-9ピン、LED-10ピン、(VU)/3dBピンとしての配線をした状態ではISPによる書き込みは失敗します。これらの配線を一旦外すか、ATtiny2313を別の基板へ移して書き込んでください。

スケーリングについて
このドライバーは入力電圧1.25Vでフルスケールとなります。1.25VをA/D変換値250とし、各レベルメーターは次のような閾値になっています。
VUメーター
A/D
変換値
dB 倍率 電圧(V)
18 -20 0.1 0.09
52 -10 0.3 0.26
80 -7 0.45 0.40
98 -5 0.56 0.49
124 -3 0.7 0.62
158 -1 0.9 0.79
176 0 1.0 0.88
194 1 1.1 0.97
222 2 1.26 1.11
250 3 1.4 1.25
3dBステップ
A/D
変換値
dB 倍率 電圧(V)
12 0 1.0 0.06
16 3 1.4 0.08
22 6 2.0 0.11
32 9 2.8 0.16
44 12 4.0 0.22
62 15 5.6 0.31
88 18 7.9 0.44
126 21 11.2 0.63
176 24 15.8 0.88
250 27 22.4 1.25
VUメーター(5LED動作)
A/D
変換値
dB 倍率 電圧(V)
38 -10 0.3 0.19
70 -5 0.56 0.35
126 0 1.0 0.63
176 3 1.4 0.88
250 6 2.0 1.25
まずdBの値が決まっているので、0dBを1.0倍として各dBを倍率に換算します。
次に最大倍率の時を1.25Vとして、各倍率に対する電圧を求めます。
最後に電圧からA/D変換値を求めます。1.25VをA/D変換値250とするので、
250 / 1.25 = 200 → 電圧(V) x 200 = A/D変換値 です。
正確さは大して重要ではありません。適当に四捨五入してざくざく計算します。

ソースファイル内にコメントを書いています。開発中のメモも残っていて必ずしも信用できる内容ではありませんが、興味があれば参考程度に読んでみてください。
Cの書き方が悪い、処理効率が悪い、2進数表記が多い、という点は気にしないでください。

LED接続の配線パターンについて

ATtiny2313レベルメータードライバー(以下、ICと呼ぶ)とLEDの接続パターンを紹介します。
ユニバーサル基板上で立体的な配線(自由に交差できる配線)をする場合、以下の説明はあまり関係なく、好きなように配線すればよいです。
ここではプリント基板を使うとしたら基板上のパターンはどうなるか、という点から説明します。配線が交差せず、電源ラインも無理のない形でパターンを引くにはICの機能をどう設定し、部品をどう配置すればよいか、という観点です。

【1組での基本的な使い方】

1-1
個別のLEDをICに接続するパターンです。IC側のLED番号に合わせてカラーを変え、VUメーターとしています。このICを使う上で最も基本的な接続パターンです。

1-2
単色のLEDアレイを接続するパターンです。個別のLEDの場合と比べて特に違いはありません。

オーディオレベルメーターは通常、左右2組のセットで使います。
左右のLEDを並列に配置して同じ方向にバーが伸びるような構成にする場合は、「1組での使い方」のものを単純に2組用意すればよいです(2-a)。



以下では2組のLEDが左右対称に点灯するような配置を考えることにします。
なお、実際の製作物ではどちらの向きから見るかによって「右側」「左側」の言葉が指すものが変わりますが、以下の説明では図の右側・左側ということで説明します。

【2組での左右対称な使い方】
個別LEDの場合

2-1
基本的にICの向きを揃え、左右で似た形になるような配線パターンを考えます。
右側は1組での使い方の基本形です。
左側はLEDの並びを逆にしますが、このままでは意図した方向と逆向きにバーは伸びます。LEDの点灯方向を逆にするにはREVERSEピンをGNDに接続します。これでLED10が最下位、LED1が最上位になり、意図した方向へ点灯するようになります。

【2組での左右対称な使い方】
単色LEDアレイの場合

2-2
2-1と同様です。特に違いはありません。

ここからが本番です。
多色LEDアレイは部品に左右の区別があるので、単色LEDアレイのように「上位/下位どちらから点灯させても同じ」というわけにはいきません。

【2組での左右対称な使い方】
多色LEDアレイの場合

3-1
左側は単色LEDアレイを多色LEDアレイに置き換えるだけでよいです。REVERSEのおかげで色の並びに合った方向へバーが伸びます。
問題は右側です。
多色LEDアレイに置き換えると、点灯方向自体はよいのですが色の並びと合いません。右側は、LEDアレイを配置する向きを先に決め、それにICの配置を合わせて行くことになります。


3-2a
右側は、左側全体を180度回転し、LEDの位置を揃えて配置しただけです。基板上で広い面積を占めることになります。左右のICの向きが逆で電源ラインのパターンも引きにくそうです。

3-2b
右側は、3-2aからICをぐるりと引き回して配置したものです。基板上で配線パターンの面積は取られますが、交差なくパターンが引けます。ICの配置がこれまでと同じになります。
この配線パターンで決定してもよいですが、次にこのICの特徴でもある機能を紹介します。


3-3
右側は、LEDをソース電流で点灯させています。おかげで配線パターンがシンプルになり、単色LEDアレイと同様になります。当初思い描いていた配線パターン(3-1)が実現できました。
ソース電流で点灯させるのでLEDの端子はGNDへ接続します。

1枚の基板上ではなくLED表示部を分けて製作する場合は、配線の制約が少なくなります。

【2組での左右対称な使い方】
ケーブル接続の場合

4-1
ケーブルを半回転捻れば点灯方向の問題は解消します。実際の製作ではこのパターンが多いと思います。図の点線は、それぞれの導線がLEDアレイの裏側を通って端子につながっていることを表しています。

4-2
ケーブルを捻ることに何か不安を感じることがあるかも知れません。その場合、捻る側のICをREVERSEにすれば左右ともストレート結線にできます。


安価なATtiny2313で高価なLM3915/LM3916の代わりに使えそうな
レベルメータードライバーが作れないかと挑戦し、思った以上に満足
できるものが作れました。
次はATmega88でちゃんとしたA/Dコンバータを使い、2in1(1つの
パッケージに2組入り)のレベルメータードライバーを作る予定です。

[戻る]