Différences entre versions de « Robot principal »
(→Tâches) |
|||
(8 versions intermédiaires par le même utilisateur non affichées) | |||
Ligne 49 : | Ligne 49 : | ||
=Explication Programme= | =Explication Programme= | ||
− | ==Odometry== | + | Le programme peut être séparé en 3 principales parties : |
− | ===MCP233.c=== | + | - Le Main.c et FreeRTOS |
+ | - Les fichiers de configuration | ||
+ | - Les tâches | ||
+ | ==Main.c et FreeRTOS== | ||
+ | |||
+ | ==Les fichiers de configuration== | ||
+ | |||
+ | ===Odometry=== | ||
+ | ====MCP233.c==== | ||
Ce fichier contient les commandes permettant de configurer le moteur | Ce fichier contient les commandes permettant de configurer le moteur | ||
− | ===rbtMovement.c=== | + | ====rbtMovement.c==== |
On trouvera ici toutes les commandes de déplacement pour le robot | On trouvera ici toutes les commandes de déplacement pour le robot | ||
+ | |||
<syntaxhighlight lang="c"> | <syntaxhighlight lang="c"> | ||
void rbtMovement Init ( uint16_t whDist , uint16_t dmWh1, uint16_t dmWh2, | void rbtMovement Init ( uint16_t whDist , uint16_t dmWh1, uint16_t dmWh2, | ||
− | uint16_t | + | uint16_t ticks 1 , uint16_t ticks 2 ) |
</syntaxhighlight> | </syntaxhighlight> | ||
+ | |||
Cette fonction permet de configurer les encodeurs : | Cette fonction permet de configurer les encodeurs : | ||
+ | |||
1. whDist = distance entre les 2 encodeurs | 1. whDist = distance entre les 2 encodeurs | ||
+ | |||
2. dmWh1 et dmWh2 = diamètre en mm de chaque encodeur | 2. dmWh1 et dmWh2 = diamètre en mm de chaque encodeur | ||
+ | |||
3. ticks1 et ticks2 = nombre de ticks par rotation des encodeurs | 3. ticks1 et ticks2 = nombre de ticks par rotation des encodeurs | ||
<syntaxhighlight lang="c"> | <syntaxhighlight lang="c"> | ||
− | void rbtMove ( | + | void rbtMove ( int32_t dist ) //Deplacement du robo t en ligne droite en mm |
− | + | void rbt_turn ( int16_t angle ) // Rotation du robot en degre | |
</syntaxhighlight> | </syntaxhighlight> | ||
<syntaxhighlight lang="c"> | <syntaxhighlight lang="c"> | ||
− | + | static void rb tS ta teMachine ( int32_t targetEncoderCountsM1 , int32_ttargetEncoderCountsM2 ) | |
− | |||
</syntaxhighlight> | </syntaxhighlight> | ||
Cette fonction permet de recevoir l’état du robot : | Cette fonction permet de recevoir l’état du robot : | ||
+ | |||
1. BLOCKED = le robot ne bouge pas | 1. BLOCKED = le robot ne bouge pas | ||
− | 2. READY_TO_SEND = prêt | + | |
− | 3. IDLE = prêt | + | 2. READY_TO_SEND = prêt à envoyer une commande |
+ | |||
+ | 3. IDLE = prêt à recevoir une commmande | ||
+ | |||
4. BUSY = En train d’exécuter une commande | 4. BUSY = En train d’exécuter une commande | ||
− | 5. PAUSED = une commande a été | + | |
+ | 5. PAUSED = une commande a été annulée, le mouvement doit reprendre avant de repasser en état IDLE | ||
+ | |||
6. RESUMING = compléte la commande qui a été annulée avant de repasser en IDLE | 6. RESUMING = compléte la commande qui a été annulée avant de repasser en IDLE | ||
+ | |||
+ | ==Tâches== | ||
+ | |||
+ | ===movementTask.c=== | ||
+ | |||
+ | Les taches que le robot pourra effectuer Pour l’instant il n'y en a qu’une seule : movement-Task.c | ||
+ | |||
+ | <syntaxhighlight lang="c"> | ||
+ | #include "movementTask.h" | ||
+ | #include "rbtMovement.h" | ||
+ | #include "MCP233.h" | ||
+ | |||
+ | |||
+ | /* Variables */ | ||
+ | |||
+ | robotState_t robotState = BLOCKED; | ||
+ | |||
+ | |||
+ | /* Task */ | ||
+ | |||
+ | void StartSendMovementCmd(void const * argument){ | ||
+ | /******** Initializations ********/ | ||
+ | //TODO measure accurately | ||
+ | |||
+ | rbtMovementInit(265, 88, 88, 4096, 4096); | ||
+ | drive_forward(0); //making sure that the MCP command buffer is empty | ||
+ | |||
+ | robotState = IDLE; | ||
+ | |||
+ | /******** Movement path command list ********/ | ||
+ | |||
+ | /*Aller retour x2*/ | ||
+ | |||
+ | rbtMove(1000); //distance en mm | ||
+ | rbt_turn(180); //angle en degres, (-) pour tourner a gauche et (+) pour tourner a droite | ||
+ | rbtMove(1000); | ||
+ | rbt_turn(180); | ||
+ | |||
+ | while(1){ | ||
+ | osDelay(1); //boucle pour debugger, le programme devrait rester bloquer ici a la fin de son execution | ||
+ | } | ||
+ | |||
+ | /* USER CODE END 5 */ | ||
+ | } | ||
+ | |||
+ | </syntaxhighlight> |
Version actuelle datée du 8 mars 2021 à 15:28
Dans cette partie nous décrivons l'état du robot actuel, nos décisions, les projets en cours autour du robot. Cette année nous sommes suffisamment nombreux pour travailler sur un deuxième robot que nous vous encourageons à consulter également.
Le but du robot
Le club de robotique construit un robot afin de participer à la coupe de France de robotique. Nous avons décrit les règles sous la rubrique édition 2018/2019. Globalement les robots s'affrontent en autonomie sur un plateau de 3m par 2m pendant des matchs de 100 secondes. Les contraintes sur les dimensions et le fonctionnement des robots restent les mêmes. D'une édition à l'autre, uniquement les actions à réaliser changent. Nous cherchons donc à construction une base de robot modulable doté d'un déplacement précis et capable de fournir les ressources nécessaires (place, alimentation et contrôle) de modules et d'actionneurs que nous pourrions ajouter ou modifier d'année en année.
Contraintes et règles
Les contraintes imposées sur le robot concernent principalement les dimensions du robot. D'autres concernent les mesures de sécurités sur les systèmes d'alimentation et d'utilisation de technologies potentiellement dangereuses.
Dimensions
La projection verticale des deux robots de l'équipe (si l'équipe décide d'apporter deux robots à la compétition, le robot secondaire étant optionnel) doit rentrer dans la zone de départ qui fait 300mm par 450mm. Cependant, le robot principal ne doit pas dépasser un périmètre de 1200mm lorsqu'il est non déployé comme lors d'un début de match et un périmètre inférieur à 1500mm lorsqu'il est déployé. La hauteur maximale du robot est de 350mm, cependant il est toléré d'avoir un bouton d'arrêt d'urgence dépassant à une hauteur de 375mm. Tous les robots doivent pouvoir accueillir une balise de localisation mobile de l'adversaire. Si l'équipe décide de ne pas avoir mat pour la balise, l'équipe perd automatiquement le match si l'équipe adverse manifeste une nécessité justifiée de l'utilisation d'une balise de localisation (on n'a pas le droit de demander de placer une patate sur le robot adverse en proclament que c'est une balise de localisation par exemple).
Alimentation
Les sources d’énergie utilisant des réactions chimiques comme des combustions ou des procédés pyrotechniques. Il est interdit d'utiliser des êtres vivants (donc pas de cage à hamster). Afin d'éviter tout départ de feu à cause d'un courant trop élevé il faut veiller à ce que les câbles utilisés soient correctement dimensionnés et un système de fusible est recommandé. Si l'équipe décide d'utiliser des batteries, celles-ci doivent permettre au robot de concourir durant 3 maths de suite. L'utilisation de batterie en Lithium impose la possession d'un chargeur prévu à cet effet et une solution permettant de retenir le feu en cas d'accident (sacs ignifuges)
Autres contraintes de conception
Visibilité : Cordon de démarrage de robots autonomes : Bouton d’arrêt d’urgence de robots autonomes : Arrêt automatique : Système d’évitement Obstacles : Support de balise embarquée :
Utilisation de laser
Structure
En respectant les contraintes décrites précédemment, nous utilisons une structure de 280mm de largeur et 240mm de profondeur pour une hauteur de 320mm. Nous n'atteignons donc pas les 1200mm de périmètre maximal (1040mm) ce qui nous laisse une marge d'action dans le cas où la conception d'actionneurs nécessite un léger dépassement. Afin de rendre la structure modulable d'année en année, nous avons choisi de créer une structure pouvant "porter" plusieurs étages amovibles et indépendants. Deux poignées sur le dessus permettent de déplacer le robot sans risquer de l'endommager en agrippant une partie fragile. Cela s'avère très pratique car nous sommes en permanence amenés à déplacer le robot. La structure est entièrement découpée dans du MDF grâce à la découpeuse laser Trotec du Fablab FabMSTIC sur le campus de Grenoble. Cette matière est assez solide et préférable à du contre-plaqué car le bois est homogène. Malheureusement, les Fablab ont arrêté d'utiliser cette matière car la fumée faite par le MDF lorsqu'il est découpé encrasse les filtres des graveuses laser. Ainsi, nous devrons probablement passer à l'utilisation d'une autre matière, comme du plexiglas pour du prototypage et pourquoi pas de l'aluminium (pour ce dernier, nous n'avons pas encore de matériel, mais peut-être un jour nous serrons suffisamment équipé pour travail ce métal).
Le robot est mû par deux moteur Maxon dotés de motoréducteurs. Des poulies transmettent le mouvement aux roues car nous voulions garder un éspace au niveau de l'étage du plus bas pour de potentiels actionneurs. Les roues motrices sont placées le plus à l'arrière et à l'extérieur possible. Cela offre un déplacement plus précis et libère de la place à l'avant. Afin d'asservir les moteurs, nous utilisons des encodeurs de chez Kuebler. Enfin, un contrôleur moteur de chez Ion Motion Control (maintenant BasicMicro) nous permet de lier les données des encodeurs et gérer la puissance des moteurs. Plus de détails seront données plus loin.
- Encodeurs (image en attente de téléversement)
Odométrie
Alimentation
Actionneurs
Explication Programme
Le programme peut être séparé en 3 principales parties : - Le Main.c et FreeRTOS - Les fichiers de configuration - Les tâches
Main.c et FreeRTOS
Les fichiers de configuration
Odometry
MCP233.c
Ce fichier contient les commandes permettant de configurer le moteur
rbtMovement.c
On trouvera ici toutes les commandes de déplacement pour le robot
<syntaxhighlight lang="c"> void rbtMovement Init ( uint16_t whDist , uint16_t dmWh1, uint16_t dmWh2, uint16_t ticks 1 , uint16_t ticks 2 ) </syntaxhighlight>
Cette fonction permet de configurer les encodeurs :
1. whDist = distance entre les 2 encodeurs
2. dmWh1 et dmWh2 = diamètre en mm de chaque encodeur
3. ticks1 et ticks2 = nombre de ticks par rotation des encodeurs
<syntaxhighlight lang="c"> void rbtMove ( int32_t dist ) //Deplacement du robo t en ligne droite en mm void rbt_turn ( int16_t angle ) // Rotation du robot en degre </syntaxhighlight>
<syntaxhighlight lang="c">
static void rb tS ta teMachine ( int32_t targetEncoderCountsM1 , int32_ttargetEncoderCountsM2 )
</syntaxhighlight>
Cette fonction permet de recevoir l’état du robot :
1. BLOCKED = le robot ne bouge pas
2. READY_TO_SEND = prêt à envoyer une commande
3. IDLE = prêt à recevoir une commmande
4. BUSY = En train d’exécuter une commande
5. PAUSED = une commande a été annulée, le mouvement doit reprendre avant de repasser en état IDLE
6. RESUMING = compléte la commande qui a été annulée avant de repasser en IDLE
Tâches
movementTask.c
Les taches que le robot pourra effectuer Pour l’instant il n'y en a qu’une seule : movement-Task.c
<syntaxhighlight lang="c">
- include "movementTask.h"
- include "rbtMovement.h"
- include "MCP233.h"
/* Variables */
robotState_t robotState = BLOCKED;
/* Task */
void StartSendMovementCmd(void const * argument){
/******** Initializations ********/ //TODO measure accurately
rbtMovementInit(265, 88, 88, 4096, 4096); drive_forward(0); //making sure that the MCP command buffer is empty
robotState = IDLE;
/******** Movement path command list ********/
/*Aller retour x2*/
rbtMove(1000); //distance en mm rbt_turn(180); //angle en degres, (-) pour tourner a gauche et (+) pour tourner a droite rbtMove(1000); rbt_turn(180);
while(1){ osDelay(1); //boucle pour debugger, le programme devrait rester bloquer ici a la fin de son execution }
/* USER CODE END 5 */
}
</syntaxhighlight>