Çizgi Labirenti Çözerek Kısa Yoldan Çıkışı Bulan Robot
Herkese selam arkadaşlar.
Bu sefer Robotun Aklını okuyup size aktarmaya çalıştım. Labirent robotumuz labirenti nasıl çözdüğü sadeleştirmeyi nasıl yaparak çıkışın en kısa yolunu hesapladığını anlatmaya çalıştım. Videomu izleyerek “hmm demek böyle yapıyormuş bende bir şey sanmıştım .” diyeceksiniz. Aslında hayatta her şey öğrenene kadar zor öğrenince ise acayip kolaydır. Birde bugün bir videoda ki sözü paylaşmak istedim.
“Üşenme
Ertleme
Vazgeçme”
Bunları yaparsak yapamayacağımız şey yoktur.
-
Arduino uno
-
QTR çizgi sensörü 6lı yeterli
-
L293d motor sürücü
-
led
-
330 ohm
-
motor
-
gövde
#define sol_orta 3 #define sol_yakin 4 #define sol_uzak 5 #define sag_orta 2 #define sag_yakin 1 #define sag_uzak 0 int oku_sol_orta; int oku_sol_yakin; int oku_sol_uzak; int oku_sag_orta; int oku_sag_yakin; int oku_sag_uzak; int sol_durtmek; int tekrarlama; int sagl_durtmek; #define sicrama_zamani 100 #define leftMotor1 10 #define leftMotor2 7 #define rightMotor1 13 #define rightMotor2 12 #define sag_led 9 #define sol_led 8 #define SolMotorHiz 11 #define SagMotorHiz 5 #define vcc_m 6 int ref = 300; char yol[30] = {}; int yol_uzunlugu; int uzunluk_okumak; void setup() { Serial.begin(9600); pinMode(vcc_m , OUTPUT); pinMode(SolMotorHiz, OUTPUT); pinMode(SagMotorHiz, OUTPUT); pinMode(sol_orta, INPUT); pinMode(sol_yakin, INPUT); pinMode(sol_uzak, INPUT); pinMode(sag_orta, INPUT); pinMode(sag_yakin, INPUT); pinMode(sag_uzak, INPUT); pinMode(sag_led, OUTPUT); pinMode(sol_led, OUTPUT); pinMode(leftMotor1, OUTPUT); pinMode(leftMotor2, OUTPUT); pinMode(rightMotor1, OUTPUT); pinMode(rightMotor2, OUTPUT); digitalWrite(vcc_m , HIGH); for (int a = 0; a < 5; a++) { digitalWrite(sag_led, HIGH); digitalWrite(sol_led, LOW); delay (100); digitalWrite(sol_led, HIGH); digitalWrite(sag_led, LOW); delay (100); } digitalWrite(sag_led, LOW); digitalWrite(sol_led, LOW); analogWrite(SolMotorHiz, 255); analogWrite(SagMotorHiz, 255); delay(1000); } void loop() { sensor_oku(); if (oku_sol_uzak < ref && oku_sag_uzak < ref && (oku_sol_orta > ref || oku_sag_orta > ref) ) // 0.-.2.2.-.0 { duz(); } else { // -.-.-.-.-.- digitalWrite(leftMotor1, LOW); digitalWrite(leftMotor2, LOW); digitalWrite(rightMotor1, LOW); digitalWrite(rightMotor2, LOW); digitalWrite(sag_led, HIGH); digitalWrite(sol_led, HIGH); delay(100); digitalWrite(sag_led, LOW); digitalWrite(sol_led, LOW); delay(100); sol_el_duvar(); } } void sensor_oku() { oku_sol_orta = analogRead(sol_orta); oku_sol_yakin = analogRead(sol_yakin); oku_sol_uzak = analogRead(sol_uzak); oku_sag_orta = analogRead(sag_orta); oku_sag_yakin = analogRead(sag_yakin); oku_sag_uzak = analogRead(sag_uzak); } void sol_el_duvar() { // if ( oku_sol_uzak > ref && oku_sag_uzak > ref) { // 1.-.-.-.-.1 if (oku_sol_uzak > ref && oku_sol_orta > ref && oku_sag_orta > ref && oku_sag_uzak > ref && oku_sol_yakin > ref && oku_sag_yakin > ref) {// 1.1.1.1.1.1 analogWrite(SolMotorHiz, 150); analogWrite(SagMotorHiz, 150); digitalWrite(leftMotor1, HIGH); digitalWrite(leftMotor2, LOW); digitalWrite(rightMotor1, HIGH); digitalWrite(rightMotor2, LOW); delay(sicrama_zamani); sensor_oku(); if (oku_sol_uzak > ref && oku_sag_uzak > ref) { // || && yapıldı // 1.-.-.-.-.1 tamam(); } if (oku_sol_uzak < ref && oku_sag_uzak < ref) { // 0.-.-.-.-.0 sola_don(); } } if (oku_sol_uzak > ref) { // SOLA DÖNEBİLİRSEN SOLA DÖN 1.-.-.-.-.- analogWrite(SolMotorHiz, 150); analogWrite(SagMotorHiz, 150); digitalWrite(leftMotor1, HIGH); digitalWrite(leftMotor2, LOW); digitalWrite(rightMotor1, HIGH); digitalWrite(rightMotor2, LOW); delay(sicrama_zamani); sensor_oku(); if (oku_sol_uzak < ref && oku_sag_uzak < ref) {// 0.-.-.-.-.0 sola_don(); } else { tamam(); } } if (oku_sag_uzak > ref) { // -.-.-.-.-.1 analogWrite(SolMotorHiz, 150); analogWrite(SagMotorHiz, 150); digitalWrite(leftMotor1, HIGH); digitalWrite(leftMotor2, LOW); digitalWrite(rightMotor1, HIGH); digitalWrite(rightMotor2, LOW); delay(sicrama_zamani); sensor_oku(); if (oku_sol_uzak > ref) { // 1.-.-.-.-.- delay(sicrama_zamani - 30); sensor_oku(); if (oku_sag_uzak > ref && oku_sol_uzak > ref) { // 1.-.-.-.-.1 // if (oku_sol_uzak > ref && oku_sol_orta > ref && oku_sag_orta > ref && oku_sag_uzak > ref && oku_sol_yakin > ref && oku_sag_yakin > ref) {// 1.1.1.1.1.1 tamam(); } else { sola_don(); return; } } delay(sicrama_zamani - 30); sensor_oku(); if (oku_sol_uzak < ref && oku_sol_orta < ref && oku_sag_orta < ref && oku_sag_uzak < ref) {// 0.-.0.0.-.0 saga_don(); return; } yol[yol_uzunlugu] = 'S'; yol_uzunlugu++; if (yol[yol_uzunlugu - 2] == 'B') { kisa_yol(); } duz(); } sensor_oku(); if (oku_sol_uzak < ref && oku_sol_orta < ref && oku_sag_orta < ref && oku_sag_uzak < ref && oku_sol_yakin < ref && oku_sag_yakin < ref) {// 0.0.0.0.0.0 arkani_don(); } } void tamam() { digitalWrite(leftMotor1, LOW); digitalWrite(leftMotor2, LOW); digitalWrite(rightMotor1, LOW); digitalWrite(rightMotor2, LOW); tekrarlama = 1; yol[yol_uzunlugu] = 'D'; yol_uzunlugu++; while (analogRead(sol_uzak) > ref) { digitalWrite(sag_led, HIGH); digitalWrite(sol_led, LOW); delay (100); digitalWrite(sag_led, LOW); digitalWrite(sol_led, HIGH); delay (100); Serial.print(oku_sol_orta); oku_sol_orta = analogRead(sol_orta); oku_sol_yakin = analogRead(sol_yakin); oku_sol_uzak = analogRead(sol_uzak); oku_sag_orta = analogRead(sag_orta); oku_sag_yakin = analogRead(sag_yakin); oku_sag_uzak = analogRead(sag_uzak); Serial.print(oku_sol_orta); Serial.print(" "); Serial.print(oku_sol_yakin); Serial.print(" "); Serial.print(oku_sol_uzak); Serial.print(" "); Serial.print(oku_sag_orta); Serial.print(" "); Serial.print(oku_sag_yakin); Serial.print(" "); Serial.println(oku_sag_uzak); } digitalWrite(sag_led, LOW); digitalWrite(sol_led, LOW); delay(2500); replay(); } void sola_don() { analogWrite(SolMotorHiz, 190); analogWrite(SagMotorHiz, 190); while (analogRead(sag_orta) > ref || analogRead(sol_orta) > ref) {// -.-.1.1.-.- 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(sag_orta) < ref) {// -.-.-.0.-.- 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 (tekrarlama == 0) { yol[yol_uzunlugu] = 'L'; yol_uzunlugu++; if (yol[yol_uzunlugu - 2] == 'B') { kisa_yol(); } } } void saga_don() { analogWrite(SolMotorHiz, 190); analogWrite(SagMotorHiz, 190); while (analogRead(sag_orta) > ref) { // -.-.-.1.-.- 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(sag_orta) < ref) { 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(sol_orta) < ref) { 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 (tekrarlama == 0) { yol[yol_uzunlugu] = 'R'; Serial.println("r"); yol_uzunlugu++; Serial.print("yol length: "); Serial.println(yol_uzunlugu); if (yol[yol_uzunlugu - 2] == 'B') { Serial.println("kisa_ening yol"); kisa_yol(); } } } void duz() { if ( analogRead(sol_orta) < ref) { analogWrite(SolMotorHiz, 150); analogWrite(SagMotorHiz, 150); digitalWrite(leftMotor1, HIGH); digitalWrite(leftMotor2, LOW); digitalWrite(rightMotor1, LOW); digitalWrite(rightMotor2, HIGH); // 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(3); return; } if (analogRead(sag_orta) < ref) { analogWrite(SolMotorHiz, 150); analogWrite(SagMotorHiz, 150); digitalWrite(leftMotor1, LOW); digitalWrite(leftMotor2, HIGH); digitalWrite(rightMotor1, HIGH); digitalWrite(rightMotor2, LOW); // 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(3); return; } analogWrite(SolMotorHiz, 160); analogWrite(SagMotorHiz, 160); digitalWrite(leftMotor1, HIGH); digitalWrite(leftMotor2, LOW); digitalWrite(rightMotor1, HIGH); digitalWrite(rightMotor2, LOW); } void arkani_don() { analogWrite(SolMotorHiz, 150); analogWrite(SagMotorHiz, 150); digitalWrite(leftMotor1, HIGH); digitalWrite(leftMotor2, LOW); digitalWrite(rightMotor1, HIGH); digitalWrite(rightMotor2, LOW); delay(50); while (analogRead(sol_orta) < ref) { analogWrite(SolMotorHiz, 150); analogWrite(SagMotorHiz, 150); 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); } yol[yol_uzunlugu] = 'B'; yol_uzunlugu++; duz(); //Serial.println("b"); //Serial.print("yol length: "); //Serial.println(yol_uzunlugu); } void kisa_yol() { int kisa_tamam = 0; if (yol[yol_uzunlugu - 3] == 'L' && yol[yol_uzunlugu - 1] == 'R') { yol_uzunlugu -= 3; yol[yol_uzunlugu] = 'B'; //Serial.println("test1"); kisa_tamam = 1; } if (yol[yol_uzunlugu - 3] == 'L' && yol[yol_uzunlugu - 1] == 'S' && kisa_tamam == 0) { yol_uzunlugu -= 3; yol[yol_uzunlugu] = 'R'; //Serial.println("test2"); kisa_tamam = 1; } if (yol[yol_uzunlugu - 3] == 'R' && yol[yol_uzunlugu - 1] == 'L' && kisa_tamam == 0) { yol_uzunlugu -= 3; yol[yol_uzunlugu] = 'B'; //Serial.println("test3"); kisa_tamam = 1; } if (yol[yol_uzunlugu - 3] == 'S' && yol[yol_uzunlugu - 1] == 'L' && kisa_tamam == 0) { yol_uzunlugu -= 3; yol[yol_uzunlugu] = 'R'; //Serial.println("test4"); kisa_tamam = 1; } if (yol[yol_uzunlugu - 3] == 'S' && yol[yol_uzunlugu - 1] == 'S' && kisa_tamam == 0) { yol_uzunlugu -= 3; yol[yol_uzunlugu] = 'B'; //Serial.println("test5"); kisa_tamam = 1; } if (yol[yol_uzunlugu - 3] == 'L' && yol[yol_uzunlugu - 1] == 'L' && kisa_tamam == 0) { yol_uzunlugu -= 3; yol[yol_uzunlugu] = 'S'; //Serial.println("test6"); kisa_tamam = 1; } yol[yol_uzunlugu + 1] = 'D'; yol[yol_uzunlugu + 2] = 'D'; yol_uzunlugu++; //Serial.print("yol length: "); //Serial.println(yol_uzunlugu); //printyol(); } void printyol() { Serial.println("+++++++++++++++++"); int x; while (x <= yol_uzunlugu) { Serial.println(yol[x]); x++; } Serial.println("+++++++++++++++++"); } void replay() { sensor_oku(); if (oku_sol_uzak < ref && oku_sag_uzak < ref) { duz(); } else { if (yol[uzunluk_okumak] == 'D') { analogWrite(SolMotorHiz, 150); analogWrite(SagMotorHiz, 150); digitalWrite(leftMotor1, HIGH); digitalWrite(leftMotor2, LOW); digitalWrite(rightMotor1, HIGH); digitalWrite(rightMotor2, LOW); delay(50); digitalWrite(leftMotor1, LOW); digitalWrite(leftMotor2, LOW); digitalWrite(rightMotor1, LOW); digitalWrite(rightMotor2, LOW); // tamam();// sürekli döngü devam eder son_hareket(); } if (yol[uzunluk_okumak] == 'L') { analogWrite(SolMotorHiz, 150); analogWrite(SagMotorHiz, 150); digitalWrite(leftMotor1, HIGH); digitalWrite(leftMotor2, LOW); digitalWrite(rightMotor1, HIGH); digitalWrite(rightMotor2, LOW); delay(sicrama_zamani); sola_don(); } if (yol[uzunluk_okumak] == 'R') { analogWrite(SolMotorHiz, 150); analogWrite(SagMotorHiz, 150); digitalWrite(leftMotor1, HIGH); digitalWrite(leftMotor2, LOW); digitalWrite(rightMotor1, HIGH); digitalWrite(rightMotor2, LOW); delay(sicrama_zamani); saga_don(); } if (yol[uzunluk_okumak] == 'S') { analogWrite(SolMotorHiz, 150); analogWrite(SagMotorHiz, 150); digitalWrite(leftMotor1, HIGH); digitalWrite(leftMotor2, LOW); digitalWrite(rightMotor1, HIGH); digitalWrite(rightMotor2, LOW); delay(sicrama_zamani); duz(); } uzunluk_okumak++; } replay(); } void son_hareket() { Serial.print(oku_sol_orta); Serial.print(" "); Serial.print(oku_sol_yakin); Serial.print(" "); Serial.print(oku_sol_uzak); Serial.print(" "); Serial.print(oku_sag_orta); Serial.print(" "); Serial.print(oku_sag_yakin); Serial.print(" "); Serial.println(oku_sag_uzak); digitalWrite(sag_led, HIGH); digitalWrite(sol_led, HIGH); son_hareket(); }
Etiketler: en kısa yoldan çıkışı bulan robot, labirent, labirent çözen robot, yolu hafızaya alan robot
Eklenme Tarihi: 13 Ocak 2019
Bunu ultrasonik sensör ile yapabilirmiyiz peki?
Yapılır ama yazılımı ona göre güncellemek lazım. Motoru değiştirmek te gerekir . Biraz sıkıntılı olur.
Merhaba bu kodu mbot robotumuza da attığımızda çalışır mı?
Yazılıma göre sensörleri bağlarsanız çalışır tabi
Sayin hocam oncelikle anlatiminiz icin tesekkurler belkide ilk bu anlatim Turkiyede..merak ettigim bu yazilim her pistte calisir mi yoksa her pist icin yazilimda kisaltmalari kendimiz mi yazmaliyiz? Diyelim bir yarismadayiz ve pisti bilmiyoruz bu yazilim calisirmi?
elbette çalışır.
Çizgi izleyen labirent çözen robotu yaptım ancak denemelerimde şöyle bir sorun oluştu. Robot herhangi bir kavşağa geldiğinde yolun sonuna geldim sanıyor. Bazen de düz devam ediyor. Tutarsızlıklar neden kaynaklanıyor olabilir
Çalışma videosunu görmeden bir yorum yapamam.
Size nereden video sunu yollayabilirim. Öğretmenim bu arada. TÜBİTAK 4006 için bu projeyi yapmaya çalışıyoruz. Çizgiyi izleme konusunda sıkıntı yok ancak kavşağa geldiğinde yolun sonu sanıyor duruyor ve ışıklar yanıp sönmeye başlıyor. Sıçramayla alakalı olabilir mi
Whatsapp 0553 404 81 14 hocam.