Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Производственный процесс

DIY камера с распознаванием лиц на Arduino UNO — Face Tracking

Компоненты и материалы

Компонент Количество
Arduino UNO 1
Веб-камера (USB) 1
Резиновая лента (для крепления камеры) 1
Блок питания 9В 1А (DC jack 2.1×5.5 мм) 1
Сервоприводы MG-90S (металлические шестерни) 2
Линейный стабилизатор 7805 (5В) 1
Саморезы M2×10 мм 15
Обычная скрепка (для механизма) 1
Провода 22 AWG 1 набор
Pin header (разъёмы) 1
LED 5 мм: красный, зелёный, жёлтый по 1
Резисторы 220 Ом (для LED) 3
Термоусадочная трубка 1

Инструменты

Программное обеспечение

О проекте

Автор напечатал на 3D-принтере голову коллеги и решил добавить механизм, который следит за людьми в комнате. Получился компактный, легко собираемый робот-камера с открытым ПО.

Принцип работы

Сборка и настройка

  1. Детали: STL-файлы на сайте автора и Thingiverse.
  2. Сборка механики: см. видео на сайте.
  3. Схемотехника: см. раздел Schematics.
  4. Прошивка Arduino: загрузите скетч ниже.
  5. Python-софт: исходники на GitHub или готовый .exe на сайте автора.

Код Arduino (C++)

// Based on Robin2's Serial Input Basics
// https://forum.arduino.cc/index.php?topic=225329.msg1810764

#include <Servo.h>

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("<Hasta la vista baby>");
}

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: // Жёлтый — лицо есть, не в центре
      digitalWrite(redLedPin, LOW);
      digitalWrite(yellowLedPin, HIGH);
      digitalWrite(greenLedPin, LOW);
      break;
    case 1: // Зелёный — лицо в центре
      digitalWrite(redLedPin, LOW);
      digitalWrite(yellowLedPin, LOW);
      digitalWrite(greenLedPin, HIGH);
      break;
    case 0: // Красный — нет лица
      digitalWrite(redLedPin, HIGH);
      digitalWrite(yellowLedPin, LOW);
      digitalWrite(greenLedPin, LOW);
      break;
    case 3: // Все горят (тест/ошибка)
      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(greenLedPin, LOW);
  delay(100);
  digitalWrite(redLedPin, HIGH); digitalWrite(yellowLedPin, HIGH); digitalWrite(greenLedPin, HIGH);
  delay(100);
  digitalWrite(redLedPin, LOW); digitalWrite(yellowLedPin, LOW); digitalWrite(greenLedPin, LOW);
}

Python-софт (Face Detection)

Репозиторий: GitHub. Там же — исполняемый файл для Windows (не нужен Python). Использует OpenCV Haar Cascade или DNN для детекта лиц. Настраиваемые порты, скорость, инверсия осей.

3D-модели (CAD)

Все детали для печати: сайт автора / Thingiverse.

Схема подключения

В разделе Schematics (PNG). Основные связи:

Производственный процесс

  1. Практическое руководство: real-time панорамирование/наклон для отслеживания лиц на Raspberry Pi
  2. Визитка-PCB с игрой «Крестики-нолики» 4×4: руководство по проектированию, сборке и программированию
  3. Многопозиционная система датчиков температуры для интеграции в умный дом
  4. DIY-контроллер паяльника 862D+ — точность и надёжность
  5. MotionSense: умная система обнаружения проникновения на Arduino и ESP8266
  6. Пожарная безопасность 3D-принтера: умная система обнаружения дыма
  7. Веб-управляемый IoT-индикатор на Arduino, Yaler и IFTTT
  8. Магнитная левитация на отталкивании с Arduino: Простая схема и DIY-руководство
  9. Продвинутый дистанционно управляемый манипулятор-робот для точной работы
  10. CoroFence: термический детектор на GridEye + PIR с IoT