recherche aide pour la programmation de ma boite

Fabrication de cockpit et divers ( palonnier , panels ..) c est ICI

Topic author
morgosth
Nouvelle Recrue
Nouvelle Recrue
Messages : 10
Inscription : 09 décembre 2020

recherche aide pour la programmation de ma boite

#1

Message par morgosth »

Bonjour, je recherche de l'aide, n ayant jamais programmé d'arduino, je suis parti sur un projet de boite à boutons, pour la majorité des boutons j ai fait un mappage en clavier matriciel, et le reste un entrées pin simple.
j attends une carte leonardo et une micro qui à voir son reconnues comme peripherique usb, mai pour le moment je cherche le code sur une uno pour tester.
j ai trouvé deux codes:
#define ligne_0 2
#define ligne_1 3
#define ligne_2 4
#define ligne_3 5

#define colonne_0 8
#define colonne_1 9
#define colonne_2 10
#define colonne_3 11

void setup() {
// put your setup code here, to run once:

// Initialise le port série
Serial.begin(9600);

// On configure les lignes en sorties
pinMode(ligne_0, OUTPUT);
pinMode(ligne_1, OUTPUT);
pinMode(ligne_2, OUTPUT);
pinMode(ligne_3, OUTPUT);

// On configure les colonnes en entrées avec pull-up
pinMode(colonne_0, INPUT_PULLUP);
pinMode(colonne_1, INPUT_PULLUP);
pinMode(colonne_2, INPUT_PULLUP);
pinMode(colonne_3, INPUT_PULLUP);

}

