共计 1965 个字符,预计需要花费 5 分钟才能阅读完成。
背景与痛点
传统按键控制 LED 的方式存在诸多局限:

- 需要物理接触,在潮湿或特殊环境下操作不便
- 布线复杂,多个按键需要占用大量 GPIO 资源
- 交互方式单一,缺乏智能化元素
语音控制则完美解决了这些问题:
- 非接触式操作,使用场景更广泛
- 通过串口通信只需 2 根线即可实现丰富控制
- 交互更自然,可扩展性强
硬件准备
项目所需的核心元器件:
- ASRPRO 语音识别模块(推荐型号:ASR-01)
- STM32 开发板(推荐 STM32F103C8T6 最小系统板)
- LED 灯(普通 5mm 直插 LED)
- 220Ω 限流电阻
- 杜邦线若干
- USB 转 TTL 模块(用于调试)
硬件连接
系统连接示意图:
ASRPRO 模块 STM32 开发板
TX --> PA10(RX)
RX --> PA9(TX)
VCC --> 3.3V
GND --> GND
LED 连接:PB0 --> 220Ω 电阻 --> LED 正极
LED 负极 --> GND
实测中发现 ASRPRO 模块对电源稳定性要求较高,建议为 STM32 和 ASRPRO 单独供电,避免共地干扰。
ASRPRO 配置
- 下载 ASRPRO 开发工具(ASR IDE)
- 创建新项目,选择 UART 通信协议
- 添加语音指令:
- “ 打开灯光 ” 对应发送指令 0x01
- “ 关闭灯光 ” 对应发送指令 0x00
- 设置波特率为 9600bps,校验位无
- 编译并烧录到 ASRPRO 模块
重要提示:录音时保持环境安静,每个指令录制 3 - 5 次样本以提高识别率。
STM32 开发
工程创建
使用 STM32CubeMX 创建基础工程:
- 选择对应型号 STM32F103C8
- 配置时钟树(外部 8MHz 晶振,系统时钟 72MHz)
- 启用 USART1 异步模式,波特率 9600
- 配置 PB0 为 GPIO 输出
- 生成 HAL 库基础代码
关键代码实现
通信协议解析部分:
// main.c 中添加以下代码
#define CMD_LED_ON 0x01
#define CMD_LED_OFF 0x00
uint8_t uart_rx_buf[1];
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{if(huart->Instance == USART1){switch(uart_rx_buf[0]){
case CMD_LED_ON:
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);
break;
case CMD_LED_OFF:
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET);
break;
default:
break;
}
// 重新启动接收
HAL_UART_Receive_IT(&huart1, uart_rx_buf, 1);
}
}
// 在 main() 函数初始化后添加
HAL_UART_Receive_IT(&huart1, uart_rx_buf, 1);
调试技巧
常见问题及解决方法:
- 通信失败 :
- 检查 TX/RX 是否交叉连接
- 用示波器观察波形,确认波特率一致
-
测量 3.3V 电源是否稳定
-
指令误识别 :
- 重新训练语音模型,增加样本多样性
- 调整 ASRPRO 的识别灵敏度
-
在安静环境下测试
-
LED 不亮 :
- 检查限流电阻是否合适
- 确认 GPIO 配置正确
- 使用万用表测量输出电压
进阶优化
增加指令反馈
可以在 ASRPRO 端添加应答音,或在 STM32 端通过蜂鸣器提供操作反馈:
// 收到指令后触发蜂鸣器
void beep(uint16_t duration_ms)
{HAL_GPIO_WritePin(BUZZER_GPIO_Port, BUZZER_Pin, GPIO_PIN_SET);
HAL_Delay(duration_ms);
HAL_GPIO_WritePin(BUZZER_GPIO_Port, BUZZER_Pin, GPIO_PIN_RESET);
}
多 LED 扩展
修改代码支持多路 LED 控制:
#define LED_NUM 3
const uint16_t LED_PINS[LED_NUM] = {GPIO_PIN_0, GPIO_PIN_1, GPIO_PIN_2};
void control_led(uint8_t led_id, uint8_t state)
{if(led_id < LED_NUM){HAL_GPIO_WritePin(GPIOB, LED_PINS[led_id],
state ? GPIO_PIN_SET : GPIO_PIN_RESET);
}
}
低功耗设计
- 配置 STM32 进入睡眠模式,通过 UART 中断唤醒
- 使用 PWM 调光降低 LED 功耗
- 优化 ASRPRO 的唤醒间隔
思考与延伸
- 如何实现离线语音识别与云服务的混合方案?
- 当需要控制多个设备时,通信协议应该如何设计更高效?
- 在工业噪声环境下,有哪些方法可以提高语音识别率?
通过这个项目,我们完成了从语音识别到硬件控制的全链路实现。这种方案可以轻松扩展到智能家居、工业控制等各种场景,为传统设备添加智能语音交互能力。
正文完
