Feux tricolores - détection des trains par ultrasons


Lors de notre dernier article sur les feux tricolores nous avons réalisé une animation des feux.
Pendant l'exposition de modélisme naval et ferroviaire de Montigny le Bretonneux, nous avons pu faire une présentation de ce montage avec deux feux tricolores qui ont mis un peu d'animation près de la gare du réseau de train de jardin en apportant une petite modification que nous allons détailler.



Nous vous proposons de poursuivre en ajoutant un système de détection des trains par ultrasons.
Deux feux sont animés en fonction de la détection des trains qui passent à moins de 10 cm.




Le détecteur

Le détecteur à ultrasons est un petit module nommé HC SR-04. Il est constitué d'un émetteur et d'un récepteur et permet une détection de 2 à 400 cm. Son fonctionnement est assez simple.
Il faut envoyer 8 impulsions à une fréquences de 40 kHz en activant l'entrée TRIG du module, puis on reçoit une impulsion dont la longueur est fonction de la distance de l'objet à détecter, sur la broche ECHO. C'est le principe du SONAR.

 Figure 1: Le détecteur HC SR-04

Pour en savoir plus je recommande la page wiki dédiée sur MCHOBBY lien ici

Le câblage

Il y a les deux broches dont nous avons parlé, le TRIG (déclencheur) et l'ECHO (réception) et deux autres broches pour l'alimentation du module.
Pour éviter tout problème de contact et de court-circuit, nous avons réutilisé un connecteur d'alimentation d'ordinateur (récupéré sur une vieille alimentation de PC).
L'alimentation du module est connectée au +5V (fil rouge) et GND (fil jaune). 
Le TRIG et ECHO sont connectés aux entrées 11 et 12 du Arduino (deux fils noirs). 

Figure 2: Le câblage sur le Arduino Mega

Les deux feux sont connectés à droite sur les broches 43, 45, 47, 49, 51, 53. Les fils de couleurs (Vert, Jaune et Rouge) permettent de s'y retrouver facilement.

Le programme

Notre programmeuse a ajouté un second signal et une petite opération pour obtenir la distance mesurée en cm. Pour cela on divise la durée de l’impulsion reçue par 58. 
La vitesse du son est d'environ 340 m/s soit 0.034 cm/µs.
La distance = temps /vitesse , or il faut diviser par 2 (la durée mesurée est l'aller-retour) ce qui donne
d (cm) = t (µs) /58

/*
 * Programme pour arduino uno
 * par A. ZANDER Février 2018
 *
 * Ce programme fait fonctionner des feux tricolores avec une détection à ultrasons
 * Signal 1 : 3 LED (vertes, oranges et rouge) sont reliées aux sorties D49, D51, D53
 * Signal 2 : 3 LED (vertes, oranges et rouge) sont reliées aux sorties D43, D45, D47
 */
    
// Initialisation des variables
const byte A1V = 49 ;
const byte A1O = 51 ;
const byte A1R = 53 ;
const byte B1V = 43 ;
const byte B1O = 45 ;
const byte B1R = 47 ;

//Délai des différents temps mis en const pour changer facilement
// si le délai imparti ne vous satisfait pas. Il s'agit de millisecondes
const long TempsAttenteFeuRougeSeul = 5000;
const long TempsAttenteFeuVert = 5000;
const long TempsAttenteFeuOrange = 2000;

/* Utilisation du capteur Ultrason HC-SR04 */

// définition des broches utilisées
int trig = 12;
int echo = 11;
long lecture_echo;
long cm;

void setup()
{
  pinMode(trig, OUTPUT);
  digitalWrite(trig, LOW);
  pinMode(echo, INPUT);
  Serial.begin(9600);

  pinMode (A1V, OUTPUT) ;
  pinMode (A1O, OUTPUT) ;
  pinMode (A1R, OUTPUT) ;
  pinMode (B1V, OUTPUT) ;
  pinMode (B1O, OUTPUT) ;
  pinMode (B1R, OUTPUT) ;
}

void loop()
{
  digitalWrite(trig, HIGH);
  delayMicroseconds(10);
  digitalWrite(trig, LOW);
  lecture_echo = pulseIn(echo, HIGH);
  cm = lecture_echo / 58;
  Serial.print("Distance en cm : ");
  Serial.println(cm);
  delay(1000);

  // Les feux sont à voie libre
  digitalWrite (A1V, HIGH) ;
  digitalWrite (A1O, LOW) ;
  digitalWrite (A1R, LOW) ;
  digitalWrite (B1V, HIGH) ;
  digitalWrite (B1O, LOW) ;
  digitalWrite (B1R, LOW) ;

  // Détection d'un train
  if (cm < 10)
  {
    // Concerne le feu A1
    delay (TempsAttenteFeuVert) ; // Feu vert A1V pendant n secondes
    digitalWrite (A1V, LOW) ; // Extinction de A1V
    digitalWrite (A1O, HIGH) ; // et allumage de A1O
    delay (TempsAttenteFeuOrange) ; //durée 2 secondes
    digitalWrite (A1O, LOW) ; // Extinction de A1O
    digitalWrite (A1R, HIGH) ; // et allumage de A1R
    delay (TempsAttenteFeuRougeSeul) ; // Temporisation
    // Le cycle peut recommencer
  }
  else
  {
    // Concerne le feu B1
    delay (TempsAttenteFeuVert) ; // Feu vert B1V pendant n secondes
    digitalWrite (B1V, LOW) ; // Extinction de B1V
    digitalWrite (B1O, HIGH) ; // et allumage de B1O
    delay (TempsAttenteFeuOrange) ; //durée 2 secondes
    digitalWrite (B1O, LOW) ; // Extinction de B1O
    digitalWrite (B1R, HIGH) ; // et allumage de B1R
    delay (TempsAttenteFeuRougeSeul) ; // Temporisation
    // Le cycle peut recommencer
  }
}

Comme pour le précédant montage, copiez directement le programme dans le sketch sous l'éditeur. Puis cliquez sur vérifier et téléverser dans la carte Arduino Mega.

Le Test

Pour éviter des déclenchements intempestifs, utiliser un support (voir photo) pour bloquer le module ultrasons. Branchez la batterie portable et c'est parti.
Pour déclencher, il suffit de mettre sa main devant à moins de 10 cm et l'animation du premier feu se déclenche.
 
Figure 3: Le montage final

Nous avons également essayé avec les trains de jardin lors de l'exposition et cela fonctionne très bien car leur taille est conséquente et leur vitesse peu élevée.