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:
[code] [/code] tags added.