51循迹小车

硬件部分

  1. 控制芯片

我使用的是STC89C52。

  1. 车体

可以购买车体套件,套件包含了车轮,电机,底盘以及连接的小零件。

不建议购买金属底盘,小车所使用的部件大多在底部有裸露引脚,金属底盘会导致短路。

3.L298N电机驱动模块

输出A/B:连接左右电机。

通道A/B使能:把跳线帽拔下后就可以通过PWM调速对电机进行调速。

逻辑输入:与最小系统板引脚连接,IN1和IN2控制左侧电机,IN3和IN4控制右侧电机。

12V供电:连接电源正极。

供电GND:连接电源正极以及单片机GND。

5V供电:连接单片机VCC。

建议加装稳压模块,因为L298N输出电压不稳定。

  1. 红外循迹模块

可以选用四路,二路,五路。

红外循迹模块由探头和主控板组成。当感应器接收到返回的红外光时,主控板上的指示灯会熄灭,同时输出高电平;若感应器为接收到返回的红外光,则指示灯亮,同时输出低电平。

主控板上有四个旋钮,可调节四个探头的灵敏度,在小车组装完成后,上电调节灵敏度。调节至指示灯处于亮灭边界即可。

  1. 电池

推荐使用12V可充电锂电池组,可以反复使用,不建议使用车体套件附带的电池盒,因为使用电池盒时电压不够大,电机动力不足。购买的电池组需要一个DC转接头。

5.51最小系统板

也可以直接使用51学习板,但其体积较大,不便于安装。

注:还需要一些其余零件,例如黑色电工胶布,杜邦线,螺丝,根据个人需求购买电烙铁,电机上有两个小铜环用于接电,可以直接用线搭上去,但是容易断裂,建议焊接。

程序部分

我的程序采用了模块化编程,也可以不用,但是代码会比较长。

编写程序前需要学习PWM调速以及定时器。

小车的转弯靠左右轮的差速,在转弯时一个轮子正转,一个反转效果比较好。

主函数

//驱动主函数
#include<REGX52.H>

#include"timer.h"
#include"Delay.h"
#include"MOTIONCONTROL.h"

#include"drive.h"

#include"direction.h"

void main()
{
    Timer0_Init();
    EA=1;
    while(1)
    {

    CONTROL();

    }
    
}

定时器

#include <REGX52.H>

sbit ENA=P1^1;
sbit ENB=P1^0;
unsigned int PWML,PWMR,t=0;//PWML控制左轮,PWMR控制右轮,t为比较值

void Timer0_Init()
{
    TMOD &= 0xF0;    
    TMOD |= 0x01;        
    TL0 = 65436%256;        
    TH0 = 65436/256;        
    TF0 = 0;        
    TR0 = 1;
    ET0=1;
    EA=1;
    PT0=0;
}//100us


void Timer0_Rountinue() interrupt 1
{
    TL0 = 65436%256;
    TH0 = 65436/256;
    t++;
    if(t<PWML)  ENA=1;
    else  ENA=0;
    if(t<PWMR)  ENB=1;
    else  ENB=0;
    t%=100;
}

循迹函数

#include<REGX52.H>

#include"timer.h"

#include"direction.h"

#include"drive.h"

#include"Delay.h"

sbit D1=P2^3;
sbit D2=P2^2;
sbit D3=P2^1;
sbit D4=P2^0;

void CONTROL()//识别到黑线,灯灭,输出1
{
    

    if(D1==0&&D2==0&&D3==0&&D4==0)//前进
    {
            PWML=14;
            PWMR=14;
            cargo();
    }    
    if(D1==0&&D2==1&&D3==1&&D4==0)//前进
    {
            PWML=15;
            PWMR=15;
            cargo();
    }    
    if(D1==1&&D2==1&&D3==1&&D4==1)//停止
    {
            PWML=0;
            PWMR=0;
            carstop();
    }
    if(D1==1&&D2==0&&D3==0&&D4==0)//右转大弯,左轮大
    {
            PWML=20;
            PWMR=9;
            carright();
    }    
    if(D1==0&&D2==0&&D3==0&&D4==1)//左转大弯,右轮大
    {
            PWML=9;
            PWMR=20;
            carleft();
    }        

    if(D1==0&&D2==0&&D3==1&&D4==0)//左转小弯,右轮大
    {
            PWML=14;
            PWMR=16;
            cargo();
    }    
    if(D1==0&&D2==1&&D3==0&&D4==0)//右转小弯,左轮大
    {
            PWML=16;
            PWMR=14;
            cargo();
    }    
    if(D1==1&&D2==1&&D3==0&&D4==0)//右转大弯,左轮大
    {
            PWML=20;
            PWMR=9;
            carright();
    }    
    if(D1==1&&D2==1&&D3==1&&D4==0)//右转大弯,左轮大
    {
            PWML=20;
            PWMR=9;
            carright();
    }    
    if(D1==0&&D2==1&&D3==1&&D4==1)//左转大弯,右轮大
    {
            PWML=9;
            PWMR=20;
            carleft();
    }    
    if(D1==1&&D2==0&&D3==1&&D4==0)//右转大弯,左轮大
    {
            PWML=20;
            PWMR=9;
            carright();
    }    
    if(D1==0&&D2==1&&D3==0&&D4==1)//左转大弯,右轮大
    {
            PWML=9;
            PWMR=20;
            carleft();
    }    
    if(D1==0&&D2==0&&D3==1&&D4==1)//左转大弯,右轮大
    {
            PWML=9;
            PWMR=20;
            carleft();
    }
}

方向相关函数

