Gamoover

[move]Le staff Gamoover vous souhaite la bienvenue ;)

Ice cold beer BARTOP

Démarré par berunours, Dimanche 14 Mars 2021, 18:38:29 PM

berunours

J'vous ai refait la vidéo, avec moins de soleil, histoire qu'on voit vraiment les afficheurs cette fois.


https://www.youtube.com/watch?v=JVchbv-Ur6Y

berunours

#17
Bon bah... J'ai continué d'avancer dessus...

Cette fois j'ai essayer de mettre le maximum de choses ensemble:
- 9 capteur IR (8 trous étapes et le mauvais trou)
- 1 afficheur led
- 8 leds adressables

Du coup mon programme fonctionne bien.

https://www.youtube.com/watch?v=ceY-oDFRDSU


Le code si interressés:

#include <Adafruit_NeoPixel.h>
Adafruit_NeoPixel strip(8, 11, NEO_GRBW + NEO_KHZ800);


//--------------------------------------------------- INITIALISATION DE LA BECANNE ------------------------------------

#include <SevenSegmentAsciiMap.h>
#include <SevenSegmentExtended.h>
#include <SevenSegmentTM1637.h>



SevenSegmentTM1637    tm2(12, 13);  //afficheur du centre déclaration


int temp = 0;            //variable temporisation
int templed = 0;          //variable tempo pour chenillard led
int tempbrill =0; int tempbrillad = 0;

int bille = 0;           // Bille on bar
int etape = 0;           // Trou demandé
int bonus = 0;           // Variable bonus
int score = 0;           // variable Score
int highscore = 0;       // Variable highscore
int tempoloop = 50;      // Variable du delay de la boucle pricipale en ms

int trou = 0;  // trou dans laquelle est tombé la bille


int Amode = 1;   // Pour attrack mode
int Debutpartie = 0; // Initialisation de la partie après le crédit
int Initbarre = 0;   // Pour que les barres aillent chercher une nouvelle bille
int Principale = 0;  // Boucle principale avec bougeage des barres, bonus qui descent, billes qui passent dans un trou etc...
int Bontrou = 0;     // Boucle Bille dans le bon trou
int Badtrou = 0;     // Boucle Bille dans le mauvais trou
int Gameover = 0;     // Boucle Gamover

int test = 0; // Variable temporaire pour ecriture du programme (gestion des etapes)
int credit = 0;  // test pour le moment


void setup() {

     tm2.begin(); tm2.setBacklight(60); tm2.setPrintDelay(500); tm2.clear();   //afficheur du centre initialisation

     pinMode(2, INPUT);    // Mauvais trou
     pinMode(3, INPUT);    // Trou 1
     pinMode(4, INPUT);    // Trou 2
     pinMode(5, INPUT);    // Trou 3
     pinMode(6, INPUT);    // Trou 4
     pinMode(7, INPUT);    // Trou 5
     pinMode( 8, INPUT);    // Trou 6
     pinMode(9, INPUT);    // Trou 7
     pinMode(10, INPUT);   // Trou 8

      strip.begin(); // bande led début
      strip.show(); // bande led éteinte
      strip.setBrightness(30);
   
    Serial.begin(9600);    //Pour la console
   
}

void loop() {


//--------------------------------------------------- ATTRACK MODE ---------------------------------
  if (Amode == 1){ delay(50);
       
       credit = digitalRead(2);                                       // Verif si boutton coin est appuyé
       if (credit== LOW) { Amode=0; Debutpartie = 1;tm2.clear();strip.clear();strip.show();strip.setBrightness(60);tempbrill = 0; tempbrillad = 5;}      // Sortie d'Attrack mode
   
    temp++;
       switch (temp) {                                                // Faire defiler text ecran du bas
          case 20: tm2.clear(); tm2.print("PLAY"); break;
          case 40: tm2.clear(); tm2.print("ICE"); break;
          case 60: tm2.clear(); tm2.print("COLD"); break;
          case 80: tm2.clear(); tm2.print("BEER"); break;
          case 100: tm2.clear(); break;
          case 120: tm2.clear(); tm2.setCursor(1, decalage (highscore)); tm2.print(highscore); temp = 0;  break;}

   
    templed++; 
         if ( templed <= 10) { strip.setBrightness(60);strip.setPixelColor(templed, 240, 240, 20); strip.setPixelColor(templed-1, 130, 130, 50);  strip.show();}
         if ( templed > 10 && templed <= 20 ){ strip.setPixelColor(templed-12, 0, 0, 0);  strip.show(); }
         if ( templed > 20 && templed <= 30 ){ strip.setPixelColor(templed-20, 240, 240, 20); strip.setPixelColor(templed-21, 130, 130, 50); strip.setPixelColor(templed-22, 0, 0, 0);  strip.show(); }
         if ( templed >= 30 && templed <= 40 ){ strip.setPixelColor(templed-32, 130, 130, 50);  strip.show();}
         if ( templed >= 50 && templed <= 60 ){ strip.setPixelColor(templed-52, 0, 0, 0);  strip.show(); }
         if (templed == 60){ for (int i= 0; i<8; i++ ) {tempbrill = 20; strip.setBrightness(tempbrill); strip.setPixelColor(i, 230, 230 ,230);  strip.show(); tempbrillad=10;}}
         if (templed > 60 && templed <=180) {tempbrill = tempbrill + tempbrillad ; strip.setBrightness(tempbrill);  strip.show(); if (tempbrill >70 || tempbrill < 20){tempbrillad=-tempbrillad;} }
         if (templed == 180){ for (int i= 0; i<8; i++ ) {tempbrill = 20; strip.setBrightness(tempbrill); strip.setPixelColor(i, 0, 0 ,0);  strip.show();}}
       
         if (templed >= 200) { templed=0;}
 
   } //----- FIN DE ATTRACK MODE

//--------------------------------------------------- DEBUT DE PARTIE ---------------------------------
  if (Debutpartie == 1){bille++; etape = 1; Debutpartie =0; Initbarre = 1;tm2.clear(); tm2.print(bille);tm2.blink();
                       strip.clear();strip.setPixelColor(etape-1, 240, 240, 20);strip.show();}
 
//----------------------------------------- INITIALISATION DES BARRES ET BONUS ------------------------
 
  if (Initbarre ==1){ bonus = etape *100; tm2.clear(); tm2.setCursor(1, decalage (bonus)); tm2.print(bonus);delay (1000);Initbarre = 0;temp =0;Principale = 1;}  //Affichage Bonus

//----------------------------------------------------BOUCLE PRINCIPALE--------------------------------

if (Principale == 1) { delay(tempoloop);  // Delais (latence voulu)
       
        temp++; if (temp > (3000/tempoloop) && bonus > 0) {bonus = bonus - 10; tm2.clear(); tm2.setCursor(1, decalage (bonus)); tm2.print(bonus); temp = 0;} //Actu Bonus
        tempbrill = tempbrill + tempbrillad ; strip.setBrightness(tempbrill);strip.setPixelColor(etape-1, 240, 240, 20);  strip.show(); if (tempbrill >70 ){tempbrillad=-5;}; if (tempbrill <20 ){tempbrillad= 5;}
        //-----Detection du trou

     int troudetect = 0; trou=0;
        troudetect = digitalRead(2); if (troudetect == LOW){ trou=20;}       // Mauvais trou
        troudetect = digitalRead(3); if (troudetect == LOW){ trou=1;}        // Trou 1
        troudetect = digitalRead(4); if (troudetect == LOW){ trou=2;}        // Trou 2
        troudetect = digitalRead(5); if (troudetect == LOW){ trou=3;}        // Trou 3
        troudetect = digitalRead(6); if (troudetect == LOW){ trou=4;}        // Trou 4
        troudetect = digitalRead(7); if (troudetect == LOW){ trou=5;}        // Trou 5
        troudetect = digitalRead(8); if (troudetect == LOW){ trou=6;}        // Trou 6
        troudetect = digitalRead(9); if (troudetect == LOW){ trou=7;}        // Trou 7
        troudetect = digitalRead(10); if (troudetect == LOW){ trou=8;}       // Trou 8
     if (trou != 0 && trou == etape) { Bontrou =1 ; Principale = 0 ;}
     if (trou != 0 && trou != etape) { Badtrou =1 ; Principale = 0 ;}


   
} //----- FIN DE BOUCLE PRINCIPALE

//----------------------------------------------------------BON TROU-----------------------------------
  if (Bontrou == 1) { tm2.blink(); temp = bonus/10; score = score + bonus; tm2.clear(); tm2.setCursor(1, decalage (score)); tm2.print(score);
               etape++; if (etape > 8) {etape=1;} Bontrou =0; Initbarre =1;tm2.blink();strip.clear();strip.show();}  // Retour Initialisation barre

//--------------------------------------------------------MAUVAIS TROU----------------------------------
  if (Badtrou == 1){ for (int i= 0; i<8 ; i++ ) {strip.setPixelColor(i, 230, 0 ,0);  strip.show();}
                 tm2.clear(); tm2.print("OUPS"); tm2.blink();
       
        if (bille == 3) { Gameover = 1;} Debutpartie = 1; Badtrou = 0;}

//----------------------------------------------------------GAME OVER------------------------------------
  if (Gameover == 1) {tm2.clear(); tm2.print("    GAME OVER   YOUR SCORE   "); tm2.clear(); tm2.setCursor(1, decalage (score)); tm2.print(score); delay (1000); tm2.blink(); delay (1000); tm2.clear();
        if ( score > highscore) { highscore = score; tm2.clear(); tm2.print(" NEW"); tm2.blink(); tm2.print("HIGH"); tm2.blink(); tm2.print("SCOR"); tm2.blink(); tm2.clear();}
        Amode = 1; Gameover = 0; Debutpartie = 0; bille = 0; etape = 0; score = 0; temp = 0;}
 

}//----- FIN LOOP


