简单介绍
大一时做了一辆循迹小车,第一次做小项目,没有经验,走了很多弯路,前前后后花费了大概一个月的时间。被小车折磨了一个月后,我学到了很多东西,体会很深,很想写下来与大家分享。主要献给和我一样第一次做项目的朋友们,希望对你们有用。
接下来我分享一下我这个小车的做法和经验。整个过程主要分为查资料、购买原件、组装、编程序、调试小车五步。在这篇博客中我将具体介绍这五步,让你看完后对循迹小车有大体了解,可以独立做出循迹小车,避免走很多弯路。
展示:
前提:
- 具备一点C语言知识(学完三种基本结构就可以)
- 具备一点51单片机知识(会用定时器和中断就可以)
- 一台电脑(用来写程序和烧录程序)
- 150元左右(用来买原件)
正文:
一、关于查资料
需要C语言、51单片机和高中物理电学基本知识。C语言推荐观看浙江大学翁凯老师的C语言课程,51单片机推荐郭天祥老师的书籍。
二、购买原件
必要的模块
1、 小车底盘
建议买 直接购买4 轮两层的, 厚一些的亚克力板, 板子颜色随便, 也 可以买铝合金的, 更坚实
2、 电机驱动(型号: L289N)
3、避障循迹模块
可以购买四路集成在一块板子上的,也可以买单独的。
4、降压稳压模块
5、单片机最小系统
6、电池(18650 电池组, 或者 3 节 18650 单电池使用电池盒)
非必要的模块
1、 超声波测距模块
2、蜂鸣器(有源蜂鸣器)
3、光敏开关或声音开关
4、声控开关
5、杜邦线(母对母建议多买一份、 公对母、 公对公, 长度建议 20cm, 可以买点长的)
6、开关
7、螺丝及铜柱,
8、1602 显示模块
9、显示电池电压模块
三、组装
1、注意电池最好放上面,便于充电。
2、布线要整洁
四、程序(供参考)
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit Kaiguan=P1^4; //声控开关
sbit Fengming=P0^0; //蜂鸣器
sbit left1=P1^1;
sbit left2=P0^2; //红外传感器
sbit left3=P1^0;
sbit right1=P1^2;
sbit right2=P1^3;
sbit right3=P0^1;
sbit ENA=P3^2; //电机驱动使能A端
sbit in1=P3^3;
sbit in2=P3^4;
sbit in3=P3^5;
sbit in4=P3^6;
sbit ENB=P3^7; //电机驱动使能B端
uchar t, zkba, zkbb;
void delay(uint xms) //延时函数
{
uint a,b;
for(a=xms;a>0;a--)
for(b=110;b>0;b--);
}
void Timer0Init() //定时器0初始化
{
TMOD=0X01;
TH0=(65532-100)/256;
TL0=(65532-100)%256;
EA=1;
ET0=1;
TR0=1;
}
void Timer0() interrupt 1 //定时器0 pwm调速
{
TH0=(65536-100)/256;
TL0=(65536-100)%256;
++t;
if(t<zkba)
{
ENA=1;
}
else
{
ENA=0;
}
if(t<zkbb)
{
ENB=1;
}
else
{
ENB=0;
}
if(t>=100)
{
t=0;
}
}
void zhizou() // 直走
{
in1=0;
in2=1;
in3=1;
in4=0;
zkba=85;
zkbb=85;
}
void turn_left() // 左拐
{
in1=1;
in2=0;
in3=1;
in4=0;
zkba=10;
zkbb=70;
}
void turn_right1() // 右拐
{
in1=0;
in2=1;
in3=0;
in4=1;
zkba=65;
zkbb=15;
}
void turn_right2() // 右拐
{
in1=0;
in2=1;
in3=0;
in4=1;
zkba=70;
zkbb=40;
}
void stop() // 停止
{
in1=1;
in2=1;
in3=1;
in4=1;
zkba=0;
zkbb=0;
}
void fasheng() // 发声
{
Fengming=1;
delay(30);
Fengming=0;
}
void xunji() //循迹
{
uchar flag ;
if((left3 == 0)&&(left1 == 0)&&(right1 == 0)&&(right2 == 1)&&(right3==1)) // 直走
{
flag=0;
}
if((left3 == 0)&&(left1 == 0)&&(right1 == 0)&&(right2 == 0)&&(right3==1)) // 右拐
{
delay(5);
if((left3 == 0)&&(left1 == 0)&&(right1 == 0)&&(right2 == 0)&&(right3==1))
flag=1;
}
if((left3 == 0)&&(left1 == 0)&&(right1 == 0)&&(right2 == 0)&&(right3==0)) // 右拐
{
flag=5;
}
if((left3 == 0)&&(left1 == 0)&&(right1 ==1)&&(right2 == 1)&&(right3==1)) // 左拐
{
delay(15);
if((left3 == 0)&&(left1 == 0)&&(right1 ==1)&&(right2 == 1)&&(right3==1))
flag = 2;
}
if((left3 == 0)&&(left1 == 0)&&(right1 ==1)&&(right2 == 0)&&(right3==1)) // 左拐
{
delay(15);
if((left3 == 0)&&(left1 == 0)&&(right1 ==1)&&(right2 == 0)&&(right3==1))
flag = 2;
}
if((left1==1)||(left2==1))
{
delay(4);
if((left1==1)||(left2==1)) // 发声
flag = 3;
}
if((left1==1)||(left2==1))
{
delay(8);
if((left1==1)||(left2==1)) // 发声
flag = 3;
}
if((left3 == 1)||(left1==1)) // 停
{
delay(5);
if((left3 == 1)&&(left1==1))
flag = 4;
}
if((left3 == 1)||(left2==1)) // 停
{
delay(10);
if((left3 == 1)&&(left2==1))
flag = 4;
}
switch(flag)
{
case 0:zhizou(); break;
case 1:turn_right1(); break;
case 2:turn_left(); break;
case 3:fasheng(); break;
case 5:turn_right2(); break;
case 4:turn_left();
delay(100);
zhizou();
delay(60);
stop();
while(1); break;
default:zhizou(); break;
}
}
void main()
{
Fengming=0;
Timer0Init();
delay(30);
while(1)
{
if(Kaiguan==0)
{
while(1)
{
xunji();
}
}
}
}
五、调试
1、主要是修改pwm的占空比调速和红外检测黑白线,修改xunji()函数