カテゴリー
オーディオ

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

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

概要

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

「Raspberry Pi Pico で オーディオ用レベルメータ」への5件の返信

国野さま
唐沢です。
本が届きました。P56 リスト4-7 受信プログラム example16_udp_logger.pyがそのまま使えそうです。
このソースの一番最後、print(‘,’+udp,flush=True) の+udpの意味がよくわかりません。+は、何の意味があるのでしょうか?

よろしくお願い申し上げます。

お買い上げいただき、どうもありがとうございました。
ご質問の+は、文字列’, ‘と文字列変数udpを結合する文字列用の演算子です。
本書P.32のリスト3-2 ⑥ に同じような例を、次のP.33の左上から説明を書かせていただいていますので、そちらも合わせてご覧いただくと、理解が深まると思います。

国野さま

唐沢俊一と申します。 
突然メッセージで失礼します。

「超特急Web接続!ESPマイコン・プログラム全集[CD-ROM付き] (ボード・コンピュータ・シリーズ)」
を購入し、esp-wroom02にディジタル方位センサー(gy723)をI2Cで接続、723のライブラリを使って方位角度(0〜360度)のデータを取得することに成功しました。
このシステムから計測された方位角度データを無線LAN(UDP)でラズベリーパイに飛ばすことにも成功しました。国野様の本を参考にしてラズベリーパイ側ではnet catコマンドを使って受信、表示させています。
このシステムはアマチュア無線のアンテナの向いている方位を計測するために用いています。この方位角度を見ながらアンテナをモーターで回転させています。

ここで質問があります。
ラズベリーパイ側で受信したデータをPythonかC言語で処理をさせたいのですが、以下の本が参考になるでしょうか?

[購入検討中の書籍]
Pythonで作るIoTシステム プログラム・サンプル集 (ボード・コンピュータ・シリーズ)

初歩的な質問で申し訳ありませんがお知恵を
拝借させていただきたくよろしくお願い申し上げます。

2022年12月1日
唐沢俊一 JA0HFG

唐沢様

コメントいただき、ありがとうございます。
また、小生が執筆させていただいた書籍を活用されているとのこと、とても嬉しいです。

ご質問いただいた「Pythonで作るIoTシステム プログラム・サンプル集」でも、同様(CSV×UDPブロードキャスト)の方法で、送信機とラズベリーパイでの受信機を紹介しています。お持ちの書籍(ESP書)では、C言語、Bashスクリプトで解説させていただいていた内容を、主にRaspberry Pi上のPythonで書かせていただきました。
ページ数の割合としては、センサ側(送信器)の記事の方が多いですが、全体としては、それらのデータを受信して活用するまでを解説していますし、受信側の活用方法の内容も、ESP書よりも充実していると思います。
以上の通り、Pythonで処理させるのであれば、役立てていただけるものと思っていますが、念のため目次をご覧いただいてから、検討していただければ幸いです。
第5章を中心に、基礎として1章~4章、応用として10章と12章が参考になると思います。
https://shop.cqpub.co.jp/hanbai/books/59/59891.html

今後ともよろしくお願いします。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

 - 
Chinese (Simplified)
 - 
zh-CN
Chinese (Traditional)
 - 
zh-TW
English
 - 
en
French
 - 
fr
German
 - 
de
Italian
 - 
it
Japanese
 - 
ja
Korean
 - 
ko
Russian
 - 
ru
Spanish
 - 
es