|
本帖最后由 song_kai_ming 于 2015-11-16 17:44 编辑
#include <Servo.h>
#include <DistanceSRF04.h>
/*
作者:XXX
时间:2015年10月14日
IDE版本号:1.5.7
作用:超声波测距及避障
*/
int echo = 9; // 定義超音波信號接收腳位
int trig =8; // 定義超音波信號發射腳位
void setup()
{
Serial.begin(9600);
pinMode(echo, INPUT); // 定義超音波輸入腳位
pinMode(trig,OUTPUT); // 定義超音波輸出腳位
attachInterrupt(0, blink, LOW);//当int.0电平改变时,触发中断函数blink
detection();
}
/*马达控制 */
void motor(char pin1,char pin2,char pwmpin,char state,int val)
{
pinMode(pin1, OUTPUT);
pinMode(pin2, OUTPUT);
pinMode(pwmpin, OUTPUT);
if(state==2)
{
analogWrite(pwmpin,val);
digitalWrite(pin1,LOW);
digitalWrite(pin2,HIGH);
}
else if(state==1)
{
analogWrite(pwmpin,val);
digitalWrite(pin1,HIGH);
digitalWrite(pin2,LOW);
}
else if(state==0)
{
analogWrite(pwmpin,0);
digitalWrite(pin1,HIGH);
digitalWrite(pin2,LOW);
}
}
void forward(int i,int k) //前进
{
motor(14,15,3,1,i);
motor(16,17,5,1,k);
}
void back (int j,int e) //后退
{
motor(14,15,3,2,j);
motor(16,17,5,2,e);
}
void turnR(int m,int n) //右转弯转
{
motor(14,15,3,1,m);
motor(16,17,5,2,n);
}
void turnL(int m,int n) //左转弯转
{
motor(14,15,3,2,m);
motor(16,17,5,1,n);
}
void stop() //车身移动停止
{
while(1)
{
motor(14,15,3,0,0);
motor(16,17,5,0,0);
}
}
void stop1() //车身移动停止
{
motor(14,15,3,0,0);
motor(16,17,5,0,0);
}
int sign=0;
void blink()
{
sign=1;
}
//超声波测距
float Fspeedd=6;
void detection()
{
digitalWrite(trig, LOW); // 讓超聲波發射低電壓2μs
delayMicroseconds(2);
digitalWrite(trig, HIGH); // 讓超聲波發射高電壓10μs,這裡至少是10μs
delayMicroseconds(10);
digitalWrite(trig, LOW); // 維持超聲波發射低電壓
float Fdistance = pulseIn(echo, HIGH); // 讀差相差時間
Fdistance= Fdistance/5.8/10; // 將時間轉為距離距离(單位:公分)
// Serial.print("F distance:"); //輸出距離(單位:公分)
// Serial.println(Fdistance); //顯示距離
Fspeedd = Fdistance; // 將距離 讀入Fspeedd(前速)
}
void loop()
{
//检测到中断 就后退
if(sign==1)
{
// Serial.println("地地道道地地道道");
detachInterrupt(0);
servo_Horizontal(30);
servo_Horizontal(90);
back(140,140);
delay(1000);
turnL(140,140);
delay(500);
sign=0;
attachInterrupt(0, blink, LOW);
}
//没中断时,处理障碍情况
detection();
//Serial.println(Fspeedd);
if(Fspeedd > 5)
{
forward(140,140);
}
else
{
servo_Horizontal(30);
servo_Horizontal(90);
back(140,140);
delay(1000);
turnR(140,140);
delay(500);
}
}
|
|