Parlons Arduino > Débuter

commande servo par inter

<< < (3/4) > >>

Thierry:
Salut, merci pour tes vœux, et recevez tous aussi mes meilleurs vœux pour cette nouvelle année en espérant qu'elle soit meilleure à tous points de vue que 2015. Ça ne devrait pas  être difficile !

J'ai jeté un coup d’œil à ton code et tenté de le compiler avec l'IDE 1.6.7 .
Il y a effectivement quelques erreurs de syntaxe, mais rien de bien compliqué !

1 : les espaces ne sont pas permis dans les identifiants : nom de fonction, de variable, de structure, etc... C'est la première correction : changer 'evenementServo DEVIE' en 'evenementServo_DEVIE'. Idem pour le DROIT bien sûr.

2 : la déclaration d'une variable consiste à donner un type et un nom. C'était le rôle de la ligne

 int numPoussoir = (analogRead(pinPoussoirs) + 64) / 128;

qui faisait à la fois la déclaration  'int numPoussoir' et l'affectation 'numPoussoir = (analogRead(pinPoussoirs) + 64) / 128;'. Le langage C/C++ permet de faire les deux en même temps... Dans ton cas, cela signifie simplement que tu dois écrire

 int numPoussoir = 4;

ou

 int numPoussoir;
 numPoussoir = 4;

pour déclarer la variable numPoussoir en tant que entier, et y affecter 4 comme valeur.

3 : Attention aux accolades et autres parenthèses ou point-virgules ! Le langage est complètement intolérants aux fautes de syntaxe ! Dans loop(), il manquait l'accolade fermante du test sur EVENEMENT_DROIT.

4 : Pour une raison que j'ignore, la ligne

byte evenement = lireEvenement(&numServo);

était en remarque. Comme la variable 'evenement' n'était plus déclarée, les tests qui suivaient sur sa valeur ne pouvaient fonctionner ! Encore une fois, le langage ne permet pas d'approximation et ne peux pas travailler sur quelque chose qui n'est pas déclaré.

5 : Les variables EVENEMENT_DROIT et EVENEMENT_DEVIE n'existent pas !

6 : La ligne

servoMoteur[numServo].objetServo.attach(servoMoteur[numServo].pin);

était dans un 'switch', mais en dehors de tout 'case', ce qui est interdit ! Je l'ai donc sortie du 'switch' sans vraiment savoir quel comportement tu voulais... Parce que le attach ne devrait être fait QUE dans le setup !

7 : Je me suis permis de reformatter ton code avant de le poster ici. Comme l'a dit Denis, un formattage correct ne donne pas un code qui marche, mais un formattage incorrect donne du code difficile à mettre au point, puis à maintenir ! A ce sujet, il y a plusieurs écoles quant au placement des accolades. Certains, comme Jean-Luc, sont partisans du format avec l'accolade ouvrante à la fin de la ligne

if () {
  ...
}

que j'ai longtemps pratiqué et qui permet de gagner une ligne sur celui que je préconise maintenant avec l'accolade ouvrante toute seule sur sa ligne et au niveau du premier caractère de l'instruction associée (if, for, switch...), et avec l'accolade fermante encore seule et sur la même colonne :

if ()
{
  ...
}

il est à mon avis plus simple à lire, mais ce n'est que mon avis. Une fois ton choix fait, tu dois te l'imposer, et toujours formatter ton code en le respectant. La pire des situations étant bien entendu le mélange des deux !


--- Code: ---// A PRIORI PAS DE MODIFICATION
#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 boolean DROIT = true;     // MODIFICATION PROG     
const boolean DEVIE = false;    // MODIFICATION PROG
 
const int angleMin = 1250;
const int angleMax = 1750;
 
struct DescripteurServo {
  Servo objetServo;
  int vitesse;
  int angle;
  int pin;
  byte etatServo;
};

struct DescripteurServo servoMoteur[4];
 
const byte NON_PRESSE = 0;
const byte ENFONCE = 1;
const byte PRESSE = 2;
 
byte etatAutomate = NON_PRESSE;
int etatPoussoir = -1;
 
const byte AUCUN_EVENEMENT = 0;
const byte EVENEMENT_PRESSE = 1;
const byte EVENEMENT_RELACHE = 2;

//variable pour les inters

boolean ancienA0  = HIGH;
boolean nouveauA0 = HIGH;
boolean ancienA1  = HIGH;
boolean nouveauA1 = HIGH;
boolean ancienA2  = HIGH;
boolean nouveauA2 = HIGH;
boolean ancienA3  = HIGH;
boolean nouveauA3 = HIGH;

                        //const int pinPoussoirs = 0; // A SUPPRIMER

// MODIFICATION DE LirePoussoirs et Lire Evenement AFIN D’AVOIR LE NUMERO
// ET L’ETAT DE L’INTER

int lirePoussoirs()
{
  int resultat;
//  int numPoussoir = (analogRead(pinPoussoirs) + 64) / 128;  //  A SUPPRIMER

  int numPoussoir = 4;                     // Ou faut il déclarer numPoussoir ?

  nouveauA0 = digitalRead(A0);   
  if (ancienA0 != nouveauA0)
  {
    ancienA0 = nouveauA0;
    numPoussoir = 0;
  }
  else
  {
    nouveauA1 = digitalRead(A1);
    if (ancienA1 != nouveauA1)
    {
      ancienA1 = nouveauA1;
      numPoussoir = 1;
    }
    else
    {
      nouveauA2 = digitalRead(A2);
      if (ancienA2 != nouveauA2)
      {
        ancienA2 = nouveauA2;
        numPoussoir = 2;
      }
      else
      {
        nouveauA3 = digitalRead(A3);
        if  (ancienA3 != nouveauA3)
        {
          ancienA3 = nouveauA3;
          numPoussoir = 3;
        }                                 
      }
    }
  }

  int nouvelEtatPoussoir = etatPoussoir; /* à priori rien ne change */
 
  switch (etatAutomate)
  {
    case NON_PRESSE:
      if (numPoussoir < 4)
        etatAutomate = ENFONCE;
      break;
     
    case ENFONCE:
      if (numPoussoir < 4)
      {
        etatAutomate = PRESSE;
        nouvelEtatPoussoir = numPoussoir;
      }
      else
        etatAutomate = NON_PRESSE;
       
      break;
     
    case PRESSE:
      if (numPoussoir == 4)
      {
        etatAutomate = NON_PRESSE;
        nouvelEtatPoussoir = -1;
      }
      break;
  }
   
  return nouvelEtatPoussoir;
}

byte lireEvenement(int *inpNumPoussoir)
{
  byte evenement;
  int nouvelEtatPoussoir = lirePoussoirs();
   
  if (nouvelEtatPoussoir == etatPoussoir)
    evenement = AUCUN_EVENEMENT;
  if (nouvelEtatPoussoir >= 0 && etatPoussoir == -1)
    evenement = EVENEMENT_PRESSE;
  if (nouvelEtatPoussoir == -1 && etatPoussoir >= 0)
    evenement = EVENEMENT_RELACHE;
 
  etatPoussoir = nouvelEtatPoussoir;
  *inpNumPoussoir = etatPoussoir;
   
  return evenement;
}

// A PRIORI PAS DE MODIFICATION
void setup()
{
  /* Initialisation des servos */
  int numServo;
 
  for (numServo = 0; numServo < 4; numServo++)
  {
    servoMoteur[numServo].angle = angleMin;
    servoMoteur[numServo].vitesse = 0;
    servoMoteur[numServo].etatServo = SERVO_A_ANGLE_MIN;
    servoMoteur[numServo].pin = numServo + 2;
    servoMoteur[numServo].objetServo.attach(servoMoteur[numServo].pin);
  }
 
  /* Initialisation des inters */ 
  pinMode(A0, INPUT_PULLUP);    //  BP 0
  pinMode(A1, INPUT_PULLUP);    //  BP 1
  pinMode(A2, INPUT_PULLUP);    //  BP 2
  pinMode(A3, INPUT_PULLUP);    //  BP 3     
}

