DIY Gezichtsvolgende Camera Aangedreven door Arduino UNO
Onderdelen en Benodigdheden
| Onderdeel | Aantal |
|---|---|
| Arduino UNO | 1 |
| Webcam (USB) | 1 |
| Rubberen band | 1 |
| 9V 1A Schakelende Netvoeding | 1 |
| MG-90S Servomotoren | 2 |
| 2.1×5.5mm DC jack stekker | 1 |
| Lineaire Spanningsregelaar (7805) | 1 |
| M2×10mm Zelfsnijgende Schroeven | 15 |
| Gepinde draad (paperclip) | 1 |
| Hook-up Wire Kit, 22 AWG | 1 |
| Pin header | 1 |
| 5mm LED: Rood | 1 | 5mm LED: Groen | 1 |
| 5mm LED: Geel | 1 |
| Weerstand 220 Ω | 3 |
| Krimpkous | 1 |
Benodigde Tools en Machines
- Draadstripper & Knijptang (18-10 AWG)
- Puntige tang
- Solderbout
- Multimeter
- Schroevendraaier
- 3D-printer
Apps en Online Services
- Microsoft Windows 10 (voor face detection software)
Over dit Project
De maker modeleerde en 3D-printte een collega's hoofd voor de grap, en besloot er een mechanisme aan toe te voegen dat mensen detecteert en blijft kijken terwijl ze door de kamer bewegen.
Hoe Werkt Het?
De camera beweegt met twee servomotoren aangedreven door een Arduino Uno. De webcam is aangesloten op een computer waar Python-software gezichten detecteert in de videostroom.
- Wordt een gezicht gedetecteerd? De software stuurt coördinaten naar de Arduino om de camera te centreren op het gezicht.
- Geen gezicht? De camera beweegt naar een willekeurige positie.
De software biedt flexibiliteit: instelbare servo-bereiken, inverseerbare rotatie, en handmatige controle. Drie LED's tonen de detectiestatus: Rood = geen detectie, Geel = gezicht gedetecteerd maar niet gecentreerd, Groen = gezicht gecentreerd. Communicatie verloopt via seriële USB-verbinding.
De face detection software is geschreven in Python. Broncode beschikbaar op GitHub. Er is ook een uitvoerbaar bestand beschikbaar op de website van de maker.
Bouwhandleiding
Beschikbare video's (Engels):
- Alles wat je nodig hebt
- Montage
- Bedrading
- Software en Setup
Code
Arduino Code (C/C++)
// Gebaseerd op werk van Robin2 (Arduino Forum)
#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: // Geel - gedetecteerd, niet gecentreerd
digitalWrite(redledPin, LOW);
digitalWrite(yellowledPin, HIGH);
digitalWrite(greenledPin, LOW);
break;
case 1: // Groen - gecentreerd
digitalWrite(redledPin, LOW);
digitalWrite(yellowledPin, LOW);
digitalWrite(greenledPin, HIGH);
break;
case 0: // Rood - geen detectie
digitalWrite(redledPin, HIGH);
digitalWrite(yellowledPin, LOW);
digitalWrite(greenledPin, LOW);
break;
case 3: // Alle aan
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);
// LED test sequentie
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);
}
Face Detection Software (Python)
Broncode en uitvoerbaar bestand: GitHub Repository en Website
Aangepaste Onderdelen (3D Print)
Alle benodigde 3D-print bestanden (STL) beschikbaar op Thingiverse en de website van de maker.
Schema
Elektrisch schema beschikbaar als afbeelding (pinout voor servos, LEDs, spanningsregelaar, en Arduino).
Productieproces
- Real-time Pan/Tilt gezichtsvolging op een Raspberry Pi – Praktische Gids
- Aangepaste 4×4 Boter-Kaas-Eieren Visitekaartje PCB – Ontwerp, Bouw en Code Handleiding
- Meerpositie-temperatuursensorsysteem voor slimme thuisintegratie
- DIY Soldeerbout-controller voor 862D+ — Precisie & Betrouwbaarheid
- MotionSense: Slimme inbraakdetectie met Arduino en ESP8266
- 3D-Printer Brandpreventie: Slimme Sensor Veiligheidssysteem
- Web-IoT Meter Bouwen met Arduino, Yaler en IFTTT
- Arduino-gebaseerde Afstotende Magnetische Levitatie: Eenvoudige Schakeling & DIY Handleiding
- Geavanceerde Remote-gecontrolleerde Gripper Robot voor Precisiehantering
- High-Performance Arduino Weerballon Datalogger
- CoroFence Thermische Detector: Geavanceerde PIR-sensor & IoT-integratie