Arduino 101 实验12 - 录音与回放

« 返回 Arduino101 平台  IoT 专题

实验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 = BluetoothLE1PlayPin = 4RecordPin = 5

四、分步搭代码块

第 1 步:按下开始录,松开停止

按钮的 TouchDown / TouchUpClick 更适合”按住”这种交互:

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)。


相关文档

文档反馈