// A PRIORI PAS DE MODIFICATION
void gereServo(int numServo)
{
  servoMoteur[numServo].objetServo.writeMicroseconds(servoMoteur[numServo].angle);
 
  servoMoteur[numServo].angle += servoMoteur[numServo].vitesse;
 
  if (servoMoteur[numServo].angle > angleMax)
  {
    servoMoteur[numServo].angle = angleMax;
    servoMoteur[numServo].vitesse = 0;
    servoMoteur[numServo].objetServo.detach();
    servoMoteur[numServo].etatServo = SERVO_A_ANGLE_MAX;
  }
  else
    if (servoMoteur[numServo].angle < angleMin)
    {
    servoMoteur[numServo].angle = angleMin;
    servoMoteur[numServo].vitesse = 0;
    servoMoteur[numServo].objetServo.detach();
    servoMoteur[numServo].etatServo = SERVO_A_ANGLE_MIN;
    }
}

//MODIFICATION J’AI PRIS DROIT = VERS ANGLE MAX ( A VERIFIER)
void evenementServo_DROIT (int numServo)
{
  servoMoteur[numServo].objetServo.attach(servoMoteur[numServo].pin);
  switch (servoMoteur[numServo].etatServo)
  {
    case SERVO_EN_MOUVEMENT_VERS_ANGLE_MIN:
      servoMoteur[numServo].vitesse =  1;
      servoMoteur[numServo].etatServo = SERVO_EN_MOUVEMENT_VERS_ANGLE_MAX;
      break;
  } 
}

//MODIFICATION J’AI PRIS DEVIE = VERS ANGLE MIN ( A VERIFIER)
void evenementServo_DEVIE (int numServo)
{
  servoMoteur[numServo].objetServo.attach(servoMoteur[numServo].pin);
  switch (servoMoteur[numServo].etatServo)
  {
    case SERVO_EN_MOUVEMENT_VERS_ANGLE_MAX:
      servoMoteur[numServo].vitesse = -1;
      servoMoteur[numServo].etatServo = SERVO_EN_MOUVEMENT_VERS_ANGLE_MIN;
      break;
  }
}

//MODIFICATION
void loop()
{
  int numServo;
 
  for (numServo = 0; numServo < 4; numServo++)
    gereServo(numServo);
 
  byte evenement = lireEvenement(&numServo);
 
  if (evenement == EVENEMENT_PRESSE)
    evenementServo_DROIT(numServo);

  if (evenement == EVENEMENT_RELACHE)
    evenementServo_DEVIE(numServo);
 
  delay(3);
}
--- Fin du code ---

DDEFF:
Merci Thierry !
Bons vœux aussi, bien sûr !

Le problème que j'avais (volontairement) laissé est toujours d'actualité ... ;D

En fait, j'avais remplacé l'unique ligne de Jean-Luc par 33 (!) lignes pour lire tes 4 poussoirs.

Et la détection se fait en regardant les changements d'état et on voit qu'on a appuyé sur un BP parce qu'avant il était à HIGH et que, maintenant qu'on a appuyé, il est à LOW.
Et ça fonctionne, ... et même trop bien !
Parce que quand on relâche le BP, il change aussi d'état en passant cette fois de LOW à HIGH !

Donc, on le détecte un changement une deuxième fois et, là, à tort.

L'idée est donc de compléter, par exemple :

if (ancienA0 != nouveauA0)
{
    ancienA0 = nouveauA0;
    numPoussoir = 0;
}

par :

