找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 14886|回复: 6
打印 上一主题 下一主题
收起左侧

Arduino智能循迹避障小车源程序

  [复制链接]
跳转到指定楼层
楼主
ID:627209 发表于 2019-10-21 18:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本小车基于Arduino uno开发,循迹比较灵敏,避障部分只适合本人设计的特殊赛道。
设计智能小车首先应该确定小车的基本结构,其主要包括以下几个部分:
1)循迹模块:指小车利用红外发射装置发射红外线后,照射物体表面返回量的多少来测定小车的具体的位置,以进行循迹。
2)电机驱动模块:指通过专用电路对电机进行驱动,单片机给出控制信号通过L298驱动电机正常运转。
3)控制模块:这是小车的控制中心,本设计采用Arduino系列单片机
4)电源模块: 因设计需要,我们给小车单独供电,设置独立的电源模块,使之稳定运行。
5)超声波避障模块:本文使用Arduino连接 HC-SR04 超声波测距传感器,超声波完成距离测定,并控制小车在前方障碍小于某一特定值时,做出“停止”、“后退”等一系列动作。
  1. #define STOP      0
  2. #define FORWARD   1
  3. #define BACKWARD  2
  4. #define TURNLEFT  3
  5. #define TURNRIGHT 4

  6. int Trig = 12;
  7. int Echo = 13;
  8. float distance;
  9. int Distance = 0;
  10. int leftMotor1=2;//定义I1接口
  11. int leftMotor2=4;//定义I2接口
  12. int ENA = 6;//定义EA(PWM调速)接
  13. int rightMotor1 =7;//定义I3接口
  14. int rightMotor2 =8;//定义I4接口
  15. int ENB=5;//定义EB(PWM调速)接口
  16. int IRR=14;//定义右侧寻线传感器接口
  17. int IRM=15;//定义中间寻线传感器接口
  18. int IRL=16;//定义左侧寻线传感器接口

  19. void setup()
  20. {
  21.   Serial.begin(9600);
  22.   pinMode(Trig,OUTPUT);
  23.   pinMode(Echo,INPUT);
  24.   pinMode(leftMotor1,OUTPUT);
  25.   pinMode(leftMotor2,OUTPUT);
  26.   pinMode(ENA,OUTPUT);
  27.   pinMode(rightMotor1,OUTPUT);
  28.   pinMode(rightMotor2,OUTPUT);
  29.   pinMode(ENB,OUTPUT);
  30.   pinMode(IRR,INPUT);
  31.   pinMode(IRM,INPUT);
  32.   pinMode(IRL,INPUT);
  33. }

  34. void motorRun(int cmd,int value)
  35. {
  36.   analogWrite(ENA, value);  //设置PWM输出,即设置速度
  37.   analogWrite(ENB, value);
  38.   switch(cmd){
  39.     case FORWARD:
  40.       Serial.println("FORWARD"); //输出状态 前进
  41.       digitalWrite(leftMotor1,HIGH );
  42.       digitalWrite(leftMotor2,LOW );
  43.       digitalWrite(rightMotor1,LOW );
  44.       digitalWrite(rightMotor2,HIGH );
  45.       break;
  46.      case BACKWARD:
  47.       Serial.println("BACKWARD"); //输出状态 后退
  48.       digitalWrite(leftMotor1,LOW);
  49.       digitalWrite(leftMotor2,HIGH);
  50.       digitalWrite(rightMotor1,HIGH);
  51.       digitalWrite(rightMotor2,LOW);
  52.       break;
  53.      case TURNLEFT:
  54.       Serial.println("TURN  LEFT"); //输出状态 左转
  55.       digitalWrite(leftMotor1, LOW);
  56.       digitalWrite(leftMotor2, HIGH);
  57.       digitalWrite(rightMotor1, LOW);
  58.       digitalWrite(rightMotor2, HIGH);
  59.       break;
  60.      case TURNRIGHT:
  61.       Serial.println("TURN  RIGHT"); //输出状态右转
  62.       digitalWrite(leftMotor1, HIGH);
  63.       digitalWrite(leftMotor2, LOW);
  64.       digitalWrite(rightMotor1, HIGH);
  65.       digitalWrite(rightMotor2, LOW);
  66.       break;
  67.      default:
  68.       Serial.println("STOP"); //输出状态 停止
  69.       digitalWrite(leftMotor1, LOW);
  70.       digitalWrite(leftMotor2, LOW);
  71.       digitalWrite(rightMotor1, LOW);
  72.       digitalWrite(rightMotor2, LOW);
  73.   }
  74. }

  75. float Distance_test()
  76. {
  77.   digitalWrite(Trig,LOW);       //产生一个10US的高脉冲去触发Trigpin
  78.   delayMicroseconds(2);
  79.   digitalWrite(Trig,HIGH);            
  80.   delayMicroseconds(10);            
  81.   digitalWrite(Trig,LOW);  
  82.   float distance = pulseIn(Echo,HIGH);
  83.   Distance = distance/58;
  84.   return Distance;
  85. }

  86. void loop()
  87. {
  88.   
  89.     Distance_test();
  90.      Serial.println(Distance);
  91.               if(Distance > 20 )
  92.                        {
  93.                          tracing();
  94.                        }
  95.               else if(Distance < 20 )
  96.               {
  97.                     motorRun(STOP,0);  
  98.                     delay(900);  
  99.                     motorRun(BACKWARD,60);
  100.                     delay(200);  
  101.                     motorRun(STOP,0);  
  102.                     delay(900);  
  103.                     motorRun(TURNLEFT,80);
  104.                     delay(800);
  105.                     motorRun(STOP,0);  
  106.                     delay(900);
  107.                     motorRun(FORWARD,60);
  108.                     delay(700);
  109.                     motorRuin(STOP,0);  
  110.                     delay(900);
  111.                     motorRun(TURNRIGHT,80);
  112.                     delay(800);
  113.                     motorRun(FORWARD,60);
  114.                     delay(1100);   
  115.                     motorRun(STOP,0);  
  116.                     delay(900);
  117.                     motorRun(TURNRIGHT,70);
  118.                     delay(600);
  119.                     motorRun(FORWARD,60);
  120.                     delay(600);
  121.                }
  122. }


  123. void tracing()
  124. {
  125.     int r,m,l;
  126.     r=digitalRead(IRR);
  127.     m=digitalRead(IRM);
  128.     l=digitalRead(IRL);
  129.     if(l==HIGH && m==HIGH && r== HIGH){
  130.     motorRun(FORWARD,60);
  131.     }
  132.    
  133.     if(l==LOW &&m==LOW && r== LOW){
  134.      motorRun(FORWARD,60);      //如果删掉forward和delay,在三岔路口小车可能会左右来回“抽风”,读者可以去掉尝试一下。
  135.     delay(20);
  136.     motorRun(TURNRIGHT,90);
  137.    // motorRun(TURNRIGHT,90);
  138.     }
  139.     if(l==LOW &&m==HIGH && r==LOW){
  140.     motorRun(FORWARD,60);
  141.     }
  142.    else if(l==LOW &&m==HIGH && r==HIGH){
  143.     motorRun(TURNRIGHT,90);
  144.     }
  145.     else if(l==HIGH &&m==HIGH && r==LOW){
  146.     motorRun(TURNLEFT,90);}
  147.     else if(l==HIGH && m==LOW && r==LOW){
  148.     motorRun(TURNLEFT,90);}
  149.     else if(l==LOW && m==LOW && r==HIGH){
  150.    motorRun(TURNRIGHT,90);}
  151.     else if(l==HIGH && m==LOW && r==HIGH){
  152.     motorRun(TURNRIGHT,90);}

  153. }
