Contrôleur de Bras Robotique MK2 Plus DIY
Composants et Fournitures
| Shield CNC | × | 1 |
| Moteurs Pas-à-Pas NEMA 17 (OpenBuilds ou génériques) | × | 3 |
| Arduino UNO | × | 1 |
| Drivers A4988 (SparkFun ou génériques) | × | 3 |
| Fins de course Micro (OpenBuilds) | × | 3 |
Outils Nécessaires
- Imprimante 3D
Logiciels
- Arduino IDE
À Propos du Projet
Le Bras EEZYBOT MK2
Le bras EEZYBOT MK2 (par daghizmo sur Thingiverse) reprend la cinématique de l'ABB IRB460 à l'échelle 1:7. Version originale à servomoteurs : moins précis. La version MK2 Plus (Thingiverse) utilise 3 moteurs pas-à-pas pour les liaisons – bien plus fluide et précis. Impression 3D longue (quelques jours).
Choix de la Position « Home »
Contrairement aux servos, les moteurs pas-à-pas n'ont pas de conscience de position. Routine de « homing » au démarrage via 3 fins de course. La cinématique est complexe mais intuitive une fois le bras assemblé.
- Fin de course Z : n'importe où sur la base principale
- Fins de course X et Y : sur les liaisons latérales (repères visuels sur photos)
Câblage
Shield CNC : bornes repérées. Attention au sens des drivers A4988 !
- Moteur côté fin de course Y → borne Y du shield
- Moteur côté fin de course X → borne X du shield
- Moteur rotation base → borne Z du shield
- Fins de course selon leurs noms (polarité indifférente)
Alimentation 12V suffisante pour éviter le décrochage des moteurs.
Code (Bibliothèque AccelStepper)
Utilisation de AccelStepper (gestionnaire de bibliothèque Arduino ou site officiel) pour mouvements fluides, accélération/décélération, multi-moteurs simultanés.
Définitions des Pins et Constantes
#define XSTEP 2
#define YSTEP 3
#define ZSTEP 4
#define XDIR 5
#define YDIR 6
#define ZDIR 7
#define ENABLE 8
#define XLIMIT 9
#define YLIMIT 10
#define ZLIMIT 11
#define XMOTORACC 250
#define XMOTORMAXSPEED 1000
#define YMOTORACC 250
#define YMOTORMAXSPEED 1000
#include <AccelStepper.h>
AccelStepper XMOTOR(1, XSTEP, XDIR);
AccelStepper YMOTOR(1, YSTEP, YDIR);
AccelStepper ZMOTOR(1, ZSTEP, ZDIR);
Configuration des Pins
void pinsetup() {
pinMode(ENABLE, OUTPUT);
digitalWrite(ENABLE, LOW);
pinMode(XLIMIT, INPUT_PULLUP);
pinMode(YLIMIT, INPUT_PULLUP);
pinMode(ZLIMIT, INPUT_PULLUP);
}
Routine de Homing (Auto-Home)
void autohome() {
xyhome();
zhome();
}
void xyhome() {
int initial_xhome = -1;
int initial_yhome = -1;
// Vitesses lentes pour précision homing
XMOTOR.setMaxSpeed(500); XMOTOR.setAcceleration(50);
YMOTOR.setMaxSpeed(500); YMOTOR.setAcceleration(50);
// 1. X et Y en sens opposés jusqu'à activation fin de course Y
while (digitalRead(YLIMIT)) {
XMOTOR.moveTo(initial_xhome);
YMOTOR.moveTo(initial_yhome);
initial_xhome--; initial_yhome--;
XMOTOR.run(); YMOTOR.run(); delay(5);
}
XMOTOR.setCurrentPosition(0);
YMOTOR.setCurrentPosition(0);
// 2. X et Y même sens jusqu'à activation fin de course X
initial_xhome = -1; initial_yhome = 1;
while (digitalRead(XLIMIT)) {
XMOTOR.moveTo(initial_xhome);
YMOTOR.moveTo(initial_yhome);
initial_xhome--; initial_yhome++;
XMOTOR.run(); YMOTOR.run(); delay(5);
}
YMOTOR.setCurrentPosition(0);
// 3. Recul léger pour libérer fin de course Y
YMOTOR.setMaxSpeed(250); YMOTOR.setAcceleration(10);
initial_yhome = 1;
while (!digitalRead(YLIMIT)) {
YMOTOR.moveTo(initial_yhome);
YMOTOR.run(); initial_yhome++; delay(5);
}
YMOTOR.setCurrentPosition(0);
YMOTOR.setMaxSpeed(YMOTORMAXSPEED); YMOTOR.setAcceleration(YMOTORACC);
// 4. Recul léger pour libérer fin de course X
XMOTOR.setMaxSpeed(250); XMOTOR.setAcceleration(10);
initial_xhome = 1;
while (!digitalRead(XLIMIT)) {
XMOTOR.moveTo(initial_xhome);
XMOTOR.run(); initial_xhome++; delay(5);
}
XMOTOR.setCurrentPosition(0);
XMOTOR.setMaxSpeed(XMOTORMAXSPEED); XMOTOR.setAcceleration(XMOTORACC);
}
void zhome() {
int initial_zhome = -1;
ZMOTOR.setMaxSpeed(100); ZMOTOR.setAcceleration(100);
while (digitalRead(ZLIMIT)) {
ZMOTOR.moveTo(initial_zhome);
initial_zhome--;
ZMOTOR.run(); delay(5);
}
ZMOTOR.setCurrentPosition(0);
ZMOTOR.setMaxSpeed(50); ZMOTOR.setAcceleration(50);
initial_zhome = 1;
while (!digitalRead(ZLIMIT)) {
ZMOTOR.moveTo(initial_zhome);
ZMOTOR.run(); initial_zhome++; delay(5);
}
ZMOTOR.setCurrentPosition(0);
ZMOTOR.setMaxSpeed(1000); ZMOTOR.setAcceleration(1000);
}
Setup et Boucle Principale
void setup() {
Serial.begin(9600);
pinsetup();
autohome();
Serial.println("HOMING OK");
}
void loop() {
// Exemple mouvements : à remplacer par votre logique
XMOTOR.runToNewPosition(100); delay(1000);
YMOTOR.runToNewPosition(50); delay(1000);
YMOTOR.runToNewPosition(-50); delay(1000);
YMOTOR.runToNewPosition(0); delay(1000);
XMOTOR.runToNewPosition(0); delay(1000);
}
Conclusion
Alternative au firmware GRBL (nécessite PC) : mouvements codés en dur dans l'Arduino pour autonomie. Possibilité d'ajouter commande série (ex: « 5,6,7* » pour déplacements X,Y,Z) ou cinématique inverse pour coordonnées 3D.
Merci aux concepteurs brillants de Thingiverse !
Code complet : GitHub
Modèle 3D : MK2 Plus sur Thingiverse (crédits ackyltle)
Processus de fabrication
- Infineon lance le contrôleur moteur IMC300 avec Cortex-M0 intégré pour flexibilité accrue
- Robot SCARA double bras : Solutions avancées d'assemblage et production
- Bras Robotique MeArm V1.0 – Construisez Votre Bras Robotisé Arduino et Raspberry Pi
- Bras robotique piloté par Ethernet : contrôle à distance simplifié
- LittleArm 2C : Bras Robot 3D Imprimé Arduino pour Éducation STEM
- Bras robotique Arduino contrôlé par gestes manuels – Construction DIY pas à pas
- Realtime Robotics lance un contrôleur avancé pour simplifier l'intégration et accélérer le déploiement
- Yama Seiki GA-2000CR : Centre de tournage compact avec bras robot et système palette avancés
- KUKA KMR iiwa : bras robotique collaboratif mobile pour l'Industrie 4.0