mon premier contrôle panel , carte arduino

morgosth

ELEVE PILOTE
Messages
16
Réactions
1
Bonjour, voilà, je viens vers vous pour m aider à avancer sur ce projet. C'est la première fois que je me lance dans la fabrication de ce genre d'appareil et plus ça avance, plus je trouve ça intéressant!!
Bref, la partie bricolage est terminée, j'ai opté pour une structure bois photocopie et plexi, et je trouve que ça fait bien le travail.
Je ne connais rien du tout à l'arduino, ayant un kit de démarrage uno j'apprend avec ça, et j ai réussi à faire fonctionner 4/5 switchs en faisant des test, mais vu le nombre d entrée même en patchant tout ça comme un clavier numérique, il va me manquer des entrée. Jai donc commandé un mega 2560 r3, qui me semblait être plus adapté à mon nombre d'entrées, mais en fouillant j ai cru comprendre que ces arduino ne pouvaient pas etre reconnus comme surface de contrôle usb. Mais en me promenant sur votre forum, je vois que c est possible, alors que faire? et comme? merci d'avance
 

Fichiers joints

  • panel (1).jpg
    panel (1).jpg
    96 KB · Affichages: 72
ra, merci ça me rassure !!!ensuite autre question, je patche mes switchs en cadrillage comme un pavé numerique, mais ayant des switchs fixes et d'autres momentanés celà risque pas de faire du court circuit?
 
Pas compris le patch en quadrillage.

Un switch momentané va ne pas faire de contact à l'état de repos donc pas de risque de court-circuit de ce côté.
 
oui désolé je ne connais pas bien les termes, pour les switchs, pour les momentanés, c'est ok, c'est qu il y a egalement des switchs 3 positions bloquants.

c'est ce montage là que j ai realisé sur mon panneau
 

Fichiers joints

  • image_2021-12-05_155659.png
    image_2021-12-05_155659.png
    26 KB · Affichages: 29
Je connais pas ce genre de montage mais effectivement pas de risque de court-circuit.

Il y aura bien quelqu'un pour te répondre plus précisément.
 
Très bien comme montage les inters en matrice, mais il te manque les diodes anti-retour
300px-Schema_matrice_clavier_avec_diodes.png


Car imaginons que tu fermes K13, K14, K10
Lorsque tu vas alimenter la colonne X1 le système va bien trouver K13 fermé, mais il trouvera aussi K9 alors qu'il n'est pas fermé, voici pourquoi.
1638722858069.png

L'info X1 va alimenter la ligne Y4 (normal K13 est fermé).
Mais l'alimentation de K13, va se retrouver à passer par K14, ce qui va involontairement alimenter la colonne X2
K10 étant fermé, la ligne Y3 va donc se retrouver elle aussi alimentée.
Comme le microcontrôleur qui gère l'ensemble pour lui il n'y a que X1 alimenté, comme il voit Y3 et Y4 alimentés, il en conclu que K13 et K9 sont fermés.
 
il faudrait mettre cette diode à chaque interrupteur alors? et à partir de là si le bouton reste bloqué sur on et que j enclanche un momentané derriere, ça ne risque ra rien? Y a t il une reference pour ce genre de circuit?(desolé de toutes ses questions, mais je n y connais vraiment rien)
 
Dernière édition:
Oui, il te faut une diode en série par inter/bouton.
Quelques soit le nombre de boutons/inters enclenchés chacun sera vu dans son véritable état.
Concernant la réf de diode des 1N4148 sont parfaites.
 
bonjour, j ai bien reçu mes diodes et tout branché, ça a l'air ok, en revanche comment faites vous pour que la carte soit reconnue comme controleur usb, car lorsque je cherche, partout je peux lire que la 2560 r3 n est pas compatible
 
Si l'idée de base était d'utiliser l'Arduino comme un émulateur de joystick avec des boutons, effectivement ce n'est pas possible avec l'Arduino Mega ni la Uno, mais seulement avec l'Arduino Léonardo ou l'Arduino Micro, à ma connaissance.

Maintenant si tu veux pouvoir traiter des boutons et autres inters avec une Mega et piloter un simu type MSFS ou Xplane, il y a d'autres solutions, du genre Mobiflight ou via Air Manager, mais ce dernier nécessite un peu de programmation. D'un autre côté c'est plus ouvert et tu pourras aller au delà des simples affectations des boutons du simu par défaut.
 
Dernière édition:
Grosse avancée aujourd'hui!! mais je sais pas encore si je reste sur cette façon de faire ou alors je pousse plus loin une autre solution, car celle ci est basée sur les virtual cockpit et je peux programmer le panel que pour un appareil et je dois repatcher tous mes switchs de façon indépendante ou alors il faut que je cherche une autre carte style leonardo, et refaire tout un autre code et rendre la panel configurable directement dans dcs comme n importe quelle commande merci Flyingbaldy
 
