Go Down

Topic: [résolu] Soucis 2 servos + 1 LED + 1 bouton (Read 1 time) previous topic - next topic

DevilFlash

May 31, 2013, 05:17 pm Last Edit: Jun 02, 2013, 11:54 am by DevilFlash Reason: 1
J'essaye de faire fonctionner un ensemble de 2 servos + 1 led + 1 bouton.

L'idée étant qu'en appuyant sur un bouton, ça éteint/allume une LED et fait fonctionner les deux servos en sens inverse.

Cependant, ça ne fonctionne pas. J'ai 1 servo TowerPro SG92R et 3 servos digitaux EMAX ES08D. Quand je lance le code avec le towerpro et 1 emax, le towerpro fonctionne sans soucis mais l'emax ne bouge pas d'un degré. Quand je branche 2 emax, soit l'un buzz et l'autre ne fait rien, soit aucun des deux ne réagit (en dehors du mouvement de l'un lors du branchement en USB).

Je vous joins deux images du montage ainsi que le code. Ais-je branché quelque chose au mauvais endroit? Y'a-t-il un problème dans le code? Dois-je acheter des servos analogiques?

J'ai essayé chaque servo à l'aide de sweep, ils fonctionnent. J'ai modifié sweep pour faire un balayage sur 2 servos simultanéement, ça fonctionne également. Je suis donc perplexe.

Un grand merci d'avance pour l'aide que vous pourriez m'apporter :)





Code: [Select]
#include <Servo.h>

Servo myservo; // create servo object to control a servo
Servo myservo1;

const int buttonPin = 2; // the pin that the pushbutton is attached to
const int ledPin = 5; // the pin that the LED is attached to

int buttonState = 0; // current state of the button
int lastButtonState = 0; // previous state of the button
int ledState = 0; // remember current led state
int pos = 0; // variable to store the servo positions
int pos1 = 180;

void setup()
{
myservo.attach(9); // attaches the servo on pin 9 to the servo object
myservo1.attach(10); // attaches the servo on pin 10 to the servo object
pinMode(buttonPin, INPUT); // initialize the button pin as a input
pinMode(ledPin, OUTPUT); // initialize the button pin as a output
}

void loop()
{
buttonState = digitalRead(buttonPin); // read the pushbutton input pin
if (buttonState != lastButtonState) // compare buttonState to previous state
{
if (buttonState == 1)
{
if(ledState == 1)
{
delay(30); ledState = 0;
for(pos = 0; pos <= 180; pos += 10) // goes from 0 degrees to 180 degrees
{ // in steps of 10 degrees
myservo.write(pos); // tell servo to go to position 'pos'
}
for(pos1 = 180; pos1 >= 0; pos1 -= 10) // goes from 180 degrees to 0 degrees
{ // in steps of 10 degrees
myservo1.write(pos1); // tell servo to go to position 'pos1'
}
delay(15); // waits 15ms for the servo to reach the position
}
else
{
delay(30); ledState = 1;
for(pos = 180; pos >= 0; pos -= 10) // goes from 180 degrees to 0 degrees
{
myservo.write(pos); // tell servo to go to position 'pos'
}
for(pos1 = 0; pos1 <= 180; pos1 += 10) // goes from 0 degrees to 180 degrees
{
myservo1.write(pos1); // tell servo to go to position 'pos1'
}
delay(1000);
}
}

lastButtonState = buttonState; // remember the current state of the button
}
// turns LED on if the ledState =1 or off if ledState = 0
digitalWrite(ledPin, ledState);
myservo.write(pos); // goes from 0 degrees to 180 degrees
myservo1.write(pos1); // goes from 180 degrees to 0 degrees

delay(20);
}

-Standby

Je te conseille d'utiliser une alimentation externe pour les servos pour voir ce que sa donne.

C'est simple prend des piles alcaline est branche les en série pour obtenir environ dans les 7~9v de manière a abaisser la tension avec un régulateur 5v "7805".
The Mind is like a parachute it works best when opened.

DevilFlash

J'ai tenté avec une alimentation de 6V pour les servos (en gardant l'USB pour alimenter l'arduino). Les servos fonctionnent sur du 4.8 à 6V donc pas de soucis de ce point de vue là.

J'ai gardé le GND de l'arduino branché, mis l'alim externe. Le bouton et LED continuent de fonctionner mais les servos restent immobiles.

Merci pour ta réponse en tout cas! :)


papybricol

Bonsoir,

Relie les 2 masses ensemble, celle de l 'Arduino, celle de l'alim externe.
...ils embarquèrent la logique, coupèrent les cordons, alors, libérés de leurs chaînes, une immensité s'ouvrait devant eux...

DevilFlash

C'est malheureusement déjà fait. Les GND (masse/négatif/...) de l'alim et de l'arduino sont reliés au breadboard tous les deux :(

zoroastre

#5
Jun 01, 2013, 08:36 pm Last Edit: Jun 01, 2013, 08:44 pm by zoroastre Reason: 1
Yep!

Pour ajouter de l'eau au moulin, je simplifierai le programme au strict nécessaire, sans le bouton et la led dans un premier temps.

Les remarques précedentes sont à prendre en compte, une alimentation pour la partie commande (arduino), une autre pour la partie puissance (servo) et gnd en commun.
J'opterai quand même pour une alimentation un peu plus puissante que 4 malheureuses piles de 1,5 volt pour piloter les servos. Celles-ci demande parfois des appels en intensité importante lors des phases de démarrage ou les changements de rotation des servos. Il faut compter parfois 1 ampère / servo.

Les servos digitaux ont d'ailleurs une consommation plus importante que les servos "analogiques" (Pwm) due essentiellement à la recherche de précision de position, donnée par le capteur interne.

En aparté, ces servos sont souvent plus chers et ont en définitive un interêt plus que relatif.

@+

Zoroastre.
Gné! ;)

DevilFlash

Au multimètre, j'ai quand même 5A pour les 4AA. Faudrait déjà monter à 2.5A par servo pour les voir fatiguer.

Pour le reste, j'ai alimenté l'arduino par l'USB et les servos par la batterie, tout fonctionne correctement (bouton, led) à part les servos. Et encore, quand je met le servo Tower Pro (à mon avis un analogique), celui-là fonctionne contrairement aux digitaux.

C'est à n'y plus rien comprendre :D

DevilFlash

Problème résolu!

Le soucis provenait des servos eux-même qui n'acceptaient des valeurs d'angles que de 5° à 170°. Du coup, ils refusaient de faire quoi que ce soit lorsque le code leur indiquait de se rendre en position 0 et 180.

Une petite modification du code m'a permis de prendre en compte ces limitations.

Merci à vous tous!

Go Up