<< return to Pixycam.com

Projet robot suivant un utilisateur grâce à une couleur

Bonjour à tous,

Je vais procéder à une mise en contexte avant de commencer.
Nous sommes en classe de terminale et nous avons un projet de fin d’année à réaliser.
Nous avons comme projet de faire entièrement un robot (fabrication et programmation), qui suivrait un utilisateur grâce à la caméra Pixy2 qui détecterait l’utilisateur grâce à une couleur.

Nous sommes 2 à s’occuper de la partie programmation du projet. Nous avons choisit de programmer sur Arduino et en utilisant la caméra Pixy2.
Malheureusement nous avons un problème (pour le moment :no_mouth:), nous n’arrivons pas a récupérer les informations que détecte la caméra.

Nous souhaiterons savoir comment récupérer ces informations (x;y;height;width) pour pouvoir déterminer la distance entre le robot et la caméra; si il doit tourner a gauche, à droite …
Pouvez vous nous aider à mener à bien ce projet pour notre examen et ainsi impressionner notre jury ?

Je vous envoie notre programme actuel :

#include <Pixy2.h>                //inclure bibliothèque Pixy2
Pixy2 pixy;
                                  //caméra
int signature = 0;                //initialisation couleur
int x = 0;                        //position sur x
int y = 0;                        //position sur y
int width = 0;                    //largeur=0
int height = 0;                   //hauteur=0
int area = 0;                     //distance caméra-objet
int newArea = 0;
int Xmin = 95;                    //limite Xmin au pixel 95 
int Xmax = 200;                   //limite Xmax au pixel 200
int minArea = 0;
int maxArea = 0;

                                  //moteurA
int ENA = 12;                     //vitesse moteurA
int IN1 = 9;                      //sens moteurA
int IN2 = 8;                      //sens inverse moteurA

                                  //moteurB
int ENB = 6;                      //vitesse moteurB
int IN3 = 4;                      //sens moteurB
int IN4 = 5;                      //sens inverse moteurB


void setup() 
{
 pixy.init();                     //initialisation Pixy
 
pinMode (ENA, OUTPUT);            //ENA sur sortie
pinMode (IN1, OUTPUT);            //IN1 sur sortie
pinMode (IN2, OUTPUT);            //IN2 sur sortie
pinMode (ENB, OUTPUT);            //ENB sur sortie
pinMode (IN3, OUTPUT);            //IN3 sur sortie
pinMode (IN4, OUTPUT);            //IN4 sur sortie
}


void loop()                       //Programme
{
 while(millis()<5000){            //tant que temps<5000 millisecondes
    scan();                       //faire scan
    area = width * height;
    maxArea = area + 1000;
    minArea = area - 1000;
 }
 
 scan();                            //fonction scan
 
 if(signature == 1)               //s'il reconnait l'objet
 {
 newArea = width * height;
  if (x < Xmin)                   //si x < Xmin
  {
   gauche();                      //faire fonction gauche
  }
  else if (x > Xmax)              //sinon si x > Xmax
  {
   droite();                      //faire fonction gauche
  }
  else if (newArea < minArea)     //sinon si newArea < minArea
  {
   avancer();                     //faire fonction avncer
  }
  else if (newArea > maxArea)     //sinon si newArea > maxArea
  {
   freiner();                     //faire fonction freiner
  }
  else                            //sinon
  {
   arret();                       //fonction arret
  }
 }
 else                             //sinon
 {
  arret();                        //fonction arret
 }
}


void avancer()                    //vitesse de croisière : moteur gauche et droit à 200
{
digitalWrite (IN1,HIGH);          //IN2 à l'état haut
digitalWrite (IN2,LOW);           //IN2 à l'état bas
analogWrite (ENA, 200);           //ENA vitesse 200

digitalWrite (IN3,HIGH);          //IN3 à l'état haut
digitalWrite (IN4,LOW);           //IN4 à l'état bas
analogWrite (ENB, 200);           //ENB vitesse 200

}
void freiner()                    // diminuer vitesse moteur gauche et droit
{
digitalWrite (IN1,HIGH);          //IN1 à l'état haut
digitalWrite (IN2,LOW);           //IN2 à l'état bas
analogWrite (ENA, 100);           //ENA vitesse 100

digitalWrite (IN3,HIGH);
digitalWrite (IN4,LOW);
analogWrite (ENB, 100);
}
void droite()                     //augmenter vitesse moteur droit
{
digitalWrite (IN1,HIGH);
digitalWrite (IN2,LOW);
analogWrite (ENA, 100);

digitalWrite (IN3,HIGH);
digitalWrite (IN4,LOW);
analogWrite (ENB, 200);
}
void gauche()                     // augmenter vitesse moteur gauche
{
digitalWrite (IN1,HIGH);
digitalWrite (IN2,LOW);
analogWrite (ENA, 200);

digitalWrite (IN3,HIGH);
digitalWrite (IN4,LOW);
analogWrite (ENB, 100);
}
void arret()                       //fonction arret
{
  analogWrite (ENA, 0);           //moteur 1 0
  analogWrite (ENB, 0);           //moteur 2 0
}

void scan() 
{
 uint16_t blocks;
 blocks = pixy.ccc.getBlocks();
 uint16_t m_signature = signature;
 uint16_t m_x = x;
 uint16_t m_y = y;
 uint16_t m_width = width;
 uint16_t m_height = height;
}

Salut,

avez-vous essayé d’exécuter le programme de démonstration comme décrit ici? https://docs.pixycam.com/wiki/doku.php?id=wiki:v2:hooking_up_pixy_to_a_microcontroller_-28like_an_arduino-29

Cela devrait vous permettre de commencer à recevoir des données d’Arduino. Vous pouvez modifier le programme pour faire ce que vous voulez.

En regardant votre code, je ne comprends pas ce qui se passe dans la section “void”. Vous semblez inverser l’ordre de l’opérateur d’affectation, sauf erreur de ma part. Par exemple, lorsque vous écrivez:

uint16_t m_signature = signature;

Vous stockez tout ce qui est dans “signature” (défini sur 0 au début de votre programme), dans la variable m_signature. Vous devez l’écrire comme ceci:

uint16_t signature = pixy.ccc.blocks [i] .m_signature;

En supposant que vous essayez d’obtenir la valeur de signature de Pixy. Ou, référez-vous simplement à la valeur directement en utilisant

pixy.ccc.blocks [i] .m_signature

Veuillez consulter l’API Arduino pour plus d’informations: https://docs.pixycam.com/wiki/doku.php?id=wiki:v2:hooking_up_pixy_to_a_microcontroller_-28like_an_arduino-29#arduino-api

J’espère que cela t’aides!

À votre santé,
Jesse

Bonjour Jesse,

Nous vous remercions pour votre réponse rapide et nous avons amélioré notre programme.
Nous réussissons maintenant a stocker les informations de la caméra dans les variables.

Voici notre nouveau programme :

#include <Pixy2.h>                //inclure bibliothèque Pixy2
Pixy2 pixy;
                                  //caméra
int signature = 0;                //initialisation couleur
int x = 0;                        //position sur x
int y = 0;                        //position sur y
int width = 0;                    //largeur=0
int height = 0;                   //hauteur=0
int area = 0;                     //distance caméra-objet
int newArea = 0;
int Xmin = 95;                    //limite Xmin au pixel 95 
int Xmax = 200;                   //limite Xmax au pixel 200
int minArea = 0;
int maxArea = 0;

                                  //moteurA
int ENA = 12;                      //vitesse moteurA
int IN1 = 9;                       //sens moteurA
int IN2 = 8;                       //sens inverse moteurA
                                  //moteurB
int ENB = 6;                       //vitesse moteurB
int IN3 = 4;                       //sens moteurB
int IN4 = 5;                       //sens inverse moteurB


void setup() 
{
 Serial.begin(115200);
 pixy.init();                     //initialisation Pixy
 
pinMode (ENA, OUTPUT);            //ENA sur sortie
pinMode (IN1, OUTPUT);            //IN1 sur sortie
pinMode (IN2, OUTPUT);            //IN2 sur sortie
pinMode (ENB, OUTPUT);            //ENB sur sortie
pinMode (IN3, OUTPUT);            //IN3 sur sortie
pinMode (IN4, OUTPUT);            //IN4 sur sortie
}

