• برچسب ها: آردوینو | ساخت ربات
  • 0.0/5 rating (0 votes)
  • دوشنبه, 02 شهریور 1394

 در این قسمت آموزش گام به گام یک ردیاب زیردریایی یا همان سونار گذاشته شده است. همراه ما باشید.

سونار (Sonar) در اصل مخفف SOund Navigation And Ranging دستگاه ردیاب زیردریایی است که طرز کار آن استفاده از انتشار امواج صوتی است و در واقع تکنولوژي است که با استفاده از انتشار صدا در زیر آب قادر به شناسایی دیگر ناوها و کشتی هاست .

سونار فعال شامل گیرنده و فرستنده بوده و بر اساس قواعد پژواک صوتی کار می‌کند. در این حالت سامانه اقدام به ارسال پیک‌هایی منظم و پی‌در‌پی می‌کند و سپس پیک‌های پژواکی را دریافت نموده با توجه به زاویه و زمان تاخیر بین ارسال پیک و دریافت پژواک آن هدف را شناسایی می کند.

 

قطعات مورد نیاز

آردوینو pro mini × 1  
سنسور التراسونیک SR04 × 1  
اسپیکر کوچک × 1  
LED × 1  
مقاومت 470 اهم × 1  
پین هدر نری × 1  
پین هدر مادگی × 1  
جا باتری قلمی دوتایی × 2  
موتور دی سی × 2  
جعبه دنده × 2  
چرخ سازگار با موتور دی سی × 4  
باتری قلمی × 4  
آی سی درایور موتور L293D × 1  
سوکت آی سی 16 پین × 1  
سوویچ × 1  
یک جعبه پلاستیکی برای بدنه ربات × 1  

 

سیم بندی و اتصالات

یک جعبه پلاستیکی متناسب با سایز جعبه دنده ها پیدا کرده و جعبه دنده ها را که از قبل به موتور ها و چرخ ها متصل کرده اید به دو طرف و زیر جعبه بچسبانید.

 

 

سپس مطابق با شکل فوق اتصالات بین اجزا را به دقت برقرار کنید. برای مشاهده عکس با کیفیت بهتر می توانید آن را از لینک زیر دریافت نمایید.

برنامه نویسی آردوینو

پس از اینکه از یرقراری صحیح اتصالات و سیم بندی اطمینان حاصل کردید می توانید کد زیر را در یک اسکچ جدید کپی کرده و آن را کامپایل نمایید و پس از آن بر روی آردوینوی خود آپلود کنید.

 


//pin numbers
const byte pinMotor1=4, pinMotor2=5, pinMotor3=6, pinMotor4=7;
const byte pinLed=8, pinTone=10, pinSonar1=11, pinSonar2=12;
//sound freq
const int toneFreq = 800;
//sonar distances
const byte minDistance = 45, maxDistance = 1000;
//motor states
const byte M_STOP = 0, M_GO = 1, M_BACK = 2, M_RIGHT = 3, M_LEFT = 4, M_RIGHT2X = 5, M_LEFT2X = 6;
//robot states
const byte R_START = 0, R_DRIVE = 1, R_BLOCK = 2, R_TURN = 3;
//detect hangover
const int hangoverWait = 5000;
//block detect go back
const int backDist = 1000, turnDist = 300;
//random behaviour
const int randomChance = 300, randomStopWait = 10000, randomTurnWait = 200;
byte state = R_START;
int i, counter = 0;
int dist;
void setup() {
randomSeed(analogRead(1));
//init motor pins
pinMode(pinMotor1, OUTPUT);
pinMode(pinMotor2, OUTPUT);
pinMode(pinMotor3, OUTPUT);
pinMode(pinMotor4, OUTPUT);
pinMode(pinSonar1, OUTPUT);
pinMode(pinSonar2, INPUT);
//init LED pin
pinMode(pinLed, OUTPUT);
}
void loop() {
switch (state){
case R_START:
Motor(M_GO);
Melody();
state = R_DRIVE;
break;
case R_DRIVE:
dist = Pingu();
if (dist < minDistance){
Motor(M_STOP);
state = R_BLOCK;
}
else if (random(0, randomChance) == 5) {
RandomTone();
Motor(M_STOP);
delay(randomStopWait);
Motor(random(M_BACK, M_LEFT2X+1));
delay(randomTurnWait);
Motor(M_GO);
}
break;
case R_BLOCK:
Beep();
Motor(M_BACK);
delay(backDist);
Motor(random(M_RIGHT2X, M_LEFT2X+1));
delay(turnDist);
state = R_TURN;
break;
case R_TURN:
dist = Pingu();
if (dist >= maxDistance){
Motor(M_STOP);
Motor(M_GO);
Beep();
state = R_DRIVE;
}
else{
counter +=1;
if (counter >= hangoverWait){
counter = 0;
Motor(M_STOP);
RandomTone();
state = R_BLOCK;
}
}
break;
}
}
void Blink(byte state){
digitalWrite(pinLed, state);
}
void Beep(){
Blink(1);
SpeakTone(2);
SpeakTone(1);
Blink(0);
}
void Melody(){
Blink(1);
for (int i=1; i<10; i++){
SpeakTone(i);
}
Blink(0);
}
void RandomTone(){
Blink(1);
for (int i=1; i<10; i++){
SpeakTone(random(1, 10));
}
Blink(0);
}
void SpeakTone(byte note){
tone(pinTone, toneFreq * note);
delay(100);
noTone(pinTone);
}
void Motor(byte state){
byte m1, m2, m3, m4;
switch (state){
case M_STOP:
m1 = m2 = m3 = m4 = LOW;
break;
case M_GO:
m1=HIGH;
m2=LOW;
m3=HIGH;
m4=LOW;
break;
case M_BACK:
m1=LOW;
m2=HIGH;
m3=LOW;
m4=HIGH;
break;
case M_RIGHT:
m1=HIGH;
m2=LOW;
m3=LOW;
m4=LOW;
break;
case M_LEFT:
m1=LOW;
m2=LOW;
m3=HIGH;
m4=LOW;
break;
case M_RIGHT2X:
m1=HIGH;
m2=LOW;
m3=LOW;
m4=HIGH;
break;
case M_LEFT2X:
m1=LOW;
m2=HIGH;
m3=HIGH;
m4=LOW;
break;
}
digitalWrite(pinMotor1, m1);
digitalWrite(pinMotor2, m2);
digitalWrite(pinMotor3, m3);
digitalWrite(pinMotor4, m4);
}
int Pingu(){
digitalWrite(pinSonar1, LOW);
delayMicroseconds(5);
digitalWrite(pinSonar1, HIGH);
delayMicroseconds(5);
digitalWrite(pinSonar1, LOW);
delayMicroseconds(2);
long duration = pulseIn(pinSonar2, HIGH);
return (duration / 29 /2);
}
 

نوشته شده توسط
افزودن نظر
  • هیچ نظری یافت نشد