Pimoroni Pirate Audioをラジオにしよう - takao-t/piradio GitHub Wiki
特に何も持ってないんだけど、やってみたいという場合にはRaspberry Pi Zero WHとPimoroni Pirate Audioを買うのがお勧めです。Pi Zeroがまだ買いにくい状況にあることがちと難点ではありますが。
Pimoroni の Pirate Audio はI2SのDACとSPIのIPS液晶をコンパクトにまとめてPi Zero用のいわゆるHATで、これを入手するだけで自分で音楽プレイヤーが作れるというものです。
https://shop.pimoroni.com/collections/pirate-audio
日本国内ではおなじみスイッチサイエンスから購入できます。
https://www.switch-science.com/catalog/list/699/
4種類あるので、どれを買えばいいの?と思うかもしれませんが使い方次第です。違うものを買うと流用しにくいので注意してください。
一番「ラジオ」っぽいのは"Pirate Audio Speaker"なのですが、Radiko等の高音質なものを使うのにはちょっともったいない気がします。外付けの3.5φで入力できるパワードスピーカー(PCの外付けスピーカーとか)を使うのなら"Pirate Audio Line-out"を買うといいでしょう。スピーカーに直に繋ぎたい場合には3Wパワーアンプを搭載している"Pirate Audio 3W Stereo Amp"があります。
"Pirate Audio Headphone Amp"というのもあるのですが、これはちょっと悩ましいですね。有線ヘッドフォンを挿して使うだけなので。
なお、Pirate AudioのシリーズはRaspberry Pi Zeroではなくとも、Pi3やPi4にも挿して使えます(40Pソケット)。ですので、筐体を工夫して使うのであればPi3やPi4でもかまいません。
単に挿すだけですが、挿してぶらんぶらんで使うとおっかないので3Dプリント可能なフレームを用意しています。
https://www.thingiverse.com/thing:4420857
フレームだけで使用してもかまいませんし、スタンドに乗せても便利なように設計してあります。スタンドに乗せる場合には2.6x25mmのネジがあればフレームに固定した上で、さらにスタンドに固定できるようにしてあります。スタンドは中抜け部分があるのでサポートを付けないと少しタレる部分が出るのですが、サポート無しでも何とか出力できます(PLA)。
Raspbian改めRaspberry Pi OSをイメージをダウンロードしてmicroSDに書き込んでください。この時、どのイメージを使うべきかなのですが、microSDの容量が厳しいというのでなければ"Raspberry Pi OS (32-bit) with desktop and recommended software"を使ってください。後でパッケージを追加する手間と時間が省けますので。
Pi Zero W(WH)を使う場合に面倒なのがこれで、有線LANポートがないのでいきなり無線LANで接続しなくてはなりません。しかもディスプレイやキーボードを接続しない、ヘッドレス運用でセットアップを行いますので以下の手順で行ってください。
イメージを書き込んだら、書き込んだmicroSDの『開ける』部分を開いて、ssh という名前でファイルを作成します。 拡張子はなしの ssh だけです。もうひとつ、wpa_supplicant.conf というファイルを作成します。このファイルの中身は以下のように書きます。
network={ ssid="WiFiのSSID" psk="WiFiのパスワード" }
これでmicro SDをPi Zero W(WH)に挿して電源を入れれば起動し、WiFiに接続されます。
え?アクセスポイントを持っていない?すぐに買いに行って!
sshでログインしてこれだけはやって!
- raspi-configで
- Boot OptionsでDesktop/CLIをCLIに
- LocalisationでChange TimezoneをAsia/Tokyoに、言語(Locale)はお好みで
- Interfacing OptionsでSPIを有効に
再起動が完了したら
apt-get update apt-get upgrate
を実行して更新しといてください。
ちなみにこの記事ではパーミッションのことはあまり考えてないのでroot(sudo -s)でやって。
次に /boot/config.txt を編集します。Pirate Audioを使うのでオンボードのオーディオアウトは要らないので、止めてしまいます。 以下の行を探してコメントアウトします。
# Enable audio (loads snd_bcm2835) #dtparam=audio=on
ファイルの最後の行に以下の2行を足します
dtoverlay=hifiberry-dac gpio=25=op,dh
これで再起動するとSPI液晶とDACが使用できるようになります。
ここまでの設定でI2SのDACとLCDが使えるようになっているのですが、1点問題があります。Pirate Audioに使用されているI2S-DACは音量コントロールがないように見えるため、スピーカー直結やヘッドフォンを使用する場合には音量が調整できません。ラインアウトのタイプはパワーアンプ側(要はパワードスピーカーとか)で音量を調整すればよいのですが、音量調整が効かないと不便な場合には以下の設定を使います。
/usr/share/alsa/alsa.conf の一番下に以下を追加します。
pcm.softvol { type softvol slave { pcm "plughw:0" } control { name "SoftMaster" card 0 } } pcm.!default { type plug slave.pcm "softvol"; }
Pi Zeroのオンボードのオーディオを無効にしているので"plughw:0"に設定しています。オンボードオーディオが有効のままの場合には"plughw:1"になりますので注意してください。
設定したら speaker-test -c 2 を実行してみてください。何かを繋いでいる場合にはザーという音が出るので注意です。テスト後にamixerコマンドで確認すると以下のようにコントロール先として'SoftMaster'が出てくるはずです。
# amixer -c 0 scontrols Simple mixer control 'SoftMaster',0
この設定はラインアウト等の場合には要りません。ラインアウトでレベルを調整したい場合にはffplayのオプションで指定します。要するにボタン操作で音量変更を行いたい場合にだけ必要です。
ここまでセットアップできたらpiradioを入手してください。
git clone https://github.com/takao-t/piradio.git
適当なところに置けば大丈夫ですが、パスは一応気をつけといてください。以下の説明ではほとんどが相対になります。
入手したらまず液晶をテストしてみましょう。ST7789モジュールが不足しているので以下でインストールします。
pip install ST7789
インストールしたら piradio/PirateAudio で python ./image_disp.py color_bar.png を実行してみます。液晶にカラーバーが表示されたら動作はOKです。
TTFフォントが必要です。割と簡単でお馴染みといえばIPAフォントやM+あたりでしょう
https://ipafont.ipa.go.jp/old/ipafont/download.html
https://mplus-fonts.osdn.jp/about.html
ここでは mplus-1p-bold.ttf を例に使用しています。Pirate Audioの液晶は240x240ですがサイズが小さいのでboldが見やすい気がしています。まずはフォントを入手しておきPi Zeroに転送しておいてください。
別途入手するのが面倒!という場合にはパッケージでM+を入れてください。デフォルトではM+ 1P boldを指定しているので、以下の方法で使えるようになります(/home/pi/piradioで作業している場合)。
apt-get install fonts-mplus cp /usr/share/fonts/truetype/mplus/mplus-1p-bold.ttf .
ではPythonのプログラムを準備しますが、例えば /home/pi/piradioにgit cloneした場合、Pirate Audio用は /home/pi/piradio/PirateAudioの下に置かれるので、面倒のないように piradio に持ってきてしまいましょう。加えて設定情報ファイル、pirate_local_settings.py もコピーしておいてください。
piradio/ のディレクトリで
cp PirateAudio/piradio_pirate . cp PirateAUdio/pirate_local_settings.py .
を実行するだけです。
ここまでの設定と同じならば初期状態で動作するのですが、念のため確認しましょう。pirate_local_settings.py を開いて以下の個所を確認します。
# オーディオドライバ radio_audio_driver = 'alsa' # 出力デバイス # Pirate AudioのI2S DACを使用するので注意 radio_audio_device = 'softvol' # 音量調整デバイス(amixerの引数: -c0 -c1など) radio_volume_device = '-c0' # コントロールデバイス radio_volume_ctl = 'SoftMaster'
上の方で説明したSoftVolumeの設定に対応しています。
フォントにM+ 1P Bold以外を使用したい場合は次の個所を修正します。
#日本語フォント jp_font = "mplus-1p-bold.ttf"
デフォルトでは起動ディレクトリにあるフォント(TTF)を読み込んでくるので、カレントにフォントをコピーしたくなければフルパスで指定するだけです。
jp_font = /usr/share/fonts/truetype/mplus/mplus-1p-bold.ttf"
フォントは好みもあるかと思いますので、いろいろ調整してみてください。
デフォルトでは起動ディレクトリの下の stations/ というディレクトリに局リストとアイコン等を配置します。お住まいの地域判定にあわせて自動的に局リストとアイコンを取得してくるプログラムも用意してありますので、まずは以下を試してください。
cd stations python ../get_stations.py > station_list cd ..
これで自分の地域で使えるRadikoの局リストができあがります。
piradioのディレクトリで
python ./piradio_pirate.py
を実行します。起動して局リストが表示されるはずです。まずはこれで楽しんでください。
操作は以下のようになっています。
音量UP 再生/停止 音量DN 選局
たぶん普通の環境ならこれで再生できると思うのですが、もしうまくいかない場合には連絡をください。というのも東京以外の地域では試してないからです。
画面下にある緑のバーは音量で、下右に出る赤い線は再生中の意味です。
Raspberry Pi OS Liteからセットアップしたい場合は追加で以下のパッケージを入れてください。
apt-get install git python-pip python-pil python-spidev python-numpy python-requests ffmpeg pip install ST7789
プレミアム契約している場合には pirate_local_settings.py の以下の個所にユーザ名(メールアドレス)とパスワードを設定します。
# Radikoプレミアムでエリアフリーを使う場合には設定する radiko_user = '' radiko_pass = ''
プレミアム時には起動ディレクトリにcookieを保存します。もしログイン/cookie関係で挙動がおかしい場合にはcookieのファイルを削除してみてください(radiko.cookie)。Radiko関係の処理はradiko.pyで実装されているのでソースを追う人はご注意。piradio_pirate.py側にはRadikoの処理は入ってないです。
ラインアウトのPirate Audioの場合には音量を固定してしまえばいいので、選局をUP/DN両方につけることができます。むしろボタンが1個余ります。
まず pirate_local_settings.py の以下の個所を例にならって修正します。
# 制御用スイッチ:GPIO番号(BCM) # Pirate Audio上のプッシュスイッチ(TUNE_DOWNは使わない) # class CTRL_SW: # STARTSTOP = 16 # X # TUNE_UP = 20 # Y 20で動作しない場合は24に変更する # VOLUME_UP = 5 # A # VOLUME_DOWN = 6 # B # Line-out モデルの場合は音量調整要らないので以下の設定 # で音量調整なしがお勧め STARTSTOP = 20 # Y 20で動作しない場合は24に変更する TUNE_DOWN = 5 # A TUNE_UP = 6 # B
音量調整が要らないのでsoftvolも要りませんし、設定していない場合にはオーディオデバイスを以下のように設定します。
# オーディオドライバ radio_audio_driver = 'alsa' # 出力デバイス # Pirate AudioのI2S DACを使用するので注意 #radio_audio_device = 'softvol' radio_audio_device = 'plughw:0'
音量調整のないplughw:0を直接指定しているので、音量調整は効きません。ですが、デフォルトのままではレベルが少し高すぎる気がしています。出力レベルを調整するにはffplayのオプションで音量を下げてしまえばいいので、以下のようにffplayのオプションを追加します。
# ffplayのオプション FFPLAY_OPTIONS = '-vn -infbuf -nodisp -loglevel quiet -volume 50'
/etc/rc.local の下のほうに次の例をみて書いておいてください(exit 0の前)。
cd /home/pi/piradio;python ./piradio_pirate.py > /dev/null 2>&1 & exit 0
プログラム、get_stations.py はデフォルトではRadikoのAPIにしたがい、自分のエリアと判定された局のリストを取得してきます。エリアフリー等を使用したい場合には聴きたいエリアの局リストを取得する必要がありますが、特定エリアのリスト取得は以下のように行います。なお、アイコンのファイルが自動でダウンロードされるので stations/ のディレクトリで実行してください。以下の例では現在の局リストに追加を行います。
cd stations python ../get_stations JP1 >> station_list
JP1は都道府県コードです。'1' は北海道となります。都道府県コードは以下にあります。
https://nlftp.mlit.go.jp/ksj/gml/codelist/PrefCd.html
なお、頭に'0'が付く場合は0を省略してください。例えば秋田県はJP5となります。
全都道府県のリストを生成してしまえば簡単ではないかと思えてしまうのですが、注意が必要です。というのもエリアに依存しないラジオ日経などが重複して現れるからです。またpiradioの局選択方式では局数が多くなると操作性がかなり悪くなるという欠点もありますので注意してください。
局ロゴ(デフォルトは stations/ )の配置箇所にSYS_BLANK.pngを必ず入れておいてください。
画面書き換えの高速化のためロゴファイルの事前読み込みを行うようにした際の問題でブランク画像を読ませておかねいと辻褄があわなくなる問題解決のためです。