Bonjour, en tant que novice, j'ai une question.
J'ai fait beaucoup de recherches et d'essaies mais je suis incapable de faire ce que je veux.
J'ai un keypad de 4X4. Je veux utilisé la touche 'C' et 'D' pour faire un jog sur un moteur en sens horaire et en sens anti-horaire.
Pour l'instant, quoi que je fasse, quand j'appui sur une des touches, c'est juste un "pulse" de la touche qui est envoyée. Elle ne reste pas "active".
J'ai regardé les keywords de la librairie keyboard.h mais je n'arrive pas à comprendre comment m'en servir.
Merci de m'aiguiller même si la documentation est en anglais.
Voici mon code de base:
// Library
#include <Stepper.h>
#include <Keypad.h>
// Number of steps per output rotation
const int stepsPerRevolution = 200;
// Create Instance of Stepper library
Stepper myStepper(stepsPerRevolution, 10, 11, 12, 13);
// Keypad
const byte ROWS = 4;
const byte COLS = 4;
char hexaKeys[ROWS][COLS] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
byte rowPins[ROWS] = {9, 8, 7, 6};
byte colPins[COLS] = {5, 4, 3, 2};
Keypad customKeypad = Keypad(makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);
// position
int Level = 0;
void setup()
{
// set the speed at 60 rpm:
myStepper.setSpeed(60);
// initialize the serial port:
Serial.begin(9600);
}
void loop()
{
char customKey = customKeypad.getKey();
if (customKey == ('C')) Serial.println("CW");
if (customKey == ('D')) Serial.println("CCW");
}
Merci. Le code que ChatGPT fourni ne fonctionne pas parce qu'il semble avoir une ligne de code dans la librairie qui envoit seulement un pulse de la touche lorsqu'elle est appuyée. J'ai parti de l'exemple de EventKeypad.ino et avec l'aide de chatGPT, j'ai trouvé quel;que chose qui fonctionne. Je trouve ça lourd pour rien comme programation mais pour l'instant, c'est que ça fonctionne.
J'ai pensé passer directement pas les I/O avec la matrice pour programmer ces 2 boutons. Ca aurait peut-être été plus simple.
Voici le code qui fonctionne:
#include <Stepper.h>
#include <Keypad.h>
// Nombre de pas pour une rotation complète du moteur
const int stepsPerRevolution = 200;
// Initialisation de l'instance de la bibliothèque Stepper
// Connexion du moteur aux pins 10, 11, 12 et 13
Stepper myStepper(stepsPerRevolution, 10, 11, 12, 13);
// Configuration du clavier matriciel 4x4
const byte ROWS = 4; // Nombre de lignes
const byte COLS = 4; // Nombre de colonnes
// Définition des touches du clavier matriciel
char hexaKeys[ROWS][COLS] =
{
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
// Définition des pins pour les lignes et les colonnes du clavier
byte rowPins[ROWS] = {9, 8, 7, 6};
byte colPins[COLS] = {5, 4, 3, 2};
// Création d'une instance de la bibliothèque Keypad
Keypad customKeypad = Keypad(makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);
// Variable pour indiquer si la touche 'C' est actuellement maintenue enfoncée
bool JOG_CW = false;
bool JOG_CCW = false;
void setup()
{
Serial.begin(9600); // Initialisation de la communication série
myStepper.setSpeed(60); // Configuration de la vitesse du moteur (60 RPM)
}
void loop()
{
// Appel de la fonction getKeys() pour mettre à jour l'état des touches
if (customKeypad.getKeys()) // Parcours de toutes les touches actives (pressées ou relâchées)
{
for (int i = 0; i < LIST_MAX; i++) // Vérifie si la touche actuelle est bien définie
{
if (customKeypad.key[i].kchar == 'C') // Si la touche 'C' est pressée pour la première fois
{
if (customKeypad.key[i].kstate == PRESSED && !JOG_CW)
{
Serial.println("Touche C enfoncée : Rotation horaire");
JOG_CW = true; // Mise à jour de l'état de maintien de 'C'
}
// Si la touche 'C' est relâchée
else if (customKeypad.key[i].kstate == RELEASED && JOG_CW)
{
Serial.println("Touche C relâchée : Arrêt");
JOG_CW = false; // Réinitialisation de l'état de maintien de 'C'
}
}
if (customKeypad.key[i].kchar == 'D')
{
if (customKeypad.key[i].kstate == PRESSED && !JOG_CCW) // Si la touche 'D' est pressée pour la première fois
{
Serial.println("Touche D enfoncée : Rotation anti-horaire");
JOG_CCW = true; // Mise à jour de l'état de maintien de 'D'
}
// Si la touche 'D' est relâchée
else if (customKeypad.key[i].kstate == RELEASED && JOG_CCW)
{
Serial.println("Touche C relâchée : Arrêt");
JOG_CCW = false; // Réinitialisation de l'état de maintien de 'D'
}
}
}
}
if (JOG_CW) // Si 'C' est maintenue enfoncée, faire avancer le moteur d'un pas
{
myStepper.step(1); // Un pas dans le sens horaire
delay(5); // Pause entre les pas pour ajuster la vitesse
}
if (JOG_CCW) // Si 'D' est maintenue enfoncée, faire avancer le moteur d'un pas
{
myStepper.step(-1); // Un pas dans le sens horaire
delay(5); // Pause entre les pas pour ajuster la vitesse
}
}