LOCODUINO
Parlons Arduino => Débuter => Discussion démarrée par: ViniTrain44 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);
}
}
-
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.
-
J'ai réussi haha ;D
Comme quoi il faut persévérer !! :D
Merci des conseils !
Cordialement
Vincent
-
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
-
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
-
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
-
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 !
-
Bonjour Christophe,
super réponse, tout est clair et je t'en remercie encore.
Cordialement
Antoine