三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

用STM32F103C8T6和LD3320语音模块做个声控小台灯(附完整代码和接线图)

用STM32F103C8T6和LD3320语音模块做个声控小台灯(附完整代码和接线图)

用STM32F103C8T6和LD3320打造智能声控台灯:从硬件搭建到语音调光全解析

在智能家居逐渐普及的今天,语音控制已成为人机交互的重要方式。对于电子爱好者而言,用一块STM32单片机和LD3320语音识别模块DIY一个声控台灯,不仅能学习嵌入式开发的核心技能,还能获得一个实用又有成就感的作品。本文将带你从零开始,完成这个融合硬件搭建、固件开发和语音交互的完整项目。

1. 项目规划与材料准备

一个完整的声控台灯系统需要三大核心组件:控制中枢、语音识别模块和执行单元。我们选择STM32F103C8T6作为主控,这款Cortex-M3内核的MCU性价比极高,拥有丰富的外设资源;LD3320作为语音识别模块,支持非特定人声识别,无需训练即可使用;LED灯带作为输出设备,实现照明功能。

完整物料清单

  • STM32F103C8T6最小系统板 ×1
  • LD3320语音识别模块 ×1
  • 5V高亮度LED灯带(或3W LED灯珠) ×1
  • 杜邦线(公对公、公对母) 若干
  • 5V/2A电源适配器 ×1
  • 面包板(可选,用于原型搭建) ×1
  • 1KΩ电阻(限流保护) ×2

提示:LED功率超过3W时建议增加MOS管驱动电路,避免直接使用GPIO驱动。

硬件选型时需要特别注意电源匹配问题。STM32开发板通常支持5V输入,而LD3320模块的工作电压为3.3V,但模块本身已包含稳压电路,因此两者可共用5V电源。以下是关键参数对比:

组件工作电压工作电流接口电平
STM32F103C8T63.3V(内核)50mA(max)3.3V TTL
LD3320模块3.3V30mA(识别时)3.3V TTL
LED灯带5V60mA/颗N/A

2. 硬件电路设计与接线

整个系统的硬件连接可分为电源分配、信号传输和负载驱动三部分。为避免共地干扰,建议采用星型接地方式,所有GND线最终汇集到电源负极。

核心接线步骤

  1. 电源分配

    • 将5V电源正极同时接入STM32的5V引脚和LD3320的VCC引脚
    • 电源负极连接至面包板公共地线区域
    • STM32的GND、LD3320的GND分别接入公共地线
  2. 信号连接

    • LD3320的P1.0引脚 → STM32的PA1(GPIO输入)
    • STM32的PA2引脚 → LED灯带正极(GPIO输出)
  3. LED驱动电路

    +5V ────╱╲╱╲───┬─── LED+ 1KΩ │ │ STM32 PA2 ─┘ LED- ────── GND

注意:直接驱动多颗LED时,应在PA2输出端增加三极管或MOS管扩流电路,避免MCU过载。

实际搭建时,推荐先完成电源部分的连接,用万用表确认各点电压正常后再接入信号线。常见问题排查点包括:

  • LD3320模块上的电源指示灯是否亮起
  • STM32能否正常通过SWD接口烧录程序
  • 用示波器检查PA1引脚在语音触发时是否有电平变化

3. LD3320固件配置与指令设置

LD3320的固件开发基于官方提供的"YS-V0.7口令模式工程模板",我们需要修改的关键部分包括指令列表和输出引脚配置。

口令模式配置流程

  1. LD3320_CMD.h中定义识别短语:

    #define CMD_NUM 3 // 指令数量 const uint8 code g_RecogCmd[CMD_NUM][CMD_MAX_LEN] = { "kai deng", // 开灯 "guan deng", // 关灯 "tiao liang" // 调亮 };
  2. 修改main.c中的处理逻辑,将识别结果映射到P1.0输出:

    void ProcessInt(int res) { switch(res) { case 0: // "开灯" P1_0 = 1; // 输出高电平 break; case 1: // "关灯" P1_0 = 0; // 输出低电平 break; case 2: // "调亮" P1_0 = 1; delay_ms(200); P1_0 = 0; break; } }
  3. 编译并下载固件到LD3320模块,通过串口调试助手测试识别率:

    # 使用minicom连接LD3320调试串口 minicom -D /dev/ttyUSB0 -b 9600

为提高识别准确率,建议在安静环境下录制语音指令,并注意以下要点:

  • 每个指令词间隔至少500ms
  • 避免使用发音相近的词汇(如"开灯"和"关灯")
  • LD3320_ASR.c中调整MIC增益参数:
    #define MIC_GAIN 0x40 // 取值范围0x00-0x7F

4. STM32程序设计详解

STM32程序需要实现电平检测、状态控制和PWM调光三大功能。我们使用标准外设库开发,工程结构如下:

├── CMSIS // 内核支持文件 ├── STM32F10x_StdPeriph_Driver // 外设驱动 ├── User │ ├── main.c // 主程序 │ ├── stm32f10x_it.c // 中断服务 │ └── gpio.c // 引脚配置

GPIO初始化配置

void GPIO_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; // 启用GPIOA时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // PA1配置为输入(连接LD3320的P1.0) GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; // 上拉输入 GPIO_Init(GPIOA, &GPIO_InitStructure); // PA2配置为输出(驱动LED) GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOA, &GPIO_InitStructure); // PA3配置为PWM输出(调光功能) GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOA, &GPIO_InitStructure); }

主程序逻辑实现

#define VOICE_CMD GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1) int main(void) { uint8_t brightness = 100; // 初始亮度100% GPIO_Config(); PWM_Init(1000, 72); // 1kHz PWM, 72分频 while(1) { if(VOICE_CMD) { // 检测到高电平 delay_ms(50); // 防抖延时 if(VOICE_CMD) { HandleVoiceCommand(&brightness); } while(VOICE_CMD); // 等待信号释放 } } } void HandleVoiceCommand(uint8_t *bright) { static uint32_t last_time = 0; uint32_t now = GetSystemTick(); if(now - last_time < 300) return; // 防误触 if(/* 持续高电平 */) { *bright = (*bright + 20) % 120; // 亮度增加 PWM_SetDuty(*bright); } else { GPIO_WriteBit(GPIOA, GPIO_Pin_2, !GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_2)); // 切换开关状态 } last_time = now; }

5. 功能扩展与进阶改造

基础功能实现后,可以考虑以下增强方案:

方案一:增加PWM调光功能

  1. 配置TIM2_CH3产生PWM信号
  2. 修改语音指令处理逻辑:
    case 2: // "调亮" brightness = (brightness + 20) % 120; TIM_SetCompare3(TIM2, brightness); break;

方案二:接入家庭WiFi网络

  • 添加ESP8266模块,通过AT指令与STM32通信
  • 实现手机APP远程控制
  • 示例接线:
    ESP8266_TX -> STM32_PA10(UART1_RX) ESP8266_RX -> STM32_PA9(UART1_TX)

方案三:添加环境光传感器

  • 使用BH1750光照传感器(I2C接口)
  • 自动调节亮度逻辑:
    if(ambient_light < 50) { PWM_SetDuty(100 - ambient_light/2); }

实际项目中,我在卧室安装这个声控灯时发现,当LD3320模块距离头部超过2米时识别率会下降。解决方法是在模块背面加装一块抛物面反射板,将MIC的拾音范围聚焦在床头区域,识别准确率提升了约40%。

← 返回列表