1. TanaRadio
  2. 380 日記 | 電源オンで自動起動
380 日記 | 電源オンで自動起動
2026-07-12 28:25

380 日記 | 電源オンで自動起動

spotify apple_podcasts

電源オンで音が出るようにしました。見かけはともかく,機能的にはほぼ期待通りのモノができました(フェーズ5J完了)。

フェーズ5J 詳細マニュアル

電源ONでTanaRadio Piを自動起動する

0. 今回の目標

今回の完成イメージはこれです。

Raspberry Piの電源を入れる
↓
自動で tanaradio_5i.py が起動する
↓
現在の棚・再生モードをLEDで表示する
↓
プレイリストを作る
↓
mpvが起動する
↓
USBスピーカーから音が出る
↓
ボタンと音量ダイヤルで操作できる

今回は、ケースにはまだ入れません。

まずは、

モニターなし
キーボードなし
マウスなし
ターミナル操作なし

で動くかを確認します。

1. 今回使う方式

今回は systemd という仕組みを使います。

これは、Raspberry Piの起動時に自動でプログラムを立ち上げるための標準的な方法です。

今回作るものは2つです。

1. 起動用シェルスクリプト
   run_tanaradio_5j.sh

2. systemdサービス設定
   tanaradio.service

直接 tanaradio_5i.py を自動起動してもよいのですが、間にシェルスクリプトを置いた方が安全です。

理由は、起動直後はWi-Fiや音声出力の準備がまだ終わっていないことがあるからです。少し待ってからPythonを起動するようにします。

2. まず手動実行で現在の状態を確認する

Raspberry Piでターミナルを開きます。

cd ~/tanaradio5
ls

次のようなファイルがあることを確認します。

tanaradio_5i.py
shelf_01_voice_life.txt
shelf_02_tech_ai_mono.txt
shelf_03_education_research.txt
shelf_04_books_culture.txt
shelf_05_tanaradio.txt

次に、いつものように手動実行します。

python3 tanaradio_5i.py

ここで、これまで通り音が出て、ボタンと音量ダイヤルが効けばOKです。

終了するときは、

Ctrl + C

です。

ここが成功していない場合は、自動起動に進まないでください。
自動起動は「動いているものを自動化する」段階です。動いていないものを自動化すると、エラーが忍者のように見えなくなります。

3. USBスピーカーを確認する

USBスピーカーが認識されているか確認します。

aplay -l

たとえば次のような表示が出れば、USBスピーカーが見えています。

card 1: Device [USB Audio Device], device 0: USB Audio [USB Audio]

表示名は機種によって違います。
USB Audio や Device のような文字があれば、だいたいOKです。

次にテスト音を鳴らします。

speaker-test -t wav -c 2

左右からテスト音が出ればOKです。

止めるときは、

Ctrl + C

です。

4. mpvだけでUSBスピーカーから音が出るか確認する

すでに playlist_5i.m3u または playlist_5g.m3u のようなプレイリストがある場合は、それを使って確認します。

まず、作業フォルダを確認します。

cd ~/tanaradio5
ls *.m3u

表示されたプレイリスト名に合わせて、たとえば次を実行します。

mpv --no-video playlist_5g.m3u

または、

mpv --no-video playlist_5i.m3u

音が出ればOKです。

止めるときは、

q

です。

もしプレイリスト名がわからなければ、あとで tanaradio_5i.py が自動で作るので、ここは深追いしなくて大丈夫です。

5. 起動用シェルスクリプトを作る

次に、自動起動用のシェルスクリプトを作ります。

cd ~/tanaradio5
nano run_tanaradio_5j.sh

次をそのまま貼り付けます。

#!/bin/bash

# TanaRadio Pi フェーズ5J 起動用スクリプト

cd /home/tana/tanaradio5 || exit 1

# 起動直後はWi-Fiや音声出力の準備が終わっていないことがあるため、少し待つ
sleep 12

# Pythonのprintをログにすぐ出す
export PYTHONUNBUFFERED=1

/usr/bin/python3 /home/tana/tanaradio5/tanaradio_5i.py

保存します。

Ctrl + O
Enter
Ctrl + X

実行権限を付けます。

chmod +x run_tanaradio_5j.sh

6. 起動用スクリプトを手動で試す

まだ自動起動にはしません。
先に、このスクリプト自体が動くか確認します。

./run_tanaradio_5j.sh

12秒ほど待ってから、tanaradio_5i.py が起動するはずです。