if (ancienA0 != nouveauA0)

    ancienA0 = nouveauA0;
    if (nouveauA0 == LOW)
    {
        numPoussoir = 0;
    }
}

On garde bien le changement d'état, parce que le deuxième test n'a lieu qu'après.
C'est normal, il faut bien suivre les changements d'état.

Mais on ne change le numPoussoir que si on a appuyé sur le BP, et pas quand on le relâche.

Il faut donc faire les modifications pour les autres BP, comme A0 que je viens de donner. Je te laisse les faire, c'est en forgeant, etc...

Concernant les accolades, une bonne partie des programmes fait comme Jean-Luc, avec l'accolade juste derrière le if.
Moi, je préfère mettre l'accolade juste en dessous, ça me parait plus clair et plus aéré.

Donc, actuellement, tu as un programme mixte avec les deux façons.
Je rejoins Thierry et j'abonde dans sa remarque : on choisit une méthode et on s'y tient.

Bon courage !
Tu y es presque.  ;D

philippe 31:
Meilleurs vœux à tous les membres pour cette année 2016 et longue vie à ce forum

J'ai modifié le code suivant vos remarques .

--- Code: ---// Déclaration des variables pour les servomoteurs
#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 boolean DROIT = true;   
const boolean DEVIE = false;   
 
const int angleMin = 1250;
const int angleMax = 1750;
 
struct DescripteurServo {
  Servo objetServo;
  int vitesse;
  int angle;
  int pin;
  byte etatServo;
                       };

struct DescripteurServo servoMoteur[4];
 
const byte NON_PRESSE = 0;
const byte ENFONCE = 1;
const byte PRESSE = 2;
 
byte etatAutomate = NON_PRESSE;
int etatPoussoir = -1;
 
const byte AUCUN_EVENEMENT = 0;
const byte EVENEMENT_PRESSE = 1;
const byte EVENEMENT_RELACHE = 2;

// Déclaration des variables pour les bistables

boolean ancienA0  = HIGH;
boolean nouveauA0 = HIGH;
boolean ancienA1  = HIGH;
boolean nouveauA1 = HIGH;
boolean ancienA2  = HIGH;
boolean nouveauA2 = HIGH;
boolean ancienA3  = HIGH;
boolean nouveauA3 = HIGH;

// Lecture du numéro de bistable
int lirePoussoirs()
{
  int resultat;

  int numPoussoir = 4;                   

  nouveauA0 = digitalRead(A0);   
  if (ancienA0 != nouveauA0)
  {
    ancienA0 = nouveauA0;
    if (nouveauA0==LOW);
    {
     numPoussoir = 0;
    }
  }
  else
  {
    nouveauA1 = digitalRead(A1);
    if (ancienA1 != nouveauA1)
    {
      ancienA1 = nouveauA1;
      if (nouveauA1==LOW);
      {
       numPoussoir = 1;
      }   
    }
    else
    {
       nouveauA2 = digitalRead(A2);
    if (ancienA2 != nouveauA2)
    {
      ancienA2= nouveauA2;
      if (nouveauA2==LOW);
      {
       numPoussoir = 2;
      }   
    }
    else
      {
        nouveauA3 = digitalRead(A3);
    if (ancienA3 != nouveauA3)
    {
      ancienA3 = nouveauA3;
      if (nouveauA3==LOW);
      {
       numPoussoir = 3;
      }   
    }                                   
      }
    }
  }

  int nouvelEtatPoussoir = etatPoussoir;
 
  switch (etatAutomate)
  {
    case NON_PRESSE:
      if (numPoussoir < 4)
        etatAutomate = ENFONCE;
      break;
     
    case ENFONCE:
      if (numPoussoir < 4)
      {
        etatAutomate = PRESSE;
        nouvelEtatPoussoir = numPoussoir;
      }
      else
        etatAutomate = NON_PRESSE;
       
      break;
     
    case PRESSE:
      if (numPoussoir == 4)
      {
        etatAutomate = NON_PRESSE;
        nouvelEtatPoussoir = -1;
      }
      break;
  }
   
  return nouvelEtatPoussoir;
}

