📌 Aujourd’hui, je vais vous montrer comment fabriquer facilement un radar a ultrasons 📡, parfait pour détecter des obstacles et même mesurer une distance.
📌 Pour reproduire le projet, tu as besoin de
-  📟 1 Arduino (https://goo.gl/8NA8bb)
- đź”§ 1 module ultrason (https://goo.gl/TVvqQR)
- đź”§ 1 servomoteur (https://goo.gl/5uYWhn)
- 🔌 1 câble USB/Arduino
- 🔌 7 fils
Â
📌 Après avoir tĂ©lĂ©chargĂ© le logiciel pour programmer l’Arduino 📑 https://sup.yt/arduinosoftware, il va falloir envoyer le code ci-dessous dans la carte:
Code Arduino
/*
==============================================
RADAR ULTRASON SERVO (Arduino)
Envoie en série : "angle,distance."
Auteur : Marius Tech
==============================================
*/
// BIBLIOTHEQUE
#include <Servo.h>
// =====================================================
// ZONE A MODIFIER (si besoin) : CABLAGE / BROCHES
// =====================================================
// Capteur ultrason HC-SR04 (ou equivalent)
const int trigPin = 9; // Broche TRIG
const int echoPin = 10; // Broche ECHO
// Servo
const int servoPin = 3; // Broche signal du servo (PWM recommande)
// =====================================================
// Parametres
// =====================================================
long duration; // Duree de l’echo (microsecondes)
int distance; // Distance calculee (cm)
Servo myServo; // Objet servo
void setup() {
// Configuration des broches
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
// =====================================================
// ZONE A MODIFIER (rare) : vitesse serie
// Doit correspondre a Processing (ici 9600)
// =====================================================
Serial.begin(9600);
// Attache le servo a la broche choisie
myServo.attach(servoPin);
}
void loop() {
// =====================================================
// ZONE A MODIFIER : AMPLITUDE DE BALAYAGE
// (selon ton montage mecanique, evite de forcer le servo)
// =====================================================
const int angleMin = 15; // angle depart
const int angleMax = 165; // angle fin
// =====================================================
// ZONE A MODIFIER : vitesse de balayage
// Plus petit = plus rapide (mais plus bruite / moins stable)
// =====================================================
const int stepDelayMs = 30; // delai entre deux angles
// Balayage angleMin -> angleMax
for (int i = angleMin; i <= angleMax; i ) {
myServo.write(i);
delay(stepDelayMs);
distance = calculateDistance();
// Format attendu par Processing : angle,distance.
Serial.print(i);
Serial.print(",");
Serial.print(distance);
Serial.print(".");
}
// Balayage angleMax -> angleMin
for (int i = angleMax; i > angleMin; i--) {
myServo.write(i);
delay(stepDelayMs);
distance = calculateDistance();
Serial.print(i);
Serial.print(",");
Serial.print(distance);
Serial.print(".");
}
}
/*
Calcule la distance mesuree par le capteur ultrason.
Principe :
- On envoie une impulsion sur TRIG
- On mesure le temps de retour sur ECHO
- On convertit en cm
Retour :
- distance en centimetres (int)
*/
int calculateDistance() {
// S’assure que TRIG est bas
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
// Impulsion TRIG de 10 us
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
// Mesure du temps de retour (us)
duration = pulseIn(echoPin, HIGH);
// Conversion en cm (vitesse du son ~ 0.034 cm/us)
// divise par 2 car aller retour
distance = duration * 0.034 / 2;
return distance;
} Â
📌 Enfin il faut lancer l’interface graphique, après avoir tĂ©lĂ©chargĂ© le logiciel Processing 📑 https://sup.yt/processing, il va falloir envoyer le code ci-dessous dans la carte:
Code Processing
/*
==============================================
INTERFACE RADAR (Processing)
Lit le port serie : "angle,distance."
Auteur : Marius Tech
==============================================
*/
import processing.serial.*; // Communication serie
import java.awt.event.KeyEvent; // Evenements clavier (optionnel ici)
import java.io.IOException;
Serial myPort;
// Variables brutes recues
String angle = "";
String distance = "";
String data = "";
// Variables affichage / calcul
String noObject;
float pixsDistance;
int iAngle, iDistance;
int index1 = 0;
void setup() {
// =====================================================
// ZONE A MODIFIER : RESOLUTION FENETRE
// Mets ici la resolution de ton ecran (ou une fenetre plus petite)
// Exemples : 1366x768, 1920x1080, 2560x1440, etc.
// =====================================================
size(1920, 1080);
smooth();
// =====================================================
// ZONE A MODIFIER : PORT COM / PORT SERIE
// Windows : "COM4", "COM5", ...
// Linux : "/dev/ttyUSB0" ou "/dev/ttyACM0"
// macOS : "/dev/cu.usbmodemXXXX" ou "/dev/cu.usbserial-XXXX"
//
// Astuce : decommente printArray(Serial.list()); pour voir la liste.
// =====================================================
// printArray(Serial.list());
myPort = new Serial(this, "COM4", 9600);
// On lit jusqu’au caractere '.' (fin de trame)
myPort.bufferUntil('.');
}
void draw() {
// Couleur principale (vert “radar”)
fill(98, 245, 31);
// Effet de trainee (motion blur)
noStroke();
fill(0, 4);
rect(0, 0, width, height - height * 0.065);
fill(98, 245, 31);
drawRadar();
drawLine();
drawObject();
drawText();
}
/*
Appele automatiquement quand une trame complete est recue
(car on a bufferUntil('.')).
*/
void serialEvent(Serial myPort) {
// Lecture jusqu'a '.'
data = myPort.readStringUntil('.');
// Securite : si data est null, on sort
if (data == null) return;
// On enleve le '.' final
data = data.substring(0, data.length() - 1);
// Recherche de la virgule
index1 = data.indexOf(",");
// Securite : si pas de virgule, trame invalide
if (index1 == -1) return;
// Decoupe : "angle,distance"
angle = data.substring(0, index1);
distance = data.substring(index1 1);
// Conversion en entiers
iAngle = int(angle);
iDistance = int(distance);
}
void drawRadar() {
pushMatrix();
translate(width/2, height - height * 0.074);
noFill();
strokeWeight(2);
stroke(98, 245, 31);
// Arcs (distances)
arc(0, 0, (width - width * 0.0625), (width - width * 0.0625), PI, TWO_PI);
arc(0, 0, (width - width * 0.27), (width - width * 0.27), PI, TWO_PI);
arc(0, 0, (width - width * 0.479), (width - width * 0.479), PI, TWO_PI);
arc(0, 0, (width - width * 0.687), (width - width * 0.687), PI, TWO_PI);
// Lignes d’angle
line(-width/2, 0, width/2, 0);
line(0, 0, (-width/2)*cos(radians(30)), (-width/2)*sin(radians(30)));
line(0, 0, (-width/2)*cos(radians(60)), (-width/2)*sin(radians(60)));
line(0, 0, (-width/2)*cos(radians(90)), (-width/2)*sin(radians(90)));
line(0, 0, (-width/2)*cos(radians(120)), (-width/2)*sin(radians(120)));
line(0, 0, (-width/2)*cos(radians(150)), (-width/2)*sin(radians(150)));
popMatrix();
}
void drawObject() {
pushMatrix();
translate(width/2, height - height * 0.074);
strokeWeight(9);
stroke(255, 10, 10); // Rouge = objet detecte
// =====================================================
// ZONE A MODIFIER : PORTEE MAX D’AFFICHAGE (en cm)
// Le code original limite a 40 cm.
// =====================================================
int maxRangeCm = 40;
// Conversion cm -> pixels (echelle d’affichage)
pixsDistance = iDistance * ((height - height * 0.1666) * 0.025);
if (iDistance < maxRangeCm) {
// Trace l’objet a la position correspondant a l’angle et la distance
line(
pixsDistance * cos(radians(iAngle)),
-pixsDistance * sin(radians(iAngle)),
(width - width * 0.505) * cos(radians(iAngle)),
-(width - width * 0.505) * sin(radians(iAngle))
);
}
popMatrix();
}
void drawLine() {
pushMatrix();
strokeWeight(9);
stroke(30, 250, 60); // Vert clair = rayon radar
translate(width/2, height - height * 0.074);
// Ligne de balayage selon l’angle
line(0, 0,
(height - height * 0.12) * cos(radians(iAngle)),
-(height - height * 0.12) * sin(radians(iAngle))
);
popMatrix();
}
void drawText() {
pushMatrix();
// =====================================================
// ZONE A MODIFIER : PORTEE MAX D’AFFICHAGE (doit matcher drawObject)
// =====================================================
int maxRangeCm = 40;
if (iDistance > maxRangeCm) {
noObject = "Hors portee";
} else {
noObject = "Detecte";
}
// Bande noire en bas pour le texte
fill(0);
noStroke();
rect(0, height - height * 0.0648, width, height);
fill(98, 245, 31);
textSize(25);
// Graduations
text("10cm", width - width * 0.3854, height - height * 0.0833);
text("20cm", width - width * 0.281, height - height * 0.0833);
text("30cm", width - width * 0.177, height - height * 0.0833);
text("40cm", width - width * 0.0729, height - height * 0.0833);
textSize(40);
// Infos
text("Objet : " noObject, width - width * 0.875, height - height * 0.0277);
text("Angle : " iAngle " deg", width - width * 0.48, height - height * 0.0277);
text("Distance : ", width - width * 0.26, height - height * 0.0277);
if (iDistance < maxRangeCm) {
text(" " iDistance " cm", width - width * 0.225, height - height * 0.0277);
}
// Affichage des angles sur l’arc
textSize(25);
fill(98, 245, 60);
translate((width - width * 0.4994) width/2 * cos(radians(30)),
(height - height * 0.0907) - width/2 * sin(radians(30)));
rotate(-radians(-60));
text("30 deg", 0, 0);
resetMatrix();
translate((width - width * 0.503) width/2 * cos(radians(60)),
(height - height * 0.0888) - width/2 * sin(radians(60)));
rotate(-radians(-30));
text("60 deg", 0, 0);
resetMatrix();
translate((width - width * 0.507) width/2 * cos(radians(90)),
(height - height * 0.0833) - width/2 * sin(radians(90)));
rotate(radians(0));
text("90 deg", 0, 0);
resetMatrix();
translate(width - width * 0.513 width/2 * cos(radians(120)),
(height - height * 0.07129) - width/2 * sin(radians(120)));
rotate(radians(-30));
text("120 deg", 0, 0);
resetMatrix();
translate((width - width * 0.5104) width/2 * cos(radians(150)),
(height - height * 0.0574) - width/2 * sin(radians(150)));
rotate(radians(-60));
text("150 deg", 0, 0);
popMatrix();
}

merci
Avec plaisir !
Bonjour, merci beaucoup pour cette vidĂ©o, serait il possible d’avoir les deux codes en fichier a tĂ©lĂ©charger, car je n’arrive pas a les copier, pour rĂ©aliser votre montage, merci
Bonjour, j’ai bien installĂ© les 2 logiciels, Arduino marche très bien mais l’autre logiciel ne trouve pas « COM6 ». (bug au niveau de la 16 ligne)
Je n’arrive pas a rĂ©soudre ce problème. Je vous prie de m’aider.
Alexandre
AH NON !! J’ai juste fais un petite erreur, j’ai rĂ©ussi a le rĂ©soudre !
Bonne journée
comment tu résoudre ce problème Jai la même prob!
Bjr, j’ai un problème niveau processing. Dans le code processing lis les donnes du com4. Quand je change com 4 par com 6 (mon arduino ne marche que sur com6) j’obtiens  » error opening serial port COM6″ une solution? Je suis sous windows 7.
Bonjour je dĂ©bute dans ce domaine et j’ai un problème avec d’une part le servo moteur, il est très lent alors que j’ai recopiĂ© votre code, comment peut il aller aussi vite que sur la video? et d’autre part dans le deuxième code que reprĂ©sente le COM4 et y a t il des lignes de code Ă complĂ©ter?
merci
bonjour
j’utilise votre programme et dans processing, le port com4 n’est pas reconnu. Avez-vous une solution pour que mon système voit bien les infos arrivant sur mon port ?
Amitiés
Boujour,
Je souhaite reproduire le projet pour en faire une expĂ©rimentation sur l’eau
Je souhaite savoir si il ne faut que les logiciels demandĂ©s pour afficher l’interface graphique oĂą faut-il considerer d’autre logiciels car Ă chaque fois que je copie les partie du code processing progressivement. Un plantage apparaĂ®t alors que le code arduino de ma carte est televersĂ©
Pouvez vous m’aider
Appolo
Bonjour et merci pour votre tuto.
j’ai un souci avec processing, du cotĂ© de l’arduino pas de souci et j’ai rĂ©ussi a envoyer le code dans processing.
Le dessin du radar s’affiche bien mais il n’y a aucune interaction lorsque l’arduino est brancher en usb sur le pc.
Pourriez vous me dire d’oĂą pourrait venir le problème ?
Merci
bonjour serait-il possible d’avoir une explication pour chacun des deux codes nĂ©cessaires Ă l’expĂ©rience ?
j’ai du mal Ă comprendre toutes les manipulations effecutĂ©es…
merci d’avance !
Bonjour, j’ai mis votre programme dans processing sur mac et j’obtiens une erreur sur cette phrase:
myPort = new Serial(this, »COM4″, 9600); // starts the serial communication
voici le message d’erreur:
RuntimeException: Error opening serial port COM4: Port not found
RuntimeException: Error opening serial port COM4: Port not found
RuntimeException: Error opening serial port COM4: Port not found
comment puis je faire pour résoudre ce problème 🙂 svp?
Bonjour
Je ne comprend pas ou il faut mettre le deuxieme programme quand je le mets sous le premier il met : variable or field ‘serialEvent’ declared void.
Merci pour votre aide. Je suis retraitĂ© et j’essai d’apprendre cette nouvelle technologie
Super ! très utile.
merci
bonjour jai un probleme dans processing de port il me dit que le port n’existe pas
merci monseingeur
salut.
cela fonctionne très bien.
mais le pleine écran ne fonctionne pas ou il est coupé.
savez vous pourquoi?
Salut quand je lance le programme avec le processing pour voir le capteur sa me mets un écran gris pourrai tu m’aider stp ?
bonjour beaucoup de courage pour la suite.
problème avec processing
AIdez moi svp, comment changer le port com4 en port com5 sur le logicielsvp
ah non c bon
J’ai un problème de tĂ©lĂ©versement
merci bcp
Super ça marche très bien.
Attention quand même aux oublis ou erreurs dans le schéma de câblage:
*le servo est sur 5V et pas sur Vin.
*le 5V et GND du capteur ont été oubliés
Bravo et merci pour le code (ne pas oublier d’adapter le n° de COM pour son cas particulier dans le code processing).
De quel logiciel parlez vous au juste
Bonjour,
Pour tous ceux qui ont le problème avec le COM 4, il faut le changer en COM 3, car dans le montage de la vidéo, on relie le fil jaune au port 3 (il faut que le numéro de COM dans le programme du radar, à la ligne 18, soit le même que le numéro sur la carte auquel on a connecté le fil jaune).
Le code initial : myPort = new Serial(this, »COM4″, 9600); // starts the serial communication
Le code modifiĂ© Ă la ligne 18 : myPort = new Serial(this, »COM3″, 9600); // starts the serial communication