极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 18790|回复: 0

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

[复制链接]
发表于 2019-5-5 20:05:41 | 显示全部楼层 |阅读模式
#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();
}


}
回复

使用道具 举报

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

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

Archiver|联系我们|极客工坊

GMT+8, 2024-4-19 20:41 , Processed in 0.042539 second(s), 18 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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