byte lireEvenement(int *inpNumPoussoir)
{
  byte evenement;
  int nouvelEtatPoussoir = lirePoussoirs();
   
  if (nouvelEtatPoussoir == etatPoussoir)
    evenement = AUCUN_EVENEMENT;
  if (nouvelEtatPoussoir >= 0 && etatPoussoir == -1)
    evenement = EVENEMENT_PRESSE;
  if (nouvelEtatPoussoir == -1 && etatPoussoir >= 0)
    evenement = EVENEMENT_RELACHE;
 
  etatPoussoir = nouvelEtatPoussoir;
  *inpNumPoussoir = etatPoussoir;
   
  return evenement;
}

void setup()
{
   /* Initialisation des servos */
   int numServo;
 
  for (numServo = 0; numServo < 4; numServo++)
  {
    servoMoteur[numServo].angle = angleMin;
    servoMoteur[numServo].vitesse = 0;
    servoMoteur[numServo].etatServo = SERVO_A_ANGLE_MIN;
    servoMoteur[numServo].pin = numServo + 2;
    servoMoteur[numServo].objetServo.attach(servoMoteur[numServo].pin);
  }
 
  /* Initialisation des bistables */
  pinMode(A0, INPUT_PULLUP);    //  BP 0
  pinMode(A1, INPUT_PULLUP);    //  BP 1
  pinMode(A2, INPUT_PULLUP);    //  BP 2
  pinMode(A3, INPUT_PULLUP);    //  BP 3     
}

void gereServo(int numServo)
{
  servoMoteur[numServo].objetServo.writeMicroseconds(servoMoteur[numServo].angle);
 
  servoMoteur[numServo].angle += servoMoteur[numServo].vitesse;
 
  if (servoMoteur[numServo].angle > angleMax)
  {
    servoMoteur[numServo].angle = angleMax;
    servoMoteur[numServo].vitesse = 0;
    servoMoteur[numServo].objetServo.detach();
    servoMoteur[numServo].etatServo = SERVO_A_ANGLE_MAX;
  }
  else
    if (servoMoteur[numServo].angle < angleMin)
    {
    servoMoteur[numServo].angle = angleMin;
    servoMoteur[numServo].vitesse = 0;
    servoMoteur[numServo].objetServo.detach();
    servoMoteur[numServo].etatServo = SERVO_A_ANGLE_MIN;
    }
}

void evenementServo_DROIT (int numServo)
{
  servoMoteur[numServo].objetServo.attach(servoMoteur[numServo].pin);
  switch (servoMoteur[numServo].etatServo)
  {
    case SERVO_EN_MOUVEMENT_VERS_ANGLE_MIN:
      servoMoteur[numServo].vitesse =  1;
      servoMoteur[numServo].etatServo = SERVO_EN_MOUVEMENT_VERS_ANGLE_MAX;
      break;
  }
}

void evenementServo_DEVIE (int numServo)
{
  servoMoteur[numServo].objetServo.attach(servoMoteur[numServo].pin);
  switch (servoMoteur[numServo].etatServo)
  {
    case SERVO_EN_MOUVEMENT_VERS_ANGLE_MAX:
      servoMoteur[numServo].vitesse = -1;
      servoMoteur[numServo].etatServo = SERVO_EN_MOUVEMENT_VERS_ANGLE_MIN;
      break;
  }
}

void loop()
{
  int numServo;
 
  for (numServo = 0; numServo < 4; numServo++)
    gereServo(numServo);
 
  byte evenement = lireEvenement(&numServo);
 
  if (evenement == EVENEMENT_PRESSE)
    evenementServo_DROIT(numServo);

  if (evenement == EVENEMENT_RELACHE)
    evenementServo_DEVIE(numServo);
   
  delay(3);
}
--- Fin du code ---
Bien sûr , j'arrive a le compiler mais il ne marche toujours pas .
Comme je vous l'ai dit précédemment , je ne sais pas programmer . Je n'ai donc pas trouver la solution , d'ailleurs , je ne sais quoi chercher.
Désolé DDEF , mais comme tu le précisais dans ton message du 18 décembre , je t'appelle à l'aide.
Cordialement