int decalage (int adecaler) {         // Fonction pour trouver decalage des afficheurs *******************
    int decal = 0;
    if ( adecaler <1000){decal = 1;}
    if ( adecaler <100){decal = 2;}
    if ( adecaler <10){decal = 3;}
    return decal;       
}

ɐɹqoƆ‾ɥƃᴉH

Pas mal la vidéo, ça avance bien, par contre désolé pour la remarque mais ton code est particulièrement mal mis en forme et illisible. Tu devrais prendre un petit moment pour le remettre au propre. Ca ne pourra être que bénéfique le jour où tu voudras y remettre les mains dedans.

Quelques conseils à mettre en pratique :
- Ne pas avoir plusieurs instructions sur la même ligne, pour faire simple : un ; = retour à la ligne
- Respecter de façon précise l'indentation : chaque nouvelle structure de contrôle doit avoir son indentation. Une boucle for = un décalage, un If, pareil. Ca te permets très rapidement de voir où commencent et où finissent tes blocs de code.
- Garde une cohérence sur tes noms de variable (1er lettre en majuscule ou pas par exemple) et dans ta façon de coder (espace avant et après les = par exemple) et plein d'autres petits détails.
- Utilise des constante pour tes ports E/S, ça t'évitera le gros rechercher/remplacer si un jour tu veux changer une valeur.

Un exemple de mise en forme de ton code :

//----------------------------------------------------------BON TROU-----------------------------------
  if (Bontrou == 1) { tm2.blink(); temp = bonus/10; score = score + bonus; tm2.clear(); tm2.setCursor(1, decalage (score)); tm2.print(score);
               etape++; if (etape > 8) {etape=1;} Bontrou =0; Initbarre =1;tm2.blink();strip.clear();strip.show();}  // Retour Initialisation barre


//----------------------------------------------------------BON TROU-----------------------------------
if (Bontrou == 1) {
    tm2.blink();
    temp = bonus/10;
    score = score + bonus;
    tm2.clear();
    tm2.setCursor(1, decalage (score));
    tm2.print(score);
    etape++;
    if (etape > 8) {
        etape = 1;
        }
    Bontrou = 0;
    Initbarre = 1;
    tm2.blink();
    strip.clear();
    strip.show();
}  // Retour Initialisation barre

berunours

Citation de: ɐɹqoƆ‾ɥƃᴉH le Dimanche 18 Avril 2021, 19:05:23 PM
Pas mal la vidéo, ça avance bien, par contre désolé pour la remarque mais ton code est particulièrement mal mis en forme et illisible. Tu devrais prendre un petit moment pour le remettre au propre. Ca ne pourra être que bénéfique le jour où tu voudras y remettre les mains dedans.

J'avoue, je suis extrêmement bordélique ! Et pas que niveau code...
Merci pour tes conseils, je vais essayer de m'appliquer, surtout que je veux rendre tout accessible.
Si je n'arrive parfois pas à me relire, j'ose pas imaginer quelqu'un qui chope mon truc au pif :/

kidicarus

très chouette projet ^-^  je suis cela de près
Je cherche une playchoice 10 et une pcb super system nintendo un playfield skateball ; evel knievel

berunours

Dernier jour de congé... J'ai bossé un peu dessus:

J'ai reçu de nouveaux afficheurs plus grands, un arduino mega et mes Df mini player.

Du coup on a câblé le tout, même l'entièreté des capteur infra rouges:



C'est un bordel de câble sans nom...

J'ai codé le son. En gros, on envoie juste l'info "joue telle chanson" au Df player et il se débrouille tout seul.
J'ai aussi essayé de remettre un peu d'ordre dans mon code pour qu'il soit plus lisible. Je n'arrive pas à développer entièrement et n'avoir qu'une seule instruction  par ligne, mais j'essaie de n'avoir qu'un seul type à la fois. Genre:
- les afficheur  // descriptif vite fait
- les leds         //  blablabla
- les opé algo  //  leur rôle

Quand ce sera fini, je ferai ça mieux. Mais déjà, je trouve que je progresse :p


//-------------- LIBRAIRIES ----------------------//****************************************************************

#include <SevenSegmentAsciiMap.h>       //
#include <SevenSegmentExtended.h>       // Librairies pour les afficheurs 4 digits 7 segments
#include <SevenSegmentTM1637.h>         //

#include "Arduino.h"                    //
#include "SoftwareSerial.h"             // Librairies Dfmini
#include "DFRobotDFPlayerMini.h"        //

#include <Adafruit_NeoPixel.h>          // Librairie pour les leds

#include "Arduino.h"                    //
#include "SoftwareSerial.h"             //  Librairie pour le Dfmini
#include "DFRobotDFPlayerMini.h"        //

//-------------- DECLARATION MATOS ---------------//****************************************************************

SevenSegmentTM1637    TM1(24, 22);  //afficheur du BAS déclaration     -- CLK 24 -- DIO 22 --
SevenSegmentTM1637    TM2(28, 26);  //afficheur du CENTRE déclaration  -- CLK 28 -- DIO 26 --
SevenSegmentTM1637    TM3(32, 30);  //afficheur du HAUT déclaration    -- CLK 32 -- DIO 30 --

Adafruit_NeoPixel STRIP(8, 34, NEO_GRBW + NEO_KHZ800);   // Bande led déclaration -- NBR LED 8 -- DIO 34 --

SoftwareSerial mySoftwareSerial(13, 12);     // Dfmini déclaration -- RX 12 -- TX 13 -- DOIVENT ETRES PWR
DFRobotDFPlayerMini myDFPlayer;              //
void printDetail(uint8_t type, int value);   //

//------------- DECLARATION VARIAVLES -------------//***************************************************************

int Latence = 50;                            // Pour gérer le delay de l'arduino (multiple de 50 sinon ce sera la merde !!!!!)
int TempAFF = 0;                              // Temporaire pour les Afficheurs
int TempLED = 0;                              // Temporaire pour les Leds
int TempLEDBRILL = 0; int TempLEDBRILLAD = 0; // Tempoiraire scintillement Leds
int TempBONUS = 0;                            // Tempoiraire décompte bonus

int Highscore = 0;                            // Highscore
int Bille = 0;                                // Bille on bar
int Etape = 0;                                // Trou demandé
int Bonus = 0;                                // Variable bonus
int Score = 0;                                // variable Score

int BTNcredit = 0;                             // Bouton Credit                   


int Amode = 1;        // Boucle ATTRACK MODE
int Debutpartie = 0;  // Initialisation de la partie après le crédit
int Initbarre = 0;    // Pour que les barres aillent chercher une nouvelle bille
int Principale = 0;   // Boucle principale avec bougeage des barres, bonus qui descent, billes qui passent dans un trou etc...
int Trou = 0;         // Trou dans laquelle est tombé la Bille
int BonTrou = 0;      // Boucle Bille dans le bon trou
int BadTrou = 0;      // Boucle Bille dans le mauvais trou
int Gameover = 0;     // Boucle Gamover


void setup() {

    TM1.begin(); TM1.setPrintDelay(500); TM1.clear();                         // Afficheur du BAS initialisation (début / brightness / RAZ)
    TM2.begin(); TM2.setPrintDelay(500); TM2.clear();                         // Afficheur du CENTRE initialisation
    TM3.begin(); TM3.setPrintDelay(500); TM3.clear();                         // Afficheur du HAUT initialisation

    STRIP.begin(); STRIP.clear(); STRIP.show(); STRIP.setBrightness(30);      // Bande led initialisation (début, clear + affichage, brightness)

    mySoftwareSerial.begin(9600); Serial.begin(115200);                       // Dfmini comm serie
    !myDFPlayer.begin(mySoftwareSerial);                                      // Dfmini initialisation
    myDFPlayer.volume(15);                                                    // Dfmini volume (0~30)
   
    pinMode (36, INPUT_PULLUP);                                               // Bouton Crédit en PULLUP -- PIN 36 --

    pinMode(23, INPUT);    // Mauvais Trou
    pinMode(43, INPUT);    // Trou 1
    pinMode(41, INPUT);    // Trou 2
    pinMode(39, INPUT);    // Trou 3
    pinMode(37, INPUT);    // Trou 4
    pinMode(35, INPUT);    // Trou 5
    pinMode(33, INPUT);    // Trou 6
    pinMode(31, INPUT);    // Trou 7
    pinMode(29, INPUT);    // Trou 8
    pinMode(27, INPUT);    // Trou 9
    pinMode(25, INPUT);    // Trou 10


Serial.begin(9600);    //Pour la console

}

