Terminale STI2D SIN Seance

TP Arduino

Projet: capteurs ligne + distance (ultrason) → actionneur aléatoire

Line Finder connecté au Base Shield sur Arduino Uno
Exemple de câblage Line Finder sur Base Shield. Testez le sens HIGH/LOW, ne devinez pas.

Matériel imposé

  • Arduino Uno + Grove Base Shield
  • Grove Line Finder (sortie digital)
  • Grove Ultrasonic Ranger (2–350 cm)
  • Un actionneur aléatoire parmi: Servo / LED / Buzzer

Objectif

Selon l’état des capteurs, choisir aléatoirement un actionneur et l’activer, en journalisant tout dans le Moniteur série.

Module Grove Ultrasonic Ranger v2
Ultrason: trigger 10 µs, mesure de l’écho sur le même SIG.

Contraintes

  • Pas d’IA. IDE Arduino + doc.
  • Code commenté, fonctions propres.
  • Logs utiles: valeurs lues, seuils, tirage aléatoire.
Module Grove Buzzer avec câble
Buzzer: simple on/off ou tone() pour motifs.

Branches de décision (exemple)

  • line == NOIR et distance < 20 cm → actionneur au hasard: servo 0°/180°.
  • line == BLANC et distance < 10 cm → LED clignote 3–6 fois.
  • Sinon → buzzer motif court/long tiré au sort.

Trame de code suggérée

// Trame minimaliste, à adapter. UNO + Grove
#include <Servo.h>

const int PIN_LINE = 2;      // Grove D2
const int PIN_US   = 3;      // Grove D3 (Ultrasonic sur 1 fil)
const int PIN_LED  = 7;      // Grove D7
const int PIN_BUZ  = 8;      // Grove D8
const int PIN_SERVO= 6;      // Grove D6 (PWM)

Servo sv;

long measureCm(int sigPin){
  // Module Grove Ultrasonic: envoie un trigger 10 µs puis lit l'écho sur le même SIG
  pinMode(sigPin, OUTPUT);
  digitalWrite(sigPin, LOW); delayMicroseconds(2);
  digitalWrite(sigPin, HIGH); delayMicroseconds(10);
  digitalWrite(sigPin, LOW);
  pinMode(sigPin, INPUT);
  long us = pulseIn(sigPin, HIGH, 30000UL); // timeout 30 ms ~ 5 m
  if(us == 0) return -1;
  return (us * 340L / 2) / 10000L; // µs → cm (vitesse du son ~340 m/s)
}

void ledBlink(int n){
  for(int i=0;i<n;i++){ digitalWrite(PIN_LED,HIGH); delay(120); digitalWrite(PIN_LED,LOW); delay(120); }
}

void buzPattern(bool longBip){
  int t = longBip ? 400 : 120;
  digitalWrite(PIN_BUZ, HIGH); delay(t);
  digitalWrite(PIN_BUZ, LOW);  delay(120);
}

void setup(){
  pinMode(PIN_LINE, INPUT);
  pinMode(PIN_LED, OUTPUT);
  pinMode(PIN_BUZ, OUTPUT);
  sv.attach(PIN_SERVO);
  Serial.begin(115200);
  randomSeed(analogRead(A0)); // Jitter pour l'aléatoire
  Serial.println(F("Init OK"));
}

void loop(){
  int line = digitalRead(PIN_LINE);         // HIGH ou LOW selon noir/blanc
  long dcm = measureCm(PIN_US);             // distance en cm, -1 si timeout
  Serial.print(F("line=")); Serial.print(line);
  Serial.print(F(" d="));   Serial.print(dcm); Serial.println(F("cm"));

  int choix = random(3); // 0:servo 1:LED 2:buzzer
  if(line==HIGH && dcm>=0 && dcm<20){
    if(choix==0){ sv.write(random(0,2)?180:0); Serial.println(F("[servo] 0/180")); }
    else if(choix==1){ ledBlink(random(3,7)); Serial.println(F("[led] blink")); }
    else { buzPattern(random(0,2)); Serial.println(F("[buzzer] motif")); }
  }else if(line==LOW && dcm>=0 && dcm<10){
    if(choix==0){ sv.write(90); Serial.println(F("[servo] 90")); }
    else if(choix==1){ ledBlink(random(2,5)); Serial.println(F("[led] blink")); }
    else { buzPattern(false); Serial.println(F("[buzzer] court")); }
  }else{
    if(choix==0){ sv.write(0); }
    else if(choix==1){ digitalWrite(PIN_LED, LOW); }
    else { digitalWrite(PIN_BUZ, LOW); }
  }

  delay(150);
}

Bases Arduino utiles

Servo analogique Grove avec accessoires
Servo: Servo.h, attach(pin), write(angle). Évitez d’affamer le 5 V.

Entrées/sorties

  • pinMode(pin, INPUT/OUTPUT)
  • digitalRead(pin)HIGH/LOW
  • digitalWrite(pin, HIGH/LOW)
  • PWM: analogWrite(pin, 0..255) sur pins marqués ~

