Çizgi Labirenti Çözerek En Kısa Yoldan Bitiş Noktasını Bulan Robot Yapımı
Önceki projelerimizde iki duvarlı labirent platformunda robotun labirentin çıkışını bulmasını yapmıştık. Projeye buradan bakabilirsiniz. Bu projede ise çizgi labirenti çözen robot yapımını anlatacağım. Projenin özetle mantığı şu şekilde; robot başlangıç noktasında başlayarak çizgiyi takip edip bitiş noktasına varacak. Yalnız ilk denemede yanlış yollara sapacağı için varış zamanı daha geç olacaktır. Fakat her yanlış yola saptığında bunları bir algoritma ile saptayacak ve ikinci denemede bu yollara girmeyecek. Kısacası ilk denemede robot gittiği yolu kaydedip en kısa yolu tespit ederek ikinci denemede bu tespit ettiği yoldan giderek en kısa yolu bulmuş olacak.
Malzemeler
-
Arduino
-
QTR-8A Kızılötesi sensör
-
2 Adet DC Motor ve Robot Şasesi veya hazır robot kit alabilirsiniz.
-
L298N veya l293b motor sürücü
-
7.4v Batarya
Genel Tasarımı :
Devre Şeması:
Arduino Kodu:
#define leftCenterSensor 3 #define leftNearSensor 4 #define leftFarSensor 5 #define rightCenterSensor 2 #define rightNearSensor 1 #define rightFarSensor 0 int leftCenterReading; int leftNearReading; int leftFarReading; int rightCenterReading; int rightNearReading; int rightFarReading; int leftNudge; int replaystage; int rightNudge; #define leapTime 400 #define leftMotor1 9 #define leftMotor2 8 #define rightMotor1 6 #define rightMotor2 7 #define led 13 char path[30] = {}; int pathLength; int readLength; void setup(){ pinMode(leftCenterSensor, INPUT); pinMode(leftNearSensor, INPUT); pinMode(leftFarSensor, INPUT); pinMode(rightCenterSensor, INPUT); pinMode(rightNearSensor, INPUT); pinMode(rightFarSensor, INPUT); pinMode(leftMotor1, OUTPUT); pinMode(leftMotor2, OUTPUT); pinMode(rightMotor1, OUTPUT); pinMode(rightMotor2, OUTPUT); pinMode(led, OUTPUT); digitalWrite(led, HIGH); delay(1000); } void loop(){ readSensors(); if(leftFarReading<200 && rightFarReading<200 && (leftCenterReading>200 || rightCenterReading>200) ){ straight(); } else{ leftHandWall(); } } void readSensors(){ leftCenterReading = analogRead(leftCenterSensor); leftNearReading = analogRead(leftNearSensor); leftFarReading = analogRead(leftFarSensor); rightCenterReading = analogRead(rightCenterSensor); rightNearReading = analogRead(rightNearSensor); rightFarReading = analogRead(rightFarSensor); } void leftHandWall(){ if( leftFarReading>200 && rightFarReading>200){ digitalWrite(leftMotor1, HIGH); digitalWrite(leftMotor2, LOW); digitalWrite(rightMotor1, HIGH); digitalWrite(rightMotor2, LOW); delay(leapTime); readSensors(); if(leftFarReading>200 || rightFarReading>200){ done(); } if(leftFarReading<200 && rightFarReading<200){ turnLeft(); } } if(leftFarReading>200){ // if you can turn left then turn left digitalWrite(leftMotor1, HIGH); digitalWrite(leftMotor2, LOW); digitalWrite(rightMotor1, HIGH); digitalWrite(rightMotor2, LOW); delay(leapTime); readSensors(); if(leftFarReading<200 && rightFarReading<200){ turnLeft(); } else{ done(); } } if(rightFarReading>200){ digitalWrite(leftMotor1, HIGH); digitalWrite(leftMotor2, LOW); digitalWrite(rightMotor1, HIGH); digitalWrite(rightMotor2, LOW); delay(30); readSensors(); if(leftFarReading>200){ delay(leapTime-30); readSensors(); if(rightFarReading>200 && leftFarReading>200){ done(); } else{ turnLeft(); return; } } delay(leapTime-30); readSensors(); if(leftFarReading<200 && leftCenterReading<200 && rightCenterReading<200 && rightFarReading<200){ turnRight(); return; } path[pathLength]='S'; // Serial.println("s"); pathLength++; //Serial.print("Path length: "); //Serial.println(pathLength); if(path[pathLength-2]=='B'){ //Serial.println("shortening path"); shortPath(); } straight(); } readSensors(); if(leftFarReading<200 && leftCenterReading<200 && rightCenterReading<200 && rightFarReading<200 && leftNearReading<200 && rightNearReading<200){ turnAround(); } } void done(){ digitalWrite(leftMotor1, LOW); digitalWrite(leftMotor2, LOW); digitalWrite(rightMotor1, LOW); digitalWrite(rightMotor2, LOW); replaystage=1; path[pathLength]='D'; pathLength++; while(analogRead(leftFarSensor)>200){ digitalWrite(led, LOW); delay(150); digitalWrite(led, HIGH); delay(150); } delay(500); replay(); } void turnLeft(){ while(analogRead(rightCenterSensor)>200||analogRead(leftCenterSensor)>200){ digitalWrite(leftMotor1, LOW); digitalWrite(leftMotor2, HIGH); digitalWrite(rightMotor1, HIGH); digitalWrite(rightMotor2, LOW); delay(2); digitalWrite(leftMotor1, LOW); digitalWrite(leftMotor2, LOW); digitalWrite(rightMotor1, LOW); digitalWrite(rightMotor2, LOW); delay(1); } while(analogRead(rightCenterSensor)<200){ digitalWrite(leftMotor1, LOW); digitalWrite(leftMotor2, HIGH); digitalWrite(rightMotor1, HIGH); digitalWrite(rightMotor2, LOW); delay(2); digitalWrite(leftMotor1, LOW); digitalWrite(leftMotor2, LOW); digitalWrite(rightMotor1, LOW); digitalWrite(rightMotor2, LOW); delay(1); } if(replaystage==0){ path[pathLength]='L'; //Serial.println("l"); pathLength++; //Serial.print("Path length: "); //Serial.println(pathLength); if(path[pathLength-2]=='B'){ //Serial.println("shortening path"); shortPath(); } } } void turnRight(){ while(analogRead(rightCenterSensor)>200){ digitalWrite(leftMotor1, HIGH); digitalWrite(leftMotor2, LOW); digitalWrite(rightMotor1, LOW); digitalWrite(rightMotor2, HIGH); delay(2); digitalWrite(leftMotor1, LOW); digitalWrite(leftMotor2, LOW); digitalWrite(rightMotor1, LOW); digitalWrite(rightMotor2, LOW); delay(1); } while(analogRead(rightCenterSensor)<200){ digitalWrite(leftMotor1, HIGH); digitalWrite(leftMotor2, LOW); digitalWrite(rightMotor1, LOW); digitalWrite(rightMotor2, HIGH); delay(2); digitalWrite(leftMotor1, LOW); digitalWrite(leftMotor2, LOW); digitalWrite(rightMotor1, LOW); digitalWrite(rightMotor2, LOW); delay(1); } while(analogRead(leftCenterSensor)<200){ digitalWrite(leftMotor1, HIGH); digitalWrite(leftMotor2, LOW); digitalWrite(rightMotor1, LOW); digitalWrite(rightMotor2, HIGH); delay(2); digitalWrite(leftMotor1, LOW); digitalWrite(leftMotor2, LOW); digitalWrite(rightMotor1, LOW); digitalWrite(rightMotor2, LOW); delay(1); } if(replaystage==0){ path[pathLength]='R'; Serial.println("r"); pathLength++; Serial.print("Path length: "); Serial.println(pathLength); if(path[pathLength-2]=='B'){ Serial.println("shortening path"); shortPath(); } } } void straight(){ if( analogRead(leftCenterSensor)<200){ digitalWrite(leftMotor1, HIGH); digitalWrite(leftMotor2, LOW); digitalWrite(rightMotor1, HIGH); digitalWrite(rightMotor2, LOW); delay(1); digitalWrite(leftMotor1, HIGH); digitalWrite(leftMotor2, LOW); digitalWrite(rightMotor1, LOW); digitalWrite(rightMotor2, LOW); delay(5); return; } if(analogRead(rightCenterSensor)<200){ digitalWrite(leftMotor1, HIGH); digitalWrite(leftMotor2, LOW); digitalWrite(rightMotor1, HIGH); digitalWrite(rightMotor2, LOW); delay(1); digitalWrite(leftMotor1, LOW); digitalWrite(leftMotor2, LOW); digitalWrite(rightMotor1, HIGH); digitalWrite(rightMotor2, LOW); delay(5); return; } digitalWrite(leftMotor1, HIGH); digitalWrite(leftMotor2, LOW); digitalWrite(rightMotor1, HIGH); digitalWrite(rightMotor2, LOW); delay(4); digitalWrite(leftMotor1, LOW); digitalWrite(leftMotor2, LOW); digitalWrite(rightMotor1, LOW); digitalWrite(rightMotor2, LOW); delay(1); } void turnAround(){ digitalWrite(leftMotor1, HIGH); digitalWrite(leftMotor2, LOW); digitalWrite(rightMotor1, HIGH); digitalWrite(rightMotor2, LOW); delay(150); while(analogRead(leftCenterSensor)<200){ digitalWrite(leftMotor1, LOW); digitalWrite(leftMotor2, HIGH); digitalWrite(rightMotor1, HIGH); digitalWrite(rightMotor2, LOW); delay(2); digitalWrite(leftMotor1, LOW); digitalWrite(leftMotor2, LOW); digitalWrite(rightMotor1, LOW); digitalWrite(rightMotor2, LOW); delay(1); } path[pathLength]='B'; pathLength++; straight(); //Serial.println("b"); //Serial.print("Path length: "); //Serial.println(pathLength); } void shortPath(){ int shortDone=0; if(path[pathLength-3]=='L' && path[pathLength-1]=='R'){ pathLength-=3; path[pathLength]='B'; //Serial.println("test1"); shortDone=1; } if(path[pathLength-3]=='L' && path[pathLength-1]=='S' && shortDone==0){ pathLength-=3; path[pathLength]='R'; //Serial.println("test2"); shortDone=1; } if(path[pathLength-3]=='R' && path[pathLength-1]=='L' && shortDone==0){ pathLength-=3; path[pathLength]='B'; //Serial.println("test3"); shortDone=1; } if(path[pathLength-3]=='S' && path[pathLength-1]=='L' && shortDone==0){ pathLength-=3; path[pathLength]='R'; //Serial.println("test4"); shortDone=1; } if(path[pathLength-3]=='S' && path[pathLength-1]=='S' && shortDone==0){ pathLength-=3; path[pathLength]='B'; //Serial.println("test5"); shortDone=1; } if(path[pathLength-3]=='L' && path[pathLength-1]=='L' && shortDone==0){ pathLength-=3; path[pathLength]='S'; //Serial.println("test6"); shortDone=1; } path[pathLength+1]='D'; path[pathLength+2]='D'; pathLength++; //Serial.print("Path length: "); //Serial.println(pathLength); //printPath(); } void printPath(){ Serial.println("+++++++++++++++++"); int x; while(x<=pathLength){ Serial.println(path[x]); x++; } Serial.println("+++++++++++++++++"); } void replay(){ readSensors(); if(leftFarReading<200 && rightFarReading<200){ straight(); } else{ if(path[readLength]=='D'){ digitalWrite(leftMotor1, HIGH); digitalWrite(leftMotor2, LOW); digitalWrite(rightMotor1, HIGH); digitalWrite(rightMotor2, LOW); delay(100); digitalWrite(leftMotor1, LOW); digitalWrite(leftMotor2, LOW); digitalWrite(rightMotor1, LOW); digitalWrite(rightMotor2, LOW); endMotion(); } if(path[readLength]=='L'){ digitalWrite(leftMotor1, HIGH); digitalWrite(leftMotor2, LOW); digitalWrite(rightMotor1, HIGH); digitalWrite(rightMotor2, LOW); delay(leapTime); turnLeft(); } if(path[readLength]=='R'){ digitalWrite(leftMotor1, HIGH); digitalWrite(leftMotor2, LOW); digitalWrite(rightMotor1, HIGH); digitalWrite(rightMotor2, LOW); delay(leapTime); turnRight(); } if(path[readLength]=='S'){ digitalWrite(leftMotor1, HIGH); digitalWrite(leftMotor2, LOW); digitalWrite(rightMotor1, HIGH); digitalWrite(rightMotor2, LOW); delay(leapTime); straight(); } readLength++; } replay(); } void endMotion(){ digitalWrite(led, LOW); delay(500); digitalWrite(led, HIGH); delay(200); digitalWrite(led, LOW); delay(200); digitalWrite(led, HIGH); delay(500); endMotion(); }
l293b mi l293d motor sürücü mü kullandınız? Devrede L293D yazıyor siz L293B yazmışsınız.
yaptıgınız proje için sizi tebrik ederim ;
fakat aynı projeyide sizin dökümanlarınızla aynısını yapmama rağmen çalışmadı, motorlar 1 saniyeliğine ileri gidip duruyor ve başka işlem yapmıyor ? sizde aynı problemleri yaşadınız mı?
Hocam bu kod c ile mi c++ ile mi yazilmis
Algoritması da paylaşılsa çok iyi olurdu. . .
l298n kartında bağlantılar nasıl yapılacak görsel paylaşabilir misiniz? şimdiden teşekkürler
Ayrıca bu projedeki çizgi labirentin dışında farklı bir labirent kullanan var mı ? Varsa proje başarılı bir şekilde çalıştı mı?
merhabalar.
Bu projede kullanılan araç 2 motorlu. Acaba 4 motorlu bir araç kullanırsak kodda herhangi bir değişiklik yapmamıza gerek var mı? Varsa eğer açıklayabilirmisiniz.
Bağlantıları sekildeki gibi yaptım ve çalıştırdım. Ancak motorlar iki üç tur atıp durdular. Malzemeler orijinal ve sıfır. Kod hatasız derlendi ve arduinoya yüklendi. Hatayı bulamadım. Yardımcı olabilir misiniz?
Dc motor yerine Redüktörlü Dc motor kullandım yazılım ve kullanım açısından bir sorun olurmu ? kolay gelsin.
Evet aynı problemi ben de yaşadım. Herhalde kod çalışmıyor.
projeyi yapabilen varmı şema ve kodlar çalışıyormu yeniyim yardım edermisiniz?
Hocam merhabalar
bu projeyi pic 16f877a ile yapmak istiyorum kodları konusunda bana yardımcı olabilir misiniz?
pardonbirinemibaktin@gmail.com
çizgi yerine duvar izletebilirmiyiz algoritnasını nasıl ayarlayabilirim yardımcı olurmusunuz
projeyi yapabildin mi? yaptıysan bana ulaşabilir misin?
pardonbirinemibaktin@gmail.com
iyi çalışmalar, bağlantıları şemadaki gibi yaptım. Farklı sürücüler ve farklı çizgi sensörleri ile de denedim. fakat robotum parkura koyunca önce kendi etrafında sola doğru dönüyor ve parkur dışına doğru bir yere çarpana kadar düz gidiyor. Nerede hata yapıyorum teşekkürler.
rubik küp çözen bir robot yapabilirmisiniz?
merhaba. tesekkurler. kodu calistirdim. semadaki gibi baglanti yaptim. pololu QTR anolog bagladim- A.0.A1.A2:A.3.A.4:A.5. motorda. sizin dediginiz. gibi. arduino.una. bagladim. L293. motor suru. calisiyor.
kod arduino . yukledim. arduino uzerindeki. led yanip sönuyor. ne yapmam. gerekli. bu robotu. sizin.sayenide. calistirmak.mumkunse. dige robotlariniz. senin yarimiyla. calistirdim.allah. sizden razi olsun.sizden. tek istedigim. bu cizgi robotu. calistirmak. motor. sole bagladin. pin ardu-7-8-9-10.
umarim. cevap verirsiniz. cok sevinirim. cok hosuma. giti. elin koluna saglik. isvecten selamlar. bir istegin. olursa cekilme.bahaddin ates
Bağlantıları doğru yaptıysanız bir parkur kurun videodaki gibi. başlangıç noktasından robotu konumlandırarak çalıştırın. bitiş noktasına vardığında tekrar başlangıç noktasına koyun ve en kısa yoldan bitiş noktasına ulaştığını göreceksiniz.
Merhaba devreyi şekildeki gibi kurup calistirdim. Ancak motorlar iki üç tur atıp durdular. Malzemeler orijinal ve sıfır. Kod hatasız derlendi ve aduinoya yüklendi. Hatayı bulamadim. Yardımcı olabilir misiniz?
Merhaba bende aynı sorunu yașıyorum acaba sorunu çözdünüzmü
Çözdüyseniz yardımcı olurmusunuz
merhaba bu yaptiginiz Robotun Labirenti Çözme
bunun kodu hata veriyor. hosuma. giti. sizin sayenizde. yapmak. mumkunse.
hersey.icin tesekkurler. umarim. cevap verirsiniz. cep. telefonuz. varsa-
allah isinizi. rast getirsin. sizin sayenizde. cok seyler ograndim. ve tercube sahibi. oldum. sag olun
kod hatasız derleniyor. eksik kopyalama veya pc nin donanımından kaynaklanabilir.hatayı yazın yardımcı olayım.
Merhaba maze solving robot.laminat.kod.hataveriyor.sizin,sayenizde.apmak.isterdim.tesekkurleall aha.emanet olun. Sizinsayenizde.cokseylerögrendim.sagolun.allahaemanetolun
merhaba. elin koluna saglik. kod. icin hata veriyor. bu konudan. sizden. yardim. istiyorum.tesekkurler. allah. isinizi. rast. getirsin.
isvecten selamlar. bahaddin ates
sag olun tesekkurler. hersey. icin iyi calismalar dilerim. size
merhaba. yanlis anlama olmasin. bu dedigim. robot?
Çizgi Labirenti Çözerek En Kısa Yoldan Bitiş Noktasını Bulan .
kod degerlendim. calisiyor
http://www.robimek.com/cizgi-labirenti-cozerek-en-kisa-yoldan-bitis-noktasini-bulan-robot-yapimi/_bunu sizin sayenizde. calistirmak
Çizgi Labirenti Çözerek En Kısa Yoldan Bitiş Noktasını Bulan .
calistirdim. sizin sayenizde. islerinizden. basarilar. dilerim. allaha. emanet olun.
sezgin bey bu robotu çalıştırabilsiniz mi ben daha önce nano ile denedim olmadı