Bonjour,
Je viens d'acheter des servomoteurs SG90 sur Amazon pour un projet, et une fois branchés le servomoteur émet un son "tic tic tic" en continue cela veut t'il dire que le servo à un problème ou cela vient de mon programme ?
J'avais déjà réalisé un projet avec un servomoteur SG90 mais ce problème n'est jamais apparu.
Comment est-il brancher et bien comme un SG90 donc négatif, positif et information, et directement sur la sortie du PC, le programme n'est pas important, il est commandé par mise en position myservo.Write(XX)
Cordialement
Dès que le servo est mis sous tension le bruit apparait,
je n'ai pas essayer de changer les valeurs avec le attach car le servo ne bouge pas alors que si j'utilise l'ancien (celui de ma phase propo) tout fonctionne correctement.
Peut-être qu'il doit être piloté en microseconde.
Cordialement
#include <Servo.h>
// crée l’objet pour contrôler le servomoteur
Servo monservo;
// constantes ne change pas. Elles sont utilisées pour donner les pins:
const int BoutonD = 11; //le numéro de la pin du bouton départ
const int BoutonR = 10; //le numéro de la pin du bouton RAZ
const int LedF = 6; //le numéro de la pin de la Led fin de cycle
const int LedV = 3;//le numéro de la pin de la Led verte
const int LedJ = 2;//le numéro de la pin de la Led jaune
const int LedR = 7;//le numéro de la pin de la Led rouge
const int ReedV = 4;//le numéro de la pin du capteur REED vert
const int ReedJ = 5;//le numéro de la pin du capteur REED jaune
// les variables vont changées :
int etatBoutonD = 0;//état du bouton de départ
int etatBoutonR = 0;//état du bouton de RAZ
int etatReedV = 0;//état du capteur reed vert
int etatReedJ = 0;//état du capteur reed jaune
int pos = 0;//variable pour stocker la position du servomoteur
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void setup() {
Serial.begin(9600);
// initiliser les LEDs en tant que sortie :
pinMode(LedF, OUTPUT);
pinMode(LedV, OUTPUT);
pinMode(LedJ, OUTPUT);
pinMode(LedR, OUTPUT);
//initiliser les boutons en tant que entrer :
pinMode(BoutonD, INPUT);
pinMode(BoutonR, INPUT);
//capteur Reed en tant qu'entrer :
pinMode(ReedV, INPUT_PULLUP);
pinMode(ReedJ, INPUT_PULLUP);
//initialisation du servomoteur
monservo.attach(13); // utilise la broche 13 pour le contrôle du servomoteur
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void loop() {
//Contrôle du reed jaune avant cycle (détection capteur bloqué fermé)
{etatReedJ = digitalRead(ReedJ);
if (etatReedJ == LOW){
digitalWrite(LedR, HIGH);
}else{
digitalWrite(LedR, LOW);
}
}
//Contrôle du reed vert avant cycle (détection capteur bloqué fermé)
{etatReedV = digitalRead(ReedV);
if (etatReedV == LOW){
digitalWrite(LedR, HIGH);
}else{
digitalWrite(LedR, LOW);
}
}
//Lit la broche d'entrée du bouton départ
etatBoutonD = digitalRead(BoutonD);
//Si le bouton est HIGH alors...
if (etatBoutonD == HIGH){
//Demande au servo de se déplacer à ... puis attendre ...
for(pos = 0; pos < 135; pos+= 1);
{
monservo.write(pos);
delay(150);
}
//Contrôle du capteur reed vert, on lis la broche puis si elle est LOW alors on allume la Led verte sinon on éteind
{etatReedV = digitalRead(ReedV);
if (etatReedV == LOW){
digitalWrite(LedV, HIGH);
}else{
digitalWrite(LedV,LOW);
}
}
//Demande au servo de se déplacer à ... puis attendre ...
for(pos = 150; pos >=5; pos -=1)
{monservo.write(pos);
delay(10);
}
//Contrôle du capteur reed jaune, on lis la broche puis si elle est LOW alors on allume la Led verte sinon on éteind
{etatReedJ = digitalRead(ReedJ);
if (etatReedJ == LOW){
digitalWrite(LedJ, HIGH);
}else{
digitalWrite(LedJ, LOW);
}
}
//Demande au servo de se déplacer à ... puis attendre ...
monservo.write(80); // demande au servo de se déplacer à cette position
delay(100); // attend 1000 ms entre changement de position
//Allumer la led de fin de cycle
digitalWrite(LedF, HIGH); //Allumer la Led en fin de cycle
}
{// lire l'état du bouton RAZ
etatBoutonR = digitalRead(BoutonR);
//Si le bouton RAZ est HIGH alors éteind les leds
if (etatBoutonR == HIGH){
digitalWrite(LedF, LOW);
digitalWrite(LedV, LOW);
digitalWrite(LedJ,LOW);
}
}
}
Voici le programme mais il fonctionne très bien avec l'ancien servomoteur celui de test
Donc tu substitues le nouveau servo (qui fait du bruit) à l'ancien et celui-ci ne fait pas de bruit.
Si, avec le même Arduino, sur pin 13, même alimentation et même modèle de servo, le nouveau fait du bruit, c'est, peut-être qu'il n'est pas de la même qualité que le premier? Des servo "camelote" des fois font du bruit
Dans la bibliothèque la fonction ”commande en degré” fait la conversion angle vers microseconde et au final envoie des microsecondes.
Cela ne changera rien le servo reçoit déjà des microsecondes.
A cela j’ajoute que :
la conversion part du principe que le servo est un 180° alors qu’il existe aussi des servo 90 et 270 °. Si tu n’as pas un 180° il faudra faire une simple règle de 3.
que la bibliothèque répond a ”centaines normes” en terme de tmin et tmax qui ne sont pas les valeurs historiques que l’on trouve dans la littérature.
Les valeurs ”actuelles pour des S90” peuvent être obtenues en ouvrant les fichiers de la bibliothèque, je ne les connais pas par cœur.
Donc si ton servo est un S90 180° le plus simple est d’utiliser la commande en degré.
Essayez de changer la broche à laquelle les commandes sont envoyées au servomoteur. La broche peut être défectueuse, en plus une LED y est reliée.
Le programme est vraiment mal indenté.
Indentez-le avec le raccourci Ctrl-T et publiez une nouvelle version de votre code s'il a changé.
Un servomoteur est facile à utiliser, même pas besoin de bibliothèque pour ceci, vous pouvez programmer une fonction vous-même, en vous basant sur la datasheet de votre servomoteur.
Je pense que, soit tu demandes à ton servo de dépasser ses limites 0° a 180°, ou bien ton montage mecanique empeche et contraint ton servomoteur. Verifies bien que ton motage mécanique ne bloque pas ton servo tout simplement en deplacant l'axe de ton servo manuellement et ton servo non alimenté.
Ça va le cramer ! Un servomoteur c'est super fragile !
Engrenages qui s'entrechoquent. Y'a peut-être un axe cassé - celui du milieu : C'est le premier qui rend l'âme sur les miens généralement ( c'est aussi des SG90 ) - sur la photo c'en est pas un :
Bonjour
Je connais bien ces machins. Parfois ils marchent, c'est clairement du bas de gamme. J'ai fini par opter pour des engrenages en métal ou acheter du plus sérieux.
J'en ai reçu qui étaient bloqués, c'est-à-dire que même en les commandant via un programme fonctionnel, ils ne voulaient pas bouger.
Ne pas insister, il cramerait.
Débranche-le et essaie de le manipuler doucement à la main en ajoutant l'accessoire qui se visse sur l'axe. Comme mentionné, il se peut qu'il y ait un mauvais alignement des dents. Les SG90 tournent bien à la main normalement. Dès qu'il tourne à la main, refais un essai. Certains ne fonctionnent juste pas.
Salut
Normalement, non. J'ai déjà fait des essais 'pour voir si ça crame', ils restent dans la limite du possible; le potentiomètre qui est à l'intérieur limite leur rotation.
même si tu lui commandes de bouger de -100 à +2000, il reste dans la limite du potard.
Bonjour,
Je fais une petite mise à jour, le servomoteur a arrêté du jour au lendemain de faire du bruit mais maintenant il se met à tourner dans tous les sens de façon démoniaque .
Je vous redonne mon code :
#include <Servo.h>
// crée l’objet pour contrôler le servomoteur
Servo monservo;
// constantes ne change pas. Elles sont utilisées pour donner les pins:
const int BoutonD = 12; //le numéro de la pin du bouton départ
const int BoutonR = 10; //le numéro de la pin du bouton RAZ
const int LedF = 2; //le numéro de la pin de la Led fin de cycle
const int LedV = 6;//le numéro de la pin de la Led verte
const int LedJ = 7;//le numéro de la pin de la Led jaune
const int LedR = 3;//le numéro de la pin de la Led rouge
const int ReedV = 4;//le numéro de la pin du capteur REED vert
const int ReedJ = 5;//le numéro de la pin du capteur REED jaune
// les variables vont changées :
int etatBoutonD = 0;//état du bouton de départ
int etatBoutonR = 0;//état du bouton de RAZ
int etatReedV = 0;//état du capteur reed vert
int etatReedJ = 0;//état du capteur reed jaune
int pos = 0;//variable pour stocker la position du servomoteur
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void setup() {
Serial.begin(9600);
// initiliser les LEDs en tant que sortie :
pinMode(LedF, OUTPUT);
pinMode(LedV, OUTPUT);
pinMode(LedJ, OUTPUT);
pinMode(LedR, OUTPUT);
//initiliser les boutons en tant que entrer :
pinMode(BoutonD, INPUT);
pinMode(BoutonR, INPUT);
//capteur Reed en tant qu'entrer :
pinMode(ReedV, INPUT_PULLUP);
pinMode(ReedJ, INPUT_PULLUP);
//initialisation du servomoteur
monservo.attach(13); // utilise la broche 13 pour le contrôle du servomoteur
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void loop() {
//Contrôle du reed jaune avant cycle (détection capteur bloqué fermé)
{etatReedJ = digitalRead(ReedJ);
if (etatReedJ == LOW){
digitalWrite(LedR, HIGH);
}else{
digitalWrite(LedR, LOW);
}
}
//Contrôle du reed vert avant cycle (détection capteur bloqué fermé)
{etatReedV = digitalRead(ReedV);
if (etatReedV == LOW){
digitalWrite(LedR, HIGH);
}else{
digitalWrite(LedR, LOW);
}
}
//Lit la broche d'entrée du bouton départ
etatBoutonD = digitalRead(BoutonD);
//Si le bouton est HIGH alors...
if (etatBoutonD == HIGH){
//Demande au servo de se déplacer à ... puis attendre ...
for(pos = 0; pos < 135; pos+= 1);
{
monservo.write(pos);
delay(150);
}
//Contrôle du capteur reed vert, on lis la broche puis si elle est LOW alors on allume la Led verte sinon on éteind
{etatReedV = digitalRead(ReedV);
if (etatReedV == LOW){
digitalWrite(LedV, HIGH);
}else{
digitalWrite(LedV,LOW);
}
}
//Demande au servo de se déplacer à ... puis attendre ...
for(pos = 135; pos >=5; pos -=1)
{monservo.write(pos);
delay(10);
}
//Contrôle du capteur reed jaune, on lis la broche puis si elle est LOW alors on allume la Led verte sinon on éteind
{etatReedJ = digitalRead(ReedJ);
if (etatReedJ == LOW){
digitalWrite(LedJ, HIGH);
}else{
digitalWrite(LedJ, LOW);
}
}
//Demande au servo de se déplacer à ... puis attendre ...
monservo.write(80); // demande au servo de se déplacer à cette position
delay(100); // attend 1000 ms entre changement de position
//Allumer la led de fin de cycle
digitalWrite(LedF, HIGH); //Allumer la Led en fin de cycle
}
{// lire l'état du bouton RAZ
etatBoutonR = digitalRead(BoutonR);
//Si le bouton RAZ est HIGH alors éteind les leds
if (etatBoutonR == HIGH){
digitalWrite(LedF, LOW);
digitalWrite(LedV, LOW);
digitalWrite(LedJ,LOW);
}
}
}
Vers la fin il y a une petite liste de simulateurs Arduino/électronique, si cela peut t’intéresser...
Au plaisir de pouvoir t'aider
Amitiés
Pandaroux007