单片机学习小组
直播中

张龙祥

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()函数
举报

更多回帖

发帖
×
20
完善资料,
赚取积分