Освой MicroPython играючи

Сайт Александра Климова

Шкодим

/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000

M5Stack: Воспроизведение WAV-файла (MicroPython)

Мне удалось воспроизвести WAV-файл из флеш-памяти. Файл из SD-карточки не воспроизводится.

При запуске приложения динамики хрипят и шумят. Звук воспроизводится при нажатии кнопки A.


from m5stack import *
from m5ui import *
from uiflow import *
from machine import I2S
from wav import wave

# initialize the I2S device
i2s = I2S(
    mode=I2S.MODE_MASTER | I2S.MODE_TX | I2S.MODE_DAC_BUILT_IN,
    rate=16000,
    bits=16,
    channel_format=I2S.CHANNEL_ONLY_RIGHT,
    data_format=I2S.FORMAT_I2S_MSB,
)

lcd.clear()
lcd.setCursor(0, 0)
lcd.print("Play wave")

def buttonA_wasPressed():
    wav_player("/flash/res/mix.wav")
    i2s.stop()
    pass

btnA.wasPressed(buttonA_wasPressed)

def buttonB_wasPressed():
    wav_player("/sd/bell.wav") # не работает
    i2s.stop()
    pass

btnB.wasPressed(buttonB_wasPressed)

# create a function to play the wav
def wav_player(fname):
    wav = wave.open(fname)
    i2s.set_dac_mode(I2S.DAC_RIGHT_EN)
    i2s.sample_rate(wav.getframerate())
    i2s.bits(wav.getsampwidth() * 8)
    i2s.nchannels(wav.getnchannels())
    i2s.volume(20)

    while True:
        data = wav.readframes(1024)
        if len(data) > 0:
            i2s.write(data)
        else:
            wav.close()
            break

Генерация звука

Не совсем воспроизведение из WAV-файла, используется DAC (Digital to Analog Conversion), оставлю на всякий случай. При нажатии кнопки воспроизводится звук пищалки.


from m5stack import *
from m5ui import *
from uiflow import *

lcd.clear()
lcd.setCursor(0, 0)
lcd.print("Play wave")

def buttonA_wasPressed():
    dac0 = machine.DAC(25)
    dac0.write(3)
    dac0.waveform(1800, dac0.SINE, duration=200, scale=0, offset=0, invert=0)
    dac0.stopwave()
    pass

btnA.wasPressed(buttonA_wasPressed)

Вместо dac0.SINE попробуйте dac0.NOISE (есть и другие варианты).

Реклама