Kit machine à sous « Alien » à base d'ATmega328P
Composants et fournitures
| Composant | Quantité | Notes |
|---|---|---|
| ATmega328P-PU (Microchip) | 2 | 1 pour machine, 1 pour afficheur I²C esclave |
| Afficheur 7 segments 8 digits | 1 | Solde crédits joueur |
| Matrice 8×8, 4 segments, MAX7219 | 1 | 3 segments utilisés (rouleaux) |
| Écran LCD I²C 20×4 bleu | 1 | Menu options |
| Plaque d'essai 830 points | 2 | |
| Boutons poussoirs momentanés | 6 | Spin, navigation menu (3), mise à la masse RESET (2) |
| LED RGB diffuse cathode commune | 1 | Signalisation |
| LED standard (alimentation) | 1 | |
| Résistance 10 kΩ | 6 | Pull-up boutons + RESET |
| Résistance 1 kΩ | 4 | Série boutons → entrées |
| Résistance 330 Ω | 3 | LED RGB (R, G, B) |
| Quartz 16 MHz | 2 | 1 par ATmega |
| Interrupteur glissière (alimentation) | 1 | |
| Buzzer piézo passif | 2 | 1 par puce (pourrait être partagé) |
| Condensateur 22 pF | 4 | Quartz |
| Condensateur 0,1 µF (100 nF) | 6 | Découplage |
| Condensateur 100 nF (série RESET pour FTDI) | 1 | Optionnel (programmation via adaptateur USB série) |
| Condensateur 10 µF | 2 | Lissage alimentation |
| Régulateur linéaire 7805 (5 V) | 1 | |
| Fils de câblage | 1 lot | |
| Alimentation 5 V | 1 | |
| Adaptateur USB série Arduino Mini | td>1Optionnel (ou Arduino UNO comme programmateur) | |
| Adaptateur FTDI USB-TTL série | 1 | Programmation in-situ (×2 = 3,32 $) |
| Plaque à souder grand format | 1 | Version finale |
| Plaque à souder mini (SparkFun) | 1 | Afficheur esclave |
| Soudure 60/40 0,8 mm | 1 | |
| Boîtier étanche plastique transparent | 1 | Enclosure finale (~13 $) |
Outils nécessaires
- Fer à souder
- Main tierce (helping hands)
Applications et bibliothèques
- Arduino IDE
- TimerFreeTone (buzzer sans timer)
- LedControl (matrices MAX7219 + 7 segments)
- LiquidCrystal / LCD
- LiquidCrystal_I2C
À propos du projet
Machine à sous à thème Alien sur ATmega328P

Inspiré par la « Alien Invasion Slot Machine » de Cory Potter, ce projet implémente une machine à sous complète avec deux ATmega328P-PU. Un seul ATmega gère la logique de jeu, les 3 rouleaux (matrices 8×8), le menu LCD, les boutons, le buzzer et la LED RGB. Un second ATmega agit en esclave I²C pour piloter l'afficheur 7 segments 8 digits (crédits). Le projet est actuellement sur plaque d'essai ; le boîtier final arrivera plus tard.

Fonctionnement du jeu
3 rouleaux, chacun avec les mêmes 25 symboles uniques (1 matrice 8×8 inutilisée sur les 4). 5 façons de gagner :
- 3 vaisseaux spatiaux → Jackpot
- 1 ou 2 vaisseaux → gain moindre
- 2 ou 3 symboles identiques (hors vaisseaux) → gain
- Si combinaison mixte (ex: 1 vaisseau + 2 symboles identiques), seul le gain le plus élevé (probabilité la plus faible) est payé – événements mutuellement exclusifs.

Fonctionnalités (menu LCD 20×4)

Navigation par 2 boutons (haut/bas) + sélection (bouton dédié « spin » pour lancer les rouleaux). Menu principal (6 lignes, défilement) :
- Play : lance un tour
- Bet : change la mise (+5 / -5 crédits)
- Settings : Auto/Manuel, Son On/Off
- Metrics : statistiques complètes (crédits, jackpots, gains divers, parties jouées)
- Reset : remet métriques à zéro (sauf écritures EEPROM)
- Hold : avantage maison (%) configurable





