ラズパイで楽ちんオーディオ三昧 - RasPi ▲factory top


うちのラズパイ の活用例です。

やりたいこと 2022 Mar 7

ピュアオーディオ の世界は別次元として、 ライフオーディオ は気楽にいつでも音楽を聴いていられるのがポイントです。 ラズパイでいろいろ楽ちんになりそうです。 今回ラズパイでやりたいことは以下です。
  1. ピュアオーディオ以外の電源の一括オンオフ
  2. スピーカーの切換え
  3. ライフオーディオの音量調整
  4. オーディオコーナーの照明の明るさ調整
  5. ライフオーディオのインターネットラジオ選局

 

これらのコントロールを以下のようにラズパイのWebページとしてまとめ、 スマホやタブレット、あるいはPCからWebブラウザでアクセスします。 Webリモコンですね。

このやり方だとどのデバイスからでもアクセス出来ますが、 逆にURLを知っていれば誰でもアクセス出来てしまいます。 ただし、ラズパイは家のWi-Fiルーターにつながっているので、 ルーターの外からはアクセス出来ません。 なので、知らない誰かが勝手に電源を入れたりすることはなく、 今のところはそれで良いのですが、 その内外出先で何かしたくなったらひと工夫必要になります。。

さて、これらの機能を実現手段で分類すると以下になります
  • 1. 電源オンオフ、2. スピーカー切り替え
    シリアルデータ出力をラッチしてリレーを制御
  • 4. 照明の明るさ調整
    シリアルデータ出力をラッチしてLEDをPWM制御
  • 3. 音量調整、5. インターネットラジオ選局
    Linux のコマンド実行

その前に、、

集合シャーシ

1年半程前から、 いずれはラズパイで制御しようと思いながら、 今回の 1.電源、2.スピーカー切り替え、4.照明、 のハードウェアをシャーシに組み込んでいました。 これらを手動SWでオンオフしていました。 今回ようやくそれらをラズパイでコントロールすることになります。

また、このシャーシには スカイセンサー 用の4.5V電源、 デンスケ 用の6V電源、その他汎用の5V電源なども組み込んでいます。

 

LED照明から、
ホームセンターでアルミの平板(放熱板を兼ねる)を買ってきて穴をあけ 1WのパワーLEDを取り付けます
LEDを何灯つけると、電流をどのくらい流すと、 どういった明るさになるかを調べます
ラズパイを使う前の手動制御のシャーシ内部、 スピーカー切り替えを行うのでラックの奥でコードが大変です
そんなわけで1年程前から手動操作ではいろいろとやれていました

シリアルデータ出力をラッチしてリレーを制御 2022 Mar 26

ラズパイからのシリアルデータをラッチして、 1.電源、2.スピーカー切り替え、を行う部分です。 シリアルデータはハードウェアを簡単にするため、 拡張時以外は1バイトです。

シリアルデータ定義
拡張ビット アドレス空間 データ
Ext A2 A1 A0 D3 D2 D1 D0
1 現在未定義
0 0 0 0 - 2nd swap power
0 0 0 1 明るさ指示
2ndスピーカ、スピーカ交換、電源の各リレー制御
4bitをD/Aして三角波と比較しPWM制御(後述)

 

以下の部分だけ電源リレー駆動も含めラズパイから常時+5V給電されます
シリアルデータ出力、ラッチ部分、ラダー抵抗によるD/A部分
うっかりミスはないか一応ブレッドボードで試作します、 代用LEDの点灯で動作確認し1発OK
USB給電なのでラズパイからの(左側の白い)USBコードのみ接続されています

 

実際は代用LEDではなく以下のごとくスピーカー切換えリレーを制御します

 

シリアルデータでLEDをPWM制御 2022 Apr 22

