Télécommande et récepteur infrarouge associée à un Arduino commandée ce jour.
Description :
Ce kit Arduino infrarouge se compose d'une télécommande infrarouge ultra-mince et d'un module récepteur infrarouge. Avec 20 touches de fonction, elle est efficace jusqu'à 8 mètres ce qui sera idéal pour le traitement d'une variété d'équipements sur nos maquettes.
Spécifications :
Distance de transmission: jusqu'à 8m (en fonction de l'environnement, de la sensibilité du récepteur, etc.)
Batterie: CR2025 pile bouton
Capacité de la batterie: 160mAh
Angle effectif: 60 °
Durée de vie effective: 20.000 appuis
Objectif du projet
Nous voulons que le passage d’un train en entrée de canton déclenche un relais.
Un train est composé (et cela aura un impact direct sur la programmation du capteur) :
d'une locomotive dont le franchissement du capteur déclenche la détection de l'arrivée d'un train dans la canton , avec une période de validation nécessaire pour être sûr de cette présence,
d'un nombre aléatoire de wagons liés entre eux par des attelages qui font pendant un cours instant (à durée variable en fonction de la vitesse du train et du profil de chaque wagon) une non détection de sa présence,
d'un dernier wagon dont la fin de passage devant le capteur annonce une fin de convoi au terme d'une temporisation au moins plus longue que la durée observée entre deux wagons attelés.
Les constituants de ce système sont :
un Arduino,
un programme selon le cahier des charges ci-dessus,
un capteur infrarouge (avec une diode émettrice et une diode réceptrice) qui va donner une information de nature tout ou rien: le train est passant ou il ne l’est pas,
un relais qui actionné permet de signaler le passage du train.
Le capteur fournit donc la condition initiale: le train est probablement présent. Le programme fournit donc la condition finale «le train est présent» et la série d’instructions à exécuter en boucle correspond à «on fait coller le relais si le train est déclaré présent».
Seuls quelques tests en vraie grandeur permettront de valider les différents paramètres à fixer pour atteindre un taux d'acceptation de la condition finale.
Le programme côté réception
L’instruction basique permettant de faire coller le relais si le train est présent est le if ... else (si … sinon en français).
La syntaxe générale est la suivante:
if (condition: le train est là )
{
// instruction(s) exécutée(s) si cette condition est vraie
}
else
{
// instruction(s) exécutée(s) si la condition est fausse
}
Notez bien les paires d’accolades ouvrantes et fermantes qui délimitent les séries d’instructions. Notez également les parenthèses autour de la condition.
Pour revenir à notre système, supposons que le capteur soit connecté à la broche 2 de l’Arduino et qu’il fournisse HIGH, c’est à dire 5V, si le train est passant et LOW, c’est à dire 0V, si il n’est pas présent.
La condition pour faire coller le relais est donc que le capteur fournisse HIGH.
Pour commencer en respectant les bonnes pratiques, définissons la constante pinCapteur et donnons lui la valeur 2.
const byte pinCapteur = 2;
Évidemment pour que tout cela puisse fonctionner il faut que la broche 2 soit programmée en entrée et que le programme lise la valeur fournie par le capteur.
Pour programmer la broche 2 en entrée, la fonction pinMode(...) est également employée mais son second argument doit être INPUT, «entrée» au lieu de OUTPUT.
Ceci vient se loger dans setup() :
void setup()
{
pinMode(pinCapteur, INPUT);
}
Pour lire la valeur fournie par le capteur, nous allons utiliser la fonction digitalRead(...).
L’unique argument de digitalRead(...) est le numéro de broche. Jusqu’ici nous n’avons vu que des fonctions qui ne retournent aucune valeur, c’est à dire dont le type est void.digitalRead(...) retournent une valeur, un int, qui est l’état de la broche, HIGH ou LOW.
Dans notre cas, la condition du if est une simple comparaison, on veut comparer la valeur renvoyée par digitalRead(pinCapteur) avec HIGH. La condition est vraie si les deux sont identiques. Cette comparaison est effectuée avec l’opérateur == . Ainsi :
digitalRead(pinCapteur) == HIGH
sera vrai si digitalRead(pinCapteur) retourne HIGH et faux s'il retourne LOW.
On a parlé de vrai ou faux. Sur l’Arduino, deux constantes sont définies et disponibles : true (vrai) et false (faux). Un type boolean existe également. Toutefois, il s’agit en fait de nombres false vaut 0 et true vaut 1. Une comparaison retourne donc un nombre, 0 ou 1.
Si l'on voulait tester notre programme on pourrait utiliser la led sur l'Arduino dont l'adresse est 13.
const byte pinCapteur = 2; // le capteur est connecté sur la broche 2
const byte pinDEL = 13; // on utilise la Led de la carte sur la broche 13
void setup()
{
pinMode(pinCapteur, INPUT); // on veut lire le capteur
pinMode(pinDEL, OUTPUT); // on veut piloter la led
}
void loop()
{
if (digitalRead(pinCapteur) == HIGH) { // si un train est détecté
digitalWrite(pinDEL, HIGH); // allume la led sur l'Arduino
}
else
{ // si aucun train n'est détecté
digitalWrite(pinDEL, LOW); // éteint la led sur l'Arduino
}
}
Amélioration de la détection du train
Les if imbriqués
Le if étant une instruction, il peut tout à fait être utilisé à l’intérieur d’un autre if. Supposons que notre capteur ait des sautes d’humeur, de temps en temps il est perturbé par des éléments extérieurs et envoie de courtes impulsions de moins de 10ms comme si un train était présent alors que ce n’est pas le cas. Ce genre de problème arrive plus souvent qu’on ne croit en présence d'un éclairage ambiant par exemple.
Pour corriger ce problème, il suffit de lire une seconde fois le capteur après un délai de 10ms (durée à fixer au cours de tests en vraie grandeur) et s'il renvoie à nouveau HIGH alors il y a bien un train, sinon ce n’est pas le cas.
loop() deviendrait donc:
void loop()
{
if (digitalRead(pinCapteur) == HIGH)
{
// si un train est détecté
// on attend 10 ms avant de vérifier que
// ce n'est pas une détection erronée
delay(10);
if (digitalRead(pinCapteur) == HIGH)
{
// le train est toujours là, allume la DEL
digitalWrite(pinDEL, HIGH);
}
else
{
// sinon, éteint la DEL
digitalWrite(pinDEL, LOW);
}
}
else {
// sinon, éteint la DEL
digitalWrite(pinDEL, LOW);
}
}
Le programme côté émission
La led infrarouge attend pour fonctionner un signal modulé à 38 Khz. C'est l'instruction tone qui va être utilisée.
const byte portLED = 9; // la led est branchée sur le port 9
void setup()
{
pinMode(portLED, OUTPUT);
}
void loop()
{
tone(portLED, 38000);
}
On pourra en cas de difficultés rencontrées au cours des tests coder l'émission à la façon des touches des télécommandes de nos téléviseurs.
Les hypothèses de départ
Cet après-midi avec Gaëtan nous avons pu échanger en "vraie grandeur" sur la mise en oeuvre d'une première barrière infrarouge sur le circuit HO du club.
Le projet qui prend forme est de placer des diodes infrarouges, une "émettrice" et une "réceptrice" de chaque coté d'une voie, de sorte que l’émettrice éclaire la réceptrice. Le faisceau de l’émettrice est émis dans l’axe de la diode, son bout bombé sert de lentille "convergente". Il faudra vraisemblablement lui mettre un "capuchon" de gaine rétractable sur la partie cylindrique pour concentrer le faisceau "utile".
La surface sensible de la réceptrice est la face bombée.
Gaëtan m'a confié un rail et deux wagons pour des essais chez moi sur une réplique "à l'identique" du montage du club. J'ai en effet un deuxième jeu de composants électroniques à ma disposition.
Bien entendu, il faudra cacher cette barrière infrarouge dans le décor. Pour la diode réceptrice, Gaëtan propose de confectionner une petite cabine technique de bord de voie avec une ouverture coté voie pour la réception de la lumière infrarouge.
La diode émettrice pourra être intégrée dans un buisson du décor ou dans une "cabane" . Voici une illustration telle que trouvée sur le web :
La gestion du capteur par l’Arduino telle qu'imaginée :
Il faudra raccorder le signal sur une entrée digitale (il faut une entrée par capteur). Dans le cas du projet du club il y a 8 cantons donc au moins 8 capteurs, plus si l'on veut prendre en compte les voies d'évitement ou de parcage.
Un programme simple devra permettre de tester le bon fonctionnement du capteur, à la mise en place puis ensuite en mode « maintenance » si une intervention manuelle sur la zone du capteur déplace le faisceau.
Le module utilise des capteurs de proximité infrarouges TCRT5000 (émetteur et récepteur) et peut être facilement implémenté dans l'un de vos projets Arduino et pour ce qui nous concerne sur le circuit Ho du club.
Nous le placerons afin que les LED infrarouges soient tournées soit vers les flancs du train passant soit vers le dessous du train passant.
Voici une vidéo qui montre l'usage qui peut en être fait vidéo
Quelques images du montage en latéral et en dessous de voie :
Un projet à base Arduino est en cours d'étude pour une des maquettes de l'association. Son but est pédagogique. En un premier temps il mettra en oeuvre une barrière infrarouge placée sur le circuit. Ultérieurement si cette phase de tests est positive une gestion d'un cantonnement du circuit sera étudiée et réalisée.
Le but est d'éviter par l'apport de la technologie infrarouge que seules des locomotives avec un aimant puissent piloter le cantonnement du circuit équipé d'ILS.
Voici les matériels :
L'Arduino et les équipements annexes :
Les barrières infrarouge :