自動避障小車

這裏寫圖片描述

#include <Servo.h>//include Servo library
Servo panMotor;
int left1=4;
int left2=5;
int right1=6;
int right2=7;
const int TrigPin = 2;
const int EchoPin = 3; 
float cm;
float cm_1;
float cm_2;
int ledLeftpin=9;
int ledRightpin=10;
//
int photocellPin = 1;    //定義變量photocellsh=2,爲電壓讀取端口。
int ledPin = 12;   //定義變量ledPin=12,爲led電平輸出端口
int val = 0;       //定義val變量的起始值
//
int servopin = 8;    //定義舵機接口數字接口7

void servopulse(int angle)//定義一個脈衝函數
{
  int pulsewidth=(angle*11)+500;  //將角度轉化爲500-2480的脈寬值
  digitalWrite(servopin,HIGH);    //將舵機接口電平至高
  delayMicroseconds(pulsewidth);  //延時脈寬值的微秒數
  digitalWrite(servopin,LOW);     //將舵機接口電平至低
  delayMicroseconds(20000-pulsewidth);
}
void setup(){
 Serial.begin(9600);
  pinMode(ledPin, OUTPUT);  //使ledPin爲輸出模式
pinMode(TrigPin, OUTPUT);
pinMode(EchoPin, INPUT); 
pinMode(ledLeftpin,OUTPUT);
pinMode(ledRightpin,OUTPUT);
panMotor.attach(8); //將電機安裝在適當管腳上
panMotor.write(90); //將PING)))焊盤設爲中央
for (int pinindex = 4; pinindex <=7; pinindex++) {
    pinMode(pinindex, OUTPUT); // set pins 3 to 10 as outputs
}

}
void loop()
{
cm=ping();
Serial.print(cm);
Serial.print("cm");
Serial.println();


val = analogRead(photocellPin);    //從傳感器讀取值
  if(val<=512){      //512=2.5V,想讓傳感器敏感一些的時候,把數值調高,想讓傳感器遲鈍的時候把數值調低。
    digitalWrite(ledPin, HIGH); //當val小於512(2.5V)的時候,led亮。
  }
  else{
    digitalWrite(ledPin, LOW);
  }


if(cm<=50.0)
{
  digitalWrite(left1,LOW);
  digitalWrite(left2, LOW);
  digitalWrite(right1, LOW);
  digitalWrite(right2, LOW);           //stop
delay(1000);
panMotor.write(0);
delay(500);
cm_1=ping();
delay(500);
panMotor.write(180);
delay(700);
cm_2=ping();
delay(500);
panMotor.write(90); //回到中央
delay(1000);
delay(500);
if(cm_1<=20.0&&cm_2<=20.0)             //backward
{
   digitalWrite(ledLeftpin,HIGH);
  digitalWrite(ledRightpin,HIGH);
   digitalWrite(left1, HIGH);
  digitalWrite(left2, LOW);
  digitalWrite(right1, HIGH);
  digitalWrite(right2, LOW);
  delay(2000);
  digitalWrite(ledLeftpin,LOW);
  digitalWrite(ledRightpin,LOW);

}
else
{
  if(cm_1>cm_2){
   digitalWrite(ledRightpin,HIGH);
  digitalWrite(left1,HIGH);
  digitalWrite(left2, LOW);
  digitalWrite(right1, LOW);
  digitalWrite(right2, HIGH);
  delay(2000);
  digitalWrite(ledRightpin,LOW);

  }
  else
  {
    digitalWrite(ledLeftpin,HIGH);
    digitalWrite(left1,LOW);
  digitalWrite(left2, HIGH);
  digitalWrite(right1, HIGH);
  digitalWrite(right2, LOW);
  delay(2000);
   digitalWrite(ledLeftpin,LOW);
  }
}
}
else
{
   digitalWrite(left1, LOW);
  digitalWrite(left2, HIGH);
  digitalWrite(right1, LOW);
  digitalWrite(right2, HIGH);
}



} 
float ping()
{
  float c;
digitalWrite(TrigPin, LOW); //低高低電平發一個短時間脈衝去TrigPin
delayMicroseconds(2);
digitalWrite(TrigPin, HIGH);
delayMicroseconds(10);
digitalWrite(TrigPin, LOW);

c = pulseIn(EchoPin, HIGH) / 58.0; //將回波時間換算成cm
c = (int(c * 100.0)) / 100.0; //保留兩位小數
return c;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章