void loop() {
// put your main code here, to run repeatedly:

int etat_colonne_0 = HIGH;
int etat_colonne_1 = HIGH;
int etat_colonne_2 = HIGH;
int etat_colonne_3 = HIGH;

// On met la ligne 0 à 0V et les autres au 5V
digitalWrite(ligne_0, LOW);
digitalWrite(ligne_1, HIGH);
digitalWrite(ligne_2, HIGH);
digitalWrite(ligne_3, HIGH);

// On recupère l'état des colonnes
etat_colonne_0 = digitalRead(colonne_0);
etat_colonne_1 = digitalRead(colonne_1);
etat_colonne_2 = digitalRead(colonne_2);
etat_colonne_3 = digitalRead(colonne_3);

// Si on a la colonne 0 à LOW, c'est que le bouton 1 est pressé
if(etat_colonne_0 == LOW) {
envoie_bouton_presse_sur_port_serie('1');
}

// Si on a la colonne 1 à LOW, c'est que le bouton 2 est pressé
if(etat_colonne_1 == LOW) {
envoie_bouton_presse_sur_port_serie('2');
}

// Si on a la colonne 2 à LOW, c'est que le bouton 3 est pressé
if(etat_colonne_2 == LOW) {
envoie_bouton_presse_sur_port_serie('3');
}

// Si on a la colonne 3 à LOW, c'est que le bouton A est pressé
if(etat_colonne_3 == LOW) {
envoie_bouton_presse_sur_port_serie('A');
}

// On met la ligne 1 à 0V et les autres au 5V
digitalWrite(ligne_0, HIGH);
digitalWrite(ligne_1, LOW);
digitalWrite(ligne_2, HIGH);
digitalWrite(ligne_3, HIGH);

// On recupère l'état des colonnes
etat_colonne_0 = digitalRead(colonne_0);
etat_colonne_1 = digitalRead(colonne_1);
etat_colonne_2 = digitalRead(colonne_2);
etat_colonne_3 = digitalRead(colonne_3);

// Si on a la colonne 0 à LOW, c'est que le bouton 4 est pressé
if(etat_colonne_0 == LOW) {
envoie_bouton_presse_sur_port_serie('4');
}

// Si on a la colonne 1 à LOW, c'est que le bouton 5 est pressé
if(etat_colonne_1 == LOW) {
envoie_bouton_presse_sur_port_serie('5');
}

// Si on a la colonne 2 à LOW, c'est que le bouton 6 est pressé
if(etat_colonne_2 == LOW) {
envoie_bouton_presse_sur_port_serie('6');
}

// Si on a la colonne 3 à LOW, c'est que le bouton B est pressé
if(etat_colonne_3 == LOW) {
envoie_bouton_presse_sur_port_serie('B');
}

// On met la ligne 2 à 0V et les autres au 5V
digitalWrite(ligne_0, HIGH);
digitalWrite(ligne_1, HIGH);
digitalWrite(ligne_2, LOW);
digitalWrite(ligne_3, HIGH);

// On recupère l'état des colonnes
etat_colonne_0 = digitalRead(colonne_0);
etat_colonne_1 = digitalRead(colonne_1);
etat_colonne_2 = digitalRead(colonne_2);
etat_colonne_3 = digitalRead(colonne_3);

// Si on a la colonne 0 à LOW, c'est que le bouton 7 est pressé
if(etat_colonne_0 == LOW) {
envoie_bouton_presse_sur_port_serie('7');
}

// Si on a la colonne 1 à LOW, c'est que le bouton 8 est pressé
if(etat_colonne_1 == LOW) {
envoie_bouton_presse_sur_port_serie('8');
}

// Si on a la colonne 2 à LOW, c'est que le bouton 9 est pressé
if(etat_colonne_2 == LOW) {
envoie_bouton_presse_sur_port_serie('9');
}

// Si on a la colonne 3 à LOW, c'est que le bouton C est pressé
if(etat_colonne_3 == LOW) {
envoie_bouton_presse_sur_port_serie('C');
}

// On met la ligne 3 à 0V et les autres au 5V
digitalWrite(ligne_0, HIGH);
digitalWrite(ligne_1, HIGH);
digitalWrite(ligne_2, HIGH);
digitalWrite(ligne_3, LOW);

// On recupère l'état des colonnes
etat_colonne_0 = digitalRead(colonne_0);
etat_colonne_1 = digitalRead(colonne_1);
etat_colonne_2 = digitalRead(colonne_2);
etat_colonne_3 = digitalRead(colonne_3);

// Si on a la colonne 0 à LOW, c'est que le bouton * est pressé
if(etat_colonne_0 == LOW) {
envoie_bouton_presse_sur_port_serie('*');
}

// Si on a la colonne 1 à LOW, c'est que le bouton 0 est pressé
if(etat_colonne_1 == LOW) {
envoie_bouton_presse_sur_port_serie('0');
}

// Si on a la colonne 2 à LOW, c'est que le bouton # est pressé
if(etat_colonne_2 == LOW) {
envoie_bouton_presse_sur_port_serie('#');
}

// Si on a la colonne 3 à LOW, c'est que le bouton D est pressé
if(etat_colonne_3 == LOW) {
envoie_bouton_presse_sur_port_serie('D');
}

}

void envoie_bouton_presse_sur_port_serie(char bouton_caractere) {
Serial.print("Le bouton ");
Serial.print(bouton_caractere);
Serial.println(" est pressé");
Serial.println("");
}
----alors celui ci fonctionne, je peux rajouter une ligne car je ne suis pas sur un 4x4, mais un 7x8, mais si je rajoute deux lignes , ça ne fonctionne plus, de meme qu il ne gere pas les appuis lonf pour les switchs bloquants.

et un autre beaucoup plus court, mais je ne le retrouve plus, mais le resultat faisait que tout fonctionnait, mais chaque fois au hazard...

Y aurait il une bonne ame pour m'aiguiller

Image
Pièces jointes
266710334_600842710998944_3288111093489119979_n.jpg
266710334_600842710998944_3288111093489119979_n.jpg (149.84 Kio) Consulté 1550 fois
Avatar de l’utilisateur

steph737
Nouvelle Recrue
Nouvelle Recrue
Messages : 140
Inscription : 20 avril 2021

Re: recherche aide pour la programmation de ma boite

#2

Message par steph737 »

