Yeux ultrasoniques : matrice LED 8x8 interactive avec capteur de distance
Composants et fournitures
| Composant | Quantité |
|---|---|
| Capteur ultrason HC-SR04 (générique) | 2 |
| Arduino Nano R3 | 1 |
| Photorésistance (LDR) | 1 |
| Matrice LED 8x8 MAX7219 (Maxim Integrated) | 2 |
| Plaque d'essai demi-format | 1 |
| Fils de connexion (génériques) | 1 lot |
| Résistance 330 Ω | 1 |
Applications et services en ligne
- Arduino IDE
À propos du projet
Je voulais un projet original avec matrices LED 8x8 et capteurs ultrasoniques — quelque chose de différent des usages habituels, ludique et un peu espiègle.
Voici les UltrasonicEyes : placez-les dans un passage, ils « regardent » où sont les gens, clignent des yeux, et vous observent d'une façon amusante et légèrement flippante !
Matériel nécessaire
Les modules HC-SR04 détectent obstacles et mesurent la distance (3-4 m), idéal pour un salon ou bureau. Très bon marché (eBay).
Simples à câbler : 3-4 fils vers Arduino.
Les matrices LED 8x8 (MAX7219) sont chainables : une seule connectée à l'Arduino, la seconde en cascade. Interface SPI → 5 fils pour piloter les deux yeux.
IMPORTANT : Le code utilise le SPI hardware. Si vous n'utilisez pas un Nano, vérifiez quels sont les pins MOSI/SCK hardware sur votre carte et câblez en conséquence !
Arduino Nano (compatible) : petit, USB pour alimentation/programmation, assez de GPIO.
J'ai soudé sur plaque pastilles format demi-breadboard, mais je recommande de commencer sur breadboard (sans soudure, modifiable).
Derniers composants : LDR (photorésistance) pour détecter la lumière ambiante, résistance 330 Ω, fils breadboard (mâle-femelle, femelle-femelle).
Note : Couleurs de fils libres, mais bonne pratique : rouge/noir pour VCC/GND, autres couleurs pour signaux.
Assemblage pas à pas
1. Positionner le Nano
Enfichez le Nano au bout de la breadboard, port USB dépassant, toutes pins insérées.
2. Alimentation et masse
Fil noir : GND Nano → rail GND breadboard.
Fil rouge : 3,3V (ou 5V si seulement 5V dispo) Nano → rail VCC breadboard.
Reliez les deux rails GND entre eux (noir), idem pour VCC (rouge).
Note : certaines matrices LED exigent 5V. Si résultats instables, utilisez le 5V de l'Arduino.
3. Câbler les capteurs ultrasoniques
Noir : GND capteurs → rail GND. Rouge : VCC capteurs → rail VCC.
Fils signal :
- Blanc : TRIG capteur 1 → pin D2
- Bleu : ECHO capteur 1 → pin D3
- Blanc : TRIG capteur 2 → pin D4
- Bleu : ECHO capteur 2 → pin D5
4. Connecter les deux matrices LED 8x8
Noir : GND entrée matrice 1 → rail GND. Rouge : VCC entrée matrice 1 → rail VCC.
Chainage matrice 1 → matrice 2 :
- Noir : GND sortie matrice 1 → GND entrée matrice 2
- Rouge : VCC sortie matrice 1 → VCC entrée matrice 2
- Jaune : SCK sortie matrice 1 → SCK entrée matrice 2
- Bleu : MOSI sortie matrice 1 → MOSI entrée matrice 2
- Blanc : CS sortie matrice 1 → CS entrée matrice 2
Matrice 1 vers Arduino (SPI hardware) :
- Jaune : SCK entrée matrice 1 → pin D13 (SCK hardware)
- Bleu : MOSI entrée matrice 1 → pin D11 (MOSI hardware)
- Blanc : CS entrée matrice 1 → pin D10
RAPPEL : SPI hardware — vérifiez pins MOSI/SCK sur votre carte si ce n'est pas un Nano !
5. LDR + résistance (détection lumière ambiante)
Pourquoi ? Adapter la luminosité des matrices : ~30% la nuit (suffisant), 100% en plein jour.
- LDR sur deux rangées de la breadboard.
- Résistance 330 Ω entre une patte LDR et rail GND.
- Fil rouge : autre patte LDR → rail VCC.
- Fil marron : jonction LDR/résistance → pin A5 (analogique, lecture 0-255).
6. Alimentation et téléversement
Branchez l'USB, téléversez le sketch UltrasonicEyes ci-dessous. Passez devant les capteurs, bougez les mains — observez les yeux vous suivre et cligner !
Version permanente ?
Pour une version définitive : voir ma vidéo (soudure sur plaque pastilles) et imprimez les 2 parties du boîtier 3D. J'expérimente aussi un bouton tactile capacitif pour changer les formes d'yeux — suivez mes essais.
Autres projets/vidéos : unexpectedmaker.com
Suivez-moi : Twitter, Facebook, Instagram, Tindie
Soutien : Patreon
Code
Ultrasonic Eyes (C/C++)
#include <MD_MAX72xx.h> // Bibliothèque matrices LED - installez via gestionnaire bibliothèques
#include <NewPing.h> // Bibliothèque capteurs US - installez via gestionnaire bibliothèques
// Pins matrice LED (SPI hardware)
#define CS_PIN 10
#define MAX_DEVICES 2
#define LIGHT A5
MD_MAX72XX mx = MD_MAX72XX(CS_PIN, MAX_DEVICES);
// Pins capteurs US
#define t1 2; #define e1 3
#define t2 4; #define e2 5
#define maxDist 400
NewPing eyeR(t2, e2, maxDist);
NewPing eyeL(t1, e1, maxDist);
// États regard
// 0: devant, 1: droite, 2: gauche
int currentState = -1;
long duration1, duration2;
int distance1, distance2;
float nextBlink = millis() + 1000;
float lightAmount = 0;
// Patterns yeux (8x8)
uint8_t eye_forward[8] = {
0b00111100, 0b01000010, 0b01011010, 0b10101101,
0b10111101, 0b10011001, 0b01000010, 0b00111100
};
uint8_t eye_right[8] = {
0b00111100, 0b01000010, 0b01110010, 0b11011001,
0b11111001, 0b10110001, 0b01000010, 0b00111100
};
uint8_t eye_left[8] = {
0b00111100, 0b01000010, 0b01001110, 0b10010111,
0b10011111, 0b10001101, 0b01000010, 0b00111100
};
uint8_t eye_blink[8] = {
0b00000000, 0b00111100, 0b01111110, 0b11111111,
0b10111101, 0b11000011, 0b01111110, 0b00111100
};
void setup() {
mx.begin();
pinMode(t1, OUTPUT); pinMode(e1, INPUT);
pinMode(t2, OUTPUT); pinMode(e2, INPUT);
digitalWrite(t1, LOW); digitalWrite(t2, LOW);
pinMode(LIGHT, INPUT);
ShowEye_Forward();
currentState = 0;
}
void loop() {
// Lumière ambiante → intensité matrices
lightAmount = analogRead(LIGHT);
lightAmount = (lightAmount / 255.0) * MAX_INTENSITY;
mx.control(MD_MAX72XX::INTENSITY, lightAmount);
// Ping gauche (médiane 5 mesures)
distance1 = eyeL.ping_median(5);
delay(500); // Éviter interférences
distance2 = eyeR.ping_median(5);
// Clignement aléatoire
if (nextBlink < millis()) {
nextBlink = millis() + random(2000, 10000);
if (random(1, 13) <= 6) ShowEye_Blink_Dbl();
else ShowEye_Blink();
delay(250);
return;
}
// Déterminer direction regard
float diff = distance2 - distance1;
if (abs(diff) < 250 || (distance1 == 0 && distance2 == 0)) {
ShowEye_Forward(); currentState = 0;
} else if (distance2 < distance1 && distance1 > 0) {
ShowEye_Right(); currentState = 1;
} else if (distance1 < distance2 && distance2 > 0) {
ShowEye_Left(); currentState = 2;
}
delay(250);
}
// --- Fonctions d'affichage ---
void ShowEye_Right() {
mx.clear();
mx.control(MD_MAX72XX::INTENSITY, lightAmount);
for (uint8_t row = 0; row < 8; row++) {
mx.setColumn(row, eye_right[row]);
mx.setColumn(row + 8, eye_right[row]);
}
}
void ShowEye_Left() {
mx.clear();
mx.control(MD_MAX72XX::INTENSITY, lightAmount);
for (uint8_t row = 0; row < 8; row++) {
mx.setColumn(row, eye_left[row]);
mx.setColumn(row + 8, eye_left[row]);
}
}
void ShowEye_Forward() {
mx.clear();
mx.control(MD_MAX72XX::INTENSITY, lightAmount);
for (uint8_t row = 0; row < 8; row++) {
mx.setColumn(row, eye_forward[row]);
mx.setColumn(row + 8, eye_forward[row]);
}
}
void ShowEye_Blink() {
mx.clear();
mx.control(MD_MAX72XX::INTENSITY, lightAmount);
for (uint8_t row = 0; row < 8; row++) {
mx.setColumn(row, eye_blink[row]);
mx.setColumn(row + 8, eye_blink[row]);
}
delay(150);
if (currentState == 0) ShowEye_Forward();
else if (currentState == 1) ShowEye_Right();
else if (currentState == 2) ShowEye_Left();
}
void ShowEye_Blink_Dbl() {
mx.clear();
mx.control(MD_MAX72XX::INTENSITY, lightAmount);
for (uint8_t row = 0; row < 8; row++) {
mx.setColumn(row, eye_blink[row]);
mx.setColumn(row + 8, eye_blink[row]);
}
delay(75);
if (currentState == 0) ShowEye_Forward();
else if (currentState == 1) ShowEye_Right();
else if (currentState == 2) ShowEye_Left();
delay(75);
ShowEye_Blink();
}
Pièces personnalisées et boîtiers
Imprimables sur toute imprimante 3D, aucun réglage spécifique requis.
Schémas
Fichier Fritzing : ultrasoniceyes_final_Th84xpUyB2.fzz
Processus de fabrication
- Jeu UFO Attack DIY avec Arduino UNO et Afficheur MAX7219
- Stores intelligents : contrôle automatisé de la lumière avec Arduino et énergie solaire
- Horloge 3D RGB Arduclock – Montre LED Bluetooth avec horloge temps réel
- Surveillance de la Qualité de l'Eau : Système Arduino MKR1000 pour Rivières et Lacs
- Construire un Iron Man animé avec Arduino : capteurs, sons et relais
- Capteur d'obstacle IR simple avec Arduino — LED IR + Photodiode
- Jeu interactif joystick + LEDs avec Arduino
- Find Me : Localisateur d'objets intelligent avec Arduino et Bluetooth
- Contrôleur d'humidificateur DIY avec Arduino et relais – Installation haute tension sécurisée