DfRobot et irremote dysfonctionnement

Bonjour à tous,

J’expérimente actuellement une carte DFROBOT ROMEO V2 R3.
J’ai un souci avec la librairie IrRemote.

Dés que j’active cette ligne :

// Capteur infra rouge
irrecv.enableIRIn(); // Start the receiver

le moteur droit de mon robot ne tourne plus.
par contre, tout le traitement de capture de ma télécommande fonctionne et le robot tourne en rond …

Ci-joint le code (fonctionnel sans la télécommande)

// ----------------------------------------------------
// Pilotage DfRobot Version 1.0
// Démarrage Robot avec télécommande Bt Marche / Arret
// Avant sur bouton 2
// Arriere sur Bouton 8
// Gauche bouton 4
// Droite Bouton 6
// Neutral Bouton 5
// ----------------------------------------------------
// include the library code:
#include <IRremote.h>

//Standard PWM DC control
int E1 = 5;     //M1 Speed Control
int E2 = 6;     //M2 Speed Control
int M1 = 4;    //M1 Direction Control
int M2 = 7;    //M1 Direction Control

// Capteur de distance
int duration;                   //Stores duration of pulse in
int distance;                   // Stores distance
int srf05pin = 8;             // Pin for SRF05

// Initialisation port Infrarouge 
int valinfradec;
const int Infra = 11;

// initialisation des touches du shield (futur)
const int touche=0;         // Touche du clavier carte

// constant des capteurs de lumière
const int lumdroit=2;
const int lumgauche=3;

// port infra rouge
IRrecv irrecv(Infra);

// Sorties diverses
const int Led = 13;

// Variables diverses
boolean valled=HIGH;
boolean bEnfonction;
int valtouche;
unsigned long RefTimeDistance;
unsigned long RefTimeLumiere;
unsigned long RefTimeClignote;
int valdroit;
int valgauche;
int sav_valdroit;
int sav_valgauche;
int sens;                         // 0 Avant, 1 Arriere
int gauchedroite;            // 0 à gauche, 1 à droite

// décodage données infra rouge
decode_results results;

// -------------------
// Fonction SETUP
// -------------------
void setup(void) 
{ 
  // Initialialisation des ports Moteurs 
  int i;
  for(i=4;i<=7;i++)
    pinMode(i, OUTPUT);  
    
  // Monitoring sur port serie
  Serial.begin(19200);
  
  // Capteur infra rouge
  //irrecv.enableIRIn();         // Start the receiver (si actif, plus de moteur droit)
  
  // Initialisation port entrée lumière
  pinMode(lumdroit,INPUT);
  pinMode(lumgauche,INPUT);
  
  // Initialisation valeurs sauvegardes lumière
  sav_valdroit=1023;
  sav_valgauche=1023;
  
  // Initialisation du générateur de nombre aleatoire
  randomSeed(analogRead(0));
  
} 

// ------------------
// Boucle principale
// -----------------
void loop(void) 
{ 
  // Traitement capteur de distance (SRF05)
  if (TraiteDistance()) 
  {
    Bouge();
    return;
  }

  // Traitement capteur de lumiere
  if (millis()-RefTimeLumiere>200)
  {
    if (TraiteLumiere())
    {
      Bouge();
      return;
    }
  }
  
  // Traitement des touches de la carte
  TraiteTouche();
  
   // Traitement entrées télécommande
  TraiteTeleco();
  
  // clignotement de la led temoin
  if (millis()-RefTimeClignote>200 and bEnfonction!=true) 
  {
  clignote();
  }
  
  // Mise en mouvement du Robot si pas d'obstacle (distance ou lumière) rencontrés
  Bouge();
}

// ------------------------------------
// Fonction d'avance / recule du Robot 
// ------------------------------------
void Bouge()
{
  // on met le robot en mouvement en fonction du sens
  switch (sens) 
  {
    case 0:    // Avant
    Avant(150,150);
    break;
    
    case 1:    // Arriere
    Arriere(100,100);
    break;
  }
}

// ---------------------------------------------
// Fonction de traitement du capteur de distance
// Renvoie Vrai si passage en marche arriere
// ---------------------------------------------
boolean TraiteDistance()
{
  
// Mesure de la distance
  pinMode(srf05pin, OUTPUT);
  digitalWrite(srf05pin, LOW);           // Make sure pin is low before sending a short high to trigger ranging
  delayMicroseconds(2);
  digitalWrite(srf05pin, HIGH);          // Send a short 10 microsecond high burst on pin to start ranging
  delayMicroseconds(10);
  digitalWrite(srf05pin, LOW);           // Send pin low again before waiting for pulse back in
  pinMode(srf05pin, INPUT);
  duration = pulseIn(srf05pin, HIGH);    // Reads echo pulse in from SRF05 in micro seconds
  distance = duration/58;                // Dividing this by 58 gives us a distance in cm
 
 if (distance!=0)
 {
  if (distance<20)
  {
    // Si on était en marche avant, 
    if (sens==0)
    {
      // Avant de faire marche arriere, on tourne aléatoirement le robot
      gauchedroite=random(0,2);
      switch (gauchedroite) 
      {
        case 0:    // à gauche
        Agauche(100,100); delay(100);
        break;
        
        case 1:    // à droite
        Adroite(100,100); delay(100);
        break;
      }
      
      sens=1;                              // Le prochain mouvement est en marche arriere
    }
    return 1;
  }
  else
  {
    sens=0;                              // Le prochain mouvement est en marche avant
    return 0;
  }
 }
}

