.. include:: /index.rst
:start-after: start_hello_message
:end-before: end_hello_message
.. _py_pa_buzzer:
1.4 パッシブブザー
===========================
**はじめに**
このプロジェクトでは、異なる周波数でパッシブブザーを駆動し、音楽を演奏する方法を学びます。パッシブブザーはアクティブブザーとは異なり、音を出すために外部からの信号(周波数信号)が必要です。
----------------------------------------------
**必要なもの**
このプロジェクトを完成させるために、次の部品を用意してください。
.. list-table::
:widths: 30 20
:header-rows: 1
* - 部品
- 購入リンク
* - :ref:`cpn_wires`
- |link_wires_buy|
* - :ref:`cpn_resistor`
- |link_resistor_buy|
* - :ref:`cpn_buzzer`
- |link_passive_buzzer_buy|
* - :ref:`cpn_transistor`
- |link_transistor_buy|
* - :ref:`cpn_fusion_hat`
- \-
* - Raspberry Pi
- \-
----------------------------------------------
**回路図**
この回路では、パッシブブザー、NPN トランジスタ、および 1kΩ 抵抗を使用します。抵抗は過大な電流からトランジスタを保護します。トランジスタに接続された GPIO ピンの周波数を変化させることで、ブザーは異なる音を発生し、簡単な音楽を演奏することができます。
.. image:: img/fzz/1.2.2_sch.png
----------------------------------------------
**配線図**
以下の手順に従って回路を組み立ててください。
1. NPN トランジスタのベースを抵抗を介して PWM0 に接続します。
2. トランジスタのエミッタを電源(+)に接続します。
3. トランジスタのコレクタをパッシブブザーの一方の端子に接続します。
4. ブザーのもう一方の端子をグラウンド(-)に接続します。
.. image:: img/fzz/1.2.2_bb.png
:width: 80%
:align: center
----------------------------------------------
**サンプルプログラムの実行**
このチュートリアルで使用するすべてのサンプルコードは ``ai-lab-kit`` ディレクトリに用意されています。
以下の手順でサンプルを実行してください。
.. raw:: html
.. code-block:: shell
cd ~/ai-lab-kit/python/
sudo python3 1.4_PassiveBuzzer.py
スクリプトを実行すると、パッシブブザーは PWM0 を利用して短いメロディを演奏します。各音符は設定された時間だけ順番に再生され、再生中の音符はコンソールにも表示されます。メロディが終了するとブザーは自動的に停止し、音符が ``None`` の部分では無音の休符になります。また、 ``Ctrl + C`` を押すことでいつでもプログラムを停止できます。
----------------------------------------------
**コード**
以下の Python コードは、パッシブブザーを使って音符を生成し、メロディを再生します。
.. raw:: html
.. code-block:: python
#!/usr/bin/env python3
from fusion_hat.modules import Buzzer
from fusion_hat.pwm import PWM
from time import sleep
# Initialize a TonalBuzzer connected to PWM 0
tb = Buzzer(PWM('P0')) # Update this pin number based on your setup
def play(tune):
"""
Play a musical tune using the buzzer.
:param tune: List of tuples (note, duration), where each tuple represents a note and its duration.
"""
for note, duration in tune:
print(note) # Output the current note being played
tb.play(note,float(duration)) # Play the note on the buzzer
tb.off() # Stop playing after the tune is complete
# Define a musical tune as a sequence of notes and durations
tune = [('C#4', 0.2), ('D4', 0.2), (None, 0.2),
('Eb4', 0.2), ('E4', 0.2), (None, 0.6),
('F#4', 0.2), ('G4', 0.2), (None, 0.6),
('Eb4', 0.2), ('E4', 0.2), (None, 0.2),
('F#4', 0.2), ('G4', 0.2), (None, 0.2),
('C4', 0.2), ('B4', 0.2), (None, 0.2),
('F#4', 0.2), ('G4', 0.2), (None, 0.2),
('B4', 0.2), ('Bb4', 0.5), (None, 0.6),
('A4', 0.2), ('G4', 0.2), ('E4', 0.2),
('D4', 0.2), ('E4', 0.2)]
try:
play(tune) # Execute the play function to start playing the tune
except KeyboardInterrupt:
# Handle KeyboardInterrupt for graceful termination
pass
この Python スクリプトは PWM0 に接続されたパッシブブザーを使ってメロディを再生します。実行すると次の動作を行います。
1. スクリプトはあらかじめ定義された音符のシーケンス( ``tune`` )を順番に再生し、それぞれ指定された時間だけ鳴らします。
2. 再生中の音符はコンソールにも表示され、視覚的に確認できます。
3. すべての音符が再生されるとメロディは自動的に終了します。音符が ``None`` の場合は休符となり、ブザーは鳴りません。
4. ``Ctrl+C`` を押すことで、プログラムを安全に中断できます。
----------------------------------------------
**コードの理解**
1. **ライブラリのインポート**
``fusion_hat`` ライブラリの ``Buzzer`` クラスは音を生成するために使用され、 ``time.sleep`` は音符の長さを制御するために使われます。
.. code-block:: python
from fusion_hat.modules import Buzzer
from fusion_hat.pwm import PWM
from time import sleep
2. **ブザーの初期化**
``Buzzer`` オブジェクトを PWM0 に接続して、音を生成できるようにします。
.. code-block:: python
# Initialize a TonalBuzzer connected to PWM 0
tb = Buzzer(PWM('P0')) # Update this pin number based on your setup
3. **音符の再生**
``play`` 関数は、音符と再生時間のタプルのリストを順番に処理します。それぞれの音符は指定された時間だけ再生されます。
.. code-block:: python
def play(tune):
for note, duration in tune:
print(note) # Output the current note being played
tb.play(note,float(duration)) # Play the note on the buzzer
tb.off() # Stop playing after the tune is complete
4. **メロディの定義**
``tune`` 変数には、音符(例: ``'C#4'`` )と再生時間(例:0.2 秒)の組み合わせが定義されています。
.. code-block:: python
tune = [
('C#4', 0.2), ('D4', 0.2), (None, 0.2),
('Eb4', 0.2), ('E4', 0.2), (None, 0.6),
('F#4', 0.2), ('G4', 0.2), (None, 0.6),
('Eb4', 0.2), ('E4', 0.2), (None, 0.2),
('F#4', 0.2), ('G4', 0.2), (None, 0.2),
('C4', 0.2), ('B4', 0.2), (None, 0.2),
('F#4', 0.2), ('G4', 0.2), (None, 0.2),
('B4', 0.2), ('Bb4', 0.5), (None, 0.6),
('A4', 0.2), ('G4', 0.2), ('E4', 0.2),
('D4', 0.2), ('E4', 0.2)
]
5. **キーボード割り込み処理**
``try-except`` ブロックにより、Ctrl+C などでプログラムを中断しても安全に終了できます。
.. code-block:: python
try:
play(tune)
except KeyboardInterrupt:
pass
----------------------------------------------
**トラブルシューティング**
1. **ブザーから音が出ない**
- **原因**:GPIO ピン接続の誤り、またはブザーの種類が適切でない。
- **対処方法**:TonalBuzzer が PWM0 に正しく接続されているか確認してください。
2. **音が途切れる、または不安定**
- **原因**: ``sleep()`` のタイミング設定が適切でない可能性。
- **対処方法**: ``tune`` リストの各音符の再生時間が適切に設定されているか確認してください。
----------------------------------------------
**発展アイデア**
1. **カスタムメロディ**
ユーザーが独自の音符と再生時間を入力できるようにします。
.. code-block:: python
user_tune = []
while True:
note = input("Enter a note (or 'stop' to finish): ")
if note.lower() == 'stop':
break
duration = float(input("Enter duration for the note: "))
user_tune.append((note, duration))
play(user_tune)
2. **複数のメロディ**
あらかじめ複数のメロディを用意し、ユーザーが選択できるようにします。
.. code-block:: python
tunes = {
"tune1": [('C4', 0.5), ('D4', 0.5), (None, 0.5)],
"tune2": [('G4', 0.3), ('A4', 0.3), (None, 0.3)]
}
choice = input("Choose a tune (tune1/tune2): ")
play(tunes[choice])
3. **リアルタイム操作**
ボタンやキーボード入力を利用して音符を再生し、簡単な楽器のように操作することもできます。
4. **メロディの連続再生**
複数のメロディを連続して再生し、より長い楽曲を作成することができます。
5. **再生速度の動的調整**
音符の長さを変更することで、再生速度を動的に調整できます。
.. code-block:: python
speed_factor = float(input("Enter speed factor (e.g., 1.0 for normal, 0.5 for faster): "))
adjusted_tune = [(note, duration * speed_factor) for note, duration in tune]
play(adjusted_tune)
----------------------------------------------
**まとめ**
このプロジェクトでは、パッシブブザーを使用して音符を再生する方法を学びました。ハードウェアとソフトウェアを組み合わせることで、さまざまな音やメロディを作成でき、インタラクティブな電子プロジェクトに応用することができます。