Game & Interaktif
Tingkat: Pemula
Estimasi: 3 Jam5 x dilihat
Game Pong 1D Arduino yang Bikin Ketagihan
Ringkasan Proyek
Buat versi satu dimensi dari game klasik Pong menggunakan Arduino Nano, 10 LED, dua tombol, layar LCD 16x2, dan buzzer. Bola disimulasikan oleh LED yang bergerak, dan dua pemain berebut menekan tombol di saat yang tepat. Proyek ini cocok untuk belajar mengontrol LED, tombol, dan LCD dengan komponen yang minimal.
Bahan & Komponen
Daftar perangkat keras, modul, dan tools yang dibutuhkan untuk merakit proyek ini.
Daftar Komponen & Perangkat Keras
1x Arduino Nano R3 (Mikrokontroler pemroses utama game)
1x Modul LCD 16x2 I2C (Menampilkan skor kedua pemain)
10x LED (Simulasi gerak bola; 2 LED merah sebagai gawang, 2 LED kuning sebagai posisi pemain, 6 LED hijau sebagai lapangan)
1x Buzzer (Efek suara saat bola bergerak, poin diraih, dan pemenang ditentukan)
2x Push Button (Pushbutton Switch, Momentary) (Berperan sebagai "pemukul" untuk masing-masing pemain)
1x Resistor 470 ohm dan 2x Resistor 10k ohm (Sesuai daftar komponen di halaman asli. Dalam teks cerita, pembuat menyebut total 12 resistor, termasuk resistor pembatas arus untuk LED)
Software
Arduino IDE (Untuk menulis dan meng-upload program)
Library LiquidCrystal_I2C (Mengontrol LCD lewat I2C; library Wire sudah bawaan Arduino IDE)
Alat
Solder (soldering iron) dan kawat solder bebas timbal (Untuk menyambung komponen)
Opsional
Tombol arcade eksternal yang besar (Disarankan jika dimainkan dua orang agar lebih nyaman dan tahan banting)
Baterai lithium (Disarankan sebagai catu daya agar game mudah dibawa-bawa)
Langkah Pembuatan
Khusus Member
Panduan perakitan tahap demi tahap dan catatan proses pengerjaan.
Halo, calon game developer! Pong adalah game arcade bertema tenis meja 2 dimensi buatan Atari yang pertama kali dirilis pada tahun 1972. Di proyek ini kamu akan membuat versi 1D-nya: permainan Pong yang dimainkan di satu baris LED memakai Arduino. Pergerakan bola disimulasikan oleh LED yang menyala bergantian, dan "pemukul"-nya adalah dua tombol.
Game Pong 1D dengan 10 LED, dua tombol, dan layar LCD untuk skor
Langkah 1: Pahami Cara Kerja Game
Game ini dimainkan oleh 2 pemain. "Bola" bergerak sepanjang barisan LED, dan akan memantul kembali jika pemain menekan tombolnya saat LED kuning sedang menyala. Aturan mainnya:
Game dimulai dengan bola bergerak dari pemain 1 ke pemain 2.
Jika pemain 2 gagal menekan tombol saat LED kuning menyala, LED merah menyala dan pemain 1 mendapat poin.
Setiap game dimulai oleh pemenang game sebelumnya.
Kecepatan bola bertambah setiap kali bola berhasil dipukul, sehingga makin sulit mengenainya tepat waktu.
Pertandingan berakhir saat salah satu pemain memenangkan 10 game. Saat itu LED di sisi pemenang berkedip.
Skor ditampilkan di layar LCD. Gerak bola, poin, dan kemenangan diiringi bunyi buzzer yang sesuai.
Langkah 2: Siapkan Komponen
Kumpulkan komponen: Arduino Nano, LCD 16x2, 10 LED, resistor, 2 tombol, dan buzzer. Lihat daftar lengkap pada bagian Bahan & Komponen. Pembuat menyarankan LED merah untuk gawang (pin 4 dan 13), LED kuning untuk posisi pemain (pin 5 dan 12), dan LED hijau untuk lapangan (pin lainnya).
Langkah 3: Rakit Rangkaian
Rakit rangkaian mengikuti diagram pada bagian Skema Rangkaian. Dari komentar di kode: hubungkan pin 4 sampai 13 ke resistor, hubungkan kaki panjang LED (+) ke resistor, lalu hubungkan kaki lainnya (-) ke ground.
Skema rangkaian game Pong 1D
Langkah 4: Upload Kode Program
Pasang library LiquidCrystal_I2C di Arduino IDE (Sketch > Include Library > Manage Libraries), salin kode lengkap pada bagian Kode Program, lalu upload ke Arduino Nano. Alamat I2C LCD pada kode adalah 0x27. Jika layarmu tidak menampilkan apa-apa, alamat modulmu mungkin berbeda.
Langkah 5: Atur Kesulitan Game
Kamu bisa mengubah tingkat kesulitan lewat dua bagian kode:
Kecepatan awal LED diatur pada baris const unsigned long initialMillisecondsPerLED = 400;. Semakin kecil angkanya, semakin cepat LED bergerak.
Percepatan setelah tiap pukulan diatur pada bagian if (deltaMillisecondsPerLED > 50) dan deltaMillisecondsPerLED -= 50;. Semakin besar angkanya, semakin tinggi percepatannya.
Langkah 6: Mainkan Bersama Teman!
Game bisa dimainkan satu atau dua pemain, dan lebih seru jika dua pemain. Untuk dua pemain disarankan memakai tombol arcade eksternal yang besar, karena lebih kokoh dan klik-nya terasa jelas. Pembuat memasang perangkat di dalam kotak dari papan PVC yang dilapisi wallpaper perekat, dan menyarankan baterai lithium sebagai catu daya agar mudah dibawa. Menurut pembuatnya, game ini sangat membuat ketagihan dan bisa dimainkan berjam-jam sebelum bosan.
🔒
Akses Gratis Khusus Member
Buka Seluruh Panduan, Skema & Source Code
Dapatkan akses penuh ke langkah perakitan detail, diagram sirkuit lengkap, dan source code siap pakai. Gratis selamanya!
Halo, calon game developer! Pong adalah game arcade bertema tenis meja 2 dimensi buatan Atari yang pertama kali dirilis pada tahun 1972. Di proyek ini kamu akan membuat versi 1D-nya: permainan Pong yang dimainkan di satu baris LED memakai Arduino. Pergerakan bola disimulasikan oleh LED yang menyala bergantian, dan "pemukul"-nya adalah dua tombol.
Game Pong 1D dengan 10 LED, dua tombol, dan layar LCD untuk skor
Langkah 1: Pahami Cara Kerja Game
Game ini dimainkan oleh 2 pemain. "Bola" bergerak sepanjang barisan LED, dan akan memantul kembali jika pemain menekan tombolnya saat LED kuning sedang menyala. Aturan mainnya:
Game dimulai dengan bola bergerak dari pemain 1 ke pemain 2.
Jika pemain 2 gagal menekan tombol saat LED kuning menyala, LED merah menyala dan pemain 1 mendapat poin.
Setiap game dimulai oleh pemenang game sebelumnya.
Kecepatan bola bertambah setiap kali bola berhasil dipukul, sehingga makin sulit mengenainya tepat waktu.
Pertandingan berakhir saat salah satu pemain memenangkan 10 game. Saat itu LED di sisi pemenang berkedip.
Skor ditampilkan di layar LCD. Gerak bola, poin, dan kemenangan diiringi bunyi buzzer yang sesuai.
Langkah 2: Siapkan Komponen
Kumpulkan komponen: Arduino Nano, LCD 16x2, 10 LED, resistor, 2 tombol, dan buzzer. Lihat daftar lengkap pada bagian Bahan & Komponen. Pembuat menyarankan LED merah untuk gawang (pin 4 dan 13), LED kuning untuk posisi pemain (pin 5 dan 12), dan LED hijau untuk lapangan (pin lainnya).
Langkah 3: Rakit Rangkaian
Rakit rangkaian mengikuti diagram pada bagian Skema Rangkaian. Dari komentar di kode: hubungkan pin 4 sampai 13 ke resistor, hubungkan kaki panjang LED (+) ke resistor, lalu hubungkan kaki lainnya (-) ke ground.
Skema rangkaian game Pong 1D
Langkah 4: Upload Kode Program
Pasang library LiquidCrystal_I2C di Arduino IDE (Sketch > Include Library > Manage Libraries), salin kode lengkap pada bagian Kode Program, lalu upload ke Arduino Nano. Alamat I2C LCD pada kode adalah 0x27. Jika layarmu tidak menampilkan apa-apa, alamat modulmu mungkin berbeda.
Langkah 5: Atur Kesulitan Game
Kamu bisa mengubah tingkat kesulitan lewat dua bagian kode:
Kecepatan awal LED diatur pada baris const unsigned long initialMillisecondsPerLED = 400;. Semakin kecil angkanya, semakin cepat LED bergerak.
Percepatan setelah tiap pukulan diatur pada bagian if (deltaMillisecondsPerLED > 50) dan deltaMillisecondsPerLED -= 50;. Semakin besar angkanya, semakin tinggi percepatannya.
Langkah 6: Mainkan Bersama Teman!
Game bisa dimainkan satu atau dua pemain, dan lebih seru jika dua pemain. Untuk dua pemain disarankan memakai tombol arcade eksternal yang besar, karena lebih kokoh dan klik-nya terasa jelas. Pembuat memasang perangkat di dalam kotak dari papan PVC yang dilapisi wallpaper perekat, dan menyarankan baterai lithium sebagai catu daya agar mudah dibawa. Menurut pembuatnya, game ini sangat membuat ketagihan dan bisa dimainkan berjam-jam sebelum bosan.
Skema & Diagram Sirkuit
Rangkaian berpusat pada Arduino Nano. Berikut koneksi pin yang dipakai di kode program:
10 LED: dipasang di pin digital 4 sampai 13, masing-masing lewat resistor pembatas arus, dengan kaki negatif (-) ke GND. Pin 4 dan 13 adalah gawang (LED merah), pin 5 dan 12 adalah posisi pemain (LED kuning), dan pin 6 sampai 11 adalah lapangan (LED hijau). Pin 13 adalah gawang pemain 1 dan pin 4 adalah gawang pemain 2.
Tombol pemain 1: dihubungkan ke pin digital 3.
Tombol pemain 2: dihubungkan ke pin digital 2. Kedua tombol dibaca sebagai input digital; rujuk diagram untuk penempatan resistor 10k ohm.
Buzzer: pada kode, buzzer dikendalikan lewat pin digital 1 (tone(1, ...)). Karena pin 1 juga dipakai sebagai TX serial, jangan memakai Serial Monitor bersamaan dengan game ini.
LCD 16x2 I2C: memakai antarmuka I2C lewat pin SDA dan SCL (pada Arduino Nano standar berada di A4 dan A5), ditambah VCC dan GND.
Catu daya: pembuat menyarankan baterai lithium agar perangkat portabel. Ikuti juga diagram berikut untuk detail jalur koneksi.
Diagram Rangkaian
Kode Program
//#include <LiquidCrystal.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
bool willTheBallGoTowardsPlayerTwo = true;
bool isInputAllowed = true;
const int playerOne = 12;
const int goalPlayerOne = 13;
const int buttonPlayerOne = 3;
const int playerTwo = 5;
const int goalPlayerTwo = 4;
const int buttonPlayerTwo = 2;
int scoreOfPlayerOne = 0;
int scoreOfPlayerTwo = 0;
const unsigned long initialMillisecondsPerLED = 400;
const unsigned long initialDeltaMillisecondsPerLED = 50;
unsigned long millisecondsPerLED = initialMillisecondsPerLED;
unsigned long deltaMillisecondsPerLED = initialDeltaMillisecondsPerLED;
unsigned long currentMillis = 0;
unsigned long previousMillis = 0;
int currentPosition = playerOne; //Player one starts the game.
int previousPosition = playerOne + 1;
int deltaPosition = 0;
int buttonStatePlayerOne = 0;
int lastButtonStatePlayerOne = 0;
int buttonStatePlayerTwo = 0;
int lastButtonStatePlayerTwo = 0;
void setup() {
lcd.backlight();
lcd.begin(16,2);
lcd.clear();
lcd.setCursor(2, 0);
lcd.print("1D-Pong Game");
lcd.setCursor(3, 1);
lcd.print("by mircemk");
delay(2000.);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Player One: 0");
lcd.setCursor(0, 1);
lcd.print("Player Two: 0");
pinMode(4, 1);
pinMode(5, 1);
pinMode(6, 1);
pinMode(7, 1);
pinMode(8, 1);
pinMode(9, 1);
pinMode(10, 1);
pinMode(11, 1);
pinMode(12, 1);
pinMode(13, 1);
/*Connect pins 4 to 13 to 220ohm resistors, connect the LEDs' longer legs(+) to the resistors,
connect the other legs(-) of the LEDs' to ground.
I recommend red LEDs for 4 and 13(Goals), yellow LEDs for 5 and 12(Players), green LEDs for other pins(Field).
*/
pinMode(2, 0); //Pushbuttons for players. Pin 2 is for player two. Pin 3 is for player one.
pinMode(3, 0); //Connect pushbuttons following the instructions on this page: https://www.arduino.cc/en/Tutorial/DigitalReadSerial
}
void loop()
{
ListenForInput();
currentMillis = millis();
if (currentMillis - previousMillis >= millisecondsPerLED) //If you don't understand this, see: https://www.arduino.cc/en/Tutorial/BlinkWithoutDelay
{
CheckGoalConditions();
lcd.clear();
lcd.setCursor(0, 0); //(Column,Row)
lcd.print("Player One: ");
lcd.setCursor(12, 0);
lcd.print(scoreOfPlayerOne);
lcd.setCursor(0, 1); //(Column,Row)
lcd.print("Player Two: ");
lcd.setCursor(12, 1);
lcd.print(scoreOfPlayerTwo);
CheckEndGame();
DetermineNextPosition();
MoveBallToNextPosition();
previousMillis = currentMillis;
}
}
void ListenForInput() //If you don't understand this method. See: https://www.arduino.cc/en/Tutorial/StateChangeDetection
{
buttonStatePlayerOne = digitalRead(buttonPlayerOne);
buttonStatePlayerTwo = digitalRead(buttonPlayerTwo);
if (buttonStatePlayerOne != lastButtonStatePlayerOne && isInputAllowed)
{
if (buttonStatePlayerOne == 1)
{
if (currentPosition == playerOne)
{
ToggleBallDirection();
IncreaseSpeed();
}
else
{
ScoreForPlayer(2);
}
}
lastButtonStatePlayerOne = buttonStatePlayerOne;
}
if (buttonStatePlayerTwo != lastButtonStatePlayerTwo && isInputAllowed)
{
if (buttonStatePlayerTwo == 1)
{
if (currentPosition == playerTwo)
{
ToggleBallDirection();
IncreaseSpeed();
}
else
{
ScoreForPlayer(1);
}
}
lastButtonStatePlayerTwo = buttonStatePlayerTwo;
}
}
void ToggleBallDirection()
{
willTheBallGoTowardsPlayerTwo = !willTheBallGoTowardsPlayerTwo;
isInputAllowed = false; //Only one direction change per frame is allowed for consistent gameplay.
}
void IncreaseSpeed()
{
millisecondsPerLED -= deltaMillisecondsPerLED;
if (deltaMillisecondsPerLED > 50) //Because of this, it takes a little more time to reach to an insane speed. Adjust or remove this if rounds become too long.
{
deltaMillisecondsPerLED -= 50;
}
}
void MoveBallToNextPosition() //Moves the ball one spot.
{
previousPosition = currentPosition;
digitalWrite(previousPosition, 0);
currentPosition = currentPosition + deltaPosition;
digitalWrite(currentPosition, 1);
tone(1, 500, 50);
isInputAllowed = true;
}
void DetermineNextPosition()
{
if (willTheBallGoTowardsPlayerTwo)
{
deltaPosition = -1;
}
else
{
deltaPosition = 1;
}
}
void CheckGoalConditions()
{
if (currentPosition == goalPlayerTwo)
{
ScoreForPlayer(1);
}
else if (currentPosition == goalPlayerOne)
{
ScoreForPlayer(2);
}
}
void ScoreForPlayer(int playerWhoScored)
{
isInputAllowed = false;
FlashAllLEDs(1, 0);
if (playerWhoScored == 1)
{
scoreOfPlayerOne++;
Reset(1);
}
else if (playerWhoScored == 2)
{
scoreOfPlayerTwo++;
Reset(2);
}
}
void CheckEndGame()
{
if (scoreOfPlayerOne == 10)
{
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Player One Win");
EndGameCeremonyFor(1);
}
if (scoreOfPlayerTwo == 10)
{
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Player Two Win");
EndGameCeremonyFor(2);
}
}
void Reset(int playerCurrentlyScored)
{
if (playerCurrentlyScored == 1)
{
digitalWrite(playerOne, 1);
currentPosition = playerOne;
willTheBallGoTowardsPlayerTwo = true;
tone(1, 200 ,150 );
}
else if (playerCurrentlyScored == 2)
{
digitalWrite(playerTwo, 1);
currentPosition = playerTwo;
willTheBallGoTowardsPlayerTwo = false;
tone(1, 300 ,150 );
}
delay(1000); //Are three seconds enough for players to process the score?
millisecondsPerLED = initialMillisecondsPerLED; //Sets speed to initial value at the beginning of each round.
deltaMillisecondsPerLED = initialDeltaMillisecondsPerLED;
}
void EndGameCeremonyFor(int winner)
{
FlashAllLEDs(50, winner);
TurnOffAllLEDsForPlayer(0);
scoreOfPlayerOne = 0;
scoreOfPlayerTwo = 0;
delay(1000);
lcd.clear();
lcd.setCursor(4, 0);
lcd.print("Starting");
lcd.setCursor(4,1);
lcd.print("New Game");
delay(2000);
}
void TurnOnAllLEDsForPlayer(int player)
{
if (player != 1) //When this method is called with (2), only these pins(player two's) will turn on
{
digitalWrite(4, 1);
digitalWrite(5, 1);
digitalWrite(6, 1);
digitalWrite(7, 1);
digitalWrite(8, 1);
tone(1, 1000, 35);
}
if (player != 2) //When this method is called with (1), only these pins(player one's) will turn on
{
digitalWrite(9, 1);
digitalWrite(10, 1);
digitalWrite(11, 1);
digitalWrite(12, 1);
digitalWrite(13, 1);
tone(1, 1000, 35);
}
}
void TurnOffAllLEDsForPlayer(int player)
{
if (player != 1) //When this method is called with (2), only these pins(player two's) will turn off
{
digitalWrite(4, 0);
digitalWrite(5, 0);
digitalWrite(6, 0);
digitalWrite(7, 0);
digitalWrite(8, 0);
}
if (player != 2) //When this method is called with (1), only these pins(player one's) will turn off
{
digitalWrite(9, 0);
digitalWrite(10, 0);
digitalWrite(11, 0);
digitalWrite(12, 0);
digitalWrite(13, 0);
}
}
void FlashAllLEDs(int blinkCount, int player) //Second parameter(int player) is for when you want to flash only one player's LEDs. Use 1 for player one, use 2 for player two.
{
for (int i = 0; i < blinkCount; i++)
{
TurnOnAllLEDsForPlayer(player);
delay(35);
TurnOffAllLEDsForPlayer(player);
delay(35);
}
}