实验12:录音与回放
这个实验做完你会得到什么
手机上按住「录音」说一句话,松手停止;点「播放」,声音从蜂鸣器/喇叭里放出来 —— 一个由手机遥控的硬件复读机。
这是 Arduino 系列的最后一篇,也是唯一一个数据完全留在板子上的实验: 录下来的音频不经过手机,手机只负责发”开始/停止/播放”三个指令。
| 项目 | 说明 |
|---|---|
| 难度 | ★★★☆☆ |
| 用时 | 约 35 分钟 |
| 前置 | 实验03:读一个按钮 |
改编自 MIT 官方教程 App Inventor + IoT: Sound Recorder。 完成品工程:Arduino101SoundRecorder.aia
一、器材清单
| 器材 | 数量 | 说明 |
|---|---|---|
| Arduino 101 | 1 | |
| Seeed Grove 扩展板 | 1 | |
| Grove 录音模块(Sound Recorder) | 1 | 录放一体,只需插一个 D 口 |
二、接线
这个组件有两个引脚属性,但只需要真的插一个模块:
| 属性 | 填什么 | 本文取值 |
|---|---|---|
PlayPin |
录音模块实际插的那个 D 口编号 | 插 D4 → 填 4 |
RecordPin |
比 PlayPin 大 1 的数字 |
填 5 |
⚠️
RecordPin不对应任何要插线的接口 —— 官方教程原文: “There isn’t actually another pin you have to plug in, the Grove board deals with this automatically.”(Grove 扩展板内部自动处理)。所以只插一个 Grove 录音模块, 两个属性按上表填数字即可,别去找第二个插座。
固件:.ino 里把 SOUND_RECORDER 设为 ENABLED,其余 DISABLED。
音质期望值放低:录的是单声道低采样率音频,存在板子有限的内存里, 只能录几秒,回放是明显的”电子音”。这个实验的意义是打通流程,不是做录音笔。
三、界面组件
| 组件 | 命名 | 关键属性 |
|---|---|---|
| 按钮 | 按钮_录音 |
文本「按住录音」 |
| 按钮 | 按钮_播放 |
文本「播放」 |
| 标签 | 标签_录音状态 |
字号 24,文本「就绪」 |
| 计时器 | 计时器1 |
计时器启用取消勾选、间隔 100(用来显示已录秒数) |
| Arduino101SoundRecorder | Arduino101SoundRecorder1 |
不可见,BluetoothDevice = BluetoothLE1、PlayPin = 4、RecordPin = 5 |
四、分步搭代码块
第 1 步:按下开始录,松开停止
按钮的 TouchDown / TouchUp 比 Click 更适合”按住”这种交互:
global 录了多久 = 0
when 按钮_录音.TouchDown() {
Arduino101SoundRecorder1.StartRecording()
global 录了多久 = 0
计时器1.TimerEnabled = true
标签_录音状态.Text = "录音中…"
标签_录音状态.TextColor = "&HFFE53935"
}
when 按钮_录音.TouchUp() {
Arduino101SoundRecorder1.StopRecording()
计时器1.TimerEnabled = false
标签_录音状态.Text = join("已录 ", round(录了多久 / 10), " 秒")
标签_录音状态.TextColor = "&HFF212121"
}
when 计时器1.Timer() {
global 录了多久 = 录了多久 + 1
}
中途验证:按住按钮,状态变红「录音中…」并计时;松开显示录了几秒。
一定要有
StopRecording。只发StartRecording的话,板子会一直录到内存满, 之后的操作全都没反应。
第 2 步:回放
when 按钮_播放.Click() {
Arduino101SoundRecorder1.PlayRecordedSound()
标签_录音状态.Text = "播放中…"
}
中途验证:点播放,蜂鸣器里传出刚才录的声音(电子音,能听出语调就算成功)。
第 3 步:连接与收尾
when BluetoothLE1.Connected() {
标签_状态.Text = "已连接"
按钮_录音.Enabled = true
按钮_播放.Enabled = true
}
when BluetoothLE1.Disconnected() {
计时器1.TimerEnabled = false
标签_状态.Text = "已断开"
按钮_录音.Enabled = false
按钮_播放.Enabled = false
}
when Screen1.BackPressed() {
Arduino101SoundRecorder1.StopRecording()
BluetoothLE1.Disconnect()
}
退出前补一次
StopRecording是保险:万一用户在录音中直接退出, 板子不会一直录下去。
五、排错表
| 现象 | 原因与处理 |
|---|---|
| 录完播放没有声音 | ① RecordPin 没填成 PlayPin + 1;② 模块没插稳;③ 录的时候离麦克风太远 |
| 完全没反应 | 固件 SOUND_RECORDER 没 ENABLED;或两个 Pin 属性只设了一个(两个都要填) |
| 声音全是噪音 | 正常,采样率和位深都很低。靠近一点、说慢一点会好些 |
| 只能录一两秒 | 板子内存有限,这是硬件上限,不是 bug |
| 第二次录音失败 | 上一次没 StopRecording,内存还占着。退出重连或重启板子 |
| 播放时电流声很大 | 蜂鸣器直接由引脚驱动,功率有限。换小喇叭 + 功放模块效果更好 |
六、Arduino 系列回顾
| 实验 | 学到的东西 |
|---|---|
| 00 环境搭建 | IDE、板卡版本、固件开关 |
| 电路基础 | 面包板、限流电阻、三脚元件 |
| 01 板载 LED | 打通 BLE 链路、计时器 |
| 02 外接 LED | PWM 调光 |
| 03 按钮 | 订阅、语义事件 |
| 04 温湿度 | 一个组件两路数据 |
| 05 光照 | 模拟量、传感器联动执行器、边沿检测 |
| 06 土壤湿度 | 两点标定、防重复提醒 |
| 07 接近 | 线序不同导致的引脚号坑 |
| 08 六轴 | 板载传感器、变化量检测 |
| 09 电机 | 供电、启动电压 |
| 10 舵机 | 角度控制、定位舵机与连续旋转舵机 |
| 11 RGB LCD | I2C、异步读回 |
| 12 录音回放 | 双引脚属性单模块、按住式交互 |
组合起来可以做:自动浇水装置(06+09)、指针式仪表(05+10)、 离线环境显示屏(04+11)、声控小车(12+09)。
相关文档
- Arduino101SoundRecorder 组件参考
- 官方原版教程(英文,已标注过时):MIT_App_Inventor_IoT_Sound_Recorder.pdf
扫码添加客服咨询