[Help] Arduino Mémoire et Servo

Bonjour chers membres du forum,

Je cherche de l'aide car je voudrais créer un code qui:
Lorsque j'appuie sur un bouton poussoir, mon servomoteur commence à faire une série d'étape ( je voudrai qu'il fasse 50° vers le haut, 5s de dela, revenir à sa position initiale et encore 5s de délai)
Est ce possible ? Car j'imagine qu'il faut faire une sorte de mémoire. J'ai fait des tentatives de codes mais sans résultats.
Aidez moi svp c'est assez urgent :confused:
Merci D'avance!

Bonjour,

poste le code que tu as déjà créé (sans oublier de le mettre en balise code !!!)

Pour le code balise (et tant d'autres choses), voir : ici NB : la 2° intervention sur le topic donc n'hésite pas à tout lire

Mon petit doigt me dit que cela doit être pour un projet/ devoir ...

Pierre

Projet scolaire?

Merci beaucoup pour la vitesse de votre réponse ! C’est en effet pour un projet scolaire (Terminale S SI), je voudrais améliorer ma partie en leur proposant un code fonctionnel ^^.
Pour faire court, le servomoteur va avoir pour but d’actionner un doseur de bar, qui va verser une dose dans un verre.
Voila une de mes tentatives, désolé d’avance pour mon code, je suis niveau débutant débutant :slight_smile: J’ai tenté d’appeler un void dans le void loop, je ne suis pas sur que ce soit possible :confused:

#include <Servo.h>

Servo myservo;
const int bouton = 2;
int etatbouton;
int pos(0);

void setup()
{
myservo.attach(13) ;
pinMode(bouton, INPUT); 
etatbouton = HIGH; 
}

void Cocktail() 
{ 
  for(pos = 0; pos < 180; pos += 1)  // goes from 0 degrees to 180 degrees 
  {                                  // in steps of 1 degree 
    myservo.write(80);              // tell servo to go to position in variable 'pos' 
    delay(5000);                       // waits 15ms for the servo to reach the position 
  } 
  for(pos = 180; pos>=1; pos-=1)     // goes from 180 degrees to 0 degrees 
  {                                
    myservo.write(0);              // tell servo to go to position in variable 'pos' 
    delay(5000);                       // waits 15ms for the servo to reach the position 
  } 
}
void loop()

{
     etatbouton = digitalRead(bouton);    
     if(etatbouton == HIGH) 
    {  
      void Cocktail();           
    }
    else  
    {       
    }
}

Victor

J'ai tenté d'appeler un void dans le void loop, je ne suis pas sur que ce soit possible

      Cocktail();

au lieu de

      void Cocktail();

Ok Merci !
Et sinon mon code est bon ? :open_mouth:

dire :

J'ai tenté d'appeler un void dans le void loop

est une absurdité.
"void" veut dire "vide" et s'utilise dans une déclaration de fonction pour dire qu'elle ne renvoi rien ou qu'elle ne reçoit rien

void fonction_truc ( int machin)
{
}
veut dire que la fonction truc reçoit une variable de type integer et ne renvoi rien
Appel :
fonction_truc(machin);

int fonction_bidule(void)
{
}
veut dire que la fonction ne reçoit aucune variable mais qu'elle renvoi un integer
Appel :
int lecture;
lecture = fonction-bidule();

float fonction_schmilblic( int zut)
{
}
veut dire que la fonction reçoit un entier et renvoi un type float

Appel :
float reponse;
reponse = fonction_schmilblic(zut);

Pour les rudiments du C revoir ses cours et les compléter dès la réception du sujet (c'est à dire au mois de janvier) avec le site OpenClassRoom

soit tu veux ouvrir et fermer le plus rapidement possible et attendre 5 secondes entre chaque action,
soit tu veux ouvrir et fermer progressivement et attendre 5 secondes entre chaque action ???

Dans les 2 cas, ton programme n’est pas correct.

J’ai mis des commentaires dans le code ci-dessous, mais je ne fais pas le code à a place.

[code]
#include <Servo.h>

Servo myservo;
const int bouton = 2;
int etatbouton;
int pos(0);

void setup()
{
myservo.attach(13) ;
pinMode(bouton, INPUT);
etatbouton = HIGH;
}

void Cocktail()
{
  for(pos = 0; pos < 180; pos += 1)  // goes from 0 degrees to 180 degrees
  {                                  // in steps of 1 degree
    myservo.write(80);              // ici tu mets 80 ???? 
    delay(5000);                       // ici tu attends 5 secondes mais comme tu es dans ta boucle FOR{} tu vas attendre 180 fois 5 secondes :-(
  }
  for(pos = 180; pos>=1; pos-=1)     // goes from 180 degrees to 0 degrees
  {                               
    myservo.write(0);              // ici tu mets 0 ???
    delay(5000);                       // idem que ci-dessus 180 fois 5 secondes
  }
}
void loop()

{
     etatbouton = digitalRead(bouton);   
     if(etatbouton == HIGH)
    { 
      void Cocktail();           
    }
    else 
    {       
    }
}

[/code]

en attente de lire ton code modifié

Pierre

Merci pour vos réponses petrusfr et 68tjs !
Désolé 68tjs, j’ai vraiment du mal à comprendre ce que tu veux dire, quel type d’appel me convient pour mon code?
J’imagine que c’est que l’appel de: la fonction truc reçoit une variable de type integer et ne renvoi rien mais je ne suis pas sur.
petrusfr, merci j’ai compris le problème et je l’ai changé pour le délai, sinon, pour les positions du moteur, je met 80 finalement, et non 50. Du coup pour le premier mouvement, je lui demande de faire 80, puis revenir a la position 0, cela ne convient pas?
Voila mon code modifié:

#include <Servo.h>

Servo myservo;
const int bouton = 2;
int etatbouton;
int pos(0);

void setup()
{
myservo.attach(13) ;
pinMode(bouton, INPUT); 
etatbouton = HIGH; 
}

void Cocktail() 
{ 
  for(pos = 0; pos < 180; pos += 1)  
  {                                  
    myservo.write(80);                              
  }     
  delay(5000); 
  for(pos = 180; pos>=1; pos-=1)      
  {                                
    myservo.write(0);              
  } 
  delay(5000);                       
}
void loop()
{
     etatbouton = digitalRead(bouton);     
     if(etatbouton == HIGH) 
    {  
      int Cocktail();           
    }
    else  
    {       
    }
}
void Cocktail()
{
  for(pos = 0; pos < 180; pos += 1) 
  {                                 
    myservo.write(80);                             
  }     
  delay(5000);
  for(pos = 180; pos>=1; pos-=1)     
  {                               
    myservo.write(0);             
  }
  delay(5000);                       
}

ca ne sert à rien du tout, puisque tu ne te sers pas de pos
dans ce cas mieux vaut écrire

void Cocktail()
{
  for(pos = 0; pos <= 80; pos += 1) 
  {                                 
    myservo.write(pos);                             
  }     
  delay(5000);
  for(pos = 80; pos>=0; pos-=1)     
  {                               
    myservo.write(pos);             
  }
  delay(5000);                       
}

D’accord, je prend note merci beaucoup !

Du coup le code final ressemble a ça?

#include <Servo.h>

Servo myservo;
const int bouton = 2;
int etatbouton;
int pos(0);

void setup()
{
myservo.attach(13) ;
pinMode(bouton, INPUT); 
etatbouton = HIGH; 
}

void Cocktail()
{
  for(pos = 0; pos <= 80; pos += 1) 
  {                                 
    myservo.write(pos);                             
  }     
  delay(5000);
  for(pos = 80; pos>=0; pos-=1)     
  {                               
    myservo.write(pos);             
  }
  delay(5000);                       
}

void loop()
{
     etatbouton = digitalRead(bouton);     
     if(etatbouton == HIGH) 
    {  
      int Cocktail();           
    }
    else  
    {       
    }
}

Up

Bonjour,

Est ce que ton code fait ce que tu souhaites?
      int Cocktail();
C'est une déclaration.

Si tu veux appeler la fonction Coktail c'est:

     if(etatbouton == HIGH) 
    {  
      Cocktail();           
    }

infobarquee:

      Cocktail();

au lieu de

      void Cocktail();

pas faute de l'avoir signalé au début

Désolé infobarquee, j’avais pas compris le message de 68tjs…
Voila le code modifié ! Merci

#include <Servo.h>

Servo myservo;
const int bouton = 2;
int etatbouton;
int pos(0);

void setup()
{
myservo.attach(13) ;
pinMode(bouton, INPUT); 
etatbouton = HIGH; 
}

void Cocktail()
{
  for(pos = 0; pos <= 80; pos += 1) 
  {                                 
    myservo.write(pos);                             
  }     
  delay(5000);
  for(pos = 80; pos>=0; pos-=1)     
  {                               
    myservo.write(pos);             
  }
  delay(5000);                       
}

void loop()
{
     etatbouton = digitalRead(bouton);     
     if(etatbouton == HIGH) 
    {  
      Cocktail();           
    }
    else  
    {       
    }
}

Et alors, il fait ce que tu veux?

Bah en fait non, le truc c'est que je suis pas fort dans les branchement donc ça vient peut être de la...
Voilà mes branchements:

Il y a une pin du servo qui ne semble reliée à rien du tout.
Et on ne voit pas bien comment le switch est connecté.

Le pin du servo je ne sais pas ou le brancher, car si je le branche sur une borne +, il s'alimente et fais directement le mouvement demandé, sans attendre le signal du bouton, et il le fait en boucle. :confused:
Le switch est alimenté par l'intermédiaire d'une résistance, normalement ca marche car je l'ai testé pour allumer une led en utilisant ce branchement et ca a fonctionné