ラズパイ Zero によるインターネット・ラジオ 
[ はじめに ]
 先に、後閑哲也さんの
「PICと楽しむRaspberry Pi 活用ガイドブック」に基づいて「赤外線リモコン付きインターネットラジオ」の製作を「Raspberry Pi 3 B+」を使って実行しました。その続きで、安価で小サイズの「Raspberry Pi Zero WH」でインターネット・ラジオを作って、気軽に、常に音楽を流して置きたいと思いました。「ラズパイ3 B+」に比べて面積にして4割ほどで、価格も2〜3分の1ですから気楽に使えますね。
初期の「Raspberry Pi Zero」と違い、WiFiは使えます。ですが何点か問題があります。
@ スピーカー端子がない。 A USBコネクタは、マイクロが1つしかない。B HDMI は Mini-HDMI である。
・・・などです。
それで、この「ラズパイZero WH 」でインターネット・ラジオを製作するに当たって、追加の材料を入手しました。
@ マイクロ USB - USBx4 ハブ。 A Mini-HDMI - HDMI 変換コネクタ。B マイクロ USB - USB 変換コネクタ。
C USB オーディオアダプタ。
・・・などです。
基本的に、この「ラズパイZero WH 」の通常の操作は、リモート・ディスクトップで扱うつもりですので、最終的には「Mini-HDMI - HDMI 変換コネクタ」や「マイクロ USB - USBx4 ハブ」などは不要なのですが、「SDCard Copier」「Raspberry Piの設定」など、幾つかのメニュー項目が、実機のディスクトップからでないと起動できないようなので、有った方が安心ということで、それらも入手しました。ですが後で、これらのメニューも 「リモートディスクトップから起動できる方法」が分かってまいりましたので、それらのツールも結果的には不要でした(笑い)。

「PICと楽しむRaspberry Pi 活用ガイドブック」の中に、「OSのインストール」「リモートディスクトップ化」「ラズパイのIPアドレスを固定する」「GPIO関連(RPi.GPIO,WiringPi,WebIOPi)ツールのインストール」「MPD と MPCのインストール」などについて詳しく解説されていますので、これらの基本設定は書籍を参照するか、WEBからの情報によって、済ませておいてください。これらの設定は、ラズパイを扱う上での基本的な設定ですので、インターネットラジオに限らず有用だと思います。
私は、「ラズパイZero WH 」に使うSDカードは「赤外線リモコン付きインターネットラジオ」で使用した「ラズパイ3 B+」の SDカードをコピーして「ラズパイZero WH 」に挿して、変える必要の有るところだけ(IPアドレス固定の設定など)を変更して使いました。「ラズパイZero WH 」には、オーディオ出力コネクタが付いていないので、この後の作業を進めるのは、手探りとなり、やや困難 (できますが手応えが無い場合も有り)ですので、私と同じようにされるとやり易いのではないかと思います。下の写真は、今回、製作したものの動作中の様子です。





スピーカー (RECCARZ SP2040)は、重低音が出ますということで Amazonから入手(850円程度、その後値上がりしている) しました。小型・安価ながら結構良い音を出していると思います、ボリュームも付いています。このスピーカーの電源は USBのオスですので、上の写真のようにラズパイの +5V(コネクタピン4)と GND(コネクタピン6)から取っています。「ラズパイ2, 3」の場合でしたら、そのまま USBコネクタに挿せます。USBオーディオ 変換アダプタ(VENTION)は、同じく Amazonから入手(900円程度)しました。これは、通常のUSBですので、別途、マイクロUSB - USB 変換コネクタを付けています。なお、ヒートシンクを付けていますが、それほど熱をもたないので必ずしも必要はないです。余っていたので付けただけですから・・・(笑い)


【 1 】リモートディスクトップ
下図が Windows 10 パソコンから起動した画面です。「ラズパイ3 B+」などに比べると、表示までの速度と処理速度は、さすがに遅いですが、本体にディスプレイ・キーボード・マウスを付けなくとも操作できる快適さは得難いものです。



