電源をONにしたら自動再生させよう
前回までのおさらい
前回までで、ここまで完成している。
- Raspberry Pi Zero に Raspberry Pi OS Lite(GUIなし) をインストール
- 音楽ファイル(MP3)をラズパイに転送し、再生できることを確認
- GPIO17 と GND(ラズパイ基板内の40ピン) にプッシュボタンを接続
- GPIO17 と GND を ジャンパーワイヤーで仮止め
→ ボタンを押すとPUSH!と反応することを確認 - GPIO17 と GND を はんだ付けでしっかり固定
- ボタン操作で
👉 再生
👉 もう一度押すと停止
という動作まで完成
音も出るし、ボタンも効くし、
もう完成でいい気がします!
もうあとひとがんばりですね。
ラズパイの電源を入れたら、何もしなくても音が鳴る。
そこまで行くと“装置”になりますよ。
今回やること(この回のゴール)
- コマンドで、ラズパイで再生されている音楽を いったん止める
sudo rebootでラズパイを 再起動- 約20秒待つと、自動で音楽が再生される
- ボタンを押すと 一時停止
- もう一度押すと 再生に戻る
つまり、
👉 電源ON=自動再生
👉 ボタン=一時停止/再開
という状態を作る。
いよいよ自動再生
起動後に自動で音が鳴り始めるって、
どういう仕組みなんですか?
ラズパイにむけて
『起動したらこのプログラムを実行してね』
ってお願いをしておく。
そんな感じですね。
なるほど、お願いをしておくんですね。
その「お願い」は今までのようにターミナルで入力するのではなく、
「nano」というお願い専用のエディタを使って書いていきます。
今日はまず、nanoを起動して、お願いのデータを作ってみましょう!
まずはSSHでラズパイにログイン
PCのターミナルから、いつも通り。
ssh ogita@budda.local
ログインできると、次の表示になる。
ogita@budda:~ $
ここから先は、ラズパイの中を操作している状態。
nano(ナノ)って何?
nanoとは?
ラズパイの中で使える、
とてもシンプルな文字編集ソフト。
イメージは、
- Windowsの「メモ帳」
- でも キーボードだけで操作
マウス操作は不要。
初心者でも安全に使える。
nanoの画面が開いたら
ターミナルでこれを入力:nano /home/ogita/autoplay.py
これでnanoが起動して、autoplay.pyというファイルが開かれる。
nanoの画面構成
- 画面中央:文字を書く場所
- 画面下:操作ヒント(
^O Write Outなど)
が表示される。
自動再生+ボタン操作のコードを書く
nanoの画面に、以下をそのまま貼り付ける。
from gpiozero import Button
from signal import pause
import subprocess
import time
import os
# ボタンの接続先
BUTTON_PIN = 17
# 再生する音楽ファイル
MUSIC = "/home/ogita/sounds/zone_2020rain.mp3"
# USBオーディオデバイス
ADEV = "hw:0,0"
btn = Button(BUTTON_PIN, pull_up=True, bounce_time=0.3)
player = None
def start():
global player
if not os.path.exists(MUSIC):
print("ファイルがありません:", MUSIC)
return
if player and player.poll() is None:
return
print("▶ 自動再生スタート")
player = subprocess.Popen(
["mpg123", "-a", ADEV, "--loop", "-1", MUSIC]
)
time.sleep(0.2)
def stop():
global player
print("■ 停止")
if player and player.poll() is None:
player.terminate()
try:
player.wait(timeout=2)
except Exception:
player.kill()
player = None
def toggle():
if player and player.poll() is None:
stop()
else:
start()
# ボタンを押したら 再生/停止 を切り替える
btn.when_pressed = toggle
# ★ ラズパイ起動時に自動で再生
start()
print("待機中:ボタンで一時停止/再開")
pause()
保存して nano を終了する
書き終わったら、次の順で操作する。
- Ctrl + O(保存)
- Enter(ファイル名はそのまま)
- Ctrl + X(nanoを終了)
これで、
/home/ogita/autoplay.py
という 自動再生プログラムが
ラズパイの中に保存された。
なぜラズパイでは nano を使うのか?
今回やりたいのは、
- 再起動しても
- 電源を切っても
- 同じ動きを繰り返す
そんな「装置」を作ること。
そのためには、
👉 プログラムをファイルとして保存する必要がある
nano は、そのための道具。
nano は「プログラムを保存するための道具」
ラズパイ(特にOS Lite)はテキストだけで操作するものなので、
- マウスのダブルクリックでプログラムを起動する
- 保存ボタンをマウスでクリック
という感覚では動かない。
代わりに、
- プログラムは ファイルとしてキーボード操作で保存
- コマンド(テキスト)を実行してキーボード操作で保存
- 起動時に 自動実行 させることができる
という考え方で使う。
nano は、その最初の一歩。
nano の役割を一言で言うと
「プログラムを書いて、ラズパイの中に保存するための入り口」
なぜ「保存」がそんなに重要なのか?
例えば、ターミナルでこんな書き方をしたとします。
python3 - << 'PY'
print("Hello")
PY
これはその場では機能する、確認できる、だけど、
- 実行したら終わり
- 再起動したら消える
- 自動実行できない
というその場限りのコードです。
nanoで作ったファイルは「残る」
一方、nanoを使って作る
/home/ogita/autoplay.py
のようなファイルは、
- ラズパイの中に ずっと残る
- 再起動しても消えない
- 自動実行の設定に使える
ここが決定的な違い。
「自動実行」につながるから nano を使う
今回やりたいのは、
- 電源を入れたら
- 何もしなくても
- 音楽が勝手に再生される
これを実現するには、
- プログラムを ファイルとして保存する
- そのファイルを
「起動時に実行してね」とラズパイに登録する
この ①を担当するのが nano。
nano がなければ、
👉 自動再生はできない
と言ってもいい。
まるちゃんの理解ポイント
なるほど……ターミナルで書いたコードを名前を付けて保存して使えばいい、
って考えちゃうけど
それはラズパイではできないんですね。
そうですね、、
ターミナルで書たコードを保存はできません。
なので自動再生のプログラムとして使用することはできません。
したがってnanoというエディタを使って保存用のプログラムを書く必要がある。
そこで初めてラズパイの一部になる感じですね。
ラズパイを起動したら自動で音が鳴るようになするには、
nanoが必要なんですね。
これまでのラズパイでミュージックボックス制作
第5回 nanoで自動機能のプログラムを書く
第4回 ボタンをはんだ付けしよう
第3回 ラズパイに再生ボタンを仮接続しよう
第2回 ラズパイに音楽を転送して音を鳴らしてみよう
第1回 Windowsからラズパイを操作する環境をつくろう