LOCODUINO

Discussions Générales => Discussions ouvertes => Discussion démarrée par: ferdi68 le février 19, 2018, 01:20:12 pm

Titre: Cde Servos
Posté par: ferdi68 le février 19, 2018, 01:20:12 pm
que dois-je faire pour commander un servo avec un bouton
: une impulsion demmarage du servo , 2eme impulsion retour dans sa position initiale
Titre: Re : Cde Servos
Posté par: Jean-Luc le février 19, 2018, 02:45:26 pm
Bonjour,

Avant de répondre : le code que vous aviez du mal a compiler fonctionne ?
Titre: Re : Cde Servos
Posté par: ferdi68 le février 19, 2018, 04:25:04 pm
oui , le servo fonctionne et l'angle de 90° est correct, le servo fait des va et vient
Titre: Re : Cde Servos
Posté par: CATPLUS le février 19, 2018, 05:15:30 pm
Bonjour

As-tu regardé ce post?

http://forum.locoduino.org/index.php?topic=222.0

Cordialement
Marcel
Titre: Re : Cde Servos
Posté par: Jean-Luc le février 20, 2018, 09:32:39 am
Comme vous débutez, commencez par programmer l’allumage et l’extinction de la led connectée à la broche 13 de l’Arduino avec un poussoir.

Pour gérer le poussoir et détecter les impulsions, utilisez la bibliothèque Bounce2 que vous pouvez installer facilement via le gestionnaire de bibliothèques. L’exemple « change » correspond à ce que vous attendez.

Ps : où est passé le fil de discussion sur vos problèmes de compilation ?
Titre: Re : Cde Servos
Posté par: ferdi68 le février 27, 2018, 04:14:04 pm
bonjour,
tout cela est ok et je viens de charger la biblio de Modeleisenbahn N concernant la commande du servo avec un bouton poussoir et ca fonctionne bien
ce que j'aimerais savoir c'set
1. comment ralentir le mouvement du servo
2. que dois-je faire maintenant pour rajouter d'autres servos avec leurs boutons correspondant?
Merci de votre aide
Titre: Re : Cde Servos
Posté par: ferdi68 le février 28, 2018, 09:53:24 am
#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 = 900;
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);

ceci est le programme actuel qui fonctionne
j'aimerais commander mes 10 portes de dépot alors que dois je faire
Cordialement
Fernand
Titre: Re : Cde Servos
Posté par: Jean-Luc le février 28, 2018, 10:12:59 am
Bonjour,

Oui c'est moi qui ait écrit ce programme.

Ceci dit entretemps de l'eau a coulé sous les ponts et quasiment tout ce qui est dans ce programme a été mis dans un bibliothèque qui offre plus de possibilités. Notamment un mouvement avec phase d'accélération, décélération et amortissement pour simuler un mouvement de porte.

Cette bibliothèque, SlowMotionServo, est disponible via le gestionnaire de bibliothèques de l'IDE. Allez dans Croquis > Inclure une bibliothèque > Gérer les bibliothèques. Dans la case Filtrez votre recherche, tapez SlowMotionServo.

Vous avez donc 5 remises, 10 portes, 10 servos et 5 boutons poussoir ?
Titre: Re : Cde Servos
Posté par: ferdi68 le février 28, 2018, 11:22:19 am
Bonjour et merci de votre reponse
J'ai en fait une remise avec 5 portes, donc 10 demi-portes a commander
je vais de ce pas chercher votre nouvelle biblio
merci
Fernand
Titre: Re : Cde Servos
Posté par: Jean-Luc le février 28, 2018, 11:23:26 am
Je suis en train de préparer l'article explicatif
Titre: Re : Cde Servos
Posté par: Jean-Luc le février 28, 2018, 12:13:17 pm
Notez qu'il y a assez de broches sur un Uno ou un Nano pour brancher les 10 servos et 5 boutons indépendants, pas la peine de mettre plusieurs boutons sur une entrée analogique.

Titre: Re : Cde Servos
Posté par: CATPLUS le février 28, 2018, 07:01:58 pm
Bonsoir

A voir ou a revoir (en anglais ... :)

https://www.youtube.com/watch?v=TWEDums_2ME
http://model-railroad-hobbyist.com/node/24316

