[RESOLU] Multiple récepteur infrarouge 1838B

Bonjour amis Arduiniens, :smiley:

Je parviens sans difficultés à réceptionner l’infrarouge via la bibliothèque IRremote (code plus bas) lorsque j’utilise un récepteur infrarouge.

J’ai cependant besoin de réceptionner un signal infrarouge sur un ou plusieurs récepteur.
Pour deux raisons :

  • la première étant que la réception n’est pas prise à 360° sur le robot, donc j’aimerais en mettre 4, pour être certain que le signal infrarouge soit bein recu.
  • La seconde est que j’aimerais faire dans un deuxieme temps un tracking infrarouge (le robot se dirige vers le signal infrarouge).

Pour ce faire j’ai donc besoin de connecter plusieurs récepteurs infrarouge à ma carte, sachant que le signal peut être recu par un récepteur ou par plusieurs en même temps.

J’ai beau essayé avec la bibliothèque IRremote mais cela ne fonctionne pas, seul le récepteur Infrarouge4 recoit le signal, les autres ne recoivent rien. :’(
Avez vous une piste à me proposer ?

En vous remerciant pour votre aide. :-*

#include <IRremote.h> // Infrarouge
IRrecv Infrarouge1(Pin_Infrarouge1);
IRrecv Infrarouge2(Pin_Infrarouge2);
IRrecv Infrarouge3(Pin_Infrarouge3);
IRrecv Infrarouge4(Pin_Infrarouge4);
decode_results IR_results;

void setup() {
  Serial.begin(9600); // Usb
  Infrarouge1.enableIRIn();
  Infrarouge2.enableIRIn();
  Infrarouge3.enableIRIn();
  Infrarouge4.enableIRIn();
  pinMode(Pin_Infrarouge1, INPUT);
  pinMode(Pin_Infrarouge2, INPUT);
  pinMode(Pin_Infrarouge3, INPUT);
  pinMode(Pin_Infrarouge4, INPUT);
}

void loop() {
  if (Infrarouge1.decode(&IR_results)) {
    Serial.println("Infrarouge 1");
    Infrarouge1.resume();
  }
  if (Infrarouge2.decode(&IR_results)) {
    Serial.println("Infrarouge 2");
    Infrarouge2.resume();
  }
  if (Infrarouge3.decode(&IR_results)) {
    Serial.println("Infrarouge 3");
    Infrarouge3.resume();
  }
  if (Infrarouge4.decode(&IR_results)) {
    Serial.println("Infrarouge 4");
    Infrarouge4.resume();
  }
}

Que se passe t-il si tu changes l'ordre de tes if ?
Déplace par exemple le 4 avant le 1...

Bonjour Lesept,
Merci pour ton intervention,

Actuellement ce qu'il se passe :
Physiquement c'est Infrarouge4 qui détecte, si je le débranche et laisse les 3 autres, rien ne se passe. Donc c'est le seul a détecter. (je suppose que cela vient du faite que dans le code il est le dernier à être appelé et ca doit écraser les autres entrées).
Niveau retour, c'est le premier if qui me donne l'info :
if (Infrarouge1.decode(&IR_result)) {
Je suppose que IR_results est ok et que Infrarouge1 est considéré comme une entrée infrarouge, donc la librairie IRremote considère que le signal vient de là.

Tout ceci est supposition, mais clairement je pense que IRremote n'est pas adapté, ou je ne sais pas l'utiliser avec plusiueurs récepteurs. J'ai tenté de me passer de la librairie IRremote en codant des interupts sur les pin infrarouge, mais c'est tellement compliqué que j'ai laissé tombé.

Si je décale les if et passe Infrarouge3 dans le premier if, ca détecte avec if (Infrarouge3.decode(&IR_results)) {
Docn en faite, c'est juste parceque c'est le premier if trouvé, et non pas parcequ'il y a une correspondance sur le pin.

Il semble que le problème de lecture de plusieurs capteurs IR a été montré à l'auteur de la bibli IRRemote et qu'un fork a été créé pour le résoudre. Il a ensuite été intégré dans la version standard de la bibli (la version intermédiaire est ).

MAIS : quel que soit le nombre de récepteurs utilisés, ils doivent être lus en 50µs ou moins (50 microsecondes), ce qui limite le nombre de capteurs possibles en fonction de la vitesse du processeur utilisé.
Pour un UNO, ça limiterait à 2. Pour un teensy, ça monterait jusqu'à 5. Le nombre max de 5 est codé en dur quelque part dans la bibli.

Je n'ai rien trouvé d'autre sur le sujet pour l'instant.

Re, :wink:

Merci pour ta réponse et tes recherches.

Désolé mais j'ai un peu de mal à comprendre ce que tu dis.
D'après toi, si je regarde le lien du fork (c'est quoi un fork ??) je peux résoudre mon problème ?
Puis tu dis qu'il a été intégré à la version standard cela signifie que ma version (standard je pense) doit prendre ne compte le multi infrarouge ?

Pour ma part, j'ai une mega. le mieux serait 6 récepteur, mais si j'en met 4 ca sera suffisant pour tout ce que je veux faire. Je me pencherais sur la limitation plus tard (chaque chose en son temps :DD )

Merci encore,

Bon, j’ai compris,

Il faut modifier un peu le code, pour le moment ca ne focntionne pas.
Pour le moment, c’est exactement pareil qu’au début du topic, seul le récepteur 4 réceptionne et seul le premier if donen l’information.
Mais je pense que je suis sur la bonne voie, donc je ne devras pas trop tarder à trouver la solution.

Je poste le code ou j’en suis actuellement, et je reviendrais demain. Bonne soirée.

#include <IRremote.h> // Infrarouge
#define RECEIVERS 4
IRrecv *irrecvs[RECEIVERS];
decode_results IR_results;

void setup() {
  Serial.begin(9600); // Usb
  irrecvs[0] = new IRrecv(Pin_Infrarouge1);
  irrecvs[1] = new IRrecv(Pin_Infrarouge2); 
  irrecvs[2] = new IRrecv(Pin_Infrarouge3);
  irrecvs[3] = new IRrecv(Pin_Infrarouge4);
  for (int i = 0; i < RECEIVERS; i++){
    irrecvs[i]->enableIRIn();
  }
  pinMode(Pin_Infrarouge1, INPUT);
  pinMode(Pin_Infrarouge2, INPUT);
  pinMode(Pin_Infrarouge3, INPUT);
  pinMode(Pin_Infrarouge4, INPUT);
}

void loop() {
  for (int i = 0; i < RECEIVERS; i++){
    if (irrecvs[i]->decode(&IR_results)){
      Serial.print("Receiver #");
      Serial.print(i);
      Serial.print(":");
        FEcran("NULL", String(IR_results.value));
      Serial.println(IR_results.value, HEX);
      irrecvs[i]->resume();
    }
  }
}

Ok, donc j'ai réussi.

Merci pour ton aide Lesept, sans toi je n'y serais pas arrivé.
Il faut donc télécharger la librairie : GitHub - Neco777/Arduino-IRremote: Infrared remote library for Arduino: send and receive infrared.
Renommer le fichier en : irRemote,
Dedans il y a une seconde librairie à installer.

Et voila ca marche. Pas du toner de dieu, mais ca marche.

Pour ma part, j'ai 2 problèmes :
1/ Des conflis entre les différents IR, (la même info signalé sur plusieurs), cela est facile à résoudre, il suffit de faire un irrecvs*->resume(); sur l'ensemble des infrarouge, lorsque un signal est reçu.*
2/ Le signal est parfois réparti entre plusieurs récepteurs. Je suppose que 4 récepteur c'est un peu limite pour le processeur.
Pour résoudre ce problème, je vais tester avec 3 récepteurs : 2 a l'avant (pour créer mon tracking infrarouge) et un a l'arriere, ca me permettra d'avoir une large zone de réception. Je pense que avec seulement 3 récepteurs, ca devrait être plus précis.
Merci encore :wink:

Content d'avoir pu t'aider. Quand tu auras une version stabilisée, tu peux soit la poster ici soit faire un petit tuto dans la section ad-hoc. Ce permettra à ceux qui auraient le même besoin de s'inspirer de ton travail.

Bonne continuation !

slt j’ai bcp appris avec vous je rencontre actu le meme probleme donc stp est ce que tu peux m’envoyer le code pour que je puisse l’examiner stp
j’ai vraiment besoin de ca
et une dernière chose, tu as dit d’installer une autre librairie laquelle ?