void loop() {

delay(Latence);      // millisecondes de mise a jour de la boucle


//--------------------------------------------------- ATTRACK MODE -------------------------------------------------
  if (Amode == 1){ 
     
     BTNcredit = digitalRead(36);                                                                   // Verif si boutton coin est appuyé
          if (BTNcredit == LOW) { Amode =  0; Debutpartie = 1; Etape = 1;                           // Sortie d'Attrack mode et Debut de Partie
                                  myDFPlayer.playMp3Folder(6);                                      // Dfmini SON pièce qui tombe
                                  delay(1000);                                                      //
                                  TM1.clear(); TM2.clear();TM3.clear();                             // On efface les Afficheurs
                                  STRIP.clear(); STRIP.show(); STRIP.setBrightness(30);             // RAZ valeurs Bandes LEDs
                                  TempLEDBRILL = 0; TempLEDBRILLAD = 5; TempAFF = 0; TempLED = 0;}  // RAZ Valeurs Tempo   

     
     TempAFF++; int TempAFF2 = TempAFF * Latence;
        switch (TempAFF2) {                                                // Faire defiler text ecran du bas
          case (1000): TM1.clear(); TM1.print("PLAY"); break;
          case (2000): TM1.clear(); TM1.print("ICE"); break;
          case (3000): TM1.clear(); TM1.print("COLD"); break;
          case (4000): TM1.clear(); TM1.print("BEER"); break;
          case (5000): TM1.clear(); break;
          case (6000): TM1.clear(); TM1.setCursor(1, DECALAGE (Highscore)); TM1.print(Highscore); TempAFF = 0;  break;}
           
     TempLED++; 
         if ( TempLED <= 10 ) { STRIP.setBrightness(60);STRIP.setPixelColor(TempLED, 240, 240, 20); STRIP.setPixelColor(TempLED-1, 130, 130, 50);  STRIP.show();}
         if ( TempLED > 10 && TempLED <= 20 ){ STRIP.setPixelColor(TempLED-12, 0, 0, 0);  STRIP.show(); }
         if ( TempLED > 20 && TempLED <= 30 ){ STRIP.setPixelColor(TempLED-20, 240, 240, 20); STRIP.setPixelColor(TempLED-21, 130, 130, 50); STRIP.setPixelColor(TempLED-22, 0, 0, 0);  STRIP.show(); }
         if ( TempLED >= 30 && TempLED <= 40 ){ STRIP.setPixelColor(TempLED-32, 130, 130, 50);  STRIP.show();}
         if ( TempLED >= 50 && TempLED <= 60 ){ STRIP.setPixelColor(TempLED-52, 0, 0, 0);  STRIP.show(); }
         if ( TempLED == 60 ){ for (int i= 0; i<8; i++ ) {TempLEDBRILL = 20; STRIP.setBrightness(TempLEDBRILL); STRIP.setPixelColor(i, 230, 230 ,230);  STRIP.show(); TempLEDBRILLAD=10;}}
         if ( TempLED > 60 && TempLED <=180) {TempLEDBRILL = TempLEDBRILL + TempLEDBRILLAD ; STRIP.setBrightness(TempLEDBRILL);  STRIP.show(); if (TempLEDBRILL >70 || TempLEDBRILL < 20){TempLEDBRILLAD=-TempLEDBRILLAD;} }
         if ( TempLED == 180 ){ for (int i= 0; i<8; i++ ) {TempLEDBRILL = 20; STRIP.setBrightness(TempLEDBRILL); STRIP.setPixelColor(i, 0, 0 ,0);  STRIP.show();}}
         if (TempLED >= 200) { TempLED=0;}


  } //----- FIN DE ATTRACK MODE

//--------------------------------------------------- DEBUT DE PARTIE ---------------------------------
  if (Debutpartie == 1){ Bille++; Debutpartie =0; Initbarre = 1;                         // Sortie Debut de Partie vers Initialisation des barres
                         TM3.clear(); TM3.print(Bille);                                             // Affichage Bille on barre
                         STRIP.clear();STRIP.setPixelColor(Etape-1, 240, 240, 20);STRIP.show();}    // Allumage LED trou demandé

//----------------------------------------- INITIALISATION DES BARRES ET BONUS ------------------------
 
  if (Initbarre ==1){ Bonus = Etape *100; TM2.clear(); TM2.setCursor(1, DECALAGE (Bonus)); TM2.print(Bonus);  // Affichage Bonus
                      TM1.clear(); TM1.setCursor(1, DECALAGE (Score)); TM1.print(Score);                      // Affichage Score
                      myDFPlayer.playMp3Folder(1);                                                            // Dfmini SON Debut de partie               
                      delay (5000);                                               //--- <><><><><> --- Attendre que lesw barres prennent la bille
                     
                      Initbarre = 0; Principale = 1; TempBONUS = 0;}                                          // Sortie Initialisation barres vers Principale

//----------------------------------------------------BOUCLE PRINCIPALE--------------------------------

if (Principale == 1) { delay(Latence);  // Delais (latence voulu)
       
        TempBONUS++; if (TempBONUS > (2000/Latence) && Bonus > 0) {Bonus = Bonus - 10;              // Décompte Bonus
                         myDFPlayer.playMp3Folder(5);                                               // Dfmini Bonus -10
                         TM2.clear(); TM2.setCursor(1, DECALAGE (Bonus)); TM2.print(Bonus);         //
                         TempBONUS = 0;}
                         //
        TempLEDBRILL = TempLEDBRILL + TempLEDBRILLAD;
        STRIP.setBrightness(TempLEDBRILL); STRIP.setPixelColor(Etape-1, 240, 240, 20); 
        STRIP.show();
                     if (TempLEDBRILL >70 ){TempLEDBRILLAD=-10;};
                     if (TempLEDBRILL <10 ){TempLEDBRILLAD= 10;}
       
        //-----Detection du Trou

     int Troudetect = 0; Trou=0;
         Troudetect = digitalRead(23); if (Troudetect == LOW){ Trou=20;}       // Mauvais Trou
         Troudetect = digitalRead(43); if (Troudetect == LOW){ Trou=1;}        // Trou 1
         Troudetect = digitalRead(41); if (Troudetect == LOW){ Trou=2;}        // Trou 2
         Troudetect = digitalRead(39); if (Troudetect == LOW){ Trou=3;}        // Trou 3
         Troudetect = digitalRead(37); if (Troudetect == LOW){ Trou=4;}        // Trou 4
         Troudetect = digitalRead(35); if (Troudetect == LOW){ Trou=5;}        // Trou 5
         Troudetect = digitalRead(33); if (Troudetect == LOW){ Trou=6;}        // Trou 6
         Troudetect = digitalRead(31); if (Troudetect == LOW){ Trou=7;}        // Trou 7
         Troudetect = digitalRead(29); if (Troudetect == LOW){ Trou=8;}        // Trou 8
         Troudetect = digitalRead(27); if (Troudetect == LOW){ Trou=9;}        // Trou 9
         Troudetect = digitalRead(25); if (Troudetect == LOW){ Trou=10;}       // Trou 10
     
     if (Trou != 0 && Trou == Etape) { BonTrou =1 ; Principale = 0 ;}          // Bille tombé dans le Bon Trou      :D
     if (Trou != 0 && Trou != Etape) { BadTrou =1 ; Principale = 0 ;}          // Bille tombé dans le Mauvais Trou  :(


   
} //----- FIN DE BOUCLE PRINCIPALE

//----------------------------------------------------------BON Trou-----------------------------------
  if (BonTrou == 1) {
               myDFPlayer.playMp3Folder(3);                                             // Dfmini SON Bon trou
               TM2.blink(); TempBONUS = Bonus/10;
               for ( int i=0; i < TempBONUS; i++){                                      // Décompte du bonus
                   Bonus= Bonus -10; Score = Score +10;
                   myDFPlayer.playMp3Folder(4); delay (200- (i));                     // Dfmini SON Bonus decompte         
                   TM2.clear(); TM2.setCursor(1, DECALAGE (Bonus)); TM2.print(Bonus);   // Affichage Bonus
                   TM1.clear(); TM1.setCursor(1, DECALAGE (Score)); TM1.print(Score);}  // Affichage Score
               
               Etape++; if (Etape > 10) {Etape=1;} BonTrou =0; Initbarre =1;TM1.blink();STRIP.clear();STRIP.show();}  // Retour Initialisation barre

//--------------------------------------------------------MAUVAIS Trou----------------------------------
  if (BadTrou == 1){
          for (int i= 0; i<10; i++ ) {STRIP.setPixelColor(i, 230, 0 ,0);  STRIP.show();}                     // LEDS en Rouge
             TM3.clear(); TM3.print("-"); TM2.clear(); TM2.print("----"); TM1.clear(); TM1.print("OUPS");    // OUPS Message
             myDFPlayer.playMp3Folder(9);                                                                    // Dfmini SON Mauvais trou
             delay (3000);                                                                                   
          if (Bille == 3) { Gameover = 1;}                                                                   // Verif si GAME OVER
          Debutpartie = 1; BadTrou = 0;}                                                                     // Retour debut de partie

//----------------------------------------------------------GAME OVER------------------------------------
  if (Gameover == 1) { myDFPlayer.playMp3Folder(8);                                                          // Dfmini SON GAME OVER
             TM1.clear(); TM2.clear(); TM3.clear();
             TM1.print("    GAME OVER   YOUR Score   ");
             TM1.clear(); TM1.setCursor(1, DECALAGE (Score)); TM1.print(Score); delay (500);
             TM2.blink(); delay (1000); TM1.clear();
        if ( Score > Highscore) { Highscore = Score;
              TM1.clear(); TM1.print(" NEW"); TM1.blink(); TM1.print("HIGH"); TM1.blink(); TM1.print("SCOR"); TM1.blink(); TM1.clear();}
     Amode = 1; Gameover = 0; Debutpartie = 0; Bille = 0; Etape = 0; Score = 0;}
 
Serial.println (Trou);
//printDetail(myDFPlayer.readType(), myDFPlayer.read());

}//----- FIN LOOP




// Fonction pour trouver decalage des afficheurs *******************

int DECALAGE (int Adecaler) {         
    int Decal = 0;
    if ( Adecaler <1000){Decal = 1;}
    if ( Adecaler <100){Decal = 2;}
    if ( Adecaler <10){Decal = 3;}
    return Decal;       
}

// Fonction Comm Dfmini ************************ *******************

void printDetail(uint8_t type, int value){
  switch (type) {
    case TimeOut: Serial.println(F("Time Out!")); break;
    case WrongStack: Serial.println(F("Stack Wrong!")); break;
    case DFPlayerCardInserted: Serial.println(F("Card Inserted!")); break;
    case DFPlayerCardRemoved: Serial.println(F("Card Removed!")); break;
    case DFPlayerCardOnline: Serial.println(F("Card Online!")); break;
    case DFPlayerUSBInserted: Serial.println("USB Inserted!"); break;
    case DFPlayerUSBRemoved: Serial.println("USB Removed!"); break;
    case DFPlayerPlayFinished: Serial.print(F("Number:")); Serial.print(value); Serial.println(F(" Play Finished!")); break;
    case DFPlayerError: Serial.print(F("DFPlayerError:"));
    switch (value) {
        case Busy: Serial.println(F("Card not found")); break;
        case Sleeping: Serial.println(F("Sleeping")); break;
        case SerialWrongStack: Serial.println(F("Get Wrong Stack")); break;
        case CheckSumNotMatch: Serial.println(F("Check Sum Not Match")); break;
        case FileIndexOut: Serial.println(F("File Index Out of Bound")); break;
        case FileMismatch: Serial.println(F("Cannot Find File")); break;
        case Advertise: Serial.println(F("In Advertise")); break;
        default: break;
     }
      break; default: break;
  }
}


