(→Logiciel) |
(→Logiciel) |
||
Ligne 227 : | Ligne 227 : | ||
<u>Code python</u> | <u>Code python</u> | ||
- | Ce | + | Ce script Python utilise la Wiimote pour détecter la led IR, la Wiimote dispose d'une caméra IR d'une résolution de 1024*768 et renvoi les coordonnées de jusqu'à 4 points. |
- | Tout d'abord on passe la Wiimote en mode synchronisation en pressant simultanément les bouton 1 et 2 puis on lance le | + | |
+ | Tout d'abord on passe la Wiimote en mode synchronisation en pressant simultanément les bouton 1 et 2 puis on lance 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 agis en conséquent : si le point moyen est sur le tiers gauche, on dit au servo-moteur de tourner dans la direction adéquat, et si le point est dans la zone droite le servo-moteur tourne dans le sens inverse. | ||
+ | |||
<pre> | <pre> | ||
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.
Un capteur infra-rouge et la caméra destinée au film sont montées sur un même axe vertical, posées sur un plateau.
Le plateau peut tourner à l'horizontal, motorisé par un servo-moteur.
Celui-ci est contrôlé par la carte Arduino.
Le Schéma:
Le câblage du servo-moteur est simple:
L'image du capteur infra-rouge est interprétée sur un PC : Le programme recherche à l'image la diode infra-rouge, et commande le moteur pour la centrer horizontalement.
Le logiciel utilisé peut se télécharger 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 partie:
Ainsi nous donnons la possibilité de contrôleur 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
Ce script Python utilise la Wiimote pour détecter la led IR, la Wiimote dispose d'une caméra IR d'une résolution de 1024*768 et renvoi les coordonnées de jusqu'à 4 points.
Tout d'abord on passe la Wiimote en mode synchronisation en pressant simultanément les bouton 1 et 2 puis on lance 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 agis en conséquent : si le point moyen est sur le tiers gauche, on dit au servo-moteur de tourner dans la direction adéquat, et si le point est dans la zone droite le servo-moteur tourne dans le sens inverse.
#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
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