Câmera de Rastreamento Facial DIY Alimentada por Arduino UNO
Componentes e Materiais
| Componente | Quantidade |
|---|---|
| Arduino UNO | 1 |
| Webcam | 1 |
| Elástico | 1 |
| Fonte de alimentação chaveada 9V 1A | 1 |
| Servos MG-90s | 2 |
| Plug jack 2.1*5.5mm | 1 |
| Regulador Linear (7805) | 1 |
| Parafusos auto-roscantes M2*10mm | 15 |
| Clipe de papel | 1 |
| Kit de fios 22 AWG | 1 |
| Header de pinos | 1 |
| LED 5 mm: Vermelho | 1 |
| LED 5 mm: Verde | 1 |
| LED 5 mm: Amarelo | 1 |
| Resistor 220 ohm | 3 |
| Tubo termorretrátil | 1 |
Ferramentas e Máquinas Necessárias
- Alicate de corte e desencapador 18-10 AWG
- Alicate de bico longo
- Ferro de solda (genérico)
- Multímetro
- Chave de fenda
- Impressora 3D (genérica)
Aplicativos e Serviços Online
- Microsoft Windows 10
Sobre o Projeto
Há alguns meses, modelei e imprimi a cabeça de um colega para diversão. Pensei que seria engraçado levar a brincadeira adiante e construir um mecanismo para esta cabeça que detecta pessoas e continua olhando para elas enquanto se movem pela sala.
Lutei para tornar o mecanismo pequeno o suficiente para caber na minha impressão 3D, então, em vez de guardar o projeto em um armário para sempre, decidi fazer um modelo fácil de montar com software fácil de usar para todos aproveitarem e expandirem.
Como Funciona?
A câmera se move usando dois servos acionados por um Arduino Uno. A câmera é conectada a um computador onde um software tenta encontrar rostos nas imagens recebidas da câmera.
Se um rosto for encontrado, o software enviará uma mensagem ao Arduino para mover a câmera de forma a colocar o rosto detectado no centro da imagem.
Se nenhum rosto for encontrado, o software enviará uma mensagem ao Arduino para movê-lo para uma posição aleatória.
Tentei tornar o software bastante flexível com opções como:
- alcances dos servos modificáveis
- possibilidade de inverter a rotação dos servos
- controle manual
Espero que isso torne fácil reutilizá-lo para outros propósitos.
Também adicionei 3 LEDs que mostram o estado da detecção: vermelho para nenhuma detecção, amarelo quando um rosto é detectado mas não no centro da imagem, e verde quando um rosto é detectado e está no centro da imagem.
Os LEDs por si só não são muito interessantes, mas deve ser fácil modificar o dispositivo para realizar uma ação útil em vez de apenas ligar e desligar algumas luzes.
A comunicação entre o Arduino e o software é feita através de comunicação serial (via USB).
O software de detecção facial foi escrito em Python. Deixei todos os arquivos Python no GitHub caso você queira dar uma olhada no código (aviso: provavelmente não é ótimo, estou aprendendo sozinho) ou reutilizá-los para seu próprio projeto.
Se Python não é sua praia, você também pode baixar a versão executável no meu site.
Se você quiser construir o seu próprio, confira os vídeos a seguir. Tentei torná-los o mais fáceis possível de seguir, espero ter feito um bom trabalho.
Tudo o que Você Precisa
Montagem
Fiação
Software e Configuração
Código
Código do Arduino
//Sketch baseado no trabalho feito por Robin2 no fórum do arduino
//mais info aqui
//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;
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);
}
Software de Detecção Facial
Aqui está o repositório onde você pode encontrar os arquivos para o software de detecção facial. Você também pode encontrar uma versão executável no meu site. GitHub
Peças Personalizadas e Gabinetes
Todas as peças necessárias para construir a câmera de rastreamento facial mini. Você também pode encontrá-las aqui: Site do autor ou no Thingiverse.
Esquemáticos
Diagrama de conexões da câmera de rastreamento facial.
Processo de manufatura
- Rastreamento Facial Pan/Tilt em Tempo Real no Raspberry Pi – Guia Prático
- Cartão de Visita PCB 4×4 Jogo da Velha Personalizado – Guia de Design, Montagem e Código
- Sistema Multi-Posição de Sensores de Temperatura para Integração em Casa Inteligente
- Controlador DIY para Ferro de Solda 862D+ — Precisão e Confiabilidade
- MotionSense: Detecção Inteligente de Intrusão com Arduino e ESP8266
- Prevenção de Incêndio em Impressoras 3D: Sistema de Segurança com Sensor Inteligente
- Crie um Medidor IoT Web com Arduino, Yaler e IFTTT
- Levitação Magnética Repulsiva com Arduino: Circuito Simples e Guia DIY
- Robô Garra Controlado Remotamente para Manipulação de Precisão
- CoroFence Detector Térmico: Sensor PIR Avançado & Integração IoT