Précision mesure barrière infrarouge

Bonjour, dans le cadre d’un projet pour détecter le passage d’un petit objet dans un tube, j’ai avec un Nano et ces capteurs pour faire une barrière infrarouge permettant de compter des petits objets passant dans un tube.

Cela fonctionne, mais la finesse de la détection semble moyenne, des objets passent, la détection se fait bien sur la carte réceptrice (Led), mais pas au niveau de mon code. J’ai l’impression que les objets passent trop vite;
Si quelqu’un a une piste pour mesurer autrement ou affiner la détection …
Le code utilise est celui-ci, trouve sur les forums :

/*[color=#2e8b57][/color]
  Barrière infrarouge avec Arduino[color=#2e8b57][/color]
  LED IR sur D3 (géré par librairie IRremote) + TSOP32138 -> D2[color=#2e8b57][/color]
  La LED13 de l'Arduino s'allume en cas de coupure du faisceau lumineux[color=#2e8b57][/color]
*/[color=#2e8b57][/color]
[color=#2e8b57][/color]
#include <IRremote.h>[color=#2e8b57][/color]
[color=#2e8b57][/color]
#define CAPTEUR 2 // récepteur IR -> D2[color=#2e8b57][/color]
#define LED_STATUT 13 // LED -> D13[color=#2e8b57][/color]
[color=#2e8b57][/color]
IRsend irsend; // déclaration de l'objet émetteur (pin D3 obligatoire)[color=#2e8b57][/color]
[color=#2e8b57][/color]
void setup()[color=#2e8b57][/color]
{[color=#2e8b57][/color]
  pinMode(CAPTEUR, INPUT);[color=#2e8b57][/color]
  pinMode(LED_STATUT, OUTPUT);[color=#2e8b57][/color]
 [color=#2e8b57][/color]
  irsend.enableIROut(38); // crée une sortie modulée à 38KHz[color=#2e8b57][/color]
  Serial.begin(9600);[color=#2e8b57][/color]
}[color=#2e8b57][/color]
[color=#2e8b57][/color]
void loop()[color=#2e8b57][/color]
{[color=#2e8b57][/color]
  irsend.mark(0); // envoi du signal pour une durée illimitée[color=#2e8b57][/color]
 [color=#2e8b57][/color]
  boolean mesure1 = digitalRead(CAPTEUR); // première mesure[color=#2e8b57][/color]
  delay(5);                               // délai[color=#2e8b57][/color]
  boolean mesure2 = digitalRead(CAPTEUR); // seconde mesure[color=#2e8b57][/color]
  boolean etat = mesure1 * mesure2;       // comparaison[color=#2e8b57][/color]
 [color=#2e8b57][/color]
  if (etat == HIGH) // si les deux lectures voient une coupure[color=#2e8b57][/color]
  {[color=#2e8b57][/color]
    digitalWrite(LED_STATUT, HIGH);[color=#2e8b57][/color]
    Serial.println("Coupure !");[color=#2e8b57][/color]
  }[color=#2e8b57][/color]
  else              // sinon[color=#2e8b57][/color]
  {[color=#2e8b57][/color]
    digitalWrite(LED_STATUT, LOW);[color=#2e8b57][/color]
    Serial.println("----------OK----------");[color=#2e8b57][/color]
  }[color=#2e8b57][/color]
  delay(5);[color=#2e8b57][/color]
}

vous faites une pause de 5ms entre 2 lectures. Si votre objet passe plus rapidement que cela dans la zone de détection de votre capteur, vous ratez

PS/ sur la lisibilité / cohérence des types dans le code:

  • ce n'est pas super "propre" de faire des multiplications entre booléens boolean etat = mesure1 * mesure2;utilisez && pour faire un ET logique.

  • de plus un booléen c'est vrai ou faux, pas HIGH ou LOW... donc ça ce n'est pas top non plus if (etat == HIGH)

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.