找回密码
 立即注册

QQ登录

只需一步,快速开始

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

arduino智能红外避障小车原理图与源码

  [复制链接]
跳转到指定楼层
楼主



单片机源程序如下:
  1. //============================智宇科技===========================
  2. //  智能小车红外避障实验1(基础避障)
  3. //===============================================================
  4. //#include <Servo.h>
  5. int Left_motor_go=8;     //左电机前进(IN1)
  6. int Left_motor_back=9;     //左电机后退(IN2)

  7. int Right_motor_go=10;    // 右电机前进(IN3)
  8. int Right_motor_back=11;    // 右电机后退(IN4)

  9. int key=7;//定义按键 数字7 接口
  10. int beep=12;//定义蜂鸣器 数字12 接口

  11. const int SensorRight = 3;           //右循迹红外传感器(P3.2 OUT1)
  12. const int SensorLeft = 4;             //左循迹红外传感器(P3.3 OUT2)

  13. const int SensorRight_2 = 5;           //右红外传感器(P3.4 OUT3)
  14. const int SensorLeft_2 = 6;     //左红外传感器(P3.5 OUT4)

  15. int SL;    //左循迹红外传感器状态
  16. int SR;    //右循迹红外传感器状态
  17. int SL_2;    //左红外传感器状态
  18. int SR_2;    //右红外传感器状态

  19. void setup()
  20. {
  21.   //初始化电机驱动IO为输出方式
  22.   pinMode(Left_motor_go,OUTPUT); // PIN 8 (PWM)
  23.   pinMode(Left_motor_back,OUTPUT); // PIN 9 (PWM)
  24.   pinMode(Right_motor_go,OUTPUT);// PIN 10 (PWM)
  25.   pinMode(Right_motor_back,OUTPUT);// PIN 11 (PWM)
  26.   pinMode(key,INPUT);//定义按键接口为输入接口
  27.   pinMode(beep,OUTPUT);
  28.   pinMode(SensorRight, INPUT); //定义右循迹红外传感器为输入
  29.   pinMode(SensorLeft, INPUT); //定义左循迹红外传感器为输入
  30.   pinMode(SensorRight_2, INPUT); //定义右红外传感器为输入
  31.   pinMode(SensorLeft_2, INPUT); //定义左红外传感器为输入
  32. }
  33. //=======================智能小车的基本动作=========================
  34. //void run(int time)     // 前进
  35. void run()     // 前进
  36. {
  37.   digitalWrite(Right_motor_go,HIGH);  // 右电机前进
  38.   digitalWrite(Right_motor_back,LOW);     
  39.   analogWrite(Right_motor_go,200);//PWM比例0~255调速,左右轮差异略增减
  40.   analogWrite(Right_motor_back,0);
  41.   digitalWrite(Left_motor_go,LOW);  // 左电机前进
  42.   digitalWrite(Left_motor_back,HIGH);
  43.   analogWrite(Left_motor_go,0);//PWM比例0~255调速,左右轮差异略增减
  44.   analogWrite(Left_motor_back,200);
  45.   //delay(time * 100);   //执行时间,可以调整  
  46. }

  47. void brake(int time)  //刹车,停车
  48. {
  49.   digitalWrite(Right_motor_go,LOW);
  50.   digitalWrite(Right_motor_back,LOW);
  51.   digitalWrite(Left_motor_go,LOW);
  52.   digitalWrite(Left_motor_back,LOW);
  53.   delay(time * 100);//执行时间,可以调整  
  54. }

  55. //void left(int time)         //左转(左轮不动,右轮前进)
  56. void left()         //左转(左轮不动,右轮前进)
  57. {
  58.   digitalWrite(Right_motor_go,HIGH);        // 右电机前进
  59.   digitalWrite(Right_motor_back,LOW);
  60.   analogWrite(Right_motor_go,200);
  61.   analogWrite(Right_motor_back,0);//PWM比例0~255调速
  62.   digitalWrite(Left_motor_go,LOW);   //左轮后退
  63.   digitalWrite(Left_motor_back,LOW);
  64.   analogWrite(Left_motor_go,0);
  65.   analogWrite(Left_motor_back,0);//PWM比例0~255调速
  66.   //delay(time * 100);        //执行时间,可以调整  
  67. }

  68. void spin_left(int time)         //左转(左轮后退,右轮前进)
  69. {
  70.   digitalWrite(Right_motor_go,HIGH);        // 右电机前进
  71.   digitalWrite(Right_motor_back,LOW);
  72.   analogWrite(Right_motor_go,200);
  73.   analogWrite(Right_motor_back,0);//PWM比例0~255调速
  74.   digitalWrite(Left_motor_go,HIGH);   //左轮后退
  75.   digitalWrite(Left_motor_back,LOW);
  76.   analogWrite(Left_motor_go,200);
  77.   analogWrite(Left_motor_back,0);//PWM比例0~255调速
  78.   delay(time * 100);        //执行时间,可以调整   
  79. }

  80. //void right(int time)
  81. void right()        //右转(右轮不动,左轮前进)
  82. {
  83.   digitalWrite(Right_motor_go,LOW);   //右电机后退
  84.   digitalWrite(Right_motor_back,LOW);
  85.   analogWrite(Right_motor_go,0);
  86.   analogWrite(Right_motor_back,0);//PWM比例0~255调速
  87.   digitalWrite(Left_motor_go,LOW);//左电机前进
  88.   digitalWrite(Left_motor_back,HIGH);
  89.   analogWrite(Left_motor_go,0);
  90.   analogWrite(Left_motor_back,200);//PWM比例0~255调速
  91.   //delay(time * 100);        //执行时间,可以调整  
  92. }

  93. void spin_right(int time)        //右转(右轮后退,左轮前进)
  94. {
  95.   digitalWrite(Right_motor_go,LOW);   //右电机后退
  96.   digitalWrite(Right_motor_back,HIGH);
  97.   analogWrite(Right_motor_go,0);
  98.   analogWrite(Right_motor_back,200);//PWM比例0~255调速
  99.   digitalWrite(Left_motor_go,LOW);//左电机前进
  100.   digitalWrite(Left_motor_back,HIGH);
  101.   analogWrite(Left_motor_go,0);
  102.   analogWrite(Left_motor_back,200);//PWM比例0~255调速
  103.   delay(time * 100);        //执行时间,可以调整   
  104. }

  105. void back(int time)          //后退
  106. {
  107.   digitalWrite(Right_motor_go,LOW);  //右轮后退
  108.   digitalWrite(Right_motor_back,HIGH);
  109.   analogWrite(Right_motor_go,0);
  110.   analogWrite(Right_motor_back,150);//PWM比例0~255调速
  111.   digitalWrite(Left_motor_go,HIGH);  //左轮后退
  112.   digitalWrite(Left_motor_back,LOW);
  113.   analogWrite(Left_motor_go,150);
  114.   analogWrite(Left_motor_back,0);//PWM比例0~255调速
  115.   delay(time * 100);     //执行时间,可以调整
  116. }
  117. //==========================================================

  118. void keysacn()//按键扫描
  119. {
  120.   int val;
  121.   val=digitalRead(key);//读取数字7 口电平值赋给val
  122.   while(!digitalRead(key))//当按键没被按下时,一直循环
  123.   {
  124.     val=digitalRead(key);//此句可省略,可让循环跑空
  125.   }
  126.   while(digitalRead(key))//当按键被按下时
  127.   {
  128.     delay(10);        //延时10ms
  129.     val=digitalRead(key);//读取数字7 口电平值赋给val
  130.     if(val==HIGH)  //第二次判断按键是否被按下
  131.     {
  132.       digitalWrite(beep,HIGH);                //蜂鸣器响
  133.       while(!digitalRead(key))        //判断按键是否被松开
  134.         digitalWrite(beep,LOW);                //蜂鸣器停止
  135.     }
  136.     else
  137.       digitalWrite(beep,LOW);//蜂鸣器停止
  138.   }
  139. }

  140. void loop()
  141. {
  142.   keysacn();           //调用按键扫描函数
  143.   while(1)
  144.   {
  145.     //有信号为LOW  没有信号为HIGH
  146.     SR_2 = digitalRead(SensorRight_2);
  147.     SL_2 = digitalRead(SensorLeft_2);
  148.     if (SL_2 == HIGH&&SR_2==HIGH)//前面没有障碍物
  149.       run();   //调用前进函数
  150.     else if (SL_2 == HIGH & SR_2 == LOW)// 右边探测到有障碍物,有信号返回,向左转
  151.         left();//调用左转函数
  152.     else if (SR_2 == HIGH & SL_2 == LOW) //左边探测到有障碍物,有信号返回,向右转  
  153.       right();//调用右转函数
  154.     else // 都是有障碍物, 后退

  155.      {
  156.        back(3);//后退300MS
  157.        left();//调用左转函数
  158.        delay(500);        //延时500ms
  159.      }

  160.   }
  161. }
