Cours:TPS 2103 tp pixy : Différence entre versions
(→Librairie arduino) |
|||
(10 révisions intermédiaires par le même utilisateur non affichées) | |||
Ligne 14 : | Ligne 14 : | ||
int main(void) | int main(void) | ||
{ | { | ||
− | + | init(); | |
− | + | setup(); | |
− | + | while(1) | |
− | + | { | |
− | + | loop(); | |
− | + | } | |
} | } | ||
</source> | </source> | ||
Ligne 30 : | Ligne 30 : | ||
** lorsque c'est possible, il est plus judicieux d'écrire ** | ** lorsque c'est possible, il est plus judicieux d'écrire ** | ||
** la fonction main dans votre programme ** | ** la fonction main dans votre programme ** | ||
+ | ** ainsi il n'y a rien de caché dans votre code ** | ||
************************************************************ | ************************************************************ | ||
Ligne 48 : | Ligne 49 : | ||
{{Todo|Télécharger et installer la librairie arduino pour la pixy}} | {{Todo|Télécharger et installer la librairie arduino pour la pixy}} | ||
− | {{Todo|Utiliser le programme d'exemple | + | {{Todo|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 | ||
− | = | + | <source lang=cpp> |
+ | #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(); | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | </source> | ||
− | + | =Affichage de la position de la balle= | |
En utilisant la documentation sur la page suivante : | En utilisant la documentation sur la page suivante : | ||
Ligne 60 : | Ligne 100 : | ||
https://docs.pixycam.com/wiki/doku.php?id=wiki:v2:hooking_up_pixy_to_a_microcontroller_-28like_an_arduino-29#arduino-api | https://docs.pixycam.com/wiki/doku.php?id=wiki:v2:hooking_up_pixy_to_a_microcontroller_-28like_an_arduino-29#arduino-api | ||
− | {{Question|Afficher sur | + | {{Question|Afficher sur la liaison série les coordonnées du centre de la balle de tennis :}} |
+ | *si une balle est détectée, afficher : {{Rouge|balle à la position (x,y)}} | ||
+ | *s'il n'y a pas de balle, afficher : {{Rouge|pas de balle}} | ||
=Rotation de la caméra= | =Rotation de la caméra= | ||
Ligne 69 : | Ligne 111 : | ||
==Servomoteur== | ==Servomoteur== | ||
− | Nous avons vu dans un TP [[Cours:TPS_2103_tp_servoMoteur|la configuration du timer pour utiliser un servomoteur] | + | Nous avons vu dans un TP [[Cours:TPS_2103_tp_servoMoteur|la configuration du timer pour utiliser un servomoteur]]. |
{{Todo|connecter le servomoteur sur le connecteur CON_MLI en utilisant la page suivante : [[Cours:ShieldNanoinfo]]}} | {{Todo|connecter le servomoteur sur le connecteur CON_MLI en utilisant la page suivante : [[Cours:ShieldNanoinfo]]}} | ||
Ligne 75 : | Ligne 117 : | ||
==Position de la balle== | ==Position de la balle== | ||
− | {{Todo|Faire en sorte que l'abscisse de la balle (variable positionBalle) soit comprise entre [-158 158], 0 au centre de l'image }} | + | On crée une variable {{Rouge|positionBalle}} |
+ | |||
+ | {{Todo|Faire en sorte que l'abscisse de la balle (variable {{Rouge|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 | '''Rque :''' pixy.ccc.blocks[i].m_x est une valeur entre 0 et 316 |
Version actuelle datée du 29 mars 2024 à 15:01
Vous allez faire un tracking de balle de tennis avec une caméra pixy et un servomoteur.
Sommaire
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
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/
Télécharger et installer la librairie arduino pour la pixy
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 :
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.
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
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.
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
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