Mon Servo SG90 ne tourne pas rond !

Bonjours/soir il y a quelques jours j'ai fais l'acquisition d'un kit d'arduino, après avoir appris à faire clignoter des LED j'ai voulut faire fonctionné le petit servo SG90 fournit dans le kit.
Mais après des 3 heures d'essais rien à faire le servo ne bouge toujours pas.

Pourtant le montage est simple, le Marron avec Masse, le Rouge avec le +5V et le Orange avec le pin choisi.
J'ai vérifié et je possède bien la bibliothèque Servo, ma carte est une UNO R3.
J'ai essayé moult codes trouvé sur différents sites, des exemples d'arduino mais rien, le moteur bourdonne juste faiblement quand il est alimenté mais il reste immobile.

J’espère que vous pourrez m'éclairer.

Merci d'avance.

MasterJung

bonjour,
code?
photo du montage?
le mieux est de mettre une alim externe avec le servo, ca pompe.

Voici le montage : http://imgur.com/a/dMWuH

Et le code :

int periode=20000;
int pinServo=8;

void setup() {
pinMode(pinServo,OUTPUT);
digitalWrite(pinServo,LOW);
}

//boucle principale
void loop() {
for (int angle=0;angle<=180;angle+=20){
setAngle(angle);
}
}
void setAngle(int a){
int duree=map(a,0,179,1000,2000);
digitalWrite(pinServo,LOW);

for (int t=0;t<300;t++){
digitalWrite(pinServo,HIGH);
delayMicroseconds(duree);
digitalWrite(pinServo,LOW);
delayMicroseconds(periode-duree);
}
}

Le servo émet un petit bruit qui suis la période l’impulsion mais ne bouge pas.
J’ai essayé avec un alim externe et le résultat est malheureusement le même.

J'ose espérer que vous avez déjà corrigé cette erreur :

sur le schéma vous utilisez la sortie 2 et dans votre programme, c'est la 8 ! Ou alors, mes yeux ne valent vraiment plus rien.

Cordialement.

Pierre

Si je comprend bien tu veux créer un signal pwm en manuel?

const unsigned int _PERIODE=20000;
const unsigned char _PIN_SERVO=8;

void setup()
{
	pinMode(_PIN_SERVO,OUTPUT);
	digitalWrite(_PIN_SERVO,LOW);
}

//boucle principale
void loop()
{
	for (unsigned char angle=0;angle<=180;angle+=20)
	{
		setAngle(angle);
	}
}

void setAngle(unsigned char a)
{
	unsigned int duree=map(a,0,179,1000,2000);
	
	digitalWrite(_PIN_SERVO,LOW);
	
	for (unsigned int t=0;t<300;t++)
	{
		digitalWrite(_PIN_SERVO,HIGH);
		delayMicroseconds(duree);
		digitalWrite(_PIN_SERVO,LOW);
		delayMicroseconds(_PERIODE-duree);
	}
}

Ou bien tu veux créer des délais pour faire une “animation de servo”?
Dans tous les cas tu n’utilises pas la bibliothèque servo que tu as ajouté à ton projet.

Il faut faire un peu comme dans cet exemple: https://www.arduino.cc/en/Tutorial/Knob

Inclure:

#include <Servo.h>

Puis déclarer un objet de type Servo:

Servo myservo;

Lier le servo à une broche de ta carte arduino:

myservo.attach(9);

Puis envoyer une valeur à ton servo pour qu’il bouge à une position:

myservo.write(val);

Ou sinon t’as sur internet d’autres systèmes qu’arduino dans lequels tout cela est bien mieux foutu:

En fait, le problème vient de l’utilisation de delayMicrosecond() qui, selon la doc n’accepte pas une valeur > 16383.

Il faut donc remplacer cette instruction par :

    unsigned long t0 = micros();
    while (micros() < t0 + (periode - duree)) {}

et ça marchera tout seul.

NOTA : dans votre programme, vous restez (300/50) = 6 Secondes sur chaque pas.

Cordialement.

Pierre

Le pin est le 8 j'ai bien changé par rapport au montage :slight_smile:

Le but de mon projet est juste de faire fonctionner le servo, j'ai essayé plusieurs codes différents et aucuns ne fait bouger le servo d'un poil. C'est pour cela que j'ai créer ce post.

Merci pour la correction Pierre, j'ai remplacé mais rien a faire le servo bourdonne toujours mais ne bouge pas :frowning:

Si vous avez une idée de petit code qui serai censé le faire fonctionner n'hésitez pas j'essayerai

Merci pour vos Réponses

J’ai pris conscience de votre problème en le téléchargeant et en l’exécutant sur un UNO et en visualisant les signaux sur un oscillo. Avec votre programme, la période du signal était scotchée à 6.5 mS alors que le servo demande une période de 20 mS. Avec la modification que j’ai apportée, les signaux sont corrects ; la période est bien de 20 mS et le niveau haut varie bien, toutes les 6 secondes de 1 à 2 mS.

En conséquence, si cela ne fonctionne pas, le problème est sûrement matériel :

  • Alimentation trop faible : utiliser une alimentation extérieure,
  • Connexion des fils erronée,
  • Servo défectueux.
    Cordialement.

Pierre

J'ai vraiment tout essayé et malheureusement je pense que le servo est défectueux.

Merci pour t'être penché sur le problème Pierre

C'est normal que ça ne marche pas, dans ton code tu n'utilises pas la bibliothèque servo... ...que tu dis pourtant avoir ajouté à ton projet.

sylvainmahe:
C'est normal que ça ne marche pas, dans ton code tu n'utilises pas la bibliothèque servo... ...que tu dis pourtant avoir ajouté à ton projet.

Il peut toujours essayer avec la bibliothèque "servo". Pour autant, je ne pense pas que cela solutionne le problème car, s'il a intégré la modif suggérée, le signal est correct et donc cela devrait tourner.

Mais bon, faut quand même essayer.

Cordialement.

Pierre

Bonjour,

Si vous avez essayé de tourner à la main le servo, il est possible qu’une ou plusieurs dents d’un

engrenage à l’intérieur du servo soit brisée(s)…Si c’est le cas il est surement bon pour la poubelle!!

A moins que vous fassiez un petit miracle. J’en ai déjà sauvé un en refixant une de ces (très très)

petites dents sur l’engrenage en fondant le plastique de la dent avec un petit fer à souder, mais

croyez-moi ce n’est vraiment pas facile.

En passant mon SG90 fonctionne toujours!!!