Caméra à suivi de visage DIY pilotée par Arduino UNO
Composants et fournitures
| Arduino UNO | × | 1 |
| Webcam | × | 1 |
| Élastique | × | 1 |
| Alimentation secteur 9V 1A | × | 1 |
| Servomoteurs MG-90s | × | 2 |
| Prise jack 2,1 × 5,5 mm | × | 1 |
| Régulateur linéaire 7805 | × | 1 |
| Vis auto-taraudeuses M2 × 10 mm | × | 15 |
| Trombone | × | 1 |
| Kit fils de raccordement 22 AWG | × | 1 |
| Connecteur à broches (pin header) | × | 1 |
| LED 5 mm rouge | × | 1 |
| LED 5 mm verte | × | 1 |
| LED 5 mm jaune | >× | 1 |
| Résistance 220 Ω | × | 3 |
| Gaine thermorétractable | × | 1 |
Outils et machines nécessaires
- Dénudeur/coupe-fils 18-10 AWG
- Pince à long bec
- Fer à souder
- Multimètre
- Tournevis
- Imprimante 3D
Applications et services en ligne
Microsoft Windows 10
À propos du projet
Il y a quelques mois, j'ai modélisé et imprimé en 3D la tête d'un collègue pour le fun. J'ai trouvé drôle de pousser la blague en construisant un mécanisme pour cette tête qui détecte les personnes et continue de les fixer du regard pendant qu'elles se déplacent dans la pièce.
J'ai eu du mal à rendre le mécanisme assez petit pour tenir dans mon impression 3D. Au lieu d'abandonner le projet, j'ai décidé de créer un modèle facile à assembler avec un logiciel facile à utiliser pour que tout le monde puisse en profiter et l'améliorer.
Site web du projet : littlefrenchkev.com
Comment ça marche ?
La caméra bouge grâce à deux servomoteurs pilotés par un Arduino Uno. La caméra est branchée sur un ordinateur où un logiciel tente de détecter des visages dans les images reçues.
Si un visage est détecté, le logiciel envoie un message à l'Arduino pour déplacer la caméra afin de centrer le visage détecté dans l'image.
Si aucun visage n'est détecté, le logiciel envoie un message pour déplacer la caméra vers une position aléatoire.
Le logiciel est assez flexible avec des options : plages des servos modifiables, possibilité d'inverser la rotation, contrôle manuel.
J'ai aussi ajouté 3 LED indiquant l'état de la détection : rouge = pas de détection, jaune = visage détecté mais non centré, vert = visage détecté et centré. Ces LED peuvent facilement être remplacées par une action utile.
La communication entre l'Arduino et le logiciel se fait par liaison série (USB).
Le logiciel de détection faciale est écrit en Python. Tous les fichiers sont sur GitHub (attention : le code n'est pas parfait, j'apprends seul) ou réutilisables pour vos projets. Une version exécutable est aussi disponible sur mon site si Python n'est pas votre tasse de thé.
Pour construire le vôtre, consultez les vidéos suivantes, conçues pour être faciles à suivre.
Tout ce qu'il vous faut
Assemblage
Câblage
Logiciel et configuration
Code
Code Arduino
// Basé sur le travail de Robin2 sur le forum Arduino // https://forum.arduino.cc/index.php?topic=225329.msg1810764#msg1810764 #includeServo panServo; Servo tiltServo; byte redledPin = 2; byte yellowledPin = 3; byte greenledPin = 4; const byte buffSize = 40; char inputBuffer[buffSize]; const char startMarker = '<'; const char endMarker = '>'; byte bytesRecvd = 0; boolean readInProgress = false; boolean newDataFromPC = false; float panServoAngle = 90.0; float tiltServoAngle = 90.0; int LED_state = 0; void setup() { Serial.begin(115200); panServo.attach(8); tiltServo.attach(9); pinMode(redledPin, OUTPUT); pinMode(yellowledPin, OUTPUT); pinMode(greenledPin, OUTPUT); start_sequence(); delay(200); Serial.println(" "); } void loop() { getDataFromPC(); replyToPC(); moveServo(); setLED(); } void getDataFromPC() { if (Serial.available() > 0) { char x = Serial.read(); if (x == endMarker) { readInProgress = false; newDataFromPC = true; inputBuffer[bytesRecvd] = 0; processData(); } if (readInProgress) { inputBuffer[bytesRecvd] = x; bytesRecvd++; if (bytesRecvd == buffSize) bytesRecvd = buffSize - 1; } if (x == startMarker) { bytesRecvd = 0; readInProgress = true; } } } void processData() { char * strtokIndx = strtok(inputBuffer, ","); panServoAngle = atof(strtokIndx); strtokIndx = strtok(NULL, ","); tiltServoAngle = atof(strtokIndx); strtokIndx = strtok(NULL, ","); LED_state = atoi(strtokIndx); } void replyToPC() { if (newDataFromPC) { newDataFromPC = false; Serial.print("<"); Serial.print(panServo.read()); Serial.print(","); Serial.print(tiltServo.read()); Serial.println(">"); } } void moveServo() { panServo.write(panServoAngle); tiltServo.write(tiltServoAngle); } void setLED() { if (LED_state == 2) { digitalWrite(redledPin, LOW); digitalWrite(yellowledPin, HIGH); digitalWrite(greenledPin, LOW); } else if (LED_state == 1) { digitalWrite(redledPin, LOW); digitalWrite(yellowledPin, LOW); digitalWrite(greenledPin, HIGH); } else if (LED_state == 0) { digitalWrite(redledPin, HIGH); digitalWrite(yellowledPin, LOW); digitalWrite(greenledPin, LOW); } else if (LED_state == 3) { digitalWrite(redledPin, HIGH); digitalWrite(yellowledPin, HIGH); digitalWrite(greenledPin, HIGH); } else { digitalWrite(redledPin, LOW); digitalWrite(yellowledPin, LOW); digitalWrite(greenledPin, LOW); } } void start_sequence() { panServo.write(90); tiltServo.write(90); delay(300); digitalWrite(redledPin, HIGH); delay(100); digitalWrite(redledPin, LOW); digitalWrite(yellowledPin, HIGH); delay(100); digitalWrite(yellowledPin, LOW); digitalWrite(greenledPin, HIGH); delay(100); digitalWrite(redledPin, LOW); digitalWrite(yellowledPin, LOW); digitalWrite(greenledPin, LOW); delay(100); digitalWrite(redledPin, HIGH); digitalWrite(yellowledPin, HIGH); digitalWrite(greenledPin, HIGH); delay(100); digitalWrite(redledPin, LOW); digitalWrite(yellowledPin, LOW); digitalWrite(greenledPin, LOW); }
Logiciel de détection faciale
Dépôt GitHub avec les fichiers Python : github.com/LittleFrenchKev/face_tracking_camera. Version exécutable disponible sur le site web.
Pièces personnalisées et boîtiers
Tous les fichiers CAO pour imprimer les pièces de la caméra à suivi de visage : Site web ou Thingiverse.
Schémas
Schéma de câblage disponible (voir fichier joint).
Processus de fabrication
- Suivi de visage Pan/Tilt temps réel sur Raspberry Pi – Guide pratique
- Carte de Visite PCB Tic-Tac-Toe 4×4 Personnalisée – Guide de Conception, Fabrication et Programmation
- Système de Capteur de Température Multi-Position pour Intégration Domotique
- Contrôleur DIY pour fer à souder 862D+ — Précision et fiabilité
- MotionSense : Détection d'intrusion intelligente avec Arduino et ESP8266
- Prévention incendie imprimante 3D : Système de sécurité à capteur intelligent
- Créer une jauge IoT connectée au Web avec Arduino, Yaler et IFTTT
- Lévitation magnétique répulsive avec Arduino : circuit simple et guide DIY
- CoroFence : Détecteur Thermique Avancé PIR + Capteur Grid-EYE & IoT