Joystick sering digunakan dalam banyak penerapan. Digunakan untuk bermain game, menggerakkan robot, menggerakan camera, mengendalikan mainan RC dan sebagainya.
Video tutorial ini menjelaskan secara detil mengenai Joystick KY-023, sebuah joystick sederhana yang sangat bermanfaat untuk kebutuhkan apapun dan bagaimana kita bisa menggunakannya dengan micro controller papan Arduino.
Video ini memiliki dua bagian. Bagian pertama menjelaskan secara detil mengenai fitur-fitur joystick KY-023 dan bagaimana kita bisa menggunakannya dengan micro controller papan Arduino.
Bagian kedua menjelaskan mengenai bagaimana kita bisa bermain game pada layar LCD 20×4 I2C dengan menggunakan joystick KY-023.
Dalam game ini, kita menjadi seorang manusia yang berusaha menangkap hantu. Manusia bergerak berdasarkan pergerakkan joystick. Hantu bergerak secara acak. Hantu tertangkap apabila posisi kolom dan barisnya sama dengan posisi kolom dan baris manusia.
Bagian 1 – Kode program Joystick KY023
// Protus Tanuhandaru // www.progresstech.co.id int pos_x; // Variabel untuk menyimpan nilai pergerakan sumbu X int pos_y; // Variabel untuk menyimpan nilai pergerakan sumbu Y int SW_PIN; // Variabel untuk menyimpan nilai digital tombol void setup() { pinMode(2, INPUT_PULLUP); // PIN 2 merupakan input dan mengaktifkan resistor pull-up digitalWrite(2, HIGH); // Memberikan nilai default HIGH pada PIN 2 Serial.begin(9600); // Mengatur baud rate kecepatan komunikasi data } void loop() { pos_x = analogRead(A0); // Membaca nilai sumbu X [0...1023] pos_y = analogRead(A1); // Membaca nilai sumbu Y [0...1023] SW_PIN = digitalRead(2); // Membaca apakah tombol ditekan (0 atau 1) Serial.print("X = "); Serial.print(pos_x, DEC); Serial.print(" | Y = "); Serial.print(pos_y); Serial.print(" | Button = "); Serial.println(SW_PIN); delay(100); }
Bagian 2 – Game Tangkap Hantu LCD20x4 I2C dan Joystick KY 023
// Protus Tanuhandaru // www.progresstech.co.id #include <LiquidCrystal_I2C.h> // Memanggil library LCD I2C LiquidCrystal_I2C lcd(0x27, 20, 4); // // Mengatur alamat I2C dan ukuran LCD // Membuat karakter orang berjalan byte customOrangBerjalan0[8] = { 0b01110, 0b01110, 0b00100, 0b00111, 0b01100, 0b10110, 0b00101, 0b11001 }; // Membuat karakter orang berjalan byte customOrangBerjalan1[8] = { 0b01110, 0b01110, 0b00100, 0b10100, 0b01110, 0b00101, 0b01010, 0b10001 }; // Membuat karakter hantu byte customHantu[8] = { 0b00100, 0b01110, 0b11111, 0b10101, 0b01110, 0b01110, 0b11111, 0b11111 }; // Variabel boolean untuk menentukan kapan animasi orang berubah bool bergerak = false; // Bagian Joystick int pos_x; // Variabel untuk menyimpan nilai pergerakan sumbu X int pos_y; // Variabel untuk menyimpan nilai pergerakan sumbu Y int SW_PIN; // Variabel untuk menyimpan nilai digital tombol //Bagian LCD int pos_kolom_orang; int pos_baris_orang; int pos_kolom_hantu; int pos_baris_hantu; void setup() { //Bagian Joystick pinMode(2, INPUT_PULLUP); // PIN 2 merupakan input dan mengaktifkan resistor pull-up digitalWrite(2, HIGH); // Memberikan nilai default HIGH pada PIN 2 //Bagian Setup lcd.begin(); lcd.backlight(); lcd.createChar(0, customOrangBerjalan0); // Membuat karakter baru orang berlari lcd.createChar(1, customOrangBerjalan1); // Membuat karakter baru orang berlari lcd.createChar(2, customHantu); // Membuat karakter hantu lcd.setCursor(4, 1); // Menempatkan kursor pada kolom 4 dan baris 1 lcd.print("PROGRESSTECH"); // Menulis konten pada LCD lcd.setCursor(1, 2); // Menempatkan kursor pada kolom 1 dan baris 2 lcd.print("Protus Tanuhandaru"); // Menulis konten pada LCD delay(4000); // Memberikan delay 4 detik lcd.clear(); // Menghapus konten LCD lcd.setCursor(4, 1); // Menempatkan kursor pada kolom 4 dan baris 1 lcd.print("Tangkap Hantu"); // Menulis konten pada LCD delay(4000); // Memberikan delay 4 detik lcd.clear(); // Menghapus konten LCD pos_kolom_orang = 9; // Menentukan posisi kolom awal orang pos_baris_orang = 2; // Menentukan posisi baris awal orang pos_kolom_hantu = 6; // Menentukan posisi kolom awal hantu pos_baris_hantu = 1; // Menentukan posisi baris awal hantu lcd.setCursor(pos_kolom_orang, pos_baris_orang); // Menempatkan kursor pada kolom awal dan baris awal orang lcd.setCursor(pos_kolom_hantu, pos_baris_hantu); // Menempatkan kursor pada kolom awal dan baris awal hantu lcd.write((byte)0); lcd.write((byte)3); Serial.begin(9600); // Mengatur baud rate kecepatan komunikasi data } void location(int x, int y, int button) { // Geser ke atas if((y>900)&&(x<900)&&(x>100)) { if(pos_baris_orang == 0) { } else { pos_baris_orang = pos_baris_orang - 1; } } // Geser ke bawah if((y<100)&&(x<900)&&(x>100)) { if(pos_baris_orang == 3) { } else { pos_baris_orang = pos_baris_orang + 1; } } // Geser ke kiri dan ke atas if((x<100)&&(y>900)) { if(pos_kolom_orang == 0) { } else { pos_kolom_orang = pos_kolom_orang - 1; } if(pos_baris_orang == 0) { } else { pos_baris_orang = pos_baris_orang - 1; } } // Geser ke kiri dan ke bawah if((x<100)&&(y<100)) { if(pos_kolom_orang == 0) { } else { pos_kolom_orang = pos_kolom_orang - 1; } if(pos_baris_orang == 3) { } else { pos_baris_orang = pos_baris_orang + 1; } } // Geser ke kanan dan ke atas if((x>900)&&(y>900)) { if(pos_kolom_orang == 19) { } else { pos_kolom_orang = pos_kolom_orang + 1; } if(pos_baris_orang == 0) { } else { pos_baris_orang = pos_baris_orang - 1; } } // Geser ke kanan dan ke bawah if((x>900)&&(y<100)) { if(pos_kolom_orang == 19) { } else { pos_kolom_orang = pos_kolom_orang + 1; } if(pos_baris_orang == 3) { } else { pos_baris_orang = pos_baris_orang + 1; } } // Geser ke kanan if((x>900)&&(y<900)&&(y>100)) { if(pos_kolom_orang == 19) { } else { pos_kolom_orang = pos_kolom_orang + 1; } } // Geser ke kiri if((x<100)&&(y<900)&&(y>100)) { if(pos_kolom_orang == 0) { } else { pos_kolom_orang = pos_kolom_orang - 1; } } lcd.clear(); // Menghapus konten LCD lcd.setCursor(pos_kolom_orang, pos_baris_orang); //Menempatkan kursor orang pada baris dan kolom baru // Mengatur perubahan gambar animasi orang if(bergerak == false) { lcd.write((byte)0); bergerak = true; } else { lcd.write((byte)1); bergerak = false; } // Hantu bergerak secara acak if(pos_kolom_hantu == 0) { pos_kolom_hantu = pos_kolom_hantu + 1; } else if (pos_kolom_hantu == 19){ pos_kolom_hantu = pos_kolom_hantu - 1; } else { pos_kolom_hantu = pos_kolom_hantu + random(-1,2); } if(pos_baris_hantu == 0) { pos_baris_hantu = pos_baris_hantu + 1; } else if (pos_baris_hantu == 3){ pos_baris_hantu = pos_baris_hantu - 1; } else { pos_baris_hantu = pos_baris_hantu + random(-1,2); } // Menempatkan kursor gambar hantu pada kolom dan baris yang baru lcd.setCursor(pos_kolom_hantu,pos_baris_hantu); lcd.write((byte)2); // Menggambar hantu pada LCD // Jika posisi kolom dan baris orang dan hantu sama, maka hantunya tertangkap if(pos_kolom_orang == pos_kolom_hantu) { if(pos_baris_orang == pos_baris_hantu) { lcd.clear(); lcd.setCursor(5, 1); lcd.print("Kena loe!"); delay(500); } } // Jika tombol joystick ditekan, maka LCD menampilkan konten if(SW_PIN == 0) { lcd.setCursor(0, 0); lcd.print("Tangkap hantunya"); } } void loop() { pos_x = analogRead(A0); // Membaca nilai sumbu X [0...1023] pos_y = analogRead(A1); // Membaca nilai sumbu Y [0...1023] SW_PIN = digitalRead(2); // Membaca apakah tombol ditekan (0 atau 1) Serial.print("X = "); Serial.print(pos_x, DEC); Serial.print(" | Y = "); Serial.print(pos_y, DEC); Serial.print(" | Button = "); Serial.println(SW_PIN, DEC); location(pos_x, pos_y, SW_PIN); // Memanggil fungsi location delay(500); } // Protus Tanuhandaru // www.progresstech.co.id #include <LiquidCrystal_I2C.h> // Memanggil library LCD I2C LiquidCrystal_I2C lcd(0x27, 20, 4); // // Mengatur alamat I2C dan ukuran LCD // Membuat karakter orang berjalan byte customOrangBerjalan0[8] = { 0b01110, 0b01110, 0b00100, 0b00111, 0b01100, 0b10110, 0b00101, 0b11001 }; // Membuat karakter orang berjalan byte customOrangBerjalan1[8] = { 0b01110, 0b01110, 0b00100, 0b10100, 0b01110, 0b00101, 0b01010, 0b10001 }; // Membuat karakter hantu byte customHantu[8] = { 0b00100, 0b01110, 0b11111, 0b10101, 0b01110, 0b01110, 0b11111, 0b11111 }; // Variabel boolean untuk menentukan kapan animasi orang berubah bool bergerak = false; // Bagian Joystick int pos_x; // Variabel untuk menyimpan nilai pergerakan sumbu X int pos_y; // Variabel untuk menyimpan nilai pergerakan sumbu Y int SW_PIN; // Variabel untuk menyimpan nilai digital tombol //Bagian LCD int pos_kolom_orang; int pos_baris_orang; int pos_kolom_hantu; int pos_baris_hantu; void setup() { //Bagian Joystick pinMode(2, INPUT_PULLUP); // PIN 2 merupakan input dan mengaktifkan resistor pull-up digitalWrite(2, HIGH); // Memberikan nilai default HIGH pada PIN 2 //Bagian Setup lcd.begin(); lcd.backlight(); lcd.createChar(0, customOrangBerjalan0); // Membuat karakter baru orang berlari lcd.createChar(1, customOrangBerjalan1); // Membuat karakter baru orang berlari lcd.createChar(2, customHantu); // Membuat karakter hantu lcd.setCursor(4, 1); // Menempatkan kursor pada kolom 4 dan baris 1 lcd.print("PROGRESSTECH"); // Menulis konten pada LCD lcd.setCursor(1, 2); // Menempatkan kursor pada kolom 1 dan baris 2 lcd.print("Protus Tanuhandaru"); // Menulis konten pada LCD delay(4000); // Memberikan delay 4 detik lcd.clear(); // Menghapus konten LCD lcd.setCursor(4, 1); // Menempatkan kursor pada kolom 4 dan baris 1 lcd.print("Tangkap Hantu"); // Menulis konten pada LCD delay(4000); // Memberikan delay 4 detik lcd.clear(); // Menghapus konten LCD pos_kolom_orang = 9; // Menentukan posisi kolom awal orang pos_baris_orang = 2; // Menentukan posisi baris awal orang pos_kolom_hantu = 6; // Menentukan posisi kolom awal hantu pos_baris_hantu = 1; // Menentukan posisi baris awal hantu lcd.setCursor(pos_kolom_orang, pos_baris_orang); // Menempatkan kursor pada kolom awal dan baris awal orang lcd.setCursor(pos_kolom_hantu, pos_baris_hantu); // Menempatkan kursor pada kolom awal dan baris awal hantu lcd.write((byte)0); lcd.write((byte)3); Serial.begin(9600); // Mengatur baud rate kecepatan komunikasi data } void location(int x, int y, int button) { // Geser ke atas if((y>900)&&(x<900)&&(x>100)) { if(pos_baris_orang == 0) { } else { pos_baris_orang = pos_baris_orang - 1; } } // Geser ke bawah if((y<100)&&(x<900)&&(x>100)) { if(pos_baris_orang == 3) { } else { pos_baris_orang = pos_baris_orang + 1; } } // Geser ke kiri dan ke atas if((x<100)&&(y>900)) { if(pos_kolom_orang == 0) { } else { pos_kolom_orang = pos_kolom_orang - 1; } if(pos_baris_orang == 0) { } else { pos_baris_orang = pos_baris_orang - 1; } } // Geser ke kiri dan ke bawah if((x<100)&&(y<100)) { if(pos_kolom_orang == 0) { } else { pos_kolom_orang = pos_kolom_orang - 1; } if(pos_baris_orang == 3) { } else { pos_baris_orang = pos_baris_orang + 1; } } // Geser ke kanan dan ke atas if((x>900)&&(y>900)) { if(pos_kolom_orang == 19) { } else { pos_kolom_orang = pos_kolom_orang + 1; } if(pos_baris_orang == 0) { } else { pos_baris_orang = pos_baris_orang - 1; } } // Geser ke kanan dan ke bawah if((x>900)&&(y<100)) { if(pos_kolom_orang == 19) { } else { pos_kolom_orang = pos_kolom_orang + 1; } if(pos_baris_orang == 3) { } else { pos_baris_orang = pos_baris_orang + 1; } } // Geser ke kanan if((x>900)&&(y<900)&&(y>100)) { if(pos_kolom_orang == 19) { } else { pos_kolom_orang = pos_kolom_orang + 1; } } // Geser ke kiri if((x<100)&&(y<900)&&(y>100)) { if(pos_kolom_orang == 0) { } else { pos_kolom_orang = pos_kolom_orang - 1; } } lcd.clear(); // Menghapus konten LCD lcd.setCursor(pos_kolom_orang, pos_baris_orang); //Menempatkan kursor orang pada baris dan kolom baru // Mengatur perubahan gambar animasi orang if(bergerak == false) { lcd.write((byte)0); bergerak = true; } else { lcd.write((byte)1); bergerak = false; } // Hantu bergerak secara acak if(pos_kolom_hantu == 0) { pos_kolom_hantu = pos_kolom_hantu + 1; } else if (pos_kolom_hantu == 19){ pos_kolom_hantu = pos_kolom_hantu - 1; } else { pos_kolom_hantu = pos_kolom_hantu + random(-1,2); } if(pos_baris_hantu == 0) { pos_baris_hantu = pos_baris_hantu + 1; } else if (pos_baris_hantu == 3){ pos_baris_hantu = pos_baris_hantu - 1; } else { pos_baris_hantu = pos_baris_hantu + random(-1,2); } // Menempatkan kursor gambar hantu pada kolom dan baris yang baru lcd.setCursor(pos_kolom_hantu,pos_baris_hantu); lcd.write((byte)2); // Menggambar hantu pada LCD // Jika posisi kolom dan baris orang dan hantu sama, maka hantunya tertangkap if(pos_kolom_orang == pos_kolom_hantu) { if(pos_baris_orang == pos_baris_hantu) { lcd.clear(); lcd.setCursor(5, 1); lcd.print("Kena loe!"); delay(500); } } // Jika tombol joystick ditekan, maka LCD menampilkan konten if(SW_PIN == 0) { lcd.setCursor(0, 0); lcd.print("Tangkap hantunya"); } } void loop() { pos_x = analogRead(A0); // Membaca nilai sumbu X [0...1023] pos_y = analogRead(A1); // Membaca nilai sumbu Y [0...1023] SW_PIN = digitalRead(2); // Membaca apakah tombol ditekan (0 atau 1) Serial.print("X = "); Serial.print(pos_x, DEC); Serial.print(" | Y = "); Serial.print(pos_y, DEC); Serial.print(" | Button = "); Serial.println(SW_PIN, DEC); location(pos_x, pos_y, SW_PIN); // Memanggil fungsi location delay(500); }