移动小车建模打印组装及简单控制实现
小车三维建模
小车建模用的是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控制的中断优先级,方便屏蔽和开启。