音が出て、ボタンとダイヤルが効けばOKです。

終了するときは、

Ctrl + C

です。

7. systemdサービスファイルを作る

次に、Raspberry Pi起動時にこのスクリプトを自動実行する設定を作ります。

sudo nano /etc/systemd/system/tanaradio.service

次をそのまま貼り付けます。

[Unit]
Description=TanaRadio Pi Phase 5J
Wants=network-online.target
After=network-online.target sound.target

[Service]
Type=simple
User=tana
WorkingDirectory=/home/tana/tanaradio5
ExecStart=/home/tana/tanaradio5/run_tanaradio_5j.sh
Restart=on-failure
RestartSec=5
Environment=PYTHONUNBUFFERED=1

[Install]
WantedBy=multi-user.target

保存します。

Ctrl + O
Enter
Ctrl + X

ここでは User=tana としています。
たなさんのRaspberry Piのユーザー名が tana なので、このままでよいはずです。

8. systemdに設定を読み込ませる

sudo systemctl daemon-reload

ここではまだ自動起動は有効化されていません。
設定ファイルをRaspberry Piに認識させただけです。

9. まず手動でサービス起動する

いきなり再起動しないで、まずサービスとして起動します。

sudo systemctl start tanaradio.service

少し待ちます。
12秒後くらいにLEDが点滅し、音が出ればかなり良いです。

状態を確認します。

sudo systemctl status tanaradio.service

画面に次のような表示があればOKです。

Active: active (running)

または、すでに何らかの理由で終了していれば、

Active: failed

などが出ます。

終了するときは q です。

10. ログを見る

自動起動では、エラーはターミナルに直接出ません。
その代わり、ログを見ます。

journalctl -u tanaradio.service -n 80 --no-pager

リアルタイムで見る場合は、

journalctl -u tanaradio.service -f

止めるときは、

Ctrl + C

です。

ログに、

TanaRadio Pi フェーズ5I
現在の棚:
現在の再生モード:
プレイリストを作り直します
mpvを起動しました

のような表示が出ていれば、プログラムは動いています。

11. サービスを止める方法

手動で実験したいときは、先にサービスを止めます。

sudo systemctl stop tanaradio.service

これは大事です。

サービスが動いている状態で、さらにターミナルから

python3 tanaradio_5i.py

を実行すると、GPIOやmpvのソケットが二重に使われて、おかしな動きになる可能性があります。

つまり、今後の基本はこうです。

自動起動で使うとき:
sudo systemctl start tanaradio.service

手動で実験するとき:
sudo systemctl stop tanaradio.service
python3 tanaradio_5i.py

12. 自動起動を有効にする

サービスとして動くことを確認できたら、起動時に自動実行されるようにします。

sudo systemctl enable tanaradio.service

これで、次回の電源ONから自動起動します。

13. 再起動テスト

いよいよ、モニターなし運用に近いテストです。

まず、念のため現在のサービスを再起動しておきます。

sudo systemctl restart tanaradio.service

問題なく音が出たら、Raspberry Pi全体を再起動します。

sudo reboot

再起動後、しばらく待ちます。

目安としては、

起動
↓
Wi-Fi準備
↓
12秒待機
↓
Python起動
↓
RSS取得
↓
mpv起動
↓
音が出る

なので、電源投入から音が出るまで少し時間がかかります。
ここで焦らないのがコツです。ラジオというより、寝起きの小型サーバーです。

14. 再起動後の確認

音が出れば成功です。

次も確認します。

再生/一時停止ボタンが効く
戻るボタンが効く
次へボタンが効く
棚ボタンが効く
モードボタンが効く
音量ダイヤルが効く
LEDが点滅する

これが全部できれば、フェーズ5Jはほぼ成功です。

15. モニターなしで使う前のSSH確認

日常運用では、モニターをつながずに使うことになります。
その場合、問題が起きたときはSSHで入って確認します。

Macなど別のPCから、Raspberry PiにSSH接続します。

ssh tana@raspberrypi.local

入れたら、状態確認はこれです。

sudo systemctl status tanaradio.service

ログ確認はこれです。

journalctl -u tanaradio.service -n 80 --no-pager

再起動はこれです。

sudo systemctl restart tanaradio.service

停止はこれです。

sudo systemctl stop tanaradio.service

16. 自動起動を一時的に止める方法

ケース作業や配線変更をするとき、自動でプログラムが起動すると危ない場合があります。

そのときは、自動起動を無効にします。

sudo systemctl disable tanaradio.service

いま動いているサービスも止めるなら、

sudo systemctl stop tanaradio.service

もう一度自動起動に戻すときは、

sudo systemctl enable tanaradio.service
sudo systemctl start tanaradio.service

です。

17. よくあるトラブル

トラブル1:音が出ない

まずサービスを止めます。

sudo systemctl stop tanaradio.service

手動で音が出るか確認します。

cd ~/tanaradio5
python3 tanaradio_5i.py

手動では音が出るが、自動起動では音が出ない場合は、systemd から起動したmpvが音声出力先をうまくつかめていない可能性があります。

その場合は、tanaradio_5i.py の mpv 起動部分に、USBスピーカー向けの指定を追加します。

まず編集します。

nano ~/tanaradio5/tanaradio_5i.py

中で、次のような部分を探します。

cmd = [
    "mpv",
    "--no-video",
    "--really-quiet",
    f"--input-ipc-server={MPV_SOCKET}",
    str(PLAYLIST_FILE),
]

これを次のようにします。

cmd = [
    "mpv",
    "--no-video",
    "--really-quiet",
    "--ao=alsa",
    f"--input-ipc-server={MPV_SOCKET}",
    str(PLAYLIST_FILE),
]

保存します。

Ctrl + O
Enter
Ctrl + X

サービスを再起動します。

sudo systemctl restart tanaradio.service

これでUSBスピーカーから出る可能性が高くなります。

トラブル2:起動直後にRSS取得で失敗する

ログにRSS取得エラーが出る場合、Wi-Fi接続より先にプログラムが動いている可能性があります。

その場合は、待ち時間を少し伸ばします。

nano ~/tanaradio5/run_tanaradio_5j.sh

この行を、

sleep 12

たとえば次のようにします。

sleep 25

保存して、サービスを再起動します。

sudo systemctl restart tanaradio.service

トラブル3:GPIO関係のエラーが出る

ログにGPIOやpin関係のエラーが出る場合、まず二重起動を疑います。

ps aux | grep tanaradio

複数の tanaradio_5i.py が動いていたら、いったん止めます。

sudo systemctl stop tanaradio.service
pkill -f tanaradio_5i.py
pkill -f mpv

その後、もう一度サービスを起動します。

sudo systemctl start tanaradio.service
トラブル4:サービスがすぐ落ちる

状態を見ます。

sudo systemctl status tanaradio.service

詳しいログを見ます。

journalctl -u tanaradio.service -n 120 --no-pager

多くの場合、原因は次のどれかです。

ファイル名が違う
作業フォルダが違う
RSS棚ファイルがない
GPIOピンが別プロセスに使われている
mpvが見つからない
音声出力がつかめない

まず確認するコマンドはこれです。

ls -l /home/tana/tanaradio5
which python3
which mpv

18. フェーズ5Jの成功条件

次の5つができれば、フェーズ5J成功です。

1. sudo systemctl start tanaradio.service で起動する
2. USBスピーカーから音が出る
3. 物理ボタンで再生操作できる
4. 音量ロータリーエンコーダーが効く
5. sudo reboot 後にも自動で起動して音が出る

ここまで行けば、TanaRadio Piはもう「毎回ターミナルで実行する実験機」ではありません。

かなりはっきり言うと、ここを越えたら ラジオです。
まだ裸のラジオですが、電源を入れたら勝手に声が出る。これはもう道具としての魂が入っています。

次のフェーズ6Aで、ようやくケース配置に進むのがよいです。

#声日記 #TanaRadioPi

サマリー

TanaRadio Pi製作シリーズのフェーズ5Jでは、電源ONでラジオが自動起動するよう設定を進めました。まず起動用シェルスクリプトを作成し、systemdサービスファイルを使って自動実行を試みましたが、音声出力に問題が発生。USBスピーカーへの出力先を特定し、Pythonコードを修正することでこのトラブルを解決しました。その後、自動起動を有効にし、テスト中にボタン操作のタイムラグが確認されましたが、ログ分析により処理の遅延が原因と判明。ssh接続は後回しにし、自動起動の一時停止・再有効化の方法を確認し、フェーズ5Jを完了しました。

フェーズ5Jの目標と概要
TanaRadio Pi製作シリーズ、今日はフェーズ5Jをやりたいと思います。
前回このフェーズ5Jをやるつもりだったんですが、Raspberry Piの基板をケースに入れるところまでで終わってしまいましたので、
今回はケースに入ったRaspberry Piにいろいろと周辺機器をつなぎまして、それでまたターミナルでのファイルの設定等をやっていきたいと思います。
今回の目標は、電源ONでTanaRadio Piを自動起動するというものです。
これができると、このTanaRadio Piというケースに入ったものに周辺機器をつけなくても、電源コードをつなぐだけでラジオが聞けるという形になるので、私としてはとても嬉しい段階にいくわけです。
起動用シェルスクリプトの作成とテスト
さて、それでは、例によってチャッピーが作ったマニュアルに沿っていきたいと思うんですが、
まず最初にやることは、現在の状態を確認するというのは大丈夫ですので、
早速、起動用のシェルスクリプトを作るというところからいきたいと思います。
ではまず、ファイルをエディターで開きます。
今開きました。
そうしましたら、この中身をまたチャッピーが作ってくれたコードをコピー&ペーストで貼り付けたいと思います。
貼り付けられましたので、保存します。
そうしましたら、今度は実行権限をつけるというのをいつもやってますけれども、実行権限をつけました。
そうしましたら、これを実行するんですね。
実行しますと、どうなるか。この場合はですね、このターミナル上で実行するんですが、
そうすると12秒ほど待ってから、前回作ったPythonのスクリプトが起動して、それで音が鳴り始めるということなんですね。
ですので、これは音が出る実験ですから、一旦録音を止めてやってみたいと思います。
ちゃんとですね、12秒ぐらい経ったらば、自動的に起動しました。
ですので、この実験は成功ということで、次に行きたいと思いますが、
systemdサービスファイルによる自動実行設定
次はですね、今のスクリプトを自動実行する設定を作るということで、
これはsystemdというものがあるそうですが、そのサービスファイルというのを作るようです。
これはsudoというんですかね。
そういうコマンドを最初につけた上で、nanoのエディターを使うということです。
ではこれをコピー&ペーストでもターミナルに貼り付けまして実行します。
エディターが開きましたので、そこにコードをコピー&ペーストで貼り付けます。
保存ですね。保存できました。
今度はですね、systemdに設定を読み込ませるということで、
やはりまたsudoで持って読み込ませをやるようです。
これもコピー&ペーストでコマンドをターミナルに入れまして実行させました。
このままではまだ自動起動は有効化されていないということですので、
まずは手動でサービス起動をするということです。
音声出力トラブルシューティング開始
これはまた音が出る実験なので、一旦録音を止めます。
今テストをしたんですが、何かうまくいかないようで音が出ないということで、
ログを出した方がいいだろうということで、ログを出すコマンドを入れて、
いろいろとエラーがたくさん出ているログを表示させましたので、
それをチャッピーに渡しまして対策を聞きました。
そうしましたら、この音声を出す先が何か間違っているような形だということで、
その音声をUSBスピーカーにちゃんと出すように、
明示的に指示する変更をするということで、やり方がいろいろ書いてありますので、
それをやってみたいと思います。
USBスピーカーへの音声出力設定と確認
まずはこのサービスを止めるということで、
サービスを止めるコマンドをターミナルに貼り付けまして実行します。
そうしましたら、今度はaplayっていうんでしょうか、
初めて見るコマンドですが、これに-lを付けて、
こうしますとデバイスのリストが出てきます。
ちょっとこれは何を意味しているのかよくわからないので、
チャッピーに渡してまた対応を聞きたいと思います。
チャッピー頼みですね、この辺は。
USBスピーカーは認識されているので、
それなりの指定をすればいいということで、
まずサービスを止めるということです。
止めるための実行しました。
次にUSBスピーカー指定を試すということで、
ここではLSの**.m3uということで、
ファイルを探すとプレイリストのファイルが出てきます。
ここではplaylist_5i.m3uというのがあるなら、
次を試してくださいということなので、
試す長いコマンドをコピーしまして、
実行してみたいと思います。
これも音が出そうなので、一旦録音を止めます。
無事音が出ました。
音声出力先は確定したということで、
Pythonコードへの音声出力先反映と手動確認
その出力先をPythonのコードに反映させます。
まずはPythonのコードのファイルを開きます。
そうしましたらMPVを起動している部分を探すということで、
cmd何とかというのがあるようです。
ありましたね、cmd何とかと。
mpv何とか何とかといろいろ書いてありますが、
それを実行すると、要するに2行足すんですね。
その足すところを空行作りまして、そこに貼り付けたいと思います。
これでいいかなと思いますが、
1234567、1234567、行数も合ってますのでこれで多分大丈夫だと思います。
保存しました。
そうしましたら、手動で確認するということで、
またこのPythonファイルを実行して音が出るかどうかを確かめますので、
一旦録音を止めます。
無事音が出ましたので止めました。
サービスでの動作確認とログチェック
次はサービスで確認するということなので、
また先ほどのsudoのコマンドをコピー&ペーストで貼り付けまして実行します。
これは音が出るかもしれないので一旦止めます。
はい、音が出ました。
今良かったんだろうと思います。
次にこれのステータスを確認するようですので、
またコマンドを貼り付けて実行します。
実際に動いている様子についての記録が書かれているものが出ているようです。
次はログも確認しますということで、
先ほどたくさんエラーが出たログですが、これをもう一度確認します。
前のエラーが上の方に残っていますけれども、
新しいところはエラーが特に出ていないので大丈夫だと思いますね。
大丈夫そうですね。
これで上手くいったようです。
自動起動の有効化
では先ほどのトラブルは解決したので元に戻りますが、
先ほどはどこまで行ったかを見るところまでやったわけですよね。
ですので次は手動でサービスを止めるというのをやってみたいと思いますが、
これもコマンドをコピー&ペーストで貼り付けて実行します。
これは止める方法を実行したので止まっているということだと思いますが、
やっとここで自動起動を有効にするということで、
今ずっと手動でやってきましたけど、
自動起動するように設定をします。
これもsudoで始まるコマンドですね。
これで次回の電源オンから自動起動しますということでテストをするわけですが、
自動起動テストとタイムラグ問題の分析
まず念のため現在のサービスを再起動しておきます。
これも音が出るかもしれないので一旦録音は止めましてテストします。
いろいろ試しているんですが、
一旦再起動して、
ちゃんと動くかというと、
思い通りに、
何か動いているんですけど、
私が思う通りにスイッチを押したらその通りに動くかというと、
ちょっとタイムラグがあって、
あまりいい感じではないんですが、
こういう場合はどうするんでしょうか。
さっきログが表示できたので、
ログを取ってみましょうかね。
それで今タイムラグを開けたんですけれども、
またマニュアルを開けまして、
ログを見るコマンドを貼り付けて実行してみます。
ログを見ましたら、
一応ですね、私がボタンを押したことに反応して、
ちゃんと動いてはいるようです。
特にエラーは出てないですね。
ということは反応が遅いのに、
私がどんどんボタンを押すので、
その処理が溜まってしまって、
時間差を生み出している可能性がありますね。
ですからボタンを押した後に、
何秒も、例えば10秒とか20秒とか、
辛抱強く待つ必要があるのかもしれません。
ということで、特に大きな問題はなさそうなんですが、
ssh接続の試みと後回し
ここでモニターなしで使う前のssh確認というのがマニュアルにありますね。
これをやりますと、MacなどからRaspberry Piに接続できるということなので、
Macのターミナルを開いてみます。
Macのターミナルを開けました。
そしたらここにsshなんとかというのを、
ここにコピー&ペーストで貼り付けまして、
実行してみます。
実行しましたら、変化もないですけどね。
入れてるんでしょうか、これは。
先ほどのシステムのステータスを見るためのコマンドを付けて入れてみたいと思います。
入れてますが何の反応もないですね。
sshがうまく機能してないということのようです。
これは使わなくても、Raspberry Piに周辺機器をつなげれば様子はわかりますので、
これはちょっと後回しにしましょう。
自動起動の一時停止と再有効化、フェーズ5J完了
次が、自動起動を一時止める方法というのがありますので、
disableというオプションを付けて実行するものですね。
次にまた自動起動するときはenableですね。
これは試しに実行してみましょう。
Raspberry Piのターミナルでsudoのコマンドですね。
まずストップしたほうがいいのかな。先にストップをします。
まずストップをした上でdisableのコマンドを実行します。
特に変化はないんですけどね。これでdisableされたと思います。
今度はenableをもう一回して、スタートですね。
スタートのコマンドを実行すると、これでまた自動起動するということですね。
ではこれでフェーズの5Jはうまくいったような気がしますので、
しばらくこれでテストしていきたいと思います。
それではまた。
28:25

コメント

スクロール