Cordialement
Marcel
Titre: Re : Cde Servos
Posté par: ferdi68 le mars 01, 2018, 02:01:31 pm
Merci Jean-Luc
Le SlowMotionServo c'est super mais comment l'intégrer dans le programme avec la commande bouton?
Cordialement
Fernand
Titre: Re : Cde Servos
Posté par: Dominique le mars 01, 2018, 03:14:48 pm
La bibliothèque SlowMotionServo va bientôt être expliquée dans un article (réponse 9).
Titre: Re : Cde Servos
Posté par: Jean-Luc le mars 02, 2018, 12:13:55 pm
Bonjour,

Je viens de publier la version 1.0.3. La mise à jour s'effectue comme l'installation. Il y a un exemple avec 2 servos et un poussoir qui correspond à une double porte de remise.
Titre: Re : Cde Servos
Posté par: ferdi68 le mars 02, 2018, 05:03:33 pm
Bonjour Jean-Luc
Je viens de Charger   L'update SlowMotionServo 1.3.0
Question/ les servos sont bien branchés sur pin3 et 4 et le bouton sur analog pin  ?
car rien ne bouge
cordialement
Fernand
Titre: Re : Cde Servos
Posté par: Jean-Luc le mars 02, 2018, 05:04:30 pm
Le bouton sur 5. Quand on appuie dessus, il met en contact la broche 5 avec la masse (GND).
Titre: Re : Cde Servos
Posté par: ferdi68 le mars 02, 2018, 05:08:29 pm
Bonjoiur Jean-Luc
Ca fonctionne, le bouton dois bien etre sur pin5sur digitalPWM ?
maintenant comment dois-je faire pour rajouter les portes suivantes

Cordialement
Fernand
Titre: Re : Cde Servos
Posté par: ferdi68 le mars 02, 2018, 05:17:30 pm
Ok pigé c
Titre: Re : Cde Servos
Posté par: ferdi68 le mars 02, 2018, 05:20:24 pm
pour les portes suivantes dois-je faire un copier-coller et simplement changer le Nr des pins correspondant?
Titre: Re : Cde Servos
Posté par: Jean-Luc le mars 02, 2018, 05:22:46 pm
C'est ça.

Mais je suis en train de préparer un objet Remise pour encapsuler les deux servos et le bouton. Ça sera plus facile à répliquer. Ça sera dans l'article qui, si mes camarades du comité de rédaction sont ok, sortira demain.

Cordialement
Titre: Re : Cde Servos
Posté par: Jean-Luc le mars 02, 2018, 05:31:32 pm
Notez que vous ne pourrez sans doute pas alimenter les 10 servos avec l'Arduino, il faut une alimentation 5V séparée qui alimentera les servos (seulement) et il faut relier la masse de l'Arduino à la masse de cette alimentation.
Titre: Re : Cde Servos
Posté par: bobyAndCo le mars 03, 2018, 09:36:03 am
Bonjour Jean-Luc,

Un servo que l'on a pris soin de détacher après utilisation avec la fonction ServoDetach consomme t'il toujours du courant ? Le but de cette question est de savoir s'il est possible malgré tout de se passer d'alimentation externe lorsque l'on n'utilise jamais plus d'un servo à la fois (sur 10 par exemple). Quel nombre de servos est-il raisonnable de ne pas dépasser en liaison directe avec l'Arduino ?
Titre: Re : Re : Cde Servos
Posté par: Jean-Luc le mars 03, 2018, 09:55:22 am
Bonjour Christophe,

Un servo que l'on a pris soin de détacher après utilisation avec la fonction ServoDetach consomme t'il toujours du courant ?

Oui, autant qu'un servo non détaché (asservi en position) qui ne force pas. Sur mes micro-servos HobbyKing, je mesure 6,1mA au repos. Si il force ou est en mouvement c'est 40 à 60 mA voire jusqu'à 150mA si il force beaucoup mais mon multimètre moyenne et ça monte sans doute ponctuellement plus haut, plus de 200mA car mon multimètre affiche 1 parfois sur ce calibre.

Citer
Le but de cette question est de savoir s'il est possible malgré tout de se passer d'alimentation externe lorsque l'on n'utilise jamais plus d'un servo à la fois (sur 10 par exemple). Quel nombre de servos est-il raisonnable de ne pas dépasser en liaison directe avec l'Arduino ?

