カテゴリー
オーディオ

Raspberry Pi Pico で オーディオ用レベルメータ

概要

Raspberry Pi Pico に キャラクタ LCD AQM1602Y を接続し、オーディオ入力に応じたレベルを表示します。ピークホールド機能も付けました。

LCDには、16桁×2行のタイプを使用し、写真のような33レベル×2チャンネルの表示を行います。

AQM1602Y-NLW-BBW(秋月):
https://akizukidenshi.com/catalog/g/gP-12485/

16桁×2行のAQM1602Y-NLW-BBWを使用し、33レベル×2チャンネルの表示を行った

機能

  • オーディオ入力レベルをLCDに表示
  • 表示レベルは33段階(無表示を含む)
  • 1V入力時を0dBV(全点灯)とした簡易測定表示
  • ピークホールド機能
  • 3種類のピーク計算方法に対応
  • レベルをLEDの輝度で表示
  • レベル値をシリアル出力

※レベルに応じた目安値です

回路図

Raspberry Pi Pico のGPIOに キャラクタ LCD AQM1602Y を、ADC入力にオーディオ・ジャックを接続しました。

Raspberry Pi Pico のGPIOに キャラクタ LCD AQM1602Y を、ADC入力にオーディオ・ジャックを接続する

オーディオ入力のGNDは、 Raspberry Pi Pico の33番ピンのGNDに接続してください(その他のGNDに接続するとノイズが混入しやすくなる)。

ブレッドボード実装例(LCD部)

コンデンサ(1uF)2個、抵抗(10kΩ)2個を下図のように接続しました。

コンデンサ(1uF)2個、抵抗(10kΩ)2個を接続した

Micro Python プログラム

作成したプログラムは、GitHubに保存しました。

レベルメータ用プログラム:
https://github.com/bokunimowakaru/audio/blob/master/meter/pico/meter_aqm1602.py

実行例

入力したオーディオ信号レベルに応じてメータを表示します。

下図は peakMode=”power” を設定した時の表示例です。10dBごとと主目盛、2.5dB毎に副目盛が表示され、-40~0dBまでを1.25dB毎に表示します。

ピーク計算モード

以下のようなピーク計算モードを実装しました。予告なく改良、追加する場合があります。

ピーク計算モードの違い

peakMode入力レンジ表示分解能想定用途
power-40~0 dBV1.25 dBアンプの歪み管理
voltage-32~0 dBV1 dBデジタル録音の歪み管理
vu-24~0 dBV0.75 dB試聴感に近いレベル表示

サンプリング方法

プルアップ抵抗33kΩを使ってDCバイアスを1.6V付近にオフセットし、直接(フィルタなしで)、ADCに入力しています。

本ソフトウェアはレベル表示用のため、サンプリング用のフィルタ処理は行っていません(Pythonの動作速度の関係で、オーバーサンプリングも出来ない。表示用のフィルタ処理は実施)。

サンプリング周波数fs÷2以上の周波数の信号については、そのまま折り返し周波数として取り込み、fs/2以下と同じ処理にてレベル表示を行います。fs以上の周波数も同様です。サンプリング周波数fsはシリアルに「Fs(kHz)=」で出力します。

応用例

下図は、アンプに接続した時の一例です。0.06Wの低出力アンプ(https://bokunimo.net/blog/information/2314/)に接続し、音量を上げたいときに歪まない領域内に入っているかどうかを確認するために製作しました。

低出力アンプの音量を上げたいときに歪まない領域内に入っているかどうかが確認できるようになる

工夫したポイント

  • 1文字を2分割し、8文字(または4文字)のフォントで表示分解能を高めています。
  • 通常のメータ表示に、主目盛、副目盛、ピーク・ホールド表示を合成しています。

これらの表示文字列を生成するプログラムを以下に示します。16文字分の変数textに、33段階のレベルと、主目盛、副目盛、ピーク・ホールドを表現することが出来ます。

for i in range(16):
    i22 = i * 2 + 1
    if i < level // 2:
        text[i] = 0x02
    elif i == level // 2:
        if i22 == level or i22 == peakDb[ch]:
            text[i] = 0x02
        else:
            if i==0 and peakDb[ch] == 0:
                text[i] = 0x00
            else:
                text[i] = 0x01
    elif i > 0 and i == peakDb[ch] // 2:
        if i22 == peakDb[ch]:
            text[i] = 0x03
        else:
            text[i] = 0x01
    else:
        text[i] = 0x00
    if dispScale > 0 and i % dispScale == 0 and text[i] < 0x04:
        text[i] += 0x04
text[i]16文字分の表示データ値(0x00~0x07)を格納
表示データ00=なし,01=左点灯,02=左右点灯,03=右点灯,04~目盛用
levelレベル表示用33段階(0~32)の値
peakDB[ch]2チャンネル(左右)分のピークホールド値(0~32)
dispScale罫線(目盛)の間隔

本製作品に関する注意点

  • 入力回路はノイズの影響を受けやすいので、最短距離で接続してください。オーディオ入力のGNDは必ず33番ピンを使ってください。
  • オーディオ信号の最大入力レベルは1Vです。1Vを超えると誤作動や、元の信号に悪影響を及ぼすので、直列に抵抗を入れてください。例えば、100kΩを経由すると7Vまで入力できるようになります。
  • 計測器ではありません。得られた値は目安値につき、測定対象の性能表示などには使用できません。

by bokunimo.net