Arduino Forum

International => Français => Topic started by: Matapp04 on Nov 27, 2017, 10:19 pm

Title: Action simultanée
Post by: Matapp04 on Nov 27, 2017, 10:19 pm
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 
Title: Re: Action simultanée
Post by: Alain46 on Nov 28, 2017, 02:02 am
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 ?
Title: Re: Action simultanée
Post by: Matapp04 on Nov 28, 2017, 09:46 am
Mince j ai oublié de le mettre, je le mets ce soir sans pb  :)
Title: Re: Action simultanée
Post by: Col68 on Nov 28, 2017, 07:10 pm
Bonsoir Matapp04,

Karmaaaa Pour Alain,  tu ma tué :)
Title: Re: Action simultanée
Post by: Matapp04 on Nov 28, 2017, 10:03 pm
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 ;) 
Title: Re: Action simultanée
Post by: -Standby on Nov 28, 2017, 10:26 pm
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.

Title: Re: Action simultanée
Post by: Matapp04 on Nov 28, 2017, 11:00 pm
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 ?  ;)
Title: Re: Action simultanée
Post by: Alain46 on Nov 29, 2017, 12:18 am
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;
   ...
}