1. TanaRadio
  2. 366 日記 | 3ボタンの実験
366 日記 | 3ボタンの実験
2026-06-25 37:37

366 日記 | 3ボタンの実験

spotify apple_podcasts

フェーズ4の3ボタンの実験です。ボタンを押すことで,ブラウザのプレーヤーをコントロールできるところまでいきました。

9. ステップ5:3ボタンへ増やす

1ボタンが成功したら、いったんシャットダウンします。

sudo shutdown -h now

電源を抜いてから、3ボタンに増やします。

配線はこれです。

GPIO17 ─ 1kΩ抵抗 ─ ボタン ─ GND
GPIO27 ─ 1kΩ抵抗 ─ ボタン ─ GND
GPIO22 ─ 1kΩ抵抗 ─ ボタン ─ GND

GNDは共通でかまいません。

ブレッドボード上では、GNDレールを作って、各ボタンをそこへ戻すとわかりやすいです。

GPIO17 → 抵抗 → ボタン → GNDレール
GPIO27 → 抵抗 → ボタン → GNDレール
GPIO22 → 抵抗 → ボタン → GNDレール

GPIO23は、今回は配線しません。

10. ステップ6:Pythonで3ボタンをテストする

電源を入れ、ターミナルを開きます。

3ボタンテスト用スクリプトを作ります。

nano ~/tanaradio/buttons3_test.py

中身はこれです。

from gpiozero import Button
from signal import pause

play_pause = Button(17, pull_up=True, bounce_time=0.08)
back_10 = Button(27, pull_up=True, bounce_time=0.08)
forward_10 = Button(22, pull_up=True, bounce_time=0.08)

def play_pause_pressed():
    print("PLAY / PAUSE button pressed")

def back_10_pressed():
    print("BACK 10 seconds button pressed")

def forward_10_pressed():
    print("FORWARD 10 seconds button pressed")

play_pause.when_pressed = play_pause_pressed
back_10.when_pressed = back_10_pressed
forward_10.when_pressed = forward_10_pressed

print("3 button test is ready.")
pause()

実行します。

python3 ~/tanaradio/buttons3_test.py

それぞれのボタンを押して、次のように別々の表示が出れば成功です。

PLAY / PAUSE button pressed
BACK 10 seconds button pressed
FORWARD 10 seconds button pressed

ここまでできれば、GPIO入力実験は成功です。

フェーズ4の核心はかなり越えています。

11. うまくいかないときの確認

何も表示されない場合

確認することはこれです。

GPIO番号を間違えていないか
GNDにつながっているか
ボタンの向きが合っているか
抵抗が同じ列に刺さっていてショートしていないか
ブレッドボードの列を勘違いしていないか

まずはGPIO17の1ボタンに戻って確認してください。
3つ同時に直そうとすると、原因が見えにくくなります。

1回押しただけなのに何回も表示される場合

bounce_time を少し大きくします。

bounce_time=0.15

たとえば、3か所すべてを 0.15 にして試します。

押していないのに反応する場合

タクトスイッチの向きが怪しいです。
ブレッドボードの中央の溝をまたいでいるかを確認してください。

12. ステップ7:playerctlでChromium再生を操作する

次に、Chromium上のTanaRadio再生をコマンドで操作できるか試します。

これは最終形ではありません。
Chromiumなしのmpv版へ行く前の足場です。

まずインストールします。

sudo apt install -y playerctl

playerctl はMPRIS対応メディアプレイヤーをコマンドラインから制御するツールで、再生、一時停止、停止、前後トラックなどの操作ができます。

ChromiumでTanaRadioを開き、音声を再生します。

その状態でターミナルから試します。

playerctl status

再生中なら、

Playing

のように表示されます。

次に、

playerctl play-pause

これで再生/一時停止が切り替われば成功です。

10秒戻る/進むは、環境によって効き方が違う場合があります。まず試します。

playerctl position 10-
playerctl position 10+

効けば、そのまま使えます。
効かなければ、フェーズ4前半では「再生/一時停止だけ成功」と考えてよいです。

13. ステップ8:3ボタンでChromium再生を操作する

3ボタン操作用スクリプトを作ります。

nano ~/tanaradio/buttons3_playerctl.py

中身はこれです。

#!/usr/bin/env python3

from gpiozero import Button
from signal import pause
import subprocess

def run(command):
    print(">", " ".join(command))
    subprocess.run(command, check=False)

play_pause = Button(17, pull_up=True, bounce_time=0.08)
back_10 = Button(27, pull_up=True, bounce_time=0.08)
forward_10 = Button(22, pull_up=True, bounce_time=0.08)

