Kamera Pelacak Wajah DIY Ditenagai oleh Arduino UNO
Komponen dan Perlengkapan
| Arduino UNO | 1 |
| Webcam | 1 |
| Karet getah | 1 |
| Sumber Daya Tembok 9V 1A | 1 |
| Servo MG-90s | 2 |
| Plug jack 2.1*5.5mm | 1 |
| Regulator Linier (7805) | 1 |
| Sekrup self tapping M2*10mm | 15 |
| Paperclip | 1 |
| Kit Kabel Hook Up, 22 AWG | 1 |
| Pin header | 1 |
| LED 5 mm: Merah | 1 |
| LED 5 mm: Hijau | 1 |
| LED 5 mm: Kuning | 1 |
| Resistor 220 ohm | 3 |
| Tabur katup penyusut | 1 |
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
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:
- rentang servo yang dapat dimodifikasi
- kemungkinan untuk membalik rotasi servo
- kontrol manual
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