超声波运用

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

程序:

/**
 * 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);
}
原文地址:https://www.cnblogs.com/SATinnovation/p/8159447.html