超声波运用
超声波原理,百度上可以查到,该案例暂时只是测量出距离,将运用到机器人绕过障碍物算法中。
程序:
/** * 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); }
以雷霆击碎黑暗