Faire tourner un servomoteur à l'aide d'un clavier matriciel

Bonjour !

Débutant dans le langage arduino, j'essaye en ce moment de faire un programme visant à faire tourner un servomoteur grâce à un code tapé sur un clavier matriciel.

Hélas, le programme que j'ai créé - en m'inspirant de divers tutos sur le net - semble avoir un problème puisque lorsque j'effectue une simulation avec ISIS le servomoteur ne tourne pas.

Est-ce que vous pouvez y jeter un œil et me dire si, en admettant que le problème ne vienne pas du montage, quelque chose cloche ?

// On ajoute 3 librairies à notre code :
#include <Password.h> 
#include <Keypad.h>    
#include <Servo.h> 

// On définit les PINs pour les 3 couleurs de notre led RGB :
#define rouge 12        
#define vert 11      
#define bleu 10      

// On crée une variable associée à notre servomoteur :
Servo servo;
// On définit le mot de passe qui déverrouillera la valise :
Password password = Password( "1234" );
// On définit un second mot de passe qui servira à la verrouiller :
Password fermeture = Password( "0" );

const byte ROWS = 4; // Il y a 4 Lignes sur notre clavier
const byte COLS = 3; // ... et 3 Colonnes.

// On définit les touches du clavier :
char keys[ROWS][COLS] = {
 {'1','2','3'},
 {'4','5','6'},
 {'7','8','9'},
 {'*','0','#'}
};
// On associe les lignes et les colonnes du clavier à leurs PINs respectifs :
byte rowPins[ROWS] = { 5, 4, 3, 2 };
byte colPins[COLS] = { 8, 7, 6 };

// On initialise le clavier :
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

void setup(){

// On initialise les 3 couleurs de la led RGB en sorties :
pinMode(rouge,OUTPUT);            
pinMode(vert,OUTPUT);             
pinMode(bleu,OUTPUT);

// On associe le Pin 9 à notre servomoteur :
servo.attach(9);
// On ajoute une fonction qui permet d'analyser les saisies du clavier :
keypad.addEventListener(keypadEvent); 
}

void loop(){
  
// Création de la variable eKey, qui prendra pour valeur la touche apppuyée :
char eKey = keypad.getKey();
}

void keypadEvent(KeypadEvent eKey){

// On définit les différentes options de saisie du clavier :
switch (eKey){  case '*': guessPassword(); break;  // En cas d'appui sur la touche "*", on lance le void guessPassword.
                case '#': password.reset(); break; // On appuie sur "#" pour réinitialiser sa saisie.
                default: password.append(eKey);}   // Si on appuie sur un chiffre, il s'ajoute à la saisie.
}

void guessPassword(){

// Si le mot de passe est juste, on allume la led en vert durant 2.5 secondes
// et on effectue une rotation du servomoteur de 180° :
if (password.evaluate()){
                         digitalWrite(vert,HIGH);
                         delay(2500);
                         pinMode(vert,LOW);
                         
                         for (int position = 0; position <= 180; position++)
                         {
                         servo.write(position);
                         }
                        }

// Si on utilise le mot de passe de fermeture, on allume la led en bleu
// durant 2.5 secondes et on effectue une rotation du servomoteur de -180° :
if (fermeture.evaluate()){
                          digitalWrite(bleu,HIGH);
                          delay(2500);
                          pinMode(bleu,LOW);
                          
                          for (int position = 0; position <= -180; position++)
                          {
                          servo.write(position);
                          }
                         }

// Sinon, on allume simplement la led en rouge durant 2.5 secondes :
else {
      pinMode(rouge,HIGH);
      delay(2500);
      pinMode(rouge,LOW);
     }
}

Merci ! (en espérant ne pas m'être trompé de section)

Je ne vois pas de problème, sinon que tu peux remplacer la boucle de déplacement du servo

for (int position = 0; position <= 180; position++)
   {
     servo.write(position);
   }

par un truc comme

servo.write(180);
delay(1000);

Ta boucle a l'avantage de ne pas bloquer le code pendant le mouvement, au cas où il faut attraper un event du clavier.
Si tu veux débuguer, ajoute des Serial.writeln() pour afficher des choses aux endroits où le code est censé passer., après les if par exemple Si rien ne s'affiche, c'est qu'il ne va pas où on l'attend.

Merci de la réponse !

lesept:

servo.write(180);

delay(1000);

Ah ! Super, je connaissais pas cette commande, si j'avais su qu'il y avait une manière aussi simple pour faire tourner mon servo je me serais pas compliqué la vie.

Sinon, d'accord pour le reste du programme, je vais tenter de modifier mon code et si ça ne marche toujours pas il me restera juste à modifier mon montage.

Merci !

Un post similaire.

  digitalWrite(vert,HIGH);
  delay(2500);
  pinMode(vert,LOW);

c'est pas pinMode(vert, LOW) qui éteint la LED,
c'est digitalWrite(vert,LOW);

de même pour les autres LEDs.