Projet: capteurs ligne + distance (ultrason) → actionneur aléatoire
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.
Contraintes
- Pas d’IA. IDE Arduino + doc.
- Code commenté, fonctions propres.
- Logs utiles: valeurs lues, seuils, tirage aléatoire.
tone() pour motifs.Branches de décision (exemple)
line == NOIRetdistance < 20 cm→ actionneur au hasard: servo 0°/180°.line == BLANCetdistance < 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.h, attach(pin), write(angle). Évitez d’affamer le 5 V.Entrées/sorties
pinMode(pin, INPUT/OUTPUT)digitalRead(pin)→HIGH/LOWdigitalWrite(pin, HIGH/LOW)- PWM:
analogWrite(pin, 0..255)sur pins marqués~
Temps et aléatoire
delay(ms),millis()pour temporisations non bloquantesrandomSeed(entropie),random(min,max)
Servo et buzzer
#include <Servo.h>,attach(pin),write(angle)- Buzzer:
digitalWriteoutone(pin,freq,dur)
Lecture capteurs
- Numérique:
digitalRead(Line Finder) - Ultrason: trigger 10 µs puis
pulseInsur le même SIG
Moniteur série (IDE Arduino 2)
Ouvrir et configurer
- IDE 2: menu Tools → Port, puis icône Serial Monitor.
- Réglez baud sur
115200si votre code faitSerial.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
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:
HIGHsur noir,LOWsur 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.
Ports et correspondances
- Analogiques A0–A3 → entrées
analogRead(). - Numériques D2–D8 →
pinMode(),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().