Action simultanée

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

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 ?

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

Bonsoir Matapp04,

Karmaaaa Pour Alain, tu ma tué :slight_smile:

#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 :wink:

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.

Voilà c'est fait et ça marche nickel merci beaucoup ! :slight_smile: mais par contre la méthode pour indiquer le cycle du sens je ne vois pas du tout comment faire, pourrais tu m'expliquer ? :wink:

quelque chose dans ce genre ?

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

setup() {
...
}

loop() {
   motor.write(g);
   g+=sens;
   if(g>=180) sens=-1;
   if(g<=0) sens=1;
   ...
}