Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Manufacturing Technology >> Herstellungsprozess

DIY Gesichtserkennungs-Kamera mit Arduino UNO – Face-Tracking

Komponenten und Zubehör

KomponenteMenge
Arduino UNO1
Webcam1
Gummiband1
9V 1A Netzteil (Hohlstecker 2,1×5,5 mm)1
MG-90S Servomotoren2
Lineare Spannungsregler 7805 (5V)1
M2×10 mm Blechschrauben15
Büroklammer1
Draht 22 AWG1 Set
Stiftleisten (Pin Header)1
LED 5 mm: Rot, Grün, Gelbje 1
Widerstand 220 Ω3
Schrumpfschlauch1

Benötigte Werkzeuge

Apps und Online-Dienste

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.

Projekt-Website

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.

Die Software bietet flexible Optionen:

Drei LEDs zeigen den Erkennungsstatus an:

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

DIY Gesichtserkennungs-Kamera mit Arduino UNO – Face-Tracking

Herstellungsprozess

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