Tentang proyek ini
Beberapa bulan yang lalu, saya membuat model dan mencetak salah satu kepala rekan saya untuk bersenang-senang. 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 sekitar ruangan.
Saya berjuang untuk membuat mekanismenya cukup kecil agar sesuai dengan cetakan 3D saya, jadi alih-alih mengunci proyek di lemari selamanya dan melupakannya, saya memutuskan untuk membuat model yang mudah dirakit dengan perangkat lunak yang mudah digunakan untuk dinikmati dan dibangun semua orang. .
...............https://www.littlefrenchkev.com/face-tracking-camera-mini.............
Bagaimana cara kerjanya?
Kamera bergerak menggunakan dua servo yang digerakkan oleh Arduino Uno. Kamera dicolokkan ke komputer tempat perangkat lunak mencoba menemukan wajah dalam gambar yang diterima dari kamera.
Jika wajah ditemukan, perangkat lunak akan mengirimkan pesan ke Arduino untuk membuat kamera bergerak agar wajah yang terdeteksi berada di tengah gambar.
Jika tidak ada wajah yang ditemukan, perangkat lunak akan mengirimkan pesan ke Arduino untuk memindahkannya ke posisi acak.
Saya mencoba membuat perangkat lunak ini cukup fleksibel dengan opsi seperti:
- rentang servo yang dapat dimodifikasi
- kemungkinan untuk membalikkan rotasi servos
- kontrol manual
Mudah-mudahan ini akan memudahkan untuk digunakan kembali untuk tujuan lain.
Saya juga menambahkan 3 LED yang menunjukkan status deteksi, merah untuk tidak terdeteksi, kuning ketika wajah terdeteksi tetapi tidak di tengah gambar, dan hijau ketika wajah terdeteksi dan di tengah gambar.
LED sendiri tidak terlalu menarik, tetapi seharusnya mudah untuk memodifikasi perangkat untuk melakukan tindakan yang berguna, bukan hanya menghidupkan dan mematikan beberapa lampu.
Komunikasi antara Arduino dan perangkat lunak dilakukan melalui komunikasi serial (melalui USB).
Perangkat lunak pendeteksi wajah ditulis dengan Python. Saya meninggalkan semua file Python di GitHub jika Anda ingin melihat kodenya (peringatan:ini mungkin tidak bagus, saya sedang belajar sendiri) atau menggunakannya kembali untuk proyek Anda sendiri.
Jika Python bukan milik Anda, Anda juga dapat mengunduh versi yang dapat dieksekusi di situs web saya.
Jika Anda ingin membuatnya sendiri, lihat video berikut. Saya mencoba membuatnya semudah mungkin untuk diikuti, saya harap saya melakukannya dengan baik.
Semua yang Anda butuhkan
Perakitan
Pengkabelan
Perangkat lunak dan penyiapan
Kode
Kode ArduinoC/C++
Ini adalah kode yang akan diupload ke arduino//Sketch berdasarkan pekerjaan yang dilakukan oleh Robin2 di forum arduino//info lebih lanjut di sini//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 byteRecvd =0;boolean readInProgress =false;boolean newDataFromPC =false;float panServoAngle =90.0;float tiltServoAngle =90.0;int LED_state =0;//8==============Dvoid setup() { Serial.begin(115200); panServo.attach(8); tiltServo.attach (9); pinMode(Pin merah, OUTPUT); pinMode (pin kuning, OUTPUT); pinMode(Pin hijau, OUTPUT); //pindahServo(); start_sequence(); penundaan (200); Serial.println(""); // kirim pesan ke komputer}//8==============Dvoid loop() { getDataFromPC(); balasanKePC(); pindahServo(); setLED();}//8==============Dvoid getDataFromPC() { // menerima data dari PC dan menyimpannya ke inputBuffer if(Serial.available()> 0) { char x =Serial.baca(); //baca karakter dari serial if (x ==endMarker) { //cari penanda akhir readInProgress =false; //jika ditemukan, set read in progress true (akan berhenti menambahkan byte baru ke buffer) newDataFromPC =true; // beri tahu arduino bahwa data baru tersedia inputBuffer[bytesRecvd] =0; //hapus input buffer processData(); // memproses data dalam buffer } if(readInProgress) { inputBuffer[bytesRecvd] =x; //mengisi buffer input dengan byte byteRecvd ++; //increment index if (bytesRecvd ==buffSize) { //ketika buffer penuh byteRecvd =buffSize - 1; //menyimpan spasi untuk penanda akhir } } if (x ==startMarker) { // mencari pembuat awal byteRecvd =0; // jika ditemukan, set byte yang diterima ke 0 readInProgress =true; // set read in progress true } }}//8==============Dvoid processData() // untuk tipe data "" { char * strtokIndx; // ini digunakan oleh strtok() sebagai indeks strtokIndx =strtok(inputBuffer,","); // dapatkan bagian pertama panServoAngle =atof(strtokIndx); // konversi bagian ini menjadi float strtokIndx =strtok(NULL,","); // dapatkan bagian kedua(ini berlanjut di mana panggilan sebelumnya dihentikan) tiltServoAngle =atof(strtokIndx); // konversi bagian ini menjadi float strtokIndx =strtok(NULL, ","); // dapatkan bagian terakhir LED_state =atoi(strtokIndx); // konversi bagian ini menjadi integer (string to int)}//8==============Dvoid replyToPC() { if (newDataFromPC) { newDataFromPC =false; Serial.print("<"); Serial.print(panServo.read()); Serial.print(","); Serial.print(tiltServo.read()); Serial.println(">"); }}//8==============Dvoid moveServo() { panServo.write(panServoAngle); tiltServo.write(tiltServoAngle);}void setLED(){ if(LED_state ==2){ digitalWrite(redledPin, LOW); digitalWrite(pin kuning, TINGGI); digitalWrite(Pin led hijau, RENDAH); } else if(LED_state ==1){ digitalWrite(redledPin, LOW); digitalWrite(pin kuning, RENDAH); digitalWrite(Pin led hijau, TINGGI); } else if(LED_state ==0){ digitalWrite(redledPin, HIGH); digitalWrite(pin kuning, RENDAH); digitalWrite(Pin led hijau, RENDAH); } else if(LED_state ==3){ digitalWrite(redledPin, HIGH); digitalWrite(pin kuning, TINGGI); digitalWrite(Pin led hijau, TINGGI); } else{ digitalWrite(redledPin, RENDAH); digitalWrite(pin kuning, RENDAH); digitalWrite(Pin led hijau, RENDAH); } }//8==============D void start_sequence() { panServo.write(90); tiltServo.write(90); penundaan (300); digitalWrite(redledPin, TINGGI); penundaan(100); digitalWrite(redledPin, RENDAH); digitalWrite(pin kuning, TINGGI); penundaan(100); digitalWrite(pin kuning, RENDAH); digitalWrite(Pin led hijau, TINGGI); penundaan(100); digitalWrite(redledPin, RENDAH); digitalWrite(pin kuning, RENDAH); digitalWrite(Pin led hijau, RENDAH); penundaan(100); digitalWrite(redledPin, TINGGI); digitalWrite(pin kuning, TINGGI); digitalWrite(Pin led hijau, TINGGI); penundaan(100); digitalWrite(redledPin, RENDAH); digitalWrite(pin kuning, RENDAH); digitalWrite(Pin led hijau, RENDAH); }
Perangkat lunak pendeteksi wajah
Berikut adalah repositori tempat Anda dapat menemukan file untuk perangkat lunak pendeteksi wajah. Anda juga dapat menemukan versi yang dapat dijalankan di situs web saya. https://github.com/LittleFrenchKev/face_tracking_camera Suku cadang dan penutup khusus
bagian kamera pelacak wajah
semua bagian yang diperlukan untuk membuat kamera pelacak wajah mini. Anda juga dapat menemukannya di sini:https://www.littlefrenchkev.com/downloadfile CAD di thingiverse.com Skema