Auteur Sujet: Moteur aiguillage Lent avec servo moteur  (Lu 752 fois)

ViniTrain44

  • Newbie
  • *
  • Messages: 2
    • Voir le profil
Moteur aiguillage Lent avec servo moteur
« le: août 23, 2020, 04:09:04 pm »
Bonjour à tous,

Je débute avec arduino et je voudrais réaliser la commande d'aiguillages avec servomoteurs.
J'ai fait un début de programme. Celui-ci permet de faire changer la position d'un servomoteur avec un interrupteur à bascule 2 pôles. Le programme fonctionne mais je souhaiterais diminer la vitesse du servo. J'ai essayé avec la bibliothèque "SlowMotionServo" mais sans succès.
Pouvez-vous m'aider ?
Merci d'avance.
Bonne journée  ;D

Voici le programme :

#include <Servo.h>


int pinBouton1;
int pinBouton2;
int pinBouton3;
int pinBouton4;

int servoPin1 = 1;
int servoPin2 = 2;
int servoPin3 = 3;
int servoPin4 = 4;

Servo myServo1;
Servo myServo2;
Servo myServo3;
Servo myServo4;

 
void setup()
{
  myServo1.attach(servoPin1);
  myServo2.attach(servoPin2);
  myServo3.attach(servoPin3);
  myServo4.attach(servoPin4);
 
  pinBouton1 = 5;
   pinBouton2 = 6;
   pinBouton3 = 7;
   pinBouton4 = 8;

 

  //définition des modes
  pinMode(pinBouton1, INPUT);
  pinMode(pinBouton2, INPUT);
  pinMode(pinBouton3, INPUT);
  pinMode(pinBouton4, INPUT);

}
void loop()
{
  //lecture de l'état du bouton et stockage dans etatBouton
  boolean etatBouton1 = digitalRead(pinBouton1);
  boolean etatBouton2 = digitalRead(pinBouton2);
  boolean etatBouton3 = digitalRead(pinBouton3);
  boolean etatBouton4 = digitalRead(pinBouton4);
 
  //test des conditions
  if (etatBouton1==HIGH)//test si bouton appuyé
  {
  myServo1.write(0); 
  }
   else
  {
   myServo1.write(90); 
  }

    if (etatBouton2==HIGH)//test si bouton appuyé
  {
  myServo2.write(0); 
  }
   else
  {
   myServo2.write(90); 
  }
 
    if (etatBouton3==HIGH)//test si bouton appuyé
  {
  myServo3.write(0); 
  }
   else
  {
   myServo3.write(90); 
  }
 
    if (etatBouton4==HIGH)//test si bouton appuyé
  {
  myServo4.write(0); 
  }
   else
  {
   myServo4.write(90); 
  }
}

Dominique

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 2160
  • 100% Arduino et N
    • Voir le profil
Re : Moteur aiguillage Lent avec servo moteur
« Réponse #1 le: août 23, 2020, 05:04:18 pm »
J'ai essayé avec la bibliothèque "SlowMotionServo" mais sans succès.

C'est bizarre, les exemples sont simples et fonctionnent : en partant des exemples vous devriez y arriver  :D

Pouvez-vous expliquer ce "sans succès" ?
Le problème doit être ailleurs.

Ma meilleure réponse au reste du message est : utilisez "SlowMotionServo" et persévérez  ;D
L'exemple PushButton2Servos est très proche de votre programme.
« Modifié: août 23, 2020, 05:25:00 pm par Dominique »
Cordialement.

La qualité des réponses est liée à la qualité des questions. De bonnes questions peuvent conduire à de bonnes réponses. Une réponse décevante est le signe d'une question mal posée, mal documentée.

ViniTrain44

  • Newbie
  • *
  • Messages: 2
    • Voir le profil
Re : Moteur aiguillage Lent avec servo moteur
« Réponse #2 le: août 23, 2020, 06:59:15 pm »
J'ai réussi haha  ;D
Comme quoi il faut persévérer !! :D
Merci des conseils !

Cordialement
Vincent
« Modifié: août 23, 2020, 09:18:29 pm par Dominique »

Tony04

  • Sr. Member
  • ****
  • Messages: 377
    • Voir le profil
Re : Moteur aiguillage Lent avec servo moteur
« Réponse #3 le: décembre 05, 2020, 05:35:48 pm »
Bonjour à tous,

qui pourrait me dire combien de servos maximum peux gérer la librairie "Slowmotion" ?

Chez moi je n'arrive pas à dépasser 12 servos, est-ce normal ?

Merci par avance pour vos réponses.

Cordialement
Antoine