sbit IN1=P0^7;
sbit IN2=P0^6;
sbit IN3=P0^5;
sbit IN4=P0^4;
//    IN1=1;
//    IN2=0;
void Leftstop()
{
    IN1=0;
    IN2=0;
}
void Rightstop()
{
    IN3=0;
    IN4=0;
}
void Leftforward()
{
    IN1=0;
    IN2=1;
}
void Rightforward()
{
    IN3=1;
    IN4=0;
}
void Leftback()
{
    IN1=1;
    IN2=0;
}
void Rightback()
{
    IN3=0;
    IN4=1;
}
#include <REGX52.H>

#include"drive.h"

#include"timer.h"
void cargo()
{
    Leftforward();
    Rightforward();
}

void carstop()
{
    Rightstop();
    Leftstop();
}

void carleft()
{
    Leftback();
    Rightforward();
}

void carright()
{
    
    Leftforward();
    Rightback();
}

经验及错误总结

*定时器里面的TR0必须注意要置1,不然无法进入中断程序,占空比设置多少电机都是全速前进。

*若使用模块化编程,PWML和PWMR的值应设置为全局变量,不然其它文件不能使用PWML和PWMR的值。

*使用电烙铁一定要注意安全,最好找些教学视频后再上手。电烙铁长时间干烧会导致烙铁头氧化,不易上锡。

*电池组不能直接为单片机供电,不然芯片会被烧毁。

*小车最后虽然能完成要求,但因为程序上的不足并不能走好直线,如果想取得更好的结果,可以学习PID。

*循迹函数中有转小弯部分,若想使用该部分最好将中间两个探头分开些距离(具体取决于自己的实际需求),并且两个轮子的PWM值差不能太大。我最开始将两个探头紧挨在一起,想用来调节前进姿态,让小车走直线的轨迹更完美,但实际结果是小车反而更容易冲出轨道。

*小车循迹函数探头条件的if语句最好不要太简单,例如直接if(D1==1)就让小车进入右转,这样代码容易发生冲突,我在调试过程中因为循迹代码的冲突,导致车轮又正转又反转,最后的结果就是车轮无法运动。

*我的车最后要比较完美得走直线只能够把速度设置得很小,可能是受制于硬件。万向轮的存在让二驱的小车不是很适合走直线,地面不平整很容易使万向轮方向改变,即使两轮速度一致也会发生偏移。

小车速度很小的情况下需要外力才能正常运行。

*在编写代码过程中要注意自己设置的引脚是什么。我在编写调速函数时把左右轮设置反了,在调试过程中转向一直无法正常发生,甚至出现左转变右转,右转变左转的情况。定时器在从stc中复制下来的过程中,不知道是自己的原因还是stc的问题,TR0被置零,小车一直无法调速。

该小车使用了红外对管循迹,超声波测距,颜色传感器,直流减速电机,180°舵机,步进电机。 该资源包含小车的所有完整程序,原理图,PCB图,题目要求。 把题目简单介绍下: 寻迹智能电动车(本科大三大四题) 一、任务 设计并制作一个寻迹智能电动车,根据要求完成从出发区到终点区的任务: 二、要求 1、基本要求 (1)电动车从出发区出发(车体不得超出出发区),沿引导黑线向终点区行驶,电动车行驶过程中不可脱离黑色引导线行驶。 (2)电动车行驶过程中遇到十字路口时发出声光指示信息。 (3)电动车行驶过程中遇到障碍物。电动车必须避开障碍通过且不得与其接触。 (4)电动车到达终点后应立即停车,但全程行驶时间不能大于90秒,行驶时间达到90秒时必须立即自动停车。 2、发挥部分 (1)电动车行驶过程中遇到红色障碍物电动车必须选择向左转避开障碍物,遇到绿色障碍物电动车必须选择向右转避开障碍物。 (2)电动车避开障碍物通过不得与其接触且选择最短行驶距离到达终点区。 (3)电动车进入终点区域后,能进一步准确驶入终点区,要求电动车的车身完全进入终点区到达终点区中心。停车后,能准确显示电动车全程行驶时间和路程。 三、评分标准 项 目 满分 基本要求 完成第(1)项 10 完成第(2)项 12 完成第(3)项 15 完成第(4)项 13 发挥部分 完成第(1)项 20 完成第(2)项 12 完成第(3)项 8 其它 10 四、说明 1、场地上面铺设白纸,可用一张A0或者两张A1纸制作。 2、场地的引导线宽度2cm,可以涂墨或粘黑色胶带。示意图中的和尺寸标注线不要绘制在白纸上,出发区和终点区的边框为25cm*25cm 用签字笔细线标注。 3、电动车出发方向由测评专家指定,可选择(如图)正X方向或正Y方向。 3、障碍物可由包有红、绿色纸的长方体制作,其长、宽、高约为62mm 62mm 87mm(可用几张扑克牌制作长方体),场地上可允许有最多两个障碍物(也可只有一个,也可以放置两个同色或者不同色的障碍物,由测评专家指定),放置位置可在任意十字路口中间位置(T字路口不放置,障碍物面向电动车放置)。 4、电动车允许用玩具车改装,但不能由人工遥控,其外围尺寸(含车体上附加装置)的限制为:长度≤30cm,宽度≤20cm。 5、要求在电动车顶部明显标出电动车的中心点位置,即横向与纵向两条中心线的交点。 6、以图的左下角为坐标原点。 由于该程序是我2个月的心血,所以10分,不要嫌分多,肯定物超所值。 文件列表: 循迹主系统修正版.ddb 智能循迹小车程序 智能循迹小车程序 颜色传感器 HC-SR04超声波测距模块.pdf 步进电机工作原理及使用说明.pdf 舵机舵机的工作原理.pdf 利用单片机PWM进行舵机控制.pdf 颜色传感器产品使用手册.doc 寻迹智能电动车(本科).doc
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值