(→Mécanique) |
|||
(55 versions intermédiaires masquées) | |||
Ligne 1 : | Ligne 1 : | ||
{{avertissement}} | {{avertissement}} | ||
- | + | {{vidéo|numérovidéo = <videoflash type="mediaspip" num ="1">http://mediaspip.ptitdeb.infini.fr/IMG/mp4/camera-conf-ir-encoded.mp4|400|300</videoflash>}} | |
- | {{vidéo|numérovidéo = <videoflash type="mediaspip" num ="1">http://mediaspip.ptitdeb.infini.fr/IMG/mp4/ | + | |
Ligne 13 : | Ligne 12 : | ||
==Liste du matériel== | ==Liste du matériel== | ||
* [[Image:Servomoteur.jpg|50px]] Un [[servo-moteur]] | * [[Image:Servomoteur.jpg|50px]] Un [[servo-moteur]] | ||
+ | |||
* [[Image:Arduino_Diecimila.jpg|50px]] La carte [[Arduino]] Uno | * [[Image:Arduino_Diecimila.jpg|50px]] La carte [[Arduino]] Uno | ||
+ | |||
* [[Image:Arduino_Uno_logo.png|50px]] Le logiciel Arduino | * [[Image:Arduino_Uno_logo.png|50px]] Le logiciel Arduino | ||
+ | |||
* [[Image:Fils1.jpg|50px]] Du [[fil électrique]] (noir, rouge…) | * [[Image:Fils1.jpg|50px]] Du [[fil électrique]] (noir, rouge…) | ||
- | * [[Image:Ordi.jpg|50px]] Un [[ordinateur]] pour programmer | + | |
+ | * [[Image:Ordi.jpg|50px]] Un [[ordinateur]] pour programmer, avec interface Bluetooth | ||
+ | |||
* [[Image:DEL.png|50px]] Une [[diode infra-rouge]] comme marqueur | * [[Image:DEL.png|50px]] Une [[diode infra-rouge]] comme marqueur | ||
- | * Une caméra | + | |
- | * Du carton | + | * [[Image:camera.jpg|50px]] Une [[caméra USB]] |
+ | |||
+ | * [[Image:wiimote.jpg|50px]] Une [[wiimote]] pour capter l'infra-rouge | ||
+ | |||
+ | * [[Image:Carton.jpg|50px]] Du carton | ||
+ | |||
* Du scotch | * Du scotch | ||
- | |||
==Réalisation du projet== | ==Réalisation du projet== | ||
+ | |||
+ | Caméra de conférence, suivant un orateur automatiquement, avec une diode infra-rouge. | ||
+ | Voir le tutoriel suivant pour plus d'information sur les led : | ||
+ | [[http://www.wikidebrouillard.org/index.php/Les_Petits_D%C3%A9brouillards]] | ||
+ | |||
+ | Pour le branchement de la led : utiliser une petite plaque labdec (Breadboard), alimentée par une pile 5V. N'oubliez pas de mettre une résistance équivalent de 55 ohms avant la led infra-rouge. | ||
+ | |||
+ | Un exemple de branchement, avec l'utilisation d'un Arduino comme alimentation 5V : | ||
+ | |||
+ | [[Fichier:Branchement_led_infra.jpg|500px]] | ||
+ | |||
+ | Solution alternative : vous pouvez utiliser une télécommande, qui émet également en infra-rouge. | ||
===Mécanique=== | ===Mécanique=== | ||
- | Un capteur infra-rouge et la caméra destinée au film sont | + | Un capteur infra-rouge (la Wiimote) et la caméra destinée au film sont montés sur un même axe vertical, posés sur un plateau. |
+ | |||
Le plateau peut tourner à l'horizontal, motorisé par un servo-moteur. | Le plateau peut tourner à l'horizontal, motorisé par un servo-moteur. | ||
+ | |||
Celui-ci est contrôlé par la carte Arduino. | Celui-ci est contrôlé par la carte Arduino. | ||
- | + | ===Construction du boitier en carton=== | |
- | [[Fichier:schemaServo.jpg|500px]] | + | [[Image:Carton_construction.jpg|500px]] |
+ | |||
+ | La base du boîtier est une boîte en carton de 10cm de long sur 6cm de large sur 4cm de hauteur. Le servo-moteur est fixé depuis l’intérieur du carton, par le haut. Un disque en carton de 6cm de diamètre est alors fixé à l’extrémité du servo-moteur. Un support est alors posé sur ce disque, pour accueillir la webcam ainsi que la Wiimote. | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | '''Le Schéma''': | ||
+ | |||
+ | Le câblage du projet est simple, en effet, nous n'utilisons q'un servo-moteur : | ||
+ | * Le fil noir sur la masse (GND) | ||
+ | * Le fil rouge sur le 5 volt de l'Arduino | ||
+ | * Le fil jaune de commande sur la sortie PWM 9 | ||
+ | |||
+ | [[Fichier:schemaServo.jpg|500px]] | ||
===Logiciel=== | ===Logiciel=== | ||
- | L'image du capteur infra-rouge est interprétée sur un PC : Le programme recherche | + | L'image du capteur infra-rouge est interprétée sur un PC : Le programme y recherche la diode infra-rouge, et commande le moteur pour la centrer horizontalement. |
+ | |||
+ | |||
+ | Le logiciel utilisé pour programmer l'Arduino se télécharge avec [http://arduino.cc/en/Main/Software ce lien] | ||
+ | |||
+ | |||
+ | Dans ce logiciel, il faut renseigner le code suivant, qui correspond au code Arduino du projet. | ||
+ | |||
+ | Le fichier est découpé en trois parties : | ||
+ | * Les fonctions setup et loop propres à Arduino, qui permettent dans ce projet de mettre en place la liaison série USB, ainsi que d'attacher le servo-moteur au pin 9 de l'Arduino. La fonction loop est dédiée à la réception et à l'interprétation de messages reçus depuis le port série. | ||
+ | * Une deuxième partie, qui gère l'envoi et la réception des messages grâce à la liaison série. | ||
+ | * Une troisième partie, qui permet la commande du servo-moteur. | ||
+ | |||
+ | Ainsi, nous donnons la possibilité de contrôler le servo-moteur par la liaison série. | ||
+ | |||
<u>Code Arduino</u> | <u>Code Arduino</u> | ||
Ligne 49 : | Ligne 101 : | ||
#define TEMPS 550 | #define TEMPS 550 | ||
- | // | + | //On créer un objet servo pour controler le servomoteur |
Servo myservo; | Servo myservo; | ||
Ligne 75 : | Ligne 127 : | ||
//On détermine la commande | //On détermine la commande | ||
String commande = recu.substring(0,3); | String commande = recu.substring(0,3); | ||
- | |||
- | |||
//On détermine le paramètre | //On détermine le paramètre | ||
String parametre = recu.substring(3); | String parametre = recu.substring(3); | ||
- | |||
- | |||
//Si la commande est ADD | //Si la commande est ADD | ||
if(commande == "ADD") | if(commande == "ADD") | ||
{ | { | ||
- | //On | + | //On récupère le paramètre |
int par = parametre.toInt(); | int par = parametre.toInt(); | ||
Ligne 96 : | Ligne 144 : | ||
else if(commande == "SUB") | else if(commande == "SUB") | ||
{ | { | ||
- | //On | + | //On récupère le paramètre |
int par = parametre.toInt(); | int par = parametre.toInt(); | ||
Ligne 106 : | Ligne 154 : | ||
else if(commande == "SET") | else if(commande == "SET") | ||
{ | { | ||
- | //On | + | //On récupère le paramètre |
int par = parametre.toInt(); | int par = parametre.toInt(); | ||
Ligne 116 : | Ligne 164 : | ||
else if(commande == "GET") | else if(commande == "GET") | ||
{ | { | ||
- | //On | + | //On envoi l'angle du servo moteur |
envoyer(String(getAngle())); | envoyer(String(getAngle())); | ||
} | } | ||
Ligne 126 : | Ligne 174 : | ||
String recevoir() | String recevoir() | ||
{ | { | ||
- | //On | + | //On créer la chaine de charactère pour recevoir un message |
char test[20]; | char test[20]; | ||
Ligne 144 : | Ligne 192 : | ||
- | ///// Partie commande | + | ///// Partie commande servoMoteur |
// pour avoir la position actuelle | // pour avoir la position actuelle | ||
Ligne 156 : | Ligne 204 : | ||
{ // qui prend en paramètre d'entrée l'angle, et qui met le servo à cette angle. | { // qui prend en paramètre d'entrée l'angle, et qui met le servo à cette angle. | ||
myservo.write(angle); | myservo.write(angle); | ||
- | delay(TEMPS); | + | delay(TEMPS / (181 - (angle))); |
} | } | ||
Ligne 163 : | Ligne 211 : | ||
{ | { | ||
if((myservo.read()+angle) >= 172) | if((myservo.read()+angle) >= 172) | ||
- | set(172);// valeur de butée pour ne pas | + | set(172);// valeur de butée pour ne pas forcer sur le moteur. |
else | else | ||
set(angle+myservo.read()); | set(angle+myservo.read()); | ||
Ligne 193 : | Ligne 241 : | ||
set(180); | set(180); | ||
} | } | ||
- | |||
</pre> | </pre> | ||
- | |||
+ | <u>Code Python du projet </u> | ||
+ | |||
+ | Ce script Python utilise la Wiimote pour détecter la led infra-rouge. La Wiimote dispose d'une caméra IR d'une résolution de 1024*768, et renvoie les coordonnées de 4 points au maximum. | ||
+ | |||
+ | Tout d'abord, on passe la Wiimote en mode de synchronisation, en pressant simultanément les bouton 1 et 2. On lance ensuite le script, la Wiimote se connecte alors en Bluetooth. | ||
+ | |||
+ | Lors de l’exécution du script, celui-ci récupère les coordonnées de tous les points détectés, et effectue la moyenne de ces dernières. Puis, il agit en conséquence : si le point moyen est sur le tiers gauche, on dit au servomoteur de tourner dans la direction adéquate. Si le point est dans la zone droite, le servomoteur tourne dans le sens inverse. | ||
+ | |||
+ | |||
+ | <u>main.py</u> | ||
<pre> | <pre> | ||
+ | |||
#encoding:utf-8 | #encoding:utf-8 | ||
import serial #port serie afin d'envoyer les instructions a l'arduino | import serial #port serie afin d'envoyer les instructions a l'arduino | ||
import cwiid #libraire pour la wiimote | import cwiid #libraire pour la wiimote | ||
- | + | import time | |
+ | ser = serial.Serial("/dev/ttyACM0") | ||
WIDTH=1024 #largeur de la camera de la wiimote | WIDTH=1024 #largeur de la camera de la wiimote | ||
WIIMOTE_MAC = "E0:0C:7F:88:99:F9" #code de la wiimote | WIIMOTE_MAC = "E0:0C:7F:88:99:F9" #code de la wiimote | ||
- | |||
print("We are now pairing the wii remote, please, presse 1 and 2 button...") | print("We are now pairing the wii remote, please, presse 1 and 2 button...") | ||
Ligne 216 : | Ligne 273 : | ||
except RuntimeError: #en cas d'échec un message est affiché | except RuntimeError: #en cas d'échec un message est affiché | ||
print("Error will pairing wii remote, is blutooth on ?") | print("Error will pairing wii remote, is blutooth on ?") | ||
- | quit() | + | quit() #et on quit |
else: | else: | ||
print("Pairing succes") | print("Pairing succes") | ||
wm.led = 5 | wm.led = 5 | ||
wm.rpt_mode = cwiid.RPT_IR #on active la récupération des info IR | wm.rpt_mode = cwiid.RPT_IR #on active la récupération des info IR | ||
- | + | lastUpdate=time.clock() | |
while(True): #boucle infinie | while(True): #boucle infinie | ||
x=0 #les coordonnée | x=0 #les coordonnée | ||
Ligne 227 : | Ligne 284 : | ||
s=0 #le nombre de points trouvé | s=0 #le nombre de points trouvé | ||
for dot in wm.state['ir_src']: #on récupére les points détécté par la wiimote | for dot in wm.state['ir_src']: #on récupére les points détécté par la wiimote | ||
+ | print(dot) | ||
if dot != None: | if dot != None: | ||
x += dot["pos"][0] | x += dot["pos"][0] | ||
y += dot["pos"][1] | y += dot["pos"][1] | ||
s+=1 | s+=1 | ||
- | if s: #si l'on a recu un point | + | |
+ | if s and (time.clock()-lastUpdate)>=0.001: #si l'on a recu un point | ||
x/=s #on moyenne les coordonée | x/=s #on moyenne les coordonée | ||
y/=s | y/=s | ||
- | if x < | + | if x <(1.0/3)*WIDTH: #si la coordonée est dans le 1/3 gauche, on diminue l'angle |
- | + | ser.write("SUB2\n".encode("ascii")) | |
print("SUB !!!") | print("SUB !!!") | ||
elif x >= (2.0/3)*WIDTH:#si on est dans le 1/3 droit on augmente l'angle | elif x >= (2.0/3)*WIDTH:#si on est dans le 1/3 droit on augmente l'angle | ||
- | + | ser.write("ADD2\n".encode("ascii")) | |
print("ADD !!!") | print("ADD !!!") | ||
+ | |||
+ | lastUpdate=time.clock() | ||
+ | </pre> | ||
- | |||
- | |||
Ce logiciel à les dépendences suivantes : | Ce logiciel à les dépendences suivantes : | ||
- | + | python-cwiid | |
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
+ | Installation des dépendences (sous Linux) : | ||
+ | sudo apt-get install python-cwiid | ||
+ | Execution ( dans le terminal) : | ||
+ | python2.7 main.py | ||
==Liens avec d'autres projets arduino== | ==Liens avec d'autres projets arduino== | ||
- | + | Chercher ici : http://wikidebrouillard.org/index.php/Catégorie:Arduino | |
==Pour aller plus loin== | ==Pour aller plus loin== | ||
+ | Avec ce même principe, il est possible de réaliser un tableau numérique : la Wiimote est orientée vers le tableau, et la led infra-rouge est placée sur un stylo. Le stylo comporte un bouton permettant d'allumer/éteindre la led IR. Il suffit alors de récupérer la position de la diode lorsqu'elle est allumée, et de dessiner à l'écran en conséquence. | ||
==Liens avec le quotidien== | ==Liens avec le quotidien== |
Sommaire |
Objectif : Caméra de conférence, suivant un orateur automatiquement. Une caméra, montée sur un support rotatif motorisé, suit une DEL infra-rouge portée par l'orateur.
Caméra de conférence, suivant un orateur automatiquement, avec une diode infra-rouge. Voir le tutoriel suivant pour plus d'information sur les led : [[1]]
Pour le branchement de la led : utiliser une petite plaque labdec (Breadboard), alimentée par une pile 5V. N'oubliez pas de mettre une résistance équivalent de 55 ohms avant la led infra-rouge.
Un exemple de branchement, avec l'utilisation d'un Arduino comme alimentation 5V :
Solution alternative : vous pouvez utiliser une télécommande, qui émet également en infra-rouge.
Un capteur infra-rouge (la Wiimote) et la caméra destinée au film sont montés sur un même axe vertical, posés sur un plateau.
Le plateau peut tourner à l'horizontal, motorisé par un servo-moteur.
Celui-ci est contrôlé par la carte Arduino.
La base du boîtier est une boîte en carton de 10cm de long sur 6cm de large sur 4cm de hauteur. Le servo-moteur est fixé depuis l’intérieur du carton, par le haut. Un disque en carton de 6cm de diamètre est alors fixé à l’extrémité du servo-moteur. Un support est alors posé sur ce disque, pour accueillir la webcam ainsi que la Wiimote.
Le Schéma:
Le câblage du projet est simple, en effet, nous n'utilisons q'un servo-moteur :
L'image du capteur infra-rouge est interprétée sur un PC : Le programme y recherche la diode infra-rouge, et commande le moteur pour la centrer horizontalement.
Le logiciel utilisé pour programmer l'Arduino se télécharge avec ce lien
Dans ce logiciel, il faut renseigner le code suivant, qui correspond au code Arduino du projet.
Le fichier est découpé en trois parties :
Ainsi, nous donnons la possibilité de contrôler le servo-moteur par la liaison série.
Code Arduino
#include <Servo.h> //Permet d'attendre que le servomoteur finisse sont mouvement #define TEMPS 550 //On créer un objet servo pour controler le servomoteur Servo myservo; void setup() { //On initialise la liaison série Serial.begin(9600); //On attache le pin 9 au servomorteur myservo.attach(9); //On met le servomoteur à 90° par défault reset90(); } void loop() { //Si il y a une connexion série if(Serial.available()) { //On recoit la trame String recu = recevoir(); //On détermine la commande String commande = recu.substring(0,3); //On détermine le paramètre String parametre = recu.substring(3); //Si la commande est ADD if(commande == "ADD") { //On récupère le paramètre int par = parametre.toInt(); //On ajoute l'angle passé en paramètre add(par); } //Si la commande est SUB else if(commande == "SUB") { //On récupère le paramètre int par = parametre.toInt(); //On soustrait l'angle passé en paramètre sub(par); } //Si la commande est SET else if(commande == "SET") { //On récupère le paramètre int par = parametre.toInt(); //On impose l'angle passé en paramètre set(par); } //Si la commande est GET else if(commande == "GET") { //On envoi l'angle du servo moteur envoyer(String(getAngle())); } } } ///// Partie Liaison série //Fonction qui permet de recevoir des string String recevoir() { //On créer la chaine de charactère pour recevoir un message char test[20]; //On recois le message int recus = Serial.readBytesUntil('\n', test, 20); //On convertit le tableau en string et on la retourne return String(test); } //Fonction qui permet d'envoyer des string void envoyer(String env) { //On envoie le message Serial.println(env); } ///// Partie commande servoMoteur // pour avoir la position actuelle int getAngle() { return myservo.read(); // myservo.read() renvoit l'angle du servo. } // fonction set int set(int angle) { // qui prend en paramètre d'entrée l'angle, et qui met le servo à cette angle. myservo.write(angle); delay(TEMPS / (181 - (angle))); } //fonction add int add(int angle) { if((myservo.read()+angle) >= 172) set(172);// valeur de butée pour ne pas forcer sur le moteur. else set(angle+myservo.read()); } //fonction sub int sub(int angle) { if((myservo.read()-angle) < 0) set(0); // on fixe l'angle à 0. else set(myservo.read()-angle); } //fonction reset90 int reset90() { set(90); } //fonction reset0 int reset0() { set(0); } //fonction reset180 int reset180() { set(180); }
Code Python du projet
Ce script Python utilise la Wiimote pour détecter la led infra-rouge. La Wiimote dispose d'une caméra IR d'une résolution de 1024*768, et renvoie les coordonnées de 4 points au maximum.
Tout d'abord, on passe la Wiimote en mode de synchronisation, en pressant simultanément les bouton 1 et 2. On lance ensuite le script, la Wiimote se connecte alors en Bluetooth.
Lors de l’exécution du script, celui-ci récupère les coordonnées de tous les points détectés, et effectue la moyenne de ces dernières. Puis, il agit en conséquence : si le point moyen est sur le tiers gauche, on dit au servomoteur de tourner dans la direction adéquate. Si le point est dans la zone droite, le servomoteur tourne dans le sens inverse.
main.py
#encoding:utf-8 import serial #port serie afin d'envoyer les instructions a l'arduino import cwiid #libraire pour la wiimote import time ser = serial.Serial("/dev/ttyACM0") WIDTH=1024 #largeur de la camera de la wiimote WIIMOTE_MAC = "E0:0C:7F:88:99:F9" #code de la wiimote print("We are now pairing the wii remote, please, presse 1 and 2 button...") try: wm = cwiid.Wiimote(WIIMOTE_MAC) #on apaire la wiimote except RuntimeError: #en cas d'échec un message est affiché print("Error will pairing wii remote, is blutooth on ?") quit() #et on quit else: print("Pairing succes") wm.led = 5 wm.rpt_mode = cwiid.RPT_IR #on active la récupération des info IR lastUpdate=time.clock() while(True): #boucle infinie x=0 #les coordonnée y=0 s=0 #le nombre de points trouvé for dot in wm.state['ir_src']: #on récupére les points détécté par la wiimote print(dot) if dot != None: x += dot["pos"][0] y += dot["pos"][1] s+=1 if s and (time.clock()-lastUpdate)>=0.001: #si l'on a recu un point x/=s #on moyenne les coordonée y/=s if x <(1.0/3)*WIDTH: #si la coordonée est dans le 1/3 gauche, on diminue l'angle ser.write("SUB2\n".encode("ascii")) print("SUB !!!") elif x >= (2.0/3)*WIDTH:#si on est dans le 1/3 droit on augmente l'angle ser.write("ADD2\n".encode("ascii")) print("ADD !!!") lastUpdate=time.clock()
Ce logiciel à les dépendences suivantes :
python-cwiid
Installation des dépendences (sous Linux) :
sudo apt-get install python-cwiid
Execution ( dans le terminal) :
python2.7 main.py
Chercher ici : http://wikidebrouillard.org/index.php/Catégorie:Arduino
Avec ce même principe, il est possible de réaliser un tableau numérique : la Wiimote est orientée vers le tableau, et la led infra-rouge est placée sur un stylo. Le stylo comporte un bouton permettant d'allumer/éteindre la led IR. Il suffit alors de récupérer la position de la diode lorsqu'elle est allumée, et de dessiner à l'écran en conséquence.
Ce programme peut, entre autre, être utile pour des conférences.
© Graphisme : Les Petits Débrouillards Grand Ouest (Patrice Guinche - Jessica Romero) | Développement web : Libre Informatique