インターネットラジオ 第1作


更新: 2020/03/29, 2020/05/08, 2020/05/14, 2020/05/23, 2020/06/06, 2020/06/28, 2020/08/14, 2021/04/29, 2022/03/20, 2023/05/09, 2024/09/07

概要

  • VLSI Solution社のAudio encoder/decoderチップ "VS1063" を使った「録音機能付きFMラジオ」を今までに何度か挑戦した(FMラジオ15MP3プレーヤ第11作)が、どれも満足できるものでなかった。
    そこで今回は方向を変えて、インターネットラジオ方式で挑戦してみる。
  • 結果的にできたものは「インターネットラジオ受信機」というよりは「インターネットラジオ録音・再生機」である。
  • ハード構成は、Raspberry PI zero W + PWM方式オーディオ出力 + RTC(PCF8523) + PIC
  • ソフト構成は、mpv(リアルタイム受信)、ffmpeg(録音)、madplayer(再生)
  • 再生をMP3プレーヤ第14作(MP3_14)に任せる簡易機能を付けた。

回路

  • PICの機能は電源管理とRaspberryPIの稼働監視
  • 当初、PWMオーディオにLM386を付けて外部スピーカを鳴らすつもりだった。しかし作ってからノイズが酷くて実用にならないことがわかったので、イヤホン専用に変更するはめに。イヤホンで聞くとPWMのノイズはほとんど気にならないので製作を進めたのですが、事前の実験不足でした。
    (代わりに以前作成したMP3プレーヤ第14作(MP3_14)に録音データファイル(mp3)を直接転送して、そちらに再生させる機能を追加した。)
  • LCDは102x64/SPIコントロールのグラフィック型(Strawberry Linuxが扱っているこちら)。
  • RTCはPCF8523使用のこれSwitch Scienceで購入

ソフトウエア構成

  • リアルタイム受信は mpv を利用。リアルタイム受信中の任意な録音開始・停止の機能は付けていない。
  • 録音は ffmpeg を利用。URLを入力元、MP3ファイルを出力先、という使い方。出力フォーマットは MP3 固定。エンコーダはLAME
  • 録音のローカル再生は madplayer を利用。mpvでもよいが、MP3専用で比較的軽いmadplayerにした。
  • MP3プレーヤ第14作(MP3_14)によるリモート再生。
  • 以上の機能を制御するユーザインターフェースプログラム ir01 を作成した。
    • タクトスイッチとLCDのUI。文字は8x16または16x16のFONTXフォント。
    • 音量設定。mpv/madplayerどちらもamixerで音量設定が可能。リモート再生のときはMP3_14の音量設定コマンドを送信する。
    • 受信可能な局はURLとともにテキスト形式のマスタファイル(URLLST01.TXT)として用意しておく。
    • タイマー受信のスケジュールもテキストファイル(SCHDUL01.TXT)で作成して所定のディレクりに配置しておく。ir01はそれを読み込み、RTCのアラーム設定などを行う。
    • 録音したMP3ファイルの削除機能
    • 録音したMP3ファイルをMP3プレーヤ第14作(MP3_14)に送信する機能(scpコマンドによる)。
      (RaspberryPI zero W 間のファイル転送になるが、110Mバイトの転送に90秒ぐらいかかる)
    • そのファイルをMP3_14上でリモート再生する機能。
    • RTCの現在日時をNTPから取得して設定。
    • RaspberryPIの起動時に ir01 が実行される設定にした。