Le solde crédits est toujours affiché sur l'afficheur 7 segments 8 digits.

Les mathématiques (probabilités & table de paiement)
25 symboles par rouleau → 25³ = 15 625 combinaisons totales.
| Événement | Combinaisons | Probabilité | Cotes (1/p - 1) |
|---|---|---|---|
| 3 vaisseaux | 1 | 0,000064 | 1 / 15 624 |
| 3 symboles identiques (hors vaisseaux) | 24 | 0,001536 | 1 / 650 |
| 2 vaisseaux | 24 × 3 = 72 | 0,004608 | 1 / 216 |
| 1 vaisseau | 24² × 3 = 1 728 | 0,110592 | 1 / 8 |
| 2 symboles identiques | 23 × 3 × 24 = 1 656 | 0,105984 | 1 / 8,4 |
| Perte (maison) | 12 168 | 0,777216 | – |
La table de paiement est conçue pour maintenir un Indice de Volatilité (VI) < 20 (acceptable pour l'industrie). Le VI mesure la prévisibilité : plus il est haut, plus les gains/pertront imprévisibles. Le « Hold » (avantage maison) est configurable via le menu (typique max 15 % selon juridictions). Un tableau Excel (fourni avec le code) a servi à valider les paiements par simulations de 1 000 001 parties.





Le code
Disponible sur GitHub (3 fichiers : SlotMachine.ino, SlotMachine.h, slotCreditsDisplaySlave.ino). Très commenté. Points notables :
- Variables globales nombreuses (80 % RAM utilisée) – justifié sur embarqué mono-programmeur.
- Bibliothèques :
LedControl(matrices + 7 segments),TimerFreeTone(buzzer),Wire+LiquidCrystal_I2C(LCD). - Machine à états (
machineState) : IDLE, SPINNING, AUTO, SHOW_MENU (combinables). - Événements gérés dans
ProcessEvents(). - Symboles définis en binaire dans
SlotMachine.h(facile à modifier). - Défauts connus : parfois 1-2 rouleaux ne tournent pas (symbole déjà affiché), rouleaux ne s'arrêtent pas séquentiellement gauche→droite (simplicité voulue).
- TODO : protection brown-out, watchdog.
Construction
Programmation in-situ via adaptateur FTDI USB-série (condensateur 100 nF en série sur RESET pour auto-reset). Sinon, Arduino UNO comme programmateur. Voir Arduino sur breadboard pour montage minimal ATmega328P (bootloader via AVRISP mkII, USBtinyISP, ou Arduino comme ISP).
Pièces & budget
Si composants passifs déjà en stock : < 40 $. Avec boîtier et plaque à souder : ~60 $. Fournisseurs : AliExpress, Amazon, eBay. LCD 20×2 possible (changer LCD_SCREEN_HEIGHT à 2).

Câblage (résumé hors schéma Fritzing)
Machine à sous (maître I²C) :
- Broche 1 (RESET) → RTS FTDI + bouton reset
- Broche 2 (TX) → TXD FTDI
- Broche 3 (RX) → RXD FTDI
- Broche 4 → 1 kΩ → bouton « spin »
- Broche 5 → 330 Ω → LED bleue RGB
- Broche 9 (XTAL1) → quartz 16 MHz + 22 pF → GND
- Broche 10 (XTAL2) → quartz 16 MHz + 22 pF → GND
- Broche 14 (DIN) → matrices 8×8
- Broche 15 → 330 Ω → LED rouge RGB
- Broche 16 → 330 Ω → LED verte RGB
- Broche 17 → buzzer + → buzzer – → GND
- Broche 18 (CS) → matrices 8×8
- Broche 19 (CLK) → matrices 8×8
- Broche 23 (A0) → flottant (seed aléatoire)
- Broche 24 → 1 kΩ → bouton « nav up »
- Broche 25 → 1 kΩ → bouton « nav down »
- Broche 26 → 1 kΩ → bouton « select »
- Broche 27 (SDA) → SDA esclave
- Broche 28 (SCL) → SCL esclave
Afficheur esclave I²C :
- Broches 1-3 : même chose (FTDI)
- Broche 15 → buzzer
- Broche 16 (CS) → afficheur 7 segments
- Broche 17 (CLK) → afficheur 7 segments
- Broche 18 (DIN) → afficheur 7 segments
- Broche 27 (SDA) → SDA maître
- Broche 28 (SCL) → SCL maître
Code source (extraits principaux)
SlotMachine.ino
/* SlotMachine.ino v1.0 – ATmega328P @ 16 MHz – Divertissement & éducation seulement */ #include <avr/io.h> #include <avr/eeprom.h> #include <stdlib.h> #include <LedControl.h> #include "SlotMachine.h" #include <TimerFreeTone.h> #include <Wire.h> #include <LCD.h> #include <LiquidCrystal_I2C.h> // Table de paiement (VI = 16,43) #define THREE_SPACESHIP_PAYOUT 600 #define THREE_SYMBOL_PAYOUT 122 #define TWO_SPACESHIP_PAYOUT 50 #define ONE_SPACESHIP_PAYOUT 3 #define TWO_SYMBOL_PAYOUT 2 // ... (code complet tronqué – voir GitHub pour version intégrale)
SlotMachine.h (symboles & notes)
const byte reel[] = {
// 0: étoile, 1: dé 1 point, 2: 3 barres, 3: cœur, 4: dé 2 points,
// 5: 7, 6: $, 7: dé 3 points, 8: # inversé, 9: 1 barre,
// 10: dé 4, 11: 7 inversé, 12: 9 points, 13: dé 5, 14: 2 barres,
// 15: Alien 0, 16: smiley, 17: dé 6, 18: VAISSEAU (SHIP_LOC=144),
// 19: Alien 1, 20: Alien 2, 21: Alien 3, 22: chiffre 1, 23: 2, 24: 3
};
// Notes musicales pour buzzer (C0..DS8)
#define NOTE_B0 31 ... #define NOTE_DS8 4978
slotCreditsDisplaySlave.ino
/* Esclave I²C pour afficheur 7 segments 8 digits – ATmega328P @ 16 MHz */
#include <Wire.h> #include <LedControl.h>
#define CREDITS_SLAVE_ADDR 16
LedControl lc(12,11,10,1); // DIN, CLK, LOAD, 1 chip
volatile long theCredits[10];
volatile long displayedBalance, startingCreditBalance, endingCreditBalance;
volatile int increment;
volatile bool updateDisplayFlag = false;
void receiveEvent(int howMany) {
// Réception 10 octets : startingBalance (4), increment (2), endingBalance (4)
// Little-endian. Met updateDisplayFlag = true.
}
void updateDisplay() {
// Compte de startingBalance à endingBalance par pas de 'increment'
// Affiche chaque valeur sur 7 segments, beep à chaque étape.
}
void showBalance(long val) {
// Décomposition en digits, gestion signe négatif, affichage digit par digit.
}
Schémas

Fichier Fritzing : slotmachine_1nXzMvYVPH.fzz
Tableur validation paiements : slotpayouttablecalc_v1_1_SfcpHOBOvf.xlsx (mot de passe : « password »)
Lien Fritzing.org : Close Encounters Slot Machine
Processus de fabrication
- Machines EEG : conception, fabrication et applications émergentes
- Les distributeurs automatiques : une industrie américaine de 36,6 milliards de dollars
- Les machines à voter : histoire, technologie et normes
- Guide expert des machines à rendre la monnaie modernes : conception, composants et tendances futures
- L'évolution et la fabrication des machines à coudre : de l'innovation du 19e siècle à l'automatisation moderne
- Pièces Essentielles du Tour : Fonctions et Vue d'Ensemble
- Comprendre les Tours : Histoire, Types et Applications
- Composants Clés d'une Fraiseuse Expliqués
- Qu'est-ce qu'une machine ? Guide complet