03.最近物體追蹤器

#include <Wire.h>

#include <LiquidCrystal_I2C.h>

#include <Servo.h>

#define Trig 4        

#define Echo 5     

LiquidCrystal_I2C lcd(0x3F,16,2);

float   Temp=30  ; 

Servo myservo;

int  angle_1 , angle_2;

float dist ,dist_1, dist_2 , dist_3,dist_4,dist_5;

float check(){

 digitalWrite(Trig, LOW);

delayMicroseconds(2);

digitalWrite(Trig, HIGH); 

delayMicroseconds(10);

digitalWrite(Trig, LOW);

double  t = pulseIn(Echo, HIGH,50000);

 dist = (331+0.6*Temp)*t/20000 ; 

if(dist<=3){

  dist=3.00;

}else if(dist>200){

  dist=200.00;

}

if(dist>3&&dist<500){

lcd.setCursor(0,0);

lcd.print(dist);

lcd.print("cm");

lcd.print("         ");

}else{

lcd.setCursor(0,0);

lcd.print("Out of Range...");

return dist; }

void search_aim(){

dist_1=199.00;

for(int i=0 ; i<180 ; i=i+5){

myservo.write(i);

do{

check();

delay(20);

}while(dist<4.00);

if(dist>199.00){

  dist=200.00;

}

if(dist<dist_1){

  dist_2 = dist;

  dist_1=dist;

  angle_2=i;

}

delay(10);  

}

dist_1=199.00;

for(int i=180 ; i>0 ; i=i-5){

myservo.write(i);

do{

check();

delay(10);

}while(dist<4.00);

if(dist>199.00){

  dist=200.00;

}

if(dist<dist_1){

  dist_2 = dist;

  dist_1=dist;

  angle_2=i;

}

delay(10);  

}

lcd.setCursor(0,1);

lcd.print("ang=");

lcd.print(angle_2);

lcd.print(" dis=");

lcd.print(dist_2);  

}

 

void setup() {

  Serial.begin(9600);                                                   

  lcd.init();                     

  lcd.backlight(); 

  pinMode(Trig, OUTPUT);

  myservo.attach(8);

  search_aim();

}

void loop() {

myservo.write(angle_2);

}




第二版

#include <Wire.h>

#include <LiquidCrystal_I2C.h>

#include <Servo.h>

#define Trig 4        

#define Echo 5     

LiquidCrystal_I2C lcd(0x3F,16,2);

float   Temp=30  ; 

Servo myservo;

int  angle_1 , angle_2, angle_3, angle_4,angle_new,angle_old,x=10,old;

float dist ,dist_1, dist_2 , dist_3,dist_4,dist_old,dist_new;

float track1,track2,track3,track4,track_old;

unsigned long t1,t2;

long t=20;

float measure(){

digitalWrite(Trig, LOW);

delayMicroseconds(2);

digitalWrite(Trig, HIGH); 

delayMicroseconds(10);

digitalWrite(Trig, LOW);

double  t = pulseIn(Echo, HIGH,20000);

 dist = (331+0.6*Temp)*t/20000 ; 

if(dist<=3){

  dist=3.00;

}else if(dist>200){

  dist=200.00;

}

if(dist>3&&dist<500){

lcd.setCursor(0,0);

lcd.print(dist);

lcd.print("cm");

lcd.print("         ");

}else{

lcd.setCursor(0,0);

lcd.print("Out of Range...");

return dist; }

void search_aim(int mini , int maxi , int interval){

dist_1=199.00;

for(int i=mini ; i<maxi ; i=i+interval){

myservo.write(i);

do{delay(t);measure();}while(dist<4.00);

if(dist>199.00){dist=200.00;}

if(dist<dist_1){

  dist_2 = dist;

  dist_1=dist;

  angle_2=i;

}}

/////////////////////////////////

dist_1=199.00;

for(int i=maxi ; i>mini ; i=i-interval){

myservo.write(i);

do{delay(t);measure();}while(dist<4.00);

if(dist>199.00){dist=200.00;}

if(dist<dist_1){

  dist_3 = dist;

  dist_1=dist;

  angle_3=i;

}}

}

/////////////////////////////////////

void to_precise(int y,int d){

if(angle_3>=angle_2){

 if(angle_2-y<=0){angle_2=0; }else{angle_2=angle_2-y;}

 if(angle_3+y>=180){angle_3=180; }else{angle_3=angle_3+y;}

 search_aim(angle_2,angle_3,d); 

}else{

 if(angle_3-y<=0){angle_3=0; }else{angle_3=angle_3-y;}

 if(angle_2+y>=180){angle_2=180; }else{angle_2=angle_2+y;} 

 search_aim(angle_3,angle_2,d); 

}}

void get_data(){

angle_4=(angle_2+angle_3)/2;

dist_4=(dist_2+dist_3)/2.00;

myservo.write(angle_4); 

lcd.setCursor(0,1);

lcd.print("ang=");

lcd.print(angle_4);

lcd.print(" dis=");

lcd.print(dist_4);  

}

////////////////////////////////////

void searching(){

 search_aim(0 , 180 , 10);

 to_precise(5,10); 

 to_precise(3,5); 

 to_precise(2,3);

 to_precise(1,2);

 get_data(); 

 }

  

////////////////////////////////////

void track(){

for(int i=16 ; i>0 ; i=i-5){

 to_precise(i,i);

 get_data();  

}

}

 

void setup() {

  Serial.begin(9600);                                                   

  lcd.init();                     

  lcd.backlight(); 

  pinMode(Trig, OUTPUT);

  myservo.attach(8);

  searching();

}

void loop() {

}

超音波感測器

Trig = 9

Echo = 8

Servo伺服馬達

pin 4