虚幻五秒 发表于 2019-5-5 20:05:41

为什么switch语句中的超声波避障只执行一次就停止了

#include "SR04.h"//超声波头文件
#include <Servo.h>//舵机头文件
#define TRIG_PIN A5//超声波触发引脚
#define ECHO_PIN A4//超声波接收引脚
int Front_Distance = 0;//储存前面距离变量
int Left_Distance = 0;//储存左面距离变量
int Right_Distance = 0;//储存右面距离变量
Servo myservo;//创建舵机对象
int pos = 0;    //储存舵机角度的变量
int left_motor_en = 5;//左电机使能
int right_motor_en = 6;//右电机使能

int left_motor_go = 3;//左电机正传
int right_motor_go = 4;//右电机正传

int left_motor_back = 2;//左电机反转
int right_motor_back = 7;//右电机反转

SR04 sr04 = SR04(ECHO_PIN,TRIG_PIN);
long a;//存储超声波距离值变量
#include <IRremote.h>
int RECV_PIN = A1;   //红外线接收器OUTPUT端接在A1
IRrecv irrecv(RECV_PIN);   // 定义IRrecv 对象来接收红外线信号
decode_results results;   //解码结果放在decode_results构造的对象results里


void setup() {
//电机驱动引脚全部设置为输出模式
pinMode(left_motor_en,OUTPUT);
pinMode(right_motor_en,OUTPUT);
pinMode(left_motor_go,OUTPUT);
pinMode(right_motor_go,OUTPUT);
pinMode(left_motor_back,OUTPUT);
pinMode(right_motor_back,OUTPUT);
myservo.attach(9);// 设置舵机控制脚为数字9脚
//控制车速
analogWrite(left_motor_en,130);//左电机占空比值 取值范围0-255,255最快
analogWrite(right_motor_en,130);//右电机占空比值取值范围0-255 ,255最快
irrecv.enableIRIn();          //启动红外解码
}

//小车前进
void forward()
{
   digitalWrite(left_motor_go,HIGH);//左电机前进
   digitalWrite(left_motor_back,LOW);
   digitalWrite(right_motor_go,HIGH);//右电机前进
   digitalWrite(right_motor_back,LOW);
}
//小车后退
void backward()
{
   digitalWrite(left_motor_go,LOW);//左电机反转
   digitalWrite(left_motor_back,HIGH);
   digitalWrite(right_motor_go,LOW);//右电机反转
   digitalWrite(right_motor_back,HIGH);
}
//小车单轮左转
void left()
{
   digitalWrite(left_motor_go,LOW);//左电机停止
   digitalWrite(left_motor_back,LOW);
   digitalWrite(right_motor_go,HIGH);//右电机前进
   digitalWrite(right_motor_back,LOW);
}

//小车单轮右转
void right()
{
   digitalWrite(left_motor_go,HIGH);//左电机前进
   digitalWrite(left_motor_back,LOW);
   digitalWrite(right_motor_go,LOW);//右电机停止
   digitalWrite(right_motor_back,LOW);   
}
//停车

void stop_car()
{
   digitalWrite(left_motor_go,LOW);//左电机停止
   digitalWrite(left_motor_back,LOW);
   digitalWrite(right_motor_go,LOW);//右电机停止
   digitalWrite(right_motor_back,LOW);
}

//小车原地左转
void left_rapidly()
{
   digitalWrite(left_motor_go,LOW);//左电机反转
   digitalWrite(left_motor_back,HIGH);
   digitalWrite(right_motor_go,HIGH);//右电机正转
   digitalWrite(right_motor_back,LOW);
}
//小车原地右转
void right_rapidly()
{
   digitalWrite(left_motor_go,HIGH);//左电机正转
   digitalWrite(left_motor_back,LOW);
   digitalWrite(right_motor_go,LOW);//右电机反转
   digitalWrite(right_motor_back,HIGH);
}

void front_detection()//测量小车前方距离
{
myservo.write(90);//舵机旋转90处于小车正前方
delay(65);//等待舵机到达指定角度
Front_Distance = sr04.Distance();//读取超声波距离
}
void left_detection()//测量小车左面距离
{
myservo.write(180);//舵机旋转180处于小车左面
delay(300);//等待舵机到达指定角度
Left_Distance = sr04.Distance();//读取超声波距离
}
void right_detection()//测量小车右面距离
{
myservo.write(0);//舵机旋转0处于小车右面
delay(300);//等待舵机到达指定角度
Right_Distance = sr04.Distance();//读取超声波距离
}


void zhengchang()
{
    front_detection();//测量小车前方距离
   if(Front_Distance < 35)//当前方厘米处出现障碍物时
   {
      stop_car(); delay(100);
      backward(); delay(300);//先停车再后退一段距离
      stop_car(); delay(100);//再次停车,扫描找出可行驶的空旷路线
      left_detection();//测量左侧是否有障碍物
      right_detection();//测量右侧是否有障碍物
      if(Left_Distance < 35 && Right_Distance < 35)
      {
          left_rapidly();//
          delay(600);//实现掉头
      }
      else if(Left_Distance > Right_Distance)//左边比右边空旷
      {
            left(); delay(500);//左转
            stop_car(); delay(100);//停车稳定方向
          }
          else//否则,右边比左边空旷
          {
             right(); delay(500);//右转
             stop_car(); delay(100);//停车稳定方向
            }
    }
    else//前方无障碍物则前进
    {
      forward();//前进
      }
}

void moshushou(){
   a=sr04.Distance();//读取超声波距离
if(a > 20)//设置避障距离(单位厘米)
{
    forward();//当手掌距离超声波大于20cm时执行前进
}
else
{
    backward(); //否则执行后退
}
   delay(65);//间隔65毫秒刷新一次
}


void loop() {

if (irrecv.decode(&results)) {
switch(results.value){                     //判定按下的是哪个按键
      case 0xFF18E7: zhengchang();   break;//数字“2”键,超声波避障
      case 0xFF4AB5: backward();    break;//数字“8”键,后退
      case 0xFF10EF: left();      break;//数字“4”键,左转
      case 0xFF5AA5:right();       break;//数字“6”键,右转
      case 0xFF38C7: stop_car();    break;//数字“5”键,停车
}
   irrecv.resume();
}


}
页: [1]
查看完整版本: 为什么switch语句中的超声波避障只执行一次就停止了