MAX98357A ESP32 Micropython
MAX98357A — это цифровой усилитель класса D с входом I²S, который принимает аудиопоток напрямую от ESP32 и воспроизводит его через динамик.
Простой аудиотест.
main.py
from machine import I2S, Pin
import math, array, time
# --- Настройка I2S ---
i2s = I2S(
0,
sck=Pin(26),
ws=Pin(25),
sd=Pin(22),
mode=I2S.TX,
bits=16,
format=I2S.MONO,
rate=22050,
ibuf=10000
)
# --- Функция для генерации и воспроизведения тона ---
def play_tone(freq=440, duration=0.2, volume=0.4):
sample_rate = 22050
block_size = 1024
total_samples = int(sample_rate * duration)
samples_written = 0
while samples_written < total_samples:
buf = array.array("h", [0] * block_size)
for i in range(block_size):
t = (samples_written + i) / sample_rate
buf[i] = int(volume * 32767 * math.sin(2 * math.pi * freq * t))
i2s.write(buf)
samples_written += block_size
# --- Список нот мелодии ---
# частота (Гц), длительность (сек)
melody = [
(523, 0.2), # C5
(659, 0.2), # E5
(784, 0.2), # G5
(1046, 0.3), # C6
(784, 0.2), # G5
(659, 0.2), # E5
(523, 0.4), # C5
]
# --- Воспроизведение ---
for freq, dur in melody:
play_tone(freq, dur)
time.sleep(0.05) # короткая пауза между нотами
i2s.deinit()
Супермарио.
main.py
from machine import I2S, Pin
import math, array, time
# --- Настройка I2S ---
i2s = I2S(
0,
sck=Pin(26), # BCLK
ws=Pin(25), # LRCLK
sd=Pin(22), # DIN
mode=I2S.TX,
bits=16,
format=I2S.MONO,
rate=22050,
ibuf=10000
)
# --- Функция воспроизведения ноты ---
def play_tone(freq=440, duration=0.15, volume=0.4):
sample_rate = 22050
block_size = 512
total_samples = int(sample_rate * duration)
samples_written = 0
while samples_written < total_samples:
buf = array.array("h", [0] * block_size)
for i in range(block_size):
t = (samples_written + i) / sample_rate
buf[i] = int(volume * 32767 * math.sin(2 * math.pi * freq * t))
i2s.write(buf)
samples_written += block_size
# --- Определение нот ---
C5 = 523
D5 = 587
E5 = 659
F5 = 698
G5 = 784
A5 = 880
B5 = 988
C6 = 1047
R = 0 # пауза (rest)
# --- Мелодия (первая фраза темы Mario) ---
melody = [
(E5, 0.15), (E5, 0.15), (R, 0.1), (E5, 0.15),
(R, 0.1), (C5, 0.15), (E5, 0.15),
(G5, 0.3), (R, 0.3), (G4 := 392, 0.15),
(R, 0.3),
(C5, 0.15), (R, 0.1), (G4, 0.15),
(R, 0.1), (E4 := 330, 0.15), (A4 := 440, 0.15),
(B4 := 494, 0.15), (Bb4 := 466, 0.15), (A4, 0.15),
(G4, 0.1), (E5, 0.15), (G5, 0.15), (A5, 0.15),
(F5, 0.15), (G5, 0.15)
]
# --- Проигрывание ---
for freq, dur in melody:
if freq == 0:
time.sleep(dur) # пауза
else:
play_tone(freq, dur)
time.sleep(0.02)
i2s.deinit()
print("🎶 Мелодия завершена!")


Комментарии
Отправить комментарий