void avancer()             
{
digitalWrite (IN1,HIGH);        
digitalWrite (IN2,LOW);          
analogWrite (ENA, 200);       

digitalWrite (IN3,HIGH);       
digitalWrite (IN4,LOW);         
analogWrite (ENB, 200);         

}
void freiner()           
{
digitalWrite (IN1,HIGH);    
digitalWrite (IN2,LOW);         
analogWrite (ENA, 100);        

digitalWrite (IN3,HIGH);
digitalWrite (IN4,LOW);
analogWrite (ENB, 100);
}
void droite()                     
{
digitalWrite (IN1,HIGH);
digitalWrite (IN2,LOW);
analogWrite (ENA, 100);

digitalWrite (IN3,HIGH);
digitalWrite (IN4,LOW);
analogWrite (ENB, 200);
}
void gauche()                     
{
digitalWrite (IN1,HIGH);
digitalWrite (IN2,LOW);
analogWrite (ENA, 200);

digitalWrite (IN3,HIGH);
digitalWrite (IN4,LOW);
analogWrite (ENB, 100);
}
void arret()                     
{
  analogWrite (ENA, 0);          
  analogWrite (ENB, 0);         
}


void loop()                    
{ 
 int i;
 pixy.ccc.getBlocks();         
 area = width * height;
 maxArea = 4500;
 minArea = 3500;
 if (pixy.ccc.numBlocks)
 {
  Serial.print("Detected ");
  Serial.println(pixy.ccc.numBlocks);
  for (i=0; i<pixy.ccc.numBlocks; i++)
   {
      Serial.print("  block ");
      Serial.print(i);
      Serial.print(": ");
      
      pixy.ccc.blocks[i].print();
      x = pixy.ccc.blocks[i].m_x;
      y = pixy.ccc.blocks[i].m_y;
      width = pixy.ccc.blocks[i].m_width;
      height = pixy.ccc.blocks[i].m_height; 
      
      //Infos de la caméra sur le moniteur série Arduino
      Serial.print("x: ");
      Serial.print(x);
      Serial.print(" | y: ");
      Serial.print(y);
      Serial.print(" | width: ");
      Serial.print(width);
      Serial.print(" | height: ");
      Serial.print(height);
      Serial.print(" | area: ");
      Serial.print(area);
      Serial.print(" | maxArea: ");
      Serial.print(maxArea);
      Serial.print(" | minArea: ");
      Serial.print(minArea); 
      Serial.println(" ");
      delay(20);
    
  
  if(signature == 1)               //s'il reconnait l'objet
  {
  newArea = width * height;
   if (x < Xmin)                   //si x < Xmin
   {
    gauche();                      //faire fonction gauche
   }
   else if (x > Xmax)              //sinon si x > Xmax
   {
    droite();                      //faire fonction gauche
   }
   else if (newArea < minArea)     //sinon si newArea < minArea
   {
    avancer();                     //faire fonction avncer
   }
   else if (newArea > maxArea)     //sinon si newArea > maxArea
   {
    freiner();                     //faire fonction freiner
   }
   else                            //sinon
   {
    arret();                       //fonction arret
   }
  }
  else                             //sinon
  { 
  arret();                        //fonction arret
  }
 }
 }
}

Nous n’arrivons pas a faire tourner les moteurs quand l’objet est trop loin / trop a gauche ect…
Pouvez vous nous aider ? :slight_smile:
Nous vous remercions d’avance pour votre sympathie.

Hourra, content de l’avoir fait fonctionner! Je ne sais pas exactement ce que vous demandez - si vous modifiez les valeurs de Xmin et Xmax, cela résoudrait-il votre problème?

Merci,
Jesse

Bonjour Jesse,
nous te remercions pour ta réponse et nous sommes très heureux car notre programme fonctionne désaprésent.
le voici :

 #include <Pixy2.h>                //inclure bibliothèque Pixy2

Pixy2 pixy;
//caméra
int signature = 0; //initialisation couleur
int x = 0; //position sur x
int y = 0; //position sur y
int width = 0; //largeur=0
int height = 0; //hauteur=0
int area = 0; //aire de l’objet
int Xmin = 95; //limite Xmin au pixel 95
int Xmax = 200; //limite Xmax au pixel 200
int minArea = 0; //aire minimum
int maxArea = 0; //aire maximum

                              //moteurA

