zoukankan      html  css  js  c++  java
  • 超声波运用

    超声波原理,百度上可以查到,该案例暂时只是测量出距离,将运用到机器人绕过障碍物算法中。

    程序:

    /**
     * author wjf
     * date 2017/12/30 14:23
     * 电机驱动
     * 红外接收
     * 舵机(辉盛MG 946R)
     * LCD
     *
     */
    
    ////////////////引入头文件//////////////////////////////////////////////////
    //通用字符串库
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    //LCD库
    #include <LiquidCrystal_I2C.h> //LCD
    #include <Wire.h>
    #include <LCD.h>
    
    //红外库
    #include <IRremote.h>
    
    //舵机库
    #include <Servo.h>
    
    //////////////////定义变量////////////////////////////////
    /**
     * 定义LCD对象,
     * 第一个参数0x20需要先扫描I2C地址扫描代码地址:
     * http://www.cnblogs.com/SATinnovation/p/8047240.html
     * 后面的暂时不知道什么意思,可以这么直接用
     */
    LiquidCrystal_I2C lcd(0x20, 2, 1, 0, 4, 5, 6, 7);
    
    ///////////////定义电机驱动变量/////////////////////////////
    //电机针脚PIN
    const int IN1 = 5;
    const int IN2 = 4;
    const int ENA = 6;
    const int IN3 = 8;
    const int IN4 = 7;
    const int ENB = 9;
    //电机速度
    int speed = 100;
    
    //////////////定义红外接收变量//////////////////////////////
    int RECV_PIN = 3;//红外使用针脚
    IRrecv irrecv(RECV_PIN);//定义接收对象
    decode_results results;//暂存结果的变量
    long control[7][3] = {//遥控器矫正数字
      {16580863, 16613503, 16597183},
      {16589023, 16621663, 16605343},
      {16584943, 16617583, 16601263},
      {16593103, 16625743, 16609423},
      {16582903, 16615543, 16599223},
      {16591063, 16623703, 16607383},
      {16586983, 16619623, 16603303}
    };
    
    ///////////////定义电机方法////////////////////////////
    void initMotor() {
      pinMode(IN1, OUTPUT);
      pinMode(IN2, OUTPUT);
      pinMode(ENA, OUTPUT);
    
      pinMode(IN4, OUTPUT);
      pinMode(IN3, OUTPUT);
      pinMode(ENB, OUTPUT);
    }
    //////////////////定义红外接收方法/////////////////////////////////////
    void initIR() {
      irrecv.enableIRIn();
    }
    
    //////////////////////定义LCD方法/////////////////////////////////////
    void initLCD() {
      lcd.begin (16, 2); // for 16 x 2 LCD module
      lcd.setBacklightPin(3, POSITIVE);
      lcd.setBacklight(HIGH);
    }
    void setLCD(char *str) { //设置LCD显示的字符串
      lcd.home (); // set cursor to 0,0
      lcd.print(str);
      lcd.setCursor (0, 1); // go to start of 2nd line
      //lcd.print(millis());
      //delay(1000);
      lcd.setBacklight(LOW); // Backlight off delay(250);
      lcd.setBacklight(HIGH); // Backlight on delay(1000);
    }
    
    ///////////////定义舵机////////////////////////////////////////////////
    Servo myservo;//定义舵机对象
    const int steeringPin = 12;//定义舵机针脚
    int steeringAngle = 90;//舵机的初始角度
    //定义居中
    void steeringCenter() {
      if (steeringAngle == 90) {
        for (steeringAngle = 90; steeringAngle > 30; steeringAngle -= 1)
        {
          myservo.write(steeringAngle);
          delay(15);
        }
      }else if(steeringAngle == -30){
        for (steeringAngle = -30; steeringAngle < 30; steeringAngle += 1)
        {
          myservo.write(steeringAngle);
          delay(15);
        }
      }
    }
    //右转
    void steeringRight() {
      for (steeringAngle = 30; steeringAngle > -30; steeringAngle -= 1)
      {
        myservo.write(steeringAngle);
        delay(15);
      }
    }
    //左转
    void steeringLeft() {
      for (steeringAngle = 30; steeringAngle < 90; steeringAngle += 1)
      {
        myservo.write(steeringAngle);
        delay(15);
      }
    }
    //初始化舵机
    void initSteeringDirection() {
      myservo.attach(steeringPin);//初始化针脚
      //myservo.write(90);//初始化舵机方位
      myservo.writeMicroseconds(1500);
    }
    ////////////////定义超声波//////////////////////////////////////////////
    const int trigPin = 11;//触发针脚
    const int echoPin = 10;//回声针脚
    float distance;//存放距离
    //初始化超声波针脚
    void initUltrasonic(){
        pinMode(trigPin, OUTPUT);
        pinMode(echoPin, INPUT);
    }
    //获取距离
    void getDistance(){
        // 产生一个10us的高脉冲去触发trigPin
        digitalWrite(trigPin, LOW);
        delayMicroseconds(2);
        digitalWrite(trigPin, HIGH);
        delayMicroseconds(10);
        digitalWrite(trigPin, LOW);
        // 检测脉冲宽度,并计算出距离
        distance = pulseIn(echoPin, HIGH) / 58.00;
        Serial.print(distance);
        Serial.print("cm");
    }
    
    /////////////////初始化入口///////////////////////////////////////////////////
    void setup() {
      //初始化串口监视器
      Serial.begin(9600);
      //初始电机
      initMotor();
      //初始化红外接收
      initIR();
      //初始化LCD
      initLCD();
      setLCD("Hello world");
      //初始化舵机
      //initSteeringDirection();
    }
    
    void loop() {
      if (irrecv.decode(&results)) //如果接收到有红外发射器发送过来的数据
      {
        Serial.println(results.value, HEX);//以16进制换行输出接收代码
    
        if (results.value == 4294967295) {//红外长按得时候获取固定值
    
        } else {
          if (results.value == control[0][0]) {
            Motor1_Brake();//停止电机1
            Motor2_Brake();//停止电机2
            Motor1_Backward(speed);//电机反转,PWM调速
          } else if (results.value == control[0][1]) {//
            Motor1_Backward(speed);//电机反转,PWM调速
            Motor2_Backward(speed);//电机反转,PWM调速
          } else if (results.value == control[0][2]) {
            Motor1_Brake();//停止电机1
            Motor2_Brake();//停止电机2
            Motor2_Backward(speed);//电机反转,PWM调速
          } else if (results.value == control[1][0]) {//
            steeringLeft();//舵机左转
          } else if (results.value == control[1][1]) {//
            Motor1_Brake();//停止电机1
            Motor2_Brake();//停止电机2
          } else if (results.value == control[1][2]) {//
            steeringRight();
          } else if (results.value == control[2][0]) {
            Motor1_Brake();//停止电机1
            Motor2_Brake();//停止电机2
            Motor1_Forward(speed);//电机正转,PWM调速
          } else if (results.value == control[2][1]) {//
            Motor1_Forward(speed);//电机正转,PWM调速
            Motor2_Forward(speed);//电机正转,PWM调速
          } else if (results.value == control[2][2]) {
            Motor1_Brake();//停止电机1
            Motor2_Brake();//停止电机2
            Motor2_Forward(speed);//电机正转,PWM调速
          } else if (results.value == control[3][0]) {//0
            getDistance();//获取超声波测得的距离
          } else if (results.value == control[3][1]) {
    
          } else if (results.value == control[3][2]) {//st
    
          } else if (results.value == control[4][0]) {//1
    
          } else if (results.value == control[4][1]) {//2
    
          } else if (results.value == control[4][2]) {//3
    
          } else if (results.value == control[5][0]) {//4
    
          } else if (results.value == control[5][1]) {//5
    
          } else if (results.value == control[5][2]) {//6
    
          } else if (results.value == control[6][0]) {//7
    
          } else if (results.value == control[6][1]) {//8
    
          } else if (results.value == control[6][2]) {//9
    
          }
        }
        irrecv.resume(); // 接收下一个值
      }
      delay(100);
    }
    
    void Motor1_Forward(int Speed) //电机1正转,Speed值越大,电机转动越快
    {
      digitalWrite(IN1, HIGH);
      digitalWrite(IN2, LOW);
      analogWrite(ENA, Speed);
    }
    
    void Motor1_Backward(int Speed) //电机1反转,Speed值越大,电机转动越快
    {
      digitalWrite(IN1, LOW);
      digitalWrite(IN2, HIGH);
      analogWrite(ENA, Speed);
    }
    void Motor1_Brake()              //电机1刹车
    {
      digitalWrite(IN1, LOW);
      digitalWrite(IN2, LOW);
    }
    void Motor2_Forward(int Speed) //电机2正转,Speed值越大,电机转动越快
    {
      digitalWrite(IN3, HIGH);
      digitalWrite(IN4, LOW);
      analogWrite(ENB, Speed);
    }
    
    void Motor2_Backward(int Speed) //电机2反转,Speed值越大,电机转动越快
    {
      digitalWrite(IN3, LOW);
      digitalWrite(IN4, HIGH);
      analogWrite(ENB, Speed);
    }
    void Motor2_Brake()
    {
      digitalWrite(IN3, LOW);
      digitalWrite(IN4, LOW);
    }
  • 相关阅读:
    Cheatsheet: 2013 12.01 ~ 12.16
    Cheatsheet: 2013 11.12 ~ 11.30
    Cheatsheet: 2013 11.01 ~ 11.11
    Cheatsheet: 2013 10.24 ~ 10.31
    Cheatsheet: 2013 10.09 ~ 10.23
    Cheatsheet: 2013 10.01 ~ 10.08
    Cheatsheet: 2013 09.22 ~ 09.30
    Cheatsheet: 2013 09.10 ~ 09.21
    Cheatsheet: 2013 09.01 ~ 09.09
    Cheatsheet: 2013 08.20 ~ 08.31
  • 原文地址:https://www.cnblogs.com/SATinnovation/p/8159447.html
Copyright © 2011-2022 走看看