Servo instable

Bonjour à tous,

Je veut activer un appareil photo avec un servo.

Après l'appui sur un Bouton Poussoir, le servo atteint bien sa consigne d'arrivée (pendant 3sc), mais parfois, quand il revient pour ça position initiale, il la dépasse et revient pour atteindre sa consigne initiale.

ça doit être une bêtise.. Si quelqu'un à une idée, merci d'avance.

#include <Servo.h>

const int buttonPin = 2;     // the number of the pushbutton pin
const int ledPin =  13;      // the number of the LED pin
Servo myservo;  // create servo object to control a servo

// variables will change:
int buttonState = 0;         // variable for reading the pushbutton status

void setup() {
  // initialize the LED pin as an output:
  pinMode(ledPin, OUTPUT);
  // initialize the pushbutton pin as an input:
  pinMode(buttonPin, INPUT);
   myservo.attach(9);
}

void loop() 
{
 buttonState = digitalRead(buttonPin);

  if (buttonState == HIGH) 

  {  myservo.write(115);
     delay( 3000);
  }

if (buttonState == LOW) 
 
{delay(0);
}
 { myservo.write(20);
 delay( 20);
 }
 {
  // read the state of the pushbutton value:
  buttonState = digitalRead(buttonPin);

  // check if the pushbutton is pressed.
  // if it is, the buttonState is HIGH:
  if (buttonState == HIGH) {
    // turn LED on:
    digitalWrite(ledPin, HIGH);
  }
  else {
    // turn LED off:
    digitalWrite(ledPin, LOW);
  }
 
 }
  }

C'est quoi ce merdier? :slight_smile:

Bon, à priori ça fonctionne mieux comme ceci:

#include <Servo.h>

const unsigned char _BUTTON_PIN = 2;
const unsigned char _LED_PIN =  13;
Servo _myServo;

bool _buttonState = 0;

void setup()
{
	pinMode(_BUTTON_PIN, INPUT);
	pinMode(_LED_PIN, OUTPUT);
	_myServo.attach(9);
}

void loop()
{
	_buttonState = digitalRead(_BUTTON_PIN);
	
	if (_buttonState == HIGH)
	{
		_myServo.write(115);
		digitalWrite(_LED_PIN, HIGH);
		delay(3000);
	}
	else
	{
		_myServo.write(20);
		digitalWrite(_LED_PIN, LOW);
	}
}

Par la même occasion, tu as appris à indenter le code et à bien nommer les variables, mais ça c'est cadeau (tu n’auras pas à payer pour cette fois).

Nomenclature:

  • Toute variable déclarée avec une portée globale se voit précédée du caractère _
  • Toute constante = caractères en majuscule avec chaque mot séparé par le caractère _
  • Toute variable = caractères en minuscule sauf la 2ème (et+) lettre de chaque mot

Merci beaucoup pour la leçon.

En effet, c'était un peu le fouillis, ce sont des bouts de codes que j'ai copié collé assemblé.

J'ai essayé t'as version, ça fait toujours le même problème.

Au final, j'ai changé le servo et Ok.

Merci encore

bonjour,
certains servo sont défaillants mais en principe on les alimentes via une autre alim avec GND commune car ca pompe pas mal pour l'arduino.
sujet évoqué maintes fois sur le forum.

Tu peux nettoyer le potentiomètre du servo, histoire de ne pas le jeter à la poubelle pour rien :wink:

Au final, ça le fait avec le nouveau servo. Je vais essayer avec une alim externe

J'ai essayé avec une alim externe, toujours pareil. En fait, il revient en butée et ensuite à sa consigne de départ.

Une idée?

Ca le fait avec n'importe quel servo?

Ton servo est t'il gros? Ton alim externe délivre combien d'ampères?
Ta consigne pwm de 20 (20 microsecondes??) est t'elle bonne?
Quel est la fréquence de fonctionnement de ton servo? (50Hz, 100Hz, etc...)

C'est un tower pro 9G, l'alim c'est du 600 mA (7,2 VA).

Pour la PWM, je ne sais pas, je cherche.

Ok c'est donc un micro servo, à mon avis 600mA y a pas de soucis pour en alimenter plusieurs des servo comme cela...

Par contre 7.2V arrêtes parce que tu vas les cramer !
C'est 5V max.

Le servo sinon fonctionne bien avec un signal pwm de 50Hz (d'après le datasheet), 1000us de duty cycle signifie palonnier à fond dans un sens, et 2000us dans l'autre sens (pas en butée normalement).

Il faut que tu vérifies tout ça, la classe servo servo.h envoie un pwm 50Hz ?

J'alimente la carte à 7,5V (j'ai lu que on pouvait alimenter entre 7V et 20V). Quand j'alimente à 5V, ça ne fonctionne pas bien.

