Gamoover

Forums "MAME-UNIVERS" => Cabs From Scratch => Discussion démarrée par: berunours le Dimanche 14 Mars 2021, 18:38:29 pm

Titre: Ice cold beer BARTOP
Posté par: berunours le Dimanche 14 Mars 2021, 18:38:29 pm
Salut à tous.

J'ai lu vite zef le topic de sushy18 (https://www.gamoover.net/Forums/index.php?topic=35454.0) sur la Ice cold beer, j'suis pas 100 % au courant du truc mais je peux peut-être aider...

Je n'ai jamais vue la borne en vraie, je l'ai découvert y'a quelque temps avec les vidéo de John's Arcade Game Reviews sur youtube.
Bref, je l'aime bien, j'ai même songé en faire une sur base d'émulateur à une époque... Mais bof bof par rapport à en avoir une vraie qui bouge et tout.
Comme j'ai due me mettre à l'arduino pour mon bartop Hangon (promis il avance...), j'ai découvert l'immenbse étendu que ces petits bidules ouvrent comme perspectives.

Du coup je vais me motiver à en concevoir un. Le construire aussi peut-être.
Enfin bref, ce sera un petit bidule comme d'hab, environ 45 cm de large sur 60 de haut conçu façon bartop.

Après quelques recherches, je pars sur une base d'arduino Uno + 1 nano pour l'instant, 2 stepper moteur en 12v type imprimante 3D, des led adressables type neopixel , des afficheurs 7 segments 4 chiffres et un dfplayer mini pour le son.

En terme de répartitions:
Le UNO:
- 2 stepper motors
- les switch de passage de billes
- les leds

Le nano:
- le son
- les afficheurs

Comme à mon habitude, je fais concevoir par étape, la première sera la partie électronique. C'est le point que je maitrise le moins.
Comme je vous l'ai dit, je débute, mais j'ai commencé par modéliser le "programme" en lui même:

(https://gamoovernet.pixhotel.fr/pics_gamoovernet890px/20210314183049-berunours-13032021.JPG) (https://gamoovernet.pixhotel.fr/pics/20210314183049-berunours-13032021.JPG)

Vous avez la possibilité de la tester:
La simu accessible à tous (https://www.tinkercad.com/things/dflg4FRt2Ws)


Ce qui est implanté pour le moment:

-L'allumage de la led correspondant au trou (étape) ou l'ont doit mettre la bille
-La détection de l'endroits par où passe la bille (bon trou, mauvais trou)
-La boucle de gameplay, testez-la, c'est rigolo même si c'est ultra facile du coup.

Ce qu'il reste à faire:
-Attract mode / Insertion crédit
-Gestion des moteurs
-Gestion des scores
-Gestion des sons
-Gestion des afficheurs.

Ensuite on passera à la partie modélisation du meuble et de sa mécanique.

Voila...
Titre: Ice cold beer mini à l'étude
Posté par: AsPiC le Dimanche 14 Mars 2021, 20:52:12 pm
 :-)= :-)= :-)=

Ah mais je dit OUI !!

Je suis même à 2 doigts de t'envoyer un chèque en blanc pour t'en acheter un exemplaire  :o

Tu partirais sur la forme de la borne originelle débarrassée de la partie basse ou bien "juste" une version réduite ?
Titre: Ice cold beer mini à l'étude
Posté par: Little_Rabbit le Dimanche 14 Mars 2021, 21:33:38 pm
Salut,

Projet super intéressant !  ^-^

J'ai du mal à déchiffrer le schéma à partir de la vue "breadboard", tu n'aurais pas un schéma de principe classique par hasard ? :)

Je crois comprendre que tu as mis des résistances en série, et que pour déterminer le trou dans laquelle est tombée la bille, tu lis la valeur analogique résultant du réseau de résistance correspondant au trou ?

En haut c'est quoi ? Un ruban de LED ? Comment ça marche, car je vois que tu le relis à une seule sortie numérique de l'Arduino ?

Hâte d'en savoir plus !  ^-

A+
Titre: Ice cold beer mini à l'étude
Posté par: berunours le Dimanche 14 Mars 2021, 22:05:48 pm
:-)= :-)= :-)=

Ah mais je dit OUI !!

Je suis même à 2 doigts de t'envoyer un chèque en blanc pour t'en acheter un exemplaire  :o

Tu partirais sur la forme de la borne originelle débarrassée de la partie basse ou bien "juste" une version réduite ?

En gros c'est une version débarrassée du bas.
Par contre, si j'y arrive, j'essaierais de vous mettre ça à dispo (plan et électronique) histoire que chacun puisse se le construire.

J'ai du mal à déchiffrer le schéma à partir de la vue "breadboard", tu n'aurais pas un schéma de principe classique par hasard ? :)
Nan, désolé, j'ai tout fais directement sur tinkercad, mais tu dois pouvoir le voir et même le faire marcher si tu te crée un compte gratuit.

Je crois comprendre que tu as mis des résistances en série, et que pour déterminer le trou dans laquelle est tombée la bille, tu lis la valeur analogique résultant du réseau de résistance correspondant au trou ?
C'est exactement ça, chaque boutton revoie un voltage différent, relié a une porte analogique ça me me permet de les différencier. C'est pour "gagner" des ports, 1 seul nécessaire contre 10 autrement.

