import math
import struct
from machine import I2S, Pin
# 1. 設定 I2S 腳位
GPIO_BCK = 2 # SCK
GPIO_LRC = GPIO_BCK + 1 # WS (必須是 ws = sck + 1)
GPIO_DIN = 4 # SD
# 2. 初始化 I2S 介面
# 採樣率 44.1kHz, 16位元, 單聲道 (Mono)
audio_out = I2S(
0,
sck=Pin(GPIO_BCK),
ws=Pin(GPIO_LRC),
sd=Pin(GPIO_DIN),
mode=I2S.TX,
bits=16,
format=I2S.MONO,
rate=44100,
ibuf=10240
)
# 3. 產生 440Hz 正弦波數據 (A4 音符)
sample_rate = 44100
frequency = 440
amplitude = 10000 # 音量大小 (最大 32767)
sample_data = bytearray()
def waveform(frequency):
global sample_data
# 預先計算一個週期的波形
samples_per_cycle = sample_rate // frequency
for i in range(samples_per_cycle):
sample = int(amplitude * math.sin(2 * math.pi * i / samples_per_cycle))
# 將整數轉為 16-bit 有符號小端序位元組 (Little-endian)
sample_data += struct.pack('<h', sample)
print("開始播放測試音...")
waveform(frequency)
# 4. 循環播放
try:
while True:
audio_out.write(sample_data)
# with open("test.wav", "rb") as f:
# f.seek(44) # 跳過 WAV 標頭 (Header)
# while True:
# data = f.read(1024)
# if not data:
# break
# audio_out.write(data)
except KeyboardInterrupt:
print("停止播放")
audio_out.deinit()