Ligne 39 : | Ligne 39 : | ||
==Pour aller plus loin== | ==Pour aller plus loin== | ||
+ | |||
+ | <u>Code Arduino</u> | ||
+ | |||
+ | <pre> | ||
+ | |||
+ | #include <Servo.h> | ||
+ | |||
+ | //Permet d'attendre que le servomoteur finisse sont mouvement | ||
+ | #define TEMPS 550 | ||
+ | |||
+ | // on créé 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); | ||
+ | |||
+ | //envoyer("Commande : " + commande); //test | ||
+ | |||
+ | //On détermine le paramètre | ||
+ | String parametre = recu.substring(3); | ||
+ | |||
+ | //envoyer("Paramètre : " + parametre); //test | ||
+ | |||
+ | //Si la commande est ADD | ||
+ | if(commande == "ADD") | ||
+ | { | ||
+ | //On récupere le parametre | ||
+ | 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écupere le parametre | ||
+ | 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écupere le parametre | ||
+ | int par = parametre.toInt(); | ||
+ | |||
+ | //On impose l'angle passé en paramètre | ||
+ | set(par); | ||
+ | } | ||
+ | |||
+ | //Si la commande est GET | ||
+ | else if(commande == "GET") | ||
+ | { | ||
+ | //On envoyer l'angle du servo moteur | ||
+ | envoyer(String(getAngle())); | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | |||
+ | ///// Partie Liaison série | ||
+ | //Fonction qui permet de recevoir des string | ||
+ | String recevoir() | ||
+ | { | ||
+ | //On creer la chaine de charactère pour recevoire 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 servompteur | ||
+ | |||
+ | // 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); | ||
+ | } | ||
+ | |||
+ | //fonction add | ||
+ | int add(int angle) | ||
+ | { | ||
+ | if((myservo.read()+angle) >= 172) | ||
+ | set(172);// valeur de butée pour ne pas forcé 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); | ||
+ | } | ||
+ | |||
+ | |||
+ | </pre> | ||
+ | |||
+ | <u>Code python</u> | ||
+ | |||
+ | <pre> | ||
+ | #encoding:utf-8 | ||
+ | |||
+ | import serial #port serie afin d'envoyer les instructions a l'arduino | ||
+ | import cwiid #libraire pour la wiimote | ||
+ | # 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 | ||
+ | |||
+ | 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 | ||
+ | if dot != None: | ||
+ | x += dot["pos"][0] | ||
+ | y += dot["pos"][1] | ||
+ | s+=1 | ||
+ | if s: #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("SUB5\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("ADD5\n".encode("ascii")) | ||
+ | print("ADD !!!") | ||
+ | |||
+ | |||
+ | </pre> | ||
+ | |||
+ | Ce logiciel à les dépendences suivantes : | ||
+ | * python-cwiid | ||
+ | |||
+ | Installation des dépendences : | ||
+ | sudo apt-get install python-cwiid | ||
+ | |||
+ | Execution : | ||
+ | python2.7 main.py | ||
+ | |||
+ | |||
==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.
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.
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.
chercher ici : http://wikidebrouillard.org/index.php/Catégorie:Arduino
Code Arduino
#include <Servo.h> //Permet d'attendre que le servomoteur finisse sont mouvement #define TEMPS 550 // on créé 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); //envoyer("Commande : " + commande); //test //On détermine le paramètre String parametre = recu.substring(3); //envoyer("Paramètre : " + parametre); //test //Si la commande est ADD if(commande == "ADD") { //On récupere le parametre 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écupere le parametre 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écupere le parametre int par = parametre.toInt(); //On impose l'angle passé en paramètre set(par); } //Si la commande est GET else if(commande == "GET") { //On envoyer l'angle du servo moteur envoyer(String(getAngle())); } } } ///// Partie Liaison série //Fonction qui permet de recevoir des string String recevoir() { //On creer la chaine de charactère pour recevoire 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 servompteur // 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); } //fonction add int add(int angle) { if((myservo.read()+angle) >= 172) set(172);// valeur de butée pour ne pas forcé 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
#encoding:utf-8 import serial #port serie afin d'envoyer les instructions a l'arduino import cwiid #libraire pour la wiimote # 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 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 if dot != None: x += dot["pos"][0] y += dot["pos"][1] s+=1 if s: #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("SUB5\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("ADD5\n".encode("ascii")) print("ADD !!!")
Ce logiciel à les dépendences suivantes : * python-cwiid
Installation des dépendences : sudo apt-get install python-cwiid
Execution : python2.7 main.py
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