bobyAndCo

  • Global Moderator
  • Sr. Member
  • *****
  • Messages: 479
  • HO avec DCC++
    • Voir le profil
Re : Moteur aiguillage Lent avec servo moteur
« Réponse #4 le: décembre 05, 2020, 06:52:21 pm »
La limite est dans Servo.h ligne 81 et 82 :

#define SERVOS_PER_TIMER       12     // the maximum number of servos controlled by one timer
#define MAX_SERVOS   (_Nbr_16timers  * SERVOS_PER_TIMER)

https://github.com/arduino-libraries/Servo/blob/master/src/Servo.h

selon ton architecture :

// Architecture specific include
#if defined(ARDUINO_ARCH_AVR)
#include "avr/ServoTimers.h"
#elif defined(ARDUINO_ARCH_SAM)
#include "sam/ServoTimers.h"
#elif defined(ARDUINO_ARCH_SAMD)
#include "samd/ServoTimers.h"
#elif defined(ARDUINO_ARCH_STM32F4)
#include "stm32f4/ServoTimers.h"
#elif defined(ARDUINO_ARCH_NRF52)
#include "nrf52/ServoTimers.h"
#elif defined(ARDUINO_ARCH_MEGAAVR)
#include "megaavr/ServoTimers.h"
#elif defined(ARDUINO_ARCH_MBED)
#include "mbed/ServoTimers.h"
#else
#error "This library only supports boards with an AVR, SAM, SAMD, NRF52 or STM32F4 processor."
#endif


https://github.com/arduino-libraries/Servo/blob/master/src/avr/ServoTimers.h

// Say which 16 bit timers can be used and in what order
#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
#define _useTimer5
#define _useTimer1
#define _useTimer3
#define _useTimer4
typedef enum { _timer5, _timer1, _timer3, _timer4, _Nbr_16timers } timer16_Sequence_t;

#elif defined(__AVR_ATmega32U4__)
#define _useTimer1
typedef enum { _timer1, _Nbr_16timers } timer16_Sequence_t;

#elif defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB1286__)
#define _useTimer3
#define _useTimer1
typedef enum { _timer3, _timer1, _Nbr_16timers } timer16_Sequence_t;

#elif defined(__AVR_ATmega128__) || defined(__AVR_ATmega1281__) || defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__) || defined(__AVR_ATmega2561__)
#define _useTimer3
#define _useTimer1
typedef enum { _timer3, _timer1, _Nbr_16timers } timer16_Sequence_t;

#else  // everything else
#define _useTimer1
typedef enum { _timer1, _Nbr_16timers } timer16_Sequence_t;
#endif
« Modifié: décembre 05, 2020, 07:03:08 pm par bobyAndCo »

Tony04

  • Sr. Member
  • ****
  • Messages: 377
    • Voir le profil
Re : Moteur aiguillage Lent avec servo moteur
« Réponse #5 le: décembre 06, 2020, 03:25:44 pm »
Bonjour Christophe,

un grand merci pour ta réponse.
Mais du coup est-ce que je peux changer cette valeur "SERVOS_PER_TIMER" sur un NANO sans risquer une saturation ou autre plantage, 13 me suffirait ?
Et je n'ai pas bien compris la raison des codes envoyés dans ta réponse.

Antoine

bobyAndCo

  • Global Moderator
  • Sr. Member
  • *****
  • Messages: 479
  • HO avec DCC++
    • Voir le profil
Re : Moteur aiguillage Lent avec servo moteur
« Réponse #6 le: décembre 07, 2020, 09:56:47 am »
Servo.h définit quel fichier est utilisable selon l'architecture, dans ton cas AVR donc ServoTimers.h dans le répertoire avr : avr/ServoTimers.h. Ce fichier ServoTimers.h définit lui-même les timer utilisé selon les processeurs.

L'ATmega 328 du NANO entre dans la catégorie :

#else  // everything else
#define _useTimer1
typedef enum { _timer1, _Nbr_16timers } timer16_Sequence_t;

et donc on voit que seul le timer 1 est disponible (parce que c'est le seul timer 16 bits). Impossible donc, avec cette bibliothèque d'utiliser plus de 12 servos sur un NANO. Sauf peut-être à modifier en effet #define SERVOS_PER_TIMER       12 à 13. Il n'y a pas grand risque à essayer !
« Modifié: décembre 07, 2020, 10:01:56 am par bobyAndCo »

Tony04

  • Sr. Member
  • ****
  • Messages: 377
    • Voir le profil
Re : Moteur aiguillage Lent avec servo moteur
« Réponse #7 le: décembre 07, 2020, 12:14:01 pm »
Bonjour Christophe,

super réponse, tout est clair et je t'en remercie encore.

Cordialement
Antoine