Construire un flipper piloté par Arduino : guide DIY complet
Composants et fournitures
| Composant | Quantité | Remarques |
|---|---|---|
| Arduino Mega 2560 | 1 | |
| Écran LCD 2 pins (Adafruit) | 1 | Série, piloté via SoftwareSerial |
| Alimentation 24V | 1 | Pour solénoïdes (flippers, bumpers, slingshots) |
| Capteur de force (Adafruit) | 1 | Détection balle perdue |
| Assemblage Pop Bumper | 1 | |
| Contacteur Pop Bumper | 1 | |
| Contacteur Target (cible) | 1 | |
| Contacteur Rollover | 1 | |
| Assemblage Flipper | 1 | Mécanisme complet |
| Lampes LED | 1 | Lot pour éclairage terrain |
À propos du projet
Flipper piloté par Arduino
Construire un flipper contrôlé par Arduino combine menuiserie, mécanique, électronique et programmation. Six mois de travail à temps partiel — le projet le plus complexe que j'aie jamais réalisé. La difficulté majeure : peu de documentation existante sur la construction d'un flipper.
Ce document décrit la construction en détail avec suffisamment de références pour vous faciliter la tâche si vous voulez construire le vôtre. Testez tout sur prototype ! J'ai utilisé une chute de contreplaqué pour prototyper chaque composant avant installation finale — cela évite bien des déconvenues.
La machine a une caisse en contreplaqué chêne et utilise des pièces de rechange de flipper commerciales. Le tout est piloté par un unique Arduino Mega 2560. Vidéo de démo : lien vers la vidéo.
La caisse
Contreplaqué plaqué chêne (magasin de bricolage). Dimensions en pouces :
- Face avant/arrière : 20H × 23L
- Panneaux latéraux : 20H × 47L
Découpes à onglets, assemblées par lamelles (biscuit joiner) + colle. Vis à poche + colle auraient aussi fonctionné. La caisse doit être robuste (vibrations, chocs). Rainure ¾" à 1" du bas pour l'étagère flottante (dilatation bois). L'étagère supporte l'alimentation principale et celle des LED décoratives sous le couvercle.
Surface de jeu : 22L × 42L (plus courte que la caisse). 3" à l'avant pour passer câbles boutons flippers et LEDs. 3" à l'arrière pour le lance-bille. La surface repose sur tasseaux vissés aux parois, ~4" sous le sommet. Pour accéder à l'intérieur : ouvrez le couvercle, retirez la surface de jeu, retournez-la.
Caisse et surface à angles droits. L'inclinaison (pente) est donnée par les pieds (1° à 7° selon vitesse désirée). Pieds réglables : bois tourné (magasin bricolage), perçage 12" de profondeur au forêt à bois. Écrou Té 3/8" époxyé en bas (attention aux filets). Tige filetée 3/8" × 12", écrou, pied de nivelage. Références :
Platines de fixation vissées sur l'étagère basse. Réglage hauteur : desserrez l'écrou, tournez la tige, resserrez.
Sur la photo : cordon secteur et USB. Multiprise fixée au dos — un interrupteur coupe tout. Câble USB accessible pour reprogrammer l'Arduino sans démonter la surface de jeu.
Le couvercle
Cadre en chêne, mêmes dimensions extérieures que la caisse. Haut/latéraux : 1,5" ; bas : 5" (cache l'espace surface/caisse). Rainure interne pour plexiglas (plus léger, plus sûr, plus facile à couper que le verre). Assemblé par vis à poche (démontable si plexiglas à changer). Bande LED décorative sous le couvercle. Charnière piano encastrée dans couvercle et caisse.
L'Arduino
Le Mega 2560 fait quatre choses :
- Détecte l'activation des contacteurs
- Allume/éteint les lampes correspondantes
- Gère le score
- Affiche score et numéro de bille sur le petit LCD
Câblage simple : contacteurs sur entrées digitales avec INPUT_PULLUP. Passage HIGH→LOW = contacteur activé → allumage LED correspondante.
Complexité : Pop Bumpers. Ils sont alimentés en 24V (séparé de l'Arduino). Leur contacteur ne peut pas être lu directement (haute tension). Solution : diviseur de tension pour ramener à 5V. Exemple diviseur. J'ai utilisé les entrées analogiques (seuil > 500) pour éviter les faux positifs dus aux fuites de courant du diviseur.
Bonus : quand tous les contacteurs d'un type (targets, pop bumpers, rollovers) sont activés, l'Arduino fait clignoter leurs lampes et augmente leur valeur de score.
Un capteur de force détecte la perte de bille (gère le compte de billes et fin de partie). Fin de partie = toutes les lampes clignotent en séquence.
Le LCD affiche score et bille via SoftwareSerial.
Le schéma joint montre le câblage d'un exemplaire de chaque composant principal (sinon illisible).
Alimentation
Alimentation 24V pour composants flipper. Suffisante pour flippers et slingshots, un peu juste pour pop bumpers (prévoir plus puissant si besoin, avec diviseurs adaptés). Distribution via barres de raccordement (bus bars) fixées sous la surface de jeu — bien plus pratique que raccordement direct. Visibles sur la photo des slingshots. Disponibles rayon électricité magasin bricolage.
Lance-bille (Plunger)
Acheté ici : Marco Specialties
Percez la face avant pour le passage. Alignez précisément : règle sur surface de jeu, repérez le point sur l'intérieur de la caisse, montez de sorte que le centre du plunger = demi-hauteur de la bille (bille = 1 1/16", dispo chez Pinball Life).
Surface de jeu
Contreplaqué bouleau ¼". Décoration : photo NASA (Hubble printshop). Colle contact sur bois, laminez l'affiche, retournez, découpez aux dimensions.
Flippers
Achetés ici : Pinball Life. Les composants flipper viennent sans notice utile. Schéma de câblage ci-dessous (source : lien fourni).
Nécessaire : mécanisme flipper, batte (flipper bat), contacteur flipper, bouton.
Slingshots (éjecteurs latéraux)
Assemblage complet Pinball Life (goupilles, élastiques). Photo du montage vu du dessous. Fil 16 AWG pour 24V, 22 AWG pour Arduino. Rails métalliques latéraux (guides bille) introuvables dans le commerce — fabriqués avec fil acier chromé (marquage pelouse insecticide), cintrés, percés, époxyés dans la surface.
Pop Bumpers
Assemblages Pinball Life (contacteurs, capuchons). Installation : 3 trous (2 tiges support, 1 arbre contacteur). Bille roule sur disque blanc → pousse arbre → contacteur à lames → solénoïde tire anneau métallique → renvoie bille.
Cibles, rollovers, lampes
- Cibles : Marco Specialties
- Rollover switches + supports : Action Pinball
- Lampes LED équivalentes (modèles originaux plus produits) : LED4555
- Supports lampes : 077-5030-00
Câblage identique pour tous (voir section Arduino).
Résumé
Une fois commencé, vous voudrez ajouter cloches et sifflets — cette base vous lance. Bon courage !
Code
Code Arduino Flipper (Arduino)
Permet à l'Arduino de gérer la partie d'un flipper maison.
const int TxPin = 17;
long Score = 0, OldScore = 0;
long Target = 1, Pop = 1, Roll = 10;
int Targets[8], Rolls[3], Pops[4];
int Milli = 10, Sum = 0, Flash = 100;
int Ball = 0, i = 0, Shot = 0, Lost = 0, Pressure = 1024;
#include <SoftwareSerial.h>;
SoftwareSerial mySerial = SoftwareSerial(255, TxPin);
void setup() {
pinMode(TxPin, OUTPUT);
digitalWrite(TxPin, HIGH);
mySerial.begin(9600);
mySerial.write(12); // Clear LCD
mySerial.write(17); // Backlight on
// Entrées contacteurs (pull-up interne)
for (int p = 2; p <= 9; p++) pinMode(p, INPUT_PULLUP); // 8 Targets
for (int p = 10; p <= 12; p++) pinMode(p, INPUT_PULLUP); // 3 Rollovers
pinMode(15, INPUT_PULLUP); // Switch allée basse
pinMode(16, INPUT_PULLUP); // Switch allée haute
// LCD
pinMode(17, OUTPUT);
// Sorties lampes
for (int p = 32; p <= 39; p++) pinMode(p, OUTPUT); // 8 Targets
for (int p = 40; p <= 42; p++) pinMode(p, OUTPUT); // 3 Rollovers
for (int p = 50; p <= 53; p++) pinMode(p, OUTPUT); // 4 Pop Bumpers
}
void loop() {
// --- Targets (pins 2-9) ---
for (int i = 0; i < 8; i++) {
if (digitalRead(i + 2) == LOW) {
Targets[i] = 1;
Score += Target;
digitalWrite(i + 32, HIGH);
delay(Milli);
break;
}
}
Sum = 0; for (int i = 0; i < 8; i++) Sum += Targets[i];
if (Sum == 8) {
for (int j = 0; j < 3; j++) {
for (int i = 0; i < 8; i++) digitalWrite(i + 32, LOW);
delay(Flash);
for (int i = 0; i < 8; i++) digitalWrite(i + 32, HIGH);
delay(Flash);
}
for (int i = 0; i < 8; i++) { digitalWrite(i + 32, LOW); Targets[i] = 0; }
delay(Flash);
Target *= 5; // Score x5
}
// --- Rollovers (pins 10-12) ---
for (int i = 0; i < 3; i++) {
if (digitalRead(i + 10) == LOW) {
Rolls[i] = 1;
Score += Roll;
digitalWrite(i + 40, HIGH);
delay(Milli);
break;
}
}
Sum = 0; for (int i = 0; i < 3; i++) Sum += Rolls[i];
if (Sum == 3) {
for (int j = 0; j < 3; j++) {
for (int i = 0; i < 3; i++) digitalWrite(i + 40, LOW);
delay(Flash);
for (int i = 0; i < 3; i++) digitalWrite(i + 40, HIGH);
delay(Flash);
}
for (int i = 0; i < 3; i++) { digitalWrite(i + 40, LOW); Rolls[i] = 0; }
delay(Flash);
Score *= 2; Roll *= 10;
}
// --- Pop Bumpers (analog pins 0-3) ---
for (int i = 0; i < 4; i++) {
if (analogRead(i) > 500) {
Pops[i] = 1;
Score += Pop;
digitalWrite(i + 50, HIGH);
delay(Milli);
break;
}
}
Sum = 0; for (int i = 0; i < 4; i++) Sum += Pops[i];
if (Sum == 4) {
for (int j = 0; j < 3; j++) {
for (int i = 0; i < 4; i++) digitalWrite(i + 50, LOW);
delay(Flash);
for (int i = 0; i < 4; i++) digitalWrite(i + 50, HIGH);
delay(Flash);
}
for (int i = 0; i < 4; i++) { digitalWrite(i + 50, LOW); Pops[i] = 0; }
delay(Flash);
Pop *= 2;
}
// --- Gestion bille (Switch allées + capteur force) ---
if (digitalRead(15) == LOW && Shot == 0) { // Allée basse
Lost = 0; Pressure = analogRead(7) + 20; OldScore = -1;
Ball++; if (Ball == 6) { Ball = 1; Score = 0; Target = 1; Roll = 1; Pop = 1; }
Shot = 1;
}
if (digitalRead(16) == LOW && Shot == 0) { // Allée haute
Lost = 0; Pressure = analogRead(7) + 15; OldScore = -1;
Ball++; if (Ball == 6) { Ball = 1; Score = 0; Target = 1; Roll = 1; Pop = 1; }
Shot = 1;
}
if (analogRead(7) > Pressure) { // Bille sur capteur force
Shot = 0;
if (Lost == 0) {
Lost = 1;
if (Ball == 5) { // Game Over (5ème bille perdue)
// Clignotement général
for (int j = 0; j < 3; j++) {
for (int i = 0; i < 3; i++) digitalWrite(i + 40, LOW);
delay(Flash);
for (int i = 0; i < 3; i++) digitalWrite(i + 40, HIGH);
delay(Flash);
}
for (int i = 0; i < 3; i++) { digitalWrite(i + 40, LOW); Rolls[i] = 0; }
for (int j = 0; j < 3; j++) {
for (int i = 0; i < 4; i++) digitalWrite(i + 50, LOW);
delay(Flash);
for (int i = 0; i < 4; i++) digitalWrite(i + 50, HIGH);
delay(Flash);
}
for (int i = 0; i < 4; i++) { digitalWrite(i + 50, LOW); Pops[i] = 0; }
for (int j = 0; j < 3; j++) {
for (int i = 0; i < 8; i++) digitalWrite(i + 32, LOW);
delay(Flash);
for (int i = 0; i < 8; i++) digitalWrite(i + 32, HIGH);
delay(Flash);
}
for (int i = 0; i < 8; i++) { digitalWrite(i + 32, LOW); Targets[i] = 0; }
mySerial.write(12); delay(5);
mySerial.print(Score);
mySerial.write(13); // Form feed
mySerial.print("Game Over!!!");
}
}
}
// --- Affichage LCD ---
if (Score != OldScore) {
mySerial.write(12); delay(5);
mySerial.print(Score);
mySerial.write(13);
mySerial.print("Ball = "); mySerial.print(Ball);
OldScore = Score;
}
}
Schémas
Processus de fabrication
- Interrupteur d'Alimentation AC Intelligent Contrôlé par SMS avec Raspberry Pi et Hologram
- Construire un robot Raspberry Pi piloté par Bluetooth avec retour audio
- Lampe de table RGB à commande gestuelle – Éclairage interactif, mains libres
- Construire un dispositif de lévitation ultrasonique avec Arduino – Guide étape par étape
- Contrôler des LED avec Alexa via Raspberry Pi – Guide Pas à Pas
- Transformez une vieille voiture RC en véhicule piloté au joystick avec Arduino
- Bras robotique 6 DoF piloté par Nunchuk Wii – Kit Arduino Mega
- Interrupteur lumineux sans fil intelligent : Manipulateur d'interrupteur piloté par Arduino
- Robot commandé par la voix avec Arduino Nano et Bluetooth