Raspbian のインストールと設定(OSなど基本ソフト)

  • 8GByteのmicro SD
  • 2017-03-02-raspbian-jessie-lite (書き込みソフトは Etcher-1.4.4-x64/Windows10)
    起動速度を考慮してあえて古いバージョンを使っている。
  • Windows上でRaspbianの設定
     ・config.txtを編集する(末尾に dtoverlay=dwc2 の行を追加)。
     ・cmdline.txtを編集する(行途中、rootwaitの後ろあたりに modules-load=dwc2,g_ether を追加)。
     ・bootディレクトリにsshファイルを作成する。(エクスプローラで新規作成→テキストファイル→ファイル名をssh)
     ・エクスプローラで「取り出し」実行
  • USBケーブル経由でログインできることを確認 (ターミナルソフトはTeraTerm。ケーブルは"USB"のポートに接続。ホスト:raspberrypi.local , ID/パスワードはpi/raspberry , ProtocolはIPv4 )
  • ホスト名変更 (raspberrypi → ir01)
     ・/etc/hostname
     ・/etc/hosts
  • 再起動。設定したホスト名でアクセスできること確認。
  • 起動時間短縮のための各種設定(おもにこちらのサイトを参考にした)
    • sudo systemctl disable dphys-swapfile
    • sudo systemctl disable keyboard-setup
    • sudo systemctl disable kbd
    • sudo systemctl disable triggerhappy
    • sudo systemctl disable plymouth
    • sudo systemctl disable plymouth-start
    • sudo systemctl disable ntp
    • /boot/cmdline.txt の行末に quiet を追加 (sudo vi /boot/cmdline.txt)
    • /boot/config.txt ファイル末尾に force_turbo=1 を追加 (sudo vi /boot/config.txt)
    • 再起動してUSBケーブル経由のログインができることを確認。(ケーブルは"USB"ポート / sudo reboot)
  • WIFI設定(dhcpcd有効)
    • sudo iwlist wlan0 scan
      あるいは
      sudo iwlist wlan0 scan | grep ESSID
      を実行してwifiネットワークを検出できるかを確認(出力結果に "ESSID:Buffalo ...."が出ている)。
    • wpa_passphrase "Buffalo-G-...(SSID)" を実行し、暗号化キーを入力。(SSIDをダブルクォーテーションでくくること)
      出力結果をコピーする。
    • sudo vi /etc/wpa_supplicant/wpa_supplicant.conf
    • ファイルの末尾にペーストする。
    • 平文で残されている暗号化キーの行を削除してから保存する。
    • sudo wpa_cli -i wlan0 reconfigure
    • sudo raspi-config → 4 Localisation Options → I4 Change Wi-Fi Country → JP を選択して再起動
    • 停止(sudo shutdown -h now) → USBケーブルをバスパワー専用(PWR)につなぎかえて再起動
    • ログインできること確認。
    • WinSCPもつながることを確認。
  • 以下、ダウンロードファイルからのインストール(.tar.gzなど)は /home/pi に置いてからインストールしている。
  • wiringPi-8d188fa.tar.gz [ (1)tar -xvf ... (2)cd ... (3)./build ]
  • UARTの無効化 [ (1)sudo raspi-config (2)5 Interfacing Options (3)P6 Serial (4)No/login shell disable (5)No/serial port disable (6)reboot ]
  • I2C/SPIの有効化 [ sudo raspi-config ]
  • BLUETOOTHの無効化 [ /boot/config.txt に dtoverlay=pi3-disable-bt を追記 ]
  • PWM Audioの有効化 [ /boot/config.txt に dtoverlay=pwm-2chan,pin=18,func=2,pin2=13,func2=4 を追記 ]
  • Audio出力先をHeadphoneに変更。 [(1)sudo raspi-config (2)7 Advanced Options (3)A4 Audio (4)1 Force 3.5mm (‘headphone’) jack ]
  • 停止 → テスト用フィルタ回路接続 → 起動
  • 適当なWAVファイルを再生できること確認 [ aplay wavファイル名 ]
  • sudo apt-get update
  • GITインストール [ (1) sudo apt-get install git-all (2) continue?=Y ]
  • openssl [(1)git clone git://git.openssl.org/openssl.git --depth 1 (2)cd openssl (3)./config (4)make (5)sudo make install ]
    (3時間弱かかった)
  • sshpassのインストール [ sudo apt-get -y install sshpass ]
  • TIMEZONEをASIA/TOKYOに変更 [ sudo raspi-config ]
  • ここまでのSDカードのイメージを作成しておく。(Win32 disk imager)
  • ntpdateのインストール [ sudo apt install ntpdate ]

Raspbian の設定(主にオーディオ関連のアプリケーション)

  • sudo apt-get update
  • libmp3lame-devのインストール [ (1) sudo apt-get install libmp3lame-dev (2) continue?=Y ]
  • mpvのインストール
    • sudo apt-get install mpv
    • mpvテスト:mp3ファイルの再生 [ mpv MP3ファイル名 ]
    • mpvテスト:インターネットラジオの再生 [ mpv URL ]
  • ffmpegのインストール
    • git clone git://source.ffmpeg.org/ffmpeg.git
      (1時間強かかった)
    • cd ffmpeg
    • sudo ./configure --enable-openssl --disable-ffplay --disable-ffprobe --disable-doc --disable-decoders --enable-decoder=aac* --enable-decoder=mp3* --disable-filters --disable-bsfs --enable-bsf=aac_adtstoasc,mp3_header_decompress --disable-encoders --enable-encoder=libmp3lame --enable-libmp3lame
    • (configureのオプション選択について。httpsのサイトのため--enable-opensslを指定。エンコーダはmp3/libmp3lameだけ。demuxerは取捨選択する知識がないのですべて。muxerは不要にも思えるが、muxer関連のソースらしいrawenc.cの中の関数が使われていたりするので、結局muxerもすべて。)
    • make
      (1時間半掛かった)
    • sudo make install
  • madplayのインストール
    • libid3tag-0.15.1b.tar.gz [(1)tar -xvf ... (2)cd ... (3)./configure (4)make (5)sudo make install]
    • libmad-0.15.1b.tar.gz [(1)tar -xvf ... (2)cd ... (3)./configure (4)Makefile編集 (-fforce-mem を削除して保存) (5)make (6)sudo make install]
    • alsa-lib-1.0.28.tar.bz2 [(1)tar -xvf ... (2)cd ... (3)./configure (4)make (5)sudo make install ]
      alsa-libのバージョンはraspbian-jessie-liteにインストール済みのaplayのバージョンに合わせた。
    • sudo /sbin/ldconfig
    • madplay-0.15.2b.tar.gz [(1)tar -xvf ... (2)cd ... (3)./configure --with-alsa (4)make (5)sudo make install ]
    • madplayテスト:MP3ファイルの再生 [ madplay MP3ファイル ]

作成したプログラム

  • ディレクトリ /home/pi/ir01 作成
  • ir01の下にソースとフォントファイル転送
  • make
  • ディレクトリ /snd/_ir01 作成 (sudoで)
  • sudo chmod 777 _ir01
  • /home/pi/ir01/ir01.sh を crontabの@rebootに登録して自動起動する。[(1) sudo crontab -e (2)テキストエディタ選択 (3) @reboot /home/pi/ir01/ir01.sh 追記 (4) 保存 ]
  • chmod +x ir01.sh
  • ソースはこちら
    • ir01.c ... 作成したプログラムのメイン
    • URLLST01.TXT ... 受信対応局のリスト(2022/03/20 NHKのURLが古い。最新版はこちら。)
    • SCHDUL01.TXT ... 録音スケジュール例(PCで作成して転送する)
    • pic/ir01.c ... PICのPG。CCS社のPIC18用コンパイラ(PCH V5.046)で開発した

実装

TAKACHIのLCS145H-M2-WGに収めた。
このケースはMP3プレーヤ第14作(MP3_14)のコントローラに使うつもりで LCDとタクトスイッチの配線はできていたのだが、MP3_14の計画変更によりお蔵入りになっていたもの。

動作検証

  • 快調に動作するように見えたが、録音中にffmpegがフリーズする現象に遭遇。wifiをノートPCと共有しているのが原因か?
    普段でもページ遷移などでつまづいた状態になることがあり、ffmpegのハングもその時に発生しているようだ。とりあえず録音中はそれ以外のネット利用を控えるようにする。
    一応プログラムでも出力ファイルのサイズの増加が止まったらffmpegをkillしてから再起動するようにしてみた(これが機能するかどうかは未確認 → 機能することを確認した。頻発するようなら対策を考えたい。2020/06/28)(この機能によっても対処できずに録音ができなかったことが一度あった。そのときはPCからのネットアクセスも変だったので回線の問題かもしれない。利用しているネット回線はケーブルテレビ。2020/08/14)。
  • やはりまれにffmpegがつまづいて、音の欠落が発生する。頻度は多くないが気になるので受信PGを独自に作成してみることにした。→改修PG(2024/09/07)

結果

  • タイマー録音&再生機としてようやく満足できるものができました。
    毎週聴いているNHK-FMの番組の録音にフル稼働しています。
  • 課題:リアルタイム受信中に随時録音開始・停止ができるようにするにはどうしたらよいだろうか。ffmpeg(を構成するライブラリ)の深いプログラミングが必要になる?
  • 課題:オンデマンドの放送局を受信するには? オンデマンドの場合UIで先送り・巻き戻しなどができるので、UIプログラム経由でないと困難か?
  • (2021/04/29加筆) 完成から1年を経たが、ほぼ連日NHK-FMの録音をしている。公開されているわけではないURLの決め打ちだが、NHKの都合で変更されることもなく来ている。RTCのバッテリもまだもっている。
  • (2022/03/20加筆) 今まで使ってきたNHKのURLが使えなくなった。URLLST01.TXTの変更を行う。RTCのバッテリは依然としてもっている。
  • (2023/05/09加筆) ついにRTCのバッテリが尽きたので交換。3年以上持ったことになる。

改修PG (2024/09/07)

  • ffmpegがまれにつまづいて受信データの欠落が発生するので独自に受信PG(playlistとstream)を作成
  • PGのHTTPクライアント部分はhttp-client-cを改造している。
  • 受信データのCODECはそのまま。MP3への変換はPCで行う。
  • ソースはこちら
    • ir01.c ... 作成したプログラムのメイン
    • URLLST01.TXT ... 受信対応局のリスト
    • playlist ... 主としてNHK受信PG
    • stream ... その他のInternet Radio受信PG(Jazz24とVenice Classicでテスト)


トップページに戻る