最初はこの部分を標準ロジックで作ろうとしました。 PWM周波数の16倍の発振周波数で4bitバイナリカウンターをフリーランさせておき、 バイナリカウンターの出力が、全て0でPWM出力をオンにし、 明るさ4bitデータと一致したらオフにする、ことでPWM制御出来ます。 しかしながら、回路図を描き始めると、 オペアンプを使うよりICの数が増えてきたので止めました。(笑

ラズパイからの明るさ4bitデータを上述の回路でD/A変換した電圧値と、 三角波発生器の出力をコンパレートした矩形波出力でパワーLEDをオンオフします。 結果として、4bitデータでPWM制御されます。 オペアンプは+12V片電源です。

 

ところが試作してみると、 オペアンプの低電位側の飽和電圧が1.5Vもあり三角波の下側が振り切れず、 D/A後の低電圧と比較出来るところまで下がらないという問題が発生。

三角波の下側が下がり切っていない

データが Binary 0000~1111 の時、D/A後の電圧は 0V~4.7V になります。 この電圧を+数ボルトシフトできれば解決しそうですが、 そういった技が思いつかず。。 結果として Binary 0000~0100 の範囲が比較出来ず使えない状態です。 4bitなので本来16諧調が出来るはずですが、 有効範囲が Binary 0101~1111 ということは 12諧調の制御しか出来ないことになります。

まっ、しかし、、
商品の設計ではないし、趣味だから、まぁいっか、、 ということにしました。(大笑

 

いろいろ電源 2020 Oct 23-27

4.5V, 5V, 6V の各安定化電源、定電流駆動パイロットLED(悪ノリ)など、 1年前から出来ていた部分です。 尚、6.3Vトランス系のグランドは他のグランド(シャーシ含む)からフロートです。 また、AC側全体で念の為2Aのヒューズが入れてあります。

 

ハードウェアの組み込み 2022 Apr 22

ブレッドボードで動作確認した回路をユニバーサル基板で実装し、 その基板を集合シャーシに組み込みます。

集合シャーシをオーディオラックの所に持ってきて、 オーディオコーナーに以前から設置されている照明LEDに接続し波形を確認します。 オシロの波形はLEDをスイッチしているパワーFETのドレインを見ているので、 グランドレベルの時がLEDが通電され点灯している状態です。 波形のごとく完全な消灯・全灯が実現できていません。 もっと暗い状態、明るい状態が作れるはずです。 が、しかし、普段はだいたい真ん中辺りで使っているので 実用上これで良しとします。(汗

ユニバーサル基板で実装(クリックで拡大) 集合シャーシに組み込み(クリックで拡大)
最も暗くした時のドレイン波形、完全オフにならず 最も明るくした時のドレイン波形、完全オンにならず

集合シャーシの右側の基板は以前からあるいろいろ電源部です。 集合シャーシをオーディオラックの奥に押し込んで、 ハードウェアは以上でおしまいです。

部品リスト 2022 Mar 8-9

トランスはいろいろ電源用が 6.3V-2A、パワーLED用が 32V-1A、 12V電源は手元にあった12V-1A のACアダプターを分解流用しました。

音量調整とインターネットラジオ選局 2022 Feb 8-11, 23-24

音量調整やネットストリーム試聴は Linux のコマンドやアプリで実現できるのでそれらを使います。 音質的なことを言えばいろいろな技があるようですが、 そもそもライフオーディオではあまり音質は言わないので、 簡単さを最優先します。

  • ボリュームコントロールのコマンド実行例
  • $ amixer controls
  • $ amixer cset numid=3 50%
  • $ amixer -c 1 -D pulse set Master 50%

 

さて、問題はインターネットラジオです。
普通はブラウザでサイトに行けば簡単に試聴出来ます。 この時ブラウザはローカルで実行されているので当たり前ですが 音はローカル側(手元のデバイス)から聞こえます。 本システムでは音はサーバー側(ラズパイ)から出なければ意味がなく、 従ってブラウザでサイトに行って聞くという普通のやり方が使えません。

本システムでは、 ラジオ局のサイト内に埋め込まれたストリームのURLを調べ、 ラズパイ側で Linux のコマンドやアプリを実行して、 そのURLから音を出すことになります。

最初は「じゃ、サイトのHTMLコードを読めばいいじゃん」と考えていましたが、 最近のサイトのコードは機械(ソフト)による生成で 人が簡単に読めるものではありません。 あるいはjavascriptの深いネストに分散されていたりすると読む気になりません。 途方に暮れていると、そのストリームを探し出す方法を説明したページがありました。

ラジオ局の音楽ストリームURLを見つける方法↓
https://www.tremplin-numerique.org/en/web-radio-reveil-sur-raspberry
の「Where can I find web radio URLs?」の部分
Google Chrome でサイトを開く → 右クリ → 検証 → Networkタグ、から通信量でメディアを探す
なるほど!

  • メディア試聴のため Linux MPD, MPlayer をインストール
  • $ sudo apt-get install mplayer
  • $ mplayer -h
  • $ mplayer hoge.mp3

  • ネットストリームURL再生例
  • $ mplayer http://strm112.1.fm/baroque_mobile_mp3
  • $ mplayer https://18703.live.streamtheworld.com/KDFCFMAAC.aac

サイトの中にはストリームURLではなく、 スクリプトで音楽データをパケット転送しているところもあり、 そのような場合は現状では試聴することができません。 ただし、そのようなサイトでも、 他のポータルサイトへはストリームURLを提供していたりと、 探せば、複数のアクセス手段を用意している場合もあるようです。

ソフトウェア 2022 Feb 1-4, 8-11, 15-18, 26

ラズパイ Web Server ディレクトリ構成
/home/pi/www/
.git/ git repository です
cgi-bin/ cgi-python.py CGIスクリプトには実行権が必要です
$ chmod 755 cgi-python.py
html/ index.htm インターネットラジオのストリームURLはここに記述
stylesheet.css
src/ audio_corner_server.py 主たる機能実装です

ソースコードは GitHub へ。

Apache Web Server のドキュメントルートを上記のディレクトリとするため 以下の設定変更をします。
/etc/apache2/apache2.conf
#ドキュメントルート設定
#<Directory /var/www/>
<Directory /home/pi/www>
	Options Indexes FollowSymLinks
	AllowOverride None
	Require all granted
	Order allow,deny
	Allow from all
</Directory>

#CGI 設定
LoadModule alias_module /usr/lib/apache2/modules/mod_alias.so
LoadModule cgi_module /usr/lib/apache2/modules/mod_cgi.so
ScriptAlias /cgi-bin/ /home/pi/www/cgi-bin/
<Directory home/pi/www/cgi-bin>
    Options FollowSymLinks ExecCGI
    AllowOverride None
    Require all granted
    Order allow,deny
    Allow from all
    AddHandler cgi-script .cgi .sh .py .pl
</Directory>

/etc/apache2/sites-available/000-default.conf
	#DocumentRoot /var/www/html コメントアウト
	DocumentRoot /home/pi/www/html

 

さて、ひと工夫というか ひとひねりしたことは、、
端末のブラウザに表示された index.htm が操作されると、 操作を受けた Apache Web Server は cgi_bin を実行します。 この時の実行権限はデフォルトで user www-data となります。

しかしながら、ここで、 私の普段の user 権限では何も問題なく機能していたコマンドがクラッシュします。 関連するさまざまなコマンドが Apache の実行権ではうまく動作しません。

以後4日に渡り、Apache を適切なグループにしたり、 ネット情報よりさまざまな対応をしてみましたが、 Apache からの pulseaudio や ALSA へのアクセスにからむ権限の問題は 解決出来ませんでした。

ふと Linuxのこの深淵なる混沌を解決することが、 どれ程 私の人生を幸せにしてくれるかを考え、 ここは正面突破ではなく、発想を変えて対応しました。

私の user 権限だと何も問題無いのだから、 Apache で受けたブラウザからの操作を Socket で私の userland に飛ばし、 以後は私の権限で動作させることにしました。 これで、勝手知ったる自分の user 権限で戦うことが出来ます。 このような理由で主たる機能が実装された audio_corner_server.py は Apache ではなく Socket から情報を受けます。

その後の Tips


SSIDが自動的に切り替わることで発生する問題への対応 2023 Jul 31

家のWiFiルーターは接続できるWiFi電波名称 SSID(Service Set IDentifier) を普通3つ程度持っています。

最近ラズパイでインターネットラジオを聞いたり Tara Term 接続していると、 WiFiがやたらと途切れるようになりました。 先日ルーターの全SSIDを有効にしてからのような気がします。 ラズパイ側は家のルーターの複数SSIDでパスワードを入力し使える状態でした。

ふと、ルーターの設定画面を見ていると、 各SSIDへの接続数が時々変わっていることに気付き、 その時 接続が途切れるようです。 ラズパイ側で接続を見ると($ iwconfig)確かにSSIDが変わっています。 ライズパイが電波状態の良い方に自動的に切り替えているのでしょう。か、、

とにかく、自動切換えを止めるため、複数あった接続先SSID設定を1つにします。
/etc/wpa_supplicant/wpa_supplicant.conf
のSSID記述を1つのみにして再起動すると、本問題は解決しました。