ショップ

取扱説明書

  • 準備中

製品概要

各種の開発ボードにPWMサウンド出力機能を追加する拡張ボードです。

CircuitPythonでは、DA変換を使用せず、audiopwmioモジュールを利用して音声波形データをPWMでエンコードしローパスフィルターを通すことで、デジタルピンでアナログ音声出力をすることができます。SOUND-PLAY-PLUSはこのような機能を利用したCircuitPythonでのアナログ音声出力で利用するために開発されました。

また、音源としてデジタルシンセサイザー機能を提供するCircuitPythonのsynthioモジュールを使用することにより、様々な音作りを楽しむことができます。

もちろん、従来のArduinoのtone()やCircuitPythonのsimpleio.tone()で出力されるデジタル音(方形波)の出力にも使用できます。

  • D級アンプとスピーカーを搭載しており、PWMでエンコードされた音声を再生できます。特に、CircuitPythonのsynthioの出力の再生に適しています。
  • D級アンプとしてPAM8302Aを搭載しています。
  • PWMノイズを低減するためのローパスフィルタを搭載しています。
  • 音程の制御や、様々な用途の入力に利用できるアナログジョイスティックを搭載しています。
  • 音量の調整用の可変抵抗が搭載されています。
  • ブレッドボードやジャンプワイヤを使用せず、Raspberry Pi PICO等の端子や、RP2040-UNO等の稼働電圧が3.3VのUNO形状の開発ボードの端子に直接接続することができます。

開発ボードとの接続

SOUND-PLAY-PLUSとPICOなどの開発ボードの接続は、ブレッドボードやジャンプワイヤ―などを使って行うことももちろん可能ですが、製品に含まれているピンソケットやピンヘッダーを使用すると、SOUND-PLAY-PLUSと開発ボードを手軽かつ確実に接続することができます。

Raspberry Pi PICOシリーズへの接続例

RP2040-UNO-R2への接続例


CircuitPythonによるプログラム例

simpleio.tone()による基本的な音の出力

内臓タイマーを使用した音声出力例です。Arduinoでは、tone()関数の利用に相当します。音のPWM出力と書かれていることも多いのですが、基本的には周波数が重要でデューティーサイクルは問題ではないので、PWMというべきではないですね。

import time
import board
from simpleio import tone

# 音符の周波数 (単位: Hz)
NOTES = {
    "C4": 261,
    "D4": 294,
    "E4": 329,
    "F4": 349,
    "G4": 392,
    "A4": 440,
    "B4": 493,
    "C5": 523,
    "REST": 0  # 休符
}

# 「カエルの歌」の楽譜 (音符と長さの組み合わせ)
# 長さは秒単位で指定
SONG = [
    ("C4", 0.5), ("D4", 0.5), ("E4", 0.5), ("F4", 0.5),
    ("E4", 0.5), ("D4", 0.5), ("C4", 0.5), ("REST", 0.5),
    ("E4", 0.5), ("F4", 0.5), ("G4", 0.5), ("A4", 0.5),
    ("G4", 0.5), ("F4", 0.5), ("E4", 0.5), ("REST", 0.5)
]

print("カエルの歌を演奏します。")

# 楽譜を演奏
while True:
    for note, length in SONG:
        if NOTES[note] == 0:  # 休符の場合
            print(f"休符: {length}s")
            time.sleep(length)  # 秒単位の休符
        else:
            print(f"再生中: {note}, 長さ: {length}s")
            tone(board.GP26, NOTES[note], length)  # 周波数と長さを指定 (秒単位)
    time.sleep(1)  # 演奏間に1秒の休止

ちなみにこのプログラムは、WindowsのCopilotに指示して作ってもらったものです。

Waveファイルの再生

WAVEファイルに記録された音楽などの音声データをPWMでエンコードし出力します。

import board
import audiopwmio
import audiocore

audio = audiopwmio.PWMAudioOut(board.GP26)
wav = audiocore.WaveFile(open("sample.wav", "rb"))

audio.play(wav)
while audio.playing:
  pass
print("stopped")

synthioを使用して和音を出力

import time
import board
import audiomixer
import synthio
import audiopwmio

audio = audiopwmio.PWMAudioOut(board.GP25)

mixer = audiomixer.Mixer(channel_count=1, sample_rate=22050, buffer_size=2048)
synth = synthio.Synthesizer(channel_count=1, sample_rate=22050)

audio.play(mixer)
mixer.voice[0].play(synth)
mixer.voice[0].level = 0.4

while True:
    synth.press((65, 69, 72))  # midi note 65 = F4
    time.sleep(0.5)
    synth.release((65, 69, 72))  # release the note we pressed
    time.sleep(0.5)
    mixer.voice[0].level = (mixer.voice[0].level - 0.1) % 0.4  # reduce volume each pass

回路図


関連製品