Problème avec des servomoteurs!

Bonjour a tous,

Effectivement @68tjs le but est que le servomoteur reste en place une fois que l'on relâche.
Je viens de faire un test uniquement avec les joysticks et voila ce que j'obtient :

Dans ce cas d'où pensez-vous que peut venir le problème dans ce cas là ?

Cordialement,
Maxspace03.

Bonsoir Maxspace03

Essaies de faire avec
writeMicroseconds(). // en millisecondes
au lieu de
write(). // en degrés
Donnes-nous une référence de ton servo.

Cordialement
jpbbricole

Qu'est ce que cela changera ?
write en degrés ne fait qu'une règle de trois.

Pour moi, tout petit programmeur qui n'est pas à l'aise avec plusieurs pages écran de lignes de code, mais très à l'aise avec les tests physiques et mesures en tout genre, je teste avec les moyens dont je dispose. Et quand cela parait anormal, je n'exclue absolument rien.

Si cela fonctionne chez l'un et pas chez l'autre il faut comprendre où sont les différences. Pour cela je ne connais qu'un moyen : pas de long discours, mais des tests des deux cotés.
Parce qu'il faut aussi s'entendre sur le "cela fonctionne". Il n'est pas gagné d'avance que tout le monde lui donne la même signification.

Bonjour maxspace03

J'ai même refait les essais avec un Mega comme toi, on ne sait jamais!, même constat, ton programme fonctionne très bien
Pour la suite de la saga du servo :wink:, essayes un autre truc, supprimes ces 2 lignes

Serial.println("Position X\t" + String(x_pos));
Serial.println("Position Y\t" + String(y_pos));

et mets ces 2 lignes qui "moniteur" X, à la place.

Serial.print("Position X\t" + String(x_pos) + "\tinitial_position X " + String(initial_position));
Serial.println("\tmicSec X\t" + String(servo1.readMicroseconds()));

qui fait un "moniteur" de l'axe X.

Position X 1023 initial_position X 39 micSec X 946
Position X 1023 initial_position X 40 micSec X 956
Position X 1023 initial_position X 41 micSec X 966
Position X 1023 initial_position X 42 micSec X 977
Position X 1023 initial_position X 43 micSec X 987
Position X 1023 initial_position X 44 micSec X 997
Position X 1023 initial_position X 45 micSec X 1008
Position X 1023 initial_position X 46 micSec X 1018
Position X 1023 initial_position X 47 micSec X 1028
Position X 1023 initial_position X 48 micSec X 1038
Position X 608 initial_position X 49 micSec X 1049

Fait un déplacement avec le joystick X et, au moment du relâchement du joystick que se passe-t-il avec micSec X.

Autre question, as-tu un servo "spécial" auquel cas, il faudrait travailler en microSecondes avec writeMicroseconds() à la place de write() et tâtonner pour trouver la bonne plage.
Aurais-tu une référence de ton servo et de ton joystick, liens ou photos.
Si possible, poste une photo de ton montage.

A+
Cordialement
jpbbricole

Bonjour,

Les servos que je possède sont des servos sg90 et ky66 mais je les utilisent uniquement pour les tests.
Le joystick que j'utilise est celui livré dans le pack arduino "Starter Kit" de Elegoo, mais ils ne donnent aucune reference a ce sujet, mais voici une photo du joystick, du servo et du montage :
Envoi en cours : IMG_20210530_092941.jpg…
Envoi en cours : IMG_20210530_093041.jpg…
Envoi en cours : IMG_20210530_093058.jpg…

Pas de problème je vais changer mon code et tester tout cela, merci encore pour tout.
Par contre je risque d'être un peut moins joiniable jusqu'à la fin de la semaine car j'ai mon oral du brevet a préparer et à passer.

Mais j'essayerai de regarder et de répondre régulièrement à vos messages.

Cordialement,
Maxspace03

Rebonjour,

désolé de ma réponse tardive j'avais le brevet a passer. J'ai donc lu attentivement votre message jppbricole et je ne comprends pas comment je peut remplacer le morceau de code que vous m'avez donner vu que dans mon code je n'ai pas cela :

Serial.println("Position X\t" + String(x_pos));
Serial.println("Position Y\t" + String(y_pos));

Et voici mon code pour le moniteur, il est très rudimentaire mais comme je vous l'ai dit je débute et je pense que vous comprendrez ce que je veut dire ;

int xpin = A0;
int ypin = A1;

int xvalue;
int yvalue;

void setup() {
 Serial.begin(9600);

}

void loop() {
 xvalue = analogRead(xpin);
 Serial.print(xvalue);
 Serial.write('\t');


 yvalue = analogRead(ypin);
 Serial.print(yvalue);
 Serial.println();
 delay(1000);

}

Sur ce je vous remercie d'avance pour votre réponse et vous souhait une bonne journée.

Cordialement,
Maxspace03.

ne faites pas des print avec des concaténations de String, ça vous bouffe de la mémoire et de la performance pour rien du tout.
votre

 xvalue = analogRead(xpin);
 Serial.print(xvalue);
 Serial.write('\t');
 yvalue = analogRead(ypin);
 Serial.println(yvalue); // vous pouvez rajouter le ln ici pour le passage à la ligne 

est très bien

comme dit précédemment votre code fonctionne.

Bonjour maxspace03

J'espère que cela s'est bien passé?