ディスクトップの画面に「シャットダウン」「再起動」のショートカットが配置されています。これは、リモートデスクトップのメニューからは、この2つのコマンドを実行できないので、同様の動作をするショートカットを作っています。このショートカットの作成手順については、ここを 御参照ください。このリンク内に詳しく解説されています。解説は「シャットダウン」だけですが、「再起動」も、コマンドを「sudo reboot」とし、「アイコン」を変更すれば対応できます。「ラズパイZero WH 」の通常の操作は、このリモートディスクトップのみを使うことにしていますので、このショートカットは先のリンクを参照して、是非作ってください。バックアップのための SD Card Copier もコマンドを「env SUDO_ASKPASS=/usr/bin/pwdpic.sh sudo -AE dbus-launch piclone」 とすることで起動できることが分かったのでこれもショートカットを追加しました。

【 2 】USBオーディオ変換アダプタを使えるように設定
これに付きましては、このリンクに大変お世話になりました。参考にした部分は、
USB-Audio変換アダプタをデフォルトのサウンドデバイスにする内容(下記)を /home/pi/.asoundrc に記入しました。次のコマンドを実行します。

sudo nano /home/pi/.asoundrc

そして、新しい .asoundrc ファイルを編集します。それに下記の内容を記入します。

リスト1


なお、これは隠しファイルになっているので、ファイルマネージャのメニューの[表示]-[隠しファイルを表示する]にチェックを入れないとファイルマネージャには表示されないことにご注意ください。

次に、USBスピーカーの優先順位を上げなければ、音がでません。順位を確認します。
cat /proc/asound/modules
0 snd_bcm2835
1 snd_usb_audio

USB は、2番目になっています。このままでは、音がでません。

「USBスピーカーの優先順位を上げる」についての情報は、WEB上にたくさん有るのですが、指示通りにしても優先順位が上がらなかったりして、色々と試行錯誤しました。最終的に、あるリンクを参照して実行した次の作業でOKとなりました。
専用の設定ファイル /etc/modprobe.d/alsa-base.conf を新規に作り、その中に次のように記入することでカードの認識順序を変更でき、優先度を変更できました

sudo nano /etc/modprobe.d/alsa-base.conf

実行すると、何も書いてない alsa-base.confファイルの nanoエディタが立ち上がります。そしてそこに、以下の3行を記入します。

options snd slots=snd_usb_audio,snd_bcm2835
options snd_usb_audio index=0
options snd_bcm2835 index=1

保存して終了し、再起動します。これで音がでました。ちなみに順位を確認してみます。
cat /proc/asound/modules
0 snd_usb_audio
1 snd_bcm2835

確かに、順位が変わっています。


【 3 】MPD と MPCのインストール
インターネットラジオの本体である MPD と MPC のインストールは、次のコマンドで一緒にインストールします。

sudo apt-get install mpd mpc

次に、外部アクセスができるようにコンフィグレーションを修正します。 nano エディタで、mpd.conf ファイルを開きます。
sudo nano /etc/mpd.conf