----alors celui ci fonctionne, je peux rajouter une ligne car je ne suis pas sur un 4x4, mais un 7x8, mais si je rajoute deux lignes , ça ne fonctionne plus, de meme qu il ne gere pas les appuis lonf pour les switchs bloquants.
Slt, moi aussi débutant arduino et des fois de quoi s'arracher les cheveux pour pas grand chose.... avec ce programme tu peux rajouter autant de lignes/colonnes que tu veux donc doit y avoir un loup quelque part (le compilateur ne voit pas toutes les erreurs en plus)

Sinon peut-être regarder du cpté des librairies , par ex : http://www.mon-club-elec.fr/pmwiki_refe ... irieKeypad, il y a une fonction qui permet de tester un appui maintenu, (HOLD).

c'est quoi un switch bloquant ?

dureiken
Jeune Pilote
Jeune Pilote
Messages : 1823
Inscription : 15 janvier 2006

Re: recherche aide pour la programmation de ma boite

#3

Message par dureiken »

Salut

ta boite est magnifique, comment as tu fait les écritures ?

Et qu'utilises-tu pour les potards rotatifs ? Merci

Sleepy_Fly
Apprenti-Mécano
Apprenti-Mécano
Messages : 253
Inscription : 06 septembre 2020

Re: recherche aide pour la programmation de ma boite

#4

Message par Sleepy_Fly »

Attention au n° des pin pour les lignes ajoutées. Certaines sont utilisées pour des fonctions internes et ne sont pas utilisables.
Quelles n° de pin utilises-tu pour les 2 lignes supplémentaires ?

Topic author
morgosth
Nouvelle Recrue
Nouvelle Recrue
Messages : 10
Inscription : 09 décembre 2020

Re: recherche aide pour la programmation de ma boite

#5

Message par morgosth »

dureiken a écrit :
sam. déc. 18, 2021 6:54 pm
Salut

ta boite est magnifique, comment as tu fait les écritures ?

Et qu'utilises-tu pour les potards rotatifs ? Merci
Merci ! pour les ecritures, c est tres simple, travailler ça sur photoshop et c est juste une feuille imprimée sous plexiglass et un contreplaqué en dessous de 5mm, pour les rotatifs, un 12 position, un autre 3 et deux potentiometres
Dernière modification par morgosth le dim. déc. 19, 2021 12:25 am, modifié 1 fois.

Topic author
morgosth
Nouvelle Recrue
Nouvelle Recrue
Messages : 10
Inscription : 09 décembre 2020

Re: recherche aide pour la programmation de ma boite

#6

Message par morgosth »

OBT~Eazy a écrit :
sam. déc. 18, 2021 7:48 pm
Attention au n° des pin pour les lignes ajoutées. Certaines sont utilisées pour des fonctions internes et ne sont pas utilisables.
Quelles n° de pin utilises-tu pour les 2 lignes supplémentaires ?
mes colonnes sont sur les pins 3à10 et colonnes 11 12 13 a0 a1 a2 a3
les rotatifs plusieurs positions et le master arm et train seront sur une autre carte quand j aurais compris comment coupler une micro à la leonardo sur des pins attitrés à chaque position

Topic author
morgosth
Nouvelle Recrue
Nouvelle Recrue
Messages : 10
Inscription : 09 décembre 2020

Re: recherche aide pour la programmation de ma boite

#7

Message par morgosth »

Et ça c'est le second code dont je parlais, plus je rajoute des entrée, plus ça repond n importe comment

const byte ROWS = 4 ; //quatre lignes
const byte COLS = 3 ; //trois colonnes
char keys [ ROWS ] [ COLS ] = {
{ '1' , '2' , '3' } ,
{ '4' , '5' , '6' } ,
{ '7' , '8' , '9' } ,
{ '#' , '0'}
} ;
octet rowPins [ LIGNES ] = { 5 , 4 , 3 , 2 } ; // connexion aux broches de ligne du clavier
octet colPins [ COLS ] = { 8 , 7 , 6 } ; // se connecte aux brochages de colonne du clavier

Clavier clavier = Clavier ( makeKeymap ( touches ) , rowPins , colPins , ROWS , COLS) ;

void setup ( ) {
Serial. commencer ( 9600 ) ;
} boucle

