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.
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 (https://www.gamoover.net/Forums/index.php?topic=42534.msg676098#msg676098)).
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+
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.
(https://gamoovernet.pixhotel.fr/pics_gamoovernet890px/v2/2022/02/28/20220228183014-Cumulus-IMG_20220228_172610.jpg) (https://gamoovernet.pixhotel.fr/pics/v2/2022/02/28/20220228183014-Cumulus-IMG_20220228_172610.jpg)
(https://gamoovernet.pixhotel.fr/pics_gamoovernet890px/v2/2022/02/28/20220228183037-Cumulus-IMG_20220228_180619.jpg) (https://gamoovernet.pixhotel.fr/pics/v2/2022/02/28/20220228183037-Cumulus-IMG_20220228_180619.jpg)
(https://gamoovernet.pixhotel.fr/pics_gamoovernet890px/v2/2022/02/28/20220228183055-Cumulus-IMG_20220228_172552.jpg) (https://gamoovernet.pixhotel.fr/pics/v2/2022/02/28/20220228183055-Cumulus-IMG_20220228_172552.jpg)
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^^
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.
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.
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à.
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 !
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+
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)
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 !
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é.
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 !
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);
}
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+
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 :)
<:) une porte ouverte sur pas mal de titres moto & co ...
@Little_Rabbit
Pour les boutons heureusement que t'avais écris ton sketch en français sinon ça aurait pas été la même histoire^^
Effectivement Gamoover est une mine d'information et de partage dans mes recherches je suis tombé sur des posts de 2004/2006 !
J'espère apporter ma pierre à l'édifice un jour. Je te rejoins sur les réseaux sociaux je n'ai d'ailleurs pas de compte.
@ɐɹqoƆ‾ɥƃᴉH
finalement 4 bouton c'est pas mal car je m'en sert de 3, start, turbo, crédit, pour le dernier il mange pas de pain^^
Pour le rebond je saurais pas te dire car les boutons d'origine était cassé du coup je les ai remplacer.
J'ai mis ce bouton pour le turbo il faut l'adapter car le diamètre est plus petit, mais il fonctionne parfaitement avec le sketch.
https://www.ebay.fr/itm/191702468656?hash=item2ca25b8830:g:rLQAAOSw0HVWCFIp
(https://gamoovernet.pixhotel.fr/pics_gamoovernet890px/v2/2022/03/03/20220303174100-Cumulus-IMG_20220303_164701.jpg) (https://gamoovernet.pixhotel.fr/pics/v2/2022/03/03/20220303174100-Cumulus-IMG_20220303_164701.jpg)
Et pour le start j'ai pris 2 boutons Sanwa en 24 un blanc et un jaune que j'ai fusionné pour qu'il ressemble à l'originale, il fonctionne au top aussi.
(https://gamoovernet.pixhotel.fr/pics_gamoovernet890px/v2/2022/03/03/20220303173944-Cumulus-IMG_20220303_164913.jpg) (https://gamoovernet.pixhotel.fr/pics/v2/2022/03/03/20220303173944-Cumulus-IMG_20220303_164913.jpg)
J'ai fais aussi un petit montage pour mettre les crédits avec le contacteur qu'il y a dans les boutons Sanwa.
Quant on appuie sur le insert/rejet coin de la borne ça mets un crédit.
(https://gamoovernet.pixhotel.fr/pics_gamoovernet890px/v2/2022/03/03/20220303173346-Cumulus-IMG_20220303_165100.jpg) (https://gamoovernet.pixhotel.fr/pics/v2/2022/03/03/20220303173346-Cumulus-IMG_20220303_165100.jpg)
Dommage que j'ai fait l'esthétique des bornes avant l'électronique sinon j'aurais pu partager les travaux avec vous, peut être une autre fois.
@fiend41
T'as raison ce sketch pourra s'adapter sur pas mal de borne de moto et autres, je pense que je vais même mettre Hang On dans la borne !
y'a une liste qui peut aller loin, j'avais même testé F-zero sur l'émulateur N64 avec un guidon moto
Super que cela fonctionne! Bravo.
Du coup j'imagine que tu vas rajouter quelques titres non ?
Salut,
Pour la liste de jeux, tu pourrais t'inspirer de celle que Berunours a faite sur son super bartop home-made (https://www.gamoover.net/Forums/index.php?topic=43085.msg682775#msg682775) !
Il était même parvenu à y inclure Moto Racer 1 dessus 8).
A+
@Fiend41
F-zero 64 j'adore ce jeu, j'avoue qu'avec un guidon/volant analogique ça doit être top !
J'ai eu un guidon en spare avec la borne (sans le cache/compteur) peut être que j'essayerai de faire un contrôleur pour ce jeu, je te dirai quoi.
@APPLE//C
Au début je voulais mettre uniquement les jeux auquel j'ai joué en arcade dans les salle/café, Hang on, SHO, A.B.Cop, et Enduro racer.
Mais je viens de voir le lien de Little Rabbit et y a pas mal de jeu qui donne envie^^
@Little_Rabbit
Merci pour le lien. Magnifique ce bartop (j'aurais jamais cru dire ça un jour^^)
Effectivement c'est une belle liste de jeux, malheureusement avec le PC que j'ai mis dans la borne je pense que les jeux en 3D ne fonctionneront pas.
Moto Racer j'y aurais pas pensé c'est vrai que c'était une pépite à l'époque sur PS1, tu faisait partie de l'équipe de Dev ?
Du coup je vais également ajouter GP Rider, Racing Hero et Stadium Cross.
Je tenterai le coup pour les jeux 3D mais sans grand espoir, à moins que j'Overclock le CPU.
Salut,
Citation de: Cumulus le Samedi 05 Mars 2022, 23:27:32 PM
@Little_Rabbit
Moto Racer j'y aurais pas pensé c'est vrai que c'était une pépite à l'époque sur PS1, tu faisait partie de l'équipe de Dev ?
Oui j'ai eu ce plaisir, sur la version PC et PS1 :).
Citation de: Cumulus le Samedi 05 Mars 2022, 23:27:32 PM
Je tenterai le coup pour les jeux 3D mais sans grand espoir, à moins que j'Overclock le CPU.
Garde en tête que Moto Racer 1 sur PC tournait sous Windows 1995, avec le toute 1ère version de Direct X et les 1ères cartes 3D, qui à l'époque n'était quand même pas bien puissante ;). Donc à moins que le PC que tu utilises soit d'avant 1996, et que ta carte graphique n'ait aucun chip 3D, il y a fort à parier que cela ferait tourner sans problème MR1 :). Mais l'interface est clairement orienté PC (souris...), donc pas sûr que cela s'intègre facilement à ton environnement. Tu utilises quel frontend ?
A+
Salut,
Citation de: Little_Rabbit le Dimanche 06 Mars 2022, 14:17:27 PM
Oui j'ai eu ce plaisir, sur la version PC et PS1 :).
Ça c'est la classe, félicitation pour ce jeu mythique, la maniabilité était au top c'était un peu le Daytona Usa version moto !
Effectivement peut être l'émulateur ePSXe pourrait fonctionner et je pourrai avoir les contrôles analogique de la manette PS1 et me passer de la souris, je vais tester ça.
Pour le frontend j'en ai mis aucun j'aime bien quand c'est sobre, du coup ça boot directement sur Mame avec la liste des jeux dispo.
En parlant de Mame j'ai bien galérer pour paramétrer le mappage du guidon dans l'user interface, à chaque fois que j'éteignais le PC je perdais les contrôles
du guidon pour naviguer dans les menu et pour sélectionner les jeux, pourtant je faisais une save de la config avant de quitter.
Par contre les mappages des boutons dans les jeux (cfg.) eux pas de soucis ils étaient bien sauvegarder.
J'ai finalement trouver la solution il faut indique à Mame l'ID du contrôleurs pour qu'il le reconnaisse à chaque connexion.
Je mets des lien pour ceux que ça intéresse pour les non Anglophone il faudra utilise Googletrad comme moi^^
https://docs.mamedev.org/advanced/devicemap.html
http://forum.arcadecontrols.com/index.php?topic=157599.0
Ça donne ça:
<mameconfig version="10">
<system name="default">
<input>
<mapdevice device="Arduino Leonardo product_votre ID" controller="JOYCODE_1" />
</input>
</system>
</mameconfig>
Maintenant plus besoin de souris/clavier tout ce fait avec le guidon !