IrRemote et capteurs infrarouges

Bonjour,

J’ai un énorme problème. J’ai fait un code arduino pour mon TPE qui est associé à un piège à frelons.

Dans mon code, j’indique que si un frelon coupe un faisceau infrarouge, alors tout un mécanisme s’enclenche.

Mais voilà, ce code ne fonctionne pas du tout, car mon capteur ne recevant pas de rayons infrarouges en continu, mon mécanisme s’enclenche sans rien demander.
Mes capteurs infrarouges sont des TSOP, et donc mes leds envoient de l’infrarouge sous 38kHz.

Voici le code qui fonctionne de la même manière que celui de mon TPE

#include <IRremote.h>

int RECV_PIN = 11;
int led = 2;

IRrecv RECV1(11);

decode_results results;

void setup()

{

  pinMode(led, OUTPUT);

 RECV1.enableIRIn(); // Start the receiver
}

void loop() {

  if (!RECV1.decode(&results)) {
    digitalWrite(led, HIGH);
    else
    {
    RECV1.resume()
    }
  }

Seul les premières lignes sont intéressantes, à savoir la détection d’un frelon.

S’il-vous plaît pouvez-vous m’aider ?? Ce serait super gentil car là je ne sais plus quoi faire :’(

Merci d’avance.

bonjour,
si t'arrêtes pas de modifier ton post en virant ton premier code pour mettre un code exemple, comment veux tu qu'on aide?

de mémoire sur ton premier code avant ta modification avec tes 3 servos et 3 IR
tu peux mettre un flag par exemple et dans tes conditions
si faisceau 1 coupé==> compteur=1
si faisceau 2 coupé ET compteur 1 ===> compteur =2
etc....

Bonjour,

Oui je vois, mais le problème est que mon faisceau sera coupé même si rien ne le coupe, juste à cause du code.
En else, je reset les données qu'envoie mon récepteur ir, car sinon il ne saura pas si quelque chose le coupe.
Et là, mon récepteur ne recevant pas instantanément le rayon ir, il m'indique qu'il à été coupé.

C'est ça mon vrai problème

remets ton code original, sinon pas d'aide.
et indente le aussi

Re,

désolé j’étais en cours ^^’

#include <IRremote.h>
#include <Servo.h>

int pos = 0;                        // variable des degrès des servomoteurs

int recv1 = 0;                      // On itinialise les pins
int recv2 = 3;
int recv3 = 5;
int recv4 = 6;
 
Servo Mot1;                         // On initialise les Servomoteurs
Servo Mot2;
Servo Mot3;
Servo Mot4;

IRrecv RECV1(0);                    // On associe les pins initialisés aux récepteurs IR
IRrecv RECV2(1);
IRrecv RECV3(2);
IRrecv RECV4(3);

decode_results results;             // On démarre la réception IR

void setup()
{
  RECV1.enableIRIn();               // On démarre le récepteur
  RECV2.enableIRIn();
  RECV3.enableIRIn();
  RECV4.enableIRIn();

  Mot1.attach(2);                   // On associe les Servomoteurs aux pins
  Mot2.attach(4);
  Mot3.attach(7);
  Mot4.attach(8);
}

void loop()                         // Début du programme
{
  Mot1.write(50);                  // Porte d'entrée
  Mot2.write(50);                   // Porte latérale
  Mot3.write(0);                   // Porte du labirhynte 
  Mot4.write(0);                   // Porte de sortie
  


if (RECV3.decode(&results))        // On détecte que la bête est passée par le piège
{

if (!RECV2.decode(&results))        // On détecte que c'est un frelon
{

pos = 0;
for(pos = 0; pos < 50; pos += 1)   
{                                  // Fermeture de porte d'entrée
Mot1.write(pos);              
delay(15);                   
}

pos = 0;
for(pos = 0; pos < 50; pos += 1)   
{                                  // Ouverture de la porte du labirhynte
Mot3.write(pos);              
delay(15);                   
}


if (!RECV4.decode(&results))        // Le frelon est arrivé au bout du tunnel
{

pos = 0;
for(pos = 0; pos < 50; pos += 1)   // Ouverture de la porte de sortie
{                                  
Mot4.write(pos);              
delay(15);                       
}
 
delay(5000);                        // On attend que le frelon parte

for(pos = 50; pos>=1; pos-=1)  
{                                  
Mot4.write(pos);              
delay(15);                          // Fermeture de la porte de sortie
}

for(pos = 0; pos < 50; pos += 1)   // Ouverture de la porte d'entrée 
{                                  
Mot1.write(pos);              
delay(15);                       
}

  RECV1.resume(); 
  RECV2.resume();                   // Réinitialisation du piège
  RECV3.resume();
  RECV4.resume();
  
}                                   // Fin de la boucle IF RECV4
        
else{}                              // On attend que le frelon arrive au bout du tunnel.
         
}                                   // Fin de la boucle IF RECV2
      
else{                               // Ce n'est pas un frelon

pos = 0;
for(pos = 0; pos < 50; pos += 1)   
{                                 
Mot1.write(pos);                    // Fermeture de la porte d'entrée
delay(15);                   
}

pos = 0;
for(pos = 0; pos < 50; pos += 1)   // Ouverture de la porte latérale
{                                  
Mot2.write(pos);              
delay(15);                       
}                                   // Fin de boucle else

delay(5000);                        // On attend que la bête s'en aille, et on reset le piège.

for(pos = 50; pos>=1; pos-=1)      // Fermeture de la porte latérale
{                                  
Mot2.write(pos);              
delay(15);      
}
        
pos = 0;
for(pos = 0; pos < 50; pos += 1)   // Ouverture de la porte d'entrée
{                                  
Mot1.write(pos);              
delay(15); 
}

  RECV1.resume();
  RECV2.resume();                  // Réinitialisation du piège
  RECV3.resume();
  RECV4.resume();      
}                                  // Fin de boucle Else
}                                  // Fin de boucle IF RECV3
    else 
    {RECV3.resume();}              // On attend que la bête passe par le chemin

}                                  // Fin de programme

peux nous dire comment les émetteurs IR sont gérés ?
qui t'a orienté vers une lib "IRremote" qui est faite pour simuler ou recevoir des ordres d' une télécommande IR alors que si j'ai bien compris c'est seulement la coupure d'un faisceau IR que tu dois gerer ?

Salut;

faite pour simuler ou recevoir des ordres d' une télécommande IR alors que si j'ai bien compris c'est seulement la coupure d'un faisceau IR que tu dois gerer ?

Je me posait la même question.
Mais aussi comment sait tu que c'est un frelon ? Spectre infrarouge du frelon? Je ne pense pas !!

Il te faut travailler sur le principe de la barrière immatériels infra rouge mais vu la taille de la détection je te recommanderais de te renseigner sur une barrière lumineuse ou dit photo électrique.

En gros si le faisceau lumineux est coupé ton récepteur change d"état.
Voici a quoi je pense qui pourrais faire l'affaire qui n'est pas trop cher et facile a mettre en place.

Je ne connais pas la taille du frelon mais il devrais passer entre.

A plus !

Re bonjour,

Mon piège à frelons étant sous lumière ambiante, cela ne risquerait-il pas de perturber ce capteur ?
Sinon c'est ce que j'essaie de simuler, mais sous forme de deux faisceaux infrarouges, espacés de la taille d'un frelon, comme ça, si il coupe les deux, alors on sait que c'en est un.
Et la librairie IRremote est la seule lib que je connais pour gérer de l'infrarouge, mais oui si tu connais une lib pour juste savoir si le faisceau se coupe, je suis preneur :slight_smile:

Salut;

Mon piège à frelons étant sous lumière ambiante, cela ne risquerait-il pas de perturber ce capteur ?

Le capteur fonctionne avec une longueur d’onde lumineuse qui est émise par la “LED” émettrices.
La partie récepteur ne réagi que sur cette longueur d’onde lumineuse.

Donc tu ne devrais pas avoir de problème de lumière ambiante.

je regarde ton programme est je constate que tu utilise la broche 0.
Il est déconseillé de l’utiliser car elle est utile à la communication série et en parallèle avec le port USB.

Tu pourrais aussi déclarer tes variable de broches comme étant des constantes car ces le cas.
Une variable “const” permet de gagner de la place mémoire en définissant l’espace utile a une variable qui ne nécessite pas de changement d’état ou de données. (invariable).

Exemple => const int recev1 = 2; //Variable déclaré en constante son espace mémoire est défini (adapté) en fonction du contenu de sa donnée.

int recv1 = 0; <==PAS BON faut changer de broches // On itinialise les pins
int recv2 = 3; //Dans ce type de déclaration tu occupe de la place vide alloué et utiles en cas de changement de données. Ce qui n’est pas le cas d’une broche.
int recv3 = 5;
int recv4 = 6;

Re, bonsoir.

Oui en effet, mon programme peut être optimisé, mais la broche 0 dans la réalité n'est pas utilisée (le récepteur 1 n'existe pas en vrai).

De plus, ma vraie question est "Comment faire pour détecter que le faisceau ir que reçoit mon récepteur est coupé ?"

Mortufac:
Et la librairie IRremote est la seule lib que je connais pour gérer de l'infrarouge, mais oui si tu connais une lib pour juste savoir si le faisceau se coupe, je suis preneur :slight_smile:

il n'y a pas besoin de lib pour cela, le capteur a fourche est un collecteur ouvert que tu raccorde a une entrée digitale sur laquelle tu met en service le pull-up, l'entrée est a 0 en absence d'obstacle et a 1 si quelque chose coupe le faisceau

int recv1 = 2;                      // On itinialise les pins
int recv2 = 3;
int recv3 = 5;
int recv4 = 6;
 
Servo Mot1;                         // On initialise les Servomoteurs
Servo Mot2;
Servo Mot3;
Servo Mot4;

IRrecv RECV1(0);                    // On associe les pins initialisés aux récepteurs IR
IRrecv RECV2(1);
IRrecv RECV3(2);
IRrecv RECV4(recv4);//Plutôt comme ça. Si tu change de broche tu n'a plus qu'a changer dans la variable "recv4"

Ci dessus tu renseigne une donnée alors que tu as déclaré plus haut des variable utiles a cette effet.

IRrecv RECV2(recv2); // "recv2" représente 1 soit la broche une.
Si tu est amené a changer de broches tu vas devoir (ou risque) modifier de multiples lignes dans le setup et voir le programme principale.

A plus!

De plus, ma vraie question est "Comment faire pour détecter que le faisceau ir que reçoit mon récepteur est coupé ?"

A moins de transmettre un signal permanent et de contrôler l'absence de réception car le capteur TSOP si je ne me trompe n'est pas fait pour cette application.

Ce sont de photos diodes qu'il te faut si tu souhaites crée ton propre système de détection.

La TSOP n'est pas adapté pour de la détection mais plutôt pour la réception !!

A plus!

hello, une piste
tu es sur uno ou nano, une approche d'algorithme:
tes retours de fourches entrent sur les pins 2 et 3 qui sont des entrées interruptibles
tu "attach" deux fonctions aux entrées interruptibles appelées sur "falling"
dans la 1ere, tu fais si flag 2 == 1 alors flag 1=2 sinon flag 1 = 1
dans la 2ème, tu fais si flag 1 == 1 alors flag 2=2 sinon flag 2 = 1

dans ta loop, tu compares en permanence les flags
si flag 1 == 1 et flag 2 == 2 alors frelon entrant et appel de la fonction adaptée puis raz des flags
si flag 1 == 2 et flag 2 == 1 alors frelon sortant et appel de la fonction adaptée puis raz des flags

 Mot1.attach(2);                   // On associe les Servomoteurs aux pins
  Mot2.attach(4);
  Mot3.attach(7);
  Mot4.attach(servo4); //Plutôt comme ça "servo4" déclaré en const int servo4 = 8;

Idem pour les servomoteurs.

Mais a l'inverse tu devrais déclarer des variable de broches pour chaque servomoteurs.

Cela vas te donner plus de flexibilité de manipulation d'équipements.

A plus!

Bon si je comprends ce que tu veux faire...

C'est détecter un frelon en fonction de sa taille par l'activation de deux capteurs situés à une distance correspondant a la taille d'un frelon => ok.

Mais sans vouloir chercher la petite bête. Si un insecte plus grand passe par là il activera aussi les deux capteurs.
Ne faudrait il pas ajouter un capteur supplémentaire avant ou après d'une distance plus courte par rapport a la référence de taille frelon.
Cela te donnera une fourchette de détection resserré sur la taille du frelon => Un filtre.

A plus.

pos = 0; <= Tu peux supprimer cette ligne 
for(pos = 0; pos < 50; pos += 1)   
{                                  // Fermeture de porte d'entrée
Mot1.write(pos);             
delay(15);                   
}

Inutile de mettre la variable “pos” à 0 a chaque boucle for.
Elle est systématiquement initialisé a l’appel de la boucle.
De plus “pos” n’est utiliser que au sein de la boucle.

tu pouvais garder la forme “conventionnelle”. Plus facile a mettre en écriture.

for (int i = 0, i< 50, i++){  // i++ incrémente pour ouverture et  i-- décrémente pour fermeture
Mot1.write(i);             
delay(15);                   
}

Ce qui reviens a supprimer la variable “pos” du programme ou a t’en servir pour le positionnement de tes portes en la placent a la place de la donnée 50 de comparaison de boucle. Je constate que 50 est une constante de pilotage pour tes portes. Raison de plus.
Ce qui t’apporte de la flexibilité de pilotage de tes portes par le biais de ta seul variable “pos”.

A plus!

Si je reprends ton principe de détection de frelon avec l'activation de deux capteurs.Tu devra modifier ton programme.

if (RECV3.decode(&results))        // On détecte que la bête est passée par le piège
{

if (!RECV2.decode(&results))        // On détecte que c'est un frelon
{

En conditionnant l'ouverture de la porte du labyrinthe si les deux capteurs sont activés si non c'est l'ouverture de la portes latérale.

 //Exemple.
if (detect1 == HIGH && detect2 == HIGH){//Si les deux capteurs sont a un
  //Execution de la condition.
}

Re,
Merci bcp pour vos conseils :slight_smile:
Maintenant je sais quoi faire ^^