ESP32 006 MicroPython 实现I2S PCM文件录音并保存到SD卡

准备库文件:将 sdcard.py上传到设备

  • 使用 Thonny / uPyCraft / ampy / WebREPL 等工具
  • 把这段 sdcard.py 文件上传到 ESP32 的根目录(/)

在这里插入图片描述

接线

  • 确保 SD 卡非NTFS模式,模块需要支持 3.3V 逻辑,否则需要电平转换(如下图两个模块,左侧的模块VCC要输入大于3.3V,因为LDO输出电压会减小。右侧将开关调到关闭LDO的位置,直接连接ESP32的3.3VCC即可)。
    在这里插入图片描述
SD 卡引脚ESP32 GPIO(示例)说明
CSGPIO4片选
MOSIGPIO6主机输出
MISOGPIO7主机输入
SCKGPIO5SPI 时钟
VCC3.3V电源
GNDGND接地

测试使用代码

在这里插入图片描述

import machine
from scard import SDCard
import os

# 初始化 SPI 接口(SPI2 在 ESP32 上一般是 HSPI)
spi = machine.SPI(2, baudrate=1_000_000,
                  sck=machine.Pin(5),
                  mosi=machine.Pin(6),
                  miso=machine.Pin(7))

# 设置 CS 引脚
cs = machine.Pin(4, machine.Pin.OUT)

# 初始化 SD 卡
sd = SDCard(spi, cs)

# 挂载到文件系统
os.mount(sd, '/sd')

# 查看目录内容
print("SD 卡内容:", os.listdir('/sd'))

with open("/sd/test.txt", "w") as f:
    f.write("Hello from ESP32!")

print(open("/sd/test.txt").read())

os.umount('/sd')

录音并保存到SD卡

from machine import I2S, Pin, SPI
from scard import SDCard
import os
import time

# === SD 卡初始化 ===
spi = SPI(2, baudrate=1_000_000,
          sck=Pin(5),
          mosi=Pin(6),
          miso=Pin(7))
cs = Pin(4, Pin.OUT)
sd = SDCard(spi, cs)

# 尝试挂载 SD 卡
try:
    os.mount(sd, '/sd')
    print("SD 卡内容:", os.listdir('/sd'))
except OSError:
    print("SD 卡挂载失败")
    raise

# === I2S 麦克风参数 ===
SAMPLE_RATE = 16000
BITS_PER_SAMPLE = 16
CHANNELS = 1
BUFFER_SIZE = 1024

gnd_8 = Pin(8, Pin.OUT)
gnd_8.value(0)  # GND
gnd = Pin(46, Pin.OUT)
gnd.value(0)  # 左声道

i2s = I2S(
    0,  # I2S channel
    sck=Pin(9),    # BCLK (避免与 SD 卡冲突)
    ws=Pin(10),     # L/R clock
    sd=Pin(3),     # SD from mic
    mode=I2S.RX,
    bits=BITS_PER_SAMPLE,
    format=I2S.MONO,
    rate=SAMPLE_RATE,
    ibuf=BUFFER_SIZE * 8
)

# === 录音函数 ===
def record_pcm_to_sd(index, seconds=5):
    filename = "/sd/record_{:03d}.pcm".format(index)
    print("录音开始:", filename)
    total_bytes = SAMPLE_RATE * (BITS_PER_SAMPLE // 8) * seconds
    buf = bytearray(BUFFER_SIZE)
    with open(filename, "wb") as f:
        for _ in range(total_bytes // BUFFER_SIZE):
            num_read = i2s.readinto(buf)
            if num_read > 0:
                f.write(buf)
    print("录音结束:", filename)

# === 定时录音循环 ===
NUM_RECORDINGS = 60
INTERVAL_SECONDS = 50

for i in range(NUM_RECORDINGS):
    try:
        record_pcm_to_sd(i, INTERVAL_SECONDS)
    except OSError as e:
        print("录音保存失败(OSError): ", e)
    except Exception as e:
        print("录音保存失败(未知错误): ", e)
    else:
        print("录音 {} 保存成功。".format(i))
    time.sleep(1)  # 稍作停顿防止 SD 卡忙冲突


# 录音完成,卸载 SD 卡
os.umount('/sd')
print("所有录音已完成并卸载 SD 卡。")
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值