def play_pause_pressed():
    run(["playerctl", "play-pause"])

def back_10_pressed():
    run(["playerctl", "position", "10-"])

def forward_10_pressed():
    run(["playerctl", "position", "10+"])

play_pause.when_pressed = play_pause_pressed
back_10.when_pressed = back_10_pressed
forward_10.when_pressed = forward_10_pressed

print("TanaRadio 3 physical buttons are ready.")
pause()

実行します。

python3 ~/tanaradio/buttons3_playerctl.py

この状態で、3つのボタンを押します。

期待する動作はこれです。

GPIO17:再生/一時停止
GPIO27:10秒戻る
GPIO22:10秒進む

ここまでできれば、フェーズ4前半は成功です。

#声日記 #TanaRadioPi

サマリー

Raspberry Piで3ボタンの物理的な配線と接続を完了し、Pythonスクリプトを用いて各ボタンの動作を個別にテストすることに成功しました。次に、playerctlツールをインストールし、Chromiumブラウザで再生中のTanaRadioの音声をコマンドラインから一時停止、再生、10秒前後に移動できることを確認しました。最終的に、物理ボタンとplayerctlコマンドを連携させるPythonスクリプトを作成し、3つのボタンでChromium上のTanaRadio再生を直接操作できる状態を実現しました。これにより、フェーズ4の前半が成功裏に完了しました。

