Cours:SaeRobotique : Différence entre versions
(→Affichage provisoire pour deboggage) |
(→Répéter une action régulièrement) |
||
Ligne 121 : | Ligne 121 : | ||
===Répéter une action régulièrement=== | ===Répéter une action régulièrement=== | ||
+ | {| class="wikitable" | ||
+ | |- | ||
+ | | | ||
<source lang=cpp> | <source lang=cpp> | ||
void loop() | void loop() | ||
Ligne 134 : | Ligne 137 : | ||
} | } | ||
</source> | </source> | ||
+ | || | ||
+ | <source lang=cpp> | ||
+ | void loop() | ||
+ | { | ||
+ | static uint32_t triggerTime=0; | ||
+ | uint32_t currentTime=millis(); | ||
+ | switch (etapeActive) | ||
+ | { | ||
+ | .... | ||
+ | case etapeX: | ||
+ | if ( qqch) | ||
+ | { | ||
+ | etapeSuivante=etapeY; | ||
+ | triggerTime=currentTime; | ||
+ | } | ||
+ | break; | ||
+ | case etapeY: | ||
+ | if ( currentTime >= (triggerTime + duree ) ) | ||
+ | { | ||
+ | etapeSuivante=etapeZ; | ||
+ | } | ||
+ | break; | ||
+ | case etapeZ: | ||
+ | ... | ||
+ | break; | ||
+ | } | ||
+ | |||
+ | } | ||
+ | </source> | ||
+ | |} | ||
===Affichage provisoire pour deboggage=== | ===Affichage provisoire pour deboggage=== |
Version du 17 juin 2022 à 08:59
https://www.youtube.com/watch?v=xH8EIqh-2_Y
Organisation
- Fonctionnement en trinôme sur 12 jours
- Compte rendu écrit quotidien individuel
- sera contrôlé chaque matin
- doit indiquer les tâches réalisées la veille
- doit indiquer le travail à réaliser le jour même
Tâches élémentaires (4 jours)
- Trois tâches principales (déplacements) : un étudiant sur chaque tâche
- aller vers la balle (caméra Pixy)
- détecter les lignes (suivre petites lignes, s’arrêter sur ligne centrale) : capteurs de ligne => carte à faire (prototypage puis shield)
- s’orienter : magnétomètre (MPU9250)
- À faire globalement : câblage robot, sécurité
Livrable
- faire des recherches pour rendre un dossier (pour le lundi qui suit) expliquant : le pont en H, schéma sécurité et chaque partie (a, b, c)
- mini-concours à la fin des quatre jours :
- traversée la plus rapide en ligne droite (avec magnéto)
- aller vers la balle le plus rapidement possible
- suivre ligne et stop ligne centrale le plus rapidement possible
Robot "joueur de tennis"
Tâches matérielles (8 jours)
- mat pour tenir ballon : on donne un tube (32) à couper (prévoir boite à onglet et scie) avec la base et les étudiants doivent fabriquer le support ballon
- système perçage ballon
- système démarrage avec ficelle à tirer
- système détection murs : choix du capteur distance avec liste donnée (ultrason, lidar ou infrarouge)
- fabrication shield pour Arduino Uno
Tâches logicielles
(1 étudiant sur chaque étape)
- Localiser balle avec caméra Pixy
- Attraper balle (détection opto)
- Renvoyer balle dans le camp adverse en s’orientant avec magnétomètre
- Recommencer
Codage des tâches en explicitant la structure du programme
- Ajouter transmission sans fil pour supervision/débogage (Xbee ou HF) : affichage sur terminal pc de l’étape en cours (et éventuellement état de variables)
Livrable
- À la fin du premier jour :
- donner une organisation (en tâches, qui fait quoi)
- Rapport final :
- À envoyer au format pdf par mail avant le jeudi 9 juin 12h
- Diagramme de Gantt
- diagramme algorithme général
- stratégie de résolution de chaque tâche
- Mini-concours à la fin pour sélectionner le meilleur robot (évaluation des capacités du robot, par étudiant en fonction de l'organisation prévue).
- Chiffrage incluant le matériel ainsi que les ressources humaines.
Ressources
structure du programme
Vous pourrez utiliser la structure de programme suivante :
enum state {etapeInit,etapeChercheBalle,etapeDeplacementVersBalle};
state etapeSuivante=etapeInit;
state etapeActive=etapeInit;
void setup() {
}
void loop() {
// lecture des capteurs
switch (etapeActive)
{
case etapeInit:
// si ... etapeSuivante=
break;
case etapeChercheBalle:
// si ... etapeSuivante=
break;
case etapeDeplacementVersBalle:
// si ... etapeSuivante=
break;
}
// on modifie l'étape active pour la prochaine boucle
etapeActive=etapeSuivante;
}
Programmation : comment faire
Exécuter une action une seule fois :
void loop()
{
static bool dejaFait=false;
if (dejaFait==false)
{
executerMonAction();
dejaFait=true;
}
}
Répéter une action régulièrement
void loop()
{
static uint32_t triggerTime=millis();
uint32_t currentTime=millis();
if (currentTime>=triggerTime)
{
faireMonAction();
triggerTime += 500; // prochaine exécution dans 500ms
}
}
|
void loop()
{
static uint32_t triggerTime=0;
uint32_t currentTime=millis();
switch (etapeActive)
{
....
case etapeX:
if ( qqch)
{
etapeSuivante=etapeY;
triggerTime=currentTime;
}
break;
case etapeY:
if ( currentTime >= (triggerTime + duree ) )
{
etapeSuivante=etapeZ;
}
break;
case etapeZ:
...
break;
}
}
|
Affichage provisoire pour deboggage
#define debug // mode debug
//ou
#undef debug // mode sans debug
void loop()
{
#ifdef debug
Serial.println("juste si debug");
#endif
}
Composants/cartes
- divers
- Commutateur d'arrêt d'urgence https://fr.farnell.com/idec/yw1b-v4e01r/commut-bp-e-stop-spst-nc-10a-120v/dp/2833849?ost=2833849
- Régulateur ajustable 1,25 à 30 Vcc https://www.gotronic.fr/art-regulateur-ajustable-1-25-a-30-vcc-gt134-26094.htm
- driver de moteur
- capteurs de distance/contact
- HC-SR04 cf fiche technique sur la page : https://www.gotronic.fr/art-module-de-detection-us-hc-sr04-20912.htm
- VL53L1X
- Mini Microrupteur - SPDT https://www.robotshop.com/eu/fr/mini-microrupteur-spdt-levier-rouleau.html
- CNY70
- GP2Yxxxx https://www.gotronic.fr/art-capteur-de-mesure-sharp-gp2y0a41sk0f-18338.htm
- lidar tfmini-s
- lidar Lite 3
- caméra
- IMU
- Explications du principe du capteur mpu9250 : https://learn.sparkfun.com/tutorials/mpu-9250-hookup-guide/all
- Bibliothèque à utiliser : dans le gestionnaire de bibliothèque => by hideakitai (v 0.4.8) ou https://github.com/hideakitai/MPU9250
- Étapes :
- Réaliser la calibration et noter les valeurs affichées,
- les entrer dans votre programme (fonctions setMagBias() et setMagScale()
- Pour réaliser une mesure :
- attendre que la fonction mpu.available() renvoie true
- appel de la fonction update_mag()
- puis appel des fonctions getMagX() et getMagY() pour récupérer les composantes x et y. L'angle vers le nord magnétique est obtenu avec l'inverse de la tangente (attention au signe)
- Robot Arrex :
- Cours:RobotArrex (section documents)
- avec shield moteur
liens
Composants eagle
Type | Composant/Boitier | Librairie Eagle | Référence eagle |
---|---|---|---|
Résistance | CMS : 1206 | rcl | R-EU_R1206 |
Photocoupleur | CNY70 | CNY70 | CNY70 |
Led | 5mm ou 3mm | led | LED5MM ou LED3MM |
Connecteur | barrette femelle sécable | con-lstb | MA06-1 |
Connecteur grove | carte driver moteur ... | Connector | TWIG-4P-2.0 |
- Media:CNY70.lbr : librairie pour le photocoupleur par réflexion CNY70
- Media:Troyesgeii.lbr : Divers composants utilisés en ER.
- Media:LibrairieEagleAdafruit.lbr : librairie du site http://www.adafruit.com/
- Media:Connector.lbr : librairie connecteurs