.
MSR Maze Solving Robot – atau robot pemecah labirin adalah gadget kecil cerdas dengan otak silikon yang menemukan jalannya melalui labirin yang berubah-ubah. Ia bersaing dengan anggota spesiesnya yang lain, berlomba secepat mungkin. Di sini MSR adalah perangkat elektro-mekanis, biasanya terdiri dari tiga subsistem utama. Mereka adalah sistem penggerak, serangkaian sensor, dan sistem kontrol.
Sistem penggerak terdiri dari sasis mekanis, satu set motor, roda gigi dan roda. Sasis biasanya dirancang untuk beroperasi seperti kursi roda, dengan dua roda penggerak besar di kedua sisi rangka aluminium ringan. Sasis dibuat untuk menampung motor, sistem roda gigi, baterai, dan sirkuit, dan juga harus cukup kecil untuk bermanuver dalam batasan labirin.
Sistem kendalinya adalah serangkaian papan sirkuit yang berfungsi sebagai otak makhluk tersebut. Sistem kendali menjalankan algoritma pemecahan labirin (LSRB) berdasarkan informasi yang diterima CPU (ARDUINO BOARD) dari sensor.
Subsistem terakhir adalah sensor. Mereka melaporkan ke CPU keadaan lingkungan saat ini di mana dinding dan jalur berada. Ini biasanya berupa sensor inframerah yang menangkap cahaya yang dipantulkan dari trek. Tujuan utamanya adalah mencapai waktu berjalan labirin tercepat dan menemukan tujuannya dengan mudah.
Labirin
Labirin adalah suatu teka-teki wisata yang berupa suatu lintasan percabangan yang kompleks dimana pemecahnya harus menemukan rutenya . Dalam percakapan sehari-hari, baik labirin maupun labirin menunjukkan serangkaian jalur yang kompleks dan membingungkan, namun secara teknis labirin dibedakan dari labirin, karena labirin memiliki satu rute yang dilalui dengan tikungan dan belokan tetapi tanpa cabang, dan tidak dirancang untuk menjadi jalur yang rumit. sulit dinavigasi.
.
.
Algoritma LSRB
Algoritma LSRB ini dapat disederhanakan menjadi kondisi sederhana berikut:
- Jika Anda bisa belok kiri, silakan saja dan belok kiri,
- lain jika Anda dapat terus mengemudi lurus maka mengemudilah lurus,
- lain jika Anda bisa belok kanan maka belok kanan.
- Jika Anda berada di jalan buntu maka berbaliklah.Penghapusan LSRB ditunjukkan di bawah ini:
- L- Kiri
- B- Benar
- S- Lurus
- B- Berbalik (Kembali).
Robot harus mengambil keputusan ini saat berada di persimpangan. Persimpangan adalah titik mana pun di labirin tempat Anda mempunyai kesempatan untuk berbelok. Jika robot mendapat kesempatan untuk berbelok dan tidak berbelok maka dianggap berjalan lurus. Setiap gerakan yang dilakukan di persimpangan atau saat memutar harus disimpan.
.
Pertama kita melihat proses pencarian Algoritma LSRB. diagram adalah contoh pemrosesan LSRB.
.
Diagram pertama menunjukkan titik awal dan keputusan pertama berdasarkan prioritas LSRB sehingga robot memilih sisi kiri. Keputusan kedua Nilai telah disimpan dalam register. Diagram keputusan pertama ditampilkan,
.
Pada diagram kedua dilambangkan setelah pemrosesan keputusan pertama dan keputusan selanjutnya diambil ke sisi belakang karena tidak ada lagi pilihan yang tersedia. Diagram keputusan kedua ditampilkan,
.
Pada diagram Ketiga dilambangkan setelah pemrosesan keputusan kedua dan keputusan berikutnya diambil ke sisi kiri karena tidak ada pilihan lagi yang tersedia dan Nilai keputusan kedua telah disimpan dalam register. Diagram keputusan ketiga ditampilkan,
.
Pada diagram Keempat dilambangkan setelah pemrosesan keputusan ketiga dan keputusan selanjutnya diambil ke sisi kiri karena tidak ada pilihan lagi yang tersedia dan Nilai keputusan keempat telah disimpan dalam register. Diagram keputusan keempat ditampilkan,
.
Pada diagram kelima dilambangkan setelah pemrosesan keputusan keempat dan keputusan selanjutnya diambil ke sisi belakang karena tidak ada lagi pilihan yang tersedia dan nilai keputusan kelima telah disimpan dalam register. Diagram keputusan kelima ditampilkan,
.
Pada diagram keenam dilambangkan setelah pemrosesan keputusan kelima dan keputusan selanjutnya diambil ke sisi lurus karena tidak ada pilihan lagi yang tersedia dan nilai keputusan keenam telah disimpan dalam register. Diagram keputusan keenam ditampilkan,
Pada diagram ketujuh dilambangkan setelah pemrosesan keputusan keenam dan keputusan selanjutnya diambil ke sisi kanan karena tidak ada pilihan lagi yang tersedia dan nilai keputusan ketujuh telah disimpan dalam register. Diagram keputusan ketujuh ditunjukkan di bawah ini, Setelah langkah ketujuh proses pencarian akan selesai dan akhirnya nilai “LBLLBSR” disimpan ke dalam register.
Proses yang kedua adalah proses perjalanan. Proses ini dilakukan robot untuk menuju tujuan tanpa perlu mencari dan menggunakan jalur terpendek.
Perjalanannya menyederhanakan nilai register menggunakan persamaan berikut dan disingkat dan mengikuti nilai register persamaannya ditunjukkan di bawah ini,
LBR = B
LBS = R
RBL = B
SBL = R
SBS = B
LBL = S
Nilai register disingkat dari penggunaan persamaan dan nilai register akhir adalah “SRR”.Diagram ditunjukkan di bawah ini.
.
Coding
Variable Initialisation
.
// IR Sensor #define leftCenterSensor A2 #define leftNearSensor A1 #define leftFarSensor A0 #define rightCenterSensor A3 #define rightNearSensor A4 #define rightFarSensor A5 // IR Sensor readings int leftCenterReading; int leftNearReading; int leftFarReading; int rightCenterReading; int rightNearReading; int rightFarReading; int leftNudge; int replaystage; int rightNudge; // Enable Pins #define enl 9 // LEFT #define enr 10 // RIGHT // speed of motor #define spd 150 #define leapTime 200 // Motors #define leftMotor1 5 #define leftMotor2 2 #define rightMotor1 4 #define rightMotor2 3 //for storing path details char path[30] = {}; int pathLength; int readLength;
.
lingkaran() Fungsi
Fungsi ini berjalan berulang kali, dan periksa sesuai kebutuhan.
.
void loop(){ readSensors(); //if only the middle two sensors can see the black line if(leftFarReading<200 && rightFarReading<200 && (leftCenterReading>200 || rightCenterReading>200)) { straight(); } //otherwise goes to the leftHandWall method else { leftHandWall(); } }
.
Read Sensor Value
.
void readSensors() //accepts input from sensors { leftCenterReading = analogRead(leftCenterSensor); leftNearReading = analogRead(leftNearSensor); leftFarReading = analogRead(leftFarSensor); rightCenterReading = analogRead(rightCenterSensor); rightNearReading = analogRead(rightNearSensor); rightFarReading = analogRead(rightFarSensor); }
.
Left Hand Wall Algorithm(LSRB Algorithm)
.
void leftHandWall(){ if( leftFarReading<200 && rightFarReading<200)//indicates either 3way intersection or end of maze { digitalWrite(leftMotor1, HIGH); digitalWrite(leftMotor2, LOW); digitalWrite(rightMotor1, HIGH); digitalWrite(rightMotor2, LOW); delay(leapTime); readSensors(); if(leftFarReading<200 || rightFarReading<200)//if it moves forward and still sees all black, maze is done { done(); } if(leftFarReading>200 && rightFarReading>200)//otherwise it turns left { turnLeft(); } } if(leftFarReading<200)//indicates that a left turn is possible { digitalWrite(leftMotor1, HIGH); digitalWrite(leftMotor2, LOW); digitalWrite(rightMotor1, HIGH); digitalWrite(rightMotor2, LOW); delay(leapTime); readSensors(); if(leftFarReading>200 && rightFarReading>200)//checks to make sure maze isn't done { turnLeft(); } else { done(); } } if(rightFarReading<200)//indicates a right turn is possible { digitalWrite(leftMotor1, HIGH); digitalWrite(leftMotor2, LOW); digitalWrite(rightMotor1, HIGH); digitalWrite(rightMotor2, LOW); delay(10);//CHANGED FROM 30 to 10 readSensors(); if(leftFarReading<200)//left turn is also possible { delay(leapTime-30); readSensors(); if(rightFarReading<200 && leftFarReading<200)//end of maze { done(); } else//make the left turn { turnLeft(); return; } } delay(leapTime-30); readSensors(); if(leftFarReading>200 && leftCenterReading>200 && rightCenterReading>200 && rightFarReading>200) { turnRight(); return; } path[pathLength] = 'S'; pathLength++; if(path[pathLength-2] == 'B') { shortPath(); } straight(); } readSensors(); if(leftFarReading>200 && leftCenterReading>200 && rightCenterReading>200 && rightFarReading>200 && leftNearReading>200 && rightNearReading>200) { turnAround(); } }
.
Shortest Path
.
void shortPath()
{
int shortDone = 0;
if(path[pathLength-3] == ‘L’ && path[pathLength – 1] == ‘R’)
{
pathLength -= 3;
path[pathLength] = ‘B’;
shortDone = 1;
}
if(path[pathLength-3] == ‘L’ && path[pathLength – 1] == ‘S’ && shortDone == 0)
{
pathLength -= 3;
path[pathLength] = ‘R’;
shortDone = 1;
}
if(path[pathLength-3] == ‘R’ && path[pathLength – 1] == ‘L’ && shortDone == 0)
{
pathLength-=3;
path[pathLength] = ‘B’;
shortDone=1;
}
if(path[pathLength-3] == ‘S’ && path[pathLength – 1] == ‘L’ && shortDone == 0)
{
pathLength -= 3;
path[pathLength] = ‘R’;
shortDone = 1;
}
if(path[pathLength-3] == ‘S’ && path[pathLength – 1] ==’S’ && shortDone == 0)
{
pathLength-=3;
path[pathLength] = ‘B’;
shortDone=1;
}
if(path[pathLength-3] == ‘L’ && path[pathLength – 1] ==’L’ && shortDone == 0)
{
pathLength -= 3;
path[pathLength] = ‘S’;
shortDone = 1;
}
path[pathLength+1] = ‘D’;
path[pathLength+2] = ‘D’;
pathLength++;
}
.
Cuplikan kode di atas, tidak berisi cuplikan untuk turnLeft(), turnRight(), turnAround() dan selesai(). Banyak penundaan yang digunakan tidak standar, perlu dimodifikasi sesuai bot.