Go Down

Topic: Action simultanée  (Read 791 times) previous topic - next topic

Matapp04

Bonsoir à tous,

alors voilà, je fais actuellement un petit robot à 4 roues(4moteurs) que j'ai équipé d'un capteur ultrasons donc l'orientation est faite par un servo-moteur
Mon but est donc de faire tourner constamment ce servo-moteur de 0 à 180° et inversement durant le guidage du robot, or ayant utilisé une boucle pour le fonctionnement du servo moteur, pendant l'exécution de celle ci, il m'est impossible de guider le robot.
Auriez vous une idée ? Merci d'avance 

Alain46

Ton code est écrit trop petit. J'arrive pas à le lire.
Ah ben non, c'est normal. Ya pas de code.
Faut qu'on devine ?
Un programme qui se compile sans erreur n'est pas forcément un programme qui fonctionne.

Matapp04

Mince j ai oublié de le mettre, je le mets ce soir sans pb  :)

Col68

Bonsoir Matapp04,

Karmaaaa Pour Alain,  tu ma tué :)

Matapp04

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

Servo moteur ;
int mGauche = 5;
int mGHA = 6;
int mGHR = 7;

int mDroit = 10;
int mDRA = 9 ;
int mDRR = 8 ;

int ir = 12;
unsigned long data;
IRrecv receiver(ir);//
decode_results resultats;

int ledV = 2;
int ledR = 11;
int ledJD = 4;
int ledJG = 1;
int x = 0;
int g = 0;

void setup ()
{
  moteur.attach(3);
  moteur.write(90);
  receiver.enableIRIn();
  pinMode(mGauche, OUTPUT);
  pinMode(mDroit, OUTPUT);
  pinMode(mGHA, OUTPUT);
  pinMode(mGHR, OUTPUT);
  pinMode(mDRA, OUTPUT);
  pinMode(mDRR, OUTPUT);
  pinMode(ledR, OUTPUT);
  pinMode(ledV, OUTPUT);
  pinMode(ledJD, OUTPUT);
  pinMode(ledJG, OUTPUT);
  initLed();
}

