Dev Log Arduino - Barrière Automatique avec Capteur Ultrason

T.Giberné27 décembre 2025
ArduinoElectroniqueDevlog

Bienvenue dans ce dev log où je documente mon apprentissage de l'électronique. Aujourd'hui, je vous présente un projet classique mais complet : une barrière automatisée.

Ce projet m'a permis de manipuler plusieurs composants essentiels : la détection de distance, le contrôle de mouvement via un servomoteur, et la gestion des signaux visuels et sonores.

Description du Projet

L'objectif est simple : lorsqu'un objet s'approche à moins de 15 cm de la barrière, celle-ci s'ouvre automatiquement.

Comportement attendu :

  • Repos : La barrière est fermée, la LED rouge est allumée.
  • Détection : Le capteur ultrason détecte un objet.
  • Action : La barrière se lève (servo à 180°), la LED verte s'allume, et un buzzer retentit pour signaler l'ouverture.

Liste des Composants

Pour réaliser ce montage, j'ai utilisé :

  • Elegoo Mega R3 : Le cerveau du projet.
  • Capteur Ultrason HC-SR04 : Pour mesurer la distance.
  • Servomoteur : Pour actionner physiquement la barrière.
  • LEDs (Rouge et Verte) : Pour l'interface visuelle.
  • Buzzer Actif : Pour l'alerte sonore.
  • Résistances (220Ω) et breadboard

Schéma et Montage

Le montage a été conçu et testé sur Tinkercad avant d'être assemblé. Voici le schéma de câblage :

Lien vers le projet interactif : Tinkercad.com

Détails du câblage :

  • Le capteur ultrason est branché sur les pins 12 (Trig) et 11 (Echo).
  • Le servomoteur est piloté par le pin 9.
  • Les LEDs sont connectées aux pins 2 (Rouge) et 4 (Verte).
  • Le buzzer est relié au pin 7.

Le Code

J'ai utilisé la bibliothèque SR04 pour le capteur ultrason et Servo pour le contrôle du moteur. Le code gère l'état de la barrière, les LEDs et le buzzer avec une logique simple basée sur la distance mesurée.

Inclusion des Bibliothèques et Déclarations Initiales

#include <SR04.h>
#include <Servo.h>
Servo myservo;

#define TRIG_PIN 12
#define ECHO_PIN 11
SR04 sr04 = SR04(ECHO_PIN,TRIG_PIN);
long a;
  • Inclusion des libraries pour simplifier la gestion du capteur (SR04 encapsule trig/echo) et du servo.
  • Définition des pins et initialisation de l'objet sr04 ; a stocke la distance (long pour gérer les valeurs potentiellement grandes).

Variables pour l'État de la Barrière et les Timings

int gateClose = 90;
int gateOpen = 180;
bool gateState = false;
bool lastgateState = false;

unsigned long lastTime = 0;
const unsigned long delayTime = 1000;
  • Angles servo : 90° fermé, 180° ouvert.
  • gateState et lastgateState pour détecter les transitions d'état (évite les commandes répétées au servo).
  • Timings basés sur millis() (non bloquant) ; delayTime = 1s pour mesurer la distance périodiquement.

Déclaration des Pins pour LEDs et Buzzer

byte redLed = 2 ;
byte greenLed = 4 ;

byte buzzer = 7;
  • Pins assignés pour Leds et buzzer (byte pour économie mémoire).\

Fonction Setup

void setup() {
  Serial.begin(9600);

  pinMode (redLed, OUTPUT);
  pinMode (greenLed, OUTPUT);
  digitalWrite(redLed, HIGH);
  digitalWrite(greenLed, LOW);

  pinMode(buzzer, OUTPUT);
  digitalWrite(buzzer, LOW);

  myservo.attach(9);  // Control the servo motor en pin 9 
  myservo.write(gateClose); // On "charge" la position cible en mémoire

  delay(1000); 
}
  • Init Serial pour debug ; config pins en OUTPUT.
  • État initial : rouge ON, verte OFF, buzzer OFF, servo fermé.
  • delay(1000) pour stabilisation (évite glitches au boot).

Fonction Loop (Boucle Principale)

void loop() {

  a=sr04.Distance();

  if (millis() - lastTime >= delayTime )
  {
    Serial.print(a);
    Serial.println("cm");

    lastTime = millis();
    digitalWrite(buzzer, LOW);
  }

  if( a <= 15 )
  {
    digitalWrite(greenLed, HIGH);
    digitalWrite(redLed, LOW);
    gateState = true;
      
  } else{
    digitalWrite(redLed, HIGH);
    digitalWrite(greenLed, LOW);
    gateState = false;
  }

  if(gateState == true && lastgateState == false )
  {
    myservo.write(gateOpen);
    digitalWrite(buzzer, HIGH);
  } else if (gateState == false && lastgateState == true ) {
    myservo.write(gateClose);
  }
  
  lastgateState = gateState;

}

Mesure de distance constante : a=sr04.Distance(); – Mesure la distance à chaque itération de la boucle, pour une réactivité immédiate au seuil.

Mesure distance toutes les 1s via millis() (non bloquant, contrairement à delay()) ; affiche mesure sur Serial ; éteint buzzer ici pour limiter sa durée à ~1s.

Seuil 15 cm : met à jour LEDs et gateState (true=ouvert).

Détection transitions : 

Si passe de fermé à ouvert =  ouvre servo + buzzer ON.

Si passe de ouvert à fermé = ferme servo. 

Mise à jour état : lastgateState = gateState. Prépare la prochaine détection de changement, clé pour la logique anti-répétition.