Du coup, j'vous ai fait une petite vidéo. Comme ma femme faisait la sieste pas loin, je n'ai pas pu dire grand chose mais je vous ai mis des sous-titres pour que ce soit plus claire.
Pareil, le Df mini est réglé à 40 % de son volume max et le haut parleur est branché en direct. Pour la version final, je passerai peut-être par un petit ampli histoire d'avoir un son plus audible.

https://www.youtube.com/watch?v=0akng-y6Kwk

Pour les sons, je me suis fourni chez sushy18, après les avoir isolé, ils rendent pas trop mal. Je suppose qu'il y a encore un peu de travail à faire de ce côté là.

Prochaine étape: commander des moteurs... Je vais faire ça dans la semaine. Si tout va bien, je m'y remets pour le pont du 13 mai.

APPLE//C


Little_Rabbit

Salut,

Ça prend sacrément forme !  ^-^

Citation de: berunours le Dimanche 02 Mai 2021, 19:01:49 PM
C'est un bordel de câbles sans nom...

Tu trouves ?? Au contraire, je trouve qu'avec les solutions "modernes" que tu as adoptées, le câblage est plutôt optimisé 8). Une Ice Cold Beer originale doit avoir un paquet de fils en plus je pense ! :)

Ton code a vachement gagné en clarté !  ^-

J'entends déjà les "Ah je vous ai battu, à vous de payer la tournée !" :D

A+
Recherche bornes dédiées ou PCB originaux: Miss Pacman, Dig Dug, Galaga, Mappy, Asteroids, Battlezone, Missile Command, Tempest, Star Wars, Donkey Kong (+ Jr), Mario Bros, Moon Patrol, Defender, Joust, Frogger, Gyruss, Pooyan, Space Tactics, Zaxxon, etc. Flip : Gottlieb des années 80 (Spirit, Amazon Hunt, ...), Baby Pac Man. Divers :  Ice Cold Beer => Trois fois rien quoi ! :D
Ma séance sur le divan : c'est grave Docteur ? :-\
Ma gaming room, ma storage room

sushy18

#24
Bravo !!!  ^-^ même si je suis un poil jaloux  ::) :D
je note l'excellent travail.
vraiment  top !

suggestion : le décompte de points peut être un peu accéléré ?


au passage je suis le travail d'un turc sur Facebook ( son origine en s'en bat les reins c'est surtout qu'il publie en turc  (:x )
Milker Ulucay  ;)
Il vend des bornes inspirées de ICB et Zeke's peak



je l'ai tellement saoulé avec mes questions  et avec beaucoup d'humour qu'il m'a fait une proposition de design:

puis dit travailler sur :


déja en v3.0  :o ^-


ce que je trouve surtout intéressant c'est son system, un peu différent de l'ICB  pour monter et descendre le coté de la barre:
il ne s'est pas fait chié de barres verticales  et me semble adapté pour un format mini :





Si tu ne sais pas demande, si tu sais partage !!
Faudrait pas perdre de vue qu'une borne d'arcade c'est pas une console, c'est rarement plug n play, plus souvent plug n pschitt... (Funkycochise 2008)
"Gratuit ? C'est déjà trop cher !!" ( Crying Freeman 2016)

berunours

#25
Citation de: sushy18 le Jeudi 06 Mai 2021, 08:31:47 AM
Bravo !!!  ^-^ même si je suis un poil jaloux  ::) :D
je note l'excellent travail.
vraiment  top !
Merci, mais sans ton taf de défrichage, rien n'aurait été possible.
J'suis très motivé a essayer de te permettre de finir ton projet. J''espère au moins te faire avancer, notamment sur le code qui devrait pouvoir facilement se transposer sur la tienne.
Citation de: sushy18 le Jeudi 06 Mai 2021, 08:31:47 AM
suggestion : le décompte de points peut être un peu accéléré ?
Je viens de le ralentir car les sons "merdouillaient" un peu, mais je vais corriger ça.

Citation de: sushy18 le Jeudi 06 Mai 2021, 08:31:47 AM
au passage je suis le travail d'un turc sur Facebook ( son origine en s'en bat les reins c'est surtout qu'il publie en turc  (:x )
Milker Ulucay  ;)
Il vend des bornes inspirées de ICB et Zeke's peak

https://gamoovernet.pixhotel.fr/pics_gamoovernet890px/20210506084105-sushy18-177013513-271449394712220-2671097409251752953-n.jpg
https://gamoovernet.pixhotel.fr/pics_gamoovernet890px/20210506084142-sushy18-173900417-285779893127687-3507596279168130928-n.jpg
je l'ai tellement saoulé avec mes questions  et avec beaucoup d'humour qu'il m'a fait une proposition de design:
https://gamoovernet.pixhotel.fr/pics_gamoovernet890px/20210506084913-sushy18-179783792-1155678471562411-8002074352329338532-n.jpg
puis dit travailler sur :
https://gamoovernet.pixhotel.fr/pics_gamoovernet890px/20210506084317-sushy18-180829543-10223201473117879-8027998242673347509-n.jpg

déja en v3.0  :o ^-


ce que je trouve surtout intéressant c'est son system, un peu différent de l'ICB  pour monter et descendre le coté de la barre:
il ne s'est pas fait chié de barres verticales  et me semble adapté pour un format mini :



J'avoue, sa solution est très élégante, elle a l'aire parfaitement jouable. Je risque de la copier m'en inspirer fortement  ;)
J'avais déjà prévu d'utiliser des moteurs type Nema 17 et des poulies / courroies GT2. Mais ma réflexion se portait sur un système beaucoup compliqué à mettre en place.
Là, je vais gagner énormément de temps, je suis joie !

Ps: je viens de recevoir mes moteurs, je vais surement essayer de les faire fonctionner ce week-end.

ɐɹqoƆ‾ɥƃᴉH

Sinon, toujours avec des moteurs pas à pas, tu peux aussi t'inspirer des axes Z des imprimantes 3D, ça peut faire une bonne base de travail.

berunours

Citation de: ɐɹqoƆ‾ɥƃᴉH le Jeudi 06 Mai 2021, 13:55:57 PM
Sinon, toujours avec des moteurs pas à pas, tu peux aussi t'inspirer des axes Z des imprimantes 3D, ça peut faire une bonne base de travail.
J'étais parti sur ça au départ, mais je pense que ce sera trop lent.
Ce qu'a fait notre confrère Milker Ulucay est tellement simple et efficace que je me sens un peu bête de ne pas y avoir pensé plus tôt.

-fab-

Sur le système de  Milker Ulucay , c'est le code qui gère la fin de course pour pas que le support de la  barre vienne en butée sur l'axe du moteur ou la poulie ?
Gottlieb Diamond Lady | Gottlieb Génésis | Williams Aces & Kings | Séga Blast City | Occulus Rift

Little_Rabbit

Salut,

En Googlant rapidement, je suis tombé sur cette vidéo intéressante de WIP car on voit dans le détail comment est foutu le système de poulies et entraînement de la barre sur l'original Taito (avec un bel accent Québécois en prime :) ):



(par contre, il bouge tellement sa caméra dans tous les sens que ça peut limite donner la gerbe à la longue ! :-\)

Et si j'ai bien compris, il utilise du tube de lave-glace en guise de courroie !  :o

@berunours : que penses-tu prendre pour la barre télescopique sur laquelle la bille roule ?