复制代码



评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏4 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:163392 发表于 2019-11-2 21:56 | 只看该作者
不错啊,参考下你的程序
回复

使用道具 举报

板凳
ID:636039 发表于 2019-11-5 15:21 来自手机 | 只看该作者
能不能,指点我这个设计,声控小车(走直线,拍手频率越高,车速越快),用什么实现,用什么芯片,大佬谢谢了
回复

使用道具 举报

地板
ID:648620 发表于 2019-11-24 22:57 | 只看该作者
第114行motorRuin(STOP,0);
多了一个i欸
  
回复

使用道具 举报

5#
ID:844292 发表于 2020-11-16 11:04 | 只看该作者
您好,想问一下您设计的赛道长什么样子,有照片或者可以讲解一下吗?谢谢
回复

使用道具 举报

6#
ID:844772 发表于 2020-11-17 11:26 | 只看该作者
13370353201 发表于 2019-11-5 15:21
能不能,指点我这个设计,声控小车(走直线,拍手频率越高,车速越快),用什么实现,用什么芯片,大佬谢谢 ...

如果只是根据拍的节奏控制车速,并用Arduino写,买个最便宜的声音模块(10元几个)就行。拍手导致模块阈值反转触发中断,再通过时钟中断对两次声音触发的中断计时,对应相应速度就行了。
回复

使用道具 举报

7#
ID:973173 发表于 2021-10-22 16:59 | 只看该作者
把前、后、左、右这些方向写成一个函数,挺不错的思路
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表