開いたら 84行付近にある bind to address "localhost" を、外部アクセスを許可するためにコメントアウト(行の先頭に#を記入)します。
また、 253行付近にある mixer_type "software" を見つけて、これがコメントアウトされているので、先頭の # を消して有効にします。ただ、これらの行番号は、取得時期によって変わるようなので同じ文字列を探してください。
これで音量調整が mpc からできるようになります。
[Ctrl + O] で上書きし、[Ctrl + X] でエディタを終了します。

次に、局リストを作ります。作り方は、「書籍:PIC と 楽しむ Raspberry Pi」 の記述からは多少変わっていますが、何とか対応できると思います。参考に、私の 30局の分の局リストを掲載します。
いずれにしても、Web上や書籍のデータは、1, 2 年で次々変わってまいりますので、感を働かせて対応していかなければなりませんね。

リスト2-局リスト


上のリストの 全ての範囲をドラッグして選択します、その状態で右クリックしてコピーします。それをエディタに貼り付けて、「名前を付けて保存」で名前を test.m3u とし、 /var/lib/mpd/playlists に保存してください。
スピーカーが生きており、局リストが /var/lib/mpd/playlists に入っていれば、この時点で以下のコマンドでラジオが聞けます。
局リストのファイル名は先程、指定した test.m3u です。以下を実行して確認できます。
mpc clear
mpc load test
mpc playlist
mpc play 27
このインターネットラジオではリモコン(選局・Volume)は付けていません、ですので、それらの操作は、リモートディスクトップの Terminal を使ってコマンドで操作します。その他の mpc コマンドの詳細は、先の書籍に記入(WEB上にも沢山あり)されていますので、ご参照ください。
注意!:文字コードは UTF-8 で保存しなければラズパイで動かす時にエラーとなります。
      ラズパイ側のテキストファイルは UTF-8 でなければなりません。


【 4 】起動スクリプトの制作
ラズパイに電源が入ると自動的に起動されるファイル(start_radio_shutdown.py)を作ります。下に、そのリストを載せます。

リスト3-start_radio_shutdown.py


上のリストの 全ての範囲をドラッグして選択します、その状態で右クリックしてコピーします。それをエディタに貼り付けて、「名前を付けて保存」で名前を start_radio_shutdown.py とし、 /home/pi/radio(書籍では Radio) に保存してください。私は、ディレクトリ名を小文字スタートにしていますが、統一すれば良いだけです。
 なお、コードを見ていただければ分かると思いますが、リモートデスクトップを使わなくてもシャットダウンできるように、GPIO番号17(コネクタ番号11)を 3.3V(コネクタ番号1)に2〜3秒接続するとシャットダウンに入ります (注意:GPIO番号17の隣は GNDですので 3.3Vをショートさせないようにしてください)。


【 5 】自動起動の設定をする
下記の文を実行し、nano エディタで rc.local ファイルを開いてください。

sudo nano /etc/rc.local
開いたファイルの最後( exit 0 の前の行)に、次の文を記入してください(ホルダ名が radioに成っていることに注意、Radioにしているなら変更)。

python /home/pi/radio/start_radio_shutdown.py &

これで、インターネットラジオが自動起動されます。start_radio_shutdown.py の中でOSが完全に立ち上がるのを待つタイマーを入れていますので、ラジオの音が出るまでかなり待たされます(1分ほど)。

次に、定期的にコマンドやプログラムを実行させるファイルを編集します。下記のコマンドを Terminal から実行します。
crontab -e

エディタが立ち上がるので、このファイルの最後に、下記の文を追記してください。
00 0-23/3 * * * mpc play 27

これは、連続で稼働させていると、たまに再生が止まったり、飛々再生になっている時があり、そのための対応です。その状態になっている時にリモートディスクトップを起動して再度、mpc play 27 を実行すると、通常の再生に復活しますので、この対策を追加しました。追記した処理の内容は、3時間ごとに mpc play 27 を実行するようにするものです。一瞬、音が途切れますが、それほど違和感なく使えています。たまに再生が異常になる理由は分かりませんが、たぶん、環境が違えば(別のラズパイZeroなど)、この処理は不要になるかもしれません。

局リスト:27番の局は、連続で「癒やし系」の音楽を流し続けています。もし、他の局がよろしければ、リモートデスクトップを接続してターミナルから mpc play XX で変更してください。XX は、私の局リストの場合 1〜30です。このコマンドで気に入った局が見つかりましたら、その局を通常の再生の局にするために、 start_radio_shutdown.py の中の局指定の mpc play 27 や上記の crontabファイルも変更してください。音量も変更できます。mpc volume コマンドで、現在の設定が % で表示されます。mpc volume 90 で 90%に変更できます。mpc volume +1 で 1% UP、-10 で 10% DOWN となります。

もちろん、「赤外線リモコン付きインターネットラジオ」のようにリモコンも付けられますし、GPIOを使ってのスイッチでのコントロールもできますが、ただ今回は、連続で音楽を流し続けるのが目的でしたので、一切を省略して簡素な構成にしました。また追加として、長時間使っていると、ハングアップすることがあるので、
こちらを参照して、ウォッチドッグタイマーを設定しました。

追記
 上記のウォッチドッグタイマーの設定をしていたのですがハングアップしました。まったく音が出なくなっていたので「リモートデスクトップ」の接続を試みましたが、これも接続できませんし、ping も通りません。それでも電源を入れ直しましたら問題なく動作を再開しました。ラズベリーパイが立ち上がり、ラジオが再生された時に、再確認のため、もう一度フォークボム(
:(){ :|:& };:)を撃つとキチンと再起動します。そういうことでしたので、遠隔地ではないのですが、このインターネットラジオにも、「ラズパイのハードウェアWDT基板」を取り付けました。


【 6 】その後の追加の変更について
 上記の追記の「ハードウェアWDT」を付けて、一年ほど運用をしてまいりました。その途中、選択している局の放送が中止になったりして、局を変更したりしました。しかし、ハングアップすることはありませんでした。それでも、先日、ラジオの音がまったく出なくなっていましたので、リモートディスクトップを接続(ハングアップはしてなく、接続できました) して、以下のコマンドを実行しました。



その結果、「mpd error: Timeout」のエラーが出ていることが分かりました。つまり、これが発生しても、「ハードウェアWDT」のチェック用のパルスを停止するようなことには、ならなかった様です。また、ラズパイが元々持っているWDTにも引っ掛らなかったわけです。この「mpc play 3」などは、【5】で述べていますように、定期的にコマンドやプログラムを実行させる crontab で実行しています。それで追加の対策として、この crontab の設定を、
1時間ごとに実行するように変更し、さらに「mpc play x」のコマンドでエラーになる場合は、ラズパイを再起動するように変更いたしました。
下図は、その crontab -e を実行した時の、変更した設定内容です。



コマンド crontab -e を実行して、元の行をレム(#を行頭に入れる) にして以下の行を追加します。
00 * * * * sudo python /home/pi/radio/crontab_set.py
つまり、crontab_set.py を1時間に一回実行するように設定します。crontab_set.py の中身は以下で、保存場所はこの場合、 /home/pi/radio です。



このファイルの内容は、「mpc play 7」 を実行し、そのコマンドの応答の中に "[playing]" という文字列が含まれているかをチェックして、含まれていれば何もしない、含まれていなければ、ラズパイを再起動( sudo reboot ) すると言うものです。つまり、「mpd error: Timeout」 が出るときは、 "[playing]" という文字列は出ません。
これらの追加の対策を入れることで、既に入れている WDT(ラズパイ本来の物 + ハードウェアWDT) の働きと相まって、見かけ上、ラジオの受信ができなくなることは、今のところ無くなりました。

【 追 記 】
2022,5,7 インターネットラジオから、どのチャンネルでも単に、同一のメッセージが流れるようになりました。
おそらく、同一 のMACアドレス で、長い間、聴取し続けると、ある一定の料金を支払わないと続けて聴取できないようになったようです。料金は、わずか(約1円/日)ではありますが、この時点で、聴取することを中止しました。
2023,4,27 久しぶりに電源を入れて再生を開始したところ、連続して元のように動作していることが分かりました。どのような対応がなされたのかは分かりません。とにかく現在は、従来通り稼働しています。
Reported by TokioYamada@ADK
汎用製品通販のページへ        ラズパイのハードウェアWDTの製作へ         USB-IOのページへ