Un microcontrĂŽleur, du code C++, des composants Ă©lectroniques â et tu construis ce que tu veux.
Du premier LED qui clignote au robot qui esquive les murs.
Le concept, pourquoi c'est génial, et pourquoi tout le monde l'utilise.
Installer l'IDE, brancher la carte, et envoyer ton premier programme.
Variables, conditions, boucles, fonctions â tout ce qu'il faut pour coder.
Faire clignoter une LED. Le "Hello World" de l'électronique.
3 LEDs, une séquence, et tu gÚres la circulation.
Mesurer des distances comme un sonar de sous-marin.
ContrĂŽler un moteur avec un potentiomĂštre.
Un robot éviteur d'obstacles. Le boss final.
Projet completArduino, c'est une carte électronique programmable. En gros : un mini-ordinateur qui peut interagir avec le monde réel. Tu écris du code, tu le téléverses sur la carte, et elle exécute tes instructions en boucle.
ConcrĂštement, un Arduino Uno c'est :
Le meilleur ? La carte coĂ»te ~25âŹ, le logiciel est gratuit et open-source, et la communautĂ© est gigantesque.
Arduino vs Raspberry Pi ?
Le Pi c'est un vrai ordinateur (Linux, Python). L'Arduino c'est un microcontrĂŽleur : il fait UNE chose, instantanĂ©ment, et consomme quasi rien. ContrĂŽler des moteurs, lire des capteurs â Arduino. Serveur web, machine learning â Pi.
L'IDE (Integrated Development Environment), c'est le logiciel oĂč tu Ă©cris ton code et oĂč tu l'envoies sur la carte.
đ Va sur arduino.cc/en/software et tĂ©lĂ©charge la version pour ton OS.
Cùble USB-B (gros connecteur carré). Branche l'Arduino sur ton PC. La LED verte "ON" doit s'allumer.
COM3 ou /dev/ttyACM0)Le port n'apparaĂźt pas ?
Windows : installe les drivers CH340 (clone chinois) ou FTDI. Linux : sudo usermod -a -G dialout $USER puis redémarre.
// Structure de base d'un sketch Arduino
void setup() {
// Exécuté UNE SEULE FOIS au démarrage
// Configure les pins, initialise la comm
}
void loop() {
// Exécuté EN BOUCLE INFINIE aprÚs setup()
// C'est ici que vit ton programme
}
Arduino utilise du C++ simplifié. Voici les fondamentaux qui couvrent 90% de ce que tu feras.
Une variable, c'est une boĂźte qui stocke une valeur. En C++, tu dois dire le type de la boĂźte.
int age = 15; // Nombre entier (-32768 Ă 32767) long distance = 100000; // Entier plus grand float temperature = 23.5; // Nombre Ă virgule bool ledOn = true; // Vrai ou faux char lettre = 'A'; // Un caractĂšre String nom = "Arduino"; // Texte const int LED_PIN = 13; // Constante (ne change jamais) int resultat = 5 / 2; // = 2 (division entiĂšre !) float exact = 5.0 / 2.0; // = 2.5 (division flottante)
Le programme prend des décisions.
int capteur = analogRead(A0); // Lit 0-1023
if (capteur > 500) {
digitalWrite(LED_PIN, HIGH);
} else if (capteur > 200) {
Serial.println("Valeur moyenne");
} else {
digitalWrite(LED_PIN, LOW);
}
// Opérateurs : == != > < >= <=
// Logique : && (ET) || (OU) ! (NON)
if (capteur > 100 && capteur < 900) {
Serial.println("Plage normale");
}
Répéter des actions sans copier-coller.
// FOR â nombre de rĂ©pĂ©titions connu
for (int i = 0; i < 10; i++) {
Serial.println(i); // Affiche 0 Ă 9
delay(100);
}
// WHILE â tant que c'est vrai
int compteur = 0;
while (compteur < 5) {
Serial.println(compteur);
compteur++; // IMPORTANT sinon boucle infinie !
}
// Fade progressif d'une LED (PWM)
for (int lum = 0; lum <= 255; lum += 5) {
analogWrite(9, lum);
delay(30);
}
Un bloc de code réutilisable.
// Fonction sans retour (void)
void faireClignoter(int pin, int duree) {
digitalWrite(pin, HIGH);
delay(duree);
digitalWrite(pin, LOW);
delay(duree);
}
// Fonction avec retour
float celsiusVsFahrenheit(float c) {
return c * 9.0 / 5.0 + 32.0;
}
void loop() {
faireClignoter(13, 500);
float f = celsiusVsFahrenheit(22.5);
Serial.println(f);
}
RĂšgle d'or : DRY â Don't Repeat Yourself
Si tu copies-colles du code plus de 2 fois, fais-en une fonction. Ton futur toi te remerciera quand il faudra débugger à 23h.
Faire clignoter une LED. Si ça marche, ton setup fonctionne.
Matériel : Arduino Uno, 1 LED, 1 résistance 220Ω, breadboard, fils
Arduino Uno
ââââââââââââââââ
â [13] âââââ[220Ω]ââââ(LED+)ââââ(LED-)âââââ
â [GND]ââââââââââââââââââââââââââââââââââââ
ââââââââââââââââ
Pin 13 â RĂ©sistance â LED (anode +) â LED (cathode -) â GND
Pourquoi la résistance ?
LED sans résistance = LED morte. L'Arduino envoie 5V, la LED supporte ~2V. La résistance 220Ω limite le courant.
/*
* PROJET 1 : BLINK
* Fait clignoter une LED sur la pin 13
*/
const int LED = 13;
void setup() {
// pinMode configure une pin : INPUT ou OUTPUT
pinMode(LED, OUTPUT);
}
void loop() {
// digitalWrite envoie HIGH (5V) ou LOW (0V)
digitalWrite(LED, HIGH); // Allumer
delay(1000); // Attendre 1 seconde
digitalWrite(LED, LOW); // Ăteindre
delay(1000); // Attendre 1 seconde
// loop() recommence â clignotement infini
}
Défi : Code un SOS en morse ! 3 courts (200ms), 3 longs (600ms), 3 courts. Pause de 2s entre chaque séquence.
3 LEDs, une séquence réaliste. Tu apprends à contrÎler plusieurs pins et gérer le timing.
Matériel : Arduino, LED rouge + orange + verte, 3à 220Ω, breadboard, fils
Arduino Breadboard
ââââââââââââ
â [4] âââ[220Ω]ââ đŽ Rouge ââ GND
â [3] âââ[220Ω]ââ đĄ Orange ââ GND
â [2] âââ[220Ω]ââ đą Verte ââ GND
â [GND] âââ Rail GND commun
ââââââââââââ
/*
* PROJET 2 : FEU TRICOLORE
* SĂ©quence : Vert â Orange â Rouge â Vert...
*/
const int ROUGE = 4;
const int ORANGE = 3;
const int VERT = 2;
void setup() {
pinMode(ROUGE, OUTPUT);
pinMode(ORANGE, OUTPUT);
pinMode(VERT, OUTPUT);
}
void toutEteindre() {
digitalWrite(ROUGE, LOW);
digitalWrite(ORANGE, LOW);
digitalWrite(VERT, LOW);
}
void loop() {
toutEteindre();
digitalWrite(VERT, HIGH); // đą Vert - 5s
delay(5000);
toutEteindre();
digitalWrite(ORANGE, HIGH); // đĄ Orange - 2s
delay(2000);
toutEteindre();
digitalWrite(ROUGE, HIGH); // đŽ Rouge - 5s
delay(5000);
digitalWrite(ORANGE, HIGH); // đŽ+đĄ PrĂȘt Ă dĂ©marrer
delay(1000);
}
Niveau suivant : Ajoute un bouton-poussoir pour un passage piéton ! Utilise digitalRead() pour lire le bouton.
Le HC-SR04 envoie un son ultrasonique, attend l'Ă©cho, et calcule la distance. CoĂ»te ~2âŹ, mesure de 2cm Ă 4m.
Matériel : Arduino, capteur HC-SR04, breadboard, fils
HC-SR04 Arduino
ââââââââââââ
â VCC âââââ 5V
â TRIG âââââ Pin 9
â ECHO âââââ Pin 10
â GND âââââ GND
ââââââââââââ
/*
* PROJET 3 : CAPTEUR ULTRASON HC-SR04
* Affiche la distance dans le Moniteur Série
*/
const int TRIG = 9;
const int ECHO = 10;
void setup() {
pinMode(TRIG, OUTPUT);
pinMode(ECHO, INPUT);
Serial.begin(9600);
Serial.println("=== Capteur Ultrason ===");
}
float mesurerDistance() {
digitalWrite(TRIG, LOW);
delayMicroseconds(2);
digitalWrite(TRIG, HIGH);
delayMicroseconds(10); // Impulsion de 10”s
digitalWrite(TRIG, LOW);
long duree = pulseIn(ECHO, HIGH); // Durée en ”s
float distance = duree * 0.0343 / 2.0;
return distance;
}
void loop() {
float dist = mesurerDistance();
Serial.print("Distance : ");
Serial.print(dist);
Serial.println(" cm");
if (dist < 10) {
Serial.println("â ïž OBJET TRES PROCHE !");
} else if (dist < 30) {
Serial.println("đĄ Objet dĂ©tectĂ©");
}
delay(250); // Mesure 4 fois par seconde
}
Moniteur Série : Dans l'IDE Arduino, clique sur la loupe en haut à droite (ou Ctrl+Shift+M). Mets le baudrate à 9600. Tu verras les distances s'afficher en temps réel !
Un servo moteur peut tourner à un angle précis (0° à 180°). Avec un potentiomÚtre (bouton rotatif), tu contrÎles l'angle en temps réel. C'est la base de la robotique : bras articulés, tourelles, direction de véhicule.
Matériel : Arduino, servo SG90 (ou MG996R), potentiomÚtre 10kΩ, fils
PotentiomĂštre Arduino Servo SG90 âââââââââââ âââââââââââ â Gauche âââââ GND â Marron âââ GND â Centre âââââ A0 (analogique) â Rouge âââ 5V â Droite âââââ 5V â Orange âââ Pin 9 âââââââââââ âââââââââââ Le potentiomĂštre envoie 0-1023 sur A0 On convertit en 0-180° pour le servo
Alimentation : Un servo SG90 (petit bleu) marche sur le 5V de l'Arduino. Mais un gros servo (MG996R) consomme trop de courant â il faut une alimentation externe 5V-6V. Sinon ton Arduino va redĂ©marrer en boucle.
/*
* PROJET 4 : SERVO + POTENTIOMĂTRE
* Tourne le potentiomĂštre â le servo suit
*/
#include <Servo.h> // BibliothĂšque incluse dans l'IDE
Servo monServo; // Crée un objet Servo
const int POTPIN = A0; // Pin analogique du potentiomĂštre
const int SERVOPIN = 9; // Pin du servo (doit ĂȘtre PWM ~)
void setup() {
monServo.attach(SERVOPIN); // Connecte le servo Ă la pin
Serial.begin(9600);
}
void loop() {
int valeur = analogRead(POTPIN); // Lit 0-1023
// map() convertit une plage en une autre
// 0-1023 â 0-180 degrĂ©s
int angle = map(valeur, 0, 1023, 0, 180);
monServo.write(angle); // Envoie l'angle au servo
Serial.print("PotentiomĂštre: ");
Serial.print(valeur);
Serial.print(" â Angle: ");
Serial.print(angle);
Serial.println("°");
delay(15); // Le servo a besoin d'un petit délai
}
La fonction map() est super utile. Elle convertit une valeur d'une plage à une autre. Syntaxe : map(valeur, min_entrée, max_entrée, min_sortie, max_sortie). Tu l'utiliseras partout.
Fais balayer le servo de 0° à 180° et retour, automatiquement. C'est exactement ce qu'on utilise pour le radar du robot !
// Balayage automatique du servo
#include <Servo.h>
Servo monServo;
void setup() {
monServo.attach(9);
}
void loop() {
// Aller : 0° â 180°
for (int angle = 0; angle <= 180; angle++) {
monServo.write(angle);
delay(15);
}
// Retour : 180° â 0°
for (int angle = 180; angle >= 0; angle--) {
monServo.write(angle);
delay(15);
}
}
On combine TOUT ce qu'on a appris : un capteur ultrason monté sur un servo, deux moteurs DC, et un chùssis. Le robot avance, détecte un obstacle, regarde à gauche et à droite, et choisit la meilleure direction. Autonome.
Budget total : ~25-35⏠(en plus de l'Arduino)
ALIMENTATION (piles 6V-9V) âââ + â Interrupteur â L298N 12V IN âââ - â L298N GND â Arduino GND L298N (Driver Moteur) âââ ENA â Arduino Pin 5 (PWM vitesse moteur A) âââ IN1 â Arduino Pin 7 (direction moteur A) âââ IN2 â Arduino Pin 8 (direction moteur A) âââ IN3 â Arduino Pin 12 (direction moteur B) âââ IN4 â Arduino Pin 13 (direction moteur B) âââ ENB â Arduino Pin 6 (PWM vitesse moteur B) âââ OUT1/OUT2 â Moteur gauche âââ OUT3/OUT4 â Moteur droit âââ 5V OUT â Arduino VIN (le L298N alimente l'Arduino !) HC-SR04 (Capteur) âââ VCC â Arduino 5V âââ TRIG â Arduino Pin 9 âââ ECHO â Arduino Pin 10 âââ GND â Arduino GND Servo SG90 âââ Orange (signal) â Arduino Pin 11 âââ Rouge (+) â Arduino 5V âââ Marron (-) â Arduino GND
Alimentation séparée OBLIGATOIRE !
Les moteurs consomment beaucoup de courant. Ne les alimente JAMAIS via le USB ou le 5V de l'Arduino. Utilise des piles ou une batterie via le L298N. Le régulateur 5V du L298N peut alimenter l'Arduino via VIN.
/*
* PROJET FINAL : ROBOT ĂVITEUR D'OBSTACLES
* Le robot avance, détecte un mur, scanne gauche/droite,
* et tourne du cÎté le plus dégagé.
*/
#include <Servo.h>
// === PINS ===
// Moteur A (gauche)
const int ENA = 5; // Vitesse (PWM)
const int IN1 = 7; // Direction
const int IN2 = 8;
// Moteur B (droit)
const int ENB = 6; // Vitesse (PWM)
const int IN3 = 12; // Direction
const int IN4 = 13;
// Capteur ultrason
const int TRIG = 9;
const int ECHO = 10;
// Servo
const int SERVO_PIN = 11;
// === CONSTANTES ===
const int VITESSE = 180; // 0-255 (ne mets pas trop fort)
const int DIST_DANGER = 25; // Distance en cm avant obstacle
Servo radar;
void setup() {
// Config moteurs
pinMode(ENA, OUTPUT);
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
pinMode(ENB, OUTPUT);
pinMode(IN3, OUTPUT);
pinMode(IN4, OUTPUT);
// Config capteur
pinMode(TRIG, OUTPUT);
pinMode(ECHO, INPUT);
// Servo
radar.attach(SERVO_PIN);
radar.write(90); // Centre
Serial.begin(9600);
delay(2000); // Attendre 2s au démarrage
Serial.println("đ€ Robot prĂȘt !");
}
// --- Fonctions capteur ---
float mesurerDistance() {
digitalWrite(TRIG, LOW);
delayMicroseconds(2);
digitalWrite(TRIG, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG, LOW);
long duree = pulseIn(ECHO, HIGH, 25000);
if (duree == 0) return 999; // Pas d'écho = loin
return duree * 0.0343 / 2.0;
}
// --- Fonctions moteur ---
void avancer() {
analogWrite(ENA, VITESSE);
analogWrite(ENB, VITESSE);
digitalWrite(IN1, HIGH); digitalWrite(IN2, LOW);
digitalWrite(IN3, HIGH); digitalWrite(IN4, LOW);
}
void reculer() {
analogWrite(ENA, VITESSE);
analogWrite(ENB, VITESSE);
digitalWrite(IN1, LOW); digitalWrite(IN2, HIGH);
digitalWrite(IN3, LOW); digitalWrite(IN4, HIGH);
}
void tournerGauche() {
analogWrite(ENA, VITESSE);
analogWrite(ENB, VITESSE);
digitalWrite(IN1, LOW); digitalWrite(IN2, HIGH);
digitalWrite(IN3, HIGH); digitalWrite(IN4, LOW);
}
void tournerDroite() {
analogWrite(ENA, VITESSE);
analogWrite(ENB, VITESSE);
digitalWrite(IN1, HIGH); digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW); digitalWrite(IN4, HIGH);
}
void stop() {
analogWrite(ENA, 0);
analogWrite(ENB, 0);
}
// --- Scanner gauche/droite ---
void scannerEtTourner() {
stop();
reculer();
delay(300);
stop();
// Regarder Ă droite
radar.write(20);
delay(500);
float distDroite = mesurerDistance();
Serial.print("Droite: "); Serial.println(distDroite);
// Regarder Ă gauche
radar.write(160);
delay(500);
float distGauche = mesurerDistance();
Serial.print("Gauche: "); Serial.println(distGauche);
// Recentrer le servo
radar.write(90);
delay(300);
// Choisir la meilleure direction
if (distDroite > distGauche) {
Serial.println("â Je tourne Ă droite");
tournerDroite();
delay(400);
} else {
Serial.println("â Je tourne Ă gauche");
tournerGauche();
delay(400);
}
stop();
}
void loop() {
float dist = mesurerDistance();
Serial.print("Distance: ");
Serial.print(dist);
Serial.println(" cm");
if (dist < DIST_DANGER) {
Serial.println("â ïž OBSTACLE !");
scannerEtTourner();
} else {
avancer();
}
delay(100);
}
Calibration :
Les deux moteurs ne tournent jamais exactement Ă la mĂȘme vitesse. Si ton robot tire Ă gauche, augmente la vitesse du moteur gauche (ou baisse celle du droit). Ajoute un offset dans la fonction avancer().
Serial.println() partout pour débugger. Tu verras exactement ce que le robot "pense".Tu as fini ? GG !
Tu as un robot autonome qui Ă©vite les obstacles. Ăa te met devant 99% des gens de ton Ăąge en robotique. Prochaines Ă©tapes : ajoute un suiveur de ligne (capteur IR), un Bluetooth HC-05 pour le contrĂŽler depuis ton tĂ©lĂ©phone, ou un Ă©cran OLED pour afficher les infos. Le monde est Ă toi.