Go Down

Topic: controle servo par bouton poussoir (Read 237 times) previous topic - next topic

zacnictel

Dec 23, 2018, 08:25 am Last Edit: Dec 23, 2018, 08:27 am by zacnictel
Bonjour,

Petite question concernant l'utilisation d'un servo via l'arduino:
Est-il possible d'affecter plusieurs positions pour un servo avec un seul bouton poussoir.
Actuellement je possede un programme qui fonctionne parfaitement mais je n'ais que deux positions. Je n'arrive pas a en rajouter d'autre.
mon programme:

#include <Servo.h>

const byte SERVO_A_ANGLE_MIN = 0;
const byte SERVO_A_ANGLE_MAX = 1;
const byte SERVO_EN_MOUVEMENT_VERS_ANGLE_MAX = 2;
const byte SERVO_EN_MOUVEMENT_VERS_ANGLE_MIN = 3;

const int angleMin = 1250;
const int angleMax = 1750;

Servo monServo;
int vitesse = 0;
int angle = angleMin;
byte etatServo = SERVO_A_ANGLE_MIN;

const int pinBouton = 0; /* le bouton est connecté à la broche A0 */

const boolean PRESSE = true;
const boolean RELACHE = false;

boolean etatBouton = RELACHE;

const byte AUCUN_EVENEMENT = 0;
const byte EVENEMENT_PRESSE = 1;
const byte EVENEMENT_RELACHE = 2;

/*
* fonctions de gestion du poussoir
*/
boolean lirePoussoir()
{
   boolean resultat = RELACHE;
   if (analogRead(pinBouton) > 512) {
       resultat = PRESSE;
   }
   return resultat;
}

byte lireEvenement()
{
   byte evenement;
   boolean nouvelEtat = lirePoussoir();
   if (nouvelEtat == etatBouton)
       evenement = AUCUN_EVENEMENT;
   if (nouvelEtat == PRESSE && etatBouton == RELACHE)
       evenement = EVENEMENT_PRESSE;
   if (nouvelEtat == RELACHE && etatBouton == PRESSE)
       evenement = EVENEMENT_RELACHE;
   etatBouton = nouvelEtat;
   return evenement;
}

/*
* La fonction setup() est exécutée 1 fois
* au démarrage du programme
*/
void setup()
{
 monServo.attach(2);
}

/*
* La fonction loop() est exécutée
* répétitivement
*/
void loop()
{
   /* actualisation de l'angle du servo */
   monServo.writeMicroseconds(angle);

   angle = angle + vitesse;

   if (angle > angleMax) {
       angle = angleMax;
       vitesse = 0;
       etatServo = SERVO_A_ANGLE_MAX;
   }
   else if (angle < angleMin) {
       angle = angleMin;
       vitesse = 0;
       etatServo = SERVO_A_ANGLE_MIN;
   }

   /* lecture de la commande de l'utilisateur */
   byte evenement = lireEvenement();

   if (evenement == EVENEMENT_PRESSE) {
       switch (etatServo) {
           case SERVO_A_ANGLE_MIN:
           case SERVO_EN_MOUVEMENT_VERS_ANGLE_MIN:
               vitesse =  1;
               etatServo = SERVO_EN_MOUVEMENT_VERS_ANGLE_MAX;
               break;
           case SERVO_A_ANGLE_MAX:
           case SERVO_EN_MOUVEMENT_VERS_ANGLE_MAX:
               vitesse = -1;
               etatServo = SERVO_EN_MOUVEMENT_VERS_ANGLE_MIN;
               break;
       }
   }

   delay(3);
}

Merci.

BrUnO14200

A chaque appui sur ton poussoir, tu peux incrémenter une variable . Et pour chacune des valeurs de cette variable , tu définies une position de ton servo.

Je fais comme ça pour faire du menu défilant sur un LCD, c'est le même principe !
Ma couveuse :https://forum.arduino.cc/index.php?topic=571843.0

zacnictel

Merci pour ta réponse.
Ce programme a été glané sur le web. Je n'ais donc rien inventé car j'en suis bien incapable.
J'ai tenté d'ajouter des " const byte" et des const int" pour avoir des positions supplementaires:
const byte SERVO_A_ANGLE_MAX = 1;
const byte SERVO_A_ANGLE_MIN = 2;
const byte SERVO_A_ANGLE_MOY = 3;
const byte SERVO_EN_MOUVEMENT_VERS_ANGLE_MAX = 4;
const byte SERVO_EN_MOUVEMENT_VERS_ANGLE_MIN = 5;
const byte SERVO_EN_MOUVEMENT_VERS_ANGLE_MOY = 6;
const int angleMin = 900;
const int angleMax = 2000;
const int angleMOY = 1500;


Ensuite, ça se complique a ce niveau :

lecture de la commande de l'utilisateur */
   byte evenement = lireEvenement();

   if (evenement == EVENEMENT_PRESSE) {
       switch (etatServo) {
           case SERVO_A_ANGLE_MIN:
           case SERVO_EN_MOUVEMENT_VERS_ANGLE_MIN:
               vitesse =  1;
               etatServo = SERVO_EN_MOUVEMENT_VERS_ANGLE_MAX;
               break;
           case SERVO_A_ANGLE_MAX:
           case SERVO_EN_MOUVEMENT_VERS_ANGLE_MAX:

               vitesse = -1;
               etatServo = SERVO_EN_MOUVEMENT_VERS_ANGLE_MIN;
               break;


J'avoue etre paumé malgres quelques heures de recherche a essayer de comprendre.


Go Up