Arduino 驱动 ISD1820 语音录放模块:串口控制录音与回放
项目简介
ISD1820 是一款低成本(约 $3)的单芯片语音录放模块,单次最长录音 20 秒,自带麦克风前置放大器与扬声器驱动(8Ω/0.25W)。本项目演示如何用 Arduino UNO 通过 3 根 GPIO 线控制其录音(REC)、边沿触发播放(PLAYE)、直通模式(FT),并通过串口监视器发送指令交互,适合初学者快速上手语音交互原型开发。
硬件清单
- Arduino UNO ×1
- ISD1820 模块 ×1
- 8Ω 0.25W 扬声器 ×1
- 跳线 ×6
引脚定义与接线
| ISD1820 引脚 | Arduino 引脚 | 功能说明 |
|---|---|---|
| VCC | 5V | 供电(模块内部有 3.3V LDO) |
| GND | GND | 地 |
| REC | D2 | 录音控制,高电平有效,保持高电平持续录音 |
| PLAYE | D3 | 边沿触发播放,上升沿启动播放至 EOM 或存储满 |
| FT | D5 | 直通模式,高电平时麦克风信号直驱扬声器(不录音) |
| SP+/SP- | 扬声器 | 差分输出,直推 8Ω 喇叭 |
其余引脚(PLAYL、P-E、MIC)本项目悬空。
两种运行模式代码
模式 1:串口交互控制(推荐)
发送 r 开始录音(默认 3 秒),发送 p 播放刚录音频(默认 5 秒)。
#define REC 2
#define PLAY_E 3
#define FT 5
#define REC_TIME 3000
#define PLAY_TIME 5000
void setup() {
pinMode(REC, OUTPUT); pinMode(PLAY_E, OUTPUT); pinMode(FT, OUTPUT);
Serial.begin(9600);
}
void loop() {
while (Serial.available()) {
char c = Serial.read();
if (c=='r' || c=='R') {
digitalWrite(REC, HIGH);
Serial.println("Recording started");
delay(REC_TIME);
digitalWrite(REC, LOW);
Serial.println("Recording Stopped");
}
else if (c=='p' || c=='P') {
digitalWrite(PLAY_E, HIGH); delay(50); digitalWrite(PLAY_E, LOW);
Serial.println("Playback Started");
delay(PLAY_TIME);
Serial.println("Playback Ended");
}
}
Serial.println("### Enter r to record, p to play");
delay(500);
}
模式 2:自动循环录放(无需人工干预)
上电后自动录音 3 秒 → 播放 5 秒 → 间隔 0.5 秒 → 循环。
void loop() {
digitalWrite(REC, HIGH); delay(REC_TIME); digitalWrite(REC, LOW);
digitalWrite(PLAY_E, HIGH); delay(50); digitalWrite(PLAY_E, LOW);
delay(PLAY_TIME); delay(500);
}
关键原理说明
- REC 优先级最高:录音期间忽略播放信号。
- PLAYE 为边沿触发:需给一个 >50ms 的高脉冲,而非电平保持。
- FT 直通模式:拉高 FT 可作扩音器用,但不会写入存储。
- 录音时长:官方 20 秒,实际受采样率影响,代码中可调
REC_TIME上限 10 秒较稳妥。
进阶拓展方向
- 接 SD 卡模块(SPI)实现长时段语音存储与索引播放,做成“会说话的相册”。
- 结合语音识别模块(如 LD3320)实现声控触发录放。
- 双模块级联 + 无线模块组成简易对讲机。
- 利用 P-E 引脚实现循环播放,做门铃/报警提示器。
常见问题排查
- 无声音:检查扬声器接线、FT 是否意外拉高、REC/PLAYE 逻辑是否冲突。
- 录音有噪音:模块对电源纹波敏感,建议给 Arduino 供电加 470μF 电解电容,或单独给模块供电。
- 串口无反应:确认波特率 9600、行结束符设置为“换行符”。
制造工艺