STM32传感器模块编程实践(二十一)DIY语音控制小车套件模型

文章目录

一.概要

智能小车项目融合了机械、电子、控制、计算机等多学科知识,是提升综合能力的绝佳载体。智能小车的设计是一个"小而全"的工程缩影,它让你在有限的时间和成本内,模拟了真实产品的开发流程,是一次非常宝贵的工程实践和能力证明。体验"从0到1"的创造:从一堆散落的零件和抽象的代码,到最终组装出一台能听话运行的小车,这种创造的成就感是无可替代的。

本文就介绍做一个语音控制小车模型,采用STM32F103C8T6单片机+直流有刷电机+语音识别模块。通过语音模块就能实现小车的前进,后退,左转,右转,停止等动作。

二.实验模型原理

1.硬件连接原理框图

模型主要分为六部分:主芯片单元,语音识别单元,动作执行单元。

图中主控芯片为STM32F103C8T6单片机,动作执行单元L9110S驱动直流有刷电机,语音识别单元是语音识别模块配合喇叭以及咪头。

信号线连接:L9110S模块接单片机的PB12,PB13,PB14,PB15引脚,语音识别模块接单片机的PB5,PB6,PB7,PB8,PB9引脚。

2.各个传感器模块控制原理

语音识别模块交互原理

语音交互模块是一款集成了离线语音识别功能的模块,用户可以通过该模块实现语音识别功能,外部加上麦克风与喇叭,就能实现语音识别与对话。

语音核心板固件程序可以通过 USB转 TTL模块连接实现硬件连接下载,接线是 5V,GND,TX,RX四根线。

使用语音模块的开发软件,天问 Block 编程软件,制作好图形化语音对话控制程序,下图是语音交互程序,接收的语音命令是"前","后","左","右","停","小智小智"生成模型后,点击2M编译下载,连接USB转 TTL模块就能实现对语音模块进行固件程序下载。

下载完成后,就可以按照提示先喊"小智小智"唤醒模块,再按照需要喊出"前","后","左","右"等控制命令,模块相应的引脚就能输出高电平,单片机读取对应的GPIO引脚电平实现控制。

直流有刷电机控制原理

H桥可控制电机的运动和正反转,H桥式电机驱动电路包括4个三极管和一个电机。 要使电机运转,必须导通对角线上的一对三极管。根据不同三极管对的导通情况,电流可能会从左至右或从右至左流过电机,从而控制电机的转向。

当Q1和Q4导通时,电流将经过Q1从左往右流过电机,在经过Q4流到电源负极,这时图中电机可以顺时针转动。

当Q3和Q2导通时,电流将经过Q3从右往左流过电机,在经过Q2流到电源负极,这时图中电机可以逆时针转动。

L9110是为消费类产品,玩具和其他低压或者电池供电的运动控制类应用提供了一个集成的电机驱动器解决方案。此器件能够驱动一个直流有刷电机,由一个内部电荷泵生成所需的栅极驱动电压电路和4个功率NMOS组成H桥驱动,集成了电机正转/反转/停止/刹车四个功能。

L9110功能框图

基本工作模式

a)待机状态

在待机状态下, INA=INB=L。包括驱动功率管在内的所有内部电路都处于关断状态。电路消耗极低 的电流。此时马达输出端OUTA 和OUTB 都为高阻状态。

b)正转模式

正转模式的定义为: INA=H,INB= L, 此时马达驱动端OUTA 输出高电平,马达驱动端OUTB 输出 低电平时,马达驱动电流从OUTA 流入马达,从OUTB 流到地端,此时马达的转动定义为正转模式。

c)反转模式

反转模式的定义为: INA=L,INB= H, 此时马达驱动端OUTB 输出高电平,马达驱动端OUTA 输出 低电平时,马达驱动电流从OUTB 流入马达,从OUTA 流到地端,此时马达的转动定义为反转模式。

d)刹车模式

刹车模式的定义为: INA=H,INB=H ,此时马达驱动端OUTA 以及OUTB 都输出低电平,马达内存储的能量将通过OUTA 端NMOS 管或者OUTB 端NMOS 快速释放,马达在短时间内就会停止转动。

注意在刹车模式下电路将消耗静态功耗。

三.实验模型控制流程

1.板子上电后,语音模块提示"小智小智"唤醒模块,这时候要对模块说"小智小智",提示唤醒成功。

2.模块唤醒成功后,喊"前",人脸识别模块会把模块的A5引脚输出高电平,模块的PA5跟单片机的PB6是连接的,单片机读取到PB6为高电平后,会控制左轮顺时针转(PB12输出高,PB13输出低),右轮逆时针转(PB14输出低,PB15输出高),小车就会前进。

3.根据同理,喊"后",小车就会后退,喊"左",小车就会左转,喊"右",小车就会右转,喊"停",小车就会停止。

四.语音控制小车程序

复制代码
单片机板子与电机模块连接:
板子3.3V-----电机模块V
板子G---------电机模块G
板子B12------电机模块B-1A
板子B13------电机模块B-1B
板子B14------电机模块A-1A
板子B15------电机模块A-1B

单片机板子与语音模块连接:
板子3.3V-----语音模块5V
板子G---------语音模块GND
板子B5--------语音模块PA4
板子B6--------语音模块PA5
板子B7--------语音模块PA3
板子B8--------语音模块PA2
板子B9--------语音模块PA1

安装好4节5号电池,给系统供电,单片机板子上LED灯亮,说明上电完成。

打开STM32CubeMX软件,新建工程

Part Number处输入STM32F103C8,再双击就创建新的工程

配置下载口引脚

配置外部晶振引脚

配置系统主频

PB12,PB13,PB14,PB15配置成输出,PB5,PB6,PB7,PB8,PB9配置成输入。

PB0,PB1配置成输出,用于驱动直流有刷电机。

配置工程文件名,保存路径,KEIL5工程输出方式

生成工程

用Keil5打开工程

添加代码

添加读取语音模块输出的电平,并根据对应的指令驱动直流电机。

主要程序:

c 复制代码
int main(void)
{
  /* USER CODE BEGIN 1 */
  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();//72M系统主频,8M外部晶振

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
	HAL_Delay(3000);//等待3秒
  /* USER CODE BEGIN 2 */

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
		if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_6)==GPIO_PIN_SET)//前进
		{
				HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_SET);//左轮
				HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, GPIO_PIN_RESET);
				HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_RESET);//右轮
				HAL_GPIO_WritePin(GPIOB, GPIO_PIN_15, GPIO_PIN_SET);
			
			
		}
		if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_7)==GPIO_PIN_SET)//右转
		{
			
				HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_SET);//左轮
				HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, GPIO_PIN_RESET);
				HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_RESET);//右轮
				HAL_GPIO_WritePin(GPIOB, GPIO_PIN_15, GPIO_PIN_RESET);
		}
		
		if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_8)==GPIO_PIN_SET)//左转
		{
				HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_RESET);//左轮
				HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, GPIO_PIN_RESET);
				HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_RESET);//右轮
				HAL_GPIO_WritePin(GPIOB, GPIO_PIN_15, GPIO_PIN_SET);
			
		}		
		
		if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_9)==GPIO_PIN_SET)//后退
		{
				HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_RESET);//左轮
				HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, GPIO_PIN_SET);
				HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_SET);//右轮
				HAL_GPIO_WritePin(GPIOB, GPIO_PIN_15, GPIO_PIN_RESET);
		}
		
		if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_5)==GPIO_PIN_SET)//停止
		{
				HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_RESET);//左轮
				HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, GPIO_PIN_RESET);
				HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_RESET);//右轮
				HAL_GPIO_WritePin(GPIOB, GPIO_PIN_15, GPIO_PIN_RESET);
		}
  }
  /* USER CODE END 3 */
}

五.实验效果视频

语音控制小车

六.小结

融合了直流有刷电机控制,NFC刷卡模块,矩阵键盘,OLED显示指纹模块的控制,对STM32的单片机的USART串口,SPI总线,IIC总线通讯有更深的了解。

相关推荐
csdn杰哥1 小时前
瑞萨单片机开发教程[二十八] DTC 串口传输实验
单片机·嵌入式硬件·瑞萨·ra6m5
义嘉泰1 小时前
【硬核拆解】540×540时代的显示核心:集创北方 CO6300 AMOLED驱动芯片深度解析
嵌入式硬件·芯片
铅笔小新z1 小时前
【stm32】GPIO
stm32·嵌入式硬件·mongodb
Darkwanderor1 小时前
使用管道实现进程间通信 (IPC, Inter-Process Communitation)
linux·c语言·c++
冻柠檬飞冰走茶2 小时前
PTA基础编程题目集 7-37 整数分解为若干项之和(C语言实现)
c语言·开发语言·数据结构·算法
csdn杰哥2 小时前
瑞萨单片机开发教程[三十] IIC 触摸驱动实验
单片机·嵌入式硬件·瑞萨·ra6m5
振南的单片机世界2 小时前
高优先级“插队”,低优先级让路:中断嵌套的核心规则
arm开发·stm32·单片机·嵌入式硬件
ahccqw4 小时前
电机入门学习(电机认识,分类)
嵌入式硬件
jianqiang.xue11 小时前
系统服务层设计:沉淀通用能力,让业务层只专注业务
stm32·单片机·嵌入式硬件·mcu·物联网·esp32