Jean-Luc:
Bonjour et meilleurs vœux pour 2016.

Bon, si j'ai bien compris tu souhaites remplacer les 8 poussoirs par 4 interrupteurs deux positions. Il faut donc 4 broches : A0 à A3 (qui peuvent être utilisées en numérique).

En fait c'est beaucoup plus simple que ce que j'ai écrit, tu n'as pas à gérer un événement (la pression sur le poussoir). Il suffit de lire l'état de l'interrupteur et d'en déduire la vitesse pour chaque servo. Le corollaire est que la fonction lirePoussoirs() ne convient pas dans sa philosophie puisqu'elle est conçue pour ne rendre compte d'un événement sur un seul bouton.

Donc : suppression pure et simple de lireEvenement() et de lirePoussoirs(). Suppression des variables ancienAx et nouveauAx. Déclaration d'un tableau reliant un servo et son numéro à la broche où est connecté l'interrupteur qui le commande :


--- Code: ---const byte brocheInterrupteurPourServo[4] = {
  A0,
  A1,
  A2,
  A3
};

--- Fin du code ---

Dans setup initialisation de ceci en INPUT_PULLUP


--- Code: ---for (byte i = 0; i < 4; i++) {
  pinMode(brocheInterrupteurPourServo[i], INPUT_PULLUP);
}

--- Fin du code ---

Dans loop au lieu d'avoir :


--- Code: ---void loop()
{
  int numServo;
 
  for (numServo = 0; numServo < 4; numServo++)
    gereServo(numServo);
 
  byte evenement = lireEvenement(&numServo);
 
  if (evenement == EVENEMENT_PRESSE)
    evenementServo_DROIT(numServo);

  if (evenement == EVENEMENT_RELACHE)
    evenementServo_DEVIE(numServo);
   
  delay(3);
}

--- Fin du code ---

on a :


--- Code: ---void loop()
{
  int numServo;
 
  for (numServo = 0; numServo < 4; numServo++)
    gereServo(numServo);
 
  for (numServo = 0; numServo < 4; numServo++) {
    byte positionInterrupteur = digitalRead(brocheInterrupteurPourServo[i]);
    if (positionInterrupteur == LOW) {
      evenementServo_DROIT(numServo);
    }
    else {
      evenementServo_DEVIE(numServo);
    }
  }
  delay(3);
}

--- Fin du code ---

les fonctions evenementServo_DROIT et evenementServo_DEVIE sont fausses. Lorsque le servo n'est pas en mouvement, le système est bloqué, plus rien ne réagit. Je te laisse corriger ça.

philippe 31:
Jean Luc , merci  pour ton aide. Beau cadeau d'anniversaire , Eh oui 59 ans!!!!

J'ai repris le code en intégrant tes remarques


--- Code: ---// Déclaration des variables pour les servomoteurs
#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 boolean DROIT = true;   
const boolean DEVIE = false;   
 
const int angleMin = 1250;
const int angleMax = 1750;
 
struct DescripteurServo {
  Servo objetServo;
  int vitesse;
  int angle;
  int pin;
  byte etatServo;
                       };

struct DescripteurServo servoMoteur[4];
 
const byte NON_PRESSE = 0;
const byte ENFONCE = 1;
const byte PRESSE = 2;
 
byte etatAutomate = NON_PRESSE;
int etatPoussoir = -1;
 
const byte AUCUN_EVENEMENT = 0;
const byte EVENEMENT_PRESSE = 1;
const byte EVENEMENT_RELACHE = 2;