// ----------------------------------------------
// Fonction de traitement des capteurs de lumiere
// 
// ----------------------------------------------
boolean TraiteLumiere()
{
  
  // Référentiel de temps 
  RefTimeLumiere=millis();
  
  valdroit=map(analogRead(lumdroit),0, 1023, 0, 5); 
  valgauche=map(analogRead(lumgauche),0, 1023, 0, 5); 
  
  // monitoring
  Serial.print("Droite ");
  Serial.print(valdroit);
  Serial.print(" Gauche "); 
  Serial.println(valgauche);
  
  // Si la lumiere est décroissante sur les 2 capteurs, 
  // On recule ...
  if (valdroit<sav_valdroit)
  {
    if (valgauche<sav_valgauche)
    {
      sens=1;
      // On conserve les dernières valeurs 
      sav_valdroit=valdroit;
      sav_valgauche=valgauche;
      return 1;
    }
  }
  
  // Sinon, on va vers la lumiere
  if (valdroit<valgauche) Adroite(100,100); delay(5);
  if (valgauche<valdroit) Agauche(100,100); delay(5);
  
  
  // On conserve les dernières valeurs 
   sav_valdroit=valdroit;
   sav_valgauche=valgauche;
   sens=0;
   return 0;
}

// --------------
// Fonction Stop
// --------------
void stop(void)                    //Stop
{
  digitalWrite(E1,LOW);   
  digitalWrite(E2,LOW);      
}   

// ---------------------
// Fonction Marche Avant
// ---------------------
void Avant(char a,char b)              //Marche Avant
{
  analogWrite (E1,a);                  //PWM Speed Control
  digitalWrite(M1,HIGH);    
  analogWrite (E2,b);    
  digitalWrite(M2,HIGH);
}  

// ------------------------
// Fonction Marche Arriere
// ------------------------
void Arriere (char a,char b)          //Marche arriere
{
  analogWrite (E1,a);
  digitalWrite(M1,LOW);   
  analogWrite (E2,b);    
  digitalWrite(M2,LOW);
}

// -------------------------
// Fonction Tourne à Gauche
// -------------------------
void Agauche (char a,char b)             //A gauche
{
  analogWrite (E1,a);
  digitalWrite(M1,LOW);    
  analogWrite (E2,b);    
  digitalWrite(M2,HIGH);
}

// -------------------------
// Fonction Tourne à droite
// -------------------------
void Adroite (char a,char b)             //A droite
{
  analogWrite (E1,a);
  digitalWrite(M1,HIGH);    
  analogWrite (E2,b);    
  digitalWrite(M2,LOW);
}

// ---------------------
// Fonction clignotement 
// ---------------------
void clignote()
{
  RefTimeClignote=millis();
  valled=!valled;
  digitalWrite(Led,valled);
}

// -----------------------------
// Fonction TraiteTouche (Carte)
// -----------------------------
void TraiteTouche()
{
  valtouche=analogRead(touche);
 // if (valtouche!=1023) Serial.println(valtouche);
  switch (valtouche) 
  {
    case 0:    // S1
    break;
    case 143:  // S2
    break;
    case 328:  // S3
    break;
    case 502:  // S4
    break;
    case 740:  // S5
    break;
  }
}

// --------------------------------
// Fonction traitement telecommande
// --------------------------------
void TraiteTeleco()
{
  if (irrecv.decode(&results)) 
  {
   valinfradec=results.value, DEC;
   Serial.println(valinfradec);
   switch (valinfradec) 
   {
     case -23971:            // Arret depart programme
      bEnfonction=!bEnfonction;
      digitalWrite(Led,bEnfonction);
      if (bEnfonction!=true) stop();
      break;
     
     case 6375:              // Touche 2 (Avant)
      if (bEnfonction==true) Avant(255,255);
      break;
     
     case 4335:              // Touche 4 (à Gauche)
      if (bEnfonction==true) Agauche(100,100);
      break;
       
     case 23205:             // Touche 6 (à Droite)
      if (bEnfonction==true) Adroite(100,100);
      break;

     case 16730805:          // Touche 8 (Arrière)
      if (bEnfonction==true) Arriere(255,255);
      break;
   }
  
   // Resume  
   irrecv.resume(); // Receive the next value
  }
}

Moderator edit:
</mark> <mark>[code]</mark> <mark>

</mark> <mark>[/code]</mark> <mark>
tags added.

The IrRemote library stops PWM on some pins. Could that be your problem ?

thank's for response,
can'y change my pins for the motor on my DfROBOT ?
y don't find the way ...

The IrRemote library stops PWM on some pins.

I know from experience that pin3 loses its PWM-ability...

So, y don't use pin 3 in my code ...

Bonjour @parangoneo

  • j'ai le même problème... avez-vous trouvé une solution pour commander un Romeo avec télécommande?

For English speakers: does anyone else know a way to bypass this issue (motor M2 not working when using IR remote control)?