Euh! pas tout à fait, j'ai l'impression que l'on a changé de sujet!
Pourquoi ne pas reprendre le programme du post #1 qui, pour moi, fonctionne bien. Seul problème qui semble ressortir comme signalé par @J-M-L au post #3, il y a un problème de centrage du joystick.

A moins que tu veuilles tout recommencer, pas à pas?

Cordialement
jpbbricole

Bonjour à vous,

Merci beaucoup @J-M-L pour ta reponse, maintenant je comprend mieux, je vais donc rajouter ce que vous m'avez dit. C'est vrai que cela est bizar vu que chez vous mon code fonctionne tres bien alors que quand je le teste il ne fait pas du tout ce que je lui demande, peut-etre un probleme de carte ?

Bonjour @jpbbricole, oui merci tout c'est bien passe pour le brevet. Effectivement comme l'a dit @J-M-L avant mon code fonctionne pour vous et comme proposé au post #3 j'ai testé le centrage des joysticks mais cela a donné, comme vous pouvez le vois au post #21, des resultats plutot corrects.

Et quand vous dites tout recommencer, vous voulez dire faire un code sur mesure petit à petit ?
Enfaite c'etait un peu l'idée principale que j'avait quand je vous ai posé la question au post #1 car je pensais que le code que je vous avait proposé ne fonctionnait pas du tout.

Cordialement,
Maxspace03

Remettons les pendules à l'heure :slight_smile:
Testez ce code, c'est essentiellement celui du premier post, mais "nettoyé".

#include <Servo.h>
Servo servo1;
Servo servo2;
const byte servo1Pin = 8;
const byte servo2Pin = 9;

const byte xJoystickPin = A1;
const byte yJoystickPin = A0;

int xPosition = 0;
int yPosition = 0;

void setup() {
  servo1.attach(servo1Pin);
  servo2.attach(servo2Pin);
  servo1.write(xPosition);
  servo2.write(yPosition);
}

void loop() {
  bool modification = false; // a-t-on changé la position d'un des servo ?

  // --- Test sur X ---
  int x_pos = analogRead(xJoystickPin);
  if ((x_pos < 300) && (xPosition > 10)) {
    servo1.write(--xPosition);
    modification = true;
  } else if ((x_pos > 700) && (xPosition < 170)) {
    servo1.write(++xPosition);
    modification = true;
  }
  
  // --- Test sur Y ---
  int y_pos = analogRead(yJoystickPin);
  if ((y_pos < 300) && (yPosition > 10)) {
    servo2.write(--yPosition);
    modification = true;
  } else if ((y_pos > 700)  && (yPosition < 170)) {
    servo2.write(++yPosition);
    modification = true;
  }

  if (modification) delay(40);
}

quel comportement voyez vous ?

(j'ai empêché le servo d'aller jusqu'à 180°, on arrête à 170° pour être symétrique puisque vous arrêtez à 10° de l'autre côté)

Bonjour,

J'ai fait le test avec le code que vous m'avez donné, voici le problème auquel j'ai été confronté :

je ne sais pas si c'est un problème d'ide ou de carte mais si cela est un problème de carte je suppose que c'est aussi pour cela que tous les codes que nous avons essayés ne fonctionnent pas chez moi.
Merci d'avance pour votre aide.

Cordialement,
Maxspace03.

Penses-tu que c'est lisible ?
N'aurait-il pas été plus efficace et cerise sur le gâteau plus simple, de recopier les messages d'erreur : il y a même une fonction prévue pour.

Regardes en bas à droite de ton image dans le bandeau orange !

Bonjour,

Pas de problème je fait ça, je n'avait effectivement pas prêté attention à cette fonction.

Voici le message :

avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_getsync(): timeout communicating with programmer
Une erreur est survenue lors du transfert du croquis

Merci d'avance pour votre aide.

Maxspace03

Problème de connexion entre le PC et la carte.

  • est-ce que le câble est bon?
  • est-ce que le câble est bien branché?
  • est-ce le bon port série qui est sélectionné?

Bonjour,

Merci beaucoup à vous @fdufnews pour votre aide précieuse. Suite à votre message je me suis rendu compte que sur l'ide arduino je n'avais que le port COM 3 de disponible alors que ma carte était en port COM 4. J'ai donc installé le driver USB pour l'arduino et tout fonctionne bien maintenant.

Merci beaucoup a vous.

Cordialement,
Maxime.

Rebonjour,

J'ai une très bonne nouvelle a vous annoncer, je viens de tester le code que @J-M-L m'a donné et tout fonctionne à merveille, du moins pout le moment :grin: :crossed_fingers:, donc maintenant je vais ajuster le programme pour que je puisse commander 6 servos avec 3 joystick.

Sur ce je vous souhaite une très belle journée et merci encore pour votre aide précieuse !

Cordialement,
Maxspace03.

Super :slight_smile:

Oui c'est une super nouvelle, encore un grand merci a vous pour votre aide !

Bonjour,

Je sais que le sujet est résolu mais j'avais encore une question a vous poser qui me parait importante pour le suite de mon projet.
Pour des servos moteurs qui ont un angle de rotation de 360° est-ce que a la place de dire a servos de s'arrêter a 170° on peut par exemple lui dire de s'arrêter a 350° ?
Ou y a-t-il une autre méthode pour effectuer ceci ?

Merci d'avance pour votre réponse et désolé pour le dérangement.

Cordialement,
Maxspace03

Bonjour,

Si une rotation de 360°, il tourne en rond et n'a plus d'asservissement de position donc plus de contrôle de la position :disappointed_relieved: