Bonjour, je cherche à piloter un servo digital mais je n'y arrive pas. Mon code marche seulement pour un analogique. Quelqu'un sait comment faire ?
Merci
#include <Servo.h>
Servo myservo; // create servo object to control a servo
void setup() {
Serial.begin(115200);
myservo.attach(9); // attaches the servo on pin 9 to the servo object
}
void loop() {
Serial.println(analogRead(A0));
if(analogRead(A0) <= 500){
myservo.write(90); // sets the servo position according to the scaled value
delay(500); // waits for the servo to get there
myservo.write(0); // sets the servo position according to the scaled value
delay(500); // waits for the servo to get there
}
else{
myservo.write(0); // sets the servo position according to the scaled value
}
}
On trouve 2 types de servo, analogique et digital. Le premier est un SG 90 est un analogique (modulation analogique) mais il est pas assez puissant donc je voulais utilisé un MG 91 qui lui est digitale.
J'espère ne pas dire de bêtise, mais en tout cas sur google tu as des infos sur les deux types de servos.
Sur le sujet servos analogiques/servos digitaux j'ai lu tout et son contraire et je n'ai pas réussi à y voir clair.
As-tu des liens vers la documentation des MG91 ?
Cela sera plus simple si on parle sur du concret.
Remarque : il existe des servos "dit analogiques" qui sont bien plus puissant que les S90.
Et je pense que le MG91 est un servo classique qui se commande avec un signal numérique qui est transformé en signal analogique par l'électronique interne du servo.
En servo "numérique" j'ai trouvé ceci :
Ces servo se commandent à l'aide de codes circulant sur un bus ce qui ne me parrait pas être le case d'un MG91.
Le fait d'être analogique ou numérique n'a rien à voir avec la puissance, ce qui compte c'est la puissance du moteur.
̶B̶o̶n̶j̶o̶u̶r̶,̶ ̶l̶e̶ ̶s̶g̶ ̶9̶0̶ ̶[̶e̶t̶ ̶l̶e̶]̶ ̶m̶g̶ ̶9̶0̶ ̶s̶o̶n̶t̶ ̶d̶i̶g̶i̶t̶a̶l̶,̶ ̶e̶t̶ ̶t̶o̶u̶s̶ ̶l̶e̶s̶ ̶s̶e̶r̶v̶o̶s̶,̶ ̶(̶p̶e̶u̶t̶-̶ê̶t̶r̶e̶ ̶q̶u̶e̶ ̶l̶e̶s̶ ̶s̶e̶r̶v̶o̶s̶ ̶i̶n̶d̶u̶s̶t̶r̶i̶e̶l̶s̶ ̶c̶o̶m̶m̶e̶ ̶c̶e̶l̶u̶i̶ ̶i̶n̶d̶i̶q̶u̶é̶ ̶p̶a̶r̶ ̶@̶ ̶6̶8̶t̶j̶s̶ ̶v̶a̶u̶d̶r̶o̶n̶t̶ ̶u̶n̶e̶ ̶a̶u̶t̶r̶e̶ ̶m̶a̶n̶i̶è̶r̶e̶,̶ ̶j̶e̶ ̶n̶e̶ ̶s̶a̶i̶s̶ ̶p̶a̶s̶.̶)̶ Dans les servos analogique, ils ne peuvent que modifier la durée et la fréquence du pouls.
Avec la durée de l'impulsion, nous indiquons la position, degrés zéro d'impulsion courte, degrés maximum d'impulsion longue que le servo prend en charge.
Fréquence d'impulsion la fréquence entre le début de l'impulsion de position et l'impulsion de position suivante.
Dans notre cas:
Comme vous pouvez le voir, ils sont entièrement compatibles. Je suis désolé mais quelque chose se connecte ou vous avez un problème dans le circuit.
Les salutations.
Après quelques essais avec un servo digital (ALIGN DS610) j'ai remarqué qu'il se bloquait quand on lui envoyait un myservo.write(0);, il suffit, à la place d'envoyer myservo.write(20); (à 2 places) pour débloquer la situation.
Mais il est préférable de travailler en microsecondes, c'est plus précis.
#include <Servo.h>
Servo myservo; // create servo object to control a servo
#define servoMin 800 // A ajuster selon le type de servo
#define servoMax 2200
void setup() {
Serial.begin(115200);
myservo.attach(9); // attaches the servo on pin 9 to the servo object
}
void loop() {
Serial.println(analogRead(A0));
if(analogRead(A0) <= 500){
myservo.write(servoMax); // sets the servo position according to the scaled value
delay(500); // waits for the servo to get there
myservo.write(servoMin); // sets the servo position according to the scaled value
delay(500); // waits for the servo to get there
}
else{
myservo.write(servoMin); // sets the servo position according to the scaled value
}
}
Quand on parle de digital ou analogique dans le domaine des petits servos type radiocommande, ça veut dire «asservissement analogique» ou «asservissement digital».
A ma connaissance tous les servos bas et milieu de gamme sont à asservissement analogique. Il existe des servos haut de gamme où l'asservissement est fait par un petit microcontrôleur qui gère un pid.
Dans tous les cas la commande est digitale, sauf que certains servos haut de gamme acceptent une fréquence plus élevée (300Hz), mais ils restent compatibles avec une commande de 20ms de période.
J'ai écrit qu'on était dans le flou, qu'il était difficile d'avoir une vision claire et je le maintiens.
Néanmoins, il semble vrai que ce qui est appelé un servo digital c'est un "objet" qui en plus d'avoir un microcontrôleur se commande avec un protocole, des codes, un bus et des adresses. Un peu comme l'I2C même si en l'occurrence ce n'est pas de l'I2C.
Ce procédé permet d'avoir une meilleure précision de positionnement que la charge d'un condensateur à condition que la mécanique soit à la hauteur de l'électronique -> donc pas à 1,5€ sur aliexpress !
Dans un servo analogique le signal numérique de PWM à 50 Hz est envoyé sur un circuit RC qui le lisse pour obtenir un signal continu qui est comparé à celui renvoyé par le potentiomètre qui sert de capteur angulaire. Il est tout à fait possible d'inclure une PID analogique, les asservissements analogiques existaient avant le numérique.
J'ai lu aussi qu'il existait des servomoteurs avec des moteurs pas à pas.
Quant à travailler en angle ou en µs en théorie je ne vois pas de raison que l'un soit plus précis que l'autre.
S'il y a une différence, c'est que la bibliothèque Servo n'est pas parfaite.
Le fait de travailler un temps élimine la conversion angle vers temps, source d'imprécisions.
Déjà une bibliothèque Servo qui part du principe que tous les servo sont des 180° alors que la gamme s'étend de 90° à 270° n'est pas vraiment ce qui se fait de mieux. Surtout quand ce n'est pas clairement documenté et qu'il faut parcourir le code source pour le découvrir.
J'ai bien précisé que je parlais des petits servos que l'on utilise couramment en radio commande.
Il existe certainement des servos spéciaux avec des protocoles de commande spécifiques.
Pour rejoindre to vieil esprit, il y a la fonction map(), ainsi tu gardes les degrés tout en ayant tout le débattement de ton servo digital.
#include <Servo.h>
Servo myservo; // create servo object to control a servo
#define servoMin 800 // A ajuster selon le type de servo
#define servoMax 2200
void setup() {
Serial.begin(115200);
myservo.attach(9, servoMin, servoMax); // attaches the servo on pin 9 to the servo object
}
void loop() {
Serial.println(analogRead(A0));
if(analogRead(A0) <= 500){
servoMove(90); // sets the servo position according to the scaled value
delay(500); // waits for the servo to get there
servoMove(0); // sets the servo position according to the scaled value
delay(500); // waits for the servo to get there
}
else{
servoMove(0); // sets the servo position according to the scaled value
}
}
void servoMove(int angle)
{
//myservo.write(angle);
myservo.writeMicroseconds(map(angle, 0, 90, servoMin, servoMax));
}