ボタンでラズパイの音量調整(gpiozeroでボタン制御)

やはりハードウェアの音量調整は必要

以前の「零函(zero-bako)」で使った内蔵アンプには音量調整ノブがありましたが、今回のアンプHATにはハードウェアとしての音量調整ノブやボタンがありません。

何か方法を考えないといけないですね。
音量を変えるためだけに、PCでラズパイにVNC接続するのは現実的ではありませんし。

「Pi函(pi-bako)」には背面にプログラム可能なボタンが2個ありますので、これを音量の
アップ/ダウンに使いたいと思います。



ボタン操作でとりあえずやりたい事はこんな感じ

①音量アップ
②音量ダウン
③長押しでシャットダウン

電源スイッチ自体はスピーカー背面にありますので、そちらで電源のON/OFFは出来ますが、電源を切る時にはあらかじめラズパイ自体をシャットダウンさせてからの方が安全ですので、「シャットダウン」ボタンは欲しいところです。

まずはボタンの配線から



ボタン1は、Voice Kitのシステムで「音声受付開始」(GPIO23に設定)で使用されていますので、使えるボタンは背面側のボタン2とボタン3です。

ボタン2をGPIO24、ボタン3をGPIO27に割り当てます。

次はプログラムの変更ですが…

---------------------------------------------------------------------------------------------------------------
以下の説明について。
当方、プログラミングについてはほとんど素人です。
ネットにある関連記事を参考に、適当にプログラムのコードを弄ってます。
結果オーライで運よく上手くいっているだけの可能性が大きいです。
ですので、もし参考にされる場合は、あくまで自己責任でお願いします。
---------------------------------------------------------------------------------------------------------------

今回は「gpiozero」でプログラム作成

今回はいつもの「RPi.GPIO」ではなく、「gpiozero」を使ってみたいと思います。

「gpiozero」も「RPi.GPIO」と同じGPIOをプログラムでコントロールするためのライブラリーです。
特徴は「RPi.GPIO」のように「while True:」の無限ループや、押下時間を計るカウンターを作らなくても、簡単に「短押し」「長押し」を規定できる点です。

「短押し」「長押し」判定の正確性も「gpiozero」の方が優れているような気がします。

今回、Voice Kitのバージョンには始めから「gpiozero」がインストールされていましたので、インストールの必要はなく使えました。

ボタンプログラムをメモ帳アプリで作る

PCからVNCでラズパイに接続して、その画面からラズパイの中のファイルを操作します。

今回はいつものターミナル画面からの作成ではなく、メモ帳アプリを使いたいと思います。
その方が編集作業が断然やり易いです。

①デスクトップ画面上で右クリックして出てくるメニューから「新規作成」>「空のファイル」を選択します。



②ファイルの名前を入力します。(拡張子は「.py」)
何でも良いのですが、仮に「spbutton.py」とします。

③デスクトップ上に新しく「spbutton.py」というファイルが作成されますので、それを
「home」>「pi」>「AIY-voice-kit-python」>「src」の中に移動(ドラッグ&ドロップ)します。



④「spbutton.py」を選択して、右クリックして出てくるメニューから「Text Editor」を選択します。

⑤「spbutton.py」がメモ帳アプリで開きます。

「spbutton.py」を編集する

開いた「spbutton.py」は白紙ですので、そこに以下の文字列をコピーしてペーストします。

------------------------------------------------------------------------------------
#!/usr/bin/env python3
# coding:utf-8

import subprocess
import os
from gpiozero import Button
from signal import pause

Button.was_held = False

def held1(btn):
    btn.was_held = True
    print("button", btn.pin.number, "長押検知")

def released1(btn):
    if not btn.was_held:
        print("button", btn.pin.number, "短押検知")
        subprocess.call('amixer -c 0 sset Master 2%+', shell=True)
    btn.was_held = False

def held2(btn):
    btn.was_held = True
    print("button", btn.pin.number, "長押検知")
    os.system("sudo shutdown -h now")

def released2(btn):
    if not btn.was_held:
        print("button", btn.pin.number, "短押検知")
        subprocess.call('amixer -c 0 sset Master 2%-', shell=True)
    btn.was_held = False

btn_24 = Button(24)
btn_27 = Button(27)

btn_24.when_held = held1
btn_24.when_released = released1
btn_27.when_held = held2
btn_27.when_released = released2

pause()
------------------------------------------------------------------------------------

そのままメニューの「ファイル」>「保存」で保存します。

簡単に動作の説明をしますと、下部の

------------------------------------------------------------------------------------
btn_24 = Button(24)
btn_27 = Button(27)

btn_24.when_held = held1
btn_24.when_released = released1
btn_27.when_held = held2
btn_27.when_released = released2
------------------------------------------------------------------------------------

の部分で使用するGPIO番号と「長押し」(held)と「短押し」(released)の組み合わせを規定して、それぞれに個別の名前(held1、released1、held2、released2)を付けます。

実際のボタンの状態と、その個別の名前が合致した場合、例えば「GPIO24が短押しされた」=「released1」となった場合、「def released1(btn):」以下の命令(赤字)が実行されます。

------------------------------------------------------------------------------------
def released1(btn):
    if not btn.was_held:
        ①print("button", btn.pin.number, "短押検知")
        ②subprocess.call('amixer -c 0 sset Master 2%+', shell=True)
    btn.was_held = False
------------------------------------------------------------------------------------

①はボタン状態をターミナル画面で確認するためのものなので、実際にはあっても無くてもOKです。
②が本来の命令で、「Master」という音量を2%増加させるという意味です。

その他の状態「held2」「released2」にもそれぞれ命令を書いておきます。
(今回「held1」は命令無しなので、空振りになります。)

サービスファイルを作成する

サービスファイルは、ラズパイが起動する時に先ほど作成したプログラムファイルを自動的に読み込むようにするためのファイルです。

「spbutton.py」と同様に「spbutton.service」というファイルを新規作成して、「src」の中に移動させてから、メモ帳アプリで開きます。
そこに以下の文字列をコピーしてペーストします。

------------------------------------------------------------------------------------
[Unit]
Description=do something

[Service]
ExecStart=/usr/bin/python /home/pi/AIY-projects-python/src/spbutton.py

[Install]
WantedBy=multi-user.target
------------------------------------------------------------------------------------

これも同様に、メニューの「ファイル」>「保存」で保存します。

それぞれのファイルを使えるようにする

ファイルは作成しただけでは動かない場合が多いです。(特に新規で作成した場合)

まず、「spbutton.py」を右クリック>「ファイルをプロパティ」>「パーミッション」を選択します。

出てきた画面のアクセス制御の「実行(E):」を「すべて」に変更して、「OK」を選択します。



次に「spbutton.service」も同様の設定にします。

以上でプログラムの作成は完了です。


動作を確認する

以下の方法で、作成した「spbutton.py」プログラムファイルがちゃんと動作するか確認できます。

①「Start dev terminal」ターミナル画面で、「src/spbutton.py」と入力して、Enterキーを押します。

②プログラムが実行されますので、それぞれのボタンを「短押し」してみます。
上手く動作すればターミナル画面に「button 24 短押検知」のように文字表示されて、命令が実行されます。
(ボタン3=GPIO27を「長押し」すると、シャットダウンを開始するので注意。)

この方法を使うと、記述が間違っていた場合にプログラムが途中で終了するのですぐに分かります。(記述の間違いの部分のヒントも得られる場合もあります。)

再度プログラムを変更して、トライ&エラーで修正が出来ます。

「spbutton.py」を自動起動にする

「Start dev terminal」ターミナル画面上で、「spbutton.py」プログラムファイルが上手く動作しているようなら、それをラズパイの起動時に自動で起動するように設定します。

ただし、「spbutton.service」は特定のフォルダ(/lib/systemd/systemフォルダー)に置かないと機能しませんので、ターミナル画面に以下文字列を入力して、Enterキーを押します。
------------------------------------------------------------------------------------
sudo cp /home/pi/AIY-voice-kit-python/src/spbutton.service /lib/systemd/system/spbutton.service
------------------------------------------------------------------------------------

その後、ターミナル画面で、「sudo systemctl enable spbutton.service」と入力して、Enterキーを押します。

これで、再起動後、作成したプログラムの記述が(裏側で)自動的に実行されます。

動作的に課題は?

いちいちPCでラズパイにVNC接続して音量を調整する必要がなくなり、使い勝手は非常に良くなったと思います。

電源を切る前に、ラズパイ自体をシャットダウンさせておけるのも、万が一のシステムファイル破損を防げるので、安心です。

現状、ボタンの状態的には「ボタン2の長押し」=「held1」が空いています。
使うとすれば音楽再生の「次の曲へ」機能なのですが、Webラジオの再生では「次」の概念がないので、次回以降、音楽ファイル(mp3等)の連続再生を可能に出来たら、そちらも使えるようにしたいと思います。


コメント