Gamoover

Besoin de contacter un admin pour une proposition, une suggestion ou discuter d'un probleme ?
C'est ici : High_Cobra, AsPiC ou Pich

Menu

Voir les contributions

Cette section vous permet de consulter les contributions (messages, sujets et fichiers joints) d'un utilisateur. Vous ne pourrez voir que les contributions des zones auxquelles vous avez accès.

Voir les contributions Menu

Messages - berunours

#49
Cabs From Scratch / [WIP] Bartop en préparation
Lundi 31 Mai 2021, 12:55:48 PM
Salut !

Très beau début, hâte de voir la suite ! ^-
#50
Cabs From Scratch / Ice cold beer mini à l'étude
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



[EDIT] J'viens de remarquer mon nouveau grade "Serial Bartopeur" Je suis tout plein de fierté ! Merci =:))
#51
Cabs From Scratch / Ice cold beer mini à l'étude
Jeudi 27 Mai 2021, 13:11:50 PM
Citation de: 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

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



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 !

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

#52
Cabs From Scratch / Ice cold beer mini à l'étude
Jeudi 27 Mai 2021, 07:10:58 AM
Merci pour vos retours ;) ça me rassure sur le choix d'en faire un bartop.

Citation de: ɐɹ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 !
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.

Citation de: ɐɹqoƆ‾ɥƃᴉH le Mercredi 26 Mai 2021, 21:07:19 PM
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:


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:


Pour le coup, ça fait mieux je trouve. C'est peut-être un chouilla trop gros mais au moins ce sera solide.
#53
Cabs From Scratch / Ice cold beer mini à l'étude
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:



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...
#54
Cabs From Scratch / Bartop HangOn FINI
Lundi 24 Mai 2021, 14:35:03 PM
On m'a demandé en MP de partager les plans etc du bartop.

Comme je suis un con d'anarco-communiste-islamo-gauchiste je vais partager tout ça.
Par contre, je garde pour moi les modélisations 3D et la mécanique du guidon.
Elle m'ont pris bcp de temps et de boulot et je me réserve le droit d'en faire commerce (oui, je suis aussi contradictoire).

Du coup:
Lien google drive

Vous y trouverez:
- un side avec un repère / échelle pour le reproduire
- un plan côté (vite fait) de la partie centrale (noté que le bartop fait exactement 40 cm de large entre les 2 side,
- un jpg d'un side (sans les logos copyrightés) en 150 dpi au dimensions (attention, 1 cm de rab de part et d'autre pour être tranquille à la pose),
- un pdf pour imprimer le patron des side en A3,
- un petit txt qui explique la licence.

Le tout est publié en Creative Commons CC BY-NC.

En gros vous en faites ce que vous voulez tant que vous ne faites pas de l'argent avec.
Info sur la licence CC BY-NC

Voila, si vous êtes motivés, y'a une bonne base pour un bartop sympas.
#55
Cabs From Scratch / Ice cold beer mini à l'étude
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;
  }
}


https://www.youtube.com/watch?v=z8-fnYqVF0U

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
#56
Cabs From Scratch / Ice cold beer mini à l'étude
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:

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

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

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


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

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

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

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


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

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

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

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

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

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

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

int BTNcredit = 0;                            // Bouton Credit                   

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

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


void setup() {

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

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

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

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

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


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

}

void loop() {

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


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

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


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

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

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

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

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

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

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

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

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


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

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

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

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

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

}//----- FIN LOOP




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

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

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

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


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

Après la Outrun et la Hangon, la suite logique est donc la
After Burner
Space Harrier
Virtua Cop 2 !!!

Celle ci:


Réduite en petit cabinet de 45x40x60 cm (Lxlxh).

Comme je fais le pont et mon alimentation pour les moteurs de la Ice Cold Beer n'est pas encore arrivé, j'ai commencé vite fait à bosser sur le cabinet:


Pour les specs technique:
  - Ecran 19" HP qui devrait rentrer pile-poile dans les 40 cm de large, je croise les doigts car je ne l'ai pas encore désossé,
  - 1 petit Dell USFF en I3 à condition qu'il accepte les jeux sélectionnés,
  - 2 light gun

et puis c'est tout.

En mdf etc... comme mes précédents projets.

Pour les light gun, j'hésite entre 4...

Soit des Aimtrack qui m'ont l'air pas mal et dont le net regorge de tutos, soit des Samco (un truc à base d'arduino-like développé par un amateur), soit des Wiimote (vraiment pas envie d'en arrivé là) ou bien des Sidden mais qui ne sont pas encore dispos pour ceux qui n'ont pas pledge :/
Forcément, avec une coque identiques à ceux d'une vraie Vcop imprimé en 3D.


Ce sera des GUN4IR, un truc un peu Do it yourself à coup d'arduino et de capter infra rouge.

Si vous avez des retour concernant ces différents lightgun, je suis preneur.

