カテゴリー
Raspberry Pi オーディオ

Radio & Jukebox 搭載 Raspberry Pi DAC

LCDとオーディオ用 DAC を接続したRaspberry Pi に、インターネット・ラジオ機能とジュークボックス機能を追加する方法について説明します。

概要

前回製作した オーディオ用 DAC 搭載の Raspberry Pi に以下の機能を追加します(他のDACであっても、正しく設定すれば動作します)。

  • LCD表示機能
  • ボタン操作機能(ボタン数1個→2個)
  • 日付&時刻のLCD表示機能
  • ジュークボックス機能(保存した楽曲ファイルの再生)
  • 楽曲ファイルのLCD表示機能
  • 自動起動対応(GPIO制御や、ネット接続が可能になるまで待機)
前回製作した オーディオ用 DAC 搭載の Raspberry Pi に、LCD表示機能、ボタン操作機能(ボタン数1個→2個)、日付&時刻のLCD表示機能、ジュークボックス機能(保存した楽曲ファイルの再生)などを追加する
(LCDの文字が2重に見えるのは撮影時の光源の影響)

操作方法

プログラムを実行すると、自動的にインターネット・ラジオを再生します。[NEXT]ボタン(2つあるタクトスイッチの右側)を押すと、チャンネルが切り替わります。予め10チャンネル、登録してあります。

[MODE]ボタン(左側のタクトスイッチ)を押すと、Musicフォルダ内の拡張子flacとmp3のファイルを再生します。再生中、アーチスト名と曲名がLCDに表示されます。また、[MODE]ボタンの長押しで、Raspberry Piをシャットダウンします。

ラジオ再生中の様子。操作してから1分後に、今日の日付と、現在の時刻を表示する
(正面から撮影するとLCDの文字が、はっきりと見える)

前回は

前回は、ハイレゾ対応の TI製 32bit 384kHz オーディオ用 DAC PCM5102A をRaspberry Pi に I2S 接続し、音楽を再生する方法について説明しました。

ユニバーサル基板に実装する

前回、ブレッドボードで作成した DAC 回路を、今回はユニバーサル基板に実装しました。

音質を向上させるために、DACのチャージポンプ用のコンデンサに、表面実装型のセラミック・コンデンサを用い、また電源用の電解コンデンサの合計容量を増やしました。DACの電源には、Raspberry Pi の5V入出力端子から3.3VのLDO型レギュレータを追加し、安定化させて電源供給しました。

音質を向上させるために、チャージポンプ用のコンデンサに、表面実装型のセラミック・コンデンサを用い、また電解コンデンサの合計容量も増強、電源は、Raspberry Pi の5V入出力端子から3.3VのLDO型レギュレータを経由して供給した
(※基板上方のプルアップ抵抗10kΩ×2個は不要)

使用パーツ

  • Raspberry Pi Zero 2W または 2/3/4など
  • 液晶ディスプレイ LCD AQM1602Y-RN-GBW × 1個
  • PCM5102A DIP化キット AE-PCM5102A(秋月電子通商)
  • 3.5mmステレオミニジャック MJ-8435
  • 2.1mm DCジャック MJ-60 × 1個
  • ピンソケット 40ピン(20×2) × 1個
  • ピンソケット 9ピン(9×1) × 1個
  • 電解コンデンサ 330μF 10V × 1個
  • オーディオ用電解コンデンサ 220μF 10V × 2個
  • オーディオ用電解コンデンサ 10μF 36V × 2個
  • 電解コンデンサ 10μF 16V × 2個
  • 電解コンデンサ 1μF 50V × 1個
  • 積層セラミックコンデンサ 1μF (LCD部) × 2個
  • 表面実装用チップ コンデンサ 2.2μF (DAC部) × 2個
  • 表面実装用チップ コンデンサ 0.1μF (DAC部) × 4個
  • オーディオ用コンデンサ 2200pF × 2個
  • 抵抗器 470Ω × 2個 (オーディオ・フィルタ部)
  • ポリスイッチ 500mA × 1個
  • タクト・スイッチ × 1個
  • LED × 1個、抵抗 × 1個
  • 片面ユニバーサル基板Cタイプ × 1個、ビニール電線
  • ケース、ビス、スペーサなど

