shadows2006 发表于 2016-10-22 13:31:19

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

#include <AFMotor.h>
int RelayPin = 13;   //继电器
int EchoPin = 14; //超声波Echo
int TrigPin = 15; //超声波Trig
int SensorL = 16;   //避障前左 16
int SensorR = 17;//避障前右17
int Jiguang = 18;//激光开关
int mid = 0 ;
int snum;
int state;
float cm;
int val;

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


/******************************小车行驶状态   ***********************************/
void carGoFwd()
{       // 小车前进
         motor1.run(FORWARD);// 电机前进
         motor2.run(FORWARD);// 电机前进
         motor3.run(FORWARD);// 电机前进
         motor4.run(FORWARD);// 电机前进
         Serial.print("car forward");

}
void carGoBwd()
{   // 小车后退
         motor1.run(BACKWARD);// 电机后退
         motor2.run(BACKWARD);// 电机后退
         motor3.run(BACKWARD);// 电机后退
         motor4.run(BACKWARD);// 电机后退
         Serial.print("car back");

}

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

}

void carTurnR()
{       // 小车右转
         motor1.run(FORWARD);// 电机前进
         motor2.run(FORWARD);// 电机前进
         motor3.run(BACKWARD);// 电机后退
         motor4.run(BACKWARD);// 电机后退
         Serial.print("car turn right");      
}
void carGoL()
{       // 小车左前行
         motor1.run(BACKWARD);// 电机后退
         motor2.run(FORWARD);// 电机后退
         motor3.run(FORWARD);// 电机前进
         motor4.run(FORWARD);// 电机前进
         Serial.print("car go left");      
}
   void carGoR()
{       // 小车右前行
         motor1.run(FORWARD);// 电机前进
         motor2.run(FORWARD);// 电机前进
         motor3.run(FORWARD);// 电机后退
         motor4.run(BACKWARD);// 电机后退
         Serial.print("car go right");      
}
voidcarStop()
{      // 小车制动
         motor1.run(RELEASE);// 电机停步
         motor2.run(RELEASE);// 电机停步
         motor3.run(RELEASE);// 电机停步
         motor4.run(RELEASE);// 电机停步
         Serial.print("car barke");

}
void randTrun()
{
long randNumber;
randomSeed(analogRead(5));
randNumber = random(0, 10);
if(randNumber > 5) {
    carTurnR();
}
else
{
    carTurnL();
}
}

/*******************************   测距模块**************************/
int distance()
{
digitalWrite(TrigPin, LOW);   // 给触发脚低电平2μs
delayMicroseconds(2);
digitalWrite(TrigPin, HIGH);// 给触发脚高电平10μs,这里至少是10μs
delayMicroseconds(20);
digitalWrite(TrigPin, LOW);    // 持续给触发脚低电
float Fdistance = pulseIn(EchoPin, HIGH);// 读取高电平时间(单位:微秒)
Fdistance= Fdistance/58;       //为什么除以58等于厘米,Y米=(X秒*344)/2
// X秒=( 2*Y米)/344 ==》X秒=0.0058*Y米 ==》厘米=微秒/58
return (int)Fdistance;
   Serial.print(Fdistance);
   Serial.println(Fdistance);
}
/*******************************   避障过程**************************/
void autorun()
{
snum=digitalRead(16); //这三个依次为左右红外传感器
snum=digitalRead(17);
mid = distance();
   #ifdef send
    Serial.print("mid=");
    Serial.println(mid);
   #endif

if ((snum==1) && snum==1) //所有传感器都没有检测到障碍物
{
   carGoFwd();//直行
}
if (snum==0 && (snum==1)) //右边传感器检测到障碍物
{
   carStop();
   delay(500);
   carGoBwd();
   delay(200);
   carTurnR();
   delay(1000);
}
if (snum==1 && snum==0)   //左边传感器检测到障碍物
{
   carStop();
   delay(500);
   carGoBwd();
   delay(500);
   carTurnL();//小车向右转
   delay(500);
}
if (mid <=15) //所有传感器都没有检测到障碍物
{
   carStop();
   delay(500);
   carGoBwd();
   delay(500);
   randTrun();
   delay(500);
}
}
void setup()
{   // 初始化串口通信及连接SR04的引脚   
      Serial.begin(9600);
      pinMode(RelayPin,OUTPUT);//定义继电器 RelayPin接口为输出接口      
      pinMode(TrigPin, OUTPUT);//定义SR04 TrigPin接口为输出接口
      pinMode(EchoPin, INPUT);   //定义SR04 EchoPin接口为输入 接口
      pinMode(SensorL,INPUT);    //定义左传感器接口为输入接口
      pinMode(SensorR,INPUT);    //定义右传感器接口为输入接口
      pinMode(Jiguang,OUTPUT);   //定义激光头
      motor1.setSpeed(150);// 设置电机速度,从200/255之间任意
      motor2.setSpeed(150);// 设置电机速度,从200/255之间任意
      motor3.setSpeed(160);// 设置电机速度,从200/255之间任意
      motor4.setSpeed(160);// 设置电机速度,从200/255之间任意
      digitalWrite(RelayPin,HIGH);   
}
void loop()
{
if(Serial.available()>0) //查询串口有无数据
{
      val=Serial.read();//读取labview下达的命令
      if(val=='Q')//发送字符'Q',则小车自动巡行
      {
          autorun();//      
      }
      if(val=='W')//发送字符'W',则小车前进
      {
          carGoFwd();//   
      }
      if(val=='S')//发送字符'S',则小车后退
      {
          carGoBwd();//   
      }
         if(val=='A')//发送字符'A',则小车左转
      {
         carTurnL();//
      }
         if(val=='D')//发送字符'D',则小车右转
      {
         carTurnR();//   
      }
      if(val=='Z')//发送字符'y',则小车停止
      {
         carStop();//
      }
      if(val=='M')//
      {
      {
          digitalWrite(Jiguang,HIGH);
          delay(10000);
          digitalWrite(Jiguang,LOW);   
      }   
      if(val=='N')//
          digitalWrite(RelayPin,LOW);
          delay(10000);
          digitalWrite(RelayPin,HIGH);   
      }   
}

}

页: [1]
查看完整版本: 你们是正常采用什么方式让小车自动避障和无线控制切换,如下代码为什么一直直行呢