[CubeMX]stm32通过wifi模块手机控制麦轮小车

由于机器人比赛用到了麦轮小车,自己又使用wifi模块写过程序,因此做了一个可以用手机APP控制的小车, 同时使用FreeRTOS实现多任务处理,使得stm32的实时性更高。

摘要

STM32F103开发板作为WIFI麦轮小车系统控制中心,与ESP8266WIFI模块、直流电机、L298N驱动模块、蜂鸣器一起构成可用手机控制的WIFI麦轮小车系统。单片机输出高低电平来驱动电机驱动模块,控制4个麦轮的转向,从而产生不同的移动方式。程序能够自行创建WIFI热点与手机实现双向通信,通过wifi模块完成手机对stm32外设的控制。同时创建FreeRTOS迷你的实时操作系统内核,作为一个轻量级的操作系统,可满足系统的多任务时效性。

系统基本方案

本设计采用STM32F103C8T6作为主控芯片,手机作为遥控器,通过wifi模块ESP8266,可控制麦轮小车前进、后退、转弯、漂移,传输稳定距离远,模块体积小不占地方,手机打开APP连接后即可控制方向。stm32先进行wifi模块初始化,发送AT指令使得wifi模块进入AP模式,自动创建手机可以连接的热点,手机接入TCP,开始控制小车。除此之外,stm32通过FreeRTOS执行多任务处理,能够实现同时控制蜂鸣器和LED灯闪烁,提高了系统的实时响应能力。同时采用了LM2596稳压模块,使得航模电池可以同时给单片机和298N供电。通过麦克纳母轮,依靠不同的转向方式,麦轮最终合成一个合力矢量,使得小车在任意方向上都能自由地移动,而不改变车身的方向。

 图1-1 系统设计程序框图

各部分方案选择

电源选择

由于WIFI控制小车需要脱离电源供电的影响,因此采用航模电池供电,航模电池可移动性更高。
在这里插入图片描述

电机选择

由于麦轮控制小车不需要高速运行,但需要高扭矩,因此选择大扭矩直流电机。
在这里插入图片描述

电机驱动选择

采用使用L298N芯片。L298N是一种高电压、大电流电机驱动芯片,属于H桥集成电路,内部包含4通道逻辑驱动电路,最高工作电压可达46V,峰值电流可达3A,持续工作电流为2A。
在这里插入图片描述

系统理论分析和计算

麦轮控制方案

在这里插入图片描述
全向轮和麦克纳母轮常用于机器人领域,实现全方位移动。这种全方位移动方式是基于一个有许多位于机轮周边的轮轴的中心轮的原理上,这些成角度的周边轮轴把一部分的机轮转向力转化到一个机轮法向力上面。
依靠各自机轮的方向和速度,这些力的最终合成在任何要求的方向上产生一个合力矢量从而保证了这个平台在最终的合力矢量的方向上能自由地移动,而不改变机轮自身的方向。在它的轮缘上斜向分布着许多小滚子,故轮子可以横向滑移。小滚子的母线很特殊,当轮子绕着固定的轮心轴转动时,各个小滚子的包络线为圆柱面,所以该轮能够连续地向前滚动。麦克纳姆轮结构紧凑,运动灵活,是很成功的一种全方位轮。有4个这种新型轮子进行组合,可以更灵活方便的实现全方位移动功能。
麦克纳姆轮由轮毂和辊子组成。辊子与轮彀曾45度夹角,理论上任意角度都可以,但一般为45度。

WIFI模块使用方案

在这里插入图片描述

ESP8266有3种连接模式

1.STA 模式:ESP8266 模块通过路由器连接互联网,手机或电脑通过互联网实现对设备的远程控制。
2. AP 模式:ESP8266 模块作为热点,手机或电脑直接与模块连接,实现局域网无线控制。
3. STA+AP 模式:两种模式的共存模式,即可以通过互联网控制可实现无缝切换,方便操作。

stm32与8266数据传输方案

1.stm32先进行wifi模块初始化,发送AT指令使得wifi模块进入AP模式,创建热点,手机通过8266创建的热点接入TCP,并进行数据传输;
2.通过手机发送信号让wifi模块接收到信息,并返回单片机,通过TTL在电脑上显示;
3.手机发送操控信号,stm32通过wifi模块接收到信息,并控制电机正反转,从而实现麦轮控制。

wifi模块初始化代码

AT // 测试
AT+CWMODE=2 // 设置工作AP模式
AT+CIPMUX=1 //允许多连接
AT+CWSAP=“APPLE”,“12345678”,1,3 //创建WIFI热点
AT+CIPSERVER=1,8080 //创建端口号

FREERTOS的编写方案

FreeRTOS是一个迷你的实时操作系统内核。作为一个轻量级的操作系统,功能包括:任务管理、时间管理、信号量、消息队列、内存管理、记录功能、软件定时器、协程等,可基本满足较小系统的需要。
任务调度机制是嵌入式实时操作系统的一个重要概念,也是其核心技术。对于可剥夺型内核,优先级高的任务一旦就绪就能剥夺优先级较低任务的CPU使用权,提高了系统的实时响应能力。
stm32通过FREERTOS创建2个任务,而每个任务分别控制LED灯闪烁与蜂鸣器,实现多任务处理。LED灯通过拉高点亮,拉低熄灭;蜂鸣器拉高发出声音,拉低则关闭,通过程序语句HAL_GPIO_WritePin(GPIOF, LED0_Pin, GPIO_PIN_RESET)与HAL_GPIO_WritePin(GPIOF, LED0_Pin, GPIO_PIN_SET)来控制拉高和拉低。而HAL_Delay() 实现延迟效果,故可以看到灯闪烁、蜂鸣器报警。
在这里插入图片描述

电路与程序设计

核心部分电路设计

关键器件说明

  1. 处理器:STM32F103C8T6,8MHz主频,满足数据处理和运算的要求。
  2. 传感器:ESP8266WIFI模块,3.3-5V供电电压,UART通讯,波特率115200。
  3. 电机:高扭矩减速电机。
  4. 电机驱动:L298N模块,驱动部分端子供电范围Vs:+5V~+35V。
    5) 稳压模块:LM2596模块,控制输出电压为5v给单片机,10v给298N。
    6) 外设:LED灯,蜂鸣器。

电路硬件设计

(1)STM32F103C8T6最小系统电路原理图
在这里插入图片描述

(2)电机驱动电路
ESP8266模块采集到的数据传给STM32单片机进行处理,然后输出控制信号到驱动板,实现麦轮的控制。控制底板接线图,如图:

在这里插入图片描述

(3)ESP8266模块
根据芯片的引脚功能,模块正常使用时,连线应该如下图所示
在这里插入图片描述

(4)蜂鸣器与LED灯
在这里插入图片描述

(5)PCB绘制部分
在这里插入图片描述

程序代码设计

程序实现设计思路

1.程序能够使STM32上的ESP8266自行创建WIFI热点,并实现手机与stm32双向通信,通过wifi模块完成手机对麦克拉姆轮的控制。
2.通过手机发送给WiFi模块的信息,stm32控制298n的in口电压,从而控制麦克拉姆轮的正反转。
3.同时,LED和蜂鸣器会以不同频率闪烁并发出声音,实现FreeRTOS的多任务处理。

程序代码

  1. CubeMX配置
    分配给4个电机8个GPIO口负责拉高和拉低,将UART1给ESP8266使用,UART2给TTL负责调试,再分配给蜂鸣器和LED各一个GPIO口负责控制LED灯闪烁和蜂鸣器报警。

在这里插入图片描述

时钟配置根据需求调整至如下状态:
在这里插入图片描述

  1. keil内代码编写
    (1)wifi初始化
int wifi_init()
{
	uint8_t ret=0;
	
	
	ret = Send_AT_commend("AT ", "OK", 100);
	if(!ret)
		return -1;
	ret = Send_AT_commend("AT+CIPMUX=1", "OK", 100);
	if(!ret)
		return -2;
	ret = Send_AT_commend("AT+CIPSERVER=1,8080", "OK", 200); 			//AT+CWJAP="pxc002","?????"
	if(!ret)
		return -3;
	return 1;
}

(2)串口中断信息传输

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	if(huart==&huart1)
	{	
		HAL_UART_Receive_IT(&huart1,&my_re_buf1[++pt_w1],1);			
	}
	
	if(huart==&huart2)
	{	
		HAL_UART_Receive_IT(&huart2,&my_re_buf2[++pt_w2],1);
	}
	
}

(3)定时器中断进行串口信息判断

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef * htim)
{
	int i=0,len=0;
	if(htim==&htim4)
	{
	
		
		t4_count++;
		

			while(pt_r1<pt_w1 )
		{
			while(pt_r1<pt_w1)
				HAL_UART_Transmit(&huart2,&my_re_buf1[pt_r1++],1,1000);				//½«wifi·¢¸ø°å×ÓµÄÊý¾Ýת·¢µ½PC»ú
			HAL_UART_Transmit(&huart2,(uint8_t *)"\r\n",2,1000);						//ÿÊä³öÒ»Ðкó×Ô¶¯»»ÐÐ
								
			
	
			if(find_str("BACK")){
		
		  HAL_GPIO_WritePin(GPIOA, MOT4_L_Pin|MOT1_L_Pin, GPIO_PIN_SET);
			
			}
			

			
		}
		
		if(pt_r1>=pt_w1)
		{
			pt_w1=pt_r1=0;
			HAL_UART_AbortReceive_IT(&huart1);
			HAL_UART_Receive_IT(&huart1,my_re_buf1,1);
		}
		
		
		while(send_buf[i])send_buf[i++]=0x00;			//Çå¿Õsend_bufÊý×é
		while(pt_r2<pt_w2 )
		{
			
			
			
			
			HAL_UART_Transmit(&huart1,&my_re_buf2[pt_r2++],1,1000);					//½«PC·¢¸ø°å×ÓµÄÊý¾Ýת·¢µ½wifiÄ£¿é
			
			HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_13);    //LED
			
			
			
			while(pt_r2<pt_w2)
			send_buf[len++]=my_re_buf2[pt_r2++];
			wifi_send(send_buf,len);
			
			
			
		}
		if(pt_r2>=pt_w2)
		{
			pt_w2=pt_r2=0;
			HAL_UART_AbortReceive_IT(&huart2);	
			HAL_UART_Receive_IT(&huart2,my_re_buf2,1);
		}
		
	}
	
	
}