De mémoire j'avais essayé et ça fonctionne jusqu'à 5-6 avec ces servos là. Ensuite le régulateur de l'Arduino déclare forfait. En théorie il monte à 1A mais il chauffe et la protection thermique se déclenche.

Je rectifie : j'étais alimenté en USB et là c'est ton ordi qui va couper l'USB si tu dépasses 500mA

Jamais essayé avec l'arduino alimenté via VIN mais 500mA me semble la limite également.
Titre: Re : Cde Servos
Posté par: msport le mars 03, 2018, 10:27:38 am
D'après la fiche de spécification des régulateurs utilisés sur les UNO, on ne peut dépasser ~1W de dissipation, ce qui est atteint  avec 150 mA (7Vx150 mA) si on alimente en 12V sur le Vin - moins sur les Nano. On peut aller un peu plus loin en alimentant en 7,5 V. (2,5V x 400mA)
En 5V USB, certain ports dits + délivrent 1A et plus, comme d'ailleurs certaines alimentations et Power Bank.
Titre: Re : Cde Servos
Posté par: Jean-Luc le mars 03, 2018, 11:27:19 am
ferdi68, l'article est publié : http://www.locoduino.org/spip.php?article159  :)
Titre: Re : Cde Servos
Posté par: ferdi68 le mars 03, 2018, 05:38:20 pm
Bonsoir Jean-Luc,

j'ai configuré mon programme pour 5 remise, mais probleme: je n'ais pas assez de pins pour la 5eme quelle est la solution?

ci joint mon programme
#include <Servo.h>
#include <SlowMotionServo.h>
#include <Bounce2.h>

SMSSmoothBounce myServoRight;
SMSSmoothBounce myServoLeft;
Bounce myButton;

const byte servoRightPin = 4;
const byte servoLeftPin = 3;
const byte buttonPin = 5;
const byte ledPin = 13;

void setup()
{
  pinMode(ledPin, OUTPUT);
  /* when the button is pressed, the input is LOW */
  pinMode(buttonPin, INPUT_PULLUP);

  myButton.attach(buttonPin);
  /* scan interval for debounce */
  myButton.interval(5);

  myServoRight.setMin(750);
  myServoRight.setMax(1800);
  myServoLeft.setMin(1100);
  myServoLeft.setMax(2200);
 
  myServoRight.setSpeed(1.5);
  myServoLeft.setSpeed(1.5);

  myServoLeft.setReverted(true);
 
  myServoRight.setInitialPosition(0.0);
  myServoLeft.setInitialPosition(0.0);
  myServoRight.setPin(servoRightPin);
  myServoLeft.setPin(servoLeftPin);
  digitalWrite(ledPin, HIGH);
}

void loop()
{
  static float servoTarget = 0.0;

  /* update the state of the button */
  myButton.update();
  /* update the position of the servo */
  SlowMotionServo::update();
 
  if (myServoRight.isStopped() && myServoLeft.isStopped()) {
    digitalWrite(ledPin, LOW);
    if (myButton.fell()) {
      /* look at the button only when the servo is stopped */
      /* change the target */
      servoTarget = 1.0 - servoTarget;
      /* set the new target for the servo */
      myServoRight.goTo(servoTarget);
      myServoLeft.goTo(servoTarget);
      digitalWrite(ledPin, HIGH);
    }
  }
}
est juste ou y a t'il des erreurs?

Cordialement
Fernand
Titre: Re : Cde Servos
Posté par: Jean-Luc le mars 03, 2018, 05:52:50 pm
Les pins A0 à A5 peuvent également être des pins numériques. Elles ne sont pas uniquement des entrées analogiques

Et je ne vois qu'une seule remise dans le programme. Avez vous lu l'article publié ce matin ? notamment le sketch à la fin.
Titre: Re : Cde Servos
Posté par: ferdi68 le mars 03, 2018, 07:08:05 pm
#include <Bounce2.h>
#include <Servo.h>
#include <SlowMotionServo.h>

class Remise {
  private: SMSSmoothBounce mPorteDroite;
  private: SMSSmoothBounce mPorteGauche;
  private: Bounce mBoutonOverture;
  private: bool mPosition; /* false = fermé, true = ouvert */

