Gamoover

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

Configuration Arduino pour Super Hang On

Démarré par Cumulus, Lundi 28 Février 2022, 06:26:00 AM

Cumulus

Salut,

j'aurais besoin de votre aide pour configurer un Arduino Leonardo pour une borne Super Hang On

J'ai récemment récupérer 2 bornes une Jeutel et une SHO avec des petits problèmes,
Grâce aux conseils de Fred G5, j'ai réussi a remettre en route la Jeutel, maintenant c'est au tour de la SHO

Sur celle ci il manque juste la pcb, j'ai donc configurer un pc avec Calamity15khz pour la remplacer.
Viens le moment de faire le câblage des potards 5K du guidon à l'Arduino pour qu'il soit reconnu par Mame, et là c'est le brouillard total.
Je voudrais configurer les 3 potards du guidon (accélérateur, direction, frein) et les 2 boutons (start, et turbo)

j'ai fait quelques recherches sur le forum et je suis tombé sur ces 2 topics:
https://www.gamoover.net/Forums/index.php?topic=26913.80
https://www.gamoover.net/Forums/index.php?topic=21154.224
Mais j'y ai pas compris grand choses, je me suis donc permis de contacté les 2 auteurs des topics, car j'avais pas osé en crée un pour ça, et malgré leurs bon conseils ça reste flou.

Voici ce que j'ai fait pour le moment:
J'ai télécharger IDE Arduino 1.8.19 et l'Arduino Joystick Library 2.0
https://www.instructables.com/Create-a-Joystick-Using-the-Arduino-Joystick-Libra/
J'ai téléverser un code/sketch de l'Arduino Joystick Library (JoystickButton) dans l'Arduino mais aucun des potards fonctionne.

Mais comme me la souligner Little-Rabbit je n'ai pas assigné dans le script les N° d'entrées analogiques correspondant à celles que j'ai câblées, du coup ça ne fonctionne pas.
J'ai regarder plusieurs vidéos et tuto pour configurer ces pin analogique mais la plus part était en anglais et moi et l'anglais ça fait deux^^

Donc j'ouvre ce topic pour avoir des conseils et avec l'espoir d'arriver à configurer un code/sketch pour l'Arduino qui fonctionne avec SHO.

Merci.

Little_Rabbit

#1
Salut,

Merci d'avoir ouvert ce sujet !  ^-

Pour qu'on puisse t'aider d'avantage, il faut à présent que tu nous mettes le schéma expliquant le raccordement de ta borne (les 3 potards dont tu parles) à l'Arduino/Leonardo.

À défaut de schéma, fais-nous une photo du Leonardo, en soulignant le n° d'entrée analogique utilisée pour chaque potentiomètre.

Ensuite, mets-nous le source de ton "sketch" Arduiono afin qu'on puisse le corriger/compléter pour qu'il corresponde à tes entrées physiques.

Enfin, tu me disais par MP qu'en phase de jeu cela freine quand tu tournes : il faut sous MAME assigner les bons "curseurs analogique" du pad USB que forme ton Arduino, en pressant TAB et en faisant la bonne configuration (j'en parlais dans ce post).

Garde à l'esprit que l'énumération des boutons démarre à 0 :
- le 1er bouton c'est "Bouton 0" sous MAME
- le 2nd bouton c'est "Bouton 1" sous MAME
- etc.

Je ne sais plus si c'est pareil pour les potentiomètres... Mais ce n'est pas gênant en soi car MAME assignera le bouton ou le curseur analogique que tu lui désignes en le manipulant lors de la configuration.

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

Cumulus

#2
Merci à toi surtout.

Alors voici quelques photos de mon câblage du guidon à l'arduino, je précise que j'ai coupé aucun câble ni prise dans la borne
par respect pour la machine et pour pouvoir la remettre d'origine si je trouve une PCB.





Justement j'hésite sur le sketch à prendre comme base dans la librairie de joystick
Logiquement le mieux serait le sketch DrivingControllerTest.

// Program used to test the driving simulator functions on
// the USB Joystick object on the Arduino Leonardo or
// Arduino Micro.
//
// Matthew Heironimus
// 2016-05-29   Original version.
//------------------------------------------------------------

#include "Joystick.h"

Joystick_ Joystick(JOYSTICK_DEFAULT_REPORT_ID,
  JOYSTICK_TYPE_MULTI_AXIS, 4, 0,
  false, false, false, false, false, false,
  false, false, true, true, true);

// Set to true to test "Auto Send" mode or false to test "Manual Send" mode.
//const bool testAutoSendMode = true;
const bool testAutoSendMode = false;

const unsigned long gcCycleDelta = 1000;
const unsigned long gcButtonDelta = 500;
const unsigned long gcAnalogDelta = 25;
unsigned long gNextTime = 0;
unsigned int gCurrentStep = 0;

void testSingleButtonPush(unsigned int button)
{
  if (button > 0)
  {
    Joystick.releaseButton(button - 1);
  }
  if (button < 4)
  {
    Joystick.pressButton(button);
  }
}

void testMultiButtonPush(unsigned int currentStep)
{
  for (int button = 0; button < 4; button++)
  {
    if ((currentStep == 0) || (currentStep == 2))
    {
      if ((button % 2) == 0)
      {
        Joystick.pressButton(button);
      } else if (currentStep != 2)
      {
        Joystick.releaseButton(button);
      }
    } // if ((currentStep == 0) || (currentStep == 2))
    if ((currentStep == 1) || (currentStep == 2))
    {
      if ((button % 2) != 0)
      {
        Joystick.pressButton(button);
      } else if (currentStep != 2)
      {
        Joystick.releaseButton(button);
      }
    } // if ((currentStep == 1) || (currentStep == 2))
    if (currentStep == 3)
    {
      Joystick.releaseButton(button);
    } // if (currentStep == 3)
  } // for (int button = 0; button < 32; button++)
}

void testAcceleratorBrake(int value)
{
  Joystick.setAccelerator(value);
  Joystick.setBrake(260 - value);
}

void testSteering(int value)
{
  if (value < 300) {
    Joystick.setSteering(value);
  } else {
    Joystick.setSteering(600 - value);
  }
}

void setup() {

  Joystick.setAcceleratorRange(0, 260);
  Joystick.setBrakeRange(0, 260);
  Joystick.setSteeringRange(0, 300);
 
  if (testAutoSendMode)
  {
    Joystick.begin();
  }
  else
  {
    Joystick.begin(false);
  }
 
  pinMode(A0, INPUT_PULLUP);
  pinMode(LED_BUILTIN, OUTPUT);
}

void loop() {

  // System Disabled
  if (digitalRead(A0) != 0)
  {
    // Turn indicator light off.
    digitalWrite(LED_BUILTIN, 0);
    return;
  }

  // Turn indicator light on.
  digitalWrite(LED_BUILTIN, 1);
 
  if (millis() >= gNextTime)
  {
   
    if (gCurrentStep < 4)
    {
      gNextTime = millis() + gcButtonDelta;
      testSingleButtonPush(gCurrentStep);
    }
    else if (gCurrentStep < 9)
    {
      gNextTime = millis() + gcButtonDelta;
      testMultiButtonPush(gCurrentStep - 5);
    }
    else if (gCurrentStep < (9 + 260))
    {
      gNextTime = millis() + gcAnalogDelta;
      testAcceleratorBrake(gCurrentStep - 9);
    }
    else if (gCurrentStep < (9 + 260 + 600))
    {
      gNextTime = millis() + gcAnalogDelta;
      testSteering(gCurrentStep - (9 + 260));
    }
   
    if (testAutoSendMode == false)
    {
      Joystick.sendState();
    }
   
    gCurrentStep++;
    if (gCurrentStep >= (9 + 260 + 600))
    {
      gNextTime = millis() + gcCycleDelta;
      gCurrentStep = 0;
    }
  }
}


Pour Mame j'avais vu ton post, mais dès que je tournais le guidon dans les réglage peu importe la ligne ça m'affichait frein comme bouton.
Peut être car dans ton code le potard était assigner au frein.

Je continue à lire des tutos sur le codage des potentiomètres avec des analogRead et autres, mais c'est pas simple^^

ɐɹqoƆ‾ɥƃᴉH

#3
Alors, de ce que je vois du code et de ce qu'il y a sur la page GitHub du projet, le sketch DrivingControllerTest ne lit pas du tout les entrées et va juste simuler un joystick avec des sorties analogiques (Accélérateur, Frein, Direction) et 4 boutons. A condition que A0 soit à la masse

DrivingControllerTest - Creates a Driving Controller and tests 4 buttons, the Steering, Brake, and Accelerator when pin A0 is grounded.

Ca te permets de tester que ton Arduino communique bien avec ton PC.

Si A0 est bien à la masse, la led de l'Arduino doit s'allumer et des valeurs sont envoyés au PC (que tu dois pouvoir vérifier en regardant comment se comporte le joystick détecté par le PC)

Tu as déjà testé ce point ? Ca permets de valider que ton Arduino est bien détecté et fonctionne bien.


Edit : je viens de pousser le code rapidement dans un Pro Micro que j'avais sous la main (équivalent au Leonardo) et je confirme donc ce que je disais au dessus : il est détecté comme un joystick 3 axes + 4 boutons et tant que A0 est "grounded", ça fait évoluer les valeurs sur les 3 axes et simule des appuis sur les boutons. Dès que A0 n'est plus à la masse, il ne se passe plus rien et ça reprends dès que A0 revient à niveau bas.

Cumulus

Merci pour ces infos et pour le test !

J'avais fait le test et effectivement il entrait uniquement en mode test,
mais j'avais pensé naïvement qu'il suffisait de modifier le code pour qu'il fonctionne^^

Donc les sketch valide serait le JoystickButton ou le GamepadExample vu que les autres sont aussi des "test"

JoystickButton code

// Simple example application that shows how to read four Arduino
// digital pins and map them to the USB Joystick library.
//
// Ground digital pins 9, 10, 11, and 12 to press the joystick
// buttons 0, 1, 2, and 3.
//
// NOTE: This sketch file is for use with Arduino Leonardo and
//       Arduino Micro only.
//
// by Matthew Heironimus
// 2015-11-20
//--------------------------------------------------------------------

#include <Joystick.h>

Joystick_ Joystick;

void setup() {
  // Initialize Button Pins
  pinMode(9, INPUT_PULLUP);
  pinMode(10, INPUT_PULLUP);
  pinMode(11, INPUT_PULLUP);
  pinMode(12, INPUT_PULLUP);

  // Initialize Joystick Library
  Joystick.begin();
}

// Constant that maps the phyical pin to the joystick button.
const int pinToButtonMap = 9;

// Last state of the button
int lastButtonState[4] = {0,0,0,0};

void loop() {

  // Read pin values
  for (int index = 0; index < 4; index++)
  {
    int currentButtonState = !digitalRead(index + pinToButtonMap);
    if (currentButtonState != lastButtonState[index])
    {
      Joystick.setButton(index, currentButtonState);
      lastButtonState[index] = currentButtonState;
    }
  }

  delay(50);
}


GamepadExample code

// Simple gamepad example that demonstraits how to read five Arduino
// digital pins and map them to the Arduino Joystick library.
//
// The digital pins 2 - 6 are grounded when they are pressed.
// Pin 2 = UP
// Pin 3 = RIGHT
// Pin 4 = DOWN
// Pin 5 = LEFT
// Pin 6 = FIRE
//
// NOTE: This sketch file is for use with Arduino Leonardo and
//       Arduino Micro only.
//
// by Matthew Heironimus
// 2016-11-24
//--------------------------------------------------------------------

#include <Joystick.h>

Joystick_ Joystick(JOYSTICK_DEFAULT_REPORT_ID,JOYSTICK_TYPE_GAMEPAD,
  1, 0,                  // Button Count, Hat Switch Count
  true, true, false,     // X and Y, but no Z Axis
  false, false, false,   // No Rx, Ry, or Rz
  false, false,          // No rudder or throttle
  false, false, false);  // No accelerator, brake, or steering

void setup() {
  // Initialize Button Pins
  pinMode(2, INPUT_PULLUP);
  pinMode(3, INPUT_PULLUP);
  pinMode(4, INPUT_PULLUP);
  pinMode(5, INPUT_PULLUP);
  pinMode(6, INPUT_PULLUP);

  // Initialize Joystick Library
  Joystick.begin();
  Joystick.setXAxisRange(-1, 1);
  Joystick.setYAxisRange(-1, 1);
}

// Last state of the buttons
int lastButtonState[5] = {0,0,0,0,0};

void loop() {

  // Read pin values
  for (int index = 0; index < 5; index++)
  {
    int currentButtonState = !digitalRead(index + 2);
    if (currentButtonState != lastButtonState[index])
    {
      switch (index) {
        case 0: // UP
          if (currentButtonState == 1) {
            Joystick.setYAxis(-1);
          } else {
            Joystick.setYAxis(0);
          }
          break;
        case 1: // RIGHT
          if (currentButtonState == 1) {
            Joystick.setXAxis(1);
          } else {
            Joystick.setXAxis(0);
          }
          break;
        case 2: // DOWN
          if (currentButtonState == 1) {
            Joystick.setYAxis(1);
          } else {
            Joystick.setYAxis(0);
          }
          break;
        case 3: // LEFT
          if (currentButtonState == 1) {
            Joystick.setXAxis(-1);
          } else {
            Joystick.setXAxis(0);
          }
          break;
        case 4: // FIRE
          Joystick.setButton(0, currentButtonState);
          break;
      }
      lastButtonState[index] = currentButtonState;
    }
  }

  delay(10);
}


J'ai essayé de les modifier mais à chaque fois que je les vérifie j'ai des erreurs.
Je dois pas écrire le code au bon endroit.

ɐɹqoƆ‾ɥƃᴉH

Aucun des 2 exemples ne gère l'analogique, ça ne réponds pas à ton besoin. Et dans tous les cas, la lib ne gère pas la lecture des entrées analogique, c'est bon son but.

Je veux pas être défaitiste mais si t'as jamais fait de dev et que t'es pas à l'aise en anglais, je te conseille de trouver un bout de code qui marche déjà parce que sinon tu risques de passer beaucoup de temps à essayer de faire fonctionner ton code par tâtonnement sans trop savoir où tu vas.

Je pense que parmi toutes les bidouilles d'Aganyte, il doit bien avoir un truc qui fait ce que tu veux, regarde peut-être de coté là.

Cumulus

Tu n'est pas défaitiste, tu es plutôt réaliste^^
Je me suis fais la même réflexion âpres avoir essayé de bidouiller plusieurs codes sans succès.

Tu as raison le mieux c'est de partir d'un code déjà existant, je vais partir sur le code que Little-Rabbit à fait pour ça Pole Position.
Dans son code il manque juste un potard pour la direction j'avais essayé de le rajouter mais ce fut un échec avec des erreurs partout.
https://www.gamoover.net/Forums/index.php?topic=42534.16

// Program used to test the USB Joystick object on the
// Arduino Leonardo or Arduino Micro.
//
// Matthew Heironimus
// 2015-03-28 - Original Version
// 2015-11-18 - Updated to use the new Joystick library
//              written for Arduino IDE Version 1.6.6 and
//              above.
// 2016-05-13   Updated to use new dynamic Joystick library
//              that can be customized.
//------------------------------------------------------------

#include "Joystick.h"

#define MaxButtonQty 4
#define FirstButtonPinNumber 4
#define Frein A0
#define Accelerateur A1



// Create Joystick
Joystick_ Joystick(JOYSTICK_DEFAULT_REPORT_ID, JOYSTICK_TYPE_JOYSTICK,
  MaxButtonQty, 0,       // 4 boutons, pas de Hat Switch
  true, true, false,     // Conserve un axe X et Y, mais les laisse en position neutre, pas d'axe Z
  false, false, false,   // Pas de Rx, Ry, ou Rz
  false, true,           // Pas de rudder, mais throttle en guise d'accélérateur
  false, true, false);    // seulement un frein, pas de volant (ni accélérateur car ne semble pas fonctionner...)



// Set to true to test "Auto Send" mode or false to test "Manual Send" mode.
//const bool testAutoSendMode = true;
const bool testAutoSendMode = false;

//const bool DebugMode = true;
const bool DebugMode = false;