A+
Recherche bornes dédiées ou PCB originaux: Miss Pacman, Dig Dug, Galaga, Mappy, Asteroids, Battlezone, Missile Command, Tempest, Star Wars, Donkey Kong (+ Jr), Mario Bros, Moon Patrol, Defender, Joust, Frogger, Gyruss, Pooyan, Space Tactics, Zaxxon, etc. Flip : Gottlieb des années 80 (Spirit, Amazon Hunt, ...), Baby Pac Man. Divers :  Ice Cold Beer => Trois fois rien quoi ! :D
Ma séance sur le divan : c'est grave Docteur ? :-\
Ma gaming room, ma storage room

berunours

#30
Citation de: -fab- le Jeudi 06 Mai 2021, 18:12:40 PM
Sur le système de  Milker Ulucay , c'est le code qui gère la fin de course pour pas que le support de la  barre vienne en butée sur l'axe du moteur ou la poulie ?
Pour le haut, oui surement, avec les moteurs pas à pas, tu peux savoir précisément de combien ils se sont déplacés.
Par contre, tu dois forcément (selon moi) avoir une info de l'origine (ou d'un repère quelconque) quelque part. Je ne sais pas trop comment il fait :/

EDIT:
Il y a bien 2 capteur en bas pour la position "origine" des barres:



Citation de: Little_Rabbit le Jeudi 06 Mai 2021, 18:54:12 PM
Salut,

En Googlant rapidement, je suis tombé sur cette vidéo intéressante de WIP car on voit dans le détail comment est foutu le système de poulies et entraînement de la barre sur l'original Taito (avec un bel accent Québécois en prime :) ):

youtube.com/watch?v=3SlB4BfR14s

(par contre, il bouge tellement sa caméra dans tous les sens que ça peut limite donner la gerbe à la longue ! :-\)

Et si j'ai bien compris, il utilise du tube de lave-glace en guise de courroie !  :o

@berunours : que penses-tu prendre pour la barre télescopique sur laquelle la bille roule ?

A+

J'ai épluché toutes ses vidéos sur la ICB, idem pour la Hangon d'ailleurs... J'ai hate de vois la suite de sa Space harrier.

Je n'ai pas trop encore réfléchi à la barre sur laquelle la bille roule. J'pensais à la base avoir du bol en trouvant une barre pleine de 6mm qui rentrerai pile poil dans un tube creux de 8mm. J'ai même envisager prendre des mini tringles a rideau télescopique qui se fixent sur les fenêtre PVC  ;D

Ce que je trouve génial justement avec le système de Milker Ulucay, c'est quelle n'a pas besoin d'être télescopique.
En fixant la barre directement sur les courroies, on a suffisamment de jeu pour éviter d'avoir a gérer la longueur de la barre.
Et vue qu'on utilise des stepper motor (pas à pas), on peut limiter leur différence de hauteur (par le code) et éviter d'avoir une barre avec 2 point de fixation trop loin.

D'ailleurs, voila ces petits machins tout mignons et qui vont surement bien m'embêter ce week-end avant que j'arrive à les faire fonctionner correctement ...




berunours

Mise a jour:

J'ai fini par me motiver à intégrer les moteurs...
Pour l'instant 1 seul avec un A4988 pour le driver et un contacteur fin de course pour la position basse. Le tout sera doublé prochainement.

Petite vidéo de mon taf d'aujourd'hui:

https://www.youtube.com/watch?v=Cx7XQeghxhs

Niveau code, c'est un peu chiant... Je vais devoir jongler au niveau du delay de ma boucle principale.
En gros, j'ai normalement un delay (une pause) de 50 millisecondes dans ma boucle principale afin d'éviter d'avoir un truc ultra speed qui finisse par merdouiller.
Maintenant, quand un moteur bougera, je devrais le faire sauter afin d'avoir des mouvement smouth des moteur (éviter les à-coups).
Ca va m'obliger à faire plein de calculs avec des microsecondes / millisecondes le tout en fonction de la latence choisie pour le programe.
Du coup, comme c'est l'heure de l'apéro, je mets ça de côté.

L'état actuel du code (un peu brut au niveau du moteur):


//-------------- LIBRAIRIES ----------------------//****************************************************************

#include <SevenSegmentAsciiMap.h>       //
#include <SevenSegmentExtended.h>       // Librairies pour les afficheurs 4 digits 7 segments
#include <SevenSegmentTM1637.h>         //

#include "Arduino.h"                    //
#include "SoftwareSerial.h"             // Librairies Dfmini
#include "DFRobotDFPlayerMini.h"        //

#include <Adafruit_NeoPixel.h>          // Librairie pour les leds


//-------------- DECLARATION MATOS ---------------//****************************************************************

SevenSegmentTM1637    TM1(24, 22);  //afficheur du BAS déclaration     -- CLK 24 -- DIO 22 --
SevenSegmentTM1637    TM2(28, 26);  //afficheur du CENTRE déclaration  -- CLK 28 -- DIO 26 --
SevenSegmentTM1637    TM3(32, 30);  //afficheur du HAUT déclaration    -- CLK 32 -- DIO 30 --

Adafruit_NeoPixel STRIP(8, 34, NEO_GRBW + NEO_KHZ800);   // Bande led déclaration -- NBR LED 8 -- DIO 34 --

SoftwareSerial mySoftwareSerial(13, 12);     // Dfmini déclaration -- RX 12 -- TX 13 -- DOIVENT ETRES PWR
DFRobotDFPlayerMini myDFPlayer;              //
void printDetail(uint8_t type, int value);   //

//------------- DECLARATION VARIAVLES -------------//***************************************************************

int Latence = 50;                             // Pour gérer le delay de l'arduino (multiple de 50 sinon ce sera la merde !!!!!)
int TempAFF = 0;                              // Temporaire pour les Afficheurs
int TempLED = 0;                              // Temporaire pour les Leds
int TempLEDBRILL = 0; int TempLEDBRILLAD = 0; // Tempoiraire scintillement Leds
int TempBONUS = 0;                            // Tempoiraire décompte bonus

int Highscore = 0;                            // Highscore
int Bille = 0;                                // Bille on bar
int Etape = 0;                                // Trou demandé
int Bonus = 0;                                // Variable bonus
int Score = 0;                                // variable Score

int BTNcredit = 0;                            // Bouton Credit                   

const int stepPinMotor1 = 5;                  // Step Moteur 1 -- PIN 5 --
const int dirPinMotor1 = 4;                   // Direction Moteur 1 -- PIN 4 --
int Motor1Bouge = 0;

int Amode = 1;        // Boucle ATTRACK MODE
int Debutpartie = 0;  // Initialisation de la partie après le crédit
int Initbarre = 0;    // Initialisation Bonus et partie
int DescenteBarre = 0;// Pour que les barres aillent chercher une nouvelle bille
int MonteBarre = 0;   // Pour que les barres remonteent
int Principale = 0;   // Boucle principale avec bougeage des barres, bonus qui descent, billes qui passent dans un trou etc...
int Trou = 0;         // Trou dans laquelle est tombé la Bille
int BonTrou = 0;      // Boucle Bille dans le bon trou
int BadTrou = 0;      // Boucle Bille dans le mauvais trou
int Gameover = 0;     // Boucle Gamover


