基于MSP432P401R+HC05+MPU6050的遥感小车

这是我大三的时候用TI的MSP432P401R弄得一个遥感小车,现在开源出来给大家玩玩。
不需要积分就可以下载哦,如果喜欢的话就留下点赞、收藏、关注吧!
资源下载地址:超简单的MSP432P401R实现遥感小车

✨如果有任何不懂得欢迎大家留言评论,我会及时回复的

相关资源

蓝牙模块配置教程

文章目录

  • 一、硬件准备
  • 二、系统框架&软件设计
    • 2.1 系统框架
    • 2.2 软件设计
      • 2.2.1 小车软件设计
        • 小车软件流程图
        • 小车定时器中断代码
        • 小车数据解析代码
      • 2.2.2 遥控器
        • 遥控器main函数

一、硬件准备

1. 两块MSP432P401R最小系统板(一个用来控制小车,一块用来作遥控器的控制板,就是豪)
2. 1块MPU6050
3. 两块HC05蓝牙模块
4. 电机(带不带编码器都行)
5. 一块锂电池
6. 小车模型

二、系统框架&软件设计

2.1 系统框架

基于MSP432P401R+HC05+MPU6050的遥感小车_第1张图片

2.2 软件设计

2.2.1 小车软件设计

小车软件流程图

基于MSP432P401R+HC05+MPU6050的遥感小车_第2张图片

小车定时器中断代码
void T32_INT2_IRQHandler(void) {
	MAP_Timer32_clearInterruptFlag(TIMER32_1_BASE);
	/* Interrupt service program local variable */
	static int Cnt = 0;
	static int resultpid_R=0;
	static int resultpid_L=0;
	static int speed,RorL;
	/* Interrupt service program local variable */
	
	/* Interrupt service program start */
	int R,L;
	int temp1,temp2;
	Cnt++;
	if(dataready==1)
	{
		dataready=0;
		temp1=PitchValue/5;   //根据俯仰角计算速度
		speed=temp1*100;
		if(speed>1000)
		{
			speed=1000;
		}
		else if(speed<-1000)
		{
			speed=-1000;
		}
		speed=-speed;   
		
		temp2=RollValue/10;	
		RorL=temp2*100;     // 根据横滚角roll计算两轮差速,实现左右旋转
		if(RorL>1000)
		{
			RorL=1000;
		}
		else if(RorL<-1000)
		{
			RorL=-1000;
		}
	}	
	/* 计算两个轮子的速度 */
	if(Cnt % 100 == 0)
	{
		GPIO_toggleOutputOnPin(GPIO_PORT_P1, GPIO_PIN0);
	}
	resultpid_L=0;
	resultpid_R=0;
	R=(int16_t)(resultpid_R+speed+RorL);
	L=(int16_t)(resultpid_L+speed-RorL);
	if(R<0)
	{
		R=-R;
		Motor_Direction_Change(RightMotor, 0,1); // 右电机方向改变
	}
	else if(R>0)
	{
		Motor_Direction_Change(RightMotor, 1,0); // 右电机方向改变
	}
	if(L<0)
	{
		L=L-50;
		L=-L;
		Motor_Direction_Change(LeftMotor, 0,1);  // 做电机方向改变
	}
	else if(L>0)
	{
		L=L+50;
		Motor_Direction_Change(LeftMotor, 1,0);  // 做电机方向改变
	}
//	printf("R:%d,L:%d\r\n",R,L);
	MAP_Timer_A_setCompareValue(TIMER_A0_BASE, TIMER_A_CAPTURECOMPARE_REGISTER_1, R);  //在速度pid的结果上减去偏差
	MAP_Timer_A_setCompareValue(TIMER_A0_BASE, TIMER_A_CAPTURECOMPARE_REGISTER_2, L);  //在速度pid的结果上加上偏差
	/* End of interrupt service program */
}
小车数据解析代码
if(overflag==1)  // 串口数据是否接收完一帧数据
{
	if(UART2_RX_BUF[0]=='{' )   // 确保数据接收正确
	{
		cJSON *Receive;
		Receive=cJSON_Parse(UART2_RX_BUF);
		if(!Receive)   // 如果没有创建成功,删除JSON,清空接收缓冲区,数组索引置零,超时标志置零
		{
			printf("DataError");
			cJSON_Delete(Receive);
		}
		else        // 否则提取JSON中的数据
		{
			_Roll=cJSON_GetObjectItem(Receive,"Roll");
			_Pitch=cJSON_GetObjectItem(Receive,"Pitch");
			PitchValue=_Pitch->valuedouble;
			RollValue=_Roll->valuedouble;
			dataready=1;
			cJSON_Delete(Receive);
		}
	}
	memset(UART2_RX_BUF,'\0',64);
	index_buffer=0;
	overflag=0;
}

2.2.2 遥控器

基于MSP432P401R+HC05+MPU6050的遥感小车_第3张图片

遥控器main函数
int main(void) { //以下是各功能的测试
	/* local variable */
	long time=0;
	cJSON *Position;
	cJSON *_Roll,*_Pitch;
	/* Start of system initialization */
	LED_Init();            				 //LED初始化,用来验证某个模块是否工作 
	systick_config();	  //滴答定时器初始化	
	uart0_init();						 //串口0初始化
	Bluetooth_Init(115200);
	IIC_Init();
	TIM32_1_Int_Init(3000,TIMER32_PRESCALER_16);   //每1ms秒进入一次Timer32中断
	/* End of system initializatioan */

	/* Start to set some initial parameters */

	/* End setting some initial parameters */
	delay_ms(500);
	mpu6050_dmp_init();
	char buffer[20];
	while (1) {
		DMP_update();
		sprintf(buffer,"{\"Roll\":%.2f,\"Pitch\":%.2f}",Roll,Pitch);  //数值转字符串
		bluetooth_send("%s\r\n",buffer);
		delay_ms(20);
	}
}

你可能感兴趣的:(MSP432P401R,单片机,TI,MSP432P401R,电赛,cJSON,蓝牙HC-05)