Cours:TPS 2103 tp pixy

De troyesGEII
Aller à : navigation, rechercher

Fiche résumé

Retour à la liste des Tds/Tps

Éléments de correction


Vous allez faire un tracking de balle de tennis avec une caméra pixy et un servomoteur.


Mise en garde contre les loop/setup

Si vous n'écrivez pas la fonction main mais à la place les fonctions loop/setup, le "main Arduino" est exécuté.

Son code est à peu près :

int main(void)
{
  init();
  setup();
  while(1)
  {
    loop();
  }
}
Attention, la fonction init() modifie la configuration des Timers au démarrage du µcontrôleur.
Il conviendra donc de réinitialiser les bits des registres des Timers


************************************************************
** lorsque c'est possible, il est plus judicieux d'écrire **
** la fonction main dans votre programme                  **
** ainsi il n'y a rien de caché dans votre code           **
************************************************************

pixymon

Le logiciel pixymon permet de configurer la caméra pixy, connectée en usb :

https://docs.pixycam.com/wiki/doku.php?id=wiki:v2:teach_pixy_an_object_2

Todo.jpg lancer le logiciel pour reconnaître les balles de tennis :

  • dans le menu File, remettre les paramètres par défaut
  • dans le menu Action, définir la couleur de la signature 1

Librairie arduino

sur la page suivante: https://pixycam.com/downloads-pixy2/

Todo.jpg Télécharger et installer la librairie arduino pour la pixy

Todo.jpg Utiliser le programme d'exemple ci dessous pour vérifier le bon fonctionnement

Rque : il s'agit d'une version légèrement modifiée du programme d'exemple de la librairie : ccc_hello_world

#include <Pixy2.h>
// on crée une sorte de variable (un objet) nommée pixy de type Pixy2
// nous verrons ça au semestre 3
Pixy2 pixy;

int main()
{
  Serial.begin(115200);
  Serial.print("Starting...\n");

  // un peu comme pour les structures, il y a un "." pour utiliser l'objet pixy
  // ici on exécute la fonction "init" de l'objet pixy
  pixy.init();
  sei();
  while(1)
 { 
    int i; 
    // grab blocks! : acquisition et traitement d'une nouvelle image
    // ccc : Color Connected Components, grossièrement zones de couleur identique
    pixy.ccc.getBlocks();

    // If there are detect blocks, print them!
    // numBlocks : nombre de zones détectées
    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();
      }
    }
  }
}

Affichage de la position de la balle

En utilisant la documentation sur la page suivante :

https://docs.pixycam.com/wiki/doku.php?id=wiki:v2:hooking_up_pixy_to_a_microcontroller_-28like_an_arduino-29#arduino-api

Question.jpg Afficher sur la liaison série les coordonnées du centre de la balle de tennis :

  • si une balle est détectée, afficher : balle à la position (x,y)
  • s'il n'y a pas de balle, afficher  : pas de balle

Rotation de la caméra

La caméra est montée sur un servomoteur que vous allez piloter pour centrer la balle sur l'image de la caméra.

Servomoteur

Nous avons vu dans un TP la configuration du timer pour utiliser un servomoteur.

Todo.jpg connecter le servomoteur sur le connecteur CON_MLI en utilisant la page suivante : Cours:ShieldNanoinfo

Position de la balle

On crée une variable positionBalle

Todo.jpg Faire en sorte que l'abscisse de la balle (variable positionBalle) soit comprise entre [-158 158], 0 au centre de l'image

Rque : pixy.ccc.blocks[i].m_x est une valeur entre 0 et 316

Déplacement dans la direction de la balle

Il reste à tout assembler.

Question.jpg Ecrire un programme qui change la position du servomoteur suivant le signe de posBalle :

  • si posBalle est positif, augmenter la position du servomoteur
  • si posBalle est négatif, diminuer la position du servomoteur
  • ou le contraire !

Rque :

  • Attention à ne pas dépasser les positions maxi/mini du servo

Correcteur proportionnel

Question.jpg Ecrire un programme qui change la position du servomoteur de façon plus efficace de la façon suivante :

PositionServo = PositionServo + k . positionBalle

Rque :

  • Attention à ne pas dépasser les positions maxi/mini du servo