En haut c'est quoi ? Un ruban de LED ? Comment ça marche, car je vois que tu le relis à une seule sortie numérique de l'Arduino ?
C'est du neopixel, avec l'arduino, j'ai juste à lui dire allume la 3ème en jaune et il le fait tout seul.
J'devrais me motiver à vous faire une petite vidéo du truc en fonctionnement.

Titre: Ice cold beer mini à l'étude
Posté par: Iro le Lundi 15 Mars 2021, 08:59:28 am
Super projet ! Ice Cold Beer en fait réver plus d'un , moi le premier !!
 ^-^
Titre: Ice cold beer mini à l'étude
Posté par: Tonton_Hibou le Lundi 15 Mars 2021, 09:23:59 am
Super projet ! Merci pour ton partage  ^-^
Titre: Ice cold beer mini à l'étude
Posté par: ɐɹqoƆ‾ɥƃᴉH le Lundi 15 Mars 2021, 09:46:19 am
C'est exactement ça, chaque boutton revoie un voltage différent, relié a une porte analogique ça me me permet de les différencier. C'est pour "gagner" des ports, 1 seul nécessaire contre 10 autrement.

J'ai trouvé cette conception bizarre et je suis allé voir dans le code pour voir comment t'avais géré ça, perso, je trouve ça pas idéal. Tu as 14 ports dispo sur ton Arduino, je trouve dommage de pas s'en servir. En plus, ça allègerai pas mal ton code et ça pourrait simplifier le dépannage. Je m'explique, si t'as une résistance qui déconne niveau précision et/ou que ton alim vacille un peu, la lecture risque de ne pas être très précise et bonjour la difficulté à dépanner...

Au pire, tu peux faire une lecture matricielle si tu veux économiser un peu les E/S.
Titre: Ice cold beer mini à l'étude
Posté par: berunours le Lundi 15 Mars 2021, 13:09:11 pm
J'ai trouvé cette conception bizarre et je suis allé voir dans le code pour voir comment t'avais géré ça, perso, je trouve ça pas idéal. Tu as 14 ports dispo sur ton Arduino, je trouve dommage de pas s'en servir. En plus, ça allègerai pas mal ton code et ça pourrait simplifier le dépannage. Je m'explique, si t'as une résistance qui déconne niveau précision et/ou que ton alim vacille un peu, la lecture risque de ne pas être très précise et bonjour la difficulté à dépanner...

Au pire, tu peux faire une lecture matricielle si tu veux économiser un peu les E/S.
Surement :p, mais je débute en électronique (1ère création ever), du coup si t'as des astuces je suis preneur.
Je trouvais ça plus simple de mettre le tout en série histoire de créer des petits modules (trou de bille) comprenant chacun une led adressable, une résistance et un switch. Sur la Hang-on, j'ai galéré à tout câbler directement sur l'arduino, du coup avoir une sortie boutons, une sortie led m'arrange.
Il reste à câbler aussi les stepper motor (2 sorties chacun), les 3 afficheurs (1 sortie chacun), un DFmini (4 de mémoire) etc... Je vais voir si tout peu passer sur un arduino MEGA mais j'aimerai que ce sois le plus imple possible.
Titre: Ice cold beer mini à l'étude
Posté par: berunours le Lundi 22 Mars 2021, 08:23:26 am
J'avais retravailler un peu mon câblage pour que la simulation soit plus facile et "compréhensible".

J'attends un éventuel confinement de chez moi pour commandé le nécessaire (tout, moteurs, bandes led, courroie etc) pour rebosser dessus.
En attendant j'avance sur la construction de la hangon.

(https://gamoovernet.pixhotel.fr/pics_gamoovernet890px/20210322082252-berunours-16036.JPG) (https://gamoovernet.pixhotel.fr/pics/20210322082252-berunours-16036.JPG)

Toujours en public, testable ici avec un compte gratos: Version 16 mars (https://www.tinkercad.com/things/csVoNJobteq)

Comme on peut le voir, j'essaie de faire le plus simple au niveau câblage histoire de ne pas me casser la tête lors de la construction.
Titre: Ice cold beer mini à l'étude
Posté par: Mario25 le Lundi 22 Mars 2021, 22:27:18 pm
Bon courage pour ce projet.  ^-

Dire que j'ai croisé la borne à Coin-op legacy, sans y avoir touché.  :-\
Titre: Ice cold beer mini à l'étude
Posté par: berunours le Mercredi 07 Avril 2021, 22:47:08 pm
Bon, ce projet m'occupe pas mal l'esprit. Pas de confinement donc pas beaucoup de temps à y consacrer même si je vais être en vacances la dernière semaine d'avril.
J'ai étudié plus en détail la chose et même commandé 2-3 éléments pour commencer mes test.

Du coup, niveau choix de matos:
-Arduino méga, plus de port, j'vais finalement utilisé un port par trous
-J'ai commandé une 12aine de TCRT5000 (https://fr.aliexpress.com/item/4000077217976.html?spm=a2g0s.9042311.0.0.7a796c37RUThMS) qui sont des barrières infra-rouge, parfaite pour détecter le passage d'un objet réfléchissant. J'utiliserai le port digital pour la facilité.
-Je vais utiliser des leds individuelles de type RGBCW (https://fr.aliexpress.com/item/4000217587282.html?spm=a2g0s.9042311.0.0.7a796c37RUThMS) que je fixerai sur une pièce imprimé en 3d (une sorte de pipe) avec les TRCT. Elles sont adressables donc besoin d'un port unique pour l'ensemble.
-Pour les moteurs, on passe par du stepper, j'ai une vague idée de leur fonctionnement, j'ai déjà commandé des contrôleurs A4988 (https://fr.aliexpress.com/item/1005001374747956.html?spm=a2g0s.9042311.0.0.7a796c37RUThMS) pour les actionner.
-Pour le son, un DFplayer mini (https://fr.aliexpress.com/item/1005002007378168.html?spm=a2g0s.9042311.0.0.7a796c37RUThMS) devrai faire l'affaire, ça reste une grande question, j'en ai commandé pour tester.
-Pour les affichage, 3 afficheurs led 7 segments 4 digit (https://fr.aliexpress.com/item/4000093386794.html?spm=a2g0s.9042311.0.0.7a796c37RUThMS) devraient suffire, commandé pour m'entrainer à les utiliser.
-Pour la partie méca, je vais m'orienter sur quelque chose de similaire aux axes X,Y d'une imprimante 3D avec un entrainement par courroie GT2. Je m'y attaquerai plus tard, cette conception ne me fait pas trop peur.

A pis, j'ai aussi commandé des billes (https://fr.aliexpress.com/item/4001201958797.html?spm=a2g0s.9042311.0.0.7a796c37RUThMS) en 15 et 13 mm... Sur la machine d'origine, elle fait un peu plus de 15 mm. Vue que je vais la réduire un peu, je vais peut-être passer sur du 13mm. J'attends de les avoir pour faire mes test.

Afin de ne pas engager trop d'argent dans un projet que je ne maîtrise pas, j'ai commandé direct en Chine, ça devrait arrivé pour mes vacances. En attendant je fini la Hangon (des news bientôt).

Du coup, la prochaine étape, dès réception des billes, leds et des barrières IR, je dessine une pièce qui comprendra les 3 et se cachera derrière les trous. Faut juste que je sois patient.

Merci pour vos encouragements ;)
Titre: Ice cold beer mini à l'étude
Posté par: berunours le Jeudi 15 Avril 2021, 19:26:37 pm
J'ai reçu mes capteurs infra rouge aujourd'hui !

Du coup petit test  ;)

Faut imaginer un peu mais:
- l'afficheur LED affiche le trou demandé
- les 3 capteurs sont dans les trous (le 1 à droite, 2 au centre, 3 à gauche)
- le bout de métal sert de bille en attendant de les recevoir (avec un ptit bout d'essuis tout histoire de limiter le bruit de la chute)

Du coup:


Voilà, j'étais pas censé y toucher avant ma semaine de vacance en fin de mois mais je n'ai pas réussis à me retenir...
Titre: Ice cold beer mini à l'étude
Posté par: Little_Rabbit le Jeudi 15 Avril 2021, 20:37:33 pm
Salut,

Génial ! Ça marche super bien !!  ^-^

Une interrogation toutefois : la bille tombera dans l'un des trous, et doit être détectée par ton capteur infra-rouge. OK. Mais derrière le trou, il y aura une coque ou un panneau pour canaliser la bille qui doit retomber en bas. Ce panneau ou cette coque ne va-t-elle pas elle même réfléchir le faisceau infra-rouge, et du coup interdire la détection de la bille ? Quelle est la distance à partir de laquelle la réflexion du faisceau n'est-elle plus détectée ? Ou peut-être que si l'arrière-plan est peint en noir, cela absorbera le faisceau sans le réfléchir ?

En tous cas là ça marche super bien, avec un passage même très furtif de ton objet métallique  ^-.

A+
Titre: Ice cold beer mini à l'étude
Posté par: berunours le Jeudi 15 Avril 2021, 20:49:23 pm
Salut,

Génial ! Ça marche super bien !!  ^-^

Une interrogation toutefois : la bille tombera dans l'un des trous, et doit être détectée par ton capteur infra-rouge. OK. Mais derrière le trou, il y aura une coque ou un panneau pour canaliser la bille qui doit retomber en bas. Ce panneau ou cette coque ne va-t-elle pas elle même réfléchir le faisceau infra-rouge, et du coup interdire la détection de la bille ? Quelle est la distance à partir de laquelle la réflexion du faisceau n'est-elle plus détectée ? Ou peut-être que si l'arrière-plan est peint en noir, cela absorbera le faisceau sans le réfléchir ?

En tous cas là ça marche super bien, avec un passage même très furtif de ton objet métallique  ^-.

A+
Les capteurs sont réglables grâce à un petit potard intégré. J'ai prévu de faire une pièce imprimé en 3D noir mat pour le passage de bille.
Je vais tester, mais je pense que ça ne devrait pas poser de problème.

Néanmoins tu souligne une question importante  =?=

Ils ont 2 modes, digital et analogique. Si jamais le digital, utilisé pour le moment, ne fonctionne pas, j'passerais en analogique et surveillerais les grosses variations de valeurs.
La bille étant très réfléchissante, je pense que les variations seront suffisamment importantes pour êtres significatives.
Titre: Ice cold beer mini à l'étude
Posté par: Iro le Jeudi 15 Avril 2021, 21:20:01 pm
Super !!!!   ^-^ ^-^
Titre: Ice cold beer mini à l'étude
Posté par: berunours le Samedi 17 Avril 2021, 14:00:57 pm
Salut à tous...

J'ai programmé ma boucle de gameplay et mes afficheurs...

Pour les curieux je vous mets le code en fin de post.
Je suis toujours aussi novice en code mais je prends plaisir à apprendre donc c'est motivant.

J'vous mets une petite vidéo de démonstration aussi. Les afficheurs clignotent à cause de la caméra du téléphone, en vraie c'est totalement imperceptible.


J'ai mes grandes étapes de programme. Et ça fonctionne bien.
Mes afficheurs sont petits, sur la version final j'en prendrais des plus grands.

Je vous tiens au courant de la suite.
Si vous avez des conseil ou remarques n'hésitez pas.
Merci ;)

Le code:
//--------------------------------------------------- INITIALISATION DE LA BECANNE ------------------------------------

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


SevenSegmentTM1637    tm1(9, 8 );  //afficheur du bas déclaration
SevenSegmentTM1637    tm2(11, 10);  //afficheur du centre déclaration
SevenSegmentTM1637    tm3(13, 12);  //afficheur du haut déclaration

int temp = 0;  //variable temporisation
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 button2 = 0;  // etat boutton 1
int button4 = 0;  // etat boutton 2

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)

void setup() {
   
    tm1.begin(); tm1.setBacklight(60); tm1.setPrintDelay(500); tm1.clear();   //afficheur du bas initialisation
    tm2.begin(); tm2.setBacklight(60); tm2.setPrintDelay(500); tm2.clear();   //afficheur du centre initialisation
    tm3.begin(); tm3.setBacklight(60); tm3.setPrintDelay(300); tm3.clear();   //afficheur du haut initialisation
   
   
    pinMode(2, INPUT); // cablage Bouton Crédit
    pinMode(4, INPUT); // cablage Bouton Mauvais trou TEMP
   
    Serial.begin(9600); //Pour la console
}



void loop() {

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

//--------------------------------------------------- DEBUT DE PARTIE ---------------------------------
  if (Debutpartie == 1){bille++; tm3.clear(); tm3.print(bille); etape = 1; Debutpartie =0;Initbarre = 1;}
 
//----------------------------------------- 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); Initbarre = 0;       //Affichage Score
                      Principale = 1; delay (1000);}  //le delay sera a virer !!!!!

//----------------------------------------------------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
       
        button2 = digitalRead(2); if (button2== HIGH) { Bontrou =1 ; Principale = 0 ;}   // Appui Bouton 2 pour valider (test) 
        button4 = digitalRead(4); if (button4== HIGH) { Badtrou =1 ; Principale = 0 ;}   // Appui Bouton 2 pour valider (test) 
    } //----- FIN DE BOUCLE PRINCIPALE

//----------------------------------------------------------BON TROU-----------------------------------
  if (Bontrou == 1) { tm2.blink(); temp = bonus/10;
            for ( int i=0; i<temp; i++){ bonus= bonus -10; score = score +10; delay (200- (i*2));  // Décompte du bonus
               tm2.clear(); tm2.setCursor(1, decalage (bonus)); tm2.print(bonus); tm1.clear(); tm1.setCursor(1, decalage (score)); tm1.print(score);}
            etape++; if (etape > 10) {etape=1;} Bontrou =0; Initbarre =1;tm2.clear(); delay (1000);}  // Retour Initialisation barre
 
//--------------------------------------------------------MAUVAIS TROU----------------------------------
  if (Badtrou == 1){ tm3.clear(); tm3.print("-"); tm2.clear(); tm2.print("----"); tm1.clear(); tm1.print("OUPS"); delay (2000);
        if (bille == 3) { Gameover = 1;} Debutpartie = 1; Badtrou = 0;}

  if (Gameover == 1) {tm3.clear(); tm2.clear(); tm1.clear(); tm1.print("    GAME OVER   YOUR SCORE   "); tm1.clear(); tm1.setCursor(1, decalage (score)); tm1.print(score); delay (1000); tm1.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; temp = 0;}
 
 
 
} //----- FIN DE 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;       
}
Titre: Ice cold beer mini à l'étude
Posté par: berunours le Samedi 17 Avril 2021, 23:25:08 pm
J'vous ai refait la vidéo, avec moins de soleil, histoire qu'on voit vraiment les afficheurs cette fois.


Titre: Ice cold beer mini à l'étude
Posté par: berunours le Dimanche 18 Avril 2021, 17:57:27 pm
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.



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;       
}
Titre: Ice cold beer mini à l'étude
Posté par: ɐɹ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.

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
Titre: Ice cold beer mini à l'étude
Posté par: berunours le Dimanche 18 Avril 2021, 19:25:27 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 :/
Titre: Ice cold beer mini à l'étude
Posté par: kidicarus le Dimanche 18 Avril 2021, 21:02:59 pm
très chouette projet ^-^  je suis cela de près
Titre: Ice cold beer mini à l'étude
Posté par: berunours le Dimanche 02 Mai 2021, 19:01:49 pm
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:

(https://gamoovernet.pixhotel.fr/pics_gamoovernet890px/20210502183731-berunours-IMG-20210502-163934.jpg) (https://gamoovernet.pixhotel.fr/pics/20210502183731-berunours-IMG-20210502-163934.jpg)

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.


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.
Titre: Ice cold beer mini à l'étude
Posté par: APPLE//C le Mercredi 05 Mai 2021, 08:52:17 am
ça promet !  :-)=
Titre: Ice cold beer mini à l'étude
Posté par: Little_Rabbit le Mercredi 05 Mai 2021, 23:28:37 pm
Salut,