bonjour, j avance tout doucement, j ai fini par prendre une leonardo et une micro que j aimerais ensuite coupler par la suite pour vouvoir tout patcher, mais pour le moment je suis encore sur ma matrice si quelqu un a la lumiere qu il me manque...
voici ce que j obtiens: il ne m affiche que 32 bouttons sur 56, les boutons bloquants fonctionnent (il me manque juste deux lignes,) et les momentanés sont bien assignés de 1a 16, mais sont pas toujours actifs


voici le code exact:

C++:
#include <Keypad.h>
#include <Joystick.h>

#define ENABLE_PULLUPS
#define NUMROTARIES 10
#define NUMBUTTONS 56
#define NUMROWS 8
#define NUMCOLS 7


byte buttons[NUMROWS][NUMCOLS] = {
{0,8,16,24,32,40,48},
{1,9,17,25,33,41,49},
{2,10,18,26,34,42,50},
{3,11,19,27,35,43,51},
{4,12,20,28,36,44,52},
{5,13,21,29,37,45,53},
{6,14,22,30,38,46,54},
{7,15,23,31,39,47,55},
};

struct rotariesdef {
byte pin1;
byte pin2;
int ccwchar;
int cwchar;
volatile unsigned char state;
};

rotariesdef rotaries[NUMROTARIES] {
{57,58,59,60,61},
{62,63,64,65,66},
{67,68,69,70,71},
{72,73,74,75,76},
};

#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] = {3,4,5,6,7,8,9,10};
byte colPins[NUMCOLS] = {11,12,13,A0,A1,A2,A3};

Keypad buttbx = Keypad( makeKeymap(buttons), rowPins, colPins, NUMROWS, NUMCOLS);

Joystick_ Joystick(JOYSTICK_DEFAULT_REPORT_ID,
JOYSTICK_TYPE_JOYSTICK, 56, 0,
false, false, false, false, false, false,
false, false, false, false, false);

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.stateChanged )
{
switch (buttbx.key.kstate) {
case PRESSED:
case HOLD:
Joystick.setButton(buttbx.key.kchar, 1);
break;
case RELEASED:
case IDLE:
Joystick.setButton(buttbx.key.kchar, 0);
break;
}
}
}
}
}


void rotary_init() {
for (int i=0;i<NUMROTARIES;i++) {
pinMode(rotaries.pin1, INPUT);
pinMode(rotaries.pin2, INPUT);
#ifdef ENABLE_PULLUPS
digitalWrite(rotaries.pin1, HIGH);
digitalWrite(rotaries.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);
}

void CheckAllEncoders(void) {
for (int i=0;i<NUMROTARIES;i++) {
unsigned char result = rotary_process(i);
if (result == DIR_CCW) {
Joystick.setButton(rotaries.ccwchar, 1); delay(50); Joystick.setButton(rotaries.ccwchar, 0);
};
if (result == DIR_CW) {
Joystick.setButton(rotaries.cwchar, 1); delay(50); Joystick.setButton(rotaries.cwchar, 0);
};
}
}
 

Fichiers joints

  • image_2021-12-19_113942.png
    image_2021-12-19_113942.png
    10.9 KB · Affichages: 10
Je peux me tromper mais il me semble que 32 est la limite max du nombre de boutons avec un joystick :unsure:

Il y a aussi le "chapeau chinois" qui ajoute 4 entrées aux 32 ...
 
yes!!! je vais peut etre encore avancer un peut, effectivement j ai testé avec les colonne et le nombre de lignes necessaires pour envoyer 32 boutons, et ça fonctionne beaucoup mieux
 
Il existe un moyen de s'éviter des lignes de programmation en utilisant tjours l'arduino mega (le clone elrgoo 2 fois moins cher fonctionne TB) avec le logiciel MobiFlight V9.1 en passant par desoffset, preset etc. Tu entres la commande MF se charge de dire à arduino ce qu'il doit faire
Ds mon asso le SIOC est en train d'être remplacé par elegoo + mobiflight et FSUIPC to iFly pou le B738 de iFly en home cocpit. Le MCP , le piedestal avec NDB et VOR sont faits
 
Il existe un moyen de s'éviter des lignes de programmation en utilisant tjours l'arduino mega (le clone elrgoo 2 fois moins cher fonctionne TB) avec le logiciel MobiFlight V9.1 en passant par desoffset, preset etc. Tu entres la commande MF se charge de dire à arduino ce qu'il doit faire
Ds mon asso le SIOC est en train d'être remplacé par elegoo + mobiflight et FSUIPC to iFly pou le B738 de iFly en home cocpit. Le MCP , le piedestal avec NDB et VOR sont faits
Mobiflight ne peut pas interfacer DCS
 
C'est bon en separant les boutons en deux lots, (et accessoirement un reparant un fil de masse...) tout fonctionne, dcs repere bien deux controleurs que je peux mapper à ma guise, c'est super!!!
Pour la suite, j ai encore deux rotatifs , deux switchs et deux potard à integrer dans mon code sachant que je vais devoir ajouter un arduino micro pour patcher tout ça. J'aurais encore deux questions , 1- comment associer la micro pour en quelque sorte la mettre en esclave de la leonardo? 2 comment integrer les codes restant, coder dans les "void" dejà existants, ou recréer d'autre "void " en fin du code existant?
 
Retour
Haut