  public: void demarre(const byte pinBouton, const byte pinServoPorteDroite, const byte pinServoPorteGauche);
  public: void gereRemise();
};

void Remise::demarre(const byte pinBouton, const byte pinServoPorteDroite, const byte pinServoPorteGauche)
{
  pinMode(pinBouton, INPUT_PULLUP);
  mBoutonOverture.attach(pinBouton);
  mBoutonOverture.interval(5); /* rafraichissement toutes les 5ms */
  mPorteDroite.setMin(900);
  mPorteDroite.setMax(1750);
  mPorteDroite.setSpeed(1.7);
  mPorteGauche.setMin(1100);
  mPorteGauche.setMax(2000);
  mPorteGauche.setSpeed(1.7);
  mPorteGauche.setReverted(true); /* La porte gauche a un mouvement inverse */
  mPorteDroite.setInitialPosition(0.1);
  mPorteGauche.setInitialPosition(0.1);
  mPorteDroite.setPin(pinServoPorteDroite);
  mPorteGauche.setPin(pinServoPorteGauche);
  mPosition = false;
  /* ferme les porte au démarrage */
  mPorteDroite.goTo(0.0);
  mPorteGauche.goTo(0.0);
}

void Remise::gereRemise()
{
  mBoutonOverture.update(); /* met à jour l'état du bouton */
  if (mPorteDroite.isStopped() && mPorteGauche.isStopped())
  {
    /* si un mouvement était en cours, il est terminé */
    if (mBoutonOverture.fell()) {
      /* appui sur le bouton, on démarre le mouvement */
      if (mPosition) {
        /* la remise est ouverte, la cible pour la fermer est 0.0 */
        mPorteDroite.goTo(0.0);
        mPorteGauche.goTo(0.0);
        mPosition = false;
      }
      else {
        /* la remise est fermée, la cible pour l'ouvrir est 1.0 */
        mPorteDroite.goTo(1.0);
        mPorteGauche.goTo(1.0);
        mPosition = true;
      }
    }
  }
}

/* Instance de Remise */
Remise remise1;

/* les broches */
const byte pinServoDroitRemise1 = 2;
const byte pinServoGaucheRemise1 = 3;
const byte pinBoutonRemise1 = 4;

Remise remise2;

/* les broches */
const byte pinServoDroitRemise2 = 5;
const byte pinServoGaucheRemise2 = 6;
const byte pinBoutonRemise2 = 7;

Remise remise3;

/* les broches */
const byte pinServoDroitRemise3 = 8;
const byte pinServoGaucheRemise3 = 9;
const byte pinBoutonRemise3 = 10;

Remise remise4;

/* les broches */
const byte pinServoDroitRemise4 = 11;
const byte pinServoGaucheRemise4 = 12;
const byte pinBoutonRemise4 = 13;

Remise remise5;

/* les broches */
const byte pinServoDroitRemise5 = A0;
const byte pinServoGaucheRemise5 = A1;
const byte pinBoutonRemise5 = A3;


void setup()
{
  remise1.demarre(pinBoutonRemise1, pinServoDroitRemise1, pinServoGaucheRemise1);

  remise2.demarre(pinBoutonRemise2, pinServoDroitRemise2, pinServoGaucheRemise2);

  remise3.demarre(pinBoutonRemise3, pinServoDroitRemise3, pinServoGaucheRemise3);

  remise4.demarre(pinBoutonRemise4, pinServoDroitRemise4, pinServoGaucheRemise4);

  remise5.demarre(pinBoutonRemise5, pinServoDroitRemise5, pinServoGaucheRemise5);
}

void loop()
{
  SlowMotionServo::update();
  remise1.gereRemise();
}


voila je m'étais trompé de programme, excusez moi

il doit manquer quelque chose car seule la remise1 fonctionne
Titre: Re : Cde Servos
Posté par: Jean-Luc le mars 03, 2018, 07:11:19 pm
Oui,

