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++.

En développementDifficulté IntermédiaireDurée 2 à 3 week-endsNiveau Bases en C++ et électronique
Mini Arcade

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

  1. ConceptionChoix d'un ESP32 30 broches associé à un écran OLED I2C 0,96" et 7 boutons-poussoirs pour la navigation et le jeu.
  2. 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.
  3. FirmwareMenu de sélection des jeux, gestion des boutons avec détection de front montant, moteur de rendu 2D simple en C++.
  4. AssemblagePCB intégrant l'écran OLED et les 7 boutons, dans un boîtier imprimé en 3D.
ESP32OLEDJeux

Spécifications

MicrocontrôleurESP32 (30 broches)
ÉcranOLED 0,96" I2C 128×64
Entrées7 boutons-poussoirs
BibliothèquesAdafruit GFX + SSD1306
Jeux inclus3 (Casse-briques, Snake, Shoot'em up)

Brochage GPIO

OLED
SDAGPIO 22
SCLGPIO 21
Bouton U4
GPIOGPIO 25
Bouton U5
GPIOGPIO 32
Bouton U6
GPIOGPIO 26
Bouton U7
GPIOGPIO 14
Bouton U8
GPIOGPIO 33
Bouton U9
GPIOGPIO 27
Bouton U10
GPIOGPIO 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²C
  • Adafruit_GFX.h : Écran OLED, fonctions graphiques
  • Adafruit_SSD1306.h : Écran OLED SSD1306

Préparation

  1. Installe l’environnement Arduino adapté à la carte.
  2. Installe les bibliothèques indiquées.
  3. Vérifie le brochage et l’alimentation avant la mise sous tension.
  4. Assemble puis teste périphérique par périphérique.
  5. Charge le firmware et vérifie le démarrage.

Tests de vérification

  1. Vérifie l’alimentation et l’absence de court-circuit.
  2. Vérifie que chaque périphérique est câblé.
  3. Démarre le microcontrôleur et surveille le moniteur série.
  4. Teste la fonction principale avant de refermer le boîtier.

Dépannage

ProblèmeCause possibleSolution
Le projet ne démarre pasAlimentation, câblage ou court-circuitCoupe 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 erreurBibliothèque manquante ou mauvaise versionInstalle 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.inoTélécharger
/*
 * 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)

Bientôt

Mini Arcade — kit

Mini borne d'arcade de poche avec plusieurs mini-jeux embarqués. PCB + composants nécessaires inclus.

Bientôt

Projet suivant : NRF24 Jammer

Recevoir les prochaines sorties

Un email quand un projet, un guide, un PCB ou un kit est publié. Pas de spam, désinscription à tout moment.

Être prévenu

Recevez un email quand une nouveauté est publiée.