Phase 3 - Programmation du bras robotique Cinématique d'un bras robot La cinématique est un domaine de la mécanique qui se concentre sur l’étude des mouvements. Ça tombe bien, le but d'un robot étant de bouger ! L'étude cinématique consiste donc à déterminer les positions, vitesses et accélérations des différentes parties d’un robot, sans prendre en compte les forces qui causent ces mouvements (puissance des moteurs par exemple). Un robot, souvent décrit comme une machine automatisée, peut effectuer des tâches complexes apportant une réelle valeur ajoutée dans divers secteurs. Notre robot a 4 moteurs, l'objectif est de les actionner pour : Fermer la pince pour saisir un objet Déplacer la pince pour déplacer l'objet Ouvrir la pince pour lâcher l'objet Les 4 moteurs contrôlent 4 mouvements possibles : Moteur 1 : Base Moteur 2 : Coude Moteur 3 : Épaule Moteur 4 : Pince https://www.youtube.com/watch?v=xQkPjDEbFoU Attention chaque Servomoteur possède des positions maximums et minimums à bien respecter pour pas que ce dernier ne fonctionne plus. Voici un tableau qui regroupe ces valeurs si vous l'avez monter comme dans la phase 1 : Pour ouvrir et fermer la pince c'est donc facile, on actionne le moteur 4. Espace Cartésien : les mouvements de la pince et des objets Espace articulaire : les mouvements des moteurs La question principale qu'on se pose c'est comment actionner mes moteurs pour faire bouger ma pince comme je veux ? C'est le modèle cinématique inverse. On peut aussi se demander : si je bouge mes moteurs à telle position, quelle sera la position de ma pince ? C'est le modèle cinématique direct. Voici un code mblock qui permet de prendre un objet à une où le coude est à la position 140 et l'épaule à la position 150. Epaule : Pin 6 Coude : Pin 9 Base : Pin 3 Pince : Pin 13 Partie 1 : Partie 2 : Code traduit en Arduino #include Servo monServo1; Servo monServo2; // Création de l'objet Servo Servo monServo3; Servo monServo4; void setup() { monServo1.attach(3); monServo2.attach(6); monServo3.attach(9); monServo4.attach(13); // Attache le servomoteur à la broche définie monServo1.write(0); monServo2.write(90); monServo3.write(180); monServo4.write(90); } void loop() { delay(1000); // Balayage de 0° à 180° for (int angle =0; angle <= 90; angle++) { monServo1.write(angle); // Déplace le servo à l'angle spécifié delay(10); // Pause pour que le servo ait le temps de bouger } delay(1000); for (int angle =180; angle >= 140; angle--) { monServo3.write(angle); // Déplace le servo à l'angle spécifié delay(10); // Pause pour que le servo ait le temps de bouger } delay(1000); for (int angle =90; angle <= 150; angle++) { monServo2.write(angle); // Déplace le servo à l'angle spécifié delay(10); // Pause pour que le servo ait le temps de bouger } delay(1000); for (int angle =90; angle <= 150; angle++) { monServo4.write(angle); // Déplace le servo à l'angle spécifié delay(10); // Pause pour que le servo ait le temps de bouger } delay(1000); for (int angle =150; angle >= 90; angle--) { monServo2.write(angle); // Déplace le servo à l'angle spécifié delay(10); // Pause pour que le servo ait le temps de bouger } delay(1000); for (int angle =140; angle <= 180; angle++) { monServo3.write(angle); // Déplace le servo à l'angle spécifié delay(10); // Pause pour que le servo ait le temps de bouger } delay(1000); for (int angle =90; angle >= 0; angle--) { monServo1.write(angle); // Déplace le servo à l'angle spécifié delay(10); // Pause pour que le servo ait le temps de bouger } delay(1000); for (int angle =180; angle >= 140; angle--) { monServo3.write(angle); // Déplace le servo à l'angle spécifié delay(10); // Pause pour que le servo ait le temps de bouger } delay(1000); for (int angle =90; angle <= 150; angle++) { monServo2.write(angle); // Déplace le servo à l'angle spécifié delay(10); // Pause pour que le servo ait le temps de bouger } delay(1000); for (int angle =150; angle >= 90; angle--) { monServo4.write(angle); // Déplace le servo à l'angle spécifié delay(10); // Pause pour que le servo ait le temps de bouger } delay(1000); for (int angle =90; angle <= 150; angle++) { monServo4.write(angle); // Déplace le servo à l'angle spécifié delay(10); // Pause pour que le servo ait le temps de bouger } delay(1000); for (int angle =150; angle >= 90; angle--) { monServo2.write(angle); // Déplace le servo à l'angle spécifié delay(10); // Pause pour que le servo ait le temps de bouger } delay(1000); for (int angle =140; angle <= 180; angle++) { monServo3.write(angle); // Déplace le servo à l'angle spécifié delay(10); // Pause pour que le servo ait le temps de bouger } delay(1000); } Sources Cinématique des robots série : https://howtomechatronics.com/tutorials/arduino/diy-arduino-robot-arm-with-smartphone-control/ https://poppy.discourse.group/t/presentation-dun-travail-de-cinematique-2d-avec-le-robot-poppy-ergo-jr-1ere-s/2611 https://poppy.discourse.group/t/algorithme-de-cinematique-inverse-applique-a-poppy-inverse-kinematic-algorithm-applied-to-poppy/1582 https://learn.ros4.pro/fr/theory/ https://files.ros4.pro/theorie.pdf https://www.youtube.com/watch?v=vKD20BTkXhk Robot série à parallélogramme : https://www.youtube.com/watch?v=GnrRk9mWv7A https://www.youtube.com/watch?v=xQkPjDEbFoU https://www.youtube.com/watch?v=Z7HWoh_MR1s https://drive.google.com/drive/folders/1zaOw2QcZatylyqQoVnYhIK7iysyCOY2d https://www.youtube.com/watch?v=Q9JOKQaIR1w Un peu complexe : https://eduscol.education.fr/sti/ressources_pedagogiques/analyse-et-performance-cinematique-dun-robot-bi-articule#fichiers-liens https://eduscol.education.fr/sti/sites/eduscol.education.fr.sti/files/ressources/pedagogiques/14480/14480-1-robot-bi-articule-doc-ressource.pdf