单片机学习小组
登录
直播中
张龙祥
8年用户
1257经验值
擅长:连接器
私信
关注
如何制作一个循迹小车?
开启该帖子的消息推送
单片机
循迹小车
如何制作一个循迹小车?
回帖
(1)
王茜
2022-1-18 11:47:33
简单介绍
大一时做了一辆循迹小车,第一次做小项目,没有经验,走了很多弯路,前前后后花费了大概一个月的时间。被小车折磨了一个月后,我学到了很多东西,体会很深,很想写下来与大家分享。主要献给和我一样第一次做项目的朋友们,希望对你们有用。
接下来我分享一下我这个小车的做法和经验。整个过程主要分为查资料、购买原件、组装、编程序、调试小车五步。在这篇博客中我将具体介绍这五步,让你看完后对循迹小车有大体了解,可以独立做出循迹小车,避免走很多弯路。
展示
:
前提:
具备一点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
#define uint unsigned int
#define uchar unsigned char
***it Kaiguan=P1^4; //声控开关
***it Fengming=P0^0; //蜂鸣器
***it left1=P1^1;
***it left2=P0^2; //红外传感器
***it left3=P1^0;
***it right1=P1^2;
***it right2=P1^3;
***it right3=P0^1;
***it ENA=P3^2; //电机驱动使能A端
***it in1=P3^3;
***it in2=P3^4;
***it in3=P3^5;
***it in4=P3^6;
***it 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
{
ENA=1;
}
else
{
ENA=0;
}
if(t
{
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()函数
简单介绍
大一时做了一辆循迹小车,第一次做小项目,没有经验,走了很多弯路,前前后后花费了大概一个月的时间。被小车折磨了一个月后,我学到了很多东西,体会很深,很想写下来与大家分享。主要献给和我一样第一次做项目的朋友们,希望对你们有用。
接下来我分享一下我这个小车的做法和经验。整个过程主要分为查资料、购买原件、组装、编程序、调试小车五步。在这篇博客中我将具体介绍这五步,让你看完后对循迹小车有大体了解,可以独立做出循迹小车,避免走很多弯路。
展示
:
前提:
具备一点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
#define uint unsigned int
#define uchar unsigned char
***it Kaiguan=P1^4; //声控开关
***it Fengming=P0^0; //蜂鸣器
***it left1=P1^1;
***it left2=P0^2; //红外传感器
***it left3=P1^0;
***it right1=P1^2;
***it right2=P1^3;
***it right3=P0^1;
***it ENA=P3^2; //电机驱动使能A端
***it in1=P3^3;
***it in2=P3^4;
***it in3=P3^5;
***it in4=P3^6;
***it 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
{
ENA=1;
}
else
{
ENA=0;
}
if(t
{
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()函数
举报
更多回帖
rotate(-90deg);
回复
相关问答
单片机
循迹小车
循迹
避障
小车
2017-10-02
3157
求简单红外
循迹
小车
制作
程序与仿真图
2014-05-29
4777
如何利用LDC1314检测铁丝
制作
循迹
小车
?
2018-12-24
2282
如何利用STM32F103C8T6完成
循迹
避障
小车
的
制作
?
2021-10-08
2007
可
循迹
小车
的原理是什么?
2023-10-25
322
stm32八路红外
循迹
小车
2023-01-24
5777
关于
循迹
小车
的若干疑问
2017-12-17
3084
如何利用51单片机
制作
简单的
循迹
小车
?
2021-11-03
1826
如何去设计并
制作
一
个
基于STM32F103的自动
循迹
小车
呢
2021-12-20
2129
循迹
小车
怎样做才能跑直线呢
2021-11-19
3386
发帖
登录/注册
20万+
工程师都在用,
免费
PCB检查工具
无需安装、支持浏览器和手机在线查看、实时共享
查看
点击登录
登录更多精彩功能!
首页
论坛版块
小组
免费开发板试用
ebook
直播
搜索
登录
×
20
完善资料,
赚取积分