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.h>
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://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 :
No Comments