void loop ()
{
  for (g ; g < 180; g++)
  {
    moteur.write(g);
    delay(10);
  }
  for (g; g > 0; g--)
  {
    moteur.write(g);
    delay(10);
  }
  if (receiver.decode(&resultats))
  {
    data = resultats.value;
    receiver.resume();
    delay(150);
    switch (data)
    {
      case 16736925 :
        go ();
        break;
      case 16754775 :
        back ();
        break;
      case 16761405 :
        right ();
        break;
      case 16720605 :
        left ();
        break;
      case 16712445 :
        stop ();
        break;
      case 16728765 :
        selfRotationLeft ();
        break ;
      case 16732845 :
        selfRotationRight ();
        break ;
    }
  }
}
void stop ()
{
  initLed();
  digitalWrite(mGauche, LOW);
  digitalWrite(mDroit, LOW);
  digitalWrite(mDRA, LOW);
  digitalWrite(mDRR, LOW);
  digitalWrite(mGHA, LOW);
  digitalWrite(mGHR, LOW);
  for (int y = 0; y < 5; y++)
  {
    clignLedTotal();
    delay(100);
  }

}
void go ()
{
  initLed();
  digitalWrite(mGauche, HIGH);
  digitalWrite(mDroit, HIGH);
  digitalWrite(mDRA, HIGH);
  digitalWrite(mDRR, LOW);
  digitalWrite(mGHA, HIGH);
  digitalWrite(mGHR, LOW);
  x = 1;
  if (x = 1)
  {
    digitalWrite(ledV, HIGH);
  }
}
void back ()
{
  initLed();
  digitalWrite(mGauche, HIGH);
  digitalWrite(mDroit, HIGH);
  digitalWrite(mDRA, LOW);
  digitalWrite(mDRR, HIGH);
  digitalWrite(mGHA, LOW);
  digitalWrite(mGHR, HIGH);
  x = 2;
  if (x = 2)
  {
    digitalWrite(ledR, HIGH);
    delay(100);
    digitalWrite(ledR, LOW);
  }
}
void left()
{
  initLed();
  digitalWrite(mGauche, LOW);
  digitalWrite(mDroit, HIGH);
  digitalWrite(mDRA, HIGH);
  digitalWrite(mDRR, LOW);
  digitalWrite(mGHA, LOW);
  digitalWrite(mGHR, LOW);
  x = 3;
  if (x = 3)
  {
    digitalWrite(ledJG, HIGH);
  }
}
void backLeft()
{
  initLed();
  digitalWrite(mGauche, LOW);
  digitalWrite(mDroit, HIGH);
  digitalWrite(mDRA, LOW);
  digitalWrite(mDRR, HIGH);
  digitalWrite(mGHA, LOW);
  digitalWrite(mGHR, LOW);
  x = 4;
  if (x = 4)
  {
    digitalWrite(ledJG, HIGH);
    digitalWrite(ledR, HIGH);
  }

}
void right ()
{
  initLed();
  digitalWrite(mGauche, HIGH);
  digitalWrite(mDroit, LOW);
  digitalWrite(mDRA, LOW);
  digitalWrite(mDRR, LOW);
  digitalWrite(mGHA, HIGH);
  digitalWrite(mGHR, LOW);
  x = 5;
  if (x = 5)
  {
    digitalWrite(ledJD, HIGH);
  }

}
void backRight ()
{
  initLed();
  digitalWrite(mGauche, HIGH);
  digitalWrite(mDroit, LOW);
  digitalWrite(mDRA, LOW);
  digitalWrite(mDRR, LOW);
  digitalWrite(mGHA, LOW);
  digitalWrite(mGHR, HIGH);
  x = 6;
  if (x = 6)
  {
    digitalWrite(ledR, HIGH);
    digitalWrite(ledJD, HIGH);
  }
}
void selfRotationLeft()
{
  initLed();
  digitalWrite(mGauche, HIGH);
  digitalWrite(mDroit, HIGH);
  digitalWrite(mDRA, HIGH);
  digitalWrite(mDRR, LOW);
  digitalWrite(mGHA, LOW);
  digitalWrite(mGHR, HIGH);
  x = 7;
  if (x = 7)
  {
    clignLedTotal();
  }
}
void selfRotationRight ()
{
  initLed();
  digitalWrite(mGauche, HIGH);
  digitalWrite(mDroit, HIGH);
  digitalWrite(mDRA, LOW);
  digitalWrite(mDRR, HIGH);
  digitalWrite(mGHA, HIGH);
  digitalWrite(mGHR, LOW);
  x = 8;
  if (x = 8)
  {
    clignLedTotal();
  }
}
void initLed()
{
  x = 0;
  digitalWrite(ledV, LOW);
  digitalWrite(ledJG, LOW);
  digitalWrite(ledJD, LOW);
  digitalWrite(ledR, LOW);
}
void clignLedTotal()
{
  digitalWrite(ledV, HIGH);
  digitalWrite(ledJG, HIGH);
  digitalWrite(ledJD, HIGH);
  digitalWrite(ledR, HIGH);
  delay(100);
  digitalWrite(ledV, LOW);
  digitalWrite(ledJG, LOW);
  digitalWrite(ledJD, LOW);
  digitalWrite(ledR, LOW);
}

Donc voilà , c'est mon code est les lignes qui m'intéressent pour ce sujet sont dans le setup, donc je répète, j'aimerais faire tourner constamment mon servo moteur de 0 à 180° et inversement tout en pouvant recevoir à tout moment, sans délai, les instructions de la télécommande infrarouge , or ici avec ce code il y a encore un temps d'attente, c'est à dire que les 2 instructions ne s'exécutent pas en parallèles, or c'est ce que je voudrais faire
Merci d'avance ;) 

-Standby

Bonsoir,

L'astuce c'est d'incrémenter la position du servomoteur de +1 degré à chaque rebouclage de ton programme.

Quand il arrive à +180 degrés tu le décrémentes de -1 degré et ainsi de suite, pour faciliter la programmation tu peux utiliser une variable qui indique le sens de rotation d'un cycle.

The Mind is like a parachute it works best when opened.

Matapp04

#6
Nov 28, 2017, 11:00 pm Last Edit: Nov 28, 2017, 11:08 pm by Matapp04
Voilà c'est fait et ça marche nickel merci beaucoup !  :) mais par contre la méthode pour indiquer le cycle du sens je ne vois pas du tout comment faire, pourrais tu m'expliquer ?  ;)

Alain46

#7
Nov 29, 2017, 12:18 am Last Edit: Nov 29, 2017, 12:19 am by Alain46
quelque chose dans ce genre ?
Code: [Select]

...
int g=90;
int sens = 1;

setup() {
...
}

loop() {
   motor.write(g);
   g+=sens;
   if(g>=180) sens=-1;
   if(g<=0) sens=1;
   ...
}
Un programme qui se compile sans erreur n'est pas forcément un programme qui fonctionne.

Go Up