void setup() {

    TM1.begin(); TM1.setPrintDelay(500); TM1.clear();                         // Afficheur du BAS initialisation (début / brightness / RAZ)
    TM2.begin(); TM2.setPrintDelay(500); TM2.clear();                         // Afficheur du CENTRE initialisation
    TM3.begin(); TM3.setPrintDelay(500); TM3.clear();                         // Afficheur du HAUT initialisation

    STRIP.begin(); STRIP.clear(); STRIP.show(); STRIP.setBrightness(30);      // Bande led initialisation (début, clear + affichage, brightness)

    mySoftwareSerial.begin(9600); Serial.begin(115200);                       // Dfmini comm serie
    !myDFPlayer.begin(mySoftwareSerial);                                      // Dfmini initialisation
    myDFPlayer.volume(15);                                                    // Dfmini volume (0~30)
   
    pinMode (36, INPUT_PULLUP);                                               // Bouton Crédit en PULLUP -- PIN 36 --

    pinMode(stepPinMotor1,OUTPUT);                                            // Step Moteur 1
    pinMode(dirPinMotor1,OUTPUT);                                             // Direction Moteur 1
    pinMode (38, INPUT_PULLUP);                                               // Fin de course bas Moteur 1 -- PIN 38 --

    pinMode(23, INPUT);    // Mauvais Trou
    pinMode(43, INPUT);    // Trou 1
    pinMode(41, INPUT);    // Trou 2
    pinMode(39, INPUT);    // Trou 3
    pinMode(37, INPUT);    // Trou 4
    pinMode(35, INPUT);    // Trou 5
    pinMode(33, INPUT);    // Trou 6
    pinMode(31, INPUT);    // Trou 7
    pinMode(29, INPUT);    // Trou 8
    pinMode(27, INPUT);    // Trou 9
    pinMode(25, INPUT);    // Trou 10


Serial.begin(9600);    //Pour la console

}

void loop() {

if (Motor1Bouge == 0) {delay(Latence);}      // millisecondes de mise a jour de la boucle si moteurs immobiles


//--------------------------------------------------- ATTRACK MODE -------------------------------------------------
  if (Amode == 1){ 
     
     BTNcredit = digitalRead(36);                                                                   // Verif si boutton coin est appuyé
          if (BTNcredit == LOW) { Amode =  0; Debutpartie = 1; Etape = 1;                           // Sortie d'Attrack mode et Debut de Partie
                                  myDFPlayer.playMp3Folder(6);                                      // Dfmini SON pièce qui tombe
                                  delay(1000);                                                      //
                                  TM1.clear(); TM2.clear();TM3.clear();                             // On efface les Afficheurs
                                  STRIP.clear(); STRIP.show(); STRIP.setBrightness(30);             // RAZ valeurs Bandes LEDs
                                  TempLEDBRILL = 0; TempLEDBRILLAD = 5; TempAFF = 0; TempLED = 0;}  // RAZ Valeurs Tempo   

     
     TempAFF++; int TempAFF2 = TempAFF * Latence;
        switch (TempAFF2) {                                                // Faire defiler text ecran du bas
          case (1000): TM1.clear(); TM1.print("PLAY"); break;
          case (2000): TM1.clear(); TM1.print("ICE"); break;
          case (3000): TM1.clear(); TM1.print("COLD"); break;
          case (4000): TM1.clear(); TM1.print("BEER"); break;
          case (5000): TM1.clear(); break;
          case (6000): TM1.clear(); TM1.setCursor(1, DECALAGE (Highscore)); TM1.print(Highscore); TempAFF = 0;  break;}
           
     TempLED++; 
         if ( TempLED <= 10 ) { STRIP.setBrightness(60);STRIP.setPixelColor(TempLED, 240, 240, 20); STRIP.setPixelColor(TempLED-1, 130, 130, 50);  STRIP.show();}
         if ( TempLED > 10 && TempLED <= 20 ){ STRIP.setPixelColor(TempLED-12, 0, 0, 0);  STRIP.show(); }
         if ( TempLED > 20 && TempLED <= 30 ){ STRIP.setPixelColor(TempLED-20, 240, 240, 20); STRIP.setPixelColor(TempLED-21, 130, 130, 50); STRIP.setPixelColor(TempLED-22, 0, 0, 0);  STRIP.show(); }
         if ( TempLED >= 30 && TempLED <= 40 ){ STRIP.setPixelColor(TempLED-32, 130, 130, 50);  STRIP.show();}
         if ( TempLED >= 50 && TempLED <= 60 ){ STRIP.setPixelColor(TempLED-52, 0, 0, 0);  STRIP.show(); }
         if ( TempLED == 60 ){ for (int i= 0; i<8; i++ ) {TempLEDBRILL = 20; STRIP.setBrightness(TempLEDBRILL); STRIP.setPixelColor(i, 230, 230 ,230);  STRIP.show(); TempLEDBRILLAD=10;}}
         if ( TempLED > 60 && TempLED <=180) {TempLEDBRILL = TempLEDBRILL + TempLEDBRILLAD ; STRIP.setBrightness(TempLEDBRILL);  STRIP.show(); if (TempLEDBRILL >70 || TempLEDBRILL < 20){TempLEDBRILLAD=-TempLEDBRILLAD;} }
         if ( TempLED == 180 ){ for (int i= 0; i<8; i++ ) {TempLEDBRILL = 20; STRIP.setBrightness(TempLEDBRILL); STRIP.setPixelColor(i, 0, 0 ,0);  STRIP.show();}}
         if (TempLED >= 200) { TempLED=0;}


  } //----- FIN DE ATTRACK MODE

//--------------------------------------------------- DEBUT DE PARTIE ---------------------------------
  if (Debutpartie == 1){ Bille++; Debutpartie =0; Initbarre = 1;                         // Sortie Debut de Partie vers Initialisation des barres
                         TM3.clear(); TM3.print(Bille);                                             // Affichage Bille on barre
                         STRIP.clear();STRIP.setPixelColor(Etape-1, 240, 240, 20);STRIP.show();}    // Allumage LED trou demandé

//----------------------------------------- INITIALISATION DES BARRES ET BONUS ------------------------
 
  if (Initbarre ==1){ Bonus = Etape *100; TM2.clear(); TM2.setCursor(1, DECALAGE (Bonus)); TM2.print(Bonus);  // Affichage Bonus
                      TM1.clear(); TM1.setCursor(1, DECALAGE (Score)); TM1.print(Score);                      // Affichage Score
                      Initbarre = 0; DescenteBarre = 1; TempBONUS = 0;}                                       // Sortie Initialisation barres vers DescenteBarre

//-------------------------------------------------- DESCENTE DES BARRES ------------------------------
  if (DescenteBarre ==1){
          digitalWrite(dirPinMotor1,HIGH);                                            // Direction Moteur 1 vers le bas
          int ConFinDeCourse1 = digitalRead(38);                                      // Lecteur Contacteur Fin de course Moteur 1
             if (ConFinDeCourse1 == HIGH) {
                      Motor1Bouge = 1;                                                // Pour faire sauter le delais de la boucle principale
                      digitalWrite(stepPinMotor1,HIGH);
                      delayMicroseconds(500);
                      digitalWrite(stepPinMotor1,LOW);
                      delayMicroseconds(500); }               

                     
              if (ConFinDeCourse1 == LOW) {
                      Motor1Bouge = 0;               
                      myDFPlayer.playMp3Folder(1);                                    // Dfmini SON Debut de partie   
                      DescenteBarre = 0; MonteBarre = 1;}}                            // Sortie DescenteBarre barres vers MonteBarre

//-------------------------------------------------- MONTE DES BARRES ------------------------------
  if (MonteBarre ==1){
           digitalWrite(dirPinMotor1,LOW);                                           // Direction Moteur 1 vers le bas
                      for (int i = 0 ; i < 3000; i++) {
                        digitalWrite(stepPinMotor1,HIGH);
                        delayMicroseconds(700);
                        digitalWrite(stepPinMotor1,LOW);
                        delayMicroseconds(700); }   
                     
                      MonteBarre = 0; Principale = 1;}                               // Sortie MonteBarre barres vers Principale

//----------------------------------------------------BOUCLE PRINCIPALE--------------------------------

if (Principale == 1) { delay(Latence);  // Delais (latence voulu)
       
        TempBONUS++; if (TempBONUS > (2000/Latence) && Bonus > 0) {Bonus = Bonus - 10;              // Décompte Bonus
                         myDFPlayer.playMp3Folder(5);                                               // Dfmini Bonus -10
                         TM2.clear(); TM2.setCursor(1, DECALAGE (Bonus)); TM2.print(Bonus);         //
                         TempBONUS = 0;}
                         //
        TempLEDBRILL = TempLEDBRILL + TempLEDBRILLAD;
        STRIP.setBrightness(TempLEDBRILL); STRIP.setPixelColor(Etape-1, 240, 240, 20); 
        STRIP.show();
                     if (TempLEDBRILL >70 ){TempLEDBRILLAD=-10;};
                     if (TempLEDBRILL <10 ){TempLEDBRILLAD= 10;}
       
        //-----Detection du Trou

     int Troudetect = 0; Trou=0;
         Troudetect = digitalRead(23); if (Troudetect == LOW){ Trou=20;}       // Mauvais Trou
         Troudetect = digitalRead(43); if (Troudetect == LOW){ Trou=1;}        // Trou 1
         Troudetect = digitalRead(41); if (Troudetect == LOW){ Trou=2;}        // Trou 2
         Troudetect = digitalRead(39); if (Troudetect == LOW){ Trou=3;}        // Trou 3
         Troudetect = digitalRead(37); if (Troudetect == LOW){ Trou=4;}        // Trou 4
         Troudetect = digitalRead(35); if (Troudetect == LOW){ Trou=5;}        // Trou 5
         Troudetect = digitalRead(33); if (Troudetect == LOW){ Trou=6;}        // Trou 6
         Troudetect = digitalRead(31); if (Troudetect == LOW){ Trou=7;}        // Trou 7
         Troudetect = digitalRead(29); if (Troudetect == LOW){ Trou=8;}        // Trou 8
         Troudetect = digitalRead(27); if (Troudetect == LOW){ Trou=9;}        // Trou 9
         Troudetect = digitalRead(25); if (Troudetect == LOW){ Trou=10;}       // Trou 10
     
     if (Trou != 0 && Trou == Etape) { BonTrou =1 ; Principale = 0 ;}          // Bille tombé dans le Bon Trou      :D
     if (Trou != 0 && Trou != Etape) { BadTrou =1 ; Principale = 0 ;}          // Bille tombé dans le Mauvais Trou  :(


   
} //----- FIN DE BOUCLE PRINCIPALE

//----------------------------------------------------------BON Trou-----------------------------------
  if (BonTrou == 1) {
               myDFPlayer.playMp3Folder(3);                                             // Dfmini SON Bon trou
               TM2.blink(); TempBONUS = Bonus/10;
               for ( int i=0; i < TempBONUS; i++){                                      // Décompte du bonus
                   Bonus= Bonus -10; Score = Score +10;
                   myDFPlayer.playMp3Folder(4); delay (200- (i));                     // Dfmini SON Bonus decompte         
                   TM2.clear(); TM2.setCursor(1, DECALAGE (Bonus)); TM2.print(Bonus);   // Affichage Bonus
                   TM1.clear(); TM1.setCursor(1, DECALAGE (Score)); TM1.print(Score);}  // Affichage Score
               
               Etape++; if (Etape > 10) {Etape=1;} BonTrou =0; Initbarre =1;TM1.blink();STRIP.clear();STRIP.show();}  // Retour Initialisation barre

//--------------------------------------------------------MAUVAIS Trou----------------------------------
  if (BadTrou == 1){
          for (int i= 0; i<10; i++ ) {STRIP.setPixelColor(i, 230, 0 ,0);  STRIP.show();}                     // LEDS en Rouge
             TM3.clear(); TM3.print("-"); TM2.clear(); TM2.print("----"); TM1.clear(); TM1.print("OUPS");    // OUPS Message
             myDFPlayer.playMp3Folder(9);                                                                    // Dfmini SON Mauvais trou
             delay (3000);                                                                                   
          if (Bille == 3) { Gameover = 1;}                                                                   // Verif si GAME OVER
          Debutpartie = 1; BadTrou = 0;}                                                                     // Retour debut de partie

//----------------------------------------------------------GAME OVER------------------------------------
  if (Gameover == 1) { myDFPlayer.playMp3Folder(8);                                                          // Dfmini SON GAME OVER
             TM1.clear(); TM2.clear(); TM3.clear();
             TM1.print("    GAME OVER   YOUR Score   ");
             TM1.clear(); TM1.setCursor(1, DECALAGE (Score)); TM1.print(Score); delay (500);
             TM2.blink(); delay (1000); TM1.clear();
        if ( Score > Highscore) { Highscore = Score;
              TM1.clear(); TM1.print(" NEW"); TM1.blink(); TM1.print("HIGH"); TM1.blink(); TM1.print("SCOR"); TM1.blink(); TM1.clear();}
     Amode = 1; Gameover = 0; Debutpartie = 0; Bille = 0; Etape = 0; Score = 0;}

  int ConFinDeCourse1 = digitalRead(38);
Serial.println (ConFinDeCourse1);
//printDetail(myDFPlayer.readType(), myDFPlayer.read());

}//----- FIN LOOP




