Bonjour cher(e)s passionné(e)s d'Arduino et de projets DIY !
Je me lance dans un nouveau défi passionnant : la création d'une Boite a bouton pour mes jeux de simulation. Voici un aperçu rapide de ce que je tente de réaliser :
Éléments du Projet :
- Matrice de Boutons 5x5
- Trois Encodeurs Rotatifs EC11 reliés à un CD74HC4067
- Six Boutons Indépendants connectés au CD74HC4067
- Arduino Pro Mini pour la logique de contrôle
- Utilisation d'un CD74HC4067 pour l'extension d'entrées
Objectif Actuel : J'ai adapté le code d'amStudio Lien du code, qui fonctionne parfaitement dans d'autres projets, pour inclure un multiplexeur (CD74HC4067). Cependant, je rencontre un problème : tous les boutons de 24 à 32 semblent être constamment activés
Le code modifier:
//BUTTON BOX
//USE w ProMicro
//Tested in WIN10 + Assetto Corsa
//AMSTUDIO
//20.8.17
#include <Keypad.h>
#include <Joystick.h>
#include <light_CD74HC4067.h> // Include the library for the multiplexer
#define ENABLE_PULLUPS
#define NUMROTARIES 3
#define NUMBUTTONS 25
#define NUMROWS 5
#define NUMCOLS 5
byte buttons[NUMROWS][NUMCOLS] = {
{ 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 },
};
struct rotariesdef {
byte pin1;
byte pin2;
int ccwchar;
int cwchar;
volatile unsigned char state;
};
rotariesdef rotaries[NUMROTARIES]{
//Ce n'est pas les bon pin je ne sais pas comment les declarer. ils sont relier au CD74HC4067
{ 0, 1, 24, 25, 0 },
{ 2, 3, 26, 27, 0 },
{ 4, 5, 28, 29, 0 },
};
#define DIR_CCW 0x10
#define DIR_CW 0x20
#define R_START 0x0
#ifdef HALF_STEP
#define R_CCW_BEGIN 0x1
#define R_CW_BEGIN 0x2
#define R_START_M 0x3
#define R_CW_BEGIN_M 0x4
#define R_CCW_BEGIN_M 0x5
const unsigned char ttable[6][4] = {
// R_START (00)
{ R_START_M, R_CW_BEGIN, R_CCW_BEGIN, R_START },
// R_CCW_BEGIN
{ R_START_M | DIR_CCW, R_START, R_CCW_BEGIN, R_START },
// R_CW_BEGIN
{ R_START_M | DIR_CW, R_CW_BEGIN, R_START, R_START },
// R_START_M (11)
{ R_START_M, R_CCW_BEGIN_M, R_CW_BEGIN_M, R_START },
// R_CW_BEGIN_M
{ R_START_M, R_START_M, R_CW_BEGIN_M, R_START | DIR_CW },
// R_CCW_BEGIN_M
{ R_START_M, R_CCW_BEGIN_M, R_START_M, R_START | DIR_CCW },
};
#else
#define R_CW_FINAL 0x1
#define R_CW_BEGIN 0x2
#define R_CW_NEXT 0x3
#define R_CCW_BEGIN 0x4
#define R_CCW_FINAL 0x5
#define R_CCW_NEXT 0x6
const unsigned char ttable[7][4] = {
// R_START
{ R_START, R_CW_BEGIN, R_CCW_BEGIN, R_START },
// R_CW_FINAL
{ R_CW_NEXT, R_START, R_CW_FINAL, R_START | DIR_CW },
// R_CW_BEGIN
{ R_CW_NEXT, R_CW_BEGIN, R_START, R_START },
// R_CW_NEXT
{ R_CW_NEXT, R_CW_BEGIN, R_CW_FINAL, R_START },
// R_CCW_BEGIN
{ R_CCW_NEXT, R_START, R_CCW_BEGIN, R_START },
// R_CCW_FINAL
{ R_CCW_NEXT, R_CCW_FINAL, R_START, R_START | DIR_CCW },
// R_CCW_NEXT
{ R_CCW_NEXT, R_CCW_FINAL, R_CCW_BEGIN, R_START },
};
#endif
byte rowPins[NUMROWS] = { 5, 6, 7, 8, 9 };
byte colPins[NUMCOLS] = { 10, 13, 14, 15, 4 };
Keypad buttbx = Keypad(makeKeymap(buttons), rowPins, colPins, NUMROWS, NUMCOLS);
Joystick_ Joystick(JOYSTICK_DEFAULT_REPORT_ID,
JOYSTICK_TYPE_JOYSTICK, 40, 0, // Change the number of buttons to 40
false, false, false, false, false, false,
false, false, false, false, false);
CD74HC4067 mux(A1, A2, A3, 3); // Create a CD74HC4067 object with control pins and common pin
void setup() {
Joystick.begin();
rotary_init();
}
void loop() {
CheckAllEncoders();
CheckAllButtons();
}
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);
break;
case RELEASED:
case IDLE:
Joystick.setButton(buttbx.key[i].kchar, 0);
break;
}
}
}
}
// Add this code to read the 16 channels of the multiplexer and send them to the joystick
for (int i = 0; i < 16; i++) {
int val = analogRead(i);
Joystick.setButton(i + 24, val);
}
}
void rotary_init() {
for (int i = 0; i < NUMROTARIES; i++) {
pinMode(rotaries[i].pin1, INPUT);
pinMode(rotaries[i].pin2, INPUT);
#ifdef ENABLE_PULLUPS
digitalWrite(rotaries[i].pin1, HIGH);
digitalWrite(rotaries[i].pin2, HIGH);
#endif
}
}
unsigned char rotary_process(int _i) {
unsigned char pinstate = (digitalRead(rotaries[_i].pin2) << 1) | digitalRead(rotaries[_i].pin1);
rotaries[_i].state = ttable[rotaries[_i].state & 0xf][pinstate];
return (rotaries[_i].state & 0x30);
}
// Add this code to check the rotation of the encoders and send the signals to the joystick
void CheckAllEncoders(void) {
for (int i = 0; i < NUMROTARIES; i++) {
unsigned char result = rotary_process(i);
if (result == DIR_CCW) {
Joystick.setButton(rotaries[i].ccwchar, 1);
delay(50);
Joystick.setButton(rotaries[i].ccwchar, 0);
};
if (result == DIR_CW) {
Joystick.setButton(rotaries[i].cwchar, 1);
delay(50);
Joystick.setButton(rotaries[i].cwchar, 0);
};
}
}
Merci d'Avance ! Merci à tous ceux qui prendront le temps de jeter un œil à mon problème. Vos idées créatives et vos connaissances sont inestimables pour moi en ce moment. N'hésitez pas à me poser des questions ou à me faire part de vos suggestions.
Happy Coding !