极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 12913|回复: 0

你们是正常采用什么方式让小车自动避障和无线控制切换,如下代码为什么一直直行呢

[复制链接]
发表于 2016-10-22 13:31:19 | 显示全部楼层 |阅读模式
  1. #include <AFMotor.h>
  2. int RelayPin = 13;   //继电器
  3. int EchoPin = 14; //超声波Echo
  4. int TrigPin = 15; //超声波Trig
  5. int SensorL = 16;   //避障前左 16
  6. int SensorR = 17;  //避障前右  17
  7. int Jiguang = 18;  //激光开关
  8. int mid = 0 ;
  9. int snum[3];
  10. int state;
  11. float cm;
  12. int val;

  13. AF_DCMotor motor1(1, MOTOR12_64KHZ);// 创建左前轮,速度是64KHz pwm
  14. AF_DCMotor motor2(2, MOTOR12_64KHZ);// 创建左后轮,速度是64KHz pwm
  15. AF_DCMotor motor3(3, MOTOR12_64KHZ);// 创建右前轮,速度是64KHz pwm
  16. AF_DCMotor motor4(4, MOTOR12_64KHZ);// 创建右后轮,速度是64KHz pwm


  17. /******************************  小车行驶状态   ***********************************/
  18. void carGoFwd()
  19. {       // 小车前进
  20.            motor1.run(FORWARD);// 电机前进
  21.            motor2.run(FORWARD);// 电机前进
  22.            motor3.run(FORWARD);// 电机前进
  23.            motor4.run(FORWARD);// 电机前进
  24.            Serial.print("car forward");

  25. }
  26. void carGoBwd()
  27. {     // 小车后退
  28.            motor1.run(BACKWARD);// 电机后退
  29.            motor2.run(BACKWARD);// 电机后退
  30.            motor3.run(BACKWARD);// 电机后退
  31.            motor4.run(BACKWARD);// 电机后退
  32.            Serial.print("car back");

  33.   }

  34. void carTurnL()
  35. {      // 小车左转
  36.            motor1.run(BACKWARD);// 电机后退
  37.            motor2.run(BACKWARD);// 电机后退
  38.            motor3.run(FORWARD);// 电机前进
  39.            motor4.run(FORWARD);// 电机前进
  40.            Serial.print("car turn left");

  41. }

  42. void carTurnR()
  43. {       // 小车右转
  44.            motor1.run(FORWARD);// 电机前进
  45.            motor2.run(FORWARD);// 电机前进
  46.            motor3.run(BACKWARD);// 电机后退
  47.            motor4.run(BACKWARD);// 电机后退
  48.            Serial.print("car turn right");      
  49. }
  50.   void carGoL()
  51. {       // 小车左前行
  52.            motor1.run(BACKWARD);// 电机后退
  53.            motor2.run(FORWARD);// 电机后退
  54.            motor3.run(FORWARD);// 电机前进
  55.            motor4.run(FORWARD);// 电机前进
  56.            Serial.print("car go left");      
  57. }
  58.    void carGoR()
  59. {       // 小车右前行
  60.            motor1.run(FORWARD);// 电机前进
  61.            motor2.run(FORWARD);// 电机前进
  62.            motor3.run(FORWARD);// 电机后退
  63.            motor4.run(BACKWARD);// 电机后退
  64.            Serial.print("car go right");      
  65. }
  66. void  carStop()
  67. {        // 小车制动
  68.            motor1.run(RELEASE);// 电机停步
  69.            motor2.run(RELEASE);// 电机停步
  70.            motor3.run(RELEASE);// 电机停步
  71.            motor4.run(RELEASE);// 电机停步
  72.            Serial.print("car barke");

  73. }
  74. void randTrun()
  75. {
  76.   long randNumber;
  77.   randomSeed(analogRead(5));
  78.   randNumber = random(0, 10);
  79.   if(randNumber > 5) {
  80.     carTurnR();
  81.   }
  82.   else
  83.   {
  84.     carTurnL();
  85.   }
  86. }

  87. /*******************************   测距模块  **************************/  
  88. int distance()
  89. {
  90.   digitalWrite(TrigPin, LOW);   // 给触发脚低电平2μs
  91.   delayMicroseconds(2);
  92.   digitalWrite(TrigPin, HIGH);  // 给触发脚高电平10μs,这里至少是10μs
  93.   delayMicroseconds(20);
  94.   digitalWrite(TrigPin, LOW);    // 持续给触发脚低电
  95.   float Fdistance = pulseIn(EchoPin, HIGH);  // 读取高电平时间(单位:微秒)
  96.   Fdistance= Fdistance/58;       //为什么除以58等于厘米,  Y米=(X秒*344)/2
  97.   // X秒=( 2*Y米)/344 ==》X秒=0.0058*Y米 ==》厘米=微秒/58
  98.   return (int)Fdistance;
  99.    Serial.print(Fdistance);
  100.    Serial.println(Fdistance);
  101. }
  102. /*******************************   避障过程  **************************/  
  103. void autorun()
  104. {
  105.   snum[0]=digitalRead(16); //这三个依次为左右红外传感器
  106.   snum[1]=digitalRead(17);
  107.   mid = distance();
  108.    #ifdef send
  109.     Serial.print("mid=");
  110.     Serial.println(mid);
  111.    #endif

  112. if ((snum[0]==1) && snum[1]==1  ) //所有传感器都没有检测到障碍物
  113.   {
  114.    carGoFwd();//直行
  115.   }
  116.   if (snum[0]==0 && (snum[1]==1)) //右边传感器检测到障碍物
  117.   {
  118.    carStop();
  119.    delay(500);
  120.    carGoBwd();
  121.    delay(200);
  122.    carTurnR();
  123.    delay(1000);
  124.   }
  125.   if (snum[0]==1 && snum[1]==0)   //左边传感器检测到障碍物
  126.   {
  127.    carStop();
  128.    delay(500);
  129.    carGoBwd();
  130.    delay(500);
  131.    carTurnL();//小车向右转
  132.    delay(500);
  133.   }
  134.   if (mid <=15) //所有传感器都没有检测到障碍物
  135.   {
  136.    carStop();
  137.    delay(500);
  138.    carGoBwd();
  139.    delay(500);
  140.    randTrun();
  141.    delay(500);
  142.   }
  143. }
  144. void setup()
  145. {   // 初始化串口通信及连接SR04的引脚     
  146.         Serial.begin(9600);
  147.         pinMode(RelayPin,OUTPUT);  //定义继电器 RelayPin接口为输出接口      
  148.         pinMode(TrigPin, OUTPUT);  //定义SR04 TrigPin接口为输出接口
  149.         pinMode(EchoPin, INPUT);   //定义SR04 EchoPin接口为输入 接口
  150.         pinMode(SensorL,INPUT);    //定义左传感器接口为输入接口
  151.         pinMode(SensorR,INPUT);    //定义右传感器接口为输入接口
  152.         pinMode(Jiguang,OUTPUT);   //定义激光头
  153.         motor1.setSpeed(150);// 设置电机速度,从200/255之间任意
  154.         motor2.setSpeed(150);// 设置电机速度,从200/255之间任意
  155.         motor3.setSpeed(160);// 设置电机速度,从200/255之间任意
  156.         motor4.setSpeed(160);// 设置电机速度,从200/255之间任意
  157.         digitalWrite(RelayPin,HIGH);   
  158. }
  159. void loop()
  160. {
  161.   if(Serial.available()>0) //查询串口有无数据
  162.   {
  163.         val=Serial.read();//读取labview下达的命令
  164.         if(val=='Q')//发送字符'Q',则小车自动巡行
  165.         {
  166.           autorun();//      
  167.         }
  168.         if(val=='W')//发送字符'W',则小车前进
  169.         {
  170.           carGoFwd();//   
  171.         }
  172.         if(val=='S')//发送字符'S',则小车后退
  173.         {
  174.           carGoBwd();//   
  175.         }
  176.          if(val=='A')//发送字符'A',则小车左转
  177.         {
  178.          carTurnL();//  
  179.         }
  180.          if(val=='D')//发送字符'D',则小车右转
  181.         {
  182.          carTurnR();//   
  183.         }
  184.         if(val=='Z')//发送字符'y',则小车停止
  185.         {
  186.          carStop();//
  187.         }
  188.         if(val=='M')//
  189.         {
  190.         {
  191.           digitalWrite(Jiguang,HIGH);
  192.           delay(10000);  
  193.           digitalWrite(Jiguang,LOW);   
  194.         }     
  195.         if(val=='N')//
  196.           digitalWrite(RelayPin,LOW);
  197.           delay(10000);  
  198.           digitalWrite(RelayPin,HIGH);   
  199.         }   
  200.   }

  201.   }

复制代码
回复

使用道具 举报

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

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-19 03:17 , Processed in 0.046695 second(s), 18 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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