基于STM32声控智能小车 您所在的位置:网站首页 单片机蓝牙小车制作过程 基于STM32声控智能小车

基于STM32声控智能小车

2023-12-16 13:24| 来源: 网络整理| 查看: 265

目录

一、项目需求

二、方案设计

三、实物演示视频

四、原理图

五、PCB

六、代码

七、资料清单

资料下载地址:基于STM32的声控智能小车

一、项目需求

1.能够通过声音控制小车,小车具备语音识别功能;

2.小车实现加速、减速、转向以及前方避障功能;

3.能够根据设计路线自动行驶。

二、方案设计

本课题采用STM32单片机作为主控芯片,结合语音识别技术、电机驱动技术等设计出了一款基于STM32单片机的智能机器人要车。系统通过STM32F103C6T6单片机作为主控芯片,采用ASR01语音识别模块进行语音识别,识别输出的指令输出给STM32单片机,通过L293D电机驱动芯片实现机器人小车的驱动控制,单片机根据接收到的指令对机器人实现“前进、后退、左转、右转”等功能的控制。同时系统通过超声波检测车头与障碍物的距离,当低于设定阈值时,系统自动控制小车作出绕行动作,实现避障。

 三、实物演示视频

基于STM32的声控智能小车

基于STM32声控智能小车

四、原理图

 五、PCB

六、代码 #include "main.h" void Bluetooth_Config(uint32_t baud) { GPIO_InitTypeDef GPIO_InitStructure;// 定义一个GPIO_InitTypeDef类型的变量 USART_InitTypeDef USART_InitStructure;// 定义一个USART_InitTypeDef类型的变量 NVIC_InitTypeDef NVIC_InitStructure; /* 允许GPIOA和USART1的时钟 */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE); /* 配置USART1 */ /* 配置PA9(TXD) */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; // 选择PIN9 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // 复用推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 50MHz速度 GPIO_Init(GPIOA, &GPIO_InitStructure);// 把参数带进函数配置 /* 配置PA10(RXD) */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;// 选择PIN10 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;// 选择浮空输入 GPIO_Init(GPIOA, &GPIO_InitStructure); // 把参数带进函数配置 /* 配置串口USART1的模式 */ USART_InitStructure.USART_BaudRate = baud; // 波特率9600 USART_InitStructure.USART_WordLength = USART_WordLength_8b;// 8个数据位 USART_InitStructure.USART_StopBits = USART_StopBits_1; // 1个停止位 USART_InitStructure.USART_Parity = USART_Parity_No ; // 无奇偶校验 USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;// 无硬件流控制 USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_Init(USART1, &USART_InitStructure); //把上面配置的参数带进函数里面初始化串口 /* 打开空闲中断 */ USART_ITConfig(USART1, USART_IT_IDLE, ENABLE); /* 打开接收中断 */ USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); /* 配置NVIC优先级组 */ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); /* 允许UART1中断 */ NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); USART_ClearFlag(USART1,USART_FLAG_TC); USART_Cmd(USART1, ENABLE);// 打开串口1 } uint8_t aRxBuffer[100]; uint8_t RxCounter=0; uint8_t ReceiveState; void USART1_IRQHandler(void)//串口1蓝牙接收 { uint8_t Clear=Clear; if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET) { aRxBuffer[RxCounter++]=USART1->DR; } else if(USART_GetITStatus(USART1,USART_IT_IDLE)!=RESET) { Clear=USART1->SR; Clear=USART1->DR; ReceiveState=1;; } } // 发送一个字节 void USART1_Send_byte(uint8_t val) { USART_SendData(USART1, val); while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET); //等待发送完成 } // 接收一个字节 uint8_t USART1_Recv_byte(void) { while (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET); return USART_ReceiveData(USART1); } u8 car_zhiling=0; u16 sd_value=0; u32 JL=0; int main() { NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); RCC_Config();//时钟初始化 SystemInit();//初始化系统时钟为72MHZ KEY_Init(); TIM3_PWM_Init(); CGQ_Init(); LED_Init(); LED1=LED2=LED3=1; delay_init(); //延时函数初始化 Bluetooth_Config(9600); xx=0;yy=3;zz=1; Hcsr04Init(); while(1) { key_SMG(); //速度选择 if(yy==1) sd_value=750; else if(yy==2) sd_value=800; else if(yy==3) sd_value=850; //控制执行 if(xx==1) { LED1=0; //语音声控模式 if(zz==1) { LED2=1;LED3=0; if(ReceiveState==1)//如果接收到1帧数据 { ReceiveState=0; // while(RxCounter--)// 把接收到数据发送回串口 // { // USART_SendData(USART1, aRxBuffer[i++]); // while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET); // } RxCounter=0; if(aRxBuffer[0]==0) { car_zhiling=0; } if(aRxBuffer[0]==1) { car_zhiling=1; } if(aRxBuffer[0]==2) { car_zhiling=2; } if(aRxBuffer[0]==3) { car_zhiling=3; } if(aRxBuffer[0]==4) { car_zhiling=4; } } //语音控制 if(car_zhiling==1)//前进 { SetMotorVoltageAndDirection(sd_value,sd_value); }else if(car_zhiling==2)//后退 { SetMotorVoltageAndDirection(-sd_value,-sd_value); } else if(car_zhiling==3)//左转 { SetMotorVoltageAndDirection(sd_value,0); } else if(car_zhiling==4)//右转 { SetMotorVoltageAndDirection(0,sd_value); } else { SetMotorVoltageAndDirection(0,0); } } //红外寻迹模式 if(zz==2) { LED2=0;LED3=1; //红外循迹模式:小车卡着黑线循迹行走 if(CG_Z1==0&&CG_Y1==0) //左右两个传感器都检测到黑线,小车执行停止 { SetMotorVoltageAndDirection(sd_value,sd_value); } else if(CG_Z1==1&&CG_Y1==1) //左右两个传感器都没有检测到黑线,小车执行前进 { SetMotorVoltageAndDirection(0,0); } else if(CG_Z1==0&&CG_Y1==1) //如果左传感器检测到黑线,表示小车车头偏左,为修正执行动作,小车执行右转的动作 { SetMotorVoltageAndDirection(0,sd_value); } else if(CG_Z1==1&&CG_Y1==0) //如果右传感器检测到黑线,表示小车车头偏右,为修正执行动作,小车执行左转的动作 { SetMotorVoltageAndDirection(sd_value,0); } } //自动避障模式 if(zz==3) { LED2=0;LED3=0; JL=(uint32_t) Hcsr04GetLength(); if(JL>99) JL=99; JL=JL%100; //超声波避障模式 if(JL


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有