int ENA = 12; //vitesse moteurA
int IN1 = 9; //sens moteurA
int IN2 = 8; //sens inverse moteurA
//moteurB
int ENB = 6; //vitesse moteurB
int IN3 = 4; //sens moteurB
int IN4 = 5; //sens inverse moteurB

void setup()
{
Serial.begin(115200); //nombre de baud pour le moniteur série
pixy.init(); //initialisation Pixy

pinMode (ENA, OUTPUT); //déclare que ENA est une sortie
pinMode (IN1, OUTPUT); //déclare que IN1 est une sortie
pinMode (IN2, OUTPUT); //déclare que IN2 est une sortie
pinMode (ENB, OUTPUT); //déclare que ENB est une sortie
pinMode (IN3, OUTPUT); //déclare que IN3 est une sortie
pinMode (IN4, OUTPUT); //déclare que IN4 est une sortie
}

void avancer()
{
digitalWrite (IN1,HIGH);
digitalWrite (IN2,LOW);
analogWrite (ENA, 240);

digitalWrite (IN3,HIGH);
digitalWrite (IN4,LOW);
analogWrite (ENB, 240);

}
void freiner()
{
digitalWrite (IN1,HIGH);
digitalWrite (IN2,LOW);
analogWrite (ENA, 90);

digitalWrite (IN3,HIGH);
digitalWrite (IN4,LOW);
analogWrite (ENB, 90);
}
void droite()
{
digitalWrite (IN1,HIGH);
digitalWrite (IN2,LOW);
analogWrite (ENA, 90);

digitalWrite (IN3,HIGH);
digitalWrite (IN4,LOW);
analogWrite (ENB, 240);
}
void gauche()
{
digitalWrite (IN1,HIGH);
digitalWrite (IN2,LOW);
analogWrite (ENA, 240);

digitalWrite (IN3,HIGH);
digitalWrite (IN4,LOW);
analogWrite (ENB, 90);
}
void arret()
{
analogWrite (ENA, 0);
analogWrite (ENB, 0);
}

void loop()
{
int i;
pixy.ccc.getBlocks(); //
area = width * height; //calcul de l’aire
maxArea = 4500; //aire max
minArea = 3500; //aire min
if (pixy.ccc.numBlocks)
{
Serial.print("Detected “); //ecrit sur le moniteur série qu’un block est détecté
Serial.println(pixy.ccc.numBlocks);
for (i=0; i<pixy.ccc.numBlocks; i++)
{
Serial.print(” block “);
Serial.print(i);
Serial.print(”: ");

  pixy.ccc.blocks[i].print();  
  x = pixy.ccc.blocks[i].m_x;                      //
  y = pixy.ccc.blocks[i].m_y;                      //
  width = pixy.ccc.blocks[i].m_width;              //
  height = pixy.ccc.blocks[i].m_height;            //
  signature = pixy.ccc.blocks[i].m_signature;      //
  
  //Infos de la caméra sur le moniteur série Arduino
  Serial.print("x: ");
  Serial.print(x);
  Serial.print(" | y: ");
  Serial.print(y);
  Serial.print(" | width: ");
  Serial.print(width);
  Serial.print(" | height: ");
  Serial.print(height);
  Serial.print(" | area: ");
  Serial.print(area);
  Serial.print(" | maxArea: ");
  Serial.print(maxArea);
  Serial.print(" | minArea: ");
  Serial.print(minArea); 
  Serial.println(" ");
  delay(20);

if(signature == 1) //s’il reconnait l’objet
{
if (x < Xmin) //si x < Xmin
{
Serial.println(" x < Xmin ");
gauche();

}
else if (x > Xmax) //sinon si x > Xmax
{
Serial.println(" x > Xmax “);
droite(); //faire fonction gauche
}
else if (area < minArea) //sinon si newArea < minArea
{
Serial.println(” area < minArea “);
avancer(); //faire fonction avncer
}
else if (area > maxArea) //sinon si newArea > maxArea
{
Serial.println(” area > maxArea ");
freiner();
}
else //sinon
{
arret(); //fonction arret
}
}
else //sinon
{
arret(); //fonction arret
}
}
}
}

1 Like

Yay! Heureux que tu es parvenu à le faire fonctionner. Veuillez me faire savoir si vous avez besoin d’autre chose!