arduino kullanarakbir proje yapmak istiyorum ama yazılım konusunda sorun yaşıyorum. yapmak istediğim proje şu şekilde:
bir robot olucak, bu robot üzerinde 3 cm çapında siyah noktalar olan beyaz kare bir alanı (1.5m x 1.5m) sistematik bir şekilde gezecek. (robot süpürge gibi zikzak yaparak) gezerken eğer yerde siyah bir nokta ile karşılaşırsa 1 saniye hareket etmeden bekleyecek, 2 saniye buzzerdan ses çıkartacak ve yoluna/aramaya devam edecek.(toplam 3 saniye duraklamış oldu). ben bu robotun hareket algoritmasını şöyle düşündüm:
ileri gitmeye başla, eğer siyah nokta görürsen 1 sn bekle,2sn buzzer çal ve yoluna devam et, eğer duvarla arandaki mesafe 5 cm den az kaldıysa o zaman duvarı kaçıncı kez gördüğünü kontrol et; eğer bu sayı çift ise olduğun yerde sola dön, 6-7 cm ileri git, tekrar olduğun yerde sola dön. ama eğer duvarla karşılaşma sayı tek ise o zaman olduğun yerde sağa dön, 6-7 cm ileri git, tekrar olduğun yerde sağa dön.(bu algoritma robotun bütün alanı sistematik bir şekilde taramasını sağlayacak) ama bu kod istediğim şeyi yapmıyor.bu kodda şikayetçi olduğum kısım duraksayarak ilerliyor/neredeyse hiç ileri doğru gitmiyor, engelle karşılaşma duvar sayacı gibi kısımlarda sorun yok gibi gözüküyor. benim istediğim şey bu robotun akıcı bir şekilde hareket ederken noktaları sistematik bir şekilde araması. yardım eden olursa sevinirim.
kullandığım malzemeler:
2 adet dc motor
1 adet l298 motor sürücü
1 adet ultrasonik mesafe sensörü (hc-SR04)
3 adet kızıl ötesi sensör ve bu sensörlerin sürücüsü (F233-01, genelde çizgi izleyen robotlarda kullanılanlardan)
1 adet buzzer
ve arduino uno
bir robot olucak, bu robot üzerinde 3 cm çapında siyah noktalar olan beyaz kare bir alanı (1.5m x 1.5m) sistematik bir şekilde gezecek. (robot süpürge gibi zikzak yaparak) gezerken eğer yerde siyah bir nokta ile karşılaşırsa 1 saniye hareket etmeden bekleyecek, 2 saniye buzzerdan ses çıkartacak ve yoluna/aramaya devam edecek.(toplam 3 saniye duraklamış oldu). ben bu robotun hareket algoritmasını şöyle düşündüm:
ileri gitmeye başla, eğer siyah nokta görürsen 1 sn bekle,2sn buzzer çal ve yoluna devam et, eğer duvarla arandaki mesafe 5 cm den az kaldıysa o zaman duvarı kaçıncı kez gördüğünü kontrol et; eğer bu sayı çift ise olduğun yerde sola dön, 6-7 cm ileri git, tekrar olduğun yerde sola dön. ama eğer duvarla karşılaşma sayı tek ise o zaman olduğun yerde sağa dön, 6-7 cm ileri git, tekrar olduğun yerde sağa dön.(bu algoritma robotun bütün alanı sistematik bir şekilde taramasını sağlayacak) ama bu kod istediğim şeyi yapmıyor.bu kodda şikayetçi olduğum kısım duraksayarak ilerliyor/neredeyse hiç ileri doğru gitmiyor, engelle karşılaşma duvar sayacı gibi kısımlarda sorun yok gibi gözüküyor. benim istediğim şey bu robotun akıcı bir şekilde hareket ederken noktaları sistematik bir şekilde araması. yardım eden olursa sevinirim.
kullandığım malzemeler:
2 adet dc motor
1 adet l298 motor sürücü
1 adet ultrasonik mesafe sensörü (hc-SR04)
3 adet kızıl ötesi sensör ve bu sensörlerin sürücüsü (F233-01, genelde çizgi izleyen robotlarda kullanılanlardan)
1 adet buzzer
ve arduino uno
Kod:
int DuvarMesafe = 0;
const int sagMotorileri = 9;
const int sagMotorGeri = 10;
const int MotorEnableSag = 4;
const int solMotorileri = 2;
const int solMotorGeri = 3;
const int MotorEnableSol = 5;
const int infraredSensorPin1 = A0;
const int infraredSensorPin2 = A1;
const int infraredSensorPin3 = A2;
const int triggerPin = 7;
const int echoPin = 8;
const int buzzerPin = 6;
int karsilasmaSayaci = 0; // Duvar ile karşılaşma sayısı
void setup() {
pinMode(sagMotorileri, OUTPUT);
pinMode(sagMotorGeri, OUTPUT);
pinMode(MotorEnableSag, OUTPUT);
pinMode(solMotorileri, OUTPUT);
pinMode(solMotorGeri, OUTPUT);
pinMode(MotorEnableSol, OUTPUT);
pinMode(infraredSensorPin1, INPUT);
pinMode(infraredSensorPin2, INPUT);
pinMode(infraredSensorPin3, INPUT);
pinMode(triggerPin, OUTPUT);
pinMode(echoPin, INPUT);
Serial.begin(9600);
pinMode(buzzerPin, OUTPUT);
}
void loop() {
ileriGit();
DuvarMesafe = MesafeOlc();
if (DuvarMesafe < 5){
karsilasmaSayaci++;
if(karsilasmaSayaci %2 == 1){
sagaDon();
}
else {
solaDon();
}
}
else if (noktaAlgila()){
motorlaridurdur();
delay(1000);
buzz();
}
}
void ileriGit() {
// Motorlar ileri
digitalWrite(sagMotorileri, HIGH);
digitalWrite(sagMotorGeri, LOW);
analogWrite(MotorEnableSag, 255);
digitalWrite(solMotorileri, HIGH);
digitalWrite(solMotorGeri, LOW);
analogWrite(MotorEnableSol, 255);
// İleri giderken mesafe kontrolü ve nokta algılama
while (DuvarMesafe >= 5 && !noktaAlgila()) {
delay(100); // Mesafe ve nokta algılama kontrolünü sık aralıklarla yapmak için
DuvarMesafe = MesafeOlc(); // Mesafe değerini güncelle
}
motorlaridurdur(); // Mesafe veya nokta algılama durumunda durdur
}
void sagaDon() {
// Sağa dön
digitalWrite(sagMotorileri, LOW);
digitalWrite(sagMotorGeri, HIGH);
analogWrite(MotorEnableSag, 255);
digitalWrite(solMotorileri, HIGH);
digitalWrite(solMotorGeri, LOW);
analogWrite(MotorEnableSol, 255);
// Yaklaşık 90 derece dönmesi için gecikme (robot olduğu yerde dönücek)
delay(1000);
motorlaridurdur();
digitalWrite(sagMotorileri, HIGH);
digitalWrite(sagMotorGeri, HIGH);
analogWrite(MotorEnableSag, 255);
digitalWrite(solMotorileri, HIGH);
digitalWrite(solMotorGeri, HIGH);
analogWrite(MotorEnableSol, 255);
delay(700);
motorlaridurdur();
// Sola dön
digitalWrite(sagMotorileri, LOW);
digitalWrite(sagMotorGeri, HIGH);
analogWrite(MotorEnableSag, 255);
digitalWrite(solMotorileri, HIGH);
digitalWrite(solMotorGeri, LOW);
analogWrite(MotorEnableSol, 255);
// Yaklaşık 90 derece dönmesi için gecikme (robot olduğu yerde dönücek)
delay(1000);
motorlaridurdur();
}
void solaDon() {
// Sola dön
digitalWrite(sagMotorileri, HIGH);
digitalWrite(sagMotorGeri, LOW);
analogWrite(MotorEnableSag, 255);
digitalWrite(solMotorileri, LOW);
digitalWrite(solMotorGeri, HIGH);
analogWrite(MotorEnableSol, 255);
// Yaklaşık 90 derece dönmesi için gecikme (robot olduğu yerde dönücek)
delay(1000);
motorlaridurdur();
digitalWrite(sagMotorileri, HIGH); // biraz ,leri gidecek
digitalWrite(sagMotorGeri, HIGH);
analogWrite(MotorEnableSag, 255);
digitalWrite(solMotorileri, HIGH);
digitalWrite(solMotorGeri, HIGH);
analogWrite(MotorEnableSol, 255);
delay(700);
motorlaridurdur();
// Sola dön
digitalWrite(sagMotorileri, HIGH);
digitalWrite(sagMotorGeri, LOW);
analogWrite(MotorEnableSag, 255);
digitalWrite(solMotorileri, LOW);
digitalWrite(solMotorGeri, HIGH);
analogWrite(MotorEnableSol, 255);
// Yaklaşık 90 derece dönmesi için gecikme (robot olduğu yerde dönücek)
delay(1000);
motorlaridurdur();
}
void motorlaridurdur() {
// Motorları durdur
digitalWrite(sagMotorileri, LOW);
digitalWrite(sagMotorGeri, LOW);
digitalWrite(solMotorileri, LOW);
digitalWrite(solMotorGeri, LOW);
}
bool noktaAlgila() {
// Kızılötesi sensörlerle siyah nokta kontrolü
int infraredSensorValue1 = analogRead(infraredSensorPin1);
int infraredSensorValue2 = analogRead(infraredSensorPin2);
int infraredSensorValue3 = analogRead(infraredSensorPin3);
// Eşik değeri sensör davranışlarına göre ayarla
int infraredEsikDegeri = 500;
// En az bir sensör siyah nokta algılarsa true döndür
return (infraredSensorValue1 < infraredEsikDegeri) ||
(infraredSensorValue2 < infraredEsikDegeri) ||
(infraredSensorValue3 < infraredEsikDegeri);
}
void buzz() {
digitalWrite(buzzerPin, HIGH);
delay(2000);
digitalWrite(buzzerPin, LOW);
}
int MesafeOlc() {
// HC-SR04 ile mesafe ölçme
digitalWrite(triggerPin, LOW);
delayMicroseconds(2);
digitalWrite(triggerPin, HIGH);
delayMicroseconds(10);
digitalWrite(triggerPin, LOW);
return pulseIn(echoPin, HIGH) * 0.0343 / 2;
}
Son düzenleme: