Gamoover

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

Ice cold beer BARTOP

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

berunours

Salut à tous.

J'ai lu vite zef le topic de sushy18 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:



Vous avez la possibilité de la tester:
La simu accessible à tous


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

AsPiC

 :-)= :-)= :-)=

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 ?

Little_Rabbit

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

berunours

Citation de: 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 ?

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.

Citation de: Little_Rabbit le Dimanche 14 Mars 2021, 21:33:38 PM
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.

Citation de: Little_Rabbit le Dimanche 14 Mars 2021, 21:33:38 PM
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.

Citation de: Little_Rabbit le Dimanche 14 Mars 2021, 21:33:38 PM
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.


Iro

Super projet ! Ice Cold Beer en fait réver plus d'un , moi le premier !!
^-^
"Jet set 2, c'est avec Robert Garcia ?" Kaneda, Lapsus de sac Vol.1
Peter Shou Owner' Club

WIPs : Naomi - SEGA Rally - AB Cop - Lethal Enforcers - COMPUMI - Terminator 2 - Space Invaders - Artworks pour Boitiers K7 Naomi CF - Ma collec' de panels

LES TUTOS DE GAMO   

Tonton_Hibou

Super projet ! Merci pour ton partage  ^-^

ɐɹqoƆ‾ɥƃᴉH

Citation de: berunours le Dimanche 14 Mars 2021, 22:05:48 PM
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.

berunours

Citation de: ɐɹqoƆ‾ɥƃᴉH le Lundi 15 Mars 2021, 09:46:19 AM
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.

berunours

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.



Toujours en public, testable ici avec un compte gratos: Version 16 mars

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.

Mario25

Bon courage pour ce projet.  ^-

Dire que j'ai croisé la borne à Coin-op legacy, sans y avoir touché.  :-\

berunours

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 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 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 pour les actionner.
-Pour le son, un DFplayer mini 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 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 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 ;)

berunours

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:

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

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

Little_Rabbit

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

berunours

Citation de: 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+
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.

Iro

"Jet set 2, c'est avec Robert Garcia ?" Kaneda, Lapsus de sac Vol.1
Peter Shou Owner' Club

WIPs : Naomi - SEGA Rally - AB Cop - Lethal Enforcers - COMPUMI - Terminator 2 - Space Invaders - Artworks pour Boitiers K7 Naomi CF - Ma collec' de panels

LES TUTOS DE GAMO   

berunours

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

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

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;       
}