.. include:: /index.rst
:start-after: start_hello_message
:end-before: end_hello_message
.. _py_ac_buzzer:
1.3 アクティブブザー
=========================================
**はじめに**
このプロジェクトでは、NPN トランジスタを使用してアクティブブザーを駆動し、ビープ音を発生させる方法を学びます。アクティブブザーは、音による通知や警告を出すために多くの電子プロジェクトで使用されるシンプルな電子部品です。
----------------------------------------------
**必要なもの**
このプロジェクトを完成させるために、次の部品を用意してください。
.. list-table::
:widths: 30 20
:header-rows: 1
* - 部品
- 購入リンク
* - :ref:`cpn_wires`
- |link_wires_buy|
* - :ref:`cpn_resistor`
- |link_resistor_buy|
* - :ref:`cpn_buzzer`
- \-
* - :ref:`cpn_transistor`
- |link_transistor_buy|
* - :ref:`cpn_fusion_hat`
- \-
* - Raspberry Pi
- \-
----------------------------------------------
**回路図**
この回路では、アクティブブザー、NPN トランジスタ、および 1kΩ 抵抗を使用します。抵抗はベース電流を制限することでトランジスタを保護します。GPIO17 が High レベル(3.3V)を出力するとトランジスタが導通し、ブザーに電流が流れてビープ音が鳴ります。GPIO17 が Low レベルを出力するとトランジスタは遮断され、ブザーは鳴りません。
.. image:: img/fzz/1.2.1_sch.png
:width: 80%
:align: center
----------------------------------------------
**配線図**
以下の手順に従って回路を組み立ててください。
1. NPN トランジスタ、ブザー、および抵抗をブレッドボードに配置します。
2. トランジスタのベースを抵抗を介して GPIO17 に接続します。
3. トランジスタのエミッタを電源(+)に接続します。
4. トランジスタのコレクタをブザーの一方の端子に接続します。
5. ブザーのもう一方の端子をグラウンド(-)に接続します。
.. image:: img/fzz/1.2.1_bb.png
:width: 80%
:align: center
----------------------------------------------
**サンプルプログラムの実行**
このチュートリアルで使用するすべてのサンプルコードは ``ai-lab-kit`` ディレクトリに用意されています。
以下の手順でサンプルを実行してください。
.. raw:: html
.. code-block:: shell
cd ~/ai-lab-kit/python/
sudo python3 1.3_ActiveBuzzer.py
この Python スクリプトは Raspberry Pi の GPIO17 に接続されたブザーを制御します。実行すると次の動作を行います。
1. ブザーは 0.1 秒ごとにオンとオフを繰り返し、ビープ音を発生します。
2. コンソールにはブザーの動作に合わせて "Buzzer On" と "Buzzer Off" が表示されます。
3. ユーザーが ``Ctrl+C`` を押してスクリプトを中断するまで、ビープ音は継続します。
----------------------------------------------
**コード**
次の Python コードでは、アクティブブザーをループでオン・オフさせてビープ音を発生させます。
.. raw:: html
.. code-block:: python
#!/usr/bin/env python3
from fusion_hat.modules import Buzzer
from fusion_hat.pin import Pin
from time import sleep
# Initialize a Buzzer object on GPIO pin 17
buzzer = Buzzer(Pin(17))
try:
while True:
# Turn on the buzzer
print('Buzzer On')
buzzer.on()
sleep(0.1) # Keep the buzzer on for 0.1 seconds
# Turn off the buzzer
print('Buzzer Off')
buzzer.off()
sleep(0.1) # Keep the buzzer off for 0.1 seconds
except KeyboardInterrupt:
# Handle KeyboardInterrupt (Ctrl+C) for clean script termination
pass
このスクリプトを実行すると、Raspberry Pi に接続されたブザーは 0.1 秒ごとにオンとオフを繰り返してビープ音を発生します。同時にコンソールには “Buzzer On” と “Buzzer Off” のメッセージが表示され、ブザーの状態と同期します。``Ctrl + C`` を押してプログラムを停止するまで、この動作は継続します。
----------------------------------------------
**コードの理解**
1. **ライブラリのインポート**
``fusion_hat`` ライブラリは GPIO ピンを簡単に制御するためのインターフェースを提供し、 ``time`` モジュールは待機時間を作るために使用されます。
.. code-block:: python
from fusion_hat.modules import Buzzer
from fusion_hat.pin import Pin
from time import sleep
2. **ブザーの初期化**
``Buzzer`` オブジェクトを作成し、Pin 17 に関連付けます。
.. code-block:: python
buzzer = Buzzer(Pin(17))
3. **制御ループ**
プログラムは無限ループ( ``while True`` )を使用して、0.1 秒ごとにブザーをオンとオフに切り替え、ビープ音を作ります。 ``print`` 文はコンソールに状態を表示します。
.. code-block:: python
while True:
print('Buzzer On')
buzzer.on()
sleep(0.1)
print('Buzzer Off')
buzzer.off()
sleep(0.1)
4. **キーボード割り込み処理**
``try-except`` ブロックにより、Ctrl+C を使ってプログラムを安全に終了できます。
.. code-block:: python
except KeyboardInterrupt:
pass
----------------------------------------------
**トラブルシューティング**
1. **ブザーから音が出ない**
- **原因**: GPIO ピン接続の誤り、またはブザー配線ミス。
- **対処方法**: ブザーが GPIO17 とグラウンド(GND)に正しく接続されていることを確認してください。
2. **ブザーが常にオンまたはオフのまま**
- **原因**: ブザーの故障、または GPIO 設定の問題。
- **対処方法**: ブザーに直接電圧を与えて正常に動作するか確認してください。
3. **スクリプトが KeyboardInterrupt に反応しない**
- **原因**: ``except`` ブロックが正しく処理していない可能性。
- **対処方法**: ``try...except KeyboardInterrupt`` 構造が正しく実装されているか、またメインループを妨げる他のプロセスがないか確認してください。
4. **ビープ音が速すぎる、または耳障り**
- **原因**: ``sleep(0.1)`` の間隔が短すぎる。
- **対処方法**: ``sleep()`` の時間を長くして、ビープ間隔を調整してください。
----------------------------------------------
**発展アイデア**
1. **カスタムビープパターン**
異なるイベントや通知のために、独自のビープパターンを作成してみましょう。
.. code-block:: python
def beep_pattern():
buzzer.on()
sleep(0.3)
buzzer.off()
sleep(0.1)
buzzer.on()
sleep(0.1)
buzzer.off()
2. **ユーザー入力によるブザー制御**
ユーザーがブザーのオン・オフやパターンを動的に変更できるようにします。
.. code-block:: python
while True:
command = input("Enter 'on', 'off', or 'pattern': ")
if command == 'on':
buzzer.on()
elif command == 'off':
buzzer.off()
elif command == 'pattern':
beep_pattern()
----------------------------------------------
**まとめ**
このプロジェクトでは、NPN トランジスタと Raspberry Pi の GPIO ピンを使ってアクティブブザーを駆動する方法を学びました。シンプルな回路とコードで音を出せるため、通知音や警告音などのサウンドベースの電子プロジェクトの入門として最適です。