vide ( ) { touche
char = clavier. getKey ( ) ;

if ( clé != NO_KEY ) {
Serial. println ( clé ) ;
}
}
Avatar de l’utilisateur

steph737
Nouvelle Recrue
Nouvelle Recrue
Messages : 140
Inscription : 20 avril 2021

Re: recherche aide pour la programmation de ma boite

#8

Message par steph737 »

La librairie s'appelle keypad, pas clavier, et il faut l'inclure au début.

#include <Keypad.h>

dureiken
Jeune Pilote
Jeune Pilote
Messages : 1823
Inscription : 15 janvier 2006

Re: recherche aide pour la programmation de ma boite

#9

Message par dureiken »

morgosth a écrit :
dim. déc. 19, 2021 12:19 am
dureiken a écrit :
sam. déc. 18, 2021 6:54 pm
Salut

ta boite est magnifique, comment as tu fait les écritures ?

Et qu'utilises-tu pour les potards rotatifs ? Merci
Merci ! pour les ecritures, c est tres simple, travailler ça sur photoshop et c est juste une feuille imprimée sous plexiglass et un contreplaqué en dessous de 5mm, pour les rotatifs, un 12 position, un autre 3 et deux potentiometres
Au top ! tu aurais les references des boutons/potards/rotatifs ?

Et comment tiennent tes boutons ? car le plexi + 5mm de contreplaqué ca fait une sacrée épaisseur ?

Merci

Topic author
morgosth
Nouvelle Recrue
Nouvelle Recrue
Messages : 10
Inscription : 09 décembre 2020

Re: recherche aide pour la programmation de ma boite

#10

Message par morgosth »

steph737 a écrit :
dim. déc. 19, 2021 4:28 am
La librairie s'appelle keypad, pas clavier, et il faut l'inclure au début.

#include <Keypad.h>
oui c est ce que j utilise pour le faire fonctionner, mais ça change pas le probleme
quand je teste le premier programme sans ajouter de ligne, mais en changeant les entrée , tous les boutons fonctionnent du premier au dernier, donc je ne pense pas que ça vienne de mes branchements. Peut etre le fait qu il y ai des switchs a position bloquantes et d'autres en momentanés?

Topic author
morgosth
Nouvelle Recrue
Nouvelle Recrue
Messages : 10
Inscription : 09 décembre 2020

Re: recherche aide pour la programmation de ma boite

#11

Message par morgosth »

voilà j avance un peut quand meme, voici ce que j obtiens: il ne m affiche que 32 bouttons, les 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:

#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[i].cwchar, 1); delay(50); Joystick.setButton(rotaries[i].cwchar, 0);
};
}
}
Pièces jointes
image_2021-12-19_113942.png
image_2021-12-19_113942.png (10.9 Kio) Consulté 1459 fois
Avatar de l’utilisateur

steph737
Nouvelle Recrue
Nouvelle Recrue
Messages : 140
Inscription : 20 avril 2021

Re: recherche aide pour la programmation de ma boite

#12

Message par steph737 »

Comme tu as des inters dans ta matrice, est ce que tu as mis des diodes partout ? ( parce que ça revient à avoir des appuis simultanés, je crois qu'il y a des limites après ça cafouille...)

Les inters avec dcs bios je pense que c'est plus simple de les câbler en direct et de garder le principe des matrices pour les poussoirs. Ca simplifie la programmation aussi.

Topic author
morgosth
Nouvelle Recrue
Nouvelle Recrue
Messages : 10
Inscription : 09 décembre 2020

Re: recherche aide pour la programmation de ma boite

#13

Message par morgosth »

Oui, chaque bouton dz la matrice possède une diode comme sur le schémas ci-dessous, finalement apres avoir bien séparé tout ça en deux groupes et corrigé deux soudures qui empêchaient la masse sur deux switch, tout fonctionne parfaitement, tout est bien repéré dans dcs, (victoire)!!
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?
Pièces jointes
300px-Schema_matrice_clavier_avec_diodes.png
300px-Schema_matrice_clavier_avec_diodes.png (57.5 Kio) Consulté 1410 fois
Répondre

Revenir à « Cockpit & mod perso »