Bonsoir ! Je sollicite votre aide car je rencontre plusieurs problèmes dans mon projet . Je souhaite effectuer la rotation d'un servomoteur de plusieurs manières en fonction du bouton activé. Par exemple , si le bouton 1 est activé , le servomoteur effectuera une rotation(en partant de -90°) à - 30° puis ira à 0°, pour finir à 30° , et ensuite effectuer le chemin inverse , et ce tant que le bouton est activé . De plus , entre chaque changement de position , il faudrait avoir un temps de "pause" de 4s.Chaque bouton amènera à des rotations différentes .
Je ne suis qu'un débutant et ait pour l'instant le code suivant :
#include <Servo.h>
Servo myservo; // crée un "objet servo"
int pos = 0; // variable qui définit la position initiale du servo (=position de butée)
int button = 2;
int buttonb = 1;
void setup()
{
myservo.attach(9); // relie le servo sur la sortie 8
pinMode(pos, OUTPUT);
pinMode(button, INPUT);
pinMode(buttonb, INPUT);
}
void loop()
{
if (digitalRead(button) == HIGH)
{
for(pos = 0; pos < 180; pos += 1) // va de 0 à 180°
{ // par tranche de 1°
myservo.write(pos); // dit au servo d'aller à la position variable "pos"
delay(15); // attend 15ms pour aller à la position suivante
}
for(pos = 180; pos>=1; pos-=1) // va de 180 à 0°
{ // par tranche de 1°
myservo.write(pos); // dit au servo d'aller à la position variable "pos"
delay(15); // attend 15ms pour alelr à la position suivante
}
}
else
{
if(digitalRead(buttonb) == HIGH)
for (pos = 0; pos < 90; pos+=1)
{
myservo.write(pos);
delay(15);
}
J'ai bien conscience qu'ici , le code ne sert qu'à atteindre 90 ou 180° en fonction du bouton activé , mais je ne sais pas comment faire pour ajouter plusieurs positions à un seul bouton .J'ai essayé le simple
pos = 180;
myservo.write(pos);
delay(4000);
mais j'obtiens une erreur "stray/302"
De plus , je n'arrive pas à appliquer les 4s de pause entre chaque position (j'ai essayé de changer le delay , mais cela ne tourne pas )
Enfin , avec le code cité plus haut , lorsqu'aucun des boutons n'est activé , le servomoteur tourne quand même (il passe très rapidement de -90° à environ -40° , et ce en boucle)
Salut,
Il manque des parenthèses fermantes dans ton code à la fin ce qui peut expliquer la boucle quand aucun bouton n'est appuyé. Normalement tu ne pourrais pas le compiler. Je ne comprends pas ce que tu veux obtenir donc j'ai du mal à t'aider. Je te propose de d'abord écrire ce que tu veux obtenir en 'pseudo code' du genre :
si le bouton 1 est activé
tant que le bouton est activé
le servomoteur effectuera une rotation(en partant de -90°) à - 30°
temps de "pause" de 4s
puis ira à 0°, temps de "pause" de 4s
pour finir à 30° ,temps de "pause" de 4s
??? ensuite effectuer le chemin inverse ???
fin du tant que
fin du si
??? Donc là il y a un souci de compréhension ???
??? Chaque bouton amènera à des rotations différentes ???
Merci de ta réponse ! j'avais essayé de rajouter une parenthèse à la fin , mais cela ne fonctionne pas , impossible de compiler ...
Ok je vais écrire ce que je souhaite :
si le bouton 1 est activé
tant que le bouton est activé
le servomoteur effectuera une rotation(en partant de -90°) à - 30°
temps de "pause" de 4s
puis ira à 0°, temps de "pause" de 4s
pour finir à 30° ,temps de "pause" de 4s
effectue une rotation à 0° ,temps de pause de 4s //chemin inverse
effectue une rotation à -30° , temps de pause de 4s
effectue une rotation à 0° ,temps de pause de 4s //reviens à 0° , puis 30 , puis 0 puis -30 (tant que le bouton est activé
fin du tant que
fin du si
si le bouton 2 est activé
tant que le bouton 2 et activé
le servomoteur effectuera une rotation ( en partant de -90°) à 0° , temps de pause de 4s
puis ira à 90° , temps de pause de 4s
puis retourne à 0° , temps de pause de 4s
puis retourne à 90° , temps de pause de 4s (et ainsi de suite tant que le bouton est activé)
fin tant que
fin si
si le bouton 3 est activé .....
......
.......
Les angles à atteindre vont changer entre chaque bouton , comme entre le 1 et le 2 mais je ne les ait pas encore définis. De plus , le servomoteur ne doit plus retourner automatiquement à -90 après chaque rotation (il le fait avec mon code) , sauf si demandé (bouton 2)
De rien ici la régle c'est "aide toi le forum t'aidera" enfin si j'ai bien compris le principe
Donc chaque fois que tu fais un pas vers la description de ton projet tu recevra de l'aide en retour.
Alors je suis aussi plutôt débutant donc ce que je te propose n'est pas trop optimisé mais il faut bien commencer par qq chose. Si l'on ne prends que le premier cas du bouton 1 ensuite il sera facile de dupliquer le code pour le bouton 2 ...etc..
Par exemple on peut déjà simplifier
si le bouton 1 est activé
tant que le bouton est activé
routine_bouton1
fin du tant que
fin du si
Par
Tant que le bouton est activé
routine_bouton1()
Fin du tant que
#include <Servo.h>
Servo myservo; // crée un "objet servo"
int pos = 0; //variable qui définit la position initiale du servo (=position de butée)
int button2 = 2;
int button1 = 1;
void setup()
{
myservo.attach(9); // relie le servo sur la sortie 8
pinMode(pos, OUTPUT); // ???
pinMode(button1, INPUT);
pinMode(button2, INPUT);
//on oublie pas de démarrer la liaison série ;-) pour le debug
Serial.begin(9600);
}
void loop()
{
while (digitalRead(button1) == HIGH)
{
routine_bouton1(myservo);
}
while(digitalRead(button2) == HIGH)
{
routine_bouton2(myservo);
}
}
void routine_bouton1(Servo Theservo) {
int pos = 0;
for(pos = 0; pos < 180; pos += 1) // va de 0 à 180°
{ // par tranche de 1°
Theservo.write(pos); // dit au servo d'aller à la position variable "pos"
delay(15); // attend 15ms pour aller à la position suivante
}
for(pos = 180; pos>=1; pos-=1) // va de 180 à 0°
{ // par tranche de 1°
Theservo.write(pos); // dit au servo d'aller à la position variable "pos"
delay(15); // attend 15ms pour alelr à la position suivante
}
delay(4000); // Attente de 4 sec
}
void routine_bouton2(Servo Theservo) {
int pos = 0;
for(pos = 0; pos < 180; pos += 1) // va de 0 à 180°
{ // par tranche de 1°
Theservo.write(pos); // dit au servo d'aller à la position variable "pos"
delay(15); // attend 15ms pour aller à la position suivante
}
for(pos = 180; pos>=1; pos-=1) // va de 180 à 0°
{ // par tranche de 1°
Theservo.write(pos); // dit au servo d'aller à la position variable "pos"
delay(15); // attend 15ms pour alelr à la position suivante
}
delay(4000); // Attente de 4 sec
}
Mais ça c'est parce que on ne regarde que ce qui se passe quand on appuie sur un bouton . Cela peut poser un problème car la routine_bouton1 est bloquante à cause des temps de pause de 4secondes. Je ne sais pas si c'est un problème ou pas. Toi seul peux le dire, il faut alors faire la même analyse des états mais pour tous les boutons.
Re,
Comme je t'ai dit que je n'ai pas de servo j'ai pris le temps ce matin de bien lire le lien OpenClassroom cité plus haut. Ils disent là que le servo se déplace dés le lancement de la commande [i][color=green]servo.write(pos)[/color][/i] et se maintient seul dans la position indiqué ce qui permet de laisser le script arduino se dérouler pour faire autre chose. Voir l'exemple de la led.
Je me demande donc pourquoi tu utilise ces boucles ? Cela provoque un blocage supplémentaire de script.
for(pos = 0; pos < 180; pos += 1)
// Voir aussi la raison de cette ligne
pinMode(pos, OUTPUT); // ???
Si dessous le code d'OpenClassRoom
#include <Servo.h> //on importe la bibliothèque Servo
int pinServo=8; // variable pour stocker le pin pour la commande
Servo leServo; // on définit un objet Servo nommé leServo
void setup() {
leServo.attach(pinServo); // on relie l'objet au pin de commande
pinMode(13,OUTPUT); //pin 13 en mode OUTPUT
}
void loop() {
leServo.write(0); // on dit à l'objet de mettre le servo à 0°
diode13(); // appel de la fonction diode13() définie plus bas
leServo.write(179); // position à 179°, 180° est à éviter
diode13(); // appel de la fonction
}
void diode13(){
// on fait clignoter 30 fois la LED 13
for (int t=0;t<30;t++){
digitalWrite(13,HIGH);
delay(100);
digitalWrite(13,LOW);
delay(100);
}
}
Bonjour , désolé de répondre si tard , j'ai eu des examens .. J'ai réussi à faire un code , qui fonctionne parfaitement sur simulation .Le problème , c'est que quand je branche sur l'arduino , le servomoteur n'effectue que 2 ordres sur tous ceux proposés. Si je lui dit d'aller à 60 , puis 90 , puis 120° , celui ci n'ira qu'a 60 et 90° . Est-ce normal que le servomoteur n'effectue pas tous mes ordres ?( c'est un rs2) Je précise , le servomoteur est ici nommé "Shootrainer". Merci de votre aide !
#include <Servo.h>
Servo Shootrainer;
int boutonA = 1; // centre et coudes
int boutonB = 2; // centre et corners
int boutonC = 3; // corners
int boutonD = 4; // full
int boutonP = 5; //Dévérouillage du potentiomètre
int potpin = A0;
int val;
void setup() {
Shootrainer.attach(9);
pinMode(boutonA, INPUT);
pinMode(boutonB, INPUT);
pinMode(boutonC, INPUT);
pinMode(boutonD, INPUT);
pinMode(boutonP, INPUT);
}
void loop() {
if (digitalRead(boutonA+boutonB+boutonC+boutonD+boutonP) == LOW)
{
Shootrainer.write(90);
}
if (digitalRead(boutonA) == HIGH)
{
Shootrainer.write(60);
delay(1500);
Shootrainer.write(90);
delay(1500);
Shootrainer.write(120);
delay(1500);
Shootrainer.write(90);
delay(1500);
}
if (digitalRead(boutonB) == HIGH)
{
Shootrainer.write(0);
delay(1500);
Shootrainer.write(90);
delay(1500);
Shootrainer.write(180);
delay(1500);
Shootrainer.write(90);
delay(1500);
}
if (digitalRead(boutonC) == HIGH)
{
Shootrainer.write(0);
delay(1500);
Shootrainer.write(180);
delay(1500);
}
if (digitalRead(boutonD) == HIGH)
{
Shootrainer.write(0);
delay(1500);
Shootrainer.write(60);
delay(1500);
Shootrainer.write(90);
delay(1500);
Shootrainer.write(120);
delay(1500);
Shootrainer.write(180);
delay(1500);
Shootrainer.write(120);
delay(1500);
Shootrainer.write(90);
delay(1500);
Shootrainer.write(60);
delay(1500);
}
if (digitalRead(boutonP) == HIGH) //si le potentiomètre est dévérouillé
{
val=analogRead(potpin); //lit la valeur du potentiomètre
val=map(val,0,1023,0,180); //utilise la fonction "map" pour convertir l'analogique lu sur le potentiomètre de 0 à 1023 en degrés de 0 à 180
Shootrainer.write(val); //se rend à la position convertie
delay(500);
}
}