Go Down

Topic: [Help] Arduino Mémoire et Servo (Read 1 time) previous topic - next topic

VictorGalere

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 :/
Merci D'avance!

petrusfr

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

bilbo83


VictorGalere

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 :) J'ai tenté d'appeler un void dans le void loop, je ne suis pas sur que ce soit possible :/
Code: [Select]
#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

infobarquee

Quote
J'ai tenté d'appeler un void dans le void loop, je ne suis pas sur que ce soit possible
Code: [Select]
      Cocktail();           
au lieu de
Code: [Select]
      void Cocktail();           
AUCUNE AIDE PAR MP

VictorGalere

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

68tjs

#6
Apr 30, 2016, 09:14 pm Last Edit: Apr 30, 2016, 09:15 pm by 68tjs
dire :
Quote
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

petrusfr

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: [Select]
[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

VictorGalere

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é:
Code: [Select]
#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 
    {       
    }
}

infobarquee

Code: [Select]
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
Code: [Select]
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);                       
}
AUCUNE AIDE PAR MP

VictorGalere

D'accord, je prend note merci beaucoup !

VictorGalere

Du coup le code final ressemble a ça?
Code: [Select]
#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 
    {       
    }
}


kamill

#13
May 02, 2016, 12:03 pm Last Edit: May 02, 2016, 12:05 pm by kamill
Bonjour,

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

Si tu veux appeler la fonction Coktail c'est:
Code: [Select]
     if(etatbouton == HIGH)
    { 
      Cocktail();           
    }

infobarquee

Code: [Select]
      Cocktail();           
au lieu de
Code: [Select]
      void Cocktail();           
pas faute de l'avoir signalé au début
AUCUNE AIDE PAR MP

Go Up