古いコンポのラジオチューナー(Onkyo T-422M)をRaspberry Pi (ラズパイ)とMicrochipのPICを活用してアンテナ接続不要のインターネットラジオチューナーに改造しました。基本的に操作はもともとの操作と同じにしたので、サイマル対応であれば海外のラジオ局も含めそのFMやAMの周波数で選局できます。Radikoに対応している民放ラジオに加えて、NHKラジオ、海外のラジオなどがインターネットラジオであることを意識せずにそのままコンポで聞けるのでとてもいい感じです。インターネットだけの放送のラジオ局も好きな周波数に割当することで受信できます。もちろん元々のリモコンも使えます(このコンポではアンプに付属のリモコン)。製作事例の紹介と備忘録を兼ねて資料として残しておきます。
- 1. このOnkyo T-422Mを改造!
- 2. このインターネットラジオチューナー(改造後)の機能
- 3. 構成
- 4. 改造後の外観
- 5. ブロック図
- 6. 回路図(図をクリックすると拡大します)
- 7. ハードウェア関係
- 8. ソフトウェア関係
- 9. システムの立ち上げ
- 9.1. Raspberry Pi Zero側のセットアップ
- 9.2. PIC18F側のセットアップ
- 10. 使い方
- 11. その他
- 12. 最後に
このOnkyo T-422Mを改造!
オンキョーのインテック275シリーズで1996年発売で、自分はインテック275一式(アンプ、チューナー、CDプレーヤー、MDプレーヤー、スピーカー)を当時購入しました (カセットデッキは別途) 。捨ててしまったCDプレーヤー以外は現在も動作良好です(アンプは2度ほど修理しています)。この中のチューナーを改造しようと思っていたのですが、なんとハードオフで同じ型番のチューナーを1500円で発見。表示も自分のよりも明るく元気!しかも、目立つ傷なし!一応FM/AMの受信確認すると動作しました。 ということで、自分のは失敗に備えて温存しハードオフで購入したものを改造することにしました。
ご注意:本記事の内容について、その一部または全てを実施される場合には自己責任において行って頂くようお願いします。
このインターネットラジオチューナー(改造後)の機能
- 操作はリモコンも含めてオリジナルのまま行える
- インターネットラジオ局は、受信周波数表示と紐付けしCSVファイルでLAN経由で登録
- インターネットラジオ局の再生スクリプトファイル名をCSVで登録。スクリプトを準備できればどの局も再生可能(な筈(?))。
- ネットの接続は安定接続のため有線LANを使用。改造後の外観に全く変化がないのも悲しいですし。
- 一定時間(15秒)音声の途切れがあった場合は、自動復帰動作に入る(特に海外のネットラジオ局だとたまに発生)。
- 音声出力はもともとのLINE出力端子を使用
- アンテナによるFM/AMラジオ受信不可。
- 自動時刻合わせのACCUCLOCKは対応しない。
構成
- インターネットラジオの受信部分にはRaspberry Pi Zero + DACボード + LANインターフェースボードを使用
- T-422M本体とRaspberry Pi ZeroのインターフェースはMicrochipのPIC18F26K22による
- 電源は5V電源ボードを追加(3.3Vは5Vからシリーズレギュレータで生成)
改造後の外観
改造後も前面は何も変わらないので背面のみです。LAN端子を追加しています。
ブロック図
色分けの意味は下記の通りです。T-422M部分は基盤を眺めて描いたもので、メーカー公式の情報ではありません。
色なし:T-422Mに元々あり、今回は動作に関係ないところ
黄緑: T-422Mに元々あり、今回の動作に関係あるところ
水色: 新規に追加するところ
赤色: カットするところ
回路図(図をクリックすると拡大します)
- PIC18F26K22(以下PIC18Fと表記):T-422Mの電源オン/オフ状態監視、Raspberry Pi Zeroの電源制御、T-422Mの受信周波数の監視とT-422Mへの受信可否の応答などを行います。 Raspberry Pi Zeroとのインターフェースは3.3Vのため電源電圧は3.3V。Raspberry Pi Zeroとのメインの通信はUART(EUSART)を使用します。
- FIP_PULSE:T-422Mに接続。T-422Mの電源オンとオフをパルス幅から判断します。電源オンとオフをH/Lの論理レベルで判断できる信号を見つけることができず苦肉の策。蛍光表示管の駆動パルスなのでLレベル:-15V、Hレベル:5Vの信号なのと、ヒゲ状のノイズ(グリッチ)がものすごく発生していたため、3.3V/0Vへのレベル変換とアナログ回路でLPFを装備(LPFのあとにはバッファを入れてあるのでPICの入力で信号はなまっていません)し、誤動作を回避しています。
- PLL_CLK, PLL_DATA, PLL_CS:T-422Mに接続。 T-422MのマイコンがPLL周波数シンセサイザIC (LM7001)に設定しているシリアル通信(SPI)のデータを監視しPIC18Fでデコード、 Raspberry Pi Zeroに所望のインターネットラジオ受信動作の指示をします。 Lレベル:0V、Hレベル:5VのためレベルシフタでHレベルを3.3Vに変換。反転タイプ(74HC4049)を使用しているのは、PLL_CS信号をPIC18FのMSSPに接続するにはハードウェアでの反転が必須であったためです (PLL_CLKと PLL_DATAはソフトウェアでの反転対応可)。バッファ数の関係でPLL_DATAは非反転、PLL_CLKは反転になるように接続しました。
- TUNED, STEREO:T-422Mのマイコンに接続する。T-422Mのマイコンはもともとはアンテナからの信号に対してラジオが受信できたのかとステレオなのかの判定をしているので、これらの信号を制御するとT-422Mのマイコンを騙せる。インターネットラジオなので周波数を変更した後に音がでるまで数秒(このシステムでは約5秒)かかりますが、ラジオ局が登録されているかどうかはPIC18Fで判定するため、TUNEDとSTEREOの表示は周波数の変更後即座に反映されます(ラジオ局が登録されていれば点灯、されていなければ消灯。)。これによってマニュアル選局のスキャン動作も改造前と同様に動作します。 実は、PIC18Fではステレオとモノラルの判定はしておらず、結果的にTUNEDとSTEREOは同時に点灯。STEREOの点灯は飾り状態(笑)。
- +5V (電源基板部分はこの回路図では省略):電源ボード(手持ちにあったものを使用、おそらくこのモジュールと同じ)に接続します。容量1000mAと十分です。
- J-Pi_Zero:Raspberry Pi Zeroのピンヘッダ(40ピン)用パターン部に直接配線しました。
- J-ENC28J60:LANインターフェースボードに接続します。背面へのLAN端子追加はこのケーブルを使用しました。USB端子はそのまま空けておきたかったのでUSB接続のLANインターフェースは使用しませんでした。速度もインターネットラジオ受信には十分です。
- J-PCM5102A:DACボードに接続。 Raspberry Pi Zeroにはアナログ出力端子がないのでこの基盤で対応します。安いですが音質良好、素晴らしい!コンポでの再生に十分な音質!
- J-PICKit3:PICKIT3互換品に接続(デバッグ時のみ)。PICのソフトウェアデバッグに使用。もう2,3年使っていますが安定動作しています。
- その他:Raspberry Pi Zero側のデバッグ用に、MiniHDMI→HDMI変換ケーブル、microUSBのケーブルなども準備しました。
ハードウェア関係
回路図のように製作は主にPIC18F周りの回路を組立し、各基盤を接続することになります。1台だけの製作なのでユニバーサル基板で作成しました。最近はプリント基板を自作されている方もいらっしゃるようなのでプリント基板の利用も興味はありますが、今回はコストパフォーマンス優先、かつ慣れている方法で行いました。
PIC18F基盤
PIC18F周りはこのような感じになりました。緑の基盤はRaspberry Pi Zeroです。ピンヘッダは取り付けずに、直接ピンヘッダのスルーホールに結線しています。この写真では、まだ2本を除いて他の基盤への配線はされていません。PICKit3のコネクタ以外は直接線材をはんだ付けして配線します。
製作時にハマったのが、ME6209という三端子レギュレーター。当初ピン配置を確認せずに配線し、はんだ付けしてから念の為にデータシートを再度確認すると、なんと昔からある78シリーズとピン配置が違っているではないですか。配線し直しは面倒でしたが、火入れ前(電源投入前)に気がついてよかったです。
Raspberry Pi Zeroの取り付け穴は、手持ちにΦ2.5のネジがなくΦ3.0のネジを大量に所持しているので、Anex ピンバイス とドリルでΦ3.0に広げました。
裏面です。チェック前に写したものなので一部はんだ付けの怪しいところ(はんだ付けしていないところ)があります。(T-422M本体のスーパーキャパシタ交換の際、最終形で写真を撮り直しました。2022/5/30)
DACボード、電源モジュールボード実装
DACボードはT-422Mのケースの底に穴を追加し、ネジとスペーサー(15mm)、絶縁ワッシャで固定しました(写真左下の黄色っぽい基盤)。DACボードにはフォーマット選択のジャンパピン(I2SとLJ(Left-Justified))があるので、I2Sを選択します。
DACボードのRCAピンジャックは使用しないので取り外してしまい、シールド線(写真では赤と白の線)でT-422MのLINE出力部分に基盤にはんだ付けし接続しました。T-422Mのメイン基板のLINE出力部分は元の回路と絶縁するためパターンカット(基盤裏面)しました(写真撮り忘れてしまいました。)。
電源モジュールボードは、絶縁スペーサー(10mm)とネジ、ナットで同じくT-422Mのケースの底に穴を追加し固定(写真左上、上から2番目のボード)。電源モジュールボードへのAC100Vはトランス(緑色のテープが巻かれている部品)の基盤から配線しています。出力の5V側はこの時点ではまだ未配線です。
DACボード付近画像
PIC18Fと接続するためのレベル変換部実装
T-422Mのメインボード上のフロントパネル側につながるフラットケーブルの手前側に、レベルシフタ用のIC( U1 74HC4049)の足を大開脚後切断してからメインボードに接着し、U1の周辺回路を基盤レス実装(空中配線)。ちょうど良いところに部品が何もないスペースが空いていてラッキーでした。FIP_PULSE信号は、フロントパネルへのフラットケーブル写真上部の右から7番目の足に直付け。写真は フラットケーブルはつないだまま) フロントパネルを元の位置から一旦外して撮影しています。
T-422Mと追加回路の接続箇所
各接続箇所は写真に赤色でマークした箇所となります(J116, R720, R721, R722, R723, R724)。+3.3VとGNDはPICの基盤にも接続します。TUNEDとSTEREOの信号は基板上で元の信号を切断(J103, J104削除)して、プルアップ抵抗(33kΩ)を元の基板の穴を利用して斜めに挿入し接続しています(J101, J104付近、写真右下赤枠部分)。J104の上のジャンパ(部品番号が既に見えず)は、元のジャンパ線を細いジャンパ線に変えてプルアップ抵抗の足と共挿ししています。
LAN端子の取り付け穴加工
バックパネルの穴あけ位置にマーキングして、電動ドリルとヤスリ(手作業)で現物合わせしつつ加工しました。
LAN端子を仮止めしてみました(最終的に黒いネジで止めました)。ピッタリ収まりました。端子名の表示はなくてもわかるし、裏面なので付けません。(余談ですが、昔はよくケースのアルミのパネルにインスタントレタリングで文字を転写していました。今は世の中にもう無い(?))
LANインターフェースボードの実装
LANインターフェースボードはトランスが取り付けられている金具に穴を追加しトランスとは反対の面に樹脂スペーサー(10mm)と樹脂ナットで取り付けました。LANインターフェースボードと背面のLAN端子まではこのケーブルで接続しています。
同じ写真のAC100Vがつながっている基盤(写真左上)は、もともとヒューズの実装はなかったのですが、基盤パターンが用意されていたのでジャンパ線を削除し、ヒューズホルダとヒューズをついでに取り付けておきました。写真では一部のみ写っています。
Raspberry Pi ZeroとPIC18Fの基盤実装
DACボードの更に上に覆いかぶせるようにして取り付けました(写真左下)。他のボードと同様に、ケースに穴を追加工しスペーサー(35mm)とワッシャ、ナットで取り付けました。写真ではデバッグ用にMiniHDMI→HDMI変換ケーブル、microUSB-USB変換ケーブル、PICKIT3互換品も取り付けてあります。必要な基盤はいい感じでケース内に収まりました。
Pi ZeroとPICの基盤部分のクローズアップ
PIC18Fの基盤とRaspberry Pi Zeroの基盤への配線は電線を直接半田付けしています(LANインターフェースボード側とDACボード側はコネクタ使用)。PICkit3(互換品)接続の部分はピンヘッダで着脱できるようになっています。
PIC18Fを取り外し状態での画像
横からの画像
ソフトウェア関係
PIC18F側
MPLAB X IDE v5.35上でC言語で制御ソフトのNetTuneを作成しました。MCCという便利なものが使えるので、対応できるところはMCCでコード生成して、それ以外の部分を作成しました。
主な機能
- T-422Mの電源ON/OFFの監視とRaspberry Pi Zero、LANインターフェースボードとDACボードの電源供給ON/OFF制御
- インターネットラジオ局が登録されている周波数のテーブルをRaspberry Pi ZeroからUART経由で受信(T-422Mの電源ONの都度)
- T-422Mの選局操作の監視と必要に応じて、選局された周波数情報をUART経由でRaspberry Pi Zeroへ送信、T-422MのTUNEDとSTEREO信号の制御
- インターネットラジオ再生中の音切れ監視(15秒間の無音でトリガー)とリカバリ動作をRaspberry Pi Zeroに要求
- 必要に応じてRaspberry Pi Zeroに対するシャットダウン指示
周辺モジュールと用途
PIC18F26K22で使用している周辺モジュールと用途は下記の通りです。TIMER3以外は割り込みも使用して処理しています。他に、モジュールではないですが、IOC(RB5でPCM5102AのDATA監視(音切れ監視用))も使用しています。LM7001とは、T-422Mで使用されているPLL周波数シンセサイザのICです。
周辺モジュール | 用途 | 割り込み |
EXT_INT (INT2) | LM7001への書込データの受信(CE) | 使用 |
MSSP1 | LM7001への書込データの受信(DATA, CLK) | 使用 |
EUART1 | Raspberry Pi Zeroとの通信 | 使用 |
TIMER1 | 音切れ時間計測 | 使用 |
TIMER3 | 電源ON/OFF監視(FIPパルス幅監視) | 不使用 |
メモリの使用状況等
下記はMPLAB X IDE v5.35のDashboard部分のキャプチャ画像です。メモリはデータ用、プログラム用共に10%も使用していません。データ用EEPROMは全く使っていません。なので、メモリが少ない版のPIC18F23K22でも大丈夫なはずですが、大は小を兼ねるということで一番デカイPIC18F26K22を使いました(周辺モジュールは同じです。)。
選局操作の検出
T-422Mではボタンやリモコンで選局操作がされると、受信周波数を変更するために、マイコンからPLL周波数シンセサイザのICであるLM7001に発振周波数の設定コマンドが送られます(すると、受信周波数が変わります)。このインターフェースはSPIなのでPIC18FのMSSPを使用して受信(のぞき見)できます(回路図のPLL_CLK, PLL_DATA, PLL_CS信号を使用。それぞれLM7001のCL, DATA, CE端子に対応しますが、CLとCEについてはハードウェアで極性反転しています。)。インターフェースの詳細はSANYO LM7001のデータシートに載っていますが、波形部分のみデータシートから引用しておきます。
T-422Mでは、この24ビットのデータの繰り返しが一番速いときは周波数をスキャンしているときで、81ms間隔となっています。この間隔以下で一連の処理をしないと取りこぼしが出てしまいます。
余談ですが、当初はT-422MとRaspberry Pi3のみで今回の製作を行う予定でした。ところが、Pi3のSPIのスレーブ動作での受信動作がどうやっても正常に動作しませんでした。しかたなく、S/P変換(シリアル-パラレル変換)を74HC595を3個使用して外付けし処理することを試しました。単発のデータの受信はきちんとできましたが連続受信では駄目でした。というのも、割り込みの応答時間(GPIOの入力が変化してから割り込み処理ルーチンの呼び出しまで)が長いときは100msを超えていたために、データの取りこぼしが発生したためです(早く応答する方法もあるかも(?)ですが、OSに精通していないのでわからず)。結局、PIC18FとRaspberry Pi Zeroの組み合わせで行うことにしました。
音切れ監視について
音切れ監視はPCM5102AのDATA信号(音声のデジタルデータ)の監視によって実現しています。DATA信号はRaspberry Pi ZeroのPCM_DOUTから、L/R(ステレオの左右)のデータをサンプリングごとにシリアルデータで2の補数表現で送っています。
以下はTEXAS INSTRUMENTSのPCM510xAデータシートからの抜粋です。
PCM_DOUT信号はPIC18FのRB5にも接続してあり無音部分ではLレベルが連続するので、TIMER1を使用して1秒ごとにIOCの状態を確認し、15秒間Lレベルが維持されているかで判断しています。
音切れが検出されるとRaspberry Pi Zeroにインターネット接続が生きているかを問い合わせて、生きていれば再生スクリプトを再起動するよう指示します。インターネット接続が生きていることを確認できなければ、シャットダウンと再起動を指示します。なお、シャットダウン指示は最初コマンドでの要求を行いますが、失敗なら外部ピン(GPIO6を使用)から再度要求します。その際シャットダウンが行われないときには、一旦電源供給をやめて(荒治療です!)から再起動です。以上を自動で行います。
電源ON/OFF監視(FIPパルス幅監視)
T-422Mの電源スイッチのON/OFFの監視は、フロントパネルの蛍光表示管(FIP)の駆動信号のパルス幅で判断しています。つまり、電源ONのときはパルス幅が広く(458us)、OFFのときは狭い(122us)であることを利用しました。ちなみにパルスの周期は5.38msでした。パルス幅はTIMER3のゲートシングルパルスモードを使ってハードウェアで計測しています。
実は、当初電源スイッチのON/OFFに対応したレベル信号が存在してるだろうと踏んでいたのですが、そのような信号を見つけることができませんでした(なんとスイッチON/OFFに関わらず、メインボード上の各ICにも常時電源供給になっていました)。
その他
同一PORTのビット操作を連続して行うと意図通りに動作しないということに遭遇しました。データシートに特に注意書きはなさそうに思います。意図通りに動作するように当該箇所はウェイトとしてアセンブラのNOP命令を挿入しています。
例
PORTAbits.RA3 = 1;//Stereo indicator on
asm(“NOP”);
PORTAbits.RA4 = 1;//Tuned indicator on
Raspberry Pi Zero側
net_radio_tuner (ソースコード:net_radio_tuner.c, lm7001_t-422m.h, command.h)を作成しました。インストールについては、システム立ち上げの項目に記述してあります。
主な機能
- インターネットラジオの再生スクリプト情報をCSVファイル(radio_player.csv)で登録(Radiko再生のスクリプトやNHKの再生スクリプト、直接指定のURLの再生を行うスクリプトなど。)
- 周波数とインターネットラジオ局の対応データをCSVファイル(station.csv)で登録
- PIC18FにUART経由でインターネットラジオ局が登録されている周波数のテーブルを送信
- PIC18FからUART経由で送信される周波数データに対応するインターネットラジオ局を再生/停止
インターネットラジオ局を再生するためのスクリプト
インターネットラジオ局を再生するためのスクリプトは、radio_player.csv で登録します。インターネットラジオ局は、ここで設定したいずれかの再生スクリプトで再生することになります。
第1項目:再生スクリプト番号(0-19)の1つ。昇順である必要はなし。
第2項目:再生スクリプト(コマンドラインからタイプする形式から、引数部分を省いたもの)
サンプル:
0,perl play_direct.pl
2,perl play_radiko.pl
3,perl play_nhk.pl
上記サンプルでのインターネットラジオの再生スクリプトは、ネット上の情報を元に動作の理解を兼ねてPerlで作成しています(自分が慣れている言語で作成しておくと仕様変更があったときに対応しやすいので)。いずれも-20dB~+3db(0dB: 100%)の間で音量設定でき、インターネットラジオ局間での音量差を低減できるようにしています。
- 指定URLの直接再生:play_direct.pl
- NHKのFM, AM: play_nhk.pl (こちらのホームページを参考に作成しました。)
- Radikoの再生: play_radiko.pl (こちらのホームページを参考に作成しました(バージョン2020-07-20まで)。いつも海外のFM局を聞いていて、Radikoが仕様変更で再生できないことに2020年12月31日まで気が付かず2021.1.2に変更。更に2023.5.3に再度変更。こことここのホームページを参考に変更しました(2021.1.2、2023.5.5追記)
T-422Mの受信周波数表示とインターネットラジオ局の紐付け
T-422Mの受信周波数表示とインターネットラジオ局とその再生スクリプトの紐付けは、station.csv で登録します。
第1項目:周波数(単位:kHz)
第2項目:コメント(ラジオ局名等)
第3項目:再生スクリプト番号
第4項目:再生スクリプトに対する引数
サンプル:
84700,FM YOKOHAMA,2,YFM -6
82500,NHK TOKYO FM,3,TOKYO FM
90500,Radio Gold,0,https://19183.live.streamtheworld.com/GOLD905AAC.aac?dist=radiosingapore -6
693,NHK TOKYO AM R2,3,TOKYO R2
954,TBS RADIO,2,TBS -6
Raspberry Pi Zero とPIC18F共通
UART通信
通信速度は115200ボーです。調歩同期ですが5cm以下の超近距離通信なので不安定になることはまずないでしょう。
このシステムでは基本的にはPIC18Fが主導権をもっているような感じで動作しています。ですが、Raspberry Pi ZeroとPIC18Fは、はっきりとどちらかに主導権があるわけではないです。どちらからも、相手にコマンドを送ることができるようになっています。
コマンドは0x80-0xff(1バイトでMSBが1)の中から割当しています(command.hで定義)。コマンドのあとにパラメータとしてデータ列が続く場合もあります。パラメータ部分の各バイトのデータは全てMSBが0となっています。元データのMSBが1の場合は、データ変換によってMSBが0となるように置き換えて送受信しています。送信は7バイト(8ビット✕7)ごとに8バイト(7ビット✕8)のデータ列に変換しています。受信は逆の変換をしています。
システムの立ち上げ
ハードウェアが完成した後にシステムの立ち上げを行います。
ソフトウェアのソースコード一式は以下からダウンロードできます。もちろんハードウェア一式を準備しないと動きません! 他のサイトなどに転載はしないようにお願いします。使用される場合は自己責任でお願いします。
PIC18F側のソフトウェア (転載不可。使用の際は自己責任にて。)
NetTune.X_20200428.zip (1491 ダウンロード )Raspberry Pi Zero側のソフトウェア(再生スクリプト以外)(転載不可。使用の際は自己責任にて。)
net_radio_tuner_20200504.tar (654 ダウンロード )Raspberry Pi Zero側のソフトウェア(再生スクリプト)(転載不可。使用の際は自己責任にて。)
player_20230503.tar (354 ダウンロード )Raspberry Pi Zero側のセットアップ
ACプラグは抜いておきます。
Raspberry Pi Zeroの5V電源は、最終的にはU2 PIC18FでON/OFF制御しますが、この時点では常時ONとなるようにしました。方法は、PIC18FをICソケットから取り外し、Q2 RN1201のベース(U2 PIC18Fの13ピン)を3.3V(U2 PIC18Fの20ピン)にジャンパ線(すずメッキ線)で接続です。後でICソケットから線が抜けないとかにならないように注意します。(実は、電源常時ONのジャンパピン(Q3のゲートをGND接続)と電源常時OFF(Q2のコレクタをオープン)のジャンパピンを立てておけばよかったと少々後悔。)
Pi Zeroには、miniHDMIでディスプレイ、microUSBでキーボードを接続しておきます。
度々ルート権限でコマンドを実行するため$ sudoを使用しています。$ sudoを使うには事前に設定が必要ですがここでは割愛します。(ググって解決できます。)
(以降の各設定が完了したら一旦シャットダウン ($ shutdown -h now)して、AC100Vのプラグもコンセントから抜き、U2のソケットに仮に取り付けていたジャンパー線(スズメッキ線)も外して、PIC18Fを元に戻すことになります。)
Pi Zero のOSのインストール
ラズパイの公式サイトにOSのイメージファイルがあります。今回はGUIは不要なので”Raspbian Buster Lite (Release date: 2020-02-13, Kernel 4.19)”をインストールしています。インストール方法(英語)も公式サイトに書いてあります。
要約するとOSのイメージファイルを、別のPCでWin32DiskImagerを使用してMicroSDカード(今回はこのMicroSDカードを使用)に書き込みし、それをRaspberry Pi Zeroに装着するというものです。日本語だとこちらの記事が参考になります。
MicroSDカードをRaspberry Pi Zeroに装着してACプラグをコンセントに差し込むとOSが起動されます。
まずは、ユーザー piでログインしますが、セキュリティ的には別のユーザー名を作成して作業したほうがよいでしょう。必要に応じて、$ raspi-configなどを使用してキーボードなどの設定を行います。詳細は割愛します。
Pi ZeroのLAN インターフェースボード設定
今回のLANインターフェースボードにはENC28J60が実装されています。ENC28J60を使用する設定を行います。このICのSPIインターフェースの最高周波数は20MHzとなっているので余裕を見て19.5MHzとしました。
/boot/config.txtに下記を追加します。
#enc28j60 LAN I/F
#SPI 19.5MHz
dtoverlay=enc28j60, int_pin=25, speed=19500000
/etc/systemd/networkに、下記内容の00-eth0.linkファイルを作成します。
[Link]MACAddress=XX:XX:XX:XX:XX:XX
MACAddress(XX:XX:XX:XX:XX:XXの部分)はLAN内で使われていない任意のものを設定します。 というのも今回使用したLANインターフェースボードには固定のMACアドレスは設定されていないためです。上記を設定してからPi Zeroを再起動します。(DHCP環境で使用しています。)
再起動後に $ ifconfigコマンドを実行してeth0が追加されていればOKです(YYY.YYY.YYY.YYYの部分は割り振られたIPアドレス、XX:XX:XX:XX:XX:XXの部分は00-eth0.linkファイルで指定したMACアドレス。**は伏せ字)。
****@raspberrypi:~ $ ifconfig
eth0: flags=4163 mtu 1500
inet YYY.YYY.YYY.YYY netmask 255.***.***.0 broadcast ***.***.***.***
inet6 ****::****:****:****:**** prefixlen 64 scopeid 0x20
ether XX:XX:XX:XX:XX:XX txqueuelen 1000 (Ethernet)
RX packets 174 bytes 32531 (31.7 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 90 bytes 10610 (10.3 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
device interrupt 160
lo: flags=73 mtu 65536
inet ***.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10
loop txqueuelen 1000 (Local Loopback)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
ちなみに、ネットワークの接続速度は3Mbit/s弱でした(speedtest-cli で測定)。遅いですが、ラジオのストリーミングのビットレートは3Mbit/sに比べれば全然低いので今回の用途では問題なしです。
LANインターフェースボードの設定が終われば、$ sudo raspi-configを実行し、[5 Interfacing Options] -> [P2 SSH]を選択して[Enable]へ変更すると他のPCからSSHでの接続もできるようになります。
Pi ZeroのDACボード設定
今回のDACボードにはPCM5102Aが実装されています。PCM5102Aを使用する設定を行います。
/boot/config.txtに下記を追加します。
dtoverlay=hifiberry-dac
DACボードをcard 1に固定するため、以下の内容の /etc/modprobe.d/alsa-base.conf を作成します。
options snd slots=snd_bcm2835, snd_soc_rpi_simple_soundcard
options snd_bcm2835 index=0
options snd_soc_rpi_simple_soundcard index=1
上記を設定してからPi Zeroを再起動します。
$ sudo aplay -lを実行し、pcm5102aが確認できればOKです。
******@raspberrypi:~ $ sudo aplay -l
[sudo] password for *****:
**** List of PLAYBACK Hardware Devices ****
card 0: ALSA [bcm2835 ALSA], device 0: bcm2835 ALSA [bcm2835 ALSA]
Subdevices: 7/7
Subdevice #0: subdevice #0
Subdevice #1: subdevice #1
Subdevice #2: subdevice #2
Subdevice #3: subdevice #3
Subdevice #4: subdevice #4
Subdevice #5: subdevice #5
Subdevice #6: subdevice #6
card 0: ALSA [bcm2835 ALSA], device 1: bcm2835 IEC958/HDMI [bcm2835 IEC958/HDMI]
Subdevices: 1/1
Subdevice #0: subdevice #0
card 0: ALSA [bcm2835 ALSA], device 2: bcm2835 IEC958/HDMI1 [bcm2835 IEC958/HDMI1]
Subdevices: 1/1
Subdevice #0: subdevice #0
card 1: sndrpihifiberry [snd_rpi_hifiberry_dac], device 0: HifiBerry DAC HiFi pcm5102a-hifi-0 []
Subdevices: 1/1
Subdevice #0: subdevice #0
ちなみに組み込まれているサウンドモジュール一覧は、$ cat /proc/asound/modules で確認できます。
実行結果:
0 snd_bcm2835
1 snd_soc_rpi_simple_soundcard
Pi ZeroのUART(BCM2835内蔵のPL011)設定
BCM2835内蔵のUART(PL011)をPIC 18Fとの通信に使用するために設定します。40ピンコネクタの8ピンがTXD、10ピンがRXDになります。
UARTの設定は本家のここ(英語)が参考になります。
/boot/cmdline.txtを編集します。
ファイルを開くと、console=serial0,115200 を含む記述があるので、console=serial0,115200の部分だけを削除します。
/boot/config.txtに下記を追加します。
enable_uart=1
上記を終えたら再起動し、ls -l /dev/serial0コマンドを実行します。下記のように、ttyAMA0にserial0のリンクが貼られていればOKです。
*****@raspberrypi:~ $ ls -l /dev/serial0
lrwxrwxrwx 1 root root 7 Apr 13 10:18 /dev/serial0 -> ttyAMA0
インターネットラジオの受信テスト
インターネットラジオの再生(受信)にはomxplayerを使用しています。次のコマンドでインストールします。
$ sudo apt-get install omxplayer
次のコマンドで無事に再生されれば、LANインターフェースボード、DACボード、Pi Zero間の接続と関連の設定はOKです。音声出力はもちろんLINE出力端子から出てきます。念の為いきなりアンプには接続せずに、オシロスコープで出力波形を確認してから接続しました。(下記のパラメータの –vol=0 ⇛ –vol 0 に訂正 2020.7.20)
$ sudo omxplayer -I –no-osd –timeout 60s –no-keys –vol 0 -o alsa:plughw:1,0 ‘ここにインターネットラジオのURL(https:/******m3u8とかhttps:/*****mp3のようなもの)’
Raspberry Pi ZeroのLEDの設定変更
Raspberry Pi Zeroのシャットダウン完了をPIC18Fで確認できるようにするため、LEDのGPIO 5にLEDの状態を出力します。通常はLで、シャットダウン完了でHになるようにします。
/boot/config.txt に下記を追記します。
dtparam=act_led_gpio=5
dtparam=act_led_trigger=default-on
dtparam=act_led_activelow=on
ログファイルの出力抑制 (2023/5/5追記)
Micro SDカード上の/var/logディレクトリにログファイルが作成されるため、SDカードの寿命に影響します。通常使用ではログファイルを参照することはないので下記変更を行います(変更を元に戻せば、ログファイルは作成されるようになります)。
/etc/rsyslog.confの最後の方に
#### RULES ####という項目があるので、#でコメントアウトされていない行はコメントアウトします。
例えば、
daemon.* -/var/log/daemon.log
を
#daemon.* -/var/log/daemon.log
とします。コメントアウトしたものはログファイル出力されなくなります。
ブートアップ時間の短縮
ブートアップするまでの待ち時間を短縮するための各種設定を行います。
MicroSDカードのクロックアップ
/boot/config.txtに下記を追記します。MicroSDカードのクロック周波数が100MHzになるとのこと。MicroSDカードが遅いものを使っていなければ問題なく適用できると思います。今回使用したものはこのMicroSDカードと同じものです。
dtoverlay=sdtweak,overclock_50=100
Swapファイルを使用しない
下記のコマンドを実行します。 Swapが使用されなくなったかどうかは $ free -hを実行してSwapのサイズが0なら使用されなくなっています。
$ sudo swapoff –all
$ sudo systemctl status dphys-swapfile
$ sudo systemctl stop dphys-swapfile
$ sudo systemctl disable dphys-swapfile
サービス停止
下記のコマンドを実行します。実のところ効果のないものも含まれているかもしれません。
$ sudo systemctl disable triggerhappy
$ sudo systemctl disable bluetooth.service
$ sudo systemctl disable wpa_supplicant.service
$ sudo systemctl disable rpi-display-backlight.service
$ sudo systemctl disable raspberrypi-net-mods.service
$ sudo systemctl disable hciuart.service
その他
/boot/config.txtに下記を追記します。詳細の説明はここにあります(英語)。
boot_delay=0
インターネットラジオチューナーのソフトウェアのインストール
ソースコードは下記の3つのファイルからなります。
- net_radio_tuner.c
- lm7001_t-422m.h
- command.h
3つのファイルをホームディレクトリにおいて、
$ gcc net_radio_tuner.c -o net_radio_tunerでコンパイルします。
同じディレクトリにradio_player.csvとstation.csvを作成して準備しておきます。
再生スプリクトのインストール
ホームディレクトリに下記のスクリプトをおいておきます。もちろん、これらで対応できないインターネットラジオ局用にオリジナルのスクリプトを使用することもできます。
- play_direct.pl
- play_nhk.pl
- play_radiko.pl
再生スクリプト(play_radiko.pl)を使用するために、下記コマンドでツールをインストールしておく必要があります(3つ目は2021.1.2よりxmllintを使用しているため追記)。oxmplayerも使用していますがテスト段階でインストール済みです。
$ sudo apt-get install swftools
$ sudo apt-get install rtmpdump
$ sudo apt-get install libxml2-utils
自動起動とGPIO6への入力でシャットダウンするための設定
PIC18FからRaspberry Piの電源供給がされてブートアップするときに、自動的にnet_radio_tunerが起動するようにします。また、GPIO6にパルス入力があったときに(実際は立ち上がりエッジで検出)シャットダウン動作するためにsystemdにサービスを登録します。こちらの記事を参考に作成しました。
下記のファイルをホームディレクトリにおいて、$ gcc shutdown-by-gpio6.c -o shutdown-by-gpio6 でコンパイルします。
- shutdown-by-gpio6.c
/etc/systemd/systemディレクトリに、以下のファイルをおきます。
- net_radio_tuner.service
- shutdown-by-gpio6.service
以下のファイル一式を/opt/netradio/bin/ディレクトリを作成してそこにコピーします($sudo が必要)。(ホームディレクトリにこれらのファイルを一旦置いていた意味は何なん(?)というツッコミはなしで。)
- net_radio_tuner
- shutdown-by-gpio6
- radio_player.csv
- station.csv
- play_direct.pl
- play_nhk.pl
- play_radiko.pl
以下のコマンドを実行してsystemdにサービスを登録します
$ sudo systemctl enable net_radio_tuner.service
$ sudo systemctl enable shutdown-by-gpio6.service
ここまで来たら一旦シャットダウン ($ shutdown -h now)します。AC100Vのプラグもコンセントから抜いて、U2のソケットに取り付けていたジャンパー線(スズメッキ線)も外して、U2 PIC18Fをソケット戻します。
PIC18F側のセットアップ
PIC18Fにソフトウェアを書込
PICKIT3互換品を基盤のコネクタに接続して、AC100Vプラグをコンセントに挿します。
PC上のMPLAB X IDEで File>Open Project からNetTune.X_****.zipを解凍して出来たNetTune.Xフォルダを開きます。
Shift+F11でビルドしてPICKit3経由でPIC18Fにソフトウェアを書き込み(Program Device for Production)します。書込ができたらPICKit3は外します。
使い方
インターネットにつながるLANケーブルを背面のコネクタに挿してしまえば、オリジナルのT-422Mと同じように操作できます。
電源ONしてからRaspberry Piのブートを行うので最初は音がでるまで45秒くらいかかります。その後は、周波数を変更すると、インターネットラジオ局が登録されている周波数だとTUNEDが即点灯し、各登録してあるインターネットラジオ局が再生されます。再生待ち時間は5秒くらいで、周波数を連続して変更しても待ち時間が累積してしまうということはありません。マニュアルチューニングでスキャン動作も問題なく行なえますし、プリセット機能も使えます。つまり、アンテナをつなぐ代わりにLANケーブルでインターネットにつないでいるというだけで操作は変わりません。
インターネットラジオ局を追加、変更したいときは、一旦インターラジオ局を登録していない周波数にしてから、別PCからSSHで接続し/opt/netradio/binのradio_player.csvとstation.csvを編集することで行なえます($sudo viや$sudo nanoなどを使用)。T-422Mの電源をOFFしてからONすれば変更が有効になります。ACプラグの抜き差しは不要です。一旦インターラジオ局を登録していない周波数に変更するのは、ラジオを受信状態(再生状態)の場合、もし途中で音声が15秒以上途切れて、かつ、インターネット接続ができていないと判断すると復帰のためにRaspberry Piを再起動してしまうので、それを避けるためです。
実はACプラグをコンセントに挿して最初の1回だけは、T-422M本体側とPIC18F側で設定されている周波数を一致させるために選局操作(周波数変更操作)をする必要があります。対策もできそうですがACプラグを挿して一度だけのことなのでそのままにしてあります。
その他
動作ログ
Raspberry Pi側のnet_radio_tunerは動作中に各種ログメッセージを出力しているのですが、systemdで起動しているのでLANでSSHで接続していてもそこには出力されません。
$ sudo journalctl |grep net_radio_tuner
を実行しログとして見ることができます(ただ時系列が微妙に違っていたり、抜けたりすることがある(?)詳細不明)。ただし、電源がオフすると消えてなくなります。
$sudo journalctl -f |grep net_radio_tuner
とするとリアルタイムに見ることもできます。
PIC18Fでのタイムアウトチェック禁止
PIC18Fのソフトウェア NetTune.Xのmain.cの割と最初の方に次の#defineがあり、コメントにしてあります。
//#define DISABLE_TIME_OUT
この#defineのコメントをやめると全てのタイムアウトチェックはされなくなります(もちろん再ビルド必須です)。タイムアウトチェックがあるとRaspberry Pi側のnet_radio_tunerが一定時間内に起動がされないと電源OFF/ONを繰り返してしまうので、net_radio_tunerを暫定的にホームディレクトリで動作させたいときなどには重宝します。
net_radio_tunerをマニュアルで起動するには、$ sudo ./net_radio_tunner のようにしてルート権限で実行します。
最後に
今回はなかなか満足の行く出来となりました(自画自賛 笑)。特に、セットアップしてしまえば海外のFM局をそのままの周波数で選局できるのと、オーディオ機器そのまんまの操作で使用できる点が気に入っています。毎日使っています!
インターネットラジオ製作を通して、Raspberry Pi ZeroでのGPIOの使い方とか、プログラムの自動起動の方法とか、Radikoの再生の方法などがわかったのも良かったです。PICマイコンも、TIMERやMSSP、EUARTもMPLABのMCCと連携しての使い方がわかりました。PICはネット上にデータシートや様々な情報が非常に充実しているのがお気に入りな点です(実はPICの関連書籍は1つも持っていないです)。
Raspberry Piもいろいろ種類がありますけど、組み込み用途では大きさと価格でPi Zeroは非常に魅力的なのですが、どの店でも一人1点のみの販売なのは残念です。しかも、最近は単体販売はほぼ売り切れですね。Pi Zero WもヘッダつきのWHしか売られてなくて、組み込みには使いづらいですね。
後半は写真なしで微妙に退屈な記事になってしまいました。お読み頂いた方々、ありがとうございました。