// Fonction pour trouver decalage des afficheurs *******************

int DECALAGE (int Adecaler) {         
    int Decal = 0;
    if ( Adecaler <1000){Decal = 1;}
    if ( Adecaler <100){Decal = 2;}
    if ( Adecaler <10){Decal = 3;}
    return Decal;       
}

// Fonction Comm Dfmini ************************ *******************

void printDetail(uint8_t type, int value){
  switch (type) {
    case TimeOut: Serial.println(F("Time Out!")); break;
    case WrongStack: Serial.println(F("Stack Wrong!")); break;
    case DFPlayerCardInserted: Serial.println(F("Card Inserted!")); break;
    case DFPlayerCardRemoved: Serial.println(F("Card Removed!")); break;
    case DFPlayerCardOnline: Serial.println(F("Card Online!")); break;
    case DFPlayerUSBInserted: Serial.println("USB Inserted!"); break;
    case DFPlayerUSBRemoved: Serial.println("USB Removed!"); break;
    case DFPlayerPlayFinished: Serial.print(F("Number:")); Serial.print(value); Serial.println(F(" Play Finished!")); break;
    case DFPlayerError: Serial.print(F("DFPlayerError:"));
    switch (value) {
        case Busy: Serial.println(F("Card not found")); break;
        case Sleeping: Serial.println(F("Sleeping")); break;
        case SerialWrongStack: Serial.println(F("Get Wrong Stack")); break;
        case CheckSumNotMatch: Serial.println(F("Check Sum Not Match")); break;
        case FileIndexOut: Serial.println(F("File Index Out of Bound")); break;
        case FileMismatch: Serial.println(F("Cannot Find File")); break;
        case Advertise: Serial.println(F("In Advertise")); break;
        default: break;
     }
      break; default: break;
  }
}


Voilà, ça avance doucement... Je vous tient au courant de la suite. Bisous