和前一篇的差別就是將紅外線拆除,裝上了超聲波模組HC-SR01,
這看起來挺像瓦力的,兩個眼睛。
模式就是前進後,前方距離只有20CM時停止0.25秒,然後轉向,再前進。
程式如下 :
const int trigPin=11;
const int echoPin=12;
unsigned long data;
const byte IN1 = 10;
const byte IN2 = 9;
const byte IN3 = 8;
const byte IN4 = 7;
unsigned long ping(){
digitalWrite(trigPin,HIGH);
delayMicroseconds(5);
digitalWrite(trigPin,LOW);
return pulseIn(echoPin,HIGH);
//超聲波函式。
}
byte dir = 0;
void setup() {
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
pinMode(IN3, OUTPUT);
pinMode(IN4, OUTPUT);
pinMode(trigPin,OUTPUT);
pinMode(echoPin,INPUT);
Serial.begin(9600);
}
void forward()
{
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
digitalWrite(IN3, HIGH);
digitalWrite(IN4, LOW);
}
void backward()
{
digitalWrite(IN1, LOW);
digitalWrite(IN2, HIGH);
digitalWrite(IN3, LOW);
digitalWrite(IN4, HIGH);
}
void turnLeft()
{
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW);
digitalWrite(IN4, LOW);
}
void turnRight()
{
digitalWrite(IN1, LOW);
digitalWrite(IN2, LOW);
digitalWrite(IN3, HIGH);
digitalWrite(IN4, LOW);
}
void stop()
{
digitalWrite(IN1, LOW);
digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW);
digitalWrite(IN4, LOW);
}
void loop() {
data=ping()/58;
int A=abs(data);
//A就是距離,單位公分。
if (A>20) {
if (dir != 0) { // 如果目前的行進狀態不是「前進」
dir = 0; // 設定成「前進」
stop(); // 暫停馬達0.25秒
delay(250);
}
forward(); // 前進
} else {
if (dir != 1) { // 如果目前的狀態不是「右轉」
dir = 1; // 設定成「右轉」
stop(); // 暫停馬達0.25秒
delay(250);
}
turnRight(); // 向右轉
}
//上面這一坨是抄書本的,比較穩定。
delay(500);
}
沒有留言:
張貼留言