配線例

Raspberry Pi Zero/2/3/4のピン配列と、今回、使用する信号ピンを下図に示します。

Raspberry Pi Zero/2/3/4のピン配列と、今回、使用した信号線

DACとの配線

DACとは、I2Sで接続しました。回路図を以下に示します。図中のコンデンサのうちの6個にはオーディオ用コンデンサを使用し(オーディオ用と記載)、また破線内のコンデンサ6個には表面実装用チップ型セラミック・コンデンサを使用しました。

6個のオーディオ用コンデンサを用いた。また破線内のコンデンサ6個(0.1μF×4個と2.2μF×2個)には表面実装用チップ型セラミック・コンデンサを用いた

表面実装用チップ型セラミック・コンデンサ(0.1μF×4個と2.2μF×2個)は、下図のように、DIP化キット AE-PCM5102A 基板上に実装しました。半田付け部は、レジスト(緑色の絶縁層)を削って、銅箔パターンを露出させてから半田付けします。

表面実装用チップ型セラミック・コンデンサ(0.1μF×4個と2.2μF×2個)はDIP化キット AE-PCM5102A 基板上に実装した。ICの少し上と下の半田ボールは、ユニバーサル基板の裏面のGNDパターンに接続する

GND配線は、ICの少し上と下の半田ボールから部品のリード線を使って、ユニバーサル基板の裏面のGNDパターンに接続しました。ユニバーサル基板の穴位置と少しずれているので、先にモジュール側に長めのリード線を半田付けしておき、ユニバーサル基板に実装後に、ユニバーサル基板側の半田付けを行いました。

液晶ディスプレイ LCDとの配線

LCDには、AQM1602Y-RN-GBWを使用しました。
(LCDの文字が2重に見えるのは撮影時の光源の影響)

LCDには、AQM1602Y-RN-GBWを使用した(LCDの文字が2重に見えるのは撮影時の光源の影響)

本例では、Raspberry Pi のI2Cインタフェース信号SCLとSDAを直結しました(I2Cリピータ不要、プルアップ抵抗不要)。LCDからの応答ACKをRaspberry Pi側で受信できない課題が生じますが、LCDへの表示だけであればACKを無視すれば動作します。

また、GPIO 16をLCD用の電源に接続することで、Raspberry Pi側からLCDの電源を制御できるようにしました。

本例では、Raspberry Pi のI2Cインタフェース信号SCLとSDAを直結(I2Cリピータ不要、プルアップ抵抗不要)

オーディオ回路で、最も悩むのはGNDの配線方法です。今回も、様々な接続方法を試し、音量を上げてもノイズが聞こえないように調整しました。下図は、最終的な配線例です。赤色の電源の電線と茶色のGNDの電線が、少し遠回りになっていることが分かるでしょう。

Raspberry Pi のI2Cインタフェース信号SCLとSDAを直結した(プルアップ抵抗は不要)。赤色の電源の電線と茶色のGNDの電線を、遠回りにして、ノイズを低減した

タクトスイッチとの配線

GPIO22に本体左側[MODE]ボタン、GPIO27に本体右側[NEXT]ボタンを配線しました。Raspberry Pi側で内部プルアップし、スイッチの片端はGNDに接続してください。基板裏面から見た配線図を下図に示します(グレーのNEXTとMODEの基板表面にタクトスイッチが実装されている)。基板表面の左側[MODE]ボタンは、裏面から見ると右側に位置します。

タクトスイッチ(写真のグレー色[MODE]と[NEXT]部)の配線図。本体左側[MODE]ボタンをGPIO22に、本体右側[NEXT]ボタンをGPIO27に配線した。GNDの配線(茶色の電線)は、前述の最終版の基板とは異なる。

