VSOMEIP移动小车建模打印组装及简单控制实现

移动小车建模打印组装及简单控制实现


小车三维建模

小车建模用的是CREO软件,需要兼容的硬件为四个电机和轮子,以及STM32开发板(别问我为什么不买小点的开发板,因为贫穷只能用家里的老板子),整体建模图如下所示:
请添加图片描述
有一说一是丑了点,个人审美有限凑合着看吧。下面是分解图
请添加图片描述
从上可以看出就是两块板子夹着电机轮子和控制板,蓝色的是电源,应该是要有两个的,一个控制STM32,一个控制电机驱动。
上下两块板子用螺栓固定,建模文件我放资源里了,建议有能力的还是自己建个模,或者直接买现成的底盘。
画完了之后导出STL格式到切片软件中,然后导出打印文件去打印,实物图如下:
请添加图片描述
组装完成之后就是简单的测试一下能不能跑,编个小程序,这里不搭载系统就单纯的用串口中断试一试。


小车简单功能测试

测试流程为用蓝牙APP发送前进、后退以及停止信号给小车,小车能够进行对应的动作。

首先是4个电机的控制,这里用的是可控四个电机的驱动L9110S,输入2.5-10V电压,可控启停和正反转请添加图片描述
然后是蓝牙模块,JDY-31,用的是蓝牙3.0,经典蓝牙协议(不支持低功耗)。
请添加图片描述
APP这里直接下的一个蓝牙串口,后续会自行开发,这里只做一个测试。

电源的话用的是5V的锂电池接到VOUT2上作为STM32的控制电源,4节5号电池作为电机驱动的输入(我觉得驱动4个电机有点不太得劲,后面再加几节电池看看)

流程的话就是通过蓝牙串口向STM32发送消息,STM32接收之后,相应的IO口输出对应的信号来驱动电机,很简单的,这里只放main函数的吧,用的是串口中端来接收的,中断处理函数都是一样的没什么好写的,就是把数据接收到USART_RX_BUF中。

main函数:

#define DIRECTION_MAX_LEN 10
int main(void)
{								  
	u16 t; 
	u16 len;	
	u16 times=0;    
	
	//定义三个字符,串口发送来0表示停止,1表示前进,2表示后退
	char stop[DIRECTION_MAX_LEN] = "0";
    char top[DIRECTION_MAX_LEN] = "1";
	char botton[DIRECTION_MAX_LEN] = "2";
	
	Stm32_Clock_Init(9);	
	uart_init(72,9600); 	//这里蓝牙是9600波特率的,我串口外设是72Mhz的
	delay_init(72);	   	 	
	MOTOR_Init();		  		
	
	//在对应.h文件中定义了一些位带操作,分别表示4个电机的驱动接口,这里初始先都设置为低电平
	MOTORA_Pin1 = 0;
	MOTORA_Pin2 = 0;
	MOTORB_Pin1 = 0;
	MOTORB_Pin2 = 0;
	MOTORC_Pin1 = 0;
	MOTORC_Pin2 = 0;
	MOTORD_Pin1 = 0;
	MOTORD_Pin2 = 0;

 	while(1)
	{
		if(USART_RX_STA&0x8000)  //接收完成了
		{					   
			len=USART_RX_STA&0x3FFF;  //看一下接收到了多少个数据,因为这个寄存器的高两位是确认位,不参与计数。
			printf("USART_RX_BUF = %s\r\n",USART_RX_BUF);
			
			if (!strncmp((char *)USART_RX_BUF, top, DIRECTION_MAX_LEN))
			{
				MOTORA_Pin1 = 0;  
				MOTORA_Pin2 = 1;
				MOTORB_Pin1 = 0;
				MOTORB_Pin2 = 1;
				MOTORC_Pin1 = 0;
				MOTORC_Pin2 = 1;
				MOTORD_Pin1 = 0;
				MOTORD_Pin2 = 1;	
				
			}
			else if (!strncmp((char *)USART_RX_BUF, botton, DIRECTION_MAX_LEN))
			{
				MOTORA_Pin1 = 1;  
				MOTORA_Pin2 = 0;
				MOTORB_Pin1 = 1;
				MOTORB_Pin2 = 0;
				MOTORC_Pin1 = 1;
				MOTORC_Pin2 = 0;
				MOTORD_Pin1 = 1;
				MOTORD_Pin2 = 0;	
				
			}
			else if (!strncmp((char *)USART_RX_BUF, stop, DIRECTION_MAX_LEN))
			{
				MOTORA_Pin1 = 0;  
				MOTORA_Pin2 = 0;
				MOTORB_Pin1 = 0;
				MOTORB_Pin2 = 0;
				MOTORC_Pin1 = 0;
				MOTORC_Pin2 = 0;
				MOTORD_Pin1 = 0;
				MOTORD_Pin2 = 0;
			}
			
			memset(USART_RX_BUF,0,USART_REC_LEN);
			USART_RX_STA=0;
		}else
		{
			times++;
			if(times%5000==0)
			{
				times=0;
			}
			delay_ms(10);   
		}
	}		 
}

MOTOR.h:

#ifndef __MOTOR_H
#define __MOTOR_H	 
#include "sys.h"

#define MOTORA_Pin1 PAout(0)	
#define MOTORA_Pin2 PAout(1)
#define MOTORB_Pin1 PAout(4)	
#define MOTORB_Pin2 PAout(5)
#define MOTORC_Pin1 PAout(6)	
#define MOTORC_Pin2 PAout(7)
#define MOTORD_Pin1 PAout(8)	
#define MOTORD_Pin2 PAout(11)

void MOTOR_Init(void); 				    
#endif

上述定义了对应引脚,都是GPIOA的,省得麻烦,记得要在MOTOR_init函数中把相应的外设时钟打开,GPIO口时钟打开,模式设置成推挽输出。

烧写进去进行组装和测试,如下图:
请添加图片描述
请添加图片描述
经测试,小车能够通过串口发送0,1,2进行停止,前进和后退的动作,实时性还可以,就是这个驱动力有点不得劲。提醒我要换个电压高点的电源或者用两个驱动器来控制四个电机,可能4节电池控制四个电机还是力不从心的,这个后面再改进把,先凑合着用。

总结

简单的小车底盘整好了,也做了一些简单的控制功能性测试,下一篇移植FreeRTOS系统到STM32上并实现效果,然后开几个TASK以便后期可能会接收其他传感器的数据,中断就用FREERTOS控制的中断优先级,方便屏蔽和开启。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值