Manufaktur industri
Industri Internet of Things | bahan industri | Pemeliharaan dan Perbaikan Peralatan | Pemrograman industri |
home  MfgRobots >> Manufaktur industri >  >> Manufacturing Technology >> Proses manufaktur

Kamera Pelacak Wajah DIY Ditenagai oleh Arduino UNO

Komponen dan Perlengkapan

Arduino UNO1
Webcam1
Karet getah1
Sumber Daya Tembok 9V 1A1
Servo MG-90s2
Plug jack 2.1*5.5mm1
Regulator Linier (7805)1
Sekrup self tapping M2*10mm15
Paperclip1
Kit Kabel Hook Up, 22 AWG1
Pin header1
LED 5 mm: Merah1
LED 5 mm: Hijau1
LED 5 mm: Kuning1
Resistor 220 ohm3
Tabur katup penyusut1

Alat dan Mesin yang Diperlukan

Pengcolong & Pemotong Kabel, 18-10 AWG / 0.75-4mm² Kapasitas Kabel
Pencangkok, Hidung Panjang
Pengkol (umum)
Multimeter
Obeng
Printer 3D (umum)

Aplikasi dan Layanan Online

Microsoft Windows 10

Tentang Proyek Ini

Beberapa bulan lalu, saya memodelkan dan mencetak salah satu kepala rekan kerja saya untuk kesenangan. Saya pikir akan lucu untuk mendorong lelucon dan membangun mekanisme untuk kepala ini yang dapat mendeteksi orang dan terus menatap mereka saat mereka bergerak di ruangan.

Saya kesulitan membuat mekanisme cukup kecil untuk muat dalam cetakan 3D saya, jadi alih-alih mengunci proyek ini di lemari untuk selamanya dan melupakannya, saya memutuskan untuk membuat model yang mudah dirangka dengan perangkat lunak yang mudah digunakan untuk dinikmati dan dikembangkan oleh semua orang.

Kamera bergerak menggunakan dua servo yang dikontrol oleh Arduino Uno. Kamera dihubungkan ke komputer tempat perangkat lunak mencoba menemukan wajah dalam gambar yang diterima dari kamera.

Jika wajah ditemukan, perangkat lunak akan mengirim pesan ke Arduino untuk menggerakkan kamera agar wajah yang terdeteksi berada di tengah gambar.

Jika tidak ada wajah yang ditemukan, perangkat lunak akan mengirim pesan ke Arduino untuk menggerakkannya ke posisi acak.

Saya mencoba membuat perangkat lunak cukup fleksibel dengan opsi seperti:

Semoga ini akan memudahkan penggunaan ulang untuk tujuan lain.

Saya juga menambahkan 3 LED yang menunjukkan status deteksi, merah untuk tidak ada deteksi, kuning ketika wajah terdeteksi tetapi tidak di tengah gambar, dan hijau ketika wajah terdeteksi dan di tengah gambar.

LED tidak terlalu menarik sendiri tetapi seharusnya mudah untuk memodifikasi perangkat untuk melakukan tindakan yang berguna alih-alih hanya menyalakan dan mematikan beberapa lampu.

Komunikasi antara Arduino dan perangkat lunak dilakukan melalui komunikasi serial (via USB).

Perangkat lunak deteksi wajah ditulis dalam Python. Saya menyimpan semua file Python di GitHub jika Anda ingin melihat kode (peringatan: mungkin tidak bagus, saya sedang belajar sendiri) atau menggunakannya untuk proyek Anda sendiri.

Jika Python bukan jenis Anda, Anda juga dapat mengunduh versi executable di situs web saya.

Jika Anda ingin membuat sendiri, periksa video berikut. Saya mencoba membuatnya se mudah mungkin untuk diikuti, semoga saya melakukan pekerjaan yang baik.

Kode

Kode Arduino C/C++
// Sketsa berdasarkan karya Robin2 di forum arduino
// info lebih lanjut di sini
// https://forum.arduino.cc/index.php?topic=225329.msg1810764#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>"); // kirim pesan ke komputer
}

void loop() {
  getDataFromPC();
  replyToPC();
  moveServo();
  setLED();
}

void getDataFromPC() {
  // terima data dari PC dan simpan ke inputBuffer
  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;
  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);
}
Perangkat Lunak Deteksi Wajah

Ini adalah repositori tempat Anda dapat menemukan file untuk perangkat lunak deteksi wajah. Anda juga dapat menemukan versi executable di situs web saya. GitHub Repository

Bagian Kustom dan Kotak

Bagian kamera pelacak wajah

Semua bagian yang diperlukan untuk membangun kamera pelacak wajah mini. Anda juga dapat menemukannya di sini: Unduh file CAD atau di thingiverse.com.

Skematik

Kamera Pelacak Wajah DIY Ditenagai oleh Arduino UNO

Proses manufaktur

  1. Pelacakan Wajah Pan/Tilt Waktu Nyata pada Raspberry Pi – Panduan Praktis
  2. Panduan Desain, Pembuatan, dan Kode PCB Kartu Kunjungan Tic Tac Toe 4×4 Kustom
  3. Sistem Sensor Suhu Multi-Posisi untuk Integrasi Rumah Cerdas
  4. Pengontrol Pemoleng DIY untuk 862D+—Presisi & Keandalan
  5. MotionSense: Deteksi Intrusi Cerdas dengan Arduino & ESP8266
  6. Pencegahan Kebakaran Printer 3D: Sistem Keselamatan Sensor Cerdas
  7. Buat Pengukur IoT Aktif Web dengan Arduino, Yaler, dan IFTTT
  8. Levitasi Magnetik Repulsif Berbasis Arduino: Rangkaian Sederhana & Panduan DIY
  9. Robot Pegang Terdahalih Jarak Jauh Lanjut untuk Pengendalian Presisi
  10. Detektor Termal CoroFence: Sensor PIR Canggih & Integrasi IoT