51单片机蓝牙遥控麦轮小车

   日期:2021-01-27     浏览:117    评论:0    
核心提示:一直以来就有想法自己做一个小车玩玩,但是一直没提上日程,这次寒假是个很好的机会,在这里把过程中的一些心得和资源分享给大家,源程序将在文末贴出来供大家参考目录硬件部分底盘麦克纳母轮减速电机主控模块电源模块驱动模块蓝牙模块舵机软件部分软件以及串口驱动源程序总结成果展示心得体会硬件部分底盘底盘用的是某宝现成的底盘,之前在学校比赛用的是亚克力板,这次选用的是铝合金材料的,怎么造也不会坏,也不贵,一二十块钱吧麦克纳母轮在选轮子的时候首先想到的就是麦轮,不仅可以实现全向移动,看起来逼格也更高,选购的时候一

一直以来就有想法自己做一个小车玩玩,但是一直没提上日程,这次寒假是个很好的机会,在这里把过程中的一些心得和资源分享给大家,源程序将在文末贴出来供大家参考

目录

  • 硬件部分
    • 底盘
    • 麦克纳母轮
    • 减速电机
    • 主控模块
    • 电源模块
    • 驱动模块
    • 蓝牙模块
    • 舵机
  • 软件部分
    • 软件以及串口驱动
    • 源程序
  • 总结
    • 成果展示
    • 心得体会

硬件部分

底盘

底盘用的是某宝现成的底盘,之前在学校比赛用的是亚克力板,这次选用的是铝合金材料的,怎么造也不会坏,也不贵,一二十块钱吧

麦克纳母轮

在选轮子的时候首先想到的就是麦轮,不仅可以实现全向移动,看起来逼格也更高,选购的时候一定要分清楚左轮和右轮,因为左轮和右轮在旋转时产生的分力是不一样的,想要小车向某一个方向移动,必须抵消掉其他方向的力,否则小车将不受控制我采用的是ABAB式安装,这也是常用的组装方法

减速电机

减速电机种类和样式简直是五花八门,价格也是参差不齐,有高标准的小伙伴们建议多了解一下这里面的套路,我用的是最最最普通的TT电机,速度不是很快,加5V电压的话转速在190r/min左右,主要是性价比让我动心,尤其是对于经济困难的我来说,这种几块钱一个的电机再合适不过了,另外一个要注意的是电机和轮子连接着一块要着重看看

主控模块

原本是准备用stm32的板子的,但是还没学完,就先用51单片机凑合用,其实对于玩玩来说51就够了,编程也简单,这次不是用的传统的带底座的单片机,而是选择了一款新的贴片封装的,看起来要轻巧一些,其实功能都一样,只是这款的TXD和RXD没有标注出来,学过的朋友应该知道其实就是P30和P31两个IO口,关于单片机的知识我不多说,不会的朋友请先简单学习学习,另外,这款板子容易自锁,导致stc一直检测不到单片机,这时候只需要把P10和P11两个IO口同时接地即可,源程序将在文末贴出来

电源模块

电源标称电压5V就够了,重点是要容量大,我用的是4000mAh的,容量太小跑一会儿就没电了影响体验

驱动模块

我选择的是一个集成的四路驱动,其他都挺好,可能散热差一点,有条件的可以选其他带散热片的驱动,驱动的选择不会影响程序的编写

蓝牙模块

蓝牙模块也有很多种,我用的是蓝牙2.0的HC-06主从一体模块,某宝上价格不一,推荐在经常去的店买,有保障,相对于HC-05来说这款更简便,上电就是AT模式,AT指令集我放在下面的链接里了,自取,手机端用的是SPP蓝牙助手

链接:https://pan.baidu.com/s/1RxVXp85P2vCJ9Oy9LTLdzA
提取码:YYDS

舵机

SG90舵机,需要给定持续输出的占空比0.5MS~2.5MS、周期20MS的方波才能转动,0.5MS对应-90°,2.5MS对应90°,SG90舵机角度极限是180°

软件部分

软件以及串口驱动

编译软件:Keil4
烧录软件:stc-isp
串口驱动:CH340

源程序


#include<reg52.h>
#include<intrins.h>

sbit In1=P2^0; //左前电机
sbit In2=P2^1;
sbit In3=P2^2; //右前电机
sbit In4=P2^3;
sbit In5=P2^4; //左后电机
sbit In6=P2^5;
sbit In7=P2^6; //右后电机
sbit In8=P2^7;

sbit SG_PWM=P1^5;//舵机控制端

#define uchar unsigned char //宏定义

uchar count=0;		 //计数变量
uchar PWM_count=15;	 //预设变量
uchar a=0;


void Timer_Init()	
{ 
	TMOD=0x01;			 //设置定时器模式为1
	TH0=0xfe;
	TL0=0xa4;			 //设置定时器初值为0.1MS
	ET0=1;				 //打开定时器0中断
	TR0=1;				 //定时器0开始计时
	EA=1;				 //开总中断
}


