Topics | PICC Pro lite mode | Actual use | AD convert | Timer0 | Timer1 | PWM | LCD | Interrupt | PIC16F88 | PIC16F1827 | LVP | MPLABX | SNAP |
ver2.30 MPLAB SNAP対応!
汎用LCDを使ってオーディオのVUメーターっぽいのを再現してみました。実験した所、実用的なレベルまで使える事が分かりましたので公開します。写真は小型のキャラクターLCDモジュールを使い、それをお菓子(フリスク)のケースに納め、制御回路はフィギュア(初音ミクのオルゴール)をケースとして利用しました。できるだけ簡単な回路を目指しつつ、基本は押さえた構成にしました。電源は5V単電源で、アナログ回路は簡易的な全波整流回路と積分回路の構成としています。メーター表示は直接電圧を表示するモードと、対数変換後に表示するモードの2種類が選べます。表示キャラクタも4種類から選ぶ事ができるなど、多彩なユーザー設定項目があります。
超小型LCDキャラクタディスプレイモジュール(16×2行バックライト・オレンジ)を使用した場合。
0:00〜0:12 windowsメディアプレーヤーでサウンド再生中のバーグラフ動作
0:13〜0:19 サウンド再生を停止し、数秒後にLCDのバックライトが徐々に消える動作
0:19〜0:28 サウンドを再び再生し、徐々にバックライトが明るくなりながらバーグラフ動作
途中でサウンドを停止しLCDバックライトが暗くなりかかっている時にサウンドを再生
0:28〜0:45 設定画面の紹介
0:45〜0:57 バーグラフ動作
※点滅している様に見える部分は、シャッタースピードの関係によるもの。
白抜き文字バックライト付き 超小型LCDキャラクターモジュールSD1602VBWB-XAを使用した場合。
装置名 | LCDステレオVUメーター |
主な機能 | 2チャンネル分の10ビットA/Dコンバートされた値を対数バーグラフでリアル表示 理想ダイオードによる全波整流回路のため、-42dB〜+5dBの広いレンジ L/R独立した48段階バーグラフ 簡単なハードウェア構成 バックライトのオンオフ、バックライトの明るさ調整(Ver1.30以降) バックライトのフェードイン・フェードアウト機能(Ver1.30以降) ソフトウェアーコントラスト調整 ライン入力、出力(ヘッドフォンなどで使用する時は音声バッファが必要になります) 単一5V電源のみで動作 レベルマーキング機能 |
周波数特性 | 40Hz〜20KHz以上 |
電源 | 動作電圧:5V 電流:バックライト点灯時 19mA以下、消灯時 4.5mA以下 |
※最新の回路図(Ver1.3)はこちらからダウンロード(pdf)できます。
特別な部品は使用しませんでしたので入手が比較的簡単と思います。
※ICSPを利用しない場合は、DBG1は不要です。またR14,R15の抵抗を使わずにPICとLCD間を直接接続することができます。
Date | version | Build | Folder | Device | note |
---|---|---|---|---|---|
New! 2024/10/22 |
2.30 | MPLAB X IDE 6.20, MPLAB XC8 compiler version2.50 | lcd_bar_16f1827.X | PIC16F1827 | プロジェクトフォルダをすべて最新のIDEに対応しました。 書き込み機にSnapを使用することを想定しています。SNAPを使用するにあたり、一度でも高電圧書き込みを行ったPICマイコンには書き込みができないため、新品のPICマイコンを使用するか、PICkit4などの高電圧書き込み可能PICプログラマでプログラムすることになります。同梱のlcd_bar_16f1827.X.production(HVP).hexを使用するか、main.cのLVPのパラメータをoffにして再ビルドしてdistフォルダー内の*hexをご使用ください。 |
Date | version | Build | Folder | Device | note |
---|---|---|---|---|---|
2010/3/31 | 1.71 | MPLAB8.40,Hitech PICC Pro lite mode v9.70 | C:\picsrc\piccpro\lcd_bar | PIC16F88 | PIC16F88の最新版 アップデートは以降PIC16F1827にて行います。 なお、ハードウェアは変更ありません。 |
USBを差込み、電源を入れ、適当なオーディオソースを入力すると、LCDが音の強弱に対応したバーグラフを表示します。
表示 | 機能 | 詳細 | 初期値 |
---|---|---|---|
通常時 | 電源を投入すると、バージョン表示のタイトルデモ画面が表示されたあと、音声が入力されていればバーグラフが表示されます。 無音がしばらく続くと、約3秒の時間を使ってゆっくり暗くなります。 モードボタンを押し続けると、現在のバージョンを表示します。 |
N/A | |
モードボタンを押して0.5秒間 または、モードを押しっぱなしにした時 |
使用しているPICの型番と、現在のファームウェアバージョンを表示します。モードボタンを離すと設定1の項目に移ります。 | 2.20 | |
設定1 ガイドマーカー |
モードボタンを押すとガイドマーカー設定モードになります。値変更ボタンを押すと、ガイドマークの「’」が0から16の17段階で設定できます。これは3dB毎にマークを付ける機能であり、バーグラフには影響しません。 | 14 | |
設定2 コントラスト調整 |
LCDのコントラストを調整します。一番見やすくなるまで値変更ボタンを押し続けます。 LCD別の設定はこちら。 |
50% | |
設定3 オートバックライト設定 |
無音時から自動的にバックライトが消灯するまでの時間を設定します。2秒〜254秒までの2秒刻みで設定できます。 この秒数に更にフェードアウト時間の約3秒が加わります。 0秒にすると、手動設定のみとなります。手動のバックライトオンオフは、通常時に変更ボタンを押す事で切り替わります。 |
10秒 | |
設定4 バックライト最小値 |
バックライトの最小値を設定します。0が消灯し、1〜20の間で明るさを決めます。バックライトは現在設定された値での明るさとなっており、変更ボタンを押す事で変化します。 | 6 | |
設定5 バックライト最大値 |
バックライトの最大値を設定します。21〜63の間63が一番明るくなります。バックライトは現在設定された値での明るさとなっており、変更ボタンを押す事で変化します。 | 63 | |
![]() |
設定6 表示単位 |
バーグラフの表示単位を設定します。 dBv:【対数変換式】従来の1バー=1dBv Volt:【直接表示方式】電圧による直接の表示 BoostV:【直接表示方式】電圧による直接の表示で電圧レンジを持ち上げています。 【対数変換式】 |
dBv |
設定7 LR表示 |
左側にLRを表示します。その場合、3バーは表示が無くなります。 表示例はキャラクター種類のType3を参照してください。 |
No | |
設定8 キャラクタ種類 |
バーグラフのキャラクターを設定できます。タイプは4種類選ぶ事ができます。 | Type1 | |
設定9 バーグラフ応答性 |
バーグラフの応答性を0〜15の間で調整することができます。0はA/Dの即値を使用し一番早い動きですが、ちらつきが目立ちます。4〜8の間が妥当な調整となります。 ver1.61以降は数字のみで、右下に表示されます。 |
8 | |
終了 | 設定終了時に0.5秒間表示して終わります。 設定途中で電源を切ったりした場合は、設定されない項目がでる場合があります。 設定中は電源を落とさないように注意してください。 |
N/A |
キャラクター種類
Type1 ノーマル表示 | Type2 ブロック |
Type3 カジュアル音符 | Type4 ターゲット |
※表示例は一部旧バージョンが含まれています。
現象 | 対処 | 理由 |
---|---|---|
電源を投入した最初に一瞬バックライトが瞬く | セットボタンを一度だけ押してください。次回からその現象がなくなります。 | 手動バックライト設定があるため、最初にそのような現象が現れます。使用できるプログラムの空き容量が増えたら対策を実装したいと思います。 |
電源を入れても何も表示しない | 電源を入れて数秒後にmodeボタンを押し、 2秒程経ってから更にmodeボタンを押して、setボタンを押し続けてみてください。 |
LCDが見えない時にコントラスト設定に入る手順です。使用しているLCDのコントラストが、初期値では表示出来ない値かもしれません。 |
何も繋いでいないのに、レベルメータのバーが出ている。 | PICマイコンの12,18ピンをオペアンプの出力と切り離し、GNDと5Vに10KΩ程度の可変抵抗器を取り付けてテストします。 | オペアンプ側の回路かPIC側の回路かの不具合切り分けを行います。テスターがあれば、無音かつVRをGNDいっぱいに回してU1の5,10と6,7番とGNDラインが0Vであるかを確認します。5,10番に既に電圧が出ていれば、前段アンプ、6,7番に電圧が出ていれば後段アンプになにか問題があります。両チャンネル同じ現象であれば、電源の配線などを疑ってみてください。アナログ回路の配線を今一度チェックして見てください。 |
昔ラジカセについていたLCDのVUメーターのイメージもあって、さほど期待をしないで作りましたが、実際に動かしてみると追従性はかなりよく、音のモニター用として実用的な回路になりました。
最初はダイオードの整流回路で実験しましたが、音が聞こえるのにメーターが振れないといった事があり、それもそのはず、ダイオードの電圧降下が無視できないので理想ダイオード回路にしました。これで1024段階の3段目(電圧でいうと約6mVから)からメーターとして機能できるようになりました。
回路も比較的簡単で、5V単電源で動作するので、バックライトが青などの液晶などを使って自作パソコンに組み込んだりするのにも最適と思います。
以下は現在公開している情報のリリースノートとなります。改良するヒントなどとしてお役立てください。
SC1602Bや今回使用したキャラクタLCDモジュールは、ユーザーフォントが最大8種類まで作成する事ができます。
このLCDはグラフィックは使えませんので、ユーザーキャラクタを利用して擬似グラフィックを実現しています。
キャラクター間は約1ドット分のスペースがあるので、そのデザインに合わせるために一つ毎の縦の棒にしました。こうすれば、違和感がなくバーグラフを表示できます。一文字分で3種類のグラフィックを用意します。3種類x16文字で合計48段階のバーグラフを実現しています。
バーグラフの表示は、正式なVUメーターの定義に基づく表示とは異なります。本来のVUメータの定義は正弦波1KHzで+4dBの入力があった時に0VU(dBでない)を指示するまでの応答時間が300m秒と定義されます。(積分コンデンサの交換など、調整次第ではそれに近づけることは可能です)
バーグラフの動きはソフトウェアで応答特性を調整していますが、ハードウェアの調整としてC1,C3の容量を0.1〜4.7uFの範囲で交換すると応答速度が調整できます。電解コンデンサでも良いですが、その場合は無極性(ノンポーラ)を使用するか、希望する値の倍の電解コンデンサをプラス同士を直列にして使用してください。ここら辺の調整は好みが出るようです。
約6ms毎にADコンバータを読みに行きます。ADコンバータで得られたデーターを修正移動平均処理によって平均化してバーグラフを滑らかに動作させる処理を行っています。設定は即値で動作する設定から、最大16倍平均化するように設定できますのでピークメータとしてもVUメータ(厳密ではないが)としても使用が出来ます。
A/Dコンバータでそのまま音のレベルを表示しても良いのですが、1バーグラフ=1dBvという表示にしたい場合もあります。その場合は対数変換を必要とします。トランジスタなどで対数アンプなどを作る方法もありますが、今回は外部回路を簡単にしたために、ソフトウェアで処理します。
対数変換テーブルをエクセルで作成し、そのデーターテーブルをプログラムに組み込みました。ADコンバータは10ビットなので、データーテーブルを8ビットにして、連続したデーターが昇順の法則が外れた時に、上位2ビットをセクターとしてアドレスを管理します。こうすればデーターテーブルを8ビットで処理できますし、8ビット分のデーターのみをEEPROMに記載するだけで済みます。取得した10ビットADコンバーターの値を下位8ビットと上位2ビットに分けて、上位2ビットでまずセクターを参照し、下位8ビットでセクター内のデータ比較をして、LCDのバーグラフ位置を0〜48の値で取り出しています。今回のバーグラフは1バー=1dBvに対応させるため、外部オペアンプで約3.6倍した電圧を入れると対応するようにしました。3.6倍という数字は+5dBmを5Vのダイナミックレンジギリギリまで使うようにする値から求めたものです。
ADコンバータの値に対するバーグラフの値
バーグラフの対数直線性
10ビットのADコンバータで、5V単一駆動ですので、下のレンジではどうしても解像度が荒くなってしまいます。それなので、最初の6ステップ位はおおよそのレンジ表示になります。しかしながら、簡単なハードウェアと実用性を考えこのままでいく事にしました。興味のある方は電圧のレンジを上げたりするともっと性能が引き出せると思います。エクセルの計算表(エクセル側で、ツール→アドインより分析ツールを導入する必要があります)
LCDへのデーター転送は、一般的な4ビット方式で使用しています。
コントラストについては、大抵の場合はハードウェアで電圧をコントロールするのですが、今回は内部のPWMモジュールを利用しています。このようにすれば、USBの電源がパソコンやハブなどの環境で4.5V〜5V位のバラツキがあってもソフトウェアで簡単にLCDのコントラスト調整ができるので、その都度ドライバーなどで回して合わせる煩わしさから解消されます。LCDのPWMは約7.8KHzで発振させています。LCDの電源についてSD1602HUOB以外のLCDを使用する場合は電源にご注意ください。
殆どのメジャーなバックライト付LCDが使用できます。
各LCD別参考設定値
メーカー・型番 | 設定画面 | コントラスト設定の目安 |
サンライク SD1602HUOB SD1602VBWB-XA |
50% (初期値) |
|
サンライク SC1602BSLB-SO-GB-K |
80% | |
リンクマン TC1602E-13T(R) |
100% |
バックライトは約120Hzの64段階のソフトウェアタイマー割り込みによるPWMにて実現しています。使用するLCDによってはフリッカー(ちらつき)が目立つ場合もあります。気になる場合は、バックライトのLED部分に47〜100uF程度のコンデンサーを並列接続すると良いでしょう。その場合は、設定値より見かけの明るさが明るくなります。
製作する環境によっては、このPWMのノイズが回り込んでしまい、バックライトオフ制御にならない場合があります。特にResponseが0の場合は、ADコンバータの瞬間値を使いますので、その症状が顕著に現れる様です。その場合は回路のグラウンドの引き回しを見直したり、ソースファイル上のBacklight_Sensitiveの値を大きくして回避するなどしてください。
全波整流回路を簡単にするために、オペアンプは0Vから電源電圧までの出力が可能なオペアンプ(レイルトゥレイルという)を使用しています。信号がマイナス側に振れた時は、出力が反転してプラス側に振れ、信号がプラス側に振れたときは、抵抗2つを介して信号が抜けるようになります。この回路はバイポーラ型などレイルトゥレイルでないオペアンプでは構成することができません。またレィルトゥレイルであっても、入力信号が電源よりマイナスになることを許容していないオペアンプも使用ができません。今回使用したオペアンプはLMC660でしたが、音として利用していない事と、オーディオ帯域でそこそこの精度を出せるので妥協しています。オペアンプのロットによってオフセットのばらつきがあるものがあります。私が使ったものは、たまたま良かった模様ですが、特性が合わないと無音でも下のバーの1,2個が表示される、右と左のバランスが1メモリ位変わるなどの症状があります。現在の回路では調整できませんので、そのときはデバイスを色々交換することや、テーブルで下の10dBくらいを使わない、またはLとRでそれぞれの独立した変換テーブルなどで対応する方法が考えられます。
2024/10/22 LCD オーディオレベルメーターのソースコードをMPLABX8.20に対応
2011/10/18 一部文章修正等
2011/10/2 語句の誤り訂正 単純移動平均→修正移動平均
2011/10/1 旧ダウンロードファイル削除。説明修正。
2011/8/24 ver2.20 公開、トラブルシューティングを追加
2011/8/22 ver2.10 公開
2011/8/7 回路図ver1.3にする。パーツリスト修正。
2011/6/29 ver2.00 PIC16F1827対応
2010/3/31 ver1.71に差し替え
2010/3/14 ver1.70公開 LCDバックライト周波数を60Hzから120Hzに変更
2009/11/17 ver1.67公開 説明追加
2009/11/15 写真集を別ページへ移動
2009/10/23 ver1.65公開
2009/10/15 ver1.61公開
2009/10/11 直接表示方式としてver0.02をソースコードを含め公開
2009/10/5 ver1.42と リニアスケール表示実行ファイル(テスト版)0.01公開
2009/8/11 ver1.41公開
2009/5/8 ver1.40公開
2009/5/6 ver1.34公開
2009/5/3 ver1.33公開
2009/3/11 一部内容修正
2009/2/22 ver1.31公開
2009/2/18 オペアンプについて一部修正
2009/2/15 波形データ追加、ver1.20公開、内容の整理
2009/1/20 一部レイアウト変更
2009/1/18 一部修正、回路図修正
2009/1/16 ver1.11の公開
2009/1/13 ver1.10の公開
2009/1/12 lcd.cの修正
2009/1/4 ブロック図追加、文章追加
2009/1/3 初版作成
(C)2009-2024 air variable All Rights Reserved..