Raspberry Pi Zero PWMオーディオを試してみる
Pi Zeroにはオーディオジャックがありません。
GPIO端子を利用して内装音源から音を出す方法が公開されているので試してみました。
参考サイト
adafruit.com Pi Zero PWM Audio
othermod.com Raspberry Pi Zero Audio Circuit
adafruit.comではGPIO端子にPWMを割り当てるため2つの方法が紹介されています。
両方試してみましたが音を出すだけならばDTOを利用するのが簡単です。
Option 1. Use Device Tree Overlay
/boot/config.txtに追記
dtoverlay=pwm-2chan,pin=18,func=2,pin2=13,func2=4
次にraspi-configを実行してHeadphoneに切り替えます。
# raspi-config
7 Advanced Options → A4 Audio → 1 Force 3.5mm (‘headphone’) jack
準備ができました。
さすがに直にアンプに接続してみるとガーガーピーピーいいます。
まずは仮で簡単にフィルタのテストをしてみます。
フィルタの解説についてはothermod.comのページを参考にしてみました。
フィルタを組んでテストしてみると大きな問題があります。
1.音の出だしの1回目のみかなり強烈なポップノイズが発生する、またシャットダウン時にも発生。
2.マイクロSDへのアクセス時にノイズが載る。
PWM変換ノイズはある程度フィルタで除去できますがマイクロSDへのアクセス時に発生するノイズは可聴音のため完全に除去することは困難と思われます。再生音自体はまあまあそれなりにいい音がしていると思います。
シャットダウン時のポップノイズについてはothermod.comのページにあるように抵抗の入れる位置を変更することにより除去することができました。
最初のポップノイズ発生時は出力端子に+の電圧が発生、10uFのコンデンサが充電して以降は発生しません。シャットダウン(リブート)はーの電圧が発生して10uFと150Ωの抵抗の時定数でうまく相殺されるものと思います。聴感上はオリジナルの回路と比べても変わらないと思います。
以上から音楽再生用としての使用はかなり厳しいと思いますが音を出す何かの実験用にはUSBポートを消費しないことからも有用と思います。
簡単にユニバーサル基板に組んでみることにしました。
以前Pi1BでポップノイズによってPAMアンプを壊してしまった経緯があることからトランジスタを追加しています。完全に抑えることはできませんがPAMアンプを壊さない程度まで小さくすることはできます。フィルタの抵抗値は手持ちの関係から変更しています。コンデンサも聴感上あまり変わらないので10nにしています。
最初の再生時にポップノイズが発生することから起動時に1回喋らせることにしました。
スクリプトを作成します。aplay実行後もマイクロSDにアクセスがあるので30秒のsleepを入れています。
/root/pwmaudio.sh
#!/bin/bash gpio -g mode 27 out gpio -g write 27 1 sleep 1 aplay /usr/share/sounds/alsa/Front_Center.wav sleep 30 gpio -g write 27 0
# chmod 755 /root/pwmaudio.sh
/etc/rc.localに追記、起動時に実行します。
fi
/root/pwmaudio.sh > /dev/null 2>&1
exit 0
実験環境
RUNピンにタクトスイッチを取り付けたのですがZEROの場合はLEDが消灯、消費電力もかなり少ないためシャットダウン後のパワースイッチとしても使えそうです。
但しUSBポートに接続している機器はやはり電力を消費していますが!
テストはradikoとaudio playerにはAudaciousをインストールして試してみました。
radikoやAudaciousは一旦稼働してしまえばマイクロSDにアクセスすることは少ないのでまあまあ使えるレベルかと思います。但しほかのアプリケーションを起動するとノイズが乗ってくるのがわかります。
マイクロSDアクセス時のノイズはボリューム(alsamixer)を0にしても発生するためアナログラインに直接飛び込んでくものと思われます。
USBポート一つのZEROにとってはマイクロSDアクセス時のノイズが無ければ充分実用になるのですが次期の改善に期待したいと思います。
[…] 普通のRaspberry Piと違ってZeroにはオーディオ出力機能が付いていません。しかし、GPIOピンのPWM機能を使って音声出力することが出来ます。単純にコンデンサを通して音声出力するだけだとかなりノイズが載って耳が痛い上に音量も小さいのでCRローパスフィルタで16kHz以上をカットし、オペアンプでヘッドフォンを駆動できるぐらいまで増幅しました。回路が悪いせいかオペアンプは相性があり、LM358ではなくNJM4580じゃないと音割れして使えませんでした。ただ効果はそれなりにあって、音質もまあまあいいしSDの読み取り時のノイズも低減したような気がします。 […]