void Timer() interrupt 1	 
{ 
TR0=0;						   //停止计时
TH0=0xfe;
TL0=0xa4;					   //重装初值
	if(count <= PWM_count)
		{ 
			SG_PWM=1;				   //舵机控制端给高电平
		}
		else
		{ 
			SG_PWM=0;				   //低电平
		}
		count++;
	if(count >= 200)		   //周期20MS
		{ 
			count=0;
			a++;
		}
TR0=1;
}

void forward()
{ 
	In1=1;
	In2=0;
	In3=1;
	In4=0;
	In5=1;
	In6=0;
	In7=1;
	In8=0;
}


void left()
{ 
	In1=0;
	In2=1;
	In3=1;
	In4=0;
	In5=1;
	In6=0;
	In7=0;
	In8=1;
}


void right()
{ 
	In1=1;
	In2=0;
	In3=0;
	In4=1;
	In5=0;
	In6=1;
	In7=1;
	In8=0;
}


void back()
{ 
	In1=0;
	In2=1;
	In3=0;
	In4=1;
	In5=0;
	In6=1;
	In7=0;
	In8=1;
}


void tleft()
{ 
	In1=0;
	In2=1;
	In3=0;
	In4=1;
	In5=1;
	In6=0;
	In7=1;
	In8=0;
}


void tright()
{ 
	In1=1;
	In2=0;
	In3=1;
	In4=0;
	In5=0;
	In6=1;
	In7=0;
	In8=1;
}


void lefor()
{ 
	In1=1;
	In2=0;
	In3=0;
	In4=0;
	In5=0;
	In6=0;
	In7=1;
	In8=0;
}


void rifor()
{ 
	In1=0;
	In2=0;
	In3=1;
	In4=0;
	In5=1;
	In6=0;
	In7=0;
	In8=0;
}


void leback()
{ 
	In1=0;
	In2=1;
	In3=0;
	In4=0;
	In5=0;
	In6=0;
	In7=0;
	In8=1;
}


void riback()
{ 
	In1=0;
	In2=0;
	In3=0;
	In4=1;
	In5=0;
	In6=1;
	In7=0;
	In8=0;
}


void ting()
{ 
	In1=0;
	In2=0;
	In3=0;
	In4=0;
	In5=0;
	In6=0;
	In7=0;
	In8=0;
}

void UsartConfiguration()
{ 
	SCON=0x50;		//设置工作方式1 开启接受允许
	TMOD=0x20;		//设置T1工作方式为2
	PCON=0x00;		//波特率不倍增
	TH1=0xfd;		//设置计数器1初值,决定波特率
	TL1=0xfd;
	TR1=1;			//打开计数器1
	ES=1;			//打开串口接收中断
	EA=1;			//开总中断

}


void Com_Int(void) interrupt 4
{ 
	uchar receive_data;				   //定义数据接收存储变量
	EA=0;							   //关总中断
	if(RI == 1)						   //是否接受到数据
		{ 
			RI=0;							   //标志位清零
			receive_data=SBUF;				   //数据暂存

			if(receive_data == '1')
				{ 
					forward();
				}
			else if(receive_data == '2')
				{ 
					back();
				}
			else if(receive_data == '3')
				{ 
					left();
				}
			else if(receive_data == '4')
				{ 
					right();
				}
			else if(receive_data == '5')
				{ 
					tleft();
				}
			else if(receive_data == '6')
				{ 
					tright();
				}
			else if(receive_data == '7')
				{ 
					lefor();
				}
			else if(receive_data == '8')
				{ 
					rifor();
				}
			else if(receive_data == '9')
				{ 
					leback();
				}
			else if(receive_data == 'a')
				{ 
					riback();
				}
			else if(receive_data == '0')
				{ 
					ting();
				}
			else if(receive_data == 'c')
				{ 
					PWM_count=5;
				}
			else if(receive_data == 'd')
				{ 
					PWM_count=25;
				}
		}
	EA=1;								//重新打开总中断
}


void main(void)
{ 
		Timer_Init();
		UsartConfiguration();
		while(1);

}

总结

成果展示

心得体会

在整个搭车过程中还是遇到了很多困难,比如蓝牙模块的调试,最初经常意外断开连接,检查才发现是供电电压太高,除此之外,单片机的自锁也很头疼,商家解决不了,通过不断的搜索才找到解决方案,做一辆车的过程其实也是一个锻炼心智的过程,不断的试错,不断的更新换代,这一切光靠一腔热血是换不来的,还要有扎实的技术基础和敏捷的思维,看着自己一点一点做出来的车正常跑的时候,心里是甜的,希望这篇文章能给志同道合的朋友提供一点参考,少走弯路。

#####部分图片来源于网络,如有侵权,联系删除#####

 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服