Giới thiệu
Ở bài viết trước, chúng ta đã lập trình để M5Go phát âm thanh nhờ vào module wav. Trong bài viết này, chúng ta tiếp tục ứng dụng tính năng còn lại để ghi lại âm thanh.
Chuẩn bị
Trước khi bắt đầu, các bạn cần chuẩn bị một bộ kit M5Go và một thẻ nhớ microSD.
Thực hiện
Các bước kết nối M5Go với M5stack đã được hướng dẫn ở bài trước, nên mình sẽ không nhắc lại. Các bạn có thể xem lại bài viết lập trình M5Go phát âm thanh.
Đầu tiên chúng ta sẽ thêm các module và thư viện cần thiết:
from machine import I2S
import os, uos, wave, time
Tiếp theo khởi tạo I2S để sử dụng speaker của M5Go:
#initialize the I2S device
i2s = I2S( mode = I2S.MODE_MASTER | I2S.MODE_TX | I2S.MODE_RX | I2S.MODE_DAC_BUILT_IN | I2S.MODE_ADC_BUILT_IN, rate = 16000, bits = 16, channel_format = I2S.CHANNEL_ONLY_RIGHT, data_format = I2S.FORMAT_I2S_MSB)
Tiếp theo mount thẻ nhớ để có thể lưu trữ file ghi âm lại:
uos.sdconfig(uos.SDMODE_SPI,clk=18,mosi=23,miso=19,cs=4)
try:
uos.mountsd()
except:
#os.mountsd()
lcd.print('sd card not mounted',0,50,0xffffff)
pass
Đến phần quan trọng của ví dụ này, chúng ta sẽ viết một hàm ghi lại âm thanh và lưu vào thẻ nhớ với tên và thời gian ghi âm tùy chỉnh:
def record_sound(fname, duration=None):
audio = wave.open(fname, 'wb')
# audio.setnchannels(1)
# audio.setsampwidth(2)
# audio.setframerate(16000)
audio.setparams([1, 2, 16000, 0, 'NONE', 'not compressed'])
i2s.sample_rate(16000)
i2s.nchannels(1)
i2s.set_adc_pin(34) # Set the ADC Pin 34
i2s.adc_enable(True)
data = bytes(0)
if duration:
duration_time = (time.ticks_ms() + duration*1000) if duration else 0
while True:
# data = wav.readframes(1024)
data = i2s.read(8000)
audio.writeframes(data)
print('.', end='')
if duration:
if time.ticks_ms() > duration_time:
break
i2s.adc_enable(False)
audio.close()
lcd.print('end',0,0,0xffffff)
wait_ms(5000)
Trái ngược với hàm phát âm thanh. Trong hàm ghi âm, I2S sẽ thu âm thanh từ bên ngoài sau đó truyền cho wav rồi wav sẽ lưu lại dữ liệu.
Cuối cùng, lập trình sự kiện để khi nhấn nút A thì M5Go sẽ thực hiện hành động ghi âm.
while True:
if btnA.wasPressed():
record_sound('/sd/record_demo.wav', 10)
i2s.stop()
Trong đoạn code trên, mình cho M5Go ghi âm trong vòng 10 giây và lưu lại file có tên record_demo.wav trên thẻ nhớ.
Xem clip dưới đây để theo dõi các bước chi tiết hoàn chỉnh nhé.