« 2024年12月 | トップページ | 2025年3月 »

2025年2月

2025/02/19

簡単な動画再生補助デバイス(ラズパイ5・Firefox用)

Raspberry Pi 5(ラズパイ5)の電源SW制御がうまくいったのに気をよくしてコントロールボックスとwebアプリを作ってFirefoxで各種のラグビー配信動画を楽しんでいます。ほとんどの操作は無線マウスで済むのですが、動画を少し飛ばしたりリプレイしたりしたいときに、マウスでシークバーをいじるのが少し面倒に感じます。我ながらズボラだと思いますが、ラグビーの場合フルゲームでは2時間ほどありますから、精度良くクリックするのが少々難しいのです。

さて、ほとんどの動画サイトでは短いスキップが左右の矢印キーに割り当てられています:  
サイト左矢印右矢印備考
RugbyPass TV-5秒+5秒Jで-10秒、Lで+10秒
TOP14-10秒+10秒
HANAZONO LIVE--スキップなし
J SPORTSオンデマンド-30秒+30秒
ただ、これだけのためにキーボードを持ち出すのも面倒(またズボラな…)。というわけで、ちょっとスキップするだけのHIDデバイスを作ろうと思い立ちました(作るのは全然面倒だと思わない)。

イチから作ることも考えたのですが、ちょうど手元に使わなくなったページめくり機があるので、とりあえずこれのキーアサインとラベルを差し換えるだけで様子を見ようということで、作ったのがこちらです:
01rpi_movie_ctl
左が元のもの、右が今回手直ししたものです。ちなみに、ページめくり機として現役なのはSeeed Studio XIAO nRF52840 Senseを使ったものです。

コーディングは
「戻る(KEY_MEDIA_VOLUME_DOWN)」だったキーを「右矢印(KEY_RIGHT_ARROW)」に、
「送る(KEY_MEDIA_VOLUME_UP)」だったキーを「左矢印(KEY_LEFT_ARROW)」に、
「本棚へ(KEY_MEDIA_WWW_BACK)」だったキーを「ESC(KEY_ESC)」に、
それぞれ置換しました(ESCはフルスクリーンを解除するキー)。これだけだと少し芸が無いので、もうひとつマウスで面倒に思っていたFirefox起動をマクロにしてESC長押しに割り当ててみました。具体的には
🍓>下矢印>下矢印>右矢印>下矢印>リターン
↑berry mark
という手順です。私のラズパイ5ではメニューバーが上・ブラウザが2番目・Firefoxが2番目になっているので、このような手順になっています。なお、間にdelay()を適当に入れています。

ところで、これをArduino IDEでコンパイルして転送しようとしたところ、次のエラーが出てできませんでした:
error: 'adc_gpio_init' was not declared in this scope
このエラーで検索すると、Espressifのボードライブラリが2.0.3に更新されたときに出るようになったらしく、2.0.2に戻せば動くということで、その通りの対応で動くようになりました(現時点の最新は3.1.1)。どうやら今ではadc_gpio_init()自体が要らないようなのですが、その辺りの詳細は詰めていません。
コードはGitHubのページめくり機と同じリポジトリに「rpi_movie_ctl.ino」という名前で置いておきました。

もうここまできたら専用マウスを自分で作った方がいいのでは、という気もしていますが、以前にマウスのようなデバイスを作ってみたときにフィーリング通り動かすのがとても難しかったので、いまのところはペンディング。そのうちに、アイデアが湧いたら作ってみたいモノのひとつです。

以上、何かの参考になれば幸いです。

パドラッパ from MacBook Air (2017)

| | | コメント (0)

2025/02/07

ラズパイ5の電源SWと周辺AV機器のリモコン+webアプリ【2025/02/11追記】

この1つ前の記事でRaspberry Pi 5(ラズパイ5)の電源をリモート起動できることを確認しました。続けて、わが家のラグビー観戦環境を整えに掛かりました。最終的にできた制御ボックスはこんな感じになりました:
04upper
…プリンタの不調でラベル品質がイマイチです。

まずは機能の検討です。ラズパイ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アプリのスクリプト)を変更するだけで済むようにできました。

最終的な回路図は次のようになりました:
05sch

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

BOMは次の通りで、合計1051円でした。なお、電線・ハンダ・ピン・ラベル等の副材はカウントしていません:
itemdetailpricepcssubtotal
MPUATmega328P w/bootloader4401440
microUSBAE-USBmB-PNL2501250
Tr2SC1815L-GR5210
IR LEDOSI5FU3A11C20120
RED LEDOSR5JA3Z74A5.515.5
Green LEDOSG8HA3Z74A616
PH postS2B-PH-K-S10220
PH housingPHR-25210
Push SWTVBP06-B043CW-B20120
Push SWDTS-63-F-N-V15460
C0.1uF10110
C1.0uF25125
C47uF10220
R47111
R10k144
R100k122
case内寸約60x40x30mm1101/427.5
D基板AE-DB1403120

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. ケースの蓋を開けるついでにラベルを作り直しました。
07upper2
…少しはマシになったかな。

