1er projet

Bonjour,

J'ai décidé de découvrir ce monde complexe en me lançant dans un projet personnel.
Au fil de mes recherches je suis tombé sur pas mal d'info et tout me semble confus dans ma tête.
J'aurai besoin d'un fil conducteur pour mener à bien mon projet.

Donc mon projet le voici : Je souhaite faire un genre de clavier en matrice où chaque bouton est un raccourci clavier différent. Cette matrice est reliée à un arduino nano et cet arduino branché au PC par USB. J'ai pris cette version car il est petit, une prise usb et il ne faut pas jouer avec le firmware pour qu'il soit reconnu en tant que périphérique USB. Il possède également des pins pour mettre "en réseau" et communiquer avec l'arduino plusieurs autres éléments. J'ai choisis le bus I2C mais ça sera pour le futur, d'abord j'essaie de comprendre le fonctionnement et le codage directement branché sur l'arduino. Ensuite viendra l'utilisation du bus I2C pour l'expansion.

Je joint une capture de mon schéma et je voudrai par exemple que lorsque j'appuie sur le SW1, cela tape la lettre a sur le pc, sur le SW2 ce sera le z par exemple. Au final ce sera une combinaison de touche ctrl ou alt qui soit executée, mais des choses simples pour comprendre et saisir les différents nuances.

  • J'ai choisi d'assigner les lignes comme sorties.
  • Donc les colonnes comme entrées :wink: .
  • Mon choix est-il judicieux?

Je pense utiliser comme algortihme (je sais pas si c'est le bon terme utilisé :-[ )

  • Activer la ligne

  • Scanner chaque colonne

  • Capturer l'état des boutons

  • Désactiver la ligne et passer à la ligne suivante.

  • Suis-je sur la bonne voie?

  • Electriquement parlant, y a-t-il des précautions à prendre autres que les diodes pour ne pas griller l'arduino?

  • J'ai entendu parler des résistances de pull-up/down afin de fixer l'état des broches pour qu'elle ne soient pas à des potentiels aléatoires. Sont-elles nécessaire dans ce genre de projet?

Merci pour la lecture du post et vos remarques constructives.

Il existe une librairie pour cela, nommée keypad.

Bonjour,

Si tu veux émuler un clavier, l'arduino nano n'est pas le bon choix.
Il vaudrait mieux prendre un arduino pro micro. Il dispose d'une bibliothèque permettant d'émuler un clavier.

hbachetti:
Il existe une librairie pour cela, nommée keypad.

Oui j'ai vu mais comme je débute, comprendre une librairie m'a l'air fort compliqué :o

kamill:
Bonjour,

Si tu veux émuler un clavier, l'arduino nano n'est pas le bon choix.
Il vaudrait mieux prendre un arduino pro micro. Il dispose d'une bibliothèque permettant d'émuler un clavier.

Aïe j'ai reçu mon nano, va falloir que je me renseigne mieux :roll_eyes:

Bonsoir

Il n'est pas indispensable de comprendre intégralement une librairie (=tout son code) pour pouvoir commencer à l'utilser. Comprendre sa documentation et quelques exemples d'utilsation souvent fornis avec les libariries.
pour Keypad c'est ici : Arduino Playground - Keypad Library

redman6150:
Oui j'ai vu mais comme je débute, comprendre une librairie m'a l'air fort compliqué :o A

Ca l'est bien moins que de tout programmer soi-même !

Si tu as des résistances de pull-up sur les entrées logiques que tu utilises (tes colonnes), les quatre sorties "lignes" doivent tirer à 0V ou si tu préfères être actives à l'état bas. Et dans ce cas tes diodes sont montées à l'envers.

Programmer ce truc n'est pas très simple, car tu dois gérer l'appui / relachement des touches, les possibles rebonds, le fait qu'un utilisateur fantaisiste peut appuyer sur deux touches, que tu veux détecter le changement d'état lors de l'appui une seule fois et ne pas envoyer une rafale de codes, etc. Donc autant utiliser une bibliothèque spécialisée. Si ça constitue un exercice de programmation pour toi, alors fais le, mais si tu es débutant tu vas en ch... pardon, y passer quelque temps.

Voilà, j’ai écouter vos conseils et utilisé le librairie Keypad.

J’ai un soucis de compilation : un message d’erreur :

Arduino : 1.8.13 (Linux), Carte : "Arduino Nano, ATmega328P"

/home/redman6150/Arduino/test_keaboard/test_keaboard.ino: In function 'void setup()':
test_keaboard:23:3: error: 'Keyboard' was not declared in this scope; did you mean 'Keypad'?
   23 |   Keyboard.begin();
      |   ^~~~~~~~
      |   Keypad
/home/redman6150/Arduino/test_keaboard/test_keaboard.ino: In function 'void loop()':
test_keaboard:28:21: error: 'class Keypad' has no member named 'getkey'; did you mean 'getKey'?
   28 |   char key = keypad.getkey();
      |                     ^~~~~~
      |                     getKey
test_keaboard:31:17: error: 'Keyboard' was not declared in this scope; did you mean 'Keypad'?
   31 |       case '1': Keyboard.press(KEY_LEFT_SHIFT);
      |                 ^~~~~~~~
      |                 Keypad
test_keaboard:31:32: error: 'KEY_LEFT_SHIFT' was not declared in this scope
   31 |       case '1': Keyboard.press(KEY_LEFT_SHIFT);
      |                                ^~~~~~~~~~~~~~
test_keaboard:52:5: error: 'Keyboard' was not declared in this scope; did you mean 'Keypad'?
   52 |     Keyboard.releaseAll();
      |     ^~~~~~~~
      |     Keypad
test_keaboard:54:3: error: break statement not within loop or switch
   54 |   break;
      |   ^~~~~
exit status 1
'Keyboard' was not declared in this scope; did you mean 'Keypad'?


Ce rapport pourrait être plus détaillé avec
l'option "Afficher les résultats détaillés de la compilation"
activée dans Fichier -> Préférences.

Voi ci mon code , je ne vois pas où je me plante :o

#include <Wire.h>
#include <Key.h>
#include <Keypad.h>
#include <Keyboard.h>

const byte ROWS = 1;
const byte COLS = 6;

char keys[ROWS][COLS] = {
  {'1', '2', '3', '4', '5', '6'}
};

int buttonState = 0;
int lastButtonState = 0;

byte rowPins[ROWS] = {8};
byte colPins[COLS] = {2, 3, 4, 5, 6, 7};
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS);

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  Keyboard.begin();
}

void loop() {
  // put your main code here, to run repeatedly:
  char key = keypad.getkey();
  if (key) {
    switch (key) {
      case '1': Keyboard.press(KEY_LEFT_SHIFT);
        Keyboard.print('a');
        break;
      case '2': Keyboard.press(KEY_LEFT_SHIFT);
        Keyboard.print('s');
        break;
      case '3': Keyboard.press(KEY_LEFT_SHIFT);
        Keyboard.print('y');
        break;
      case '4': Keyboard.press(KEY_LEFT_SHIFT);
        Keyboard.print('j');
        break;
      case '5': Keyboard.press(KEY_LEFT_SHIFT);
        Keyboard.print('v');
        break;
      case '6': Keyboard.press(KEY_LEFT_SHIFT);
        Keyboard.print('f');
        break;

    }
    delay(100);
    Keyboard.releaseAll();
  }
  break;
}

Comme indiqué dans un post précédent, la nano ne peut pas émuler un clavier, donc la librairie Keyboard n'est pas disponible pour la nano.

je ne vois pas où je me plante

dans le choix d'une carte (UNO) dont le composant d'interface USB (FT232, CH340...) est cantonné à la fonctionnalité série USB et ne peut apparaitre sur le bus USB comme périphérique HID (clavier, souris, joystick...)

Parmis les cartes Arduino 'historiques' , sans modification de firmware d'un composant, seules les cartes Leonardo ou Micro peuvent faire cela avec leur microcontrolleur 32u4

Lire la description de la librairie Keyboard : Keyboard - Arduino Reference

Mpf effectivement :confused:

Par chance j'ai reçu aujourd'hui l'arduino Micro. J'essaiera cela au soir lorsque j'aurai un peu de temps.
Merci pour vos lumières :wink:

Ca fonctionne :slight_smile: La matrice de bouton branchée directement sur le Micro fonctionne avec les raccourcis clavier (simple touche et modifier) :smiley:

Maintenant j'essaie de faire fonctionner l'I2C et mettre un mcp23017 pour étendre le nombre d'entrées/sorties. Malheureusement, je n'arrive même pas à faire clignoter une led. J'utilise un simple sketch qui fonctionne avec le nano. J'ai adapté le cablage entre les 2 boards( sur le nano SDA/SCL sur A4/A5; sur le micro SDA/SCL sur D2/D3), rien n'apparait à l'analyseur logique sur ces broches :astonished:

Bonjour

J'utilise un simple sketch qui fonctionne avec le nano

Montrer ici le sketch en question !

sur le micro SDA/SCL sur D2/D3), rien n'apparait à l'analyseur logique sur ces broches

Des résistances de tirage ('pull up' ) sont elles en place sur SDA et SCL ?

Voici le sketch en question :

#include <Adafruit_MCP23017.h>

#include <Wire.h>
Adafruit_MCP23017 mcp;
const int LED1 = 4 ; // LED sur board
const int LED2 = 0 ; // LED sur GPA0 sur MCP23017

void setup() {
  // put your setup code here, to run once:
  mcp.begin();
  pinMode(LED1, OUTPUT);
  mcp.pinMode(LED2, OUTPUT);
}

void loop() {
  // put your main code here, to run repeatedly:
  digitalWrite(LED1, HIGH);
  mcp.digitalWrite(LED2, HIGH);
  delay(200);
  digitalWrite(LED1, LOW);
  mcp.digitalWrite(LED2, LOW);
  delay(200);
}

Je n’ai pas mis de résistance de pullup.

tu travailles directement avec le circuit intégré MCP23017 ou avec un petit module comportant ce circuit + des composants sipplémentaires?
-dans le premier cas ajouter les pull-up (indispensables pour avoir des niveaux hauts)
-dans le second cas ajouter ces résistances ....si elles ne sont pas présentes sur le module

Je suis directement avec le mcp23017.

Je vais essayer des résistances de pullup.

4k7 et ça marche d'enfer !

Merci :wink: ;D

Maintenant j'essaie d'interfacer un keypad sur le mcp23017.
La libraire keypad.h fonctionne uniquement sur un clavier brancher sur la board.
J'ai cherché une autre libraire et je suis tombé sur celle-ci :arduino_keypads/Keypad_MC17 at master · joeyoung/arduino_keypads · GitHub
Quelqu'un a-t-il déjà utilisé cette librairie?

J’essaye d’utiliser cette librairie arduino_keypads/Keypad_MC17 at master · joeyoung/arduino_keypads · GitHub
Mais actuellement, je ne visualise aucun signaux sur l’analyseur logique au niveau des 2 broches e communication malgré 2 résistances de pull-up de 4.7k.

#include <Keypad_MC17.h>
#include <Keypad.h>
#include <Wire.h>
#include <Key.h>
#include <Keyboard.h>

int i2caddress = 0x20;
const byte ROWS = 1;
const byte COLS = 6;

char keys[ROWS][COLS] = {
  {'1', '2', '3', '4', '5', '6'}
};


byte rowPins[ROWS] = {0};
byte colPins[COLS] = {1, 2, 3, 4, 5, 6};
Keypad_MC17 kpd = Keypad_MC17( makeKeymap(keys), rowPins, colPins, ROWS, COLS, i2caddress );

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
    Keyboard.begin();
}

void loop() {
  // put your main code here, to run repeatedly:
  char key = kpd.getKey();
  if (key) {
    switch (key) {
      case '1': Keyboard.press(KEY_LEFT_SHIFT);
        Keyboard.print('a');
        break;
      case '2': Keyboard.press(KEY_LEFT_SHIFT);
        Keyboard.print('b');
        break;
      case '3': Keyboard.press(KEY_LEFT_SHIFT);
        Keyboard.print('c');
        break;
      case '4': Keyboard.press(KEY_LEFT_SHIFT);
        Keyboard.print('d');
        break;
      case '5': Keyboard.press(KEY_LEFT_SHIFT);
        Keyboard.print('e');
        break;
      case '6': Keyboard.press(KEY_LEFT_SHIFT);
        Keyboard.print('f');
        break;

    }
    delay(100);
    Keyboard.releaseAll();
  }
 
}

Dur :confused: