Mini Arcade
Mini console de poche avec écran OLED et 7 boutons, embarquant plusieurs mini-jeux (casse-briques, snake, shoot'em up) programmés en C++.

Le projet
L'idée de ce projet est venue en cherchant une activité ludique à proposer lors d'animations : une mini console portable, suffisamment robuste pour être manipulée par des enfants, avec plusieurs jeux simples et addictifs. L'écran OLED offre un rendu net pour des graphismes rétro en monochrome, et les 7 boutons permettent de couvrir la navigation dans le menu ainsi que les contrôles de jeu.
Étapes de réalisation
- ConceptionChoix d'un ESP32 30 broches associé à un écran OLED I2C 0,96" et 7 boutons-poussoirs pour la navigation et le jeu.
- Vérification du netlistComparaison du netlist réel (test électrique en usine) avec la carte physique pour confirmer le routage des 7 boutons et de l'OLED.
- FirmwareMenu de sélection des jeux, gestion des boutons avec détection de front montant, moteur de rendu 2D simple en C++.
- AssemblagePCB intégrant l'écran OLED et les 7 boutons, dans un boîtier imprimé en 3D.
Spécifications
| Microcontrôleur | ESP32 (30 broches) |
|---|---|
| Écran | OLED 0,96" I2C 128×64 |
| Entrées | 7 boutons-poussoirs |
| Bibliothèques | Adafruit GFX + SSD1306 |
| Jeux inclus | 3 (Casse-briques, Snake, Shoot'em up) |
Brochage GPIO
| SDA | GPIO 22 |
| SCL | GPIO 21 |
| GPIO | GPIO 25 |
| GPIO | GPIO 32 |
| GPIO | GPIO 26 |
| GPIO | GPIO 14 |
| GPIO | GPIO 33 |
| GPIO | GPIO 27 |
| GPIO | GPIO 12 (strapping pin MTDI — voir note firmware) |
Guide pratique
Matériel nécessaire
- Microcontrôleur : ESP32 (30 broches)
- 7 × boutons
- OLED
Alimentation
Respecte la tension d’alimentation de chaque composant (voir les spécifications).
Ne dépasse jamais la tension maximale d’un composant et vérifie la compatibilité des niveaux logiques avant de raccorder.
Bibliothèques
Wire.h: Écran OLED, communication I²CAdafruit_GFX.h: Écran OLED, fonctions graphiquesAdafruit_SSD1306.h: Écran OLED SSD1306
Préparation
- Installe l’environnement Arduino adapté à la carte.
- Installe les bibliothèques indiquées.
- Vérifie le brochage et l’alimentation avant la mise sous tension.
- Assemble puis teste périphérique par périphérique.
- Charge le firmware et vérifie le démarrage.
Tests de vérification
- Vérifie l’alimentation et l’absence de court-circuit.
- Vérifie que chaque périphérique est câblé.
- Démarre le microcontrôleur et surveille le moniteur série.
- Teste la fonction principale avant de refermer le boîtier.
Dépannage
| Problème | Cause possible | Solution |
|---|---|---|
| Le projet ne démarre pas | Alimentation, câblage ou court-circuit | Coupe l’alimentation et vérifie chaque connexion. |
| Un périphérique n’est pas détecté | GPIO, alimentation ou bus mal câblé | Reprends le tableau de brochage et teste le périphérique seul. |
| Le firmware affiche une erreur | Bibliothèque manquante ou mauvaise version | Installe les bibliothèques listées et vérifie la carte sélectionnée. |
Fichiers
Firmware Arduino, à ouvrir dans l'IDE. Renseigne les paramètres en haut du fichier (Wi-Fi, identifiants) avant de le téléverser.
/*
* Mini Arcade — Kaihatsu Lab
* ESP32 30 broches, OLED I2C, 7 boutons
*
* ATTENTION : GPIO12 (BTN_U10) est un strapping pin (MTDI).
* Pull-up interne volontairement desactivee sur ce pin pour
* ne pas risquer de tirer le niveau haut pendant le boot --
* a verifier physiquement avant flash definitif.
*/
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define OLED_SDA 22
#define OLED_SCL 21
#define SCREEN_W 128
#define SCREEN_H 64
#define BTN_U4 25
#define BTN_U5 32
#define BTN_U6 26
#define BTN_U7 14
#define BTN_U8 33
#define BTN_U9 27
#define BTN_U10 12
const int BUTTON_PINS[7] = {BTN_U4, BTN_U5, BTN_U6, BTN_U7, BTN_U8, BTN_U9, BTN_U10};
bool buttonState[7] = {false,false,false,false,false,false,false};
bool buttonLast[7] = {false,false,false,false,false,false,false};
Adafruit_SSD1306 display(SCREEN_W, SCREEN_H, &Wire, -1);
const char* GAME_NAMES[] = {"Casse-briques", "Snake", "Shoot'em up"};
const int GAME_COUNT = 3;
int selectedGame = 0;
enum AppState { STATE_MENU, STATE_GAME };
AppState state = STATE_MENU;
void readButtons() {
for (int i = 0; i < 7; i++) {
buttonLast[i] = buttonState[i];
buttonState[i] = (digitalRead(BUTTON_PINS[i]) == LOW);
}
}
bool justPressed(int i) { return buttonState[i] && !buttonLast[i]; }
void drawMenu() {
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.println("== Mini Arcade ==");
display.println("----------------");
for (int i = 0; i < GAME_COUNT; i++) {
display.setCursor(4, 16 + i * 12);
if (i == selectedGame) display.print("> "); else display.print(" ");
display.println(GAME_NAMES[i]);
}
display.setCursor(0, 56);
display.println("U4/U5=nav U6=OK");
display.display();
}
void drawGamePlaceholder() {
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.println(GAME_NAMES[selectedGame]);
display.println("----------------");
display.println("(jeu a implementer)");
display.setCursor(0, 56);
display.println("U10=retour menu");
display.display();
}
void handleMenuInput() {
if (justPressed(0)) { selectedGame = (selectedGame - 1 + GAME_COUNT) % GAME_COUNT; drawMenu(); }
if (justPressed(1)) { selectedGame = (selectedGame + 1) % GAME_COUNT; drawMenu(); }
if (justPressed(2)) { state = STATE_GAME; drawGamePlaceholder(); }
}
void handleGameInput() {
if (justPressed(6)) { state = STATE_MENU; drawMenu(); }
}
void setup() {
Serial.begin(115200);
pinMode(BTN_U4, INPUT_PULLUP); pinMode(BTN_U5, INPUT_PULLUP);
pinMode(BTN_U6, INPUT_PULLUP); pinMode(BTN_U7, INPUT_PULLUP);
pinMode(BTN_U8, INPUT_PULLUP); pinMode(BTN_U9, INPUT_PULLUP);
pinMode(BTN_U10, INPUT);
Wire.begin(OLED_SDA, OLED_SCL);
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) Serial.println("Erreur: OLED non detecte");
drawMenu();
}
void loop() {
readButtons();
if (state == STATE_MENU) handleMenuInput(); else handleGameInput();
delay(60);
}
Composants
Les guides des composants utilisés dans ce projet : câblage, code réutilisable et outils dans le navigateur.
Acheter
La boutique n'est pas encore ouverte. Les prix et dates seront annoncés par email.
Mini Arcade — carte nue
Carte PCB nue du projet Mini Arcade. Composants non fournis.
95 × 60 mm · 2 couches · 1.6 mm · HASL (sans plomb)
Mini Arcade — kit
Mini borne d'arcade de poche avec plusieurs mini-jeux embarqués. PCB + composants nécessaires inclus.
Projet suivant : NRF24 Jammer