Page 1 sur 1

recherche aide pour la programmation de ma boite

Publié : sam. déc. 18, 2021 11:49 am
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

Re: recherche aide pour la programmation de ma boite

Publié : sam. déc. 18, 2021 6:50 pm
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 ?

Re: recherche aide pour la programmation de ma boite

Publié : sam. déc. 18, 2021 6:54 pm
par dureiken
Salut

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

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

Re: recherche aide pour la programmation de ma boite

Publié : sam. déc. 18, 2021 7:48 pm
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 ?

Re: recherche aide pour la programmation de ma boite

Publié : dim. déc. 19, 2021 12:19 am
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

Re: recherche aide pour la programmation de ma boite

Publié : dim. déc. 19, 2021 12:24 am
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

Re: recherche aide pour la programmation de ma boite

Publié : dim. déc. 19, 2021 12:28 am
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é ) ;
}
}

Re: recherche aide pour la programmation de ma boite

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

#include <Keypad.h>

Re: recherche aide pour la programmation de ma boite

Publié : dim. déc. 19, 2021 8:56 am
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

Re: recherche aide pour la programmation de ma boite

Publié : dim. déc. 19, 2021 9:16 am
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?

Re: recherche aide pour la programmation de ma boite

Publié : dim. déc. 19, 2021 11:46 am
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);
};
}
}

Re: recherche aide pour la programmation de ma boite

Publié : dim. déc. 19, 2021 6:19 pm
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.

Re: recherche aide pour la programmation de ma boite

Publié : lun. déc. 20, 2021 8:36 am
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?