Sunday, July 13, 2014

[Finished] SumoBot

SumoBot adalah jenis robot yang sering dipertandingkan pada perlombaan robot di Indonesia selain Line Follower Robot. Pertandingan untuk SumoBot dibuat seperti pada pertandingan sumo, yaitu 2 robot diadu dalam 1 arena berbentuk lingkaran. Kedua robot ini harus bisa bertahan dan saling menyerang. Robot yang duluan keluar arena dinyatakan kalah. Simple, kan?

Untuk tugas rancang matkul Microcontroller Design and Application(Lab), kelompok saya membuat SumoBot ini. Hasilnya seperti ini: 




Spesifikasi robot:
-Ultrasonic ranging HC-SR04
-Infrared sensors
-ATMega8535
-L298N Dual H-Bridge Motor Driver
-2x 9V Battery
-Optional: LCD HD44780
-2x Built-in Motor DC and Gearbox + wheel
-Chassis Arkrilik
-1x extra wheel untuk penyeimbang

SumoBot didesain untuk bertahan dan menyerang. Setiap robot mendeteksi tepian arena, robot akan mundur dan berputar ke kiri. Saat sensor ultrasonic mendeteksi objek(musuh) dalam jarak kurang dari 20 cm, maka robot akan bergerak lurus ke arah objek tersebut. Arena SumoBot bisa berwarna hitam dengan garis tepian berwarna putih, atau sebaliknya. Jadi pembacaan infrared sensor disesuaikan dengan warna arenanya.

Blok Diagram:


Flowchart:

Pada robot ini PWM dihasilkan melalui timer 2(8 bit). Tidak diterapkan algoritma PID, karena tidak begitu dibutuhkan. Coding dilakukan menggunakan AVR Studio. Berikut ini cuplikan codingannya:

Arah motor:
void goForward(){
PORTD |= (1<<3)|(0<<2)|(1<<1)|(0<<0);//maju
}

void goBackward(){
PORTD |= (0<<3)|(1<<2)|(0<<1)|(1<<0);//mundur
}

void goRight(){
PORTD |= (0<<3)|(1<<2)|(1<<1)|(0<<0);//kanan
}

void goLeft(){
PORTD |= (1<<3)|(0<<2)|(0<<1)|(1<<0);//kiri
}

void goStop(){
OCR2 = 0x00; //PWM 0%
}

void resetPinD()
{
DDRD = 0xFF;
PORTD = 0x00;
}

Codingan ini bisa di-variasi-kan tergantung dari bagaimana pin-pin dari ATMega8535 dihubungkan ke modul L298N. Setiap akan berubah kondisi, L298N harus di-reset, jika tidak maka akan stall.

Menggunakan sensor ultrasonic HC-SR04:
uint16_t getRange(){
count = 0;
sensorPort = 0xFF; //Triggering HC-SR04
_delay_us(10);
sensorPort = 0x00;
while(1)
      {
         if(!(sensorPin & (1<<echoPin))){ //jika pc1 == 0, lanjut loop
continue;
}else{ 
break; //jika pc == 1 , keluar
 }
    }

while(1){
count++;

if(!(sensorPin & (1<<echoPin))){ //jika pc1 == 0, keluar
 break;
}else{ 
 continue; //jika pc == 1 , lanjut loop, ngitung...
 }
}

return count/17; //count/17 = akurat di jarak 20 cm.(sebelumnya count/34 akurat dijarak 10 cm)
}

Codingan ini saya buat dengan metode trial and error. Saya mengukur menggunakan penggaris sambil mencocokan hasil pembacaan sensor ultrasonic. Jika mengikuti user manual dari sensor ini, harusnya tidak seperti ini bentuk codingannya, tapi saya coba tidak bisa. Makanya, saya buat codingannya seperti ini. Jika kalian menggunakan sensor ultrasonic PING))) dari Parallax, codingannya tidak seperti ini, lebih mudah karena sudah ada library-nya.

---------- Semoga Bermanfaat ----------

No comments:

Post a Comment