void setup() {

  //Start serial communication with the computer
  if (DebugMode)
  {
    Serial.begin(9600);
  }

  // Set Range Values
  Joystick.setXAxisRange(-127, 127);
  Joystick.setYAxisRange(-127, 127);
  Joystick.setXAxis(0);
  Joystick.setYAxis(0);

   
  Joystick.setThrottleRange(0, 1023);
  Joystick.setThrottle(0);
  /*Joystick.setAcceleratorRange(0, 1023);
  Joystick.setAccelerator(0);*/
  Joystick.setBrakeRange(0, 1023);
  Joystick.setBrake(0);


// Les boutons du panel sont attribués aux pin 4 à 7
  pinMode(FirstButtonPinNumber, INPUT_PULLUP);
  pinMode(FirstButtonPinNumber + 1, INPUT_PULLUP);
  pinMode(FirstButtonPinNumber + 2, INPUT_PULLUP);
  pinMode(FirstButtonPinNumber + 3, INPUT_PULLUP);

  // l'accélérateur et le frein sont associée aux entrées analogiques A0 et A1
  // A0 = frein
  // A1 = accélérateur
  // les axes X et Y ne sont que virtuels, en position neutre, donc pas d'entrées analogiques pour eux
  pinMode(A0, INPUT_PULLUP);
  pinMode(A1, INPUT_PULLUP);




  if (testAutoSendMode)
  {
    Joystick.begin();
  }
  else
  {
    Joystick.begin(false);
  }

  // pour pouvour faire clignoter la LED du Leonardo
  pinMode(13, OUTPUT);
}


// État précédent des boutons
int lastButtonState[MaxButtonQty] = {0,0,0,0};
// Valeurs précédentes de l'accélérateur et du frein
int lastAcceleratorValue = 0;
int lastBrakeValue = 0;




void loop() {

int index;
int currentButtonState;
int currentAnalogValue;
String DebugMsg;
String Msg1;
String Msg2;
String Msg3;
bool ButtonChange;

  Msg1 = String("Gas     = ");
  Msg2 = String("Brake   = ");
  Msg3 = String("Buttons = ");
  // remet à 0 la chaîne utilisée pour les messages de debug
  DebugMsg = String();

  // Turn indicator light on.
  digitalWrite(13, 1);

  // lit les valeurs analogiques
  // l'accélérateur
  currentAnalogValue = analogRead(Accelerateur);
  if (currentAnalogValue != lastAcceleratorValue)
  {
    lastAcceleratorValue = currentAnalogValue;
    Joystick.setAccelerator (lastAcceleratorValue);
    Joystick.setThrottle (currentAnalogValue);
    if (DebugMode)
    {
      DebugMsg = Msg1 + lastAcceleratorValue;
      Serial.println(DebugMsg);
    }
  }

  // puis le frein
  currentAnalogValue = analogRead(Frein);
  if (currentAnalogValue != lastBrakeValue)
  {
    lastBrakeValue = currentAnalogValue;
    Joystick.setBrake (currentAnalogValue);
    if (DebugMode)
    {     
      DebugMsg = Msg2 + lastBrakeValue;
      Serial.println(DebugMsg);
    }
  }

  // Lit les boutons
  ButtonChange = false;
  for (index = 0; index < MaxButtonQty; index++)
  {
    currentButtonState = !digitalRead(index + FirstButtonPinNumber);
    if (currentButtonState != lastButtonState[index])
    {
      Joystick.setButton(index, currentButtonState);
      lastButtonState[index] = currentButtonState;
      ButtonChange = true;
    }
  }
  if (DebugMode)
  {
    if (ButtonChange == true)
    {
      DebugMsg = Msg3 + lastButtonState[0] + " " + lastButtonState[1] + " " + lastButtonState[2] + " " + lastButtonState[3];
      Serial.println(DebugMsg);
    }
  }
   
  if (testAutoSendMode == false)
  {
    Joystick.sendState();
  }

  //Attend 15 ms avant de boucler
  delay(15);

}


Je l'ai testé telle quelle et les 2 potards du guidon et les boutons fonctionne bien dans le mode test.
Il faudrait que j'arrive à le modifier pour ajouter un 3eme potards, mais c'est pas gagner !

Little_Rabbit

Salut,

En effet, il ne doit quasiment rien manquer à mon sketch pour qu'il fasse ce dont tu as besoin :).

Je n'ai pas encore eu le temps de me repencher sur le source, mais à partir des informations complémentaires que tu nous a données, je vais essayer de te faire ça sans trop tarder ;). Je pensais mettre le guidon sur l'axe X du joystick analogique... À suivre :).

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

ɐɹqoƆ‾ɥƃᴉH

