.. note::
こんにちは、SunFounderのRaspberry Pi & Arduino & ESP32愛好家コミュニティへようこそ!Facebook上でRaspberry Pi、Arduino、ESP32についてもっと深く掘り下げ、他の愛好家と交流しましょう。
**参加する理由は?**
- **エキスパートサポート**:コミュニティやチームの助けを借りて、販売後の問題や技術的な課題を解決します。
- **学び&共有**:ヒントやチュートリアルを交換してスキルを向上させましょう。
- **独占的なプレビュー**:新製品の発表や先行プレビューに早期アクセスしましょう。
- **特別割引**:最新製品の独占割引をお楽しみください。
- **祭りのプロモーションとギフト**:ギフトや祝日のプロモーションに参加しましょう。
👉 私たちと一緒に探索し、創造する準備はできていますか?[|link_sf_facebook|]をクリックして今すぐ参加しましょう!
.. _4.1.2_py:
4.1.2 ミュージックプレイヤー
===============================
はじめに
--------------------
プロジェクト :ref:`3.1.3_py` では、スピーカーで曲を再生しました。今回は、音楽の再生/一時停止と音量を制御するための3つのボタンを追加します。
必要な部品
------------------------------
このプロジェクトで必要なコンポーネントは以下の通りです。
.. image:: ../img/musicplayer_list.png
:width: 800
:align: center
一式をまとめて購入するのが便利です。リンクはこちら:
.. list-table::
:widths: 20 20 20
:header-rows: 1
* - 名前
- このキットのアイテム
- リンク
* - Raphael Kit
- 337
- |link_Raphael_kit|
以下のリンクから個別に購入することもできます。
.. list-table::
:widths: 30 20
:header-rows: 1
* - コンポーネントの紹介
- 購入リンク
* - :ref:`cpn_gpio_board`
- |link_gpio_board_buy|
* - :ref:`cpn_breadboard`
- |link_breadboard_buy|
* - :ref:`cpn_wires`
- |link_wires_buy|
* - :ref:`cpn_resistor`
- |link_resistor_buy|
* - :ref:`cpn_audio_speaker`
- \-
* - :ref:`cpn_button`
- |link_button_buy|
回路図
-----------------------
============ ======== ======== ===
T-Board Name physical wiringPi BCM
GPIO17 ピン11 0 17
GPIO18 ピン12 1 18
GPIO27 ピン13 2 27
============ ======== ======== ===
.. image:: ../img/3.1.16_schematic.png
:width: 600
:align: center
実験手順
------------------------------
**ステップ1:** 回路を組み立てる。
.. image:: ../img/3.1.16fritzing.png
:width: 800
:align: center
上記の図に従って回路を組み立てたら、Raspberry Piの3.5mmオーディオジャックにオーディオケーブルを挿入します。
.. image:: ../img/audio4.png
:width: 400
:align: center
**ステップ2:** コードのフォルダに移動する。
.. raw:: html
.. code-block::
cd ~/raphael-kit/python/
**ステップ3:** 実行する。
.. raw:: html
.. code-block::
python3 4.1.2_MusicPlayer.py
コードが実行された後、Raspberry Piは ``~/raphael-kit/music`` ディレクトリ内の ``my_music.mp3`` ファイルを再生します。
* ボタン1で音楽を一時停止/再生します。
* ボタン2で音量を下げます。
* ボタン3で音量を上げます。
他の音楽ファイルをRaspberry Piにアップロードしたい場合は、 :ref:`filezilla` を参照してください。
**コード**
.. note::
以下のコードは **修正/リセット/コピー/実行/停止** が可能です。ただし、それに先立って、 ``raphael-kit/python`` のようなソースコードのパスに移動する必要があります。コードを修正した後、直接実行して効果を確認することができます。
.. raw:: html
.. code-block:: 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()
**コードの説明**
.. code-block:: python
from pygame import mixer
mixer.init()
``pygame`` ライブラリの ``Mixer`` メソッドをインポートし、メソッドを初期化します。
.. code-block:: python
BtnPin1 = 18
BtnPin2 = 17
BtnPin3 = 27
volume = 0.7
三つのボタンのピンポートを定義し、初期音量を0.7に設定します。
.. code-block:: python
upPressed = False
downPressed = False
playPressed = False
``upPressed`` 、 ``downPressed`` 、 ``playPressed`` はすべて割り込みフラグであり、 ``True`` の場合に対応するタスクが実行されます。
.. code-block:: python
def clip(x,min,max):
if x < min:
return min
elif x > max:
return max
return x
``clip()`` 関数は、入力パラメータの上限と下限を設定するために使用されます。
.. code-block:: python
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)
``BtnPin1`` 、 ``BtnPin2`` 、 ``BtnPin3`` のキー検出イベントを設定します。
* ``BtnPin1`` が押された場合、割り込み関数 ``play()`` が実行されます。
* ``BtnPin2`` が押された場合、割り込み関数 ``volDown()`` が実行されます。
* ``BtnPin3`` が押された場合、割り込み関数 ``volUp()`` が実行されます。
現象の画像
-----------------------
.. image:: ../img/4.1.2musicplayer.JPG
:align: center