#define MIN_PULSE_WIDTH 544 // the shortest pulse sent to a servo
#define MAX_PULSE_WIDTH 2400 // the longest pulse sent to a servo

Pour le 50Hz, je n'ai pas trouvé

Ah ok j'avais pas compris, tu alimentes en 7.5V une carte arduino uno équipée d'un régulateur qui t'abaisse ça à 5V.

Par contre du coup tes 600mA vont sûrement chuter... ...mais pour un micro servo ça me semble largement suffisant, c'est ça qui est bizarre dans ton soucis.

Et ce qui est bizarre, c'est que ça ne le fait pas tout le temps

sylvainmahe:
Ah ok j'avais pas compris, tu alimentes en 7.5V une carte arduino uno équipée d'un régulateur qui t'abaisse ça à 5V.

Par contre du coup tes 600mA vont sûrement chuter... ...mais pour un micro servo ça me semble largement suffisant, c'est ça qui est bizarre dans ton soucis.

Pour avoir joué avec ces mêmes servos et une Uno, le régulateur ne l'étale pas, il est poussé dans ses retranchements. On a l'impression que ça marche mais quand même le servo a de drôle de comportement. Il faut donc passer par une alim externe pour le servo.

Jambe, tu veux dire qu'il faut une alimentation pour le servo, différente de la carte?

deud:
Jambe, tu veux dire qu'il faut une alimentation pour le servo, différente de la carte?

oui avec le GND en commun

infobarquee:
bonjour,
certains servo sont défaillants mais en principe on les alimentes via une autre alim avec GND commune car ca pompe pas mal pour l'arduino.
sujet évoqué maintes fois sur le forum.

Merci infobarquee, j'avais compris qu'il fallait juste une alim pour la carte arduino autre que l'alimentation par USB.

Je vais essayer avec 2 alims différentes.

Ce qui est ouf c'est que moi je fais fonctionner quand même 2 servos standard digitaux (haute vitesse/précision) sans soucis avec mon port usb...

C'est un principe général :
Quand dans un montage il y a des composants de puissance, c'est à dire qui consomment, on sépare les alimentations :
Une alim est réservée aux circuits commande (ex le microcontrôleur, RTC, etc). Ces composants doivent avoir une alimentation parfaitement stable et PROPRE.
Une ou plusieurs alim réservées à la puissance (moteurs, relais, émetteurs RF, etc).

Et bien entendu ces alimentations doivent OBLIGATOIREMENT avoir un point commun sinon cela ne peut pas fonctionner.
Comme la masse de la carte arduino est au 0V il faut relier tous les 0V entre eux.

Seule exception au 0V commun : quand on n'utilise pas des élecrons pour transmettre une information mais un fluide :

  • Cas du transformateur (obsolète maintenant) : transfert par fluide magnétique
  • Cas de l'opto-coupleur (courant actuellement) : transfert par fluide optique (photons)

Dans tout les cas par fil il faut les 0V commun sinon les électrons ne peuvent pas circuler.

@sylvainmahe
Compare les caractéristiques de la carte arduino et celle de la grosse alim 5V de ton PC.
Celle de ton PC est munie d'énormes ventilateurs de refroidisseurs, de filtrage Inductances/Condensateurs et peut délivrer des dizaines d'ampères.
Ce n'est pas le cas du pauvre SOT223 de la carte arduino.

Servo digitaux : seule la commande est digitale, il y a quand même à l'intérieur un moteur à courant continu et un asservissement de position : que de l'analogique.

68tjs je comprend, mais normalement un port usb n'est donné que pour fournir dans les 500mAh max, même si derrière il y a des grosses alim.

Pour les servos analogiques/digitaux, non, la commande est la même, c'est à dire un pwm, c'est analogique au final (modulation de la largeur d'impulsion), par contre, la ou sa change c'est dans le servo. Potentiomètre numérique (roue codeuse) / système d'asservissement numérique pour une plus grande rapidité et précision du palonnier. Certains ont un petit moteur sans charbons également.

Donc ce que je voulais dire par la c'est que les servos digitaux en général consomment légèrement plus qu'un servo classique, de part le fait qu'ils sont plus performants en terme de puissance et rapidité.

Autre chose que je voulais signaler aussi, c'est que quand tu alimentes ta carte arduino par l'usb, le régulateur de tension interne à l'arduino (SOT223 ou autre) n'est pas utilisé (ou alors j'ai rien compris). C'est le 5V/500mAh du port usb qui alimente directement tout. Le régulateur lui est laissé en l'air.

Exactement comme avec ma carte quand je l'alimente en passant par l'usbasp:
http://sylvainmahe.xyz/photo/dsc02460.jpg
Le LM7805 sur la carte ne sert plus à rien, c'est le port usb qui alimente.