Robot de détection et de suivi des visages en temps réel avec Arduino
Vous avez toujours voulu construire un bras robotique ou un robot de reconnaissance de visage en utilisant Arduino et pas n'importe quelle autre programmation comme OpenCV, les bases visuelles C # etc? Alors lisez le long, dans ce projet nous allons mettre en œuvre la détection de visage en se fondant dans la puissance d'Arduino et Android. Dans ce projet, la caméra mobile se déplacera avec votre visage à l'aide de servos. L'avantage d'utiliser le téléphone portable Android ici est que vous n'avez pas besoin d'investir sur un module de caméra et le travail de détection d'image peut être fait dans le téléphone lui-même, vous n'avez pas besoin de votre Arduino connecté à votre ordinateur. Ici, nous avons utilisé le module Bluetooth avec Arduino pour communiquer sans fil avec Mobile.
L'application Android utilisée dans ce projet a été créée en utilisant Processing Android , vous pouvez soit installer directement l'application en téléchargeant le fichier APK (lire plus loin pour le lien) ou mettre votre cap programmation et faire votre propre application Android plus attrayante en utilisant le code Processing plus loin dans le tutoriel. En savoir plus sur le traitement en consultant nos précédents projets de traitement.
À la fin de ce tutoriel, vous aurez un bras robotique Mini Tilt et Span qui pourrait suivre votre visage et se déplacer avec elle. Vous pouvez l'utiliser (avec plus d'avancement) pour enregistrer vos vidéos vlog ou même prendre un selfie avec la caméra arrière de votre téléphone mobile, car il positionne votre visage exactement au centre de votre écran mobile. Alors!! Ça semble intéressant? Vérifiez la vidéo de démonstration à la fin de ce tutoriel pour le voir fonctionner. Voyons comment peut en le construire ...
J'ai fait de mon mieux pour que ce projet fonctionne le plus simplement possible, toute personne ayant un minimum de connaissances en matière de matériel ou de codage peut utiliser ces directives pour faire fonctionner ce projet en un rien de temps. Cependant, une fois que vous l'avez fait, je vous suggère de suivre les codes afin que vous puissiez vraiment savoir ce qui fait que cette chose fonctionne et comment.
Matériaux nécessaires:
- Arduino Nano
- Servomoteur SG90 - 2Nos
- Téléphone Android avec appareil photo décent
- Module Bluetooth HC-05 / HC-06
- Ordinateur pour la programmation
- Imprimante 3D (optionnelle)
- Batterie 9V
Impression 3D des pièces requises (facultatif):
Pour pouvoir faire pivoter et incliner notre téléphone portable, nous avons besoin de structures mécaniques comme un support mobile et quelques supports servo. Vous pouvez utiliser un carton pour en faire un, puisque j'ai une imprimante 3D, j'ai décidé d'imprimer ces pièces en 3D.
Si vous possédez ou avez accès à une imprimante 3D, vous pouvez utiliser les fichiers STL que vous pouvez télécharger ici pour les imprimer et les assembler directement. Toutefois, peu de pièces comme le support de téléphone mobile peuvent nécessiter des modifications en fonction des dimensions de votre téléphone. Je l'ai conçu pour mon téléphone portable MOTO G. J'ai utilisé une imprimante très basique pour imprimer toutes les pièces. L'imprimante est FABX v1 de 3ding qui vient à un prix abordable avec un volume d'impression de 10 cm3. Le prix bon marché vient avec un compromis avec une faible résolution d'impression et aucune carte SD ou fonction de reprise d'impression. J'utilise un logiciel appelé Cura pour imprimer les fichiers STL. Les paramètres que j'ai utilisés pour imprimer les matériaux sont donnés ci-dessous, vous pouvez les utiliser ou les modifier en fonction de votre imprimante.
Une fois que vous imprimez tous les matériaux requis, vous pouvez les fixer en utilisant des vis et de la colle chaude. Une fois l'assemblage terminé, il devrait ressembler à ceci:
Schéma et matériel:
Le circuit pour ce projet de suivi du visage sur Smart Phone est montré dans l'image ci-dessous:
Le circuit se compose de deux servomoteurs , dont un est utilisé pour déplacer le téléphone portable gauche / droite et l'autre est utilisé pour incliner le téléphone mobile haut / bas. La direction dans laquelle le servo doit se déplacer sera instruite par l'Arduino Nano qui reçoit lui-même des informations du module Bluetooth (HC-05) . L'ensemble du circuit est alimenté par une batterie 9V.
Ce circuit peut être connecté facilement sur votre planche à pain ou vous pouvez également les souder sur une petite planche Perf comme je l'ai fait ici.
Configuration de votre application Android:
Comme, je l'ai dit plus tôt le cerveau principal travaillant derrière ce projet est cette application Android. Cette application Android a été développée en utilisant le traitement Android . Vous pouvez directement installer cette application sur votre téléphone mobile et lancer celle-ci en suivant les étapes ci-dessous.
- Téléchargez le fichier APK d'ici .
- Mettez le circuit ci-dessus sous tension.
- Dans les paramètres de votre téléphone, recherchez le module Bluetooth nommé "HC-05"
- Si vous l'avez nommé quelque chose d'autre que "HC-05" changez-le en HC-05 puisque seulement alors l'application fonctionnera.
- Coupler avec votre module Bluetooth avec le mot de passe "1234" ou "0000".
- Maintenant, lancez l'application en mode portrait. Vous devriez voir l'écran de votre caméra et également "Connecté à: HC-05" en haut de votre écran.
- Essayez de déplacer votre caméra sur un visage et une boîte verte devrait apparaître sur le dessus et sa position sera également affichée dans le coin supérieur gauche de votre écran comme indiqué ci-dessous.
Vous pouvez prendre ce projet Arduino Face Tracking au niveau suivant en apportant beaucoup d'avancées pour lesquelles vous n'aurez pas besoin de coder votre propre application Android. Créer une application Android peut sembler difficile, mais croyez-moi avec l'aide de Processing, vous pouvez l'apprendre en un rien de temps. Le code de traitement complet utilisé pour construire cette application peut être téléchargé ici .
Programmation de votre Arduino:
L'application Android va détecter le visage et sa position sur l'écran; il va alors décider dans quelle direction il doit se déplacer en fonction de la position du visage pour que le visage arrive au centre de l'écran. Cette direction est ensuite envoyée à l'Arduino via le module Bluetooth.
Le programme Arduino pour ce projet est assez simple, il suffit de contrôler la direction des deux servomoteurs en fonction des valeurs reçues du module Bluetooth. Le code complet peut être trouvé à la fin de ce tutoriel, j'ai également expliqué quelques lignes importantes ci-dessous.
La ligne de code ci-dessous établit une connexion série avec les broches D12 comme RX et D11 comme TX. C'est pourquoi la broche D12 doit être connectée au TX du module BT et la broche D11 au RX du module BT.
SoftwareSerial cam_BT (12, 11); // RX, TX
Ensuite, nous avons initialisé le module Bluetooth à un débit de 9600 bauds. Assurez-vous que votre module fonctionne également sur la même vitesse de transmission. Sinon, changez-le en conséquence.
cam_BT.begin (9600); // démarre la communication Bluetooth à 9600 bauds de données cam_BT.println ("Commandes prêtes à prendre");
La ligne ci-dessous lit ce qui arrive via le module Bluetooth. Les données sont également enregistrées dans la variable "BluetoothData".
if (cam_BT.available ()) // Lire ce qui arrive via Bluetooth { BluetoothData = cam_BT.read (); Serial.print ("Entrant de BT:"); Serial.println (BluetoothData); }
Sur la base des données reçues de Bluetooth, la direction des moteurs est contrôlée. Pour faire tourner un moteur à gauche, le moteur diminue d'une valeur de 2 par rapport à sa position précédente. Vous pouvez augmenter cette valeur de 2 à 4 ou 6 si vous avez besoin du bras pour vous déplacer plus rapidement. Mais, il pourrait créer des saccades rendant la caméra instable.
if (BluetoothData == 49) // Tourne à gauche {pos1 + = 2; servo1.write (pos1);} if (BluetoothData == 50) // Tourner à droite {pos1- = 2; servo1.write (pos1);} if (BluetoothData == 51) // Turn Up {pos2- = 2; servo2.write (pos2);} if (BluetoothData == 52) // Turn Down {pos2 + = 2; servo2.write (pos2);}
Travail:
Une fois que nous sommes prêts avec notre matériel, le code et l'application Android, il est temps d'agir. Il suffit d'alimenter votre Arduino et d'ouvrir l'application Android. L'application se connectera automatiquement au module Bluetooth HC-05 (doit être nommé HC-05) et attendra la détection d'un visage. Il suffit de placer le téléphone dans notre support mobile et de s'asseoir en face de celui-ci. Vous devriez remarquer que vos servomoteurs déplacent votre téléphone pour que votre visage soit placé au centre de l'écran. Maintenant, déplacez-vous dans la portée de la caméra et votre téléphone mobile suivra vos mouvements. Vous pouvez également l'essayer en plaçant et en déplaçant une image.
Le fonctionnement complet du projet est montré dans la vidéo ci-dessous . Vous pouvez en construire beaucoup plus pour votre créativité, j'espère que vous avez apprécié le projet et que vous l'avez fait fonctionner. Si non, laissez vos commentaires dans la section des commentaires et je vais y répondre.
Consultez la section projets Arduino sur le site Web pour trouver plus de tels projets.
Code:
/ * Code Arduino pour le suivi du visage Arduino
* Codé par Circuitdigest.com
* Le 25-05-2017
* /
* Codé par Circuitdigest.com
* Le 25-05-2017
* /
/ * DETAILS DE CONNEXION
* Arduino D11 -> RX du module BT
* Arduino D12 -> Tx de BT
* Servo1 -> broche 3 de arduino Nano à pan
* Servo2 -> broche 5 de arduino Nano à incliner
* /
* Arduino D11 -> RX du module BT
* Arduino D12 -> Tx de BT
* Servo1 -> broche 3 de arduino Nano à pan
* Servo2 -> broche 5 de arduino Nano à incliner
* /
#include <Servo.h> // en-tête pour piloter les servomoteurs
#include <SoftwareSerial.h> // importer la librairie série
SoftwareSerial cam_BT (12, 11); // RX, TX
int ledpin = 13; // led sur D13 montrera blink on / off
int BluetoothData; // les données fournies par Computer
#include <SoftwareSerial.h> // importer la librairie série
SoftwareSerial cam_BT (12, 11); // RX, TX
int ledpin = 13; // led sur D13 montrera blink on / off
int BluetoothData; // les données fournies par Computer
// permet de déclarer les objets servo
Servo servo1;
Servo servo2;
Servo servo1;
Servo servo2;
long gmotor, gnum1, gnum2;
int pos;
drapeau int = 0;
int pos1 = 40;
int pos2 = 90;
int pos;
drapeau int = 0;
int pos1 = 40;
int pos2 = 90;
void setup () {
servo1.attach (3);
servo2.attach (5) ;;
servo1.attach (3);
servo2.attach (5) ;;
// ** Position initiale des quatre servomoteurs ** //
servo1.write (pos1);
servo2.write (pos2);
// ** initialisé ** //
cam_BT.begin (9600); // démarre la communication Bluetooth à 9600
bauds de données cam_BT.println ("Commandes prêtes à prendre");
servo1.write (pos1);
servo2.write (pos2);
// ** initialisé ** //
cam_BT.begin (9600); // démarre la communication Bluetooth à 9600
bauds de données cam_BT.println ("Commandes prêtes à prendre");
Serial.begin (57600);
Serial.println ("Programmation de suivi de visage par CircuitDigest.com");
}
Serial.println ("Programmation de suivi de visage par CircuitDigest.com");
}
// *** Fonction pour chaque action Servo ** //
appel vide (int moteur, int num1, int num2) // Les valeurs comme nombre de moteur, d'angle et d'angle sont reçues
{
Serial.println ("Valeurs de passage. .. ");
drapeau = 0;
interrupteur (moteur)
{
cas 1: // Pour moteur un
{
Serial.println ("Exécuter un moteur");
if (num1 <num2) // Rotation dans le sens des aiguilles d'une montre
{
for (pos = num1; pos <= num2; pos + = 1)
{
servo1.write (pos);
retard (20);
}
}
if (num1> num2) // Rotation sage anti-horaire
{
pour (pos = num1; pos> = num2; pos- = 1)
{
servo1.write (pos);
retard (20);
}
}
break;
}
appel vide (int moteur, int num1, int num2) // Les valeurs comme nombre de moteur, d'angle et d'angle sont reçues
{
Serial.println ("Valeurs de passage. .. ");
drapeau = 0;
interrupteur (moteur)
{
cas 1: // Pour moteur un
{
Serial.println ("Exécuter un moteur");
if (num1 <num2) // Rotation dans le sens des aiguilles d'une montre
{
for (pos = num1; pos <= num2; pos + = 1)
{
servo1.write (pos);
retard (20);
}
}
if (num1> num2) // Rotation sage anti-horaire
{
pour (pos = num1; pos> = num2; pos- = 1)
{
servo1.write (pos);
retard (20);
}
}
break;
}
//////// JUSTE DUPLICATE POUR D'AUTRES SERVOS ////
cas 2: // Pour le moteur 2
{
Serial.println ("Exécuter le moteur deux");
if (num1 <num2)
{
pour (pos = num1; pos <= num2; pos + = 1)
{
servo2.write (pos);
retard (20);
}
}
if (num1> num2)
{
pour (pos = num1; pos> = num2; pos- = 1)
{
servo2.write (pos);
retard (20);
}
}
break;
}
}
}
void loop () {
if (Serial.available ()> 0) // Lire ce qui arrive via Serial
{
gmotor = Serial.parseInt ();
Serial.print ("numéro sélectionné->");
Serial.print (gmotor);
Serial.print (",");
gnum1 = Serial.parseInt ();
Serial.print (gnum1);
Serial.print ("degré");
gnum2 = Serial.parseInt ();
Serial.print (gnum2);
Serial.println ("degré");
drapeau = 1;
}
if (cam_BT.available ()) // Lire ce qui arrive via Bluetooth
{
BluetoothData = cam_BT.read ();
Serial.print ("Entrant de BT:");
Serial.println (BluetoothData);
}
if (Serial.available ()> 0) // Lire ce qui arrive via Serial
{
gmotor = Serial.parseInt ();
Serial.print ("numéro sélectionné->");
Serial.print (gmotor);
Serial.print (",");
gnum1 = Serial.parseInt ();
Serial.print (gnum1);
Serial.print ("degré");
gnum2 = Serial.parseInt ();
Serial.print (gnum2);
Serial.println ("degré");
drapeau = 1;
}
if (cam_BT.available ()) // Lire ce qui arrive via Bluetooth
{
BluetoothData = cam_BT.read ();
Serial.print ("Entrant de BT:");
Serial.println (BluetoothData);
}
if (flag == 1)
appelle (gmotor, gnum1, gnum2); // appelle le moteur respectif pour l'action
appelle (gmotor, gnum1, gnum2); // appelle le moteur respectif pour l'action
if (BluetoothData == 49) // Tourne à gauche
{pos1 + = 2; servo1.write (pos1);}
{pos1 + = 2; servo1.write (pos1);}
if (BluetoothData == 50) // Tourner à droite
{pos1- = 2; servo1.write (pos1);}
{pos1- = 2; servo1.write (pos1);}
if (BluetoothData == 51) // Retourne
{pos2- = 2; servo2.write (pos2);}
{pos2- = 2; servo2.write (pos2);}
if (BluetoothData == 52) //
Diminue {pos2 + = 2; servo2.write (pos2);}
Diminue {pos2 + = 2; servo2.write (pos2);}
drapeau = 0;
BluetoothData = 0;
}
BluetoothData = 0;
}
Vidéo:
0 Commentaires