(4)WIFI接收信息及麦轮控制


			if(find_str("GO")){
				
				
				
				 HAL_GPIO_WritePin(GPIOA, MOT2_H_Pin|MOT3_H_Pin|MOT4_H_Pin|MOT1_H_Pin, GPIO_PIN_SET);
       

			
			}
			
			if(find_str("LEFT")){
		
			 HAL_GPIO_WritePin(GPIOA, MOT3_H_Pin|MOT2_H_Pin, GPIO_PIN_SET);
				
			 HAL_GPIO_WritePin(GPIOA, MOT4_L_Pin|MOT1_L_Pin, GPIO_PIN_SET);
       
			
		}
		
			if(find_str("SHOT")){
		
			 HAL_GPIO_WritePin(GPIOA, MOT3_H_Pin|MOT2_H_Pin, GPIO_PIN_SET);
			
			}
			

(5)FreeRTOS多任务创建

 osThreadDef(defaultTask, StartDefaultTask, osPriorityNormal, 0, 128);
  defaultTaskHandle = osThreadCreate(osThread(defaultTask), NULL);

  /* definition and creation of myTask02 */
  osThreadDef(myTask02, StartTask02, osPriorityIdle, 0, 128);
  myTask02Handle = osThreadCreate(osThread(myTask02), NULL);

  /* definition and creation of myTask03 */
  osThreadDef(myTask03, StartTask03, osPriorityIdle, 0, 128);
  myTask03Handle = osThreadCreate(osThread(myTask03), NULL);

  /* definition and creation of myTask04 */
  osThreadDef(myTask04, StartTask04, osPriorityIdle, 0, 128);
  myTask04Handle = osThreadCreate(osThread(myTask04), NULL);

(6)蜂鸣器报警task2

void StartTask02(void const * argument)
{
  /* USER CODE BEGIN StartTask02 */
  /* Infinite loop */
  for(;;)
  {
    
		 HAL_GPIO_WritePin(GPIOB,FEN_Pin, GPIO_PIN_RESET);
		
		HAL_Delay(1000);
		
		 HAL_GPIO_WritePin(GPIOB,FEN_Pin, GPIO_PIN_SET);
		
			HAL_Delay(200);
		
  }
  /* USER CODE END StartTask02 */
}

(7)LED闪烁task3

void StartTask03(void const * argument)
{
  /* USER CODE BEGIN StartTask03 */
  /* Infinite loop */
  for(;;)
  {
    
		
		 HAL_GPIO_WritePin(GPIOB,LEDB9_Pin, GPIO_PIN_RESET);
		
		HAL_Delay(1000);
		
		 HAL_GPIO_WritePin(GPIOB,LEDB9_Pin, GPIO_PIN_SET);
		
			HAL_Delay(1000);
		
		
  }
  /* USER CODE END StartTask03 */
}

测试结果

测试结果及分析

小车的搭建过程,是从电路到层次化设计中进行的。首先先安装了底部的电机,之后将麦克纳母轮连接至减速电机。

在这里插入图片描述

之后,将4个电机的正负极分别连接至2个L298N的8个输出口。
在这里插入图片描述
将绘制好的PCB进行排针的焊接。
在这里插入图片描述

把3个LM2596焊接在洞洞板上,进行电源分压部分的设计。
在这里插入图片描述

将之前焊接好的PCB插上STM32与WIFI模块,完成控制部分的电路设计与连接。在这里插入图片描述

整体电路与外部设计完善后,小车的硬件部分基本完工。

在这里插入图片描述

之后多次烧录程序进行调试,最终可以实现WiFi控制麦轮小车的多模式运动,同时LED与蜂鸣器可以根据不同频率变换。在这里插入图片描述

结论与心得

这次小车的制作使我收获颇丰,除了学到硬件搭建、电路调试、软件测试相关的知识和技能,我还明白了FreeRTOS的重要性。以前做比赛的时候,由于对嵌入式操作系统了解不够,导致写多任务程序时很难保证很高的实时性。之后对操作系统有了更深层次的认识后,便尝试使用了操作系统,并获得了极大的收获。在搭建电路时,我也遇到了不少问题。首先是供电的问题,有时候单片机供3.3V电会无法正常工作,于是查阅资料后发现单片机内有5v降压电路,因此直接给5v供电,成功解决了这个问题。所以,遇到困难时最重要的,是不要被得失所困扰,要一心一意去解决这个问题。

  • 15
    点赞
  • 120
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值