タクトスイッチの操作部

ケース内の基板にタクトスイッチを実装し、ケースの蓋にプラスチック製のビスを取り付けました。ナットを緩めにして接着すると、ケースの外からタクトスイッチを押すことが出来ます。ビスの長さやタクトスイッチの高さの調整も必要です。短めのビスと長めのタクトスイッチを組み合わせると、操作が安定します。

ケース内部にタクトスイッチを実装し、ケースにプラスチック製のビスを取り付けた。短めのビスと長めのタクトスイッチを組み合わせると、操作が安定する

筆者の製作例では、左側のスイッチがLCDに接近しすぎてしまっため、ナットの一部を切断し、LCDの端面にクッション(ポリイミドテープを円筒状に丸めたもの)を配置して、対策しました。
(もう少しLCDから離して実装したほうが良かった)

筆者の製作例では、左側のスイッチがLCDに接近しすぎてしまっため、ナットの一部を切断した。もう少しLCDから離して実装したほうが良かった

別途アンプが必要

ケースへの組み込みが容易なヘッドホン端子を使用しましたが、スピーカやヘッドホンに接続するには、別途、アンプが必要です。下図は本機(下段)にアンプ(上段)を重ね、スピーカに接続して試聴したときの様子です。

出力にはケースへの組み込みが容易なヘッドホン端子を使用したが、スピーカやヘッドホンに接続するには、別途、アンプが必要

上記のアンプの製作方法は下記を参照してください。

ソフトウェアのインストール方法