++
#58
Cabs From Scratch / [WIP] Bartop HangOn
Jeudi 13 Mai 2021, 22:20:35 PM
Merci pour vos retour  :-*
Citation de: AsPiC le Jeudi 13 Mai 2021, 21:04:11 PM
Curieux de voir comment tu vas gérer la parti gestion des guns sur un lcd pour la VC =?= :-)=

Mais d'abord il faut finir la Ice Cold Beer !

Le Ice cold beer reste un projet parallèle, tellement de chose que je ne maitrise pas... Mais elle est bien parti.

Pour la VC, j'hésite encore, j'ai 3 options:
- Easy mode: 2 Aimtrack, déjà tout fait, plein de tuto sur les config... Mon option préférée
- Normal mode: 2 Samco light gun, c'est un truc que je ne connaissais pas (voir sur Youtube) à base arduino-like.
- Hard mode: 2 hack de wiimote, ça m'a bien l'aire galère à faire.

Y'a aussi le Siden light gun mais aucune commande possible avant juillet :/

Citation de: Little_Rabbit le Jeudi 13 Mai 2021, 21:48:42 PM
Et de voir ainsi Moto Racer au sien d'une compile de jeux d'arcade, ça fait chaud au cœur !   :-* Bon, c'est clair que l'interface n'avait pas du tout été pensée "panel arcade", on est bien dans l'univers du PC... Est-ce qu'intégrer un mini trackball, ou un track pad, ne serait pas envisageable ? :) Les menus de la version PlayStation s'y prêteraient peut être mieux (je me souviens qu'on supportait les NegCon pour la conduite, mais je ne me rappelle pas si on peut naviguer avec dans les menus...). Mais bien sûr la définition image n'est pas celle d'un PC !...

Franchement, Moto Racer est le jeu auquel je joue le plus dessus, à croire qu'il a été pensé pour de l'arcade. J'vais tenter la version PS1, mais je pense que je vais resté sur l'idée de la souris pour les menus. J'ai envisagé 1 temps d'ajouter 3-4 contrôles clavier (qui sont reconnues dans le menus) mais finalement, juste une souris cachée au dessus de la borne fera l'affaire.

Par contre, on le sent bien dans la vidéo à quel point, dès que Moto Racer est lancé, j'suis à fond dedans... J'ai juste envie de pousser le son à fond et jouer. A 2 doigts d'oublier ce que je faisais avant...
#59
Cabs From Scratch / [WIP] Bartop HangOn
Jeudi 13 Mai 2021, 16:04:14 PM
Salut à vous !

Une petite vidéo faite totalement à l'arrache du bartop fini.
J'essaie d'être complet:

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

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

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



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

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

youtube.com/watch?v=3SlB4BfR14s

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

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

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

A+

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

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

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

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



#61
Cabs From Scratch / Ice cold beer mini à l'étude
Jeudi 06 Mai 2021, 17:41:09 PM
Citation de: ɐɹqoƆ‾ɥƃᴉH le Jeudi 06 Mai 2021, 13:55:57 PM
Sinon, toujours avec des moteurs pas à pas, tu peux aussi t'inspirer des axes Z des imprimantes 3D, ça peut faire une bonne base de travail.
J'étais parti sur ça au départ, mais je pense que ce sera trop lent.
Ce qu'a fait notre confrère Milker Ulucay est tellement simple et efficace que je me sens un peu bête de ne pas y avoir pensé plus tôt.
#62
Cabs From Scratch / Ice cold beer mini à l'étude
Jeudi 06 Mai 2021, 13:23:48 PM
Citation de: sushy18 le Jeudi 06 Mai 2021, 08:31:47 AM
Bravo !!!  ^-^ même si je suis un poil jaloux  ::) :D
je note l'excellent travail.
vraiment  top !
Merci, mais sans ton taf de défrichage, rien n'aurait été possible.
J'suis très motivé a essayer de te permettre de finir ton projet. J''espère au moins te faire avancer, notamment sur le code qui devrait pouvoir facilement se transposer sur la tienne.
Citation de: sushy18 le Jeudi 06 Mai 2021, 08:31:47 AM
suggestion : le décompte de points peut être un peu accéléré ?
Je viens de le ralentir car les sons "merdouillaient" un peu, mais je vais corriger ça.

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

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

déja en v3.0  :o ^-


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



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

Ps: je viens de recevoir mes moteurs, je vais surement essayer de les faire fonctionner ce week-end.
#63
Je les trouve de plus en plus belles ces fameuses PONY, hâte de voir la suite !
#64
Cabs From Scratch / Ice cold beer mini à l'étude
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:



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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

int BTNcredit = 0;                             // Bouton Credit                   


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


void setup() {

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

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

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

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


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

}

void loop() {

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


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

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


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

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

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

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

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

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


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

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

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

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

}//----- FIN LOOP




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

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

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

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


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

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

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

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