Warning: putenv() has been disabled for security reasons in /home/users4/d/debrouilloweb/www/wikidebrouillard/LocalSettings.php on line 193

Warning: putenv() has been disabled for security reasons in /home/users4/d/debrouilloweb/www/wikidebrouillard/LocalSettings.php on line 197

Warning: putenv() has been disabled for security reasons in /home/users4/d/debrouilloweb/www/wikidebrouillard/includes/parser/Parser.php on line 2338

Warning: putenv() has been disabled for security reasons in /home/users4/d/debrouilloweb/www/wikidebrouillard/includes/parser/Parser.php on line 2338

Warning: putenv() has been disabled for security reasons in /home/users4/d/debrouilloweb/www/wikidebrouillard/includes/parser/Parser.php on line 2338

Warning: putenv() has been disabled for security reasons in /home/users4/d/debrouilloweb/www/wikidebrouillard/includes/parser/Parser.php on line 2338

Warning: putenv() has been disabled for security reasons in /home/users4/d/debrouilloweb/www/wikidebrouillard/includes/parser/Parser.php on line 2338

Warning: putenv() has been disabled for security reasons in /home/users4/d/debrouilloweb/www/wikidebrouillard/includes/parser/Parser.php on line 2338
[ Wikidébrouillard ] Caméra à suivi IR

Caméra à suivi IR

De Wikidebrouillard.

(Logiciel)
(Logiciel)
Ligne 71 : Ligne 71 :
Ainsi nous donnons la possibilité de contrôleur le servo-moteur par la liaison série.
Ainsi nous donnons la possibilité de contrôleur le servo-moteur par la liaison série.
 +
 +
<u>Code Arduino</u>
<u>Code Arduino</u>

Version du 14 janvier 2014 à 15:27

Article incomplet en cours de rédaction
Modèle:Vidéo


Sommaire

Présentation du projet Arduino

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.

Liste du matériel

  • Le logiciel Arduino
  • Une wiimote pour capter l'infra-rouge
  • Du carton
  • Du scotch


Réalisation du projet

Caméra de conférence, suivant un orateur automatiquement.

Mécanique

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:

  • 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
                 

Logiciel

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:

  • Les fonctions setup et loop propre à 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 message reçut depuis le port série.
  • Une deuxième partie qui gère l'envoie 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ô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 scripte 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 renvois 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 scripte, la Wiimote se connecte alors en Bluetooth. Lors de l’exécution du scripte, celui-ci récupère les coordonnée de tous les points détectés, moyenne ces dernières puis agis en conséquent : si le point moyen est sur le tiers gauche, on dit au cervo de tourner dans la direction adéquate, et si le point est dans la zone droite le cervo 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

Liens avec d'autres projets arduino

chercher ici : http://wikidebrouillard.org/index.php/Catégorie:Arduino

Pour aller plus loin

Liens avec le quotidien

Ce programme peut, entre autre, être utile pour des conférences.

AR
CO

Caméra à suivi IR

Rechercher

Page Discussion Historique
Powered by MediaWiki
Creative Commons - Paternite Partage a l

© Graphisme : Les Petits Débrouillards Grand Ouest (Patrice Guinche - Jessica Romero) | Développement web : Libre Informatique