在前面(废话):金沙滩的板子入门51单片机,有幸见过学长的各种小车视频,亿点点羡慕,于是在期末考试前计划寒假上手尝试,刚好学校社团又有比赛
3.单片机STC89C52 及51单片机最小系统板
4.电机驱动模块 L298N
5.电源 18650锂电池 及 三节串联电池座
6.杜邦线若干(公公母母)
7.面包板 循迹模块需供电,单片机电源输出不够,需将正负极接到面包板再从面包板接出给模块供电(后期若想加上超声波模块也必然要用到面包板)
(贴纸特别难凘,我妈教我用热吹风吹一下能丝滑不少)
(固定电机的螺帽有点难拧,要有耐心,可以先把螺帽转进去一点,然后用手掐住螺帽,另一边用螺丝刀拧)
切记螺帽在内侧,不然会卡轮子
(轮子也有点难安)
但是这种套件便宜
红线接电池盒正极输入
黄线输出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 控制转速
模块:
因为没有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 检测到黑线时
较大幅度 左/右 调整
(至于多大幅度我是自己慢慢调的)
以上基本上可以应付小弯
至于直角弯(偶尔会瞎)
简单的
但是我发现这样有时候会直接冲过去
大概是因为小车过直角弯前车生并不是很正的
(也可能是我的车的问题)
然后我就把条件改成了这样(好像也没有好多少
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++;
}
其实要求里还有避障,但是我还没弄好
大一寒假&&第一次做&&第一次写