In quest’articolo ti guiderò nella creazione di una micro pc, che ti permetterà di giocare a Pong, il classico gioco retrò. Utilizzeremo l’ESP8266 insieme ad un display OLED SSD1306 e due pulsanti per controllare il gioco. Questo progetto unisce l’aspetto retrò del gioco Pong con la flessibilità dell’ESP8266, aprendo le porte ad un’ampia gamma di possibilità di sviluppo. Scopriamo come realizzare questo micro computer per goderci ore di divertimento giocando a Pong con i nostri amici.
Il micro pc Pong che creeremo è un ottimo esempio di come l’ESP8266, possa essere utilizzato per realizzare dispositivi interattivi e divertenti. Il display OLED 1306 ci permetterà di visualizzare il campo di gioco ed i pulsanti saranno utilizzati per controllare le racchette virtuali. Pong è uno dei giochi più iconici della storia dei videogiochi ed è perfetto per essere portato in forma compatta e personalizzata come un micro pc. Prima di iniziare, assicuriamoci di avere a disposizione tutti i componenti necessari:
- ESP8266 – Wemos D1 mini
- OLED SSD 1306
- Due pulsanti
- Breadboard e cavetti di collegamento
- Cavo USB per l’alimentazione del modulo
Comprando dai link che vi propongo, ottengo una piccola commissione da Amazon.
Il prezzo per voi non cambia e potrete supportarmi nei miei progetti futuri.
Configurazione dell’ambiente di sviluppo
Prima di poter iniziare a lavorare sul progetto, dobbiamo configurare l’ambiente di sviluppo. Assicuriamoci di avere l’IDE di Arduino installato sul nostro computer. Successivamente, dovremo scaricare e installare la libreria per il display OLED 1306. Possiamo farlo andando al menu “Sketch” nell’IDE di Arduino, selezionando “Includi Libreria” e quindi cercando “SSD1306”. Una volta installata la libreria, saremo pronti per il passaggio successivo.
Collegamento dei componenti
Il secondo passaggio consiste nel collegare i componenti in modo corretto. Utilizzeremo una breadboard per il cablaggio temporaneo prima di effettuare eventuali saldature permanenti. Iniziamo col collegare il modulo ESP8266 alla breadboard e assicuriamoci che sia correttamente alimentato collegando i pin VCC e GND ai rispettivi pin di alimentazione sulla breadboard. Successivamente, collega il display OLED 1306 alla breadboard e connetti i pin SDA e SCL ai pin corrispondenti sull’ESP8266 D2 -D1, collega poi i due pulsanti ai pin di input digitali dell’ESP8266 D6 – D5 .
Assicuriamoci di seguire uno schema sotto riportato per il cablaggio corretto (verificate senza la disposizione dei vostri pin).
Scrittura del codice del gioco Pong
Ora è il momento di scrivere il codice per il gioco Pong. Apriamo l’IDE di Arduino e creiamo un nuovo sketch. Iniziamo includendo le librerie necessarie per il display OLED. Definiamo le variabili e le costanti necessarie per il gioco, come la posizione delle racchette e la velocità della pallina. Creiamo funzioni per aggiornare la posizione delle racchette, controlliamo le collisioni e disegniamo gli oggetti sul display OLED. Utilizzando il loop principale, gestiremo gli input dei pulsanti e aggiorneremo costantemente la posizione degli oggetti di gioco.
Il codice è presente anche sul mio repository https://github.com/Lutritech/
/* www.lutritech.itCome realizzare un micro pc con ESP8266Micro Computer con Pong giocabile https://www.youtube.com/@Lutritech https://www.facebook.com/lutritech.it https://www.instagram.com/Lutritech https://github.com/Lutritech */ #include <SPI.h> #include <Wire.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> // Pin dei pulsanti #define UP_BUTTON D3 #define DOWN_BUTTON D4 #define UP_BUTTON_op D6 #define DOWN_BUTTON_op D5 const unsigned long PADDLE_RATE = 33; const unsigned long BALL_RATE = 16; const uint8_t PADDLE_HEIGHT = 24; // Impostazioni del display #define SCREEN_WIDTH 128 #define SCREEN_HEIGHT 64 //#define SSD1306_NO_SPLASH in libraries\Adafruit_SSD1306\Adafruit_SSD1306.h //SSD1306 SDA, SCL pins #define OLED_RESET -1 // -1 reset pin Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); void drawCourt(); uint8_t ball_x = 64, ball_y = 32; uint8_t ball_dir_x = 1, ball_dir_y = 1; unsigned long ball_update; unsigned long paddle_update; const uint8_t player_2X = 12; uint8_t player_2y = 16; const uint8_t PLAYER_X = 115; uint8_t player_y = 16; int MAX_SCORE = 8; int PLAYER2_SCORE = 0; int PLAYER_SCORE = 0; void setup() { display.begin(SSD1306_SWITCHCAPVCC, 0x3C); unsigned long start = millis(); pinMode(UP_BUTTON, INPUT_PULLUP); pinMode(DOWN_BUTTON, INPUT_PULLUP); pinMode(UP_BUTTON_op, INPUT_PULLUP); pinMode(DOWN_BUTTON_op, INPUT_PULLUP); digitalWrite(UP_BUTTON, 1); digitalWrite(DOWN_BUTTON, 1); digitalWrite(UP_BUTTON_op, 1); digitalWrite(DOWN_BUTTON_op, 1); display.clearDisplay(); drawCourt(); display.setCursor(58, 4); display.setTextColor(WHITE); display.setTextSize(1); display.print(PLAYER2_SCORE); display.print(":"); display.print(PLAYER_SCORE); while (millis() - start < 2000) ; display.display(); ball_update = millis(); paddle_update = ball_update; } void loop() { bool update = false; unsigned long time = millis(); static bool up_state = false; static bool down_state = false; static bool up_state_op = false; static bool down_state_op = false; up_state_op |= (digitalRead(UP_BUTTON_op) == LOW); down_state_op |= (digitalRead(DOWN_BUTTON_op) == LOW); //up_state |= (digitalRead(UP_BUTTON) == LOW); //down_state |= (digitalRead(DOWN_BUTTON) == LOW); up_state = up_state_op; down_state = down_state_op; if (time > ball_update) { uint8_t new_x = ball_x + ball_dir_x; uint8_t new_y = ball_y + ball_dir_y; uint8_t new_2x = ball_x + ball_dir_x; uint8_t new_2y = ball_y + ball_dir_y; // Check if the ball hit the vertical walls if (new_x == 0) //Player1 prende un punto { display.clearDisplay(); drawCourt(); PLAYER_SCORE++; display.setCursor(58, 4); display.setTextColor(WHITE); display.setTextSize(1); display.print(PLAYER2_SCORE); display.print(":"); display.print(PLAYER_SCORE); display.display(); if (PLAYER_SCORE == MAX_SCORE) { finish(); display.display(); delay(4000); ESP.reset(); } } // Check if the ball hit the vertical walls if (new_x == 127) //Player2 prende un punto { display.clearDisplay(); drawCourt(); PLAYER2_SCORE++; display.setCursor(58, 4); display.setTextColor(WHITE); display.setTextSize(1); display.print(PLAYER2_SCORE); display.print(":"); display.print(PLAYER_SCORE); display.display(); if (PLAYER2_SCORE == MAX_SCORE) { finish2(); display.display(); delay(4000); ESP.reset(); } } // Check if the ball hit the horizontal walls. if (new_y == 0 || new_y == 63) { ball_dir_y = -ball_dir_y; new_y += ball_dir_y + ball_dir_y; } // Check if the ball hit the player2 paddle if (new_2x == player_2X && new_2y >= player_2y && new_2y <= player_2y + PADDLE_HEIGHT) { ball_dir_x = -ball_dir_x; new_2x += ball_dir_x + ball_dir_x; } if (new_x == 0 || new_x == 127) { ball_dir_x = -ball_dir_x; new_x += ball_dir_x + ball_dir_x; } // Check if the ball hit the player paddle if (new_x == PLAYER_X && new_y >= player_y && new_y <= player_y + PADDLE_HEIGHT) { ball_dir_x = -ball_dir_x; new_x += ball_dir_x + ball_dir_x; } display.drawPixel(ball_x, ball_y, BLACK); display.drawPixel(new_x, new_y, WHITE); ball_x = new_x; ball_y = new_y; ball_update += BALL_RATE; update = true; } if (time > paddle_update) { paddle_update += PADDLE_RATE; // Player2 racchetta display.drawFastVLine(player_2X, player_2y, PADDLE_HEIGHT, BLACK); if (up_state_op) { player_2y -= 1; } if (down_state_op) { player_2y += 1; } up_state_op = down_state_op = false; if (player_2y < 1) player_2y = 1; if (player_2y + PADDLE_HEIGHT > 63) player_2y = 63 - PADDLE_HEIGHT; display.drawFastVLine(player_2X, player_2y, PADDLE_HEIGHT, WHITE); // Player1 racchetta display.drawFastVLine(PLAYER_X, player_y, PADDLE_HEIGHT, BLACK); if (up_state) { player_y -= 1; } if (down_state) { player_y += 1; } up_state = down_state = false; if (player_y < 1) player_y = 1; if (player_y + PADDLE_HEIGHT > 63) player_y = 63 - PADDLE_HEIGHT; display.drawFastVLine(PLAYER_X, player_y, PADDLE_HEIGHT, WHITE); update = true; } if (update) { display.display(); } } void drawCourt() { display.drawRect(0, 0, 128, 64, WHITE); } int finish() { ball_dir_x = 0; ball_dir_y = 0; display.fillRoundRect(0, 0, 128, 64, 2, WHITE); display.setCursor(15, 4); display.setTextColor(BLACK); display.setTextSize(2); display.print("Player1 Vince"); return 1; } int finish2() { ball_dir_x = 0; ball_dir_y = 0; display.fillRoundRect(0, 0, 128, 64, 2, WHITE); display.setCursor(15, 4); display.setTextColor(BLACK); display.setTextSize(2); display.print("Player2 Vince"); return 2; }
Caricamento del codice e test del gioco
Dopo aver scritto il codice, è ora di caricarlo sull’ESP8266. Collega il modulo al computer utilizzando il cavo USB e seleziona la corretta scheda e porta seriale nell’IDE di Arduino. Assicurati che l’ESP8266 sia correttamente riconosciuto dall’IDE. Ora, carica il codice premendo il pulsante “Carica” nell’IDE. Dopo il caricamento, il gioco Pong dovrebbe avviarsi sul display OLED ed i pulsanti dovrebbero rispondere ai comandi per controllare le racchette. Verifica attentamente che tutto funzioni correttamente, apportando eventuali modifiche al codice se necessario.
Personalizzazione e miglioramenti opzionali
Ora che il micro Pc Pong funziona correttamente, puoi personalizzarlo e adattarlo ai tuoi gusti.
Puoi stampare questo modello che ho preparato: https://www.thingiverse.com/thing:5257248/ aggiungere effetti sonori o anche integrare una batteria per renderlo completamente portatile. Inoltre, puoi sperimentare con altri giochi classici o persino implementare funzionalità di rete per sfidare giocatori online. L’ESP8266 offre molte possibilità di espansione e sviluppo, quindi lascia libera la tua creatività!
Conclusioni
Complimenti! Hai realizzato con successo un micro Pc Pong personalizzato utilizzando l’ESP8266, il display OLED 1306 e i pulsanti. Questo progetto unisce l’aspetto retrò del gioco Pong con la flessibilità e le potenzialità dell’ESP8266, consentendoti di creare un micro Pc unico. Oltre ad offrire ore di divertimento giocando a Pong, questo progetto ti ha dato l’opportunità di sperimentare con l’elettronica e la programmazione. Spero che tu possa goderti il tuo nuovo micro Pc Pong personalizzato e che questo progetto ti abbia ispirato ad esplorare ulteriormente le molte possibilità creative offerte dall’ESP8266. Buon divertimento giocando!