| | | コメント (0)

ラズパイ5の電源SWをリモート操作する方法

web上の動画コンテンツ、例えばRugbyPass TVTOP14MBS HANAZONO LIVEJSPORTS RUGBY(要はラグビー)を大画面で観たいとき、これまではWindowsノートPCをテレビの横に持っていってHDMIケーブルを繋いで映していました。はっきり言って面倒だったのですが、ふとASUS TinkerBoard 2Sが使えるかもと思って試したところ、ギリギリ再生できるもののメモリが2GBでは不足するようで安定に動くとまでは言えない感じでした。基本的にラズパイよりもTinkerBoardの方が好きなのですがハイパフォーマンスモデルが出ていないので、最新のRaspberry Pi 5(以下ラズパイ5)を買いました(メモリはスイッチサイエンスさんの検証記事を参考にして4GB)。かなり久しぶりのラズパイで、Bluetoothキーボードのセットアップなどが簡単になっていて感心し、プリインストールのFireFoxで各サイトのコンテンツもスムーズに再生でき、導入して良かったです。ブックマークなどを一通り設定したあとテレビの裏に常駐させ、普段の操作は330円の無線マウスだけで済むようになりました。

ところが今度は、ラズパイ5の電源を入れに行くためだけにテレビの裏に回るのが面倒になってきました。我ながらズボラだと思いつつ、ほかのAV機器はリモコンで動くのですから当然と言えば当然です。
そこでラズパイ5をリモート起動できないか検討してみました。

ラズパイは5から基板上に電源スイッチが付いています。普通の小さなタクトスイッチなので、おそらく一方がプルアップされて電源コントローラか何かの割り込み入力に繋がっているのだと思います(回路図が公開されていないため推測)。そうであれば、次の図のように電源スイッチと並列にスイッチング素子を入れてコントロールできるだろう、と考えました。
01concept

しかし安くないラズパイ5本体の素子に直接はんだ付けするのは危なっかしいと思っていたところ、実は外部スイッチ接続用のジャンパ端子「J2」があると公式にアナウンスされていると知りました。それで現物確認したところ、基板端から見て左側が電源スイッチと内部配線で直結されており(ここでは「SWin」とします)、右側がGND電位でサーマルランドにしてくれていると分かりました。
02j2terminal

公式の説明では「ノーマリオープンのスイッチを付けたらいいよ」とだけ書かれていますが、綺麗な2.54mmピッチのジャンパ端子があるのなら、変な電圧を掛けないように気をつけつつ、電子制御できそうです。

さっそく手持ちの部品を使って試してみました。マイコンはATmega328PのArduino、スイッチング素子は汎用Trの2SC1815です(フォトMOSリレーを使おうかと思ったが手持ち無し)。
03block

まず単純にプッシュスイッチを押したらGPOがHigh出力でSWinがLow-Zになり(この状態をONと呼びます)、離したらLow出力でHi-Zになる、というスケッチを書いたところ、ラズパイ5自体に付いているスイッチと同じ挙動になりました。続いてプッシュスイッチを押すと一定時間だけONになるようにしたところ、大体200msec以上あれば安定して動くようでした。(ちなみに、スリープ状態で数秒ONにすると起動せずスリープに戻るので、ON-OFF動作が必要です。また、稼働状態で数秒ONにするといきなり落ちて心臓に悪いです。)

これで当初のコンセプト通りに動くことが確認できました。あとは、このプッシュスイッチを赤外線リモコン(マイコンはArduinoなど)、Bluetooth(同Seeed Studio XIAO nRF52840など)、Wi-Fi(同ESP32-WROOM-32Eなど)、そのほか何らかの通信手段にすればいいわけです。
私の場合は常時稼働している宅内サーバー(TinkerBoard)にwebアプリを乗せてテレビなど周辺機器のコントロールを併せて行おうと思い、マイコンにATmega328Pを使って有線のSPI接続にしました。この話は別稿に分けました

以上、何かの参考になれば幸いです。実行される場合は自己責任でお願いします。

パドラッパ from MacBook Air (2017)

ps.
外部接続に剣山を立てるのがラズパイ流だと思いきや、J2端子がTHだったことに驚きました。剣山や裸のジャンパはショートさせそうで、ソケット接続のArduinoタイプが好きなのですが。

| | | コメント (0)

« 2024年12月 | トップページ | 2025年3月 »