3ボタンの配線と物理的接続
それではフェーズ4の続きをやりたいのですが、1ボタンの実験に成功しましたので、今度は3ボタンへ増やすというところに行きたいと思います。
まだRaspberry Piに電源は入れていない状態で、もろもろ接続してありますが、これからブレッドボードに部品を差し込んでいきたいと思います。
やるのはボタン3つとそれぞれに1kΩの抵抗をつないで、それをGPIOの3つのピンにつなぎ、もう片方は全部グラウンドにつなぐということで。
1ボタンでやったのを3つ分やるという感じですね。
ブレッドボードが思ったより小さかったので、スイッチはかなり密集させて配置する必要がありそうです。
3つのボタンとさらに2つのロータリーエンコーダーを取り付けますので、結構ギュウギュウに配線したいと思います。
ではまずボタン1つをブレッドボードの真ん中の溝のようなところをまたぐ形で、4本足がありますが、差し込むと、一応差し込まれました。
それにかなりくっつける形で2つ目、これも差し込みました。
同じく3つ目も差し込みました。
1つ目がどうもうまく刺さらないのは足がちょっと曲がってしまったからです。
昨日差し込んだのを引っこ抜いたときに足が曲がってしまったようですが、これをもう一回なんとか刺さりました。
ではこれに3つの抵抗をそれぞれつなぐんですが、スペースが狭いので、抵抗を縦に刺さるように、縦にというのはわかりますかね。
このコの字型ではなくて、足ができるだけくっつくような形で、足を一方だけ折り曲げて2本狭く並ぶようにしますと、足の長さが変わるので、
足の長さを同じにするためにニッパーで足を切りたいと思います。
ニッパーじゃないですね、これは。
ニッパー買おうと思ったんだけど買ってないのでラジオペンチです。
今使った1本を切りましたので、あと袋から2本出しまして、同じように片方だけラジオペンチで曲げてやりまして、足の長さが揃わないので揃うようにペンチで揃えて切ります。
最後3本目を切りました。
そうしたらこの3個の抵抗をブレッドボードに刺すんですが、足がぐにゃっと曲がってしまいました。
それぞれスイッチの片方の足のところに1本、その隣の列のところにもう1本という形で足を2本ずつ刺しましたので、
この抵抗のもう片方を今度はGPIOのそれぞれのピンにつないでいくんですが、3本ジャンパー線が必要なのでそれぞれ使っていきます。
まずはGPIO17を一番左の抵抗の足の横に刺します。
次にGPIO27、隣ですね。
これを2番目の抵抗の足の、最後がGPIO22。
このGPIOのピンは全部並んでますね。
3つ並んだピンです。
一番右側の抵抗の足のところに刺しまして、これで繋がったと思います。
次はボタンのもう一つの足をグラウンドに刺していきます。
線の色を合わせて、一番右のやつをグラウンドにします。
真ん中のピッチの足を右に刺します。
足をまたグラウンドに刺します。
刺しました。
最後、グラウンドの共通の線ですが、これをGPIOのグラウンドの線。
これで全部配線が済んだはずですので、これで電源を入れていいんですね。
Pythonによる3ボタンの動作テスト
では、Raspberry Piの電源USB-Cのケーブルを刺します。
刺しましたらば、モニターが光りまして、起動が始まりました。
今、ブラウザーが立ち上がって、LISTENのTanaRadioのページが出て止まりました。
これは新しいタブを開いて、ChatGPTにまたつなぎたいと思います。
TanaRadioのPi作成のページというのがあるんですが、
これからPythonのプログラムをまた設定しないといけないんですが、
コピー&ペーストで貼り付けますので、そこを探しています。
出てきました。
3ボタンテスト用のスクリプトを作りますというところでコードをコピー&ペーストするんですが、
ターミナルを今度開かなければいけませんので、ターミナルを開きました。
ターミナルを開きましたら、まずはnanoで、
nanoというエディターがあるんですけど、nanoを使いまして、
テスト用のスクリプトのファイルを開くということですね。
この行をコピー&ペーストしまして、
エンターです。
開きましたので、この中にPythonのコードをまたコピーしまして、
開いたところに貼り付けです。
これを保存するときは、
Ctrl-Oでエンターを押してCtrl-Xでしたね。
これ覚えました。
今度は実行です。
Pythonの今作ったファイルを実行する行をコピーして、
ターミナルに貼り付けます。
そしてこれをエンターで実行します。
そうしますと、3 button test is readyと出ますので、
ボタンを押して正しい表示が出るかどうかを見たいと思いますが、
まず一番左のボタンを今押します。
押してみます。
そうしましたら、PLAY / PAUSE button pressedプレイポーズボタンプレストという風に出まして、
これ成功ですね。
次、真ん中のボタンを押してみます。
そうしましたら、BACK 10 seconds button pressedということで、
これも成功です。
最後、一番右のボタンを押してみますと、
FORWARD 10 seconds button pressedということで、
これも成功です。
3つのボタンそれぞれで違う表示がちゃんと出ていますので、
3ボタンの実験もうまくいったということになりますかね。
今度は順番を変えて、真ん中を押してみますと、
BACK 10 seconds。
一番左を押してみますと、PLAY / PAUSE。
一番右を押しますと、FORWARD 10 seconds。
もう一回右を押しますと、FORWARD 10 secondsということで、
ちゃんと何度やっても同じ結果になっています。
ではこれは、Ctrl-Cで強制終了しないと終わらないと思いますので、
Ctrl-Cを押してみます。
また、ターミナルの最初の状態に戻りました。
ということで、うまくいきましたので、
今回は割とすんなりいきましたが、
これで終わりでいいのかな。
うまくいかないときっていうのが書いてありますけど、うまくいってるのでいいですね。
playerctlによるChromium再生の操作
じゃあちょっと早めに終わったので、次のステップ。
ステップ7にちょっと行ってみましょうかね。
今度はplayerctlでChromium再生を操作するというステップです。
Chromiumっていうのはブラウザーですが、
このブラウザー上でTanaRadio再生をコマンドで操作できるか試すということです。
まずは、このplayerctlというものをインストールしなければいけないので、
これもまたコピー&ペーストでいきますね。
パスワード聞かれました。
なんかいろいろ出てきてますが、中身はちょっとよくわかりません。
ともかくインストールはされたと思いますので、先へ行きます。
このplayerctlというのは何なのかというと、
MPRIS対応メディアプレイヤーをコマンドラインから制御するツールで、
再生、一時停止、停止、前後トラックなどの操作ができるということです。
ではこれで、ChromiumでTanaRadioを開いて音声を再生しますとあるので、
TanaRadioは開いてあるので、開いてあるページを出しました。
この状態でターミナルからコマンドを入れるわけですが、
playerctl statusと入れてみます。
playerctl satusと入れて、Enterキーを押しますと、
No players foundと出てますね。
これは予想外というか、これでは多分駄目ですね。
なんで駄目なんでしょうか。
これはChatGPTに聞いてみましょうか。
playerctl statusと入れたら、No players foundと出ました,で聞いてみます。
こう言ってきましたね。
このコマンドを打つ前に、Chromiumで実際にTanaRadioの音声を再生してくださいと言っています。
音を出してないと駄目なんですね。
では音を出してみましょう。
ちょっと待ってください。
音を出してと言っても、今Raspberry Piにスピーカーをつなぐのを忘れていました。
今回、音を出すテストまで行くと思っていなかったのでスピーカーをつないでませんでしたが、
最近買ったUSBスピーカーをUSB端子につなぎましたので、これで出るはずです。
「TanaRadioPiを作るシリーズですが、フェーズ3まで終わりまして、今回からフェーズ4に入っていきたいと思います。・・・」
今音が聞こえていますが、この状態で先ほどのターミナルのコマンドを入れてみます。
「電源を入れると、LISTENのTanaRadioのページが自動的に開くというところまでやるというものでした。」
今度こうやりましたらplayingの答えが返ってきました。
ちょっとうるさいのでこれ消します。
これはOKですね。
次にplayerctl play-pauseを入れると、再生しているのが一時停止になったり、一時停止がプレイになったり変わるということだそうですので、これも試してみたいと思います。
TanaRadioPiがラジオ受信器でラジオっぽくなっていく第一歩のところですね。
止まりましたね。
同じコマンドをもう一回入れてみます。
再生されるはずです。
うまくいきましたね。
例によりまして、ChatGPTにマニュアルを作ってもらいましたので、その指示に従って進めていきたいのですが、
10秒前後に行くやつもちょっと続けてやってみます。
実現しました。
position 10-。
前後するのかな。
もう一回。
10秒飛ばしたはずなんですが、よくわかりませんね。
もう一回戻る方をやってみます。
10秒戻るやつをやってみます。
前後10秒移動するのもうまくいってますね。うまくいってると思います。
このテストも成功ですね。
次にこれを試してくださいということで、
--list-allっていうのを入れてみると。
試してみますね。
ブレイクアウト基板を接続するということで、
このブレイクアウト基板というのは、
Raspberry Piに40ピンの端子がついていて、
これがGPIOという名前だそうですが、
ここにいろんなものをつなげるといろんなことができるんですが、
いろいろと実験しやすい。
今--list-allっていうオプションをつけてコマンドを実行しましたらば、
Chromium.instance1418というのが出ました。
この場合、
player=chromium statusも試しますって書いてあるので、
これをやってみましょうかね。
player=chromium statusっていうのを
再生しながら実行してみます。
そうすると、playingになっています。
これでいいのかな。
これは今やったやつは、
playerctl statusと入れたらNo player foundと出たときの対応のところを飛ばしてみてました。
これは今やらなくていいんですね。
全然違うところを今見てました。
今はステップ7のplayerctlでChromium再生を操作するというところは一通りできたということで、
3ボタンとplayerctlによるChromium再生の連携
次は3ボタンでChromium再生を操作するということで、
今コマンドラインで入れたやつをボタンで実行できるようにするということで、
これもPythonのコードを入れたファイルを作りまして、それを保存して実行すれば、
ボタンを押したときにブラウザの再生状態が変わるということですね。
ちょっとここまでやろうかな。
行きがかり上ここまでやってしまいたいと思います。
ではまずスクリプトを作りますね。
またnanoのエディターを使ってファイルを作ります。
コピー&ペーストで。
まずはファイルを作りまして、中身を今度はコピー&ペーストします。
追いつけます。
で、保存がCtrl-O、Enter、Ctrl-Xですね。
これも覚えましたね。
今度は実行です。
実行を受けてEnterで実行です。
そうしますと、TanaRadio 3 physical buttons are Readyと出ますので、
ボタンで操作できるかどうか実験します。
まずTanaRadioの先ほどのエピソードを再生しておいて、
ボタンを押すんですね、これで。
今一番左のボタンを押したんですが、これがプレイポーズのボタンですね。
これを押しますと止まるはずです。
止まってますね。もう一回押すと再開されるはずです。
OKです。
次に真ん中のボタンが10秒戻るんですね。
10秒戻ると思います。
ボタンを押したら10秒戻るかどうか調べます。
10秒戻ってますね。
次は10秒飛ばします。
飛んでますね。これはちょっと声で聞いたので飛んでるのはわからないと思いますが、
今文字起こしのところを私は見ているので、
1行飛ばされて再生されているのがわかります。
今ずっと10秒飛ばすボタンを何度も押しましたが、
声がどんどん飛んでいるのがわかると思います。
ボタンもちゃんと働いていることが確認できました。
ステップ8の3ボタンでChromium再生を操作するというのもうまくいって、
フェーズ4の前半は成功というところまで行きました。
次はChromiumを使わずにmpvというプログラム、アプリというのかな、
これを使って音声を再生する方向にしますということで、
ブラウザーを開いて再生した状態でボタンを押すという形でやってきましたが、
このブラウザーを介さずにファイルを再生し、ストップさせたり飛ばしたりすることができるようになる段階ですね。
これが最終形なんですけれども、そこへ行くのはまた別の機会にしたいと思いますので、
今日のところはここまでとしたいと思います。
それではまた。
37:37

コメント

スクロール