DRO Clavier matriciel pour Arduino

  • Auteur de la discussion gaston83
  • Date de début
V

vibram

Compagnon
tu branches ca sur les pins digital (je crois D1 à D13 sur un uno) et apres c'est dans le soft, il faut que tu utilises la librairie qui va bien (keypad.h de memoire ?) puis que tu assignes les bons ports
 
G

gaston83

Compagnon
Ok, mais il y a 20 touches pour 9 sorties... :7grat: y aurait-il une histoire de multiplexeur et démultiplexeur là-dessous ?
 
G

gaston83

Compagnon
Ok, mais il y a 20 touches pour 9 sorties... :7grat: y aurait-il une histoire de multiplexeur et démultiplexeur là-dessous ?

Quand je vous dis que ma neurone est fatiguée...

En fait il y a 5 lignes et 4 colonnes.... simplement :spamafote:
 
F

fauxjetons

Compagnon
salut
j ai choisie ce clavier 4 x 5 pour avoir plus de touches #12
avec le 4x4 on peux avoir de touche en multifonction
a plus


536b7b1ab339.jpg


ut.jpg
 
G

gaston83

Compagnon
Bonjour à tous,
Je suis toujours sur mon projet d'une télécommande pour MACH3.

J'avance petit à petit... j'ai récupéré ce code sur le net et je l'ai modifié pour mon clavier (post au dessus) de 5 lignes et 4 colonnes.

J'aimerais activer les touches CTRL ou SHIFT ou ALT avec une autre touche (pat exemple "j" en même temps.

Le code:

#include <Keypad.h>
#include <Keyboard.h>
#include <HID.h>

const byte ROWS = 5; //cinq lignes
const byte COLS = 4; //quatre colennes

char keys[ROWS][COLS] = {
{'I', 'U', '#', '*'},
{'1', '2', '3', 'H'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'e'},
{'L', '0', 'R', 'E'}
};

byte rowPins[ROWS] = {9, 8, 7, 6, 5}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {13, 12, 11, 10}; //connect to the column pinouts of the keypad

Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

void setup(){
}

void loop(){

char key = keypad.getKey();

switch(key){

case 'U': Keyboard.write(KEY_TAB);

case 'L': Keyboard.write(KEY_LEFT_ARROW); // "Left"
case 'H': Keyboard.write(KEY_DOWN_ARROW); // "Down"
case 'I': Keyboard.write(KEY_LEFT_SHIFT);
case 'B': Keyboard.write(KEY_UP_ARROW); // "Up"
case 'R': Keyboard.write(KEY_RIGHT_ARROW); // "Right"
}
}
 
G

gaston83

Compagnon
Sur un PC avec Mach3, en position de saut, lorsqu'on presse la touche SHIFT_LEFT ou RIGHT et une touche de déplacement (← →) le déplacement est en continu.

J'ai fait une modif... j'ai rajouté un bouton sec entre la pin 2 et la masse qui simule l'appui de SHIFT_LEFT ... j'ai constaté que lorsque j'appui sur le bouton (donc le shift gauche) et que j'appui sur une des touches de déplacement du clavier relié au PC (flèche gauche ou droite) le déplacement se fait en continu. Lorsqu'on relâche le touche SHIFT_LEFT, le déplacement se fait par saut à chaque appui sur une des flèches.

Je fais la même manip avec le clavier déporté et le bouton sec... et ça ne fonctionne pas. J'ai toujours le déplacement par saut à chaque appui mais pas le continu.

le code:

#include <Keypad.h>
#include <Keyboard.h>
#include <HID.h>

void setup() {
{
pinMode (2, INPUT_PULLUP);
}
}

const byte ROWS = 5; //cinq lignes
const byte COLS = 4; //quatre colennes

char keys[ROWS][COLS] = {
{'I', 'U', '#', '*'},
{'1', '2', '3', 'H'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'e'},
{'L', '0', 'R', 'E'}
};

