Construire un scanner ultrasonique cartographique avec Arduino Yun – Guide pas à pas
Composants et fournitures
| Composant | Quantité |
|---|---|
| Arduino Yun | 1 |
| Capteur ultrasonique (HC-SR04 ou équivalent) | 1 |
| Servomoteur (Tower Pro MG996R) | 1 |
| Fils de connexion (genériques) | 10 |
Applications et services en ligne
- Arduino IDE
- MATLAB
À propos du projet
Étape 1 : Théorie
Ce projet utilise un capteur de distance ultrasonique. Il émet des ondes sonores au-delà de l'audition humaine et mesure la distance en calculant le temps mis par ces ondes pour heurter un obstacle et revenir. C'est le même principe que celui utilisé par les chauves-souris et les sonars marins.

L'autre composant est un servomoteur. Contrairement à un moteur CC classique, il peut tourner précisément à une position angulaire donnée et la maintenir. Lorsque des impulsions d'une durée spécifique lui sont envoyées, il se déplace à la position angulaire correspondante.

Nous utiliserons ces deux composants pour obtenir un champ de vision de 180 degrés pour notre robot.
Étape 2 : Rassembler le matériel
- Arduino Uno/Yun (toute carte au format Arduino convient)
- Shield de prototypage Arduino
- Capteur ultrasonique HC-04
- Servomoteur (j'ai utilisé le Tower Pro SG90 pour sa compacité)
- Côté logiciel : Arduino IDE pour téléverser le code de contrôle (rotation servo, lecture capteur, envoi série) ; MATLAB pour recevoir les données série, les traiter et les visualiser graphiquement.
Étape 3 : Assemblage mécanique

Avec un petit morceau de PCB à trous, réalisez un petit support pour le HC-04 et fixez-le sur un bras de servo avec du ruban double face.

Cette étape est optionnelle, mais pour rendre le système plus compact, j'ai aussi fixé le servo sur la partie saillante du shield de prototypage avec du ruban double face.

Le résultat final ressemble à l'abdomen de Wall-E.
Étape 4 : Le code Arduino
Le code Arduino contrôle le mouvement du servomoteur, la capture des mesures ultrasoniques et leur fréquence, et envoie les données sur le port série.
- Importer les bibliothèques
- Initialiser variables et broches
- Initialiser l'objet servo
- Initialiser la communication série
- Attendre 3 secondes
- Initialiser les compteurs à 0
- Rotater le servo de 1 degré
- Lire le capteur ultrasonique 10 fois (par défaut)
- Calculer la moyenne
- Envoyer la moyenne sur le port série
- Revenir à l'étape 7
Étape 5 : Le code MATLAB
Le code MATLAB gère davantage les données que le contrôle de la carte. Toutes les données du capteur sont envoyées sur le port série vers le PC, où MATLAB les lit.
Les données reçues de l'Arduino indiquent deux choses : l'angle de rotation du servo et la distance d'un obstacle dans cette direction. Nous avons donc des coordonnées polaires. Pour une visualisation compréhensible, il faut les convertir en coordonnées cartésiennes (X-Y).

Le code MATLAB fait exactement cela : il récupère les données série sur le port COM, les stocke dans une matrice avec l'angle de rotation, puis les convertit en coordonnées cartésiennes avec la formule ci-dessus.
Une fois fait, il affiche les points sur un graphique. J'ai placé le dispositif dans une boîte et obtenu le résultat suivant.

Étape 6 : Conclusion

Bien que le système ne soit pas parfait, il fait le travail. Il donne une estimation approximative de la largeur et de la longueur de la boîte et transmet les données avec précision.
Les seules erreurs observées proviennent des vibrations du capteur pendant le mouvement du servo et de lectures erronées du capteur lui-même.
Hormis cela, le système fonctionne bien et peut être utilisé pour des expériences de perception de profondeur ainsi que pour des projets de vision par ordinateur de base.
Code
- matlab_code_to_run_on_pc.m
- Code Arduino
Code MATLAB (à compiler et exécuter sur PC)
theta = 0:(pi/180):pi;
s = serial('COM10');
s.BaudRate = 9600;
fopen(s);
i = 0;
inc = 1;
while i < 180
A = fgets(s);
num(i+1) = str2num(A);
i = i+1;
end
fclose(s);
j = 1;
while j < 181
tab(j,1) = (j-1)*inc;
tab(j,2) = num(j);
tab(j,3) = num(j)*cosd((j-1)*inc);
tab(j,4) = num(j)*sind((j-1)*inc);
j = j+1;
end
% figure
% polar(theta,num)
plot(tab(:,3), tab(:,4));
Code Arduino (à téléverser sur Arduino Yun)
#include
#include
#define TRIGGER_PIN 12
#define ECHO_PIN 11
#define MAX_DISTANCE 200
NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE);
Servo myservo;
int pos = 0;
int it = 10;
void setup() {
myservo.attach(9);
Serial.begin(9600);
delay(3000);
}
void loop() {
int i = 0;
int t = 0;
int a = 0;
for (i = 0; i < 180; i++) {
unsigned int uS = sonar.ping();
myservo.write(i);
delay(20);
for (t = 0; t < it; t++) {
uS = sonar.ping();
a = uS/US_ROUNDTRIP_CM + a;
delay(30);
}
a = a / (it-1);
t = 0;
Serial.println(a);
a = 0;
}
}
Schémas
Fichier Fritzing pour connexions servo et capteur ultrasonique : YunConfig.fzz
Processus de fabrication
- Créer un système Ambilight spectaculaire pour moniteur avec Arduino
- Robot de détection humaine basé sur Arduino Uno : Intégration capteurs étape par étape
- Construire un dispositif de lévitation ultrasonique avec Arduino – Guide étape par étape
- FlickMote : Télécommande IR à gestes pour maison connectée
- Construire un Voltmètre Intelligent avec Arduino et Smartphone – Projet DIY Facile
- Moniteur de Fréquence Cardiaque IoT en Temps Réel avec Arduino et MAX30100
- Véhicule Télécommandé par Android avec Raspberry Pi et Shield Moteur
- Bocal Intelligent IoT avec ESP8266, Arduino et Capteur Ultrasonique – Surveillance Temps Réel
- Serveur Web Arduino Uno WiFi : Commander une LED via Navigateur