前回(https://bokunimo.net/blog/raspberry-pi/3123/)と同じ方法で、OS、alsa-utils、ffmpeg、筆者作成ソフトウェアをインストールし、設定してください。

筆者が作成したLCDドライバ raspi_lcd の最新版を実行するには、コンパイルが必要です。ディレクトリaudio/radio/pi内でmakeを実行してください(安定版バイナリは収録済)。

$ cd ⏎
$ sudo apt install alsa-utils ⏎ (LITE版OS使用時)
$ sudo apt install ffmpeg ⏎
$ sudo apt install git ⏎ (LITE版OS使用時)
$ git clone https://bokunimo.net/git/audio ⏎
$ cd audio/radio/pi ⏎
$ make clean ⏎
$ make ⏎
$ ./radio.sh ⏎

※プログラムはGitHubで公開しています。

I2CのACKを無視する

LCDドライバ raspi_lcd には、I2CのACKを無視する機能が搭載されています。raspi_lcd の使い方は、下記のコマンドで表示されます。-i オプションを付与すると、LCDからのACKを待たずに、次々に表示データを送信します。

 (参考情報)LCD表示用プログラム raspi_lcd の使い方:
$ cd ~/audio/radio/pi ⏎
$ ./raspi_lcd -h

本リポジトリに収録したプログラムは、AQM1602Y-RN-GBWの動作に合わせています。LCDによっては、ACKのタイミングによって、正しく表示データを受信できない場合があります。

下記はACK待ち時間が合わなかった場合の表示例です。「2022/12/30」が「02212/30」になってしまいました。

もし上図のような表示になってしまった場合は、I2Cの信号線にI2Cリピータなどを挿入し、プログラム radio.sh 内の raspi_lcd 命令から -i オプションを削除してください。

お好み次第のオプション例

自作品なので、好みや接続機器、環境などに合わせて製作することが出来ます。以下にオプション例を紹介します。

自動起動機能

/etc/rc.local もしくは、crontabでの自動起動に対応しています。設定にはテキスト・エディタが必要です。

下記のどちらかを追加してください。

(自動起動 ※どちらか一方)
・/etc/rc.localに追加する場合は下記を追加
    su -l pi -s /bin/bash -c /home/pi/audio/radio/pi/radio.sh &
・crontabに追加する場合は下記を追加
    @reboot /home/pi/audio/radio/pi/radio.sh &

USBコネクタ

筆者は、USBコネクタを背面に取り付け、イーサネットLANアダプタを接続できるようにしました。

Sambaでファイル共有

Musicフォルダを Samba でファイル共有すれば、PCなどから簡単に楽曲ファイルを追加できます(ただし、追加後に、再起動が必要)。

下記は、ホーム・ディレクトリの書き込みを許可し、Windowsネットワーク内にファイル共有する方法です。

smb.confに[music]を追加し、アクセスするユーザをpdbedit コマンドで追加しました。

(ファイル共有サーバ Samba のインストール)
$ sudo apt install samba ⏎
$ sudo mousepad /etc/samba/smb.conf & ⏎
    (下記を追加)
    [music]
       comment = Music Folder
       path = /home/pi/Music
       read only = no
       create mask = 0644
$ sudo pdbedit -a pi ⏎
new password: (ファイル共有用パスワード) ⏎
retype new password: (ファイル共有用パスワード) ⏎
$ mkdir -p /home/pi/Music ⏎

Windowsのエクスプローラーの「場所」の入力欄に「\\(IPアドレス)\music」を入力すると、アクセスできるようになります。

Windowsのエクスプローラーから「\\(IPアドレス)\music」でアクセスできるようになる

オーバレイモード(奮闘中)

Raspberry Piの電源を切るときは、[MODE]ボタンを長押しし、シャットダウン処理が完了してから電源を抜きます。そうしないと、マイクロSDカードが壊れてしまう場合があるからです。

一方、ファイルシステムをRAM上で模擬するオーバレイ・モードを使えば、マイクロSDカードへの書き込みを行わなくなるので、動作中に電源を抜くことが可能になります。

しかし、執筆時点ではGPIO機能が適切に動作しませんでした。また、LCD制御も動作しない可能性があります。もし、実験される場合は、意図しないシャットダウンを防止するためにプログラム radio.sh 内のシャットダウン機能(shutdown -h now)を無効化してください。オーバレイ・モードは、toolsフォルダ内の olCheck.sh を用い、./olCheck.sh onで設定できます。

フランス語対応

音楽プレーヤとして使用するにあたり、全ラテン文字を表示してみたい人も居るでしょう。

下図のLCDの下段には、超有名な言葉がかかれているのですが、初めてこの駅名を見たときは、全然、読めませんでした。

超有名な文字を表示してみた。下の写真を見れば読めるかもしれない
筆者がインターネットで情報公開を始めた原点

こういったラテン文字のうちフランス語で用いられる文字の多くを表示できるように、改良しました。

現在、フランスで人気の(ベルギー出身の)アーチスト Angèle さん(https://fr.wikipedia.org/wiki/Angèle_(chanteuse))の出生名を表示してみた

下記はLCDドライバを公開している GitHub Page です。

フランス語ラテン文字対応版LCDデバイスドライバ
https://git.bokunimo.com/raspi_lcd/

フランスの楽曲のアーチスト名とタイトルに基本アルファベット以外のラテン文字を含んでいる場合のメタ情報表示が可能です。

ただし、メタ情報を Windows 11 日本語版で編集すると基本アルファベット文字のみに変更されてしまうことが分かりました。楽曲を購入した状態から Windows 11 日本語版 では編集しないようにしてください(Windows 10では未確認)。

もし、誤って編集してしまった場合は、メタ情報を削除し、ファイル名を「アーチスト名␣-␣タイトル」(␣は半角スペース)の形式で保存すると、ファイル名からラテン文字を表示することが出来ます。

楽曲のファイル名を「アーチスト名␣-␣タイトル」の様式で保存すると、基本アルファベット以外のラテン文字の一部を含む表示が可能

関連記事

下図の写真またはタイトルをクリックすると閲覧できます。

by bokunimo.net/blog/menu/audio

「Radio & Jukebox 搭載 Raspberry Pi DAC」への1件の返信

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください