ガチレビュー

ラズパイでミュージックボックス制作 第5回 nanoで自動機能のプログラムを書く

電源をONにしたら自動再生させよう


前回までのおさらい

前回までで、ここまで完成している。

  • Raspberry Pi Zero に Raspberry Pi OS Lite(GUIなし) をインストール
  • 音楽ファイル(MP3)をラズパイに転送し、再生できることを確認
  • GPIO17 と GND(ラズパイ基板内の40ピン) にプッシュボタンを接続
  • GPIO17 と GND を ジャンパーワイヤーで仮止め
    → ボタンを押すと PUSH! と反応することを確認
  • GPIO17 と GND を はんだ付けでしっかり固定
  • ボタン操作で
    👉 再生
    👉 もう一度押すと停止
    という動作まで完成

音も出るし、ボタンも効くし、
もう完成でいい気がします!

まるちゃん
まるちゃん
ogita
ogita

もうあとひとがんばりですね。
ラズパイの電源を入れたら、何もしなくても音が鳴る。
そこまで行くと“装置”になりますよ。


今回やること(この回のゴール)

  • コマンドで、ラズパイで再生されている音楽を いったん止める
  • sudo reboot でラズパイを 再起動
  • 約20秒待つと、自動で音楽が再生される
  • ボタンを押すと 一時停止
  • もう一度押すと 再生に戻る

つまり、

👉 電源ON=自動再生
👉 ボタン=一時停止/再開

という状態を作る。


いよいよ自動再生

起動後に自動で音が鳴り始めるって、
どういう仕組みなんですか?

まるちゃん
まるちゃん
ogita
ogita

ラズパイにむけて
『起動したらこのプログラムを実行してね』
ってお願いをしておく。
そんな感じですね。

なるほど、お願いをしておくんですね。

まるちゃん
まるちゃん
ogita
ogita

その「お願い」は今までのようにターミナルで入力するのではなく、
「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 を終了する

書き終わったら、次の順で操作する。

  1. Ctrl + O(保存)
  2. Enter(ファイル名はそのまま)
  3. 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 を使う

今回やりたいのは、

  • 電源を入れたら
  • 何もしなくても
  • 音楽が勝手に再生される

これを実現するには、

  1. プログラムを ファイルとして保存する
  2. そのファイルを
    「起動時に実行してね」とラズパイに登録する

この ①を担当するのが nano

nano がなければ、
👉 自動再生はできない
と言ってもいい。


まるちゃんの理解ポイント

なるほど……ターミナルで書いたコードを名前を付けて保存して使えばいい、
って考えちゃうけど
それはラズパイではできないんですね。

まるちゃん
まるちゃん
ogita
ogita

そうですね、、
ターミナルで書たコードを保存はできません。
なので自動再生のプログラムとして使用することはできません。
したがってnanoというエディタを使って保存用のプログラムを書く必要がある。
そこで初めてラズパイの一部になる感じですね。

ラズパイを起動したら自動で音が鳴るようになするには、
nanoが必要なんですね。

まるちゃん
まるちゃん

これまでのラズパイでミュージックボックス制作 

第5回 nanoで自動機能のプログラムを書く
第4回 ボタンをはんだ付けしよう
第3回 ラズパイに再生ボタンを仮接続しよう
第2回 ラズパイに音楽を転送して音を鳴らしてみよう
第1回 Windowsからラズパイを操作する環境をつくろう

過去の記事検索

過去の記事検索

人気記事

人気の投稿 Best10 (月間)

-ガチレビュー