Vu que l'Arduino est opérationnel (voir l'article précédent), je réalise un petit montage de détection et chronométrage. Je vais utiliser une diode infrarouge et un phototransistor.
Sur le schéma suivant :
- En bas l'Arduino,
- En haut à droite, une diode IR et sa résistance de 220Ω alimentées par l'Arduino en 5V.
- En haut à gauche, un phototransistor et sa résistance de 1kΩ alimentés aussi par l'Arduino en 5V et avec une lecture sur l'entrée 3.
Pourquoi ces valeurs de résistances ?
- Pour celle de 220Ω, la loi d'Ohm me permet de calculer que si je veux 1,2V aux bornes de ma diode lorsqu'elle est traversée par un courant de 17mA, il faut ça. 5 - 1,2 = 3,8V 3,8 ÷ 0,017 ≈ 223Ω
- Pour celle de 1kΩ, c'est empirique. J'ai trouvé ce site qui propose une 2kΩ. Faisant à mon idée et n'ayant pas le courage d'en mettre deux en série, je place une résistance de 1kΩ. Coup de bol, ça fonctionne parfaitement. Après quelques essais ça fonctionne aussi avec du 560Ω et c'est tout juste avec du 220Ω. Avec des résistances plus faibles, la lecture ne dépassera pas 3V et donc l'entrée numérique ne sera pas lue comme haute. Et inversement pour des résistances trop fortes.
Pour le code, le but est de détecter s'il y a quelque chose ou rien devant le phototransistor et pendant combien de temps. J'ai trouvé deux solutions.
Pour la première, à chaque boucle je compare l'état de l'entrée à son état à la boucle précédente. Si ça a changé je l'indique sur le port série. En plus, je calcule la durée de chaque état.
const byte lecture = 3;
bool etat = 0;
bool etat_precedent = 0;
unsigned long temps = 0;
unsigned long instant = 0;
unsigned long instant_precedent = 0;
unsigned long duree = 0;
void setup() {
Serial.begin(9600);
pinMode(lecture, INPUT);
}
void loop() {
if ( millis() > temps ) {
temps += 5000;
Serial.println(temps/1000);
}
etat_precedent = etat;
etat = digitalRead(lecture);
if ( etat != etat_precedent ) {
instant_precedent = instant;
instant = millis();
duree = (instant - instant_precedent);
if ( etat == 0 ) {
Serial.println("Quelque chose");
Serial.println(duree);
} else {
Serial.println("Rien");
Serial.println(duree);
}
}
}
Pour le second, j'utilise des interruptions pour détecter les changements d'état du phototransistor.
const byte lecture = 3;
volatile byte tour = 0;
volatile byte detour = 0;
unsigned long temps = 0;
volatile byte evenement = 0;
volatile unsigned long instant_precedent = 0;
volatile unsigned long instant = 0;
unsigned long duree = 0;
void setup() {
Serial.begin(9600);
pinMode(lecture, INPUT);
attachInterrupt(digitalPinToInterrupt(3), es, CHANGE);
}
void loop() {
delay(500);
if ( evenement != 0 ) {
if ( evenement == 1 ) {
Serial.println("Quelque chose");
} else {
Serial.println("Rien");
}
evenement = 0;
duree = (instant - instant_precedent);
Serial.println(duree);
}
}
void es() {
instant_precedent = instant;
instant = millis();
if ( digitalRead(lecture) == 0 ) {
evenement = 1;
} else {
evenement = 2;
}
}
Voila les deux programmes fonctionnent. Je verrais par la suite si l'un des deux est préférable à l'autre.