Ça prend sacrément forme !  ^-^

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+
Titre: Ice cold beer mini à l'étude
Posté par: 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 !

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

(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 :

(https://gamoovernet.pixhotel.fr/pics_gamoovernet890px/20210506084622-sushy18-178776480-934153650676052-1382379010929593919-n.jpg)



Titre: Ice cold beer mini à l'étude
Posté par: berunours le Jeudi 06 Mai 2021, 13:23:48 pm
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.
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.

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 :

(https://gamoovernet.pixhotel.fr/pics_gamoovernet890px/20210506084622-sushy18-178776480-934153650676052-1382379010929593919-n.jpg)

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.
Titre: Ice cold beer mini à l'étude
Posté par: ɐɹ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.
Titre: Ice cold beer mini à l'étude
Posté par: berunours le Jeudi 06 Mai 2021, 17:41:09 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.
Titre: Ice cold beer mini à l'étude
Posté par: -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 ?
Titre: Ice cold beer mini à l'étude
Posté par: 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 :) ):


(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+
Titre: Ice cold beer mini à l'étude
Posté par: berunours le Jeudi 06 Mai 2021, 21:17:49 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:
(https://scontent-cdt1-1.xx.fbcdn.net/v/t1.6435-9/176035796_10223131690213350_5701347956252068509_n.jpg?_nc_cat=106&ccb=1-3&_nc_sid=8bfeb9&_nc_ohc=vhYqc_-Ij6gAX9EdRTr&_nc_ht=scontent-cdt1-1.xx&oh=e09286fdacadb549428aaed8e8b16939&oe=60B7ED0F)


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

(https://gamoovernet.pixhotel.fr/pics_gamoovernet890px/20210506211201-berunours-1620328196223.jpg) (https://gamoovernet.pixhotel.fr/pics/20210506211201-berunours-1620328196223.jpg)

Titre: Ice cold beer mini à l'étude
Posté par: berunours le Dimanche 16 Mai 2021, 17:43:38 pm
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:


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
Titre: Ice cold beer mini à l'étude
Posté par: sushy18 le Dimanche 16 Mai 2021, 19:20:38 pm
 :-)=
What Else ?
Titre: Ice cold beer mini à l'étude
Posté par: berunours le Lundi 17 Mai 2021, 19:52:58 pm
Petite news, hier soir j'ai vite fait continué à coder.

Du coup j'ai intégré le mouvement du moteur dans ma boucle.

Le code un peu brut, la mise en mouvement du moteur se situe au début de la boucle loop et la détection des bouton au repère "//----- Barre: detection deplacement":
//-------------- 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 BttnMontMotor1 = 0;                       // Bouton Up Motor 1
int BttnDscdMotor1 = 0;                       // Bouton Down Motor 1
int Motor1 = 0;                               // Bougeage de Motor 1

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 (52, INPUT_PULLUP);                                               // Bouton Moteur 1 Monte -- PIN 52 --
    pinMode (50, INPUT_PULLUP);                                               // Bonton Moteur 1 Descend -- 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 (Motor1 == 0) {delay(Latence);}                                   // millisecondes de mise a jour de la boucle si moteurs immobiles
  if (Motor1 == 1) {
         digitalWrite(dirPinMotor1,LOW);                               // direction Motor1 vers le Haut
         for (int i = 0 ; i < 100; i++) {
            digitalWrite(stepPinMotor1,HIGH); delayMicroseconds(500);
            digitalWrite(stepPinMotor1,LOW); delayMicroseconds(500);}
            Motor1 = 0;}   
  if (Motor1 == 2) {
         digitalWrite(dirPinMotor1,HIGH);                              // direction Motor1 vers le Haut
         for (int i = 0 ; i < 100; i++) {
            digitalWrite(stepPinMotor1,HIGH); delayMicroseconds(500);
            digitalWrite(stepPinMotor1,LOW); delayMicroseconds(500);}
            Motor1 = 0;}   
 


//--------------------------------------------------- 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 = -10;}                                       // 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) {
             
                    Motor1 = 2;  }                                                   // Pour faire sauter le delais de la boucle principale
                           
                           
              if (ConFinDeCourse1 == LOW) {
                      Motor1 = 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(500);
                        digitalWrite(stepPinMotor1,LOW);
                        delayMicroseconds(500); }   
                     
                      MonteBarre = 0; Principale = 1;}                               // Sortie MonteBarre barres vers Principale

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

if (Principale == 1) {
 
        TempBONUS++; if (TempBONUS > (3000/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;}


        //----- Barre: detection deplacement
       
     BttnMontMotor1 = digitalRead(52);           // Moteur 1
     BttnDscdMotor1 = digitalRead(50);           //
        if (BttnMontMotor1 == LOW){ Motor1 = 1;}     // Montera
        if (BttnDscdMotor1 == LOW){ Motor1 = 2;}     // Descendra
       
        //----- 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 (150- (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.print (BttnMontMotor1);
Serial.println (Motor1);
//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;
  }
}


Par contre, je commence à ne plus trop avoir de place sur ma breadboard.
Sans compter qu'a chaque fois que je la range, j'ai toujours un câble qui se barre et je cherche des plombes le coupable.

Il est temps de passer à une version plus durable, voir la version finale (de l'électronique).
Du coup, je vais commander le nécessaire très vite, je vais juste checker ce qu'il me faut pour les lightguns de la future VirtuaCop histoire d'essayer de grouper au max ma commande.

J'en profiterai pour commander les poulies GT2 ainsi que tout le reste nécessaire à la "mécanique".
Du coup, pour la prochaine étape, je vais surement fabriquer le plateau.

Faudrait que je fasse un schéma de câblage aussi... Là si je fais tomber le bousin de câble, je ne m'y retrouverai pas.

Par contre je suis toujours dans l'attente de mes billes, elles sont apparemment bloquées à Paris depuis un mois :(
 Enfin bref, ça risque d'avancer un peu moins les 2-3 prochaines semaines, faudra pas vous inquiétez.

Bsx
Titre: Ice cold beer mini à l'étude
Posté par: Rodrigo le Lundi 17 Mai 2021, 20:28:09 pm
Merci pour le suivi et le partage du code, c'est super intéressant à suivre !
Titre: Ice cold beer mini à l'étude
Posté par: ɐɹqoƆ‾ɥƃᴉH le Mardi 18 Mai 2021, 05:09:23 am
Je vais le redire mais il faut que tu utilises des constantes pour les numéros de tes ports, ça rendra ton code beaucoup plus lisible

Exemple : au début de ton code, tu ajoutes une ligne
#DEFINE TROU1 43

Et ensuite, tu ré-utilise toujours TROU1 quand tu as besoin de la valeur, genre :
pinMode(TROU1, INPUT);

ou encore
Troudetect = digitalRead(TROU1);


Ca facilitera grandement la lecture de ton code et le debug / évolution.

Je préfères utiliser des DEFINE plutôt que des const comme tu fais pour stepPinMotor1ou dirPinMotor1 mais ça pourrait être un long débat... Dans tous les cas, il faut utiliser des "variables" pour tous tes paramètres...
Titre: Ice cold beer mini à l'étude
Posté par: berunours le Mercredi 26 Mai 2021, 20:24:19 pm
J'ai commandé le reste du matos pour continuer la conception.
Vue que les moteurs sont fonctionnels, du coup, je vais devoir passer à la phase de prototypage du cabinet.
Du coup:
(https://gamoovernet.pixhotel.fr/pics_gamoovernet890px/20210526201808-berunours-1.jpg) (https://gamoovernet.pixhotel.fr/pics/20210526201808-berunours-1.jpg)(https://gamoovernet.pixhotel.fr/pics_gamoovernet890px/20210526201829-berunours-2.jpg) (https://gamoovernet.pixhotel.fr/pics/20210526201829-berunours-2.jpg)
(https://gamoovernet.pixhotel.fr/pics_gamoovernet890px/20210526201854-berunours-3.jpg) (https://gamoovernet.pixhotel.fr/pics/20210526201854-berunours-3.jpg)

Elle n'est pas trop "assortie" aux autres et j'ai du mal avec "l'avancée" du haut que je vais peut-être réduire.
Mais sinon je la trouve pas trop mal dans ce format.

J'ai voulu capturer la conception sur Sketchup pour vous montrer en time-laps ma façon de faire histoire d'éventuellement aider certain à se mettre à la 3D mais ma capture s'est arrêté à 25 secondes et j'm'en suis rendu compte trop tard. Ce sera pour une prochaine fois...
Titre: Ice cold beer mini à l'étude
Posté par: gottlieb le Mercredi 26 Mai 2021, 21:03:10 pm
C'est beau  :-*
Le rendu de tes bar top sont magnifiques ^-^ ^-^
Une belle brochette  ;) :-*
Titre: Ice cold beer mini à l'étude
Posté par: ɐɹqoƆ‾ɥƃᴉH le Mercredi 26 Mai 2021, 21:07:19 pm
Ton alignement est vraiment class, je trouve que t'as bien reproduit l'esthétique de tous les meubles d'origine !

Au pire, tu peux peut-être réduire un peu le coté trop proéminent du haut pour que ça colle mieux au reste.
Titre: Ice cold beer mini à l'étude
Posté par: berunours le Jeudi 27 Mai 2021, 07:10:58 am
Merci pour vos retours ;) ça me rassure sur le choix d'en faire un bartop.

Ton alignement est vraiment class, je trouve que t'as bien reproduit l'esthétique de tous les meubles d'origine !
J'essaie, je veux les dénaturer le moins possible tout en les tronquant à mort.
Mais je t'avoue que j'ai souvent peur de me faire taper sur les doigts vue que c'est un peu "contre nature" de les modifier de la sorte.

Au pire, tu peux peut-être réduire un peu le coté trop proéminent du haut pour que ça colle mieux au reste.
C'est ce que je pensais faire:
(https://gamoovernet.pixhotel.fr/pics_gamoovernet890px/20210527070305-berunours-4.jpg) (https://gamoovernet.pixhotel.fr/pics/20210527070305-berunours-4.jpg)

Par contre j'ai peur de la solidité de cette avancée, ce sera du mdf en 18 mm mais j'vais surement encore faire mon bourrin en tapant dessus pour enfoncer le T-molding.
D'autant qu'il n'y aura rien pour le rigidifier sur la largeur du bartop. Et vue que mine de rien, je passe mon temps à déplacer mes bartop...

Alors j'ai essayé en le raccourcissant et en l'élargissant:
(https://gamoovernet.pixhotel.fr/pics_gamoovernet890px/20210527070504-berunours-5.jpg) (https://gamoovernet.pixhotel.fr/pics/20210527070504-berunours-5.jpg)

Pour le coup, ça fait mieux je trouve. C'est peut-être un chouilla trop gros mais au moins ce sera solide.
Titre: Ice cold beer mini à l'étude
Posté par: AsPiC le Jeudi 27 Mai 2021, 10:40:04 am
Pourquoi ne pas garder à l’identique mais réduit à ton échelle la partie haute qui présente une avancée et donc un renfort pour les sides comme sur la borne originale ?
(https://gamoovernet.pixhotel.fr/pics_gamoovernet890px/20210527103948-AsPiC-01C507DD-3A4B-4303-A108-6C834586D125.jpeg) (https://gamoovernet.pixhotel.fr/pics/20210527103948-AsPiC-01C507DD-3A4B-4303-A108-6C834586D125.jpeg)
Titre: Ice cold beer mini à l'étude
Posté par: berunours le Jeudi 27 Mai 2021, 13:11:50 pm
Pourquoi ne pas garder à l’identique mais réduit à ton échelle la partie haute qui présente une avancée et donc un renfort pour les sides comme sur la borne originale ?
https://gamoovernet.pixhotel.fr/pics_gamoovernet890px/20210527103948-AsPiC-01C507DD-3A4B-4303-A108-6C834586D125.jpeg (https://gamoovernet.pixhotel.fr/pics/20210527103948-AsPiC-01C507DD-3A4B-4303-A108-6C834586D125.jpeg)

J'avais zappé le détail du petit retour sur la vitre.
Le soucis c'est que ce retour ne fait que 7cm de large...

(https://gamoovernet.pixhotel.fr/pics_gamoovernet890px/20210527130338-berunours-6.jpg) (https://gamoovernet.pixhotel.fr/pics/20210527130338-berunours-6.jpg)

J'ai pris l'habitude de m'appuyer sur le haut des bornes, à l'ancienne :p

(https://gamoovernet.pixhotel.fr/pics_gamoovernet890px/20210527130931-berunours-edaccit3b2x1iucii5f1.jpg) (https://gamoovernet.pixhotel.fr/pics/20210527130931-berunours-edaccit3b2x1iucii5f1.jpg)

Là, typiquement, le gars en rouge, il est bien appuyé dessus. Je suis souvent dans cette position et je fais un quintal !

Après, faut que je teste, j'ai des chutes de 18mm, je vais essayer de voir ce que ça donne.

Titre: Ice cold beer mini à l'étude
Posté par: sushy18 le Jeudi 27 Mai 2021, 14:11:01 pm
Pour le travail  :  ^-^ ^-^ Topissime
Pour ce qui est des retours concernant les libertés que tu prends pour bartopiser ces machines : de base on change l'echelle.... a partir de là que les ayatollahs du copy carbon aillent se faire têter...
 :-* <:)

J'ai pris l'habitude de m'appuyer sur le haut des bornes, à l'ancienne :p


Là, typiquement, le gars en rouge, il est bien appuyé dessus. Je suis souvent dans cette position et je fais un quintal !

ok pour le quintal... <:) mais tu est plus grand qu'un bartop ( enfin j'espère)  :mrgreen:
Little rabbit lui il peut s'y suspendre ( et encore avec de la détente...) ...mais les gens de tailles normales...


excusez moi on m'appelle dehors...
 :fleche:
Titre: Ice cold beer mini à l'étude
Posté par: gottlieb le Jeudi 27 Mai 2021, 20:48:02 pm

ok pour le quintal... <:) mais tu est plus grand qu'un bartop ( enfin j'espère)  :mrgreen:
Little rabbit lui il peut s'y suspendre ( et encore avec de la détente...) ...mais les gens de tailles normales...


excusez moi on m'appelle dehors...
 :fleche:

Je me suis bien marré en imaginant la scène   :D :D ;D

Pour ce qui est du dessus de la borne, comme les autres, je dirais de la garder dans les mêmes proportions que l'originale, avec le petit retour en renfort.
Je pense que la rigidité sera sufisante et 1 quintal, fera bouger ou tomber la borne avant de casser le déport à mon avis  :?
Titre: Ice cold beer mini à l'étude
Posté par: berunours le Jeudi 27 Mai 2021, 21:12:36 pm
J'crois que je vais vous faire confiance pour le coup. On va rester sur le 1er design et ajouter un renfort discret ;)

J'ai rajouté un petit accessoire qui sera ultra essentiel ! Un cup holder evidement !  ;D

(https://gamoovernet.pixhotel.fr/pics_gamoovernet890px/20210527211211-berunours-7.jpg) (https://gamoovernet.pixhotel.fr/pics/20210527211211-berunours-7.jpg)

[EDIT] J'viens de remarquer mon nouveau grade "Serial Bartopeur" Je suis tout plein de fierté ! Merci =:))
Titre: Ice cold beer mini à l'étude
Posté par: spectroman le Jeudi 27 Mai 2021, 22:02:51 pm
 ^- top le design

Tu vas mettre quelques leds jaunes dans le cup holder?
Titre: Ice cold beer mini à l'étude
Posté par: Little_Rabbit le Jeudi 27 Mai 2021, 22:37:49 pm
Salut,

Génial !  ^-^

J'entends déjà le fin crépitement des bulles de gaz carbonique qui viennent éclater la mousse ! :D

Little rabbit lui il peut s'y suspendre ( et encore avec de la détente...) ...mais les gens de tailles normales...

Je t'arrête tout de suite : je n'ai aucune détente ! Tu m'aurais vu en cours d'EPS, pour le saut en hauteur... la célèbre et classique méthode "Fosbury" devenait chez moi "saucisse se laisse tomber de sa hauteur"... :-\

Cela dit, je ne tombais pas de haut ! :D

Tu vas mettre quelques leds jaunes dans le cup holder?

J'ai tout de suite pensé à ça ! Il faut absolument un éclairage par dessous, ça rendra super !  :-)=

A+
Titre: Ice cold beer mini à l'étude
Posté par: sushy18 le Vendredi 28 Mai 2021, 08:43:14 am
topper OUI
cup holder NON en tout cas pas au dessus...

^- top le design

Tu vas mettre quelques leds jaunes dans le cup holder?

effectivement indispensable !! ^-
Titre: Ice cold beer BARTOP
Posté par: berunours le Mardi 07 Septembre 2021, 21:14:43 pm
Salut à vous...

Pas mal de petits progrès cette semaine...
A commencer par la réalisation d'un proto-Bartop avec mon vieux control panel défoncé et 2-3 bout de mdf qui trainaient dans le coin.

Du coup, j'ai pu vérifier que la méca fonctionnait et tout:


Ca avance doucement ;)
Titre: Ice cold beer BARTOP
Posté par: gottlieb le Mardi 07 Septembre 2021, 21:43:35 pm
 :-* C'est beau et ça prend forme  ^-^ :-)=
Titre: Ice cold beer BARTOP
Posté par: cedricbionic le Mardi 07 Septembre 2021, 21:47:10 pm
euuhhh moi je découvre à peine ce post, et je suis tellement sur le cul que j'ai rien à dire... ((:s
Titre: Ice cold beer BARTOP
Posté par: Rodrigo le Mardi 07 Septembre 2021, 22:40:12 pm
Waouw super ! Belle progression, ça prend bien forme là ! Bravo et bon courage pour la suite  ^-
Titre: Ice cold beer BARTOP
Posté par: Iro le Mercredi 08 Septembre 2021, 10:16:07 am
C'est génial, vivement les plans !!  #vautour  =:))
çà serait top de pouvoir changer le plateau pour varier le théme et la difficulté !

Encore bravo  ^-^
Titre: Ice cold beer BARTOP
Posté par: berunours le Mercredi 08 Septembre 2021, 13:03:18 pm
Merci pour vos retours ;)

C'est génial, vivement les plans !!  #vautour  =:))
çà serait top de pouvoir changer le plateau pour varier le théme et la difficulté !

Pour les plans, pas de soucis, par contre, ce que j'appel les "trous" en impressions 3D dépendent vraiment du matos pris. Je vous donnerais les refs pour que tout correspondent.

Changer de plateau est possible, par contre, vue que les capteurs sont fixés dessus, ça obligerais à soit tout dévisser (20 visses) et déplacer vers les autres plateaux, soit avoir 1 jeux de capteurs/Leds par plateaux. Ce n'est pas forcément un frein vue le petit pris des éléments mais risque finalement d'être tellement embêtant à faire qu'on ne le ferai jamais.
Ca reste une bonne idée, mais je ne m'y attarderai pas pour le moment :p

Encore merci pour votre soutient.

Titre: Ice cold beer BARTOP
Posté par: Iro le Mercredi 08 Septembre 2021, 16:11:20 pm
C'est ce que je pensais , vu le tarif des dés élément , un plateau complet a interchanger.
Je le vois bien coulisser vers le haut entre les deux courroies avec un guide, et un ou deux connecteur JAMMA en bas pour les connexions. On pourrait pousser le délire à intégrer la régle du jeu et les sons dans la table. Comme un MVS quoi :D.

Titre: Ice cold beer BARTOP
Posté par: AsPiC le Mercredi 08 Septembre 2021, 22:37:22 pm
Iro est encore parti en cacahouète  =:)) :-*

berunours bravo pour le travail abattu ! Ca promet vraiment et ça donne également beaucoup envie d'en avoir une à la maison :mrgreen:
Titre: Ice cold beer BARTOP
Posté par: skullface le Jeudi 09 Septembre 2021, 00:46:32 am
Superbe ça claque ! J'adore ça donne envie d'en faire 1 !
Titre: Ice cold beer BARTOP
Posté par: Little_Rabbit le Jeudi 09 Septembre 2021, 11:53:24 am
Salut,

Que dire si ce n'est un énorme B R A V O !!  :-)=

Tout y est quasiment déjà !  ^-^

Hâte de voir la suite, et notamment le détail de ton distributeur de billes, et ce qui l'actionnera !  ^-

A+
Titre: Ice cold beer BARTOP
Posté par: Maitre_Poulpi le Jeudi 09 Septembre 2021, 13:07:23 pm
Bravo   ^-^
Vivement la suite, ça donne envie d’y jouer.