Dans loop, il faut appeler gereRemise() pour chaque remise sinon leur bouton respectif n’est pas lu.
Titre: Re : Cde Servos
Posté par: ferdi68 le mars 03, 2018, 08:07:21 pm
Merci Jean-Luc ca fonctionne a merveille super
Cordialement et bonne soirée
Fernand
Titre: Re : Cde Servos
Posté par: Jean-Luc le mars 03, 2018, 10:27:15 pm
Nickel  :)

Je suis preneur d'une vidéo quand tout sera en place sur le réseau  ;)
Titre: Re : Cde Servos
Posté par: ferdi68 le mars 04, 2018, 02:08:39 pm
Bonjour Jean-Luc,
j' ai détecté un probleme: lors de la mise sous tension un des servos fait plusieurs tours complet avant de se stabiliser et ensuite il fonctionne normalement
c'est pas bon pour la porte en question ,vu qu'elle n'a qu'une course de 90°
que faire?
Cordialement
Fernand
Titre: Re : Cde Servos
Posté par: Jean-Luc le mars 04, 2018, 02:12:59 pm
C'est sans doute un problème électrique, faux contact sur l'alim. J'ai eu ça en mesurant la consommation.

Mais pour sécuriser, je mettrais une butée mécanique sur la palonnier de façon à l'empêcher de tout casser en cas de défaillance (c'est ce que je vais faire pour mon installation).

Par ailleurs, lors de la mise sous tension, les servos ont de toutes façons un petit mouvement. Pour empêcher ça, il faut relier le signal de commande au +5V par une résistance de quelques kilos. Ça pourrait aussi régler le problème de faux contact
Titre: Re : Cde Servos
Posté par: Dominique le mars 04, 2018, 02:18:01 pm
Et un condensateur de 0,1 micro entre le +5 et le GND de chaque Servo ? Ça bloquerait la remontée de parasites vers l’Arduino.
Titre: Re : Cde Servos
Posté par: Jean-Luc le mars 04, 2018, 05:36:36 pm
C’est pas l’Arduino qui est parasité.

C’est le signal de commande et sa référence de tension (l’alimentation)
Titre: Re : Cde Servos
Posté par: ferdi68 le mars 08, 2018, 11:03:07 pm
Bonsoir,
j'ai une dernière question: est il possible de décaler en temps un des servos d'une porte, tout cela pour donner l'impression d'une ouverture de demi-porte et la 2eme légèrement décalée en temps

Cordialement
Fernand
Titre: Re : Cde Servos
Posté par: Jean-Luc le mars 09, 2018, 04:42:17 pm
Oui c'est possible  :) Et c'est également prévu pour mes remises. Je concrétise ça ce week-end.
Titre: Re : Cde Servos
Posté par: Jean-Luc le mars 10, 2018, 02:32:52 pm
Bonjour,

Evidemment c'est un peu plus compliqué. Il faut ajouter une machine à état (automate) pour rendre compte de l'état d'une remise et des actions possibles.

Donc, en plus de la position ouverte ou fermée, une remise peut être dans 4 états :

On donne les transitions possibles entre les états :

(http://www.locoduino.org/pic/sms/automate.png)

En rouge ce sont des gardes : la transition n'est possible que si elle est vraie, sinon on reste dans l'état
En vert les actions : ce qui est effectué lorsque la transition est franchie

Ci dessous le sketch : on tire au hasard la porte qui va être en retard, on tire au hasard de combien est le retard, c'est réglable en millisecondes avec RETARD_MIN et RETARD_MAX. C'est compatible avec le setup et le loop de votre programme actuel.
Titre: Re : Cde Servos
Posté par: Dominique le mars 10, 2018, 05:19:12 pm
Je me demande s’il n’aurait pas été plus simple de commander séparément la porte gauche et la porte droite avec un petit retard (géré avec millis() évidemment), sans objet remise ?

Mais là, c’est le grand luxe ! L’exemple est complet et très didactique ;)
Titre: Re : Cde Servos
Posté par: Jean-Luc le mars 10, 2018, 05:21:43 pm
Merci Dominique,

Pour répondre à ta question, je ne pense pas. En effet, quand tu veux gérer plusieurs double portes, ça se transforme rapidement en usine à gaz.
Titre: Re : Cde Servos
Posté par: Dominique le mars 10, 2018, 05:24:12 pm
Et dès qu’on dit « plusieurs » on doit penser « Objet »

Tu as raison .