暑假想自己DIY一个智能车

暑假想自己DIY一个智能车

暑假想自己DIY一个STM32智能车

在学校的时候,因为2020年的电赛题目,我们提前准备好了小车的硬件(芯片都以及焊好和测试完毕了)和一部分软件,但是由于小车的主控要求使用MSP430。我们就重零开始做摄像头测温了,然后我们决定做摄像头测温题目。就这样,小车的硬件部分就遗留了下来,主要的PCB遗留了下来。当时做完电赛的预热,我就把之前的比赛的一个车模找了出来,保持着废物利用的心态,就把车拼了起来,就用蓝牙做成了一个遥控小车。现在放暑假了,在家无聊,就琢磨着能不能把这小车做点有趣的东西,于是就有了这个博客。

嵌入式

一 嵌入式硬件

暑假想自己DIY一个智能车
当时奢侈了一把,直接把STM32F4的芯片给设计上了,因为手里刚好有一片,原本设计用的电机就是TT电机,电流小,不需要大的驱动电路,所以这里直接设计用的TB6612驱动芯片,但是后来我换了一个大一点的电机,这里就很难受,因为我设计的小电压TT电机,和现在需要的所用的电机实在是差距有点大,我把PWM给满了,也只能稍微快一点的转动,没法。硬件电路就这样了,反正我也改不了了,就先这样着吧。原理图看的不清晰,等会我会给个邮箱,有兴趣的小伙伴们可以一起交流一下。

二 嵌入式软件

软件部分这个比较麻烦,因为电赛已经过去很长时间了,我现在的思路已经跟不上之前了,所以已经忘记了自己写的代码了,在这里深刻的意识到代码规范和注释的重要性。

蓝牙 F4 TB6612 舵机 接收数据 操作 操作 蓝牙 F4 TB6612 舵机

基本上就是这个思路写的。
下面展示一些 中断接收函数

初始化就不写了,这个使用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;
}

三 实物图[没上电]

暑假想自己DIY一个智能车
可见还有好多端口没有用到,在想着能不能再最大程度饱和它,写完这篇是2021.1.11了,今天看看增加有趣的东西。暑假每天更新,或者两天更新进度。
有兴趣的小伙伴可以交流一下
QQ:1098196665

上一篇:C的一些标准


下一篇:硬件描述语言:elaborate和synthesis电路图的区别、latch问题、always组合逻辑默认值写法、Vivado和Quartus的电路图区别