Problème avec servo digital

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
}

}

Bonjour,

C'est quoi pour toi un servo analogique?

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.

Les deux servos sont à commande numérique. Les deux se commandent de la même façon.

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.

[humour]

Servo dans un centrale électrique

̶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:

  • SG90 : largeur d'impulsion 400--2400 uSeg. Fréquence 50Hz
  • MG91 : largeur d'impulsion 500--2400 utilisationg. Fréquence 50Hz

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.

Bonsoir

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
	}
}

Cordialement
jpbbricole

Bien sûr, mais mon vieil esprit pense qu'il est plus facile de penser en degrés et je n'ai pas à faire attention aux "dead band".
Les salutations.

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.

Bonjour gonpezzi

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));
}

Essayes les 2 méthodes

	//myservo.write(angle);
	myservo.writeMicroseconds(map(angle, 0, 90, servoMin, servoMax));

Le débattement passe presque du simple au double.

Grâce à l'ajout de servoMin et servoMax

	myservo.attach(9, servoMin, servoMax);  // attaches the servo on pin 9 to the servo object

Tu peux mettre 0 degrés sans blocage du servo digital.

Cordialement
jpbbricole

Merci a tous pour vos réponses je vais tester tout ça !

Problème résolu ! Le code de jpbbricole marche parfaitement ! Merci à tous

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.