Temps et aléatoire

  • delay(ms), millis() pour temporisations non bloquantes
  • randomSeed(entropie), random(min,max)

Servo et buzzer

  • #include <Servo.h>, attach(pin), write(angle)
  • Buzzer: digitalWrite ou tone(pin,freq,dur)

Lecture capteurs

  • Numérique: digitalRead (Line Finder)
  • Ultrason: trigger 10 µs puis pulseIn sur le même SIG
Grove LED rouge avec potentiomètre de luminosité
LED: simple, parfaite pour visualiser un état ou un tirage aléatoire.

Moniteur série (IDE Arduino 2)

Ouvrir et configurer

  • IDE 2: menu Tools → Port, puis icône Serial Monitor.
  • Réglez baud sur 115200 si votre code fait Serial.begin(115200).
  • Fin de ligne: No line ending ou Newline selon vos readString().

Bonnes pratiques de logs

  • Préfixer: [capteurs], [choix], [action].
  • Afficher valeurs + décisions: line=1 d=17cm → [servo] 0/180.
  • Limiter le spam: rythme raisonnable dans loop().
// Exemple d'entête de log
Serial.begin(115200);
Serial.println(F("=== Demo Grove: line + ultrason → actionneurs ==="));

Rappels Grove et Base Shield

Grove Base Shield v2: ports A, D, UART, I2C
Base Shield v2: ports numériques D2..D8, analogiques A0..A3, I2C, UART. Respectez le 5 V/3.3 V.

Ports du Base Shield

  • Ports D: E/S numériques (PWM sur certains D~)
  • Ports A: entrées analogiques
  • Ports I²C: bus SDA/SCL partagés
  • Alimentation: 5 V depuis la carte

Line Finder

  • Sortie numérique avec comparateur
  • Retour typique: HIGH sur noir, LOW sur blanc (vérifiez votre module)

Ultrasonic Ranger

  • 1 pin SIG pour trigger + écho
  • Plage typique: 2–350 cm, résolution 1 cm

Erreurs fréquentes

  • Baud ≠ Serial.begin() → charabia
  • Servo sur pin non PWM ou 5 V faiblard → tremblements
  • Ultrason sans timeout → boucle bloquée

Module Grove (Valin) — version réécrite

Présentation

Le module de connexion Grove (Base Shield) simplifie le câblage des capteurs et actionneurs sur Arduino Uno. Pas de breadboard ni de fils en vrac: un connecteur, un câble Grove, et c’est prêt.

Vue générale du Grove Base Shield v2
Vue générale du Base Shield: ports D (numériques), A (analogiques), I²C, UART, sélecteur 5 V / 3.3 V.

Ports et correspondances

  • Analogiques A0–A3 → entrées analogRead().
  • Numériques D2–D8pinMode(), digitalRead(), digitalWrite(). PWM sur certaines pins ~.
  • I²C (x4) → capteurs bus SDA/SCL.
  • UART → broches 0/1 (RX/TX) de l’Uno.

Uno = 5 V. Placez bien l’interrupteur du shield en position 5 V.

Connectique Grove (4 fils)

  • Noir = 0 V
  • Rouge = +5 V
  • Jaune = Signal 1
  • Blanc = Signal 2 (souvent NC sur certains modules)

Les détrompeurs empêchent l’inversion, encore faut-il savoir où brancher. Lisez la sérigraphie. Oui, vraiment.

Conflits de broches: cas D2/D3

Sur le shield, certains connecteurs partagent des broches Arduino. Exemple: la broche 3 est utilisée par les ports D2 et D3. Un module branché sur D2 qui emploie la broche 3 peut entrer en conflit avec un autre sur D3 qui utilise la même broche.

  • Mauvais D2: afficheur 4 digits (utilise 2 et 3) + D3: capteur temp (utilise aussi 3) → conflit.
  • Correct D2: capteur temp (utilise 2) + D3: 4 digits (utilise 3 et 4) → OK.

Mini-appli guide: bouton → buzzer

Montage : bouton sur D2, buzzer sur D3. À l’appui, jouer un La 440 Hz pendant 500 ms.

const int PIN_BOUTON = 2;   // D2
const int PIN_BUZ    = 3;   // D3
void setup(){
  pinMode(PIN_BOUTON, INPUT);
  pinMode(PIN_BUZ, OUTPUT);
}
void loop(){
  int etat = digitalRead(PIN_BOUTON);
  if(etat == HIGH){ tone(PIN_BUZ, 440, 500); }
}

À surveiller

  • Le baud du Moniteur série doit correspondre à Serial.begin().
  • Servo sur pin PWM et alimentation correcte, sinon tremblements ridicules.
  • Pour l’ultrason, prévoyez un timeout à pulseIn().
Module buzzer Grove
Le buzzer, fidèle allié des tests rapides et des oreilles malheureuses.