Les photos arriveront quant j'aurais reçu les boutons... c'est en cours. en attendant, voici mon code qui m'a tout l'air de fonctionner. Je suis preneur d'amélioration et de remarques. Entre autre, je n'ai pas réussi à augmenter ma capacité de boutons au-dela de 32.
en commande de contrôleur de jeu j'ai donc :
- 28 boutons poussoir
- 3 axes de rotation
- 2 encodeurs rotatif (utilisant les activations de boutons 29 à 32).
#include <Keypad.h>
#include <Joystick.h>
#include <Encoder.h>
#include <Toggle.h>
#define ENABLE_PULLUPS
#define NUMROWS 6 // nombre de colones de la matrice bouton
#define NUMCOLS 5 // nombre de ligne de la matrice bouton
const unsigned long gcCycleDelta = 1000;
const unsigned long gcAnalogDelta = 25;
const unsigned long gcButtonDelta = 500;
unsigned long gNextTime = 0;
unsigned int gCurrentStep = 0;
byte buttons[NUMROWS][NUMCOLS] = { // numéro bouton controleur -1
{0,1,2,3,4},
{5,6,7,8,9},
{10,11,12,13,14},
{15,16,17,18,19},
{20,21,22,23,24},
{25,26,27,28,29},
};
byte rowPins[NUMROWS] = {0,1,2,3,4,5}; // numéro des broche ligne
byte colPins[NUMCOLS] = {6,7,8,9,10}; // numéro des broche colone
Keypad buttbx = Keypad( makeKeymap(buttons), rowPins, colPins, NUMROWS, NUMCOLS);
// déclaration des variable pour l'encodeur 1
const byte encodeurCLKPin1 = 12; // signale de mouvement encodeur 1
const byte encodeurDTPin1 = 13; // signale sens de rotation encodeur 1
Encoder encodeur1(encodeurDTPin1, encodeurCLKPin1);
Toggle encodeurBouton1;
enum EncodeurMouvement1 {IDENTIQUE1, PLUS1, MOINS1};
// déclaration des variable pour l'encodeur 2
const byte encodeurCLKPin2 = A4; // signale de mouvement encodeur 2
const byte encodeurDTPin2 = A5; // signale sens de rotation encodeur 2
Encoder encodeur2(encodeurDTPin2, encodeurCLKPin2);
Toggle encodeurBouton2;
enum EncodeurMouvement2 {IDENTIQUE2, PLUS2, MOINS2};
void setup() {
Joystick.begin();
//joystick.begin();
Joystick.setXAxis (false);
Joystick.setYAxis (false);
Joystick.setZAxis(false);
Joystick.setThrottle(false);
}
void loop() {
CheckAllButtons();
CheckAxes();
CheckEncodeur1();
CheckEncodeur2();
}
void CheckAllButtons(void) {
if (buttbx.getKeys())
{
for (int i=0; i<LIST_MAX; i++)
{
if ( buttbx.key[i].stateChanged )
{
switch (buttbx.key[i].kstate) {
case PRESSED:
case HOLD:
Joystick.setButton(buttbx.key[i].kchar, 1);
//Fixe l'état à 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é)
break;
case RELEASED:
case IDLE:
Joystick.setButton(buttbx.key[i].kchar, 0);
//Fixe l'état à 1 du bouton spécifié (si le numéro est 0 : la valeur est 1 lorsque l'on appuie sur le bouton et 0 si le bouton est relâché)
break;
}
}
}
}
}
void CheckAxes(void) {
// Joystick.setXAxis (analogRead(A4)/4.01+385); // axe X
// Joystick.setYAxis (analogRead(A4)/4.01+385); // axe Y
// Joystick.setZAxis(analogRead(A4)/4.01+385); // axe Z
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
delay (5);
}
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(28,1); delay(40); break;
case MOINS1: Joystick.setButton(29,1); delay(40); break;
default: break;
}
Joystick.setButton(28,0);
Joystick.setButton(29,0);
}
EncodeurMouvement2 detection2() {
static long prevPosition2;
long newPosition2 = encodeur2.read() >> 0; // divise par 4 as the rotary sends 4 ticks per click
long delta = newPosition2 - prevPosition2;
prevPosition2 = newPosition2;
if (delta > 0) return PLUS2;
else if (delta < 0) return MOINS2;
return IDENTIQUE2;
}
void CheckEncodeur2() {
switch (detection2()) {
case PLUS2: Joystick.setButton(30,1); delay(40); break;
case MOINS2: Joystick.setButton(31,1); delay(40); break;
default: break;
}
Joystick.setButton(30,0);
Joystick.setButton(31,0);
}