Bonjour,
j'utilise une carte lenorado pour réaliser un contrôleur de jeux ayant plus d'une centaine de fonctions (j’utilise 3 cartes).
J'ai 5 types de commande :
- axes : pas de problème pour ces derniers.
- bouton poussoir instantané : pas de problème (sortie 0 à 5 dans mon code)
- bouton a bascule à 2 positions : active durant un court instant une sortie quand on active l’interrupteur, et une autre quant on le désactive. (sortie 6 à 11)
- bouton a bascule à 3 positions : idem version que le 2 positions, mais avec une 3ème. (sortie 12 à 29)
- encodeur rotatif : active une sortie ou une autre suivant le sens de rotation (sortie 30 et 31).
Mes 3 problème :
-
dans le cas des interrupteur bascule, j'ai une redondance ou un éco quant j'actionne un boutons, me faisant clignoter 2 fois la sortie (je n'arrive pas a comprendre pourquoi).
-
dans le cas de l'encodeur rotatif, j'aimerais qu'il soit moins sensible. certaine fois, il envoies sur les 2 sortie l'une après l'autre. (problème encore pas trop gênant)
-
Dernier problème, je trouve la réaction des interrupteur aléatoire. certaine fois, quant j'actionne un interrupteur, je n'ai pas de réaction, et si je le réactive, sa fonctionne.
voilà. ci quelqu'un a des idées de pourquoi sa fonctionne mal, je suis preneur.
merci d'avance.
ci-dessous le code complet :
#include <Keypad.h>
#include <Joystick.h>
#include <Encoder.h>
#include <Toggle.h>
#include "Joystick.h"
#define ENABLE_PULLUPS
#define NUMROWS_IMP 1 // nombre de colones de la matrice bouton
#define NUMCOLS_IMP 6 // nombre de ligne de la matrice bouton
#define NUMROWS_ON 4
#define NUMCOLS_ON 6
#define NUMROWS_OF 4
#define NUMCOLS_OF 6
int nb_bts_impulsion=6;
byte buttons_IMP[NUMROWS_IMP][NUMCOLS_IMP] = { // numéro bouton controleur -1
{0,1,2,3,4,5}, // bts impulsions (6)
};
byte rowPinsIMP[NUMROWS_IMP] = {6}; // numéro des broche ligne
byte colPinsIMP[NUMCOLS_IMP] = {0,1,2,3,4,5}; // numéro des broche colone
Keypad butonsIMP = Keypad( makeKeymap(buttons_IMP), rowPinsIMP, colPinsIMP, NUMROWS_IMP, NUMCOLS_IMP);
byte butons_ON[NUMROWS_ON][NUMCOLS_ON] = {
{27,28}, // 1bts 3 voies (nb 1+3+2=6)
{6,8,10}, // 3bts 2 voies (nb 3)
{12,13,15,16,18,19}, // 3bts 3 voies
{21,22,24,25}, // 2bts 3 voies
};
byte rowPinsON[NUMROWS_ON] = {7,8,9,10};
byte colPinsON[NUMCOLS_ON] = {0,1,2,3,4,5};
Keypad butonsON = Keypad( makeKeymap(butons_ON), rowPinsON, colPinsON, NUMROWS_ON, NUMCOLS_ON);
byte butons_OF[NUMROWS_OF][NUMCOLS_OF] = {
{29,29}, // 1bts 3 voies
{7,9,11}, // 3bts 2 voies
{14,14,17,17,20,20}, // 3bts 3 voies
{23,23,26,26}, // 2bts 3 voies
};
byte rowPinsOF[NUMROWS_OF] = {7,8,9,10};
byte colPinsOF[NUMCOLS_OF] = {0,1,2,3,4,5};
Keypad butonsOF = Keypad( makeKeymap(butons_OF), rowPinsOF, colPinsOF, NUMROWS_OF, NUMCOLS_OF);
// déclaration des variable pour l'encodeur 1
const byte encodeurCLKPin1 = 12; // signal de mouvement encodeur 1
const byte encodeurDTPin1 = 13; // signal sens de rotation encodeur 1
Encoder encodeur1(encodeurDTPin1, encodeurCLKPin1);
Toggle encodeurBouton1;
enum EncodeurMouvement1 {IDENTIQUE1, PLUS1, MOINS1};
void setup() {
Joystick.begin();
Joystick.setXAxis (false);
Joystick.setYAxis (false);
Joystick.setZAxis(false);
}
void loop() {
CheckButtons();
CheckAxes();
CheckEncodeur1();
}
void CheckButtons(void) {
if (butonsIMP.getKeys())
{
for (int i=0; i<nb_bts_impulsion; i++)
{
if ( butonsIMP.key[i].stateChanged )
{
switch (butonsIMP.key[i].kstate) {
case PRESSED:
case HOLD:
Joystick.setButton(butonsIMP.key[i].kchar, 1);
delay(20);
break;
case RELEASED:
case IDLE:
Joystick.setButton(butonsIMP.key[i].kchar, 0);
break;
}
}
}
}
if (butonsON.getKeys())
{
for (int i=0; i<LIST_MAX; i++)
{
if ( butonsON.key[i].stateChanged )
{
switch (butonsON.key[i].kstate) {
case PRESSED:
case HOLD:
Joystick.setButton(butonsON.key[i].kchar, 1);
delay(20);
Joystick.setButton(butonsON.key[i].kchar, 0);
break;
case RELEASED:
case IDLE:
break;
}
}
}
}
if (butonsOF.getKeys())
{
for (int i=0; i<LIST_MAX; i++)
{
if ( butonsOF.key[i].stateChanged )
{
switch (butonsOF.key[i].kstate) {
case RELEASED:
case IDLE:
Joystick.setButton(butonsOF.key[i].kchar, 1);
//Fixe l'état (0 ou 1) du bouton spécifié. si le numéro est 0 : la valeur est 1 si l'on appuie sur le bouton et 0 si le bouton est relâché.
delay(20);
Joystick.setButton(butonsOF.key[i].kchar, 0);
break;
case PRESSED:
case HOLD :
break;
}
}
}
}
}
void CheckAxes(void) {
Joystick.setXAxisRotation(analogRead (A0)/2.845); // axe X rota
Joystick.setYAxisRotation(analogRead (A1)/2.845); // axe Y rota
Joystick.setRudder(analogRead (A2)/4.01); // Palonnier
Joystick.setThrottle(analogRead (A3)/4.01); // Manette de gaz
}
EncodeurMouvement1 detection() {
static long prevPosition1;
long newPosition1 = encodeur1.read() >> 0; // divise par 4 as the rotary sends 4 ticks per click
long delta = newPosition1 - prevPosition1;
prevPosition1 = newPosition1;
if (delta > 0) return PLUS1;
else if (delta < 0) return MOINS1;
return IDENTIQUE1;
}
void CheckEncodeur1() {
switch (detection()) {
case PLUS1: Joystick.setButton(30,1); delay(20); break;
case MOINS1: Joystick.setButton(31,1); delay(20); break;
default: break;
}
Joystick.setButton(30,0);
Joystick.setButton(31,0);
}

