注釈

こんにちは、SunFounder Raspberry Pi & Arduino & ESP32 Enthusiast Community on Facebookへようこそ!他の愛好家と一緒に、Raspberry Pi、Arduino、ESP32の世界により深く入り込みましょう。

参加する理由

  • 専門家サポート: 購入後の問題や技術的な課題を、コミュニティと私たちのチームの助けを借りて解決します。

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

  • 限定プレビュー: 新製品の発表や先行プレビューに早期アクセスできます。

  • 特別割引: 最新製品を特別割引でお楽しみいただけます。

  • 季節限定キャンペーンとプレゼント: プレゼント企画やホリデーキャンペーンに参加しましょう。

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

1.4 パッシブブザー

はじめに

このプロジェクトでは、異なる周波数でパッシブブザーを駆動し、音楽を演奏する方法を学びます。パッシブブザーはアクティブブザーとは異なり、音を出すために外部からの信号(周波数信号)が必要です。


必要なもの

このプロジェクトを完成させるために、次の部品を用意してください。

部品

購入リンク

ジャンパーワイヤー

購入

抵抗器

購入

ブザー

購入

トランジスタ

購入

Fusion HAT+

-

Raspberry Pi

-


回路図

この回路では、パッシブブザー、NPN トランジスタ、および 1kΩ 抵抗を使用します。抵抗は過大な電流からトランジスタを保護します。トランジスタに接続された GPIO ピンの周波数を変化させることで、ブザーは異なる音を発生し、簡単な音楽を演奏することができます。

../_images/1.2.2_sch.png

配線図

以下の手順に従って回路を組み立ててください。

  1. NPN トランジスタのベースを抵抗を介して PWM0 に接続します。

  2. トランジスタのエミッタを電源(+)に接続します。

  3. トランジスタのコレクタをパッシブブザーの一方の端子に接続します。

  4. ブザーのもう一方の端子をグラウンド(-)に接続します。

../_images/1.2.2_bb.png

サンプルプログラムの実行

このチュートリアルで使用するすべてのサンプルコードは ai-lab-kit ディレクトリに用意されています。 以下の手順でサンプルを実行してください。

cd ~/ai-lab-kit/python/
sudo python3 1.4_PassiveBuzzer.py

スクリプトを実行すると、パッシブブザーは PWM0 を利用して短いメロディを演奏します。各音符は設定された時間だけ順番に再生され、再生中の音符はコンソールにも表示されます。メロディが終了するとブザーは自動的に停止し、音符が None の部分では無音の休符になります。また、 Ctrl + C を押すことでいつでもプログラムを停止できます。


コード

以下の 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 は音符の長さを制御するために使われます。

    from fusion_hat.modules import Buzzer
    from fusion_hat.pwm import PWM
    from time import sleep
    
  2. ブザーの初期化

    Buzzer オブジェクトを PWM0 に接続して、音を生成できるようにします。

    # Initialize a TonalBuzzer connected to PWM 0
    tb = Buzzer(PWM('P0'))  # Update this pin number based on your setup
    
  3. 音符の再生

    play 関数は、音符と再生時間のタプルのリストを順番に処理します。それぞれの音符は指定された時間だけ再生されます。

    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 秒)の組み合わせが定義されています。

    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 などでプログラムを中断しても安全に終了できます。

    try:
        play(tune)
    except KeyboardInterrupt:
        pass
    

トラブルシューティング

  1. ブザーから音が出ない

    • 原因:GPIO ピン接続の誤り、またはブザーの種類が適切でない。

    • 対処方法:TonalBuzzer が PWM0 に正しく接続されているか確認してください。

  2. 音が途切れる、または不安定

    • 原因sleep() のタイミング設定が適切でない可能性。

    • 対処方法tune リストの各音符の再生時間が適切に設定されているか確認してください。


発展アイデア

  1. カスタムメロディ

    ユーザーが独自の音符と再生時間を入力できるようにします。

    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. 複数のメロディ

    あらかじめ複数のメロディを用意し、ユーザーが選択できるようにします。

    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. 再生速度の動的調整

    音符の長さを変更することで、再生速度を動的に調整できます。

    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)
    

まとめ

このプロジェクトでは、パッシブブザーを使用して音符を再生する方法を学びました。ハードウェアとソフトウェアを組み合わせることで、さまざまな音やメロディを作成でき、インタラクティブな電子プロジェクトに応用することができます。