// Déclaration des variables pour les bistables
 int i;
 const byte brocheInterrupteurPourServo[4] =
 {
  A0,
  A1,
  A2,
  A3
  };

// Lecture du numéro de bistable


void setup()
{
   /* Initialisation des servos */
   int numServo;
 
  for (numServo = 0; numServo < 4; numServo++)
  {
    servoMoteur[numServo].angle = angleMin;
    servoMoteur[numServo].vitesse = 0;
    servoMoteur[numServo].etatServo = SERVO_A_ANGLE_MIN;
    servoMoteur[numServo].pin = numServo + 2;
    servoMoteur[numServo].objetServo.attach(servoMoteur[numServo].pin);
  }
 
  /* Initialisation des bistables */
 
for (byte i = 0; i < 4; i++)
  {
   pinMode(brocheInterrupteurPourServo[i], INPUT_PULLUP);
  }   
}

void gereServo(int numServo)
{
  servoMoteur[numServo].objetServo.writeMicroseconds(servoMoteur[numServo].angle);
 
  servoMoteur[numServo].angle += servoMoteur[numServo].vitesse;
 
  if (servoMoteur[numServo].angle > angleMax)
  {
    servoMoteur[numServo].angle = angleMax;
    servoMoteur[numServo].vitesse = 0;
    servoMoteur[numServo].objetServo.detach();
    servoMoteur[numServo].etatServo = SERVO_A_ANGLE_MAX;
  }
  else
    if (servoMoteur[numServo].angle < angleMin)
    {
    servoMoteur[numServo].angle = angleMin;
    servoMoteur[numServo].vitesse = 0;
    servoMoteur[numServo].objetServo.detach();
    servoMoteur[numServo].etatServo = SERVO_A_ANGLE_MIN;
    }
}

void evenementServo_DROIT (int numServo)
{
  servoMoteur[numServo].objetServo.attach(servoMoteur[numServo].pin);
  switch (servoMoteur[numServo].etatServo)
  {
    case SERVO_A_ANGLE_MIN:
    case SERVO_EN_MOUVEMENT_VERS_ANGLE_MIN:
      servoMoteur[numServo].vitesse =  1;
      servoMoteur[numServo].etatServo = SERVO_EN_MOUVEMENT_VERS_ANGLE_MAX;
      break;
  }
}

void evenementServo_DEVIE (int numServo)
{
  servoMoteur[numServo].objetServo.attach(servoMoteur[numServo].pin);
  switch (servoMoteur[numServo].etatServo)
  {
    case SERVO_A_ANGLE_MAX:
    case SERVO_EN_MOUVEMENT_VERS_ANGLE_MAX:
      servoMoteur[numServo].vitesse = -1;
      servoMoteur[numServo].etatServo = SERVO_EN_MOUVEMENT_VERS_ANGLE_MIN;
      break;
  }
}

void loop()
{
  int numServo;
 
  for (numServo = 0; numServo < 4; numServo++)
    gereServo(numServo);
   
    for (numServo = 0; numServo < 4; numServo++)
    {
    byte positionInterrupteur = digitalRead(brocheInterrupteurPourServo[i]);
   
    if (positionInterrupteur == LOW) {
      evenementServo_DROIT(numServo);
                                      }
    else                              {
      evenementServo_DEVIE(numServo);
                                      }
     }
 
  delay(3);
}
--- Fin du code ---
J'ai modifié les fonctions   evenementServo_DROIT et evenementServo_GAUCHE
J'ai réalisé le montage avec 3 inters et 3 servos. Les servos fonctionnent bien , vont de droite à gauche et vis versa .
Le seul problème est que les servos sont commandés par l'inter A0 , les autres inters A1 et A2 sont à priori inertes.
Je ne pens pas avoir fait un mauvais montage !!
Salutations

Navigation

[0] Index des messages

[#] Page suivante

[*] Page précédente

Utiliser la version classique