基于STM32声控智能小车

目录

一、项目需求

二、方案设计

三、实物演示视频

四、原理图

五、PCB

六、代码

七、资料清单

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

一、项目需求

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

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

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

二、方案设计

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

基于STM32声控智能小车_第1张图片

 三、实物演示视频

基于STM32的声控智能小车

基于STM32声控智能小车

四、原理图

基于STM32声控智能小车_第2张图片

 五、PCB

基于STM32声控智能小车_第3张图片

六、代码

#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<30)
			   {
			      SetMotorVoltageAndDirection(-sd_value,-sd_value);
			      delay_ms(1000);
				    SetMotorVoltageAndDirection(0,sd_value);
				    delay_ms(1000);
			   }
			   else
			   {
			      SetMotorVoltageAndDirection(sd_value,sd_value);
			   }
			   
			 }			
	  }	
		else
		{
		   LED1=LED2=LED3=1;
		   SetMotorVoltageAndDirection(0,0);
		}
  }
}

void RCC_Config(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//A3 A4 MOTORB
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//B0 B1 MOTORA
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);//HC
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //定时器时钟 pwm 控制电机

}



七、资料清单

基于STM32声控智能小车_第4张图片 

 

你可能感兴趣的:(STM32,智能小车,语音控制,stm32,单片机,嵌入式硬件)