Ok, si t'as déjà un bout de code qui gère 2 potards, ça doit pas être compliqué d'en ajouter un 3ème, je vais regarder ça dans la journée et je te dit (reste à voir si j'ai au moins un potard qui traine dans un coin pour tester)

Cumulus

Vous êtes mes sauveurs !

Je me voyais déjà ensevelie sous les codes erreur de l'Arduino^^

Bonne idée de mettre le guidon sur l'axe du joystick, comme le potard de direction reviens toujours au milieu c'est le même principe qu'un joystick.

C'est super sympa de votre part de prendre le temps de m'aider, merci !




ɐɹqoƆ‾ɥƃᴉH

Première tentative de bout de code à la pause de midi avec 3 axes : Direction (A2), Accélérateur (A1) et Frein (A0). J'ai testé vite fait et les 3 axes répondent bien sur mon Pro Micro qui se prends pour un Leonardo :D :D

Tu peux changer les entrées utilisées aux lignes 15 à 17 si tu veux mapper les choses autrement

// Program used to test the USB Joystick object on the
// Arduino Leonardo or Arduino Micro.
//
// Matthew Heironimus
// 2015-03-28 - Original Version
// 2015-11-18 - Updated to use the new Joystick library
//              written for Arduino IDE Version 1.6.6 and
//              above.
// 2016-05-13   Updated to use new dynamic Joystick library
//              that can be customized.
//------------------------------------------------------------

#include "Joystick.h"

#define FREIN A0
#define ACC A1
#define STEERING A2

// Valeurs précédentes de l'accélérateur et du frein
int lastAcceleratorValue = 0;
int lastBrakeValue = 0;
int lastSteeringValue = 0;

// Create Joystick
Joystick_ Joystick(JOYSTICK_DEFAULT_REPORT_ID, JOYSTICK_TYPE_JOYSTICK,
                   0, 0,
                   false, false, false,
                   false, false, false,
                   false, false,
                   true, true, true);

// Set to true to test "Auto Send" mode or false to test "Manual Send" mode.
//const bool testAutoSendMode = true;
const bool testAutoSendMode = false;

//const bool DebugMode = true;
const bool DebugMode = false;

void setup() {
  //Start serial communication with the computer
  if (DebugMode)
  {
    Serial.begin(9600);
  }

  Joystick.setAcceleratorRange(0, 1023);
  Joystick.setAccelerator(0);
  Joystick.setBrakeRange(0, 1023);
  Joystick.setBrake(0);
  Joystick.setSteeringRange(0, 1023);
  Joystick.setSteering(0);

  pinMode(FREIN, INPUT_PULLUP);
  pinMode(ACC, INPUT_PULLUP);
  pinMode(STEERING, INPUT_PULLUP);
  pinMode(13, OUTPUT);

  if (testAutoSendMode)
  {
    Joystick.begin();
  }
  else
  {
    Joystick.begin(false);
  }
}


void loop() {

  int currentAnalogValue;
  String DebugMsg;
  String Msg1;
  String Msg2;
  String Msg3;

  Msg1 = String("Gas     = ");
  Msg2 = String("Brake   = ");
  Msg3 = String("Steering = ");
  // remet à 0 la chaîne utilisée pour les messages de debug
  DebugMsg = String();

  // Turn indicator light on.
  digitalWrite(13, 1);

  // lit les valeurs analogiques
  // l'accélérateur
  currentAnalogValue = analogRead(ACC);
  if (currentAnalogValue != lastAcceleratorValue)
  {
    lastAcceleratorValue = currentAnalogValue;
    Joystick.setAccelerator (lastAcceleratorValue);
    if (DebugMode)
    {
      DebugMsg = Msg1 + lastAcceleratorValue;
      Serial.println(DebugMsg);
    }
  }

  // puis le frein
  currentAnalogValue = analogRead(FREIN);
  if (currentAnalogValue != lastBrakeValue)
  {
    lastBrakeValue = currentAnalogValue;
    Joystick.setBrake (currentAnalogValue);
    if (DebugMode)
    {
      DebugMsg = Msg2 + lastBrakeValue;
      Serial.println(DebugMsg);
    }
  }

  // puis la direction
  currentAnalogValue = analogRead(STEERING);
  if (currentAnalogValue != lastSteeringValue)
  {
    lastSteeringValue = currentAnalogValue;
    Joystick.setSteering(currentAnalogValue);
    if (DebugMode)
    {
      DebugMsg = Msg3 + lastSteeringValue;
      Serial.println(DebugMsg);
    }
  }

  if (testAutoSendMode == false)
  {
    Joystick.sendState();
  }

  //Attend 15 ms avant de boucler
  delay(15);
}


Tiens nous au courant de ce que ça donne de ton coté.

Cumulus

Génial !

Dommage que je vois ton message à cet heure ci sinon j'aurais déjà pu faire le test, j'ai hâte d'être à demain^^

Encore merci !

Cumulus

Salut,

J'ai testé le sketch et ça marche au top !

Quand j'ai téléverser le sketch dans l'arduino je me suis dit il manque pas quelque chose ?
C'était les boutons pour le start et le turbo ils était plus là^^

Je voulais pas faire mon relou alors j'ai tenté de les remettre dans le sketch avec comme model celui de Little-Rabbit
et au miracle j'ai réussi à le insérer dans le sketch sans erreurs, bon c'était pas difficile, mais j'étais content^^

Après étalonnage du guidon dans le mode test j'ai réglé le tout dans Mame, au début j'ai un peu galérer car l'accélérateur fait défiler
le menu dans les réglages, mais on le tournant un peu il s'arrête donc c'est bon. Il faut encore peaufiner la sensibilité et ça sera top !

Un grand merci ɐɹqoƆ‾ɥƃᴉH pour m'avoir modifier le sketch et merci également à Little Rabbit pour le partage de ton sketch.
Comme je pourrai pas vous rendre l'appareil je ferai un petit don au forum qui m'a bien aider.

Je mets le sketch avec les boutons peut être qu'il servira à quelqu'un un jour

// Program used to test the USB Joystick object on the
// Arduino Leonardo or Arduino Micro.
//
// Matthew Heironimus
// 2015-03-28 - Original Version
// 2015-11-18 - Updated to use the new Joystick library
//              written for Arduino IDE Version 1.6.6 and
//              above.
// 2016-05-13   Updated to use new dynamic Joystick library
//              that can be customized.
//------------------------------------------------------------

#include "Joystick.h"

#define MaxButtonQty 4
#define FirstButtonPinNumber 4
#define FREIN A0
#define ACC A1
#define STEERING A2

// Valeurs précédentes de l'accélérateur et du frein
int lastAcceleratorValue = 0;
int lastBrakeValue = 0;
int lastSteeringValue = 0;

// Create Joystick
Joystick_ Joystick(JOYSTICK_DEFAULT_REPORT_ID, JOYSTICK_TYPE_JOYSTICK,
                   MaxButtonQty, 0,       // 4 boutons, pas de Hat Switch,
                   false, false, false,
                   false, false, false,
                   false, false,
                   true, true, true);

// Set to true to test "Auto Send" mode or false to test "Manual Send" mode.
//const bool testAutoSendMode = true;
const bool testAutoSendMode = false;

//const bool DebugMode = true;
const bool DebugMode = false;

void setup() {
  //Start serial communication with the computer
  if (DebugMode)
  {
    Serial.begin(9600);
  }

  Joystick.setAcceleratorRange(0, 1023);
  Joystick.setAccelerator(0);
  Joystick.setBrakeRange(0, 1023);
  Joystick.setBrake(0);
  Joystick.setSteeringRange(0, 1023);
  Joystick.setSteering(0);

  pinMode(FREIN, INPUT_PULLUP);
  pinMode(ACC, INPUT_PULLUP);
  pinMode(STEERING, INPUT_PULLUP);
  pinMode(13, OUTPUT);

  // Les boutons du panel sont attribués aux pin 4 à 7
  pinMode(FirstButtonPinNumber, INPUT_PULLUP);
  pinMode(FirstButtonPinNumber + 1, INPUT_PULLUP);
  pinMode(FirstButtonPinNumber + 2, INPUT_PULLUP);
  pinMode(FirstButtonPinNumber + 3, INPUT_PULLUP);
 
  if (testAutoSendMode)
  {
    Joystick.begin();
  }
  else
  {
    Joystick.begin(false);
  }
}

// État précédent des boutons
int lastButtonState[MaxButtonQty] = {0,0,0,0};

void loop() {
 
  int index;
  int currentButtonState;
  int currentAnalogValue;
  String DebugMsg;
  String Msg1;
  String Msg2;
  String Msg3;
  bool ButtonChange;

  Msg1 = String("Gas     = ");
  Msg2 = String("Brake   = ");
  Msg3 = String("Steering = ");
  // remet à 0 la chaîne utilisée pour les messages de debug
  DebugMsg = String();

  // Turn indicator light on.
  digitalWrite(13, 1);

  // lit les valeurs analogiques
  // l'accélérateur
  currentAnalogValue = analogRead(ACC);
  if (currentAnalogValue != lastAcceleratorValue)
  {
    lastAcceleratorValue = currentAnalogValue;
    Joystick.setAccelerator (lastAcceleratorValue);
    if (DebugMode)
    {
      DebugMsg = Msg1 + lastAcceleratorValue;
      Serial.println(DebugMsg);
    }
  }

  // puis le frein
  currentAnalogValue = analogRead(FREIN);
  if (currentAnalogValue != lastBrakeValue)
  {
    lastBrakeValue = currentAnalogValue;
    Joystick.setBrake (currentAnalogValue);
    if (DebugMode)
    {
      DebugMsg = Msg2 + lastBrakeValue;
      Serial.println(DebugMsg);
    }
  }

  // puis la direction
  currentAnalogValue = analogRead(STEERING);
  if (currentAnalogValue != lastSteeringValue)
  {
    lastSteeringValue = currentAnalogValue;
    Joystick.setSteering(currentAnalogValue);
    if (DebugMode)
    {
      DebugMsg = Msg3 + lastSteeringValue;
      Serial.println(DebugMsg);
    }
  }
 
  // Lit les boutons
  ButtonChange = false;
  for (index = 0; index < MaxButtonQty; index++)
  {
    currentButtonState = !digitalRead(index + FirstButtonPinNumber);
    if (currentButtonState != lastButtonState[index])
    {
      Joystick.setButton(index, currentButtonState);
      lastButtonState[index] = currentButtonState;
      ButtonChange = true;
    }
  }
  if (DebugMode)
  {
    if (ButtonChange == true)
    {
      DebugMsg = Msg3 + lastButtonState[0] + " " + lastButtonState[1] + " " + lastButtonState[2] + " " + lastButtonState[3];
      Serial.println(DebugMsg);
    }
  }
   
  if (testAutoSendMode == false)
  {
    Joystick.sendState();
  }

  //Attend 15 ms avant de boucler
  delay(15);
}



Little_Rabbit

Salut,

Génial ! C'est super que cela fonctionne à présent !  ^-^

High-Cobra a été plus rapide que moi : c'est parfait que son script fonctionne ! :)

Tu t'es débrouillé comme un chef pour ajouter les boutons manquants  8).

Quant au partage, c'est bien tout l'intérêt d'un forum comme Gamoover : se faire aider, aider les autres quand on peut, et conserver la trace de ces développements pour que cela en aide d'autres dans le futur :). Mille fois plus intéressant que l'éphémère et le futile des réseaux sociaux ! ;)

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

ɐɹqoƆ‾ɥƃᴉH

Alors effectivement, quand j'ai modifié le code et supprimé tous les boutons, j'ai eu un doute sur le coup :D :D mais t'as bien géré pour les remettre !

Après, pour faire les choses totalement propres, tu pourrais modifier un tout petit peu le code pour ne gérer que les 2 boutons nécessaires.

Aure question que je me pose parce que j'ai déjà eu le problème sur d'autres applications hors arcade, n'y a-t-il pas le risque d'avoir un peu de rebond sur les boutons ? Surtout sur des vieux contacteurs pas toujours très précis...

Si tu remarques que lors d'un appui ça en fait plusieurs, c'est que le contact n'est pas très franc et qu'il faudra ajouter une routine de debounce.

Merci pour le partage et merci à Little_Rabbit pour le code d'origine, j'ai juste adapté quelque lignes, le mérite lui revient  :)

fiend41

 <:)  une porte ouverte sur pas mal de titres moto & co ...
"C'était un fou un peu mystique Mais avec une certaine crédibilité..."