DIY Gesichtserkennungs-Kamera mit Arduino UNO – Face-Tracking
Komponenten und Zubehör
| Komponente | Menge |
|---|---|
| Arduino UNO | 1 |
| Webcam | 1 |
| Gummiband | 1 |
| 9V 1A Netzteil (Hohlstecker 2,1×5,5 mm) | 1 |
| MG-90S Servomotoren | 2 |
| Lineare Spannungsregler 7805 (5V) | 1 |
| M2×10 mm Blechschrauben | 15 |
| Büroklammer | 1 |
| Draht 22 AWG | 1 Set |
| Stiftleisten (Pin Header) | 1 |
| LED 5 mm: Rot, Grün, Gelb | je 1 |
| Widerstand 220 Ω | 3 |
| Schrumpfschlauch | 1 |
Benötigte Werkzeuge
- Abisolierzange / Seitenschneider
- Flachzange
- Lötkolben
- Multimeter
- Schraubendreher
- 3D-Drucker
Apps und Online-Dienste
- Microsoft Windows 10 (für Python-Software)
Projektbeschreibung
Vor einigen Monaten habe ich den Kopf eines Kollegen modelliert und 3D-gedruckt – zum Spaß. Ich dachte, es wäre lustig, einen Mechanismus zu bauen, der Menschen erkennt und ihnen folgt, während sie sich im Raum bewegen.
Da der Mechanismus zu groß für den 3D-Druck wurde, entschied ich mich, ein einfach zu montierendes Modell mit benutzerfreundlicher Software für alle zu erstellen.
Funktionsweise
Die Kamera wird von zwei Servos bewegt, die vom Arduino Uno angesteuert werden. Die Kamera ist per USB mit einem Computer verbunden, auf dem eine Python-Software läuft, die Gesichter in den Kamerabildern erkennt.
- Wird ein Gesicht erkannt, sendet die Software Steuerbefehle an den Arduino, um das Gesicht im Bildzentrum zu halten.
- Wird kein Gesicht erkannt, bewegt sich die Kamera in eine zufällige Position.
Die Software bietet flexible Optionen:
- Einstellbare Servo-Bereiche
- Invertierbare Servo-Drehrichtung
- Manuelle Steuerung
Drei LEDs zeigen den Erkennungsstatus an:
- Rot: Keine Erkennung
- Gelb: Gesicht erkannt, aber nicht zentriert
- Grün: Gesicht erkannt und zentriert
Die Kommunikation erfolgt per Serial (USB). Die Gesichtserkennung wurde in Python geschrieben. Der Code ist auf GitHub verfügbar, alternativ gibt es eine ausführbare Version auf der Website.
Benötigte Teile
Siehe Komponentenliste oben.
Montage, Verdrahtung, Software-Setup
Detaillierte Anleitungen (Videos) sind auf der Projekt-Website verlinkt.
Programmcode
Arduino-Code (C/C++)
// Basiert auf Arbeit von Robin2 im Arduino-Forum
// https://forum.arduino.cc/index.php?topic=225329.msg1810764#msg1810764
#include
Servo 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() {
switch (LED_state) {
case 2: // Gelb - erkannt, nicht zentriert
digitalWrite(redledPin, LOW);
digitalWrite(yellowledPin, HIGH);
digitalWrite(greenledPin, LOW);
break;
case 1: // Grün - erkannt & zentriert
digitalWrite(redledPin, LOW);
digitalWrite(yellowledPin, LOW);
digitalWrite(greenledPin, HIGH);
break;
case 0: // Rot - keine Erkennung
digitalWrite(redledPin, HIGH);
digitalWrite(yellowledPin, LOW);
digitalWrite(greenledPin, LOW);
break;
case 3: // Alle an
digitalWrite(redledPin, HIGH);
digitalWrite(yellowledPin, HIGH);
digitalWrite(greenledPin, HIGH);
break;
default:
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);
}
Gesichtserkennungs-Software (Python)
Repository: GitHub – enthält Python-Quellcode und ausführbare Version.
3D-Druckdateien (CAD)
Alle Teile für die "Face Tracking Camera Mini" auf Website und Thingiverse.
Schaltplan

Herstellungsprozess
- Echtzeit Pan/Tilt Gesichtstracking auf Raspberry Pi – Praktischer Leitfaden
- Individuelle 4×4 Tic-Tac-Toe Visitenkarten-Platine – Design, Bau und Programmierung
- Multi-Position Temperatursensor-System für Smart-Home-Integration
- DIY Lötkolben-Controller für 862D+ – Präzision & Zuverlässigkeit
- MotionSense: Smarte Einbruchserkennung mit Arduino & ESP8266
- 3D-Drucker Brandschutz: Intelligentes Sensorsicherheitssystem
- Web-fähigen IoT-Messer mit Arduino, Yaler und IFTTT bauen
- Arduino-basierte abstoßende Magnetschwebung: Einfache Schaltung & DIY-Anleitung
- Fortgeschrittener ferngesteuerter Greifer-Roboter für präzises Handling
- CoroFence Thermaldetektor: PIR-Sensor & IoT-Integration mit Panasonic GridEye