基于51单片机的循轨小车

在前面(废话):金沙滩的板子入门51单片机,有幸见过学长的各种小车视频,亿点点羡慕,于是在期末考试前计划寒假上手尝试,刚好学校社团又有比赛

材料:

  1. 小车套件(包含底盘,*,减速电机,若干铜柱螺丝螺帽)
    基于51单片机的循轨小车

  2. 循迹模块 TCRT5000 灵敏度可调 有DO和AO输出
    基于51单片机的循轨小车

3.单片机STC89C52 及51单片机最小系统板
基于51单片机的循轨小车
基于51单片机的循轨小车
4.电机驱动模块 L298N
基于51单片机的循轨小车
5.电源 18650锂电池 及 三节串联电池座

基于51单片机的循轨小车
基于51单片机的循轨小车
6.杜邦线若干(公公母母)
7.面包板 循迹模块需供电,单片机电源输出不够,需将正负极接到面包板再从面包板接出给模块供电(后期若想加上超声波模块也必然要用到面包板)

组装小车套件:

(贴纸特别难凘,我妈教我用热吹风吹一下能丝滑不少)

(固定电机的螺帽有点难拧,要有耐心,可以先把螺帽转进去一点,然后用手掐住螺帽,另一边用螺丝刀拧)
切记螺帽在内侧,不然会卡*

(*也有点难安)
但是这种套件便宜

接线:

基于51单片机的循轨小车
正面三个座:

红线接电池盒正极输入
黄线输出5v接单片机正极
电源、l298n、单片机需共地

*侧边两个座(2)

分别接两个电机(不必区分正负,可通过程序控制正反转)

天蓝色框起来的四个引脚分别 IN1 IN2 IN3 IN4
接单片机引脚

sbit IN1 = P1^0;
sbit IN2 = P1^1;
sbit IN3 = P1^2;
sbit IN4 = P1^3;
 IN1 = 0; IN2 = 1;
 IN3 = 0; IN4 = 1;
 //IN1、2  IN3、4  分别控制左右轮
 //一个0一个1可实现简单的电机转动
 //后面用 PWM 控制转速

循迹:

赛道图解
基于51单片机的循轨小车

模块:
因为没有adc,所以我接的是循迹模块的AO口,
检测到黑线时(反射回来的红外线强度较小)
输出1 ,反之输出0
灵敏度可通过旋钮调节
这里我是用了五路红外传感器
排列分别是(中间三个凑得比较紧)

left_2 left_1 mid right_1 right_2

sbit mid = P0^1;
sbit left_2 = P0^2;
sbit left_1 = P0^3;
sbit right_1 = P0^4;
sbit right_2 = P0^5;

循迹思路简述(比较low):
只有中间一路检测到黑线时,直行

left1/right1 检测到黑线时
左/右 微调(这里如果是小转弯的话我发现之路小车走直道摆动幅度会比较大)

left2/right2 检测到黑线时
较大幅度 左/右 调整
(至于多大幅度我是自己慢慢调的)

以上基本上可以应付小弯

至于直角弯(偶尔会瞎)
简单的
基于51单片机的循轨小车
但是我发现这样有时候会直接冲过去
大概是因为小车过直角弯前车生并不是很正的
(也可能是我的车的问题)
然后我就把条件改成了这样(好像也没有好多少

if( ((uchar)left_2 + (uchar)left_1 + (uchar)mid >= 2)  && right_1==0 && right_2==0)
	turn_90left();
if(left_2==0 && left_1==0 && ( (uchar)right_2 + (uchar)right_1 + (uchar)mid >= 2) )
	turn_90right();

然后还有一个十字路口
这个效果比较好

if(((uchar)left_2 + (uchar)left_1 + (uchar)mid + (uchar)right_1 + (uchar)right_2) >= 5) //stop
	stop();   //五路中有四路检测到黑线就停

我是设置了一个变量open
放在while(1)里面一直刷

if(left_2==0 && right_2==0 && (mid==1 | left_1==1 | right_1==1)) open=1;

并且电机控制那一块将open作为开启条件
这样检测到十字路口后

open=0 电机会停

但是由于惯性车子仍然会往前开一点
(这里尝试过使用一点延时,但其实不用)
惯性足以越过十字路口
这时候 在while(1)里面的open

(由于前面还有路)open又会等于1

小车又会动起来(看起来只是稍微顿了一下)
而当T字停车线前面没有黑线了
满足不了那个open置1的条件
小车就会稳稳停下

转向
左右轮差速实现转向
直角的时候左右轮正反转,看起来有点像原地转头

中断代码(里面放的有点多了感觉)

void interruptT0() interrupt 1
{
	static uchar time = 0;
	
	TH0 = T0RH;
	TL0 = T0RL;
//行驶控制============================
//motor_left/right 左右轮转速
	if(time>20) time=0;
	if(time < motor_left && open)
	{
		if(left_flag == 0)
		{
			IN1 = 0; IN2 = 1; //正转
		}
		else
		{
			IN1 = 1; IN2 = 0; //反转
		}
	}
	else
	{
		IN1 = 0; IN2 = 0;
	}
	if(time < motor_right && open)
	{
		if(right_flag == 0)
		{
			IN3 = 0; IN4 = 1; //正转
		}
		else
		{
			IN3 = 1; IN4 = 0; //反转
		}
	}
	else
	{
		IN3 = 0; IN4 = 0;
	}
	time++;
}

其实要求里还有避障,但是我还没弄好

大一寒假&&第一次做&&第一次写

上一篇:基于单片机RGB颜色智能识别系统设计-实际资料


下一篇:1278【毕设课设】基于单片机PM2.5空气质量检测系统设计