ラズパイ5の電源SWと周辺AV機器のリモコン+webアプリ【2025/02/11追記】
この1つ前の記事でRaspberry Pi 5(ラズパイ5)の電源をリモート起動できることを確認しました。続けて、わが家のラグビー観戦環境を整えに掛かりました。最終的にできた制御ボックスはこんな感じになりました:

…プリンタの不調でラベル品質がイマイチです。 まずは機能の検討です。ラズパイ5とともに、少なくともテレビの電源ON/OFFと入力切換はしたい。これはArduinoのIRremoteライブラリを使って赤外線LEDから送信すればいいので、以前やったことを思い出しながらやりました。実はバージョンがすごく上がっていて少々戸惑いましたが、結果としてexampleのReceiveDemoを使ってリモコンコードを読み込み、REGZAの場合はIrSender.sendNEC()に乗せるだけでした。
また、テレビをVIERAからREGZAに買い換えたせいだと思うのですが、パナソニック製サウンドバーの入力切換がREGZAに追随してくれず、先にDIGAを使っていた場合にサウンドバーのリモコンで入力をTVに切り換えないと音が出ません(たぶん、VIERAリンクとREGZAリンクの方言に引っかかった)。よって、サウンドバーの入力切換もできるようにしたい。これも赤外線リモコンなので上記と同様にコードを読み込み、IrSender.sendPanasonic()に乗せて、テレビとサウンドバーの両方が受信できる場所に赤外線LEDを置くことにしました。
ここまでの4機能(ラズパイ5電源・テレビ電源・テレビ入力切換・サウンドバー入力切換)は、デバッグ用を兼ねて、プッシュスイッチでも動かせるようにします。 リモートでのコントロール方法は、おうちサーバーとして常時稼働しているTinkerBoardにwebアプリを乗せて、ここからSPIでArduinoにコマンドを送ることにしました。事前実験でこちら(そのものズバリの簡潔な記事)やこちら(SPIの基礎)やこちら(spidev : Linux用Python SPIライブラリ)などを参考にして動作確認したあと、
a.一方通行でいいことからMISO(Master In Slave Out)が要らないか
b.1対1で1バイト送れればいいことからSS-/CSが要らないか(マスタのSSはNC、スレーブの/CSは常時L)
の2点を確認したところどちらも大丈夫だったことから、TinkerBoardとArduinoのSPI接続はMOSI・CLK・GNDと3.3V電源の計4本で済み(なんとGPIO端子も並んでいます)、するとUSB2.0ケーブルを流用できるというアイデアが出ました(高々9600bpsなのでMOSIとCLKのクロストークも問題無いと考えた)。試しにジャンクのUSBレセプタクルでTinkerBoard側・Arduino側それぞれのアダプタを作ってUSB A-MicroBの1.5m充電・転送ケーブルで繋いだところ、無事に通信できました。(ところが下記の通り、おそらくb.で副作用が出た。) ここまでの検討をもとに、プッシュスイッチとSPI通信によって4機能を動かすスケッチを書いたのですが、ひとつ問題が発生しました。それはラズパイ5の電源で【ON-delay(500)-OFF】としていたところ、スイッチでは0.5秒待ちになるのに、SPI通信だとdelay()が消えてしまったのです(millis()で確認すると0〜1msecのパルスになっていたが、オシロでは確認していない)。実際ラズパイ5に繋いだところ、スイッチは確実に効くにも拘わらず、SPIでは不発多発で不安定。色々検索したところ割り込み関係のようだったのでdelayMicroseconds()やdetachInterrupt()などを試してみたのですが効きませんでした。おそらく上記b.でSS-/CSを省いたため、SPIデータが入ったあとタイムアウトするまで割り込みが解除されないのだろうと考えていますが、このままでは肝心のラズパイ5の電源制御ができません。
そこで、ラズパイ5については【ON-delay()-OFF】とするのでなく、【コマンドが入るごとにトグルする】ことを考えました。スイッチの場合はダブルクリック、SPIの場合はマスタ側のPythonスクリプトにtime.sleep()を入れて2回コマンドを入れることで、ONとOFFを切り換えるわけです。これで、必要な動作になりました。 あと、制御ボックスに付けられるスイッチは数個までですが、実際に使うシーンを考えると、音量調整などをリモートでできると便利です。そこで、スイッチとSPIで共通のコマンド以外のデータがSPIから来た場合にはテレビのリモコンコードだと見なして赤外線LEDから送信することにしました。これにより、新たな機能を付け加えたい場合には制御ボックスに無関係にマスタ側のアプリ(今回はwebアプリのスクリプト)を変更するだけで済むようにできました。 最終的な回路図は次のようになりました:

内部の基板は2段重ねです。次の写真左上がラズパイ5と赤外線LEDへのコネクタとスイッチおよびインジケータLEDの基板、左下がATmega328PとSPIインターフェース(に使っているmicroBレセプタクル)周りの基板です。写真の右側がwebアプリのキャプチャで、基本の4機能に加えて、音量調整やテレビのYouTubeアプリのコントロールができるようにしています。

BOMは次の通りで、合計1051円でした。なお、電線・ハンダ・ピン・ラベル等の副材はカウントしていません:
Arduinoのスケッチと、マスタ側でマニュアル操作するためのPythonスクリプトは
Githubにリポジトリを作って上げておきました(上記webアプリはサーバー環境に依存しますのでアップしません)。
世界屈指のハイレベルリーグであるフランスTOP14ではフル尺の試合動画が無償公開されていてStade Toulousain(トゥールーズ)の齋藤直人選手やUnion Bordeaux-Bègles(ボルドー)のテビタ・タタフ選手らが頑張っている姿が観られますし、ワールドラグビーの動画サイトRugbyPass TVは無料登録で多くのコンテンツが観られます。このRugbyPass TVでは、2025秋の女子ワールドカップや、セブンズシリーズがフル尺で観られ、サクラフィフティーン&サクラセブンズの勇姿が観られると思います(国内で放送・配信されない試合に限る;権利関係ですね)。今回作った仕組みで楽に観られるようになったので、これからも楽しく応援していきます。 以上、何かの参考になれば幸いです。 パドラッパ from MacBook Air (2017) 【2025/02/11追記】
1. 実働でラズパイ5電源制御のトグル動作が十分安定していることが確かめられたので、delay()の効くloop()内で2回電源制御コマンドを送ってトグルON-OFFするようにしました(RP5ctrl.ino)。これで、ラズパイ5の電源だけダブルクリックする必要が無くなりました(メモ貼りも不要になった)。
2. linuxコマンドラインツール(rp5etc_cli.py)内のウェイトを入れる場所を間違えていたので直しました。
以上2点を加えたソースはGithubに上げておきました。
3. ケースの蓋を開けるついでにラベルを作り直しました。

…少しはマシになったかな。

…プリンタの不調でラベル品質がイマイチです。 まずは機能の検討です。ラズパイ5とともに、少なくともテレビの電源ON/OFFと入力切換はしたい。これはArduinoのIRremoteライブラリを使って赤外線LEDから送信すればいいので、以前やったことを思い出しながらやりました。実はバージョンがすごく上がっていて少々戸惑いましたが、結果としてexampleのReceiveDemoを使ってリモコンコードを読み込み、REGZAの場合はIrSender.sendNEC()に乗せるだけでした。
また、テレビをVIERAからREGZAに買い換えたせいだと思うのですが、パナソニック製サウンドバーの入力切換がREGZAに追随してくれず、先にDIGAを使っていた場合にサウンドバーのリモコンで入力をTVに切り換えないと音が出ません(たぶん、VIERAリンクとREGZAリンクの方言に引っかかった)。よって、サウンドバーの入力切換もできるようにしたい。これも赤外線リモコンなので上記と同様にコードを読み込み、IrSender.sendPanasonic()に乗せて、テレビとサウンドバーの両方が受信できる場所に赤外線LEDを置くことにしました。
ここまでの4機能(ラズパイ5電源・テレビ電源・テレビ入力切換・サウンドバー入力切換)は、デバッグ用を兼ねて、プッシュスイッチでも動かせるようにします。 リモートでのコントロール方法は、おうちサーバーとして常時稼働しているTinkerBoardにwebアプリを乗せて、ここからSPIでArduinoにコマンドを送ることにしました。事前実験でこちら(そのものズバリの簡潔な記事)やこちら(SPIの基礎)やこちら(spidev : Linux用Python SPIライブラリ)などを参考にして動作確認したあと、
a.一方通行でいいことからMISO(Master In Slave Out)が要らないか
b.1対1で1バイト送れればいいことからSS-/CSが要らないか(マスタのSSはNC、スレーブの/CSは常時L)
の2点を確認したところどちらも大丈夫だったことから、TinkerBoardとArduinoのSPI接続はMOSI・CLK・GNDと3.3V電源の計4本で済み(なんとGPIO端子も並んでいます)、するとUSB2.0ケーブルを流用できるというアイデアが出ました(高々9600bpsなのでMOSIとCLKのクロストークも問題無いと考えた)。試しにジャンクのUSBレセプタクルでTinkerBoard側・Arduino側それぞれのアダプタを作ってUSB A-MicroBの1.5m充電・転送ケーブルで繋いだところ、無事に通信できました。(ところが下記の通り、おそらくb.で副作用が出た。) ここまでの検討をもとに、プッシュスイッチとSPI通信によって4機能を動かすスケッチを書いたのですが、ひとつ問題が発生しました。それはラズパイ5の電源で【ON-delay(500)-OFF】としていたところ、スイッチでは0.5秒待ちになるのに、SPI通信だとdelay()が消えてしまったのです(millis()で確認すると0〜1msecのパルスになっていたが、オシロでは確認していない)。実際ラズパイ5に繋いだところ、スイッチは確実に効くにも拘わらず、SPIでは不発多発で不安定。色々検索したところ割り込み関係のようだったのでdelayMicroseconds()やdetachInterrupt()などを試してみたのですが効きませんでした。おそらく上記b.でSS-/CSを省いたため、SPIデータが入ったあとタイムアウトするまで割り込みが解除されないのだろうと考えていますが、このままでは肝心のラズパイ5の電源制御ができません。
そこで、ラズパイ5については【ON-delay()-OFF】とするのでなく、【コマンドが入るごとにトグルする】ことを考えました。スイッチの場合はダブルクリック、SPIの場合はマスタ側のPythonスクリプトにtime.sleep()を入れて2回コマンドを入れることで、ONとOFFを切り換えるわけです。これで、必要な動作になりました。 あと、制御ボックスに付けられるスイッチは数個までですが、実際に使うシーンを考えると、音量調整などをリモートでできると便利です。そこで、スイッチとSPIで共通のコマンド以外のデータがSPIから来た場合にはテレビのリモコンコードだと見なして赤外線LEDから送信することにしました。これにより、新たな機能を付け加えたい場合には制御ボックスに無関係にマスタ側のアプリ(今回はwebアプリのスクリプト)を変更するだけで済むようにできました。 最終的な回路図は次のようになりました:

内部の基板は2段重ねです。次の写真左上がラズパイ5と赤外線LEDへのコネクタとスイッチおよびインジケータLEDの基板、左下がATmega328PとSPIインターフェース(に使っているmicroBレセプタクル)周りの基板です。写真の右側がwebアプリのキャプチャで、基本の4機能に加えて、音量調整やテレビのYouTubeアプリのコントロールができるようにしています。

BOMは次の通りで、合計1051円でした。なお、電線・ハンダ・ピン・ラベル等の副材はカウントしていません:
item | detail | price | pcs | subtotal |
---|---|---|---|---|
MPU | ATmega328P w/bootloader | 440 | 1 | 440 |
microUSB | AE-USBmB-PNL | 250 | 1 | 250 |
Tr | 2SC1815L-GR | 5 | 2 | 10 |
IR LED | OSI5FU3A11C | 20 | 1 | 20 |
RED LED | OSR5JA3Z74A | 5.5 | 1 | 5.5 |
Green LED | OSG8HA3Z74A | 6 | 1 | 6 |
PH post | S2B-PH-K-S | 10 | 2 | 20 |
PH housing | PHR-2 | 5 | 2 | 10 |
Push SW | TVBP06-B043CW-B | 20 | 1 | 20 |
Push SW | DTS-63-F-N-V | 15 | 4 | 60 |
C | 0.1uF | 10 | 1 | 10 |
C | 1.0uF | 25 | 1 | 25 |
C | 47uF | 10 | 2 | 20 |
R | 47 | 1 | 1 | 1 |
R | 10k | 1 | 4 | 4 |
R | 100k | 1 | 2 | 2 |
case | 内寸約60x40x30mm | 110 | 1/4 | 27.5 |
D基板 | AE-DB1 | 40 | 3 | 120 |
世界屈指のハイレベルリーグであるフランスTOP14ではフル尺の試合動画が無償公開されていてStade Toulousain(トゥールーズ)の齋藤直人選手やUnion Bordeaux-Bègles(ボルドー)のテビタ・タタフ選手らが頑張っている姿が観られますし、ワールドラグビーの動画サイトRugbyPass TVは無料登録で多くのコンテンツが観られます。このRugbyPass TVでは、2025秋の女子ワールドカップや、セブンズシリーズがフル尺で観られ、サクラフィフティーン&サクラセブンズの勇姿が観られると思います(国内で放送・配信されない試合に限る;権利関係ですね)。今回作った仕組みで楽に観られるようになったので、これからも楽しく応援していきます。 以上、何かの参考になれば幸いです。 パドラッパ from MacBook Air (2017) 【2025/02/11追記】
1. 実働でラズパイ5電源制御のトグル動作が十分安定していることが確かめられたので、delay()の効くloop()内で2回電源制御コマンドを送ってトグルON-OFFするようにしました(RP5ctrl.ino)。これで、ラズパイ5の電源だけダブルクリックする必要が無くなりました(メモ貼りも不要になった)。
2. linuxコマンドラインツール(rp5etc_cli.py)内のウェイトを入れる場所を間違えていたので直しました。
以上2点を加えたソースはGithubに上げておきました。
3. ケースの蓋を開けるついでにラベルを作り直しました。

…少しはマシになったかな。
最近のコメント