复制代码

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

使用道具 举报

沙发
ID:340398 发表于 2018-5-29 11:49 | 只看该作者
很好,学习了
回复

使用道具 举报

板凳
ID:450629 发表于 2018-12-20 11:55 | 只看该作者
这个能用吗
回复

使用道具 举报

地板
ID:450780 发表于 2018-12-20 15:33 | 只看该作者
学习了
回复

使用道具 举报

5#
ID:453488 发表于 2018-12-24 15:09 | 只看该作者
谢谢大佬分享!
回复

使用道具 举报

6#
ID:575167 发表于 2019-6-30 18:58 | 只看该作者
有电路图吗,大佬

回复

使用道具 举报

7#
ID:661976 发表于 2019-12-11 21:43 | 只看该作者
3路怎么设计???
回复

使用道具 举报

8#
ID:139783 发表于 2020-2-1 10:09 来自手机 | 只看该作者
受教了,谢谢楼主
回复

使用道具 举报

9#
ID:269454 发表于 2020-3-4 09:25 | 只看该作者
画上面那个图的软件是啥?
回复

使用道具 举报

10#
ID:735679 发表于 2020-4-22 22:47 | 只看该作者
LYZ321520 发表于 2020-3-4 09:25
画上面那个图的软件是啥?

AD Altium Designer
回复

使用道具 举报

11#
ID:943916 发表于 2021-6-24 14:03 | 只看该作者
可不可以给下源文件啊,大佬
回复

使用道具 举报

12#
ID:844772 发表于 2021-6-24 20:24 | 只看该作者
ddold 发表于 2021-6-24 14:03
可不可以给下源文件啊,大佬

本来四个红外,只用了两个,程序也过于简单,所以车速不能快,也不适合走急弯。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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