byte rowPins[ROWS] = {9, 8, 7, 6, 5}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {13, 12, 11, 10}; //connect to the column pinouts of the keypad

Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

void loop() {

Keyboard.begin();
if (digitalRead(2) == LOW) {
{
Keyboard.press(KEY_LEFT_SHIFT);
delay(50);
Keyboard.releaseAll();
}
}


char key = keypad.getKey();

switch (key) {

case 'U': Keyboard.write(KEY_TAB);

case 'L': Keyboard.write(KEY_LEFT_ARROW); break; // "Left"
case 'H': Keyboard.write(KEY_DOWN_ARROW); break; // "Down"
case 'B': Keyboard.write(KEY_UP_ARROW); break; // "Up"
case 'R': Keyboard.write(KEY_RIGHT_ARROW); break; // "Right"
}
}
 
T

totoche974

Ouvrier
bonjour Gaston

est tu toujours sur ton projet de télécommande mach3 ??

++
GC
 
G

gaston83

Compagnon
Oui, mais pas trop eu le temps de m'y replonger. C'est toujours derrière l'oreille... J'ai fait le boitier y a plus qu'a le remplir... :chupachupz:
 
T

totoche974

Ouvrier
ok pas de prob, si tu replonge, fait moi signe :jar_jar:
j'ai avancé avancé sur le code mais pas sur le boitier

++
GC
 
T

totoche974

Ouvrier
salut

j'ai avancé dans le PCB il me reste plus qu'à faire l’alimentation du circuit
pour cela je vais utiliser 1 ou 2 lipo 1860 de 3.5amp

apparemment le code à l'air de marcher, il demande une vérife complète
y va falloir que je me remettre sur l'arduino

j'utilise Sprint-Layout 6.0 pour le PCB et la génération des gerbers et Flatcam pour la gravure

++
gilles
 
G

gaston83

Compagnon
Voilà le code...

/*---------------------------------------------------------------------------------------
'* jpbbricole 2019 03 13
'* modifié gaston 83 (ajout du bouton sur pin 5)
et l'aide de speedf37
*/

#include <Encoder.h> // Gestion bouton rotatif
#include <Key.h>
#include <Keypad.h>
#include <Keyboard.h>
#include <HID.h>

//------------------------------------- Codeur rotatif
#define codRotApin 3 // Pin du port A
#define codRotBpin 4 // Pin du port B

Encoder codRot(codRotApin, codRotBpin);
int codRotIncrement = 0; // Direction de l'encodeur +1 ou -1

void setup() {
pinMode (2, INPUT_PULLUP); // CTRL bouton pour la manivelle
pinMode (A5, INPUT_PULLUP); // ALT Left boutnon (ALT-1, 2, 3)
pinMode (3, INPUT_PULLUP); // avance X gauche clavier déporté
pinMode (4, INPUT_PULLUP); // avance X droite clavier déporté
Keyboard.begin();
}
const byte ROWS = 5; //cinq lignes
const byte COLS = 4; //quatre colennes

char keys[ROWS][COLS] = {
{'I', 'U', '#', '*'},
{'1', '2', '3', 'H'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'L', '0', 'R', 'E'}
};

byte rowPins[ROWS] = {9, 8, 7, 6, 5}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {13, 12, 11, 10}; //connect to the column pinouts of the keypad

Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

void loop() {

char key = keypad.getKey();

switch (key) {

case'E':
{
//Keyboard.press (KEY_LEFT_SHIFT); // Entrée
delay(100);
Keyboard.press (KEY_RETURN); Keyboard.release (KEY_RETURN);
Keyboard.releaseAll();
}
break;

case'1':

{
while (digitalRead(2) == LOW) // boucle pour garder le Ctrl appuyé
{
Keyboard.press (KEY_LEFT_ALT); // Automatique ALT-1
delay(100);
Keyboard.press (49); Keyboard.release (49);
Keyboard.releaseAll();
}
}
{
Keyboard.press (225);
Keyboard.release (225);
}
break;


case'2':
{
while (digitalRead(2) == LOW) // boucle pour garder le Ctrl appuyé
{
Keyboard.press (KEY_LEFT_ALT); // Manuel ALT-2
delay(100);
Keyboard.press (50); Keyboard.release (50);
Keyboard.releaseAll();
}
}

{
Keyboard.press (226); // 2 du clavier
Keyboard.release (226);
}
break;

case '3':
Keyboard.press (227);
Keyboard.release (227);
break;

case '4':
Keyboard.press (228);
Keyboard.release (228);
break;

case '5':
Keyboard.press (229);
Keyboard.release (229);
break;

case '6':
Keyboard.press (230);
Keyboard.release (230);
break;

case '7':
Keyboard.press (231);
Keyboard.release (231);
break;

case '8':
Keyboard.press (232);
Keyboard.release (232);
break;

case '9':
Keyboard.press (233);
Keyboard.release (233);
break;

case 'I': // Tab horizontal
Keyboard.write(KEY_TAB);
break;

case 'U': // Départ cycle
{
Keyboard.press (KEY_LEFT_ALT);
delay(100);
Keyboard.press (114); Keyboard.release (114);
Keyboard.releaseAll();
}
break;

case '0':
{
while (digitalRead(2) == LOW) // boucle pour garder le Ctrl appuyé

{
Keyboard.press(KEY_LEFT_CTRL); // remise à zéro des axes X et Y
delay(100);
Keyboard.press(79); Keyboard.release(79);
Keyboard.releaseAll();
}
}
{
Keyboard.press (234);
Keyboard.release (234);
}
break;

case 'L': Keyboard.write(KEY_LEFT_ARROW); //Keyboard.release(KEY_LEFT_ARROW);
{
while (digitalRead(2) == LOW) // boucle pour garder le shift appuyé
{
{
Keyboard.press(KEY_LEFT_SHIFT);
delay (50);
Keyboard.releaseAll();
}
Keyboard.write(KEY_LEFT_ARROW); //Keyboard.release(KEY_LEFT_ARROW); // "Déplacemnt à Gauche"
}
}
break;

case 'B': Keyboard.write(KEY_DOWN_ARROW); break; // "Déplacement Bas"
case 'H': Keyboard.write(KEY_UP_ARROW); break; // "Déplacement Haut"

case 'R': Keyboard.write(KEY_RIGHT_ARROW); // "Déplacement à Droite"
{
while (digitalRead(2) == LOW)// boucle pour garder le shift appuyé
{
{
Keyboard.press(KEY_LEFT_SHIFT);
delay (50);
Keyboard.releaseAll();
}
Keyboard.write(KEY_RIGHT_ARROW); //Keyboard.release(KEY_LEFT_ARROW); // "Déplacemnt à Gauche"
}
}
break;

case '#': { // Manuel / Automatique
Keyboard.press(KEY_LEFT_CTRL);
delay(100);
Keyboard.press(KEY_LEFT_ALT);
delay(100);
Keyboard.press('j');
delay(100);
Keyboard.releaseAll();
}
break;

case '*':
{
while (digitalRead(2) == LOW)
{
Keyboard.press (8); // étoile du clavier matriciel pour le Backspace
Keyboard.release (8);
}
{
Keyboard.press(KEY_LEFT_ALT);
delay(100);
Keyboard.press('j');
delay(100);
Keyboard.releaseAll();
}
}

break;
/* { // Changement de saut
Keyboard.press(KEY_LEFT_ALT);
delay(100);
Keyboard.press('j');
delay(100);
Keyboard.releaseAll();
}


*/break;

case 'C': { // Passage Continu / Saut

Keyboard.press(KEY_LEFT_CTRL);
delay(100);
Keyboard.press('j');
delay(100);
Keyboard.releaseAll();
}
break;
}

// initialisation codeur

codRotIncrement = codRot.read() / 4; // Divisé par 4 parcequ chaque impulsion ressentie en tournant le bouton
// Génère 4 impulsions (https://wiki.logre.eu/index.php/Codeur_rotatif_incrémental)

if (codRotIncrement != 0) // Changement de MS affiché
{
if (codRotIncrement < 0)
{
Keyboard.begin();
if (digitalRead(2) == LOW) {
{
Keyboard.press(KEY_LEFT_CTRL);
delay(50);
Keyboard.write(KEY_LEFT_ARROW);
delay(50);
Keyboard.releaseAll();
}
}
}

if (codRotIncrement > 0)
{
Keyboard.begin();
if (digitalRead(2) == LOW) {
{
Keyboard.press(KEY_LEFT_CTRL);
delay(50);
Keyboard.write(KEY_RIGHT_ARROW);
delay(50);
Keyboard.releaseAll();
}
}
}
codRotIncrement = 0; // Remise à Zéro du codeur
codRot.write(0);
}
}

// fin du prog
 
Dernière édition par un modérateur:
T

totoche974

Ouvrier
tu te sert d'un clavier matriciel 20 touches ou tu crée ton propre clavier ?

la fonction du codeur rotatif ? il te sert à basculer KEY_LEFT_CTRL et KEY_RIGHT_ARROW , :smt017

pour le proc tu utilise lequel 328P ou 32U4 ?

ca en fait des questions :-D

++
gilles
 
G

gaston83

Compagnon
tu te sert d'un clavier matriciel 20 touches ou tu crée ton propre clavier ?

c'est celui là dans le post #5

la fonction du codeur rotatif ? il te sert à basculer KEY_LEFT_CTRL et KEY_RIGHT_ARROW

non, j'ai mis un codeur rotatif pour simuler la manivelle . Et là, je bouge le X
IMG_20200325_152458[1].jpg


pour le proc tu utilise lequel 328P ou 32U4


J'utilise directement une Leonardo. Elle fait à la fois interface USB et programmateur. Dessus il y a un 32U4
 
G

gaston83

Compagnon
Et là, je suis entrain de m'engadcer avec ça... impossible d'écrire ce foutu "-" ...:mad: il me met ')' à la place

case '7':
{
while (digitalRead(2) == LOW) // boucle pour garder le Ctrl appuyé
{
delay(50);
Keyboard.write ('-');
Keyboard.release ('-');
delay (1000);
}
}
{
Keyboard.press (231); // chiffre 7
Keyboard.release (231);
}
break;
 
T

totoche974

Ouvrier
essayer en mettant son code ascii "Alt+ 045 " ou "&#45; "
 
G

gaston83

Compagnon
he bien, ça ne marche pas.... Par dépis, j'ai fait tout les codes .... je suis parti de 1 et je suis arrivé à 54 ... et ça marche. Je n'y comprends strictement rien car ce code ne correspond pas du tout au "-".. :7grat: :smt013 :hang:

case '7':
{
while (digitalRead(2) == LOW) // boucle pour garder le Ctrl appuyé
{
delay(50);
Keyboard.press(54); //signe "-"
delay(50);
Keyboard.release (54);
delay (1000);
}
}
{
Keyboard.press (231); // chiffre 7
Keyboard.release (231);
}
break;
 
G

gaston83

Compagnon
... et c'est pareil pour le chiffre 7... pfffffff, tu fais ALT+231 et tu as la surprise du soir :shock:

et comme je veux pas en rester là, je pose la question à la communauté Arduino ... :lol:
 
G

gaston83

Compagnon
... et c'est parti pour un autre tour.... je cherche le Z maintenant.... c'est extraordinaire !
 
T

totoche974

Ouvrier
//TestSerialread.ino
void setup() {
Serial.begin(9600);
}
char codeRecu ;
void loop () {
if (Serial.available() > 0) {
codeRecu = Serial.read();
Serial.print ("J’ai tape: "); Serial.print (codeRecu);
Serial.print (" "); Serial.print (codeRecu,DEC);
Serial.print (" = 0x"); Serial.print (codeRecu,HEX);
Serial.println ();
}
}

resultat
J’ai tape: - 45 = 0x2D
J’ai tape: z 122 = 0x7A
J’ai tape: f 102 = 0x66

test ca à part pour trouver tes codes en hexa et decimal
pour ton " - " il est declarer ou dans ton programme

ya un cpu qui est bien pour cela c'est le teensy ++2
plus d'entrées + rapide
pour la gestion du clavier il serais plus judicieux d'utilise un SX1509
il gere les claviers matriciel, rebond et le scan
cela ferais moins de code à gérer
 
G

gaston83

Compagnon
Bonjour,

Hé ben, non... ça ne fonctionne pas. Je me suis aperçu que non seulement le scan code n'est pas bon et qu'en plus il faut rajouter 136 pour avoir la correspondance. C'est pas tout... le code correspond au clavier Qwerty

Regardes le lien... à force de fouiller, j'au trouvé ça.


et les codes du vlavier qui eux sont bons. Attention c'est de l'hexa, donc il faut transformer la valeur en décimal puis rajouter 136.

code hexa.PNG
 
T

totoche974

Ouvrier
salut
j'étais entrain de chercher un truc de se style il y a une conversion à faire

tu a été plus rapide :smt038 ca y est tu est sur la bonne voie

++
 
G

gaston83

Compagnon
Bonjour à tous,

Bon, j'avance pas mal sur le code (en pièce jointe) et voilà ce que je pilote (pour l'instant) à partir de mon clavier déporté.. fichier txt que je montre dans le post #16, un peu plus haut.

Maintenant, je voudrais manipuler les axes X,Y et Z avec ma manivelle... que je sélectionnerais avec le sélecteur à droite sur la photo...

Je dois donc remplacer le (KEY_LEFT_ARROW) dans la partie tout en bas "initialisation codeur" par (KEY_UP_ARROW) pour l'axe Y et par les codes 211, 214 pour le Z.

Là, j'ai besoin de vos conseils....


IMG_20200329_141525[1].jpg
 

Fichiers joints

  • disposition clavier déporté.txt
    565 bytes · Affichages: 49
  • clav_case_1200_ter.ino.txt
    12.7 KB · Affichages: 38
G

gaston83

Compagnon
Bonjour à tous,

Bon, voilà.... j'ai presque pratiquement fini.... :chupachupz: :roxxx: :drinkers: :drinkers: :drinkers: :drinkers: :drinkers: :drinkers: :drinkers: :drinkers: :drinkers: :drinkers:

me reste plus qu'a faire fonctionner l'augmentation et la diminution de l'avance avec F10 et F11....

mais, d'abord, pourquoi ça ne fonctionne pas directement au clavier en appuyant sur les touches ??


C'est bon.... il fallait que je me mette en Continu...
 
Dernière édition:

Sujets similaires

M
Réponses
46
Affichages
19 980
Plopiche
Plopiche
wika58
Général Arduino Uno R4
Réponses
17
Affichages
12 198
furynick
furynick
wika58
Réponses
261
Affichages
14 929
midodiy
midodiy
G
Réponses
88
Affichages
8 801
gaston83
G
Dudulle
Général langage MMBASIC
Réponses
8
Affichages
610
Dudulle
Dudulle
N
Réponses
3
Affichages
633
jpbbricole
jpbbricole
Faber29
Réponses
8
Affichages
514
Faber29
Faber29
P
Réponses
33
Affichages
12 753
wika58
wika58
M4vrick
Réponses
25
Affichages
805
schum22
S
vax
Réponses
11
Affichages
11 940
vax
S
Réponses
11
Affichages
978
Contrariness
C
G
Réponses
3
Affichages
40 132
Mcar
Haut