暑假想自己DIY一个智能车
暑假想自己DIY一个STM32智能车
在学校的时候,因为2020年的电赛题目,我们提前准备好了小车的硬件(芯片都以及焊好和测试完毕了)和一部分软件,但是由于小车的主控要求使用MSP430。我们就重零开始做摄像头测温了,然后我们决定做摄像头测温题目。就这样,小车的硬件部分就遗留了下来,主要的PCB遗留了下来。当时做完电赛的预热,我就把之前的比赛的一个车模找了出来,保持着废物利用的心态,就把车拼了起来,就用蓝牙做成了一个遥控小车。现在放暑假了,在家无聊,就琢磨着能不能把这小车做点有趣的东西,于是就有了这个博客。
嵌入式
一 嵌入式硬件
当时奢侈了一把,直接把STM32F4的芯片给设计上了,因为手里刚好有一片,原本设计用的电机就是TT电机,电流小,不需要大的驱动电路,所以这里直接设计用的TB6612驱动芯片,但是后来我换了一个大一点的电机,这里就很难受,因为我设计的小电压TT电机,和现在需要的所用的电机实在是差距有点大,我把PWM给满了,也只能稍微快一点的转动,没法。硬件电路就这样了,反正我也改不了了,就先这样着吧。原理图看的不清晰,等会我会给个邮箱,有兴趣的小伙伴们可以一起交流一下。
二 嵌入式软件
软件部分这个比较麻烦,因为电赛已经过去很长时间了,我现在的思路已经跟不上之前了,所以已经忘记了自己写的代码了,在这里深刻的意识到代码规范和注释的重要性。
基本上就是这个思路写的。
下面展示一些 中断接收函数
。
初始化就不写了,这个使用HAL库写的,下面是蓝牙接收用的串口中断三
void USART3_IRQHandler(void)
{
// volatile int receive[6];
//receive interrupt 接收中断
if(huart3.Instance->SR & UART_FLAG_RXNE)
{
HAL_UART_Receive(&huart3,rx_temp, sizeof(rx_temp), 100);//接收函数
// HAL_UART_Receive(&huart3,lann_ya, sizeof(lann_ya), 100);
if(rx_temp[0]==0xA5&&rx_temp[4]==0x5A)//设置字头,密钥
for(int i=0;i<4;i++)
lann_ya[i]=rx_temp[i];//读取字节
// receive = huart3.Instance->DR;
}
Blueteeth(&rx_temp);//调用Blueteeth这个函数
// HAL_UART_Transmit(&huart3,rx_temp, sizeof(rx_temp), 100);
}
下面展示一些 蓝牙接收写的函数
。
Blueteeth函数。下面if语句里面的都是我自己设置的接收字头,只是为了调试一些用蓝牙程序的按键可不可以做到,比如蓝牙接收“zh”我就调用Choose1让电机正转。
void Blueteeth(uint8_t *sec)
{
if(sec[0]=='z'&&sec[1]=='h')
{
Choose1();
}
if(sec[0]=='f'&&sec[1]=='a')
{
Choose2();
}
if(sec[0]=='a'&&sec[1]=='a')
{
if(sec[2]=='w')
Ward();
if(sec[2]=='s')
STOP();
if(sec[2]=='a')
Aleft();
if(sec[2]=='d')
Dright();
}
if(sec[0]=='a'&&sec[1]=='d')
{
if(sec[2]=='l')
DUOJI_left();
if(sec[2]=='r')
DUOJI_right();
if(sec[2]=='t')
DUOJI_90();
}
}
下面展示一些 主函数程序
。
主函数的程序
while (1)
{
Due();//控制正反转的一个函数,现在初值默认为正转
if(lann_ya[1]<=100)
Duoji.VALC=15+lann_ya[1]/12;
else Duoji.VALC=15-(256-lann_ya[1])/12;//这两个函数是用蓝牙软件的一个-100~100的值和电机控制PWM给的阶梯值列出来的一个函数
if(lann_ya[2]<=100)
{
CHOOSE.X=2;
Motor.VALT=lann_ya[2];
}
else {
CHOOSE.X=1;
Motor.VALT=256-lann_ya[2];//这函数是用蓝牙软件的一个-100~100的值和舵机控制PWM给的阶梯值列出来的一个函数
}
Motor.VAL3=Motor.VALT;
Motor.VAL4=Motor.VALT;
HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_2);
__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_2, Motor.VAL3);//PWMC
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_2);
__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_2, Motor.VAL4);//PWMD
/* USER CODE END WHILE */
HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_4);
__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_4, Duoji.VALC);
/* USER CODE BEGIN 3 */
}
下面展示一些 内置函数
。
控制舵机,电机正反转的一些函数,由于没有用编码器,也没有陀螺仪,用的是差速。按下的时间长短可以调节转弯的幅度和速度的大小。
void DUOJI(int y)// 角度0-180
{
Duoji.VALA=10*(y/90+0.5);
Duoji.VALB=10*(y/90+0.5);
Duoji.VALC=10*(y/90+0.5);
}
void DUOJI_90(void)
{
Duoji.VALC=15;
}
void DUOJI_left(void)
{
Duoji.VALC=Duoji.VALC-1;
if(Duoji.VALC<=7)
Duoji.VALC=7;
}
void DUOJI_right(void)
{
Duoji.VALC=Duoji.VALC+1;
if(Duoji.VALC>=23)
Duoji.VALC=23;
}
void Ward(void)
{
Motor.VAL3=Motor.VAL3+5; Motor.VAL4=Motor.VAL4+5;
}
void STOP(void)
{
Motor.VAL3=0; Motor.VAL4=0;
}
void Aleft(void)
{
Motor.VAL3=Motor.VAL3+3; Motor.VAL4=Motor.VAL4+3;
}
void Dright(void)
{
Motor.VAL3=Motor.VAL3+5; Motor.VAL4=Motor.VAL4+3;
}
void Choose1()
{
CHOOSE.X=1;
}
void Choose2()
{
CHOOSE.X=2;
}
三 实物图[没上电]
可见还有好多端口没有用到,在想着能不能再最大程度饱和它,写完这篇是2021.1.11了,今天看看增加有趣的东西。暑假每天更新,或者两天更新进度。
有兴趣的小伙伴可以交流一下
QQ:1098196665