注釈

こんにちは、SunFounderのRaspberry Pi & Arduino & ESP32愛好家コミュニティへようこそ!Facebook上でRaspberry Pi、Arduino、ESP32についてもっと深く掘り下げ、他の愛好家と交流しましょう。

参加する理由は?

  • エキスパートサポート:コミュニティやチームの助けを借りて、販売後の問題や技術的な課題を解決します。

  • 学び&共有:ヒントやチュートリアルを交換してスキルを向上させましょう。

  • 独占的なプレビュー:新製品の発表や先行プレビューに早期アクセスしましょう。

  • 特別割引:最新製品の独占割引をお楽しみください。

  • 祭りのプロモーションとギフト:ギフトや祝日のプロモーションに参加しましょう。

👉 私たちと一緒に探索し、創造する準備はできていますか?[ここ]をクリックして今すぐ参加しましょう!

4.1.2 ミュージックプレイヤー

はじめに

プロジェクト 3.1.3 オーディオモジュール では、スピーカーで曲を再生しました。今回は、音楽の再生/一時停止と音量を制御するための3つのボタンを追加します。

必要な部品

このプロジェクトで必要なコンポーネントは以下の通りです。

../_images/musicplayer_list.png

一式をまとめて購入するのが便利です。リンクはこちら:

名前

このキットのアイテム

リンク

Raphael Kit

337

Raphael Kit

以下のリンクから個別に購入することもできます。

コンポーネントの紹介

購入リンク

GPIO拡張ボード

BUY

ブレッドボード

BUY

ジャンパーワイヤー

BUY

抵抗器

BUY

オーディオモジュールとスピーカー

-

ボタン

BUY

回路図

T-Board Name

physical

wiringPi

BCM

GPIO17

ピン11

0

17

GPIO18

ピン12

1

18

GPIO27

ピン13

2

27

../_images/3.1.16_schematic.png

実験手順

ステップ1: 回路を組み立てる。

../_images/3.1.16fritzing.png

上記の図に従って回路を組み立てたら、Raspberry Piの3.5mmオーディオジャックにオーディオケーブルを挿入します。

../_images/audio41.png

ステップ2: コードのフォルダに移動する。

cd ~/raphael-kit/python/

ステップ3: 実行する。

python3 4.1.2_MusicPlayer.py

コードが実行された後、Raspberry Piは ~/raphael-kit/music ディレクトリ内の my_music.mp3 ファイルを再生します。

  • ボタン1で音楽を一時停止/再生します。

  • ボタン2で音量を下げます。

  • ボタン3で音量を上げます。

他の音楽ファイルをRaspberry Piにアップロードしたい場合は、 Filezilla Software を参照してください。

コード

注釈

以下のコードは 修正/リセット/コピー/実行/停止 が可能です。ただし、それに先立って、 raphael-kit/python のようなソースコードのパスに移動する必要があります。コードを修正した後、直接実行して効果を確認することができます。

from pygame import mixer
import RPi.GPIO as GPIO
import time
import os
user = os.getlogin()
user_home = os.path.expanduser(f'~{user}')

BtnPin1 = 18
BtnPin2 = 17
BtnPin3 = 27
volume = 0.7

status = False
upPressed = False
downPressed = False
playPressed = False

def setup():
    mixer.init()
    GPIO.setmode(GPIO.BCM)
    GPIO.setup(BtnPin1, GPIO.IN, GPIO.PUD_UP)
    GPIO.setup(BtnPin2, GPIO.IN, GPIO.PUD_UP)
    GPIO.setup(BtnPin3, GPIO.IN, GPIO.PUD_UP)

def clip(x,min,max):
    if x < min:
        return min
    elif x > max:
        return max
    return x

def play(pin):
    global playPressed
    playPressed = True

def volDown(pin):
    global downPressed
    downPressed = True

def volUp(pin):
    global upPressed
    upPressed = True

def main():
    global volume, status
    global downPressed, upPressed, playPressed
    mixer.music.load(f'{user_home}/raphael-kit/music/my_music.mp3')
    mixer.music.set_volume(volume)
    mixer.music.play()
    GPIO.add_event_detect(BtnPin1, GPIO.FALLING, callback=play)
    GPIO.add_event_detect(BtnPin2, GPIO.FALLING, callback=volDown)
    GPIO.add_event_detect(BtnPin3, GPIO.FALLING, callback=volUp)
    while True:
        if upPressed:
            volume = volume + 0.1
            upPressed = False
        if downPressed:
            volume = volume - 0.1
            downPressed = False
        if playPressed:
            if status:
                mixer.music.pause()
                status = not status
            else:
                mixer.music.unpause()
                status = not status
            playPressed = False
            time.sleep(0.5)
        volume = clip(volume,0.2,1)
        mixer.music.set_volume(volume)
        time.sleep(0.1)

def destroy():
    # Release resource
    GPIO.cleanup()
    mixer.music.stop()

# If run this script directly, do:
if __name__ == '__main__':
    setup()
    try:
        main()
    # When 'Ctrl+C' is pressed, the program
    # destroy() will be  executed.
    except KeyboardInterrupt:
        destroy()

コードの説明

from pygame import mixer

mixer.init()

pygame ライブラリの Mixer メソッドをインポートし、メソッドを初期化します。

BtnPin1 = 18
BtnPin2 = 17
BtnPin3 = 27
volume = 0.7

三つのボタンのピンポートを定義し、初期音量を0.7に設定します。

upPressed = False
downPressed = False
playPressed = False

upPresseddownPressedplayPressed はすべて割り込みフラグであり、 True の場合に対応するタスクが実行されます。

def clip(x,min,max):
if x < min:
    return min
elif x > max:
    return max
return x

clip() 関数は、入力パラメータの上限と下限を設定するために使用されます。

GPIO.add_event_detect(BtnPin1, GPIO.FALLING, callback=play)
GPIO.add_event_detect(BtnPin2, GPIO.FALLING, callback=volDown)
GPIO.add_event_detect(BtnPin3, GPIO.FALLING, callback=volUp)

BtnPin1BtnPin2BtnPin3 のキー検出イベントを設定します。

  • BtnPin1 が押された場合、割り込み関数 play() が実行されます。

  • BtnPin2 が押された場合、割り込み関数 volDown() が実行されます。

  • BtnPin3 が押された場合、割り込み関数 volUp() が実行されます。

現象の画像

../_images/4.1.2musicplayer.JPG