MK2 Plus robotarmcontroller
Componenten en benodigdheden
| × | 1 | ||||
| × | 3 | ||||
| × | 1 | ||||
| × | 3 | ||||
| × | 3 |
Benodigde gereedschappen en machines
|
Apps en online services
|
Over dit project
De EEZYBOT MK2-arm
Als je op thingiverse.com hebt gezocht naar coole robotarmen, is de kans groot dat je dit bent tegengekomen. De EEZYBOT MK2-arm (ontworpen door de briljante daghizmo) deelt de kinematische koppeling van de ABB IRB460, verkleind met een verhouding van 1:7. Deze arm is echter ontworpen om met servo's te werken, waardoor hij een beetje wankel en minder sierlijk is. Er is echter een betere oplossing. De MK2 Plus-arm die hier te vinden is, https://www.thingiverse.com/thing:2520572, is een geremixte versie van de originele MK2-arm die 3 stappenmotoren gebruikt om de verbindingen te verplaatsen.
Het afdrukken hiervan duurt even, dus maak een bladwijzer voor dit artikel, laat alles afdrukken en kom terug als u klaar bent! (Het duurt een paar dagen)
Als je problemen hebt met het monteren van de arm, zijn er genoeg tutorials online te vinden.
Een thuispositie selecteren
In tegenstelling tot servo's hebben stappenmotoren geen positioneel bewustzijn. We zullen dit moeten verhelpen door eerst een homing-routine in te stellen wanneer de arm wordt ingeschakeld. We zullen 3 eindschakelaars gebruiken om onze thuispositie in te stellen. De koppelingen werken op een ietwat complexe manier, maar je zult gemakkelijk begrijpen waar je de schakelaars moet plaatsen als je de arm eenmaal hebt gemonteerd en ziet hoe alles beweegt.
(d.w.z. er is geen XY zoals een cartesiaans systeem, maar we zullen ze toch zo noemen om het gemakkelijker te maken)
U kunt de Z-eindschakelaar overal op de hoofdbasis van de arm plaatsen. Voeg een beetje hete lijm toe zodat je draden niet loskomen als de arm beweegt.
Bedrading
Bedrading is vrij eenvoudig, omdat alle terminals op het CNC-schild zijn gemarkeerd. Sluit uw A4988-stuurprogramma's niet op de verkeerde manier aan! De stappenmotor aan de zijkant met de Y-eindschakelaar moet worden aangesloten op de aansluiting voor de Y-stappenmotor in uw CNC-shield. Hetzelfde geldt voor de motor aan de zijkant van de X-eindschakelaar. (We noemen deze X en Y omdat het gemakkelijker is om op deze manier met het CNC-schild om te gaan) Sluit de laatste stepper die de basis van de arm roteert aan op de Z-terminal en bedraad de eindstops volgens hun naam. Polariteit doet er niet toe.
Zoek een degelijke 12V-voeding die de motoren van stroom kan voorzien zonder af te slaan.
Code
Terzake. We zullen de AccelStepper-bibliotheek voor Arduino gebruiken om de steppers soepel te besturen. Met deze bibliotheek kunt u eenvoudig meerdere stappenmotoren tegelijk versnellen, vertragen en laten draaien. U kunt deze bibliotheek rechtstreeks via de Arduino IDE verkrijgen met behulp van Bibliotheekbeheer (Schets> Bibliotheek opnemen> Bibliotheekbeheer)
Je kunt het ook krijgen van de originele makerspagina op airspayce. https://www.airspayce.com/mikem/arduino/AccelStepper/
Nu we alles hebben wat we nodig hebben, gaan we de code stap voor stap doornemen.
Eerst zullen we enkele namen definiëren voor de pinnen die we gaan gebruiken. U kunt een speldendiagram van het CNC-schild vinden met een snelle Google-zoekopdracht voor afbeeldingen. We zullen ook de AccelStepper-objecten maken voor onze 3 stappenmotoren.
#define XSTEP 2 //Stappenmotor Stappen
#define YSTEP 3
#define ZSTEP 4
#define XDIR 5 // Stappenmotor Richtingsbesturingspen
#define YDIR 6
#define ZDIR 7
#define ENABLE 8 // CNC Shield Enable Pin
#define XLIMIT 9 // Pins eindschakelaar
#define YLIMIT 10
#define ZLIMIT 11
#define XMOTORACC 250 // Waarden voor acceleratie en maximale snelheid
#define XMOTORMAXSPEED 1000
#define YMOTORACC 250
#define YMOTORMAXSPEED 1000
# omvatten
AccelStepper XMOTOR(1,XSTEP,XDIR);
AccelStepper YMOTOR(1,YSTEP,YDIR);
AccelStepper ZMOTOR(1,ZSTEP,ZDIR);
Laten we een kleine hulpfunctie maken om onze pinnen in te stellen.
void pinsetup(){
pinMode(ENABLE,OUTPUT);
digitalWrite(ENABLE,LOW);
pinMode(XLIMIT,INPUT_PULLUP);
pinMode( YLIMIT,INPUT_PULLUP);
pinMode(ZLIMIT,INPUT_PULLUP);
}
Nu dat gedaan is, gaan we de logica van onze thuisroutine eens doornemen.
void autohome(){ //We gebruiken dit om onze homing-routine aan te roepen
xyhome();
zhome();
}
void xyhome () {
int initial_xhome =-1;
int initial_yhome =-1;
// Stel de maximale snelheid en versnelling van elke stepper in bij het opstarten voor homing
XMOTOR.setMaxSpeed(500.0 ); // Stel de maximale snelheid van de stepper in (langzamer voor een betere nauwkeurigheid)
XMOTOR.setAcceleration (50.0); // Stel versnelling van stepper in
YMOTOR.setMaxSpeed (500.0); // Stel de maximale snelheid van de stepper in (langzamer voor een betere nauwkeurigheid)
YMOTOR.setAcceleration (50.0); // Stel de versnelling van de stappenmotor in
// Start de homing-procedure van de stappenmotor bij het opstarten
while (digitalRead(YLIMIT)) { // Laat de stappenmotor linksom bewegen totdat de schakelaar wordt geactiveerd
XMOTOR. moveTo(initial_xhome); // Stel de positie in om te verplaatsen naar
YMOTOR.moveTo(initial_yhome); // Stel de positie in om naar
te gaan initial_xhome--; // Verlaag indien nodig met 1 voor de volgende zet
initial_yhome--;
XMOTOR.run(); // Begin met het verplaatsen van de stepper
YMOTOR.run();
delay(5);
}
XMOTOR.setCurrentPosition(0); // Stel de huidige positie voorlopig in op nul
YMOTOR.setCurrentPosition(0);
initial_xhome =-1;
initial_yhome =1;
while(digitalRead(XLIMIT)){
XMOTOR.moveTo(initial_xhome); // Stel de positie in om te verplaatsen naar
YMOTOR.moveTo(initial_yhome); // Stel de positie in om naar
te gaan initial_xhome--; // Verlaag indien nodig met 1 voor de volgende zet
initial_yhome++;
XMOTOR.run(); // Begin met het verplaatsen van de stepper
YMOTOR.run();
delay(5);
}
YMOTOR.setCurrentPosition(0); // Stel de huidige positie voorlopig in op nul
YMOTOR.setMaxSpeed(250.0); // Stel de maximale snelheid van de stepper in (langzamer om een betere nauwkeurigheid te krijgen)
YMOTOR.setAcceleration (10.0); // Stel versnelling van Stepper in
initial_yhome =1;
while (!digitalRead(YLIMIT)) { // Laat de Stepper CW bewegen totdat de schakelaar is gedeactiveerd
YMOTOR.moveTo(initial_yhome);
YMOTOR.run();
initial_yhome++;
delay(5);
}
YMOTOR.setCurrentPosition(0);
YMOTOR.setMaxSpeed(YMOTORMAXSPEED ); // Stel de maximale snelheid van de stepper in (sneller voor regelmatige bewegingen)
YMOTOR.setAcceleration (YMOTORACC); // Stel versnelling van Stepper in
XMOTOR.setCurrentPosition (0); // Stel de huidige positie voorlopig in op nul
XMOTOR.setMaxSpeed(250.0); // Stel de maximale snelheid van de stepper in (langzamer om een betere nauwkeurigheid te krijgen)
XMOTOR.setAcceleration (10.0); // Stel versnelling van Stepper in
initial_xhome =1;
while (!digitalRead(XLIMIT)) { // Laat de Stepper CW bewegen totdat de schakelaar is gedeactiveerd
XMOTOR.moveTo(initial_xhome);
XMOTOR.run();
initial_xhome++;
delay(5);
}
XMOTOR.setCurrentPosition(0);
XMOTOR.setMaxSpeed(XMOTORMAXSPEED ); // Stel de maximale snelheid van de stepper in (sneller voor regelmatige bewegingen)
XMOTOR.setAcceleration (XMOTORACC); // Stel de versnelling van de stepper in
}
void zhome() {
int initial_zhome =-1;
// Stel de maximale snelheid en versnelling van elke stepper in bij het opstarten voor homing
ZMOTOR.setMaxSpeed (100.0); // Stel de maximale snelheid van de stepper in (langzamer om een betere nauwkeurigheid te krijgen)
ZMOTOR.setAcceleration (100.0); // Stel de versnelling van de stappenmotor in
// Start de homing-procedure van de stappenmotor bij het opstarten
while (digitalRead(ZLIMIT)) { // Laat de stappenmotor linksom bewegen totdat de schakelaar wordt geactiveerd
ZMOTOR. moveTo(initiële_zhome); // Stel de positie in om te verplaatsen naar
initial_zhome--; // Verlaag indien nodig met 1 voor de volgende zet
ZMOTOR.run(); // Begin met het verplaatsen van de stepper
delay(5);
}
ZMOTOR.setCurrentPosition(0); // Stel de huidige positie voorlopig in op nul
ZMOTOR.setMaxSpeed (50.0); // Stel de maximale snelheid van de stepper in (langzamer om een betere nauwkeurigheid te krijgen)
ZMOTOR.setAcceleration (50.0); // Stel versnelling van Stepper in
initial_zhome =1;
while (!digitalRead(ZLIMIT)) { // Laat de Stepper CW bewegen totdat de schakelaar is gedeactiveerd
ZMOTOR.moveTo(initial_zhome);
ZMOTOR.run();
initial_zhome++;
delay(5);
}
ZMOTOR.setCurrentPosition(0);
ZMOTOR.setMaxSpeed(1000.0 ); // Stel de maximale snelheid van de stepper in (sneller voor regelmatige bewegingen)
ZMOTOR.setAcceleration(1000.0); // Versnelling van Stepper instellen
}
Oké, dus dat is veel code. Wat gebeurt hier echt? De arm voert eerst een homing-routine uit op de X- en Y-motoren. Vanwege de manier waarop de koppelingen werken, gaat dit in een paar stappen. (Je kunt de video aan het einde zien om dit in actie te zien)
- Eerst worden de X- en Y-motoren in tegengestelde richting bewogen, zodat eerst de Y-eindschakelaar wordt ingedrukt.
- Zodra de Y-eindschakelaar wordt ingedrukt, draaien beide motoren in dezelfde richting zodat de X-eindschakelaar wordt ingedrukt.
- Nadat de X-schakelaar is ingedrukt, worden de motoren een klein beetje verplaatst zodat de schakelaars ingedrukt zijn (ingedrukt zoals in, niet het trieste soort depressief.)
- Eindelijk wordt de Z-motor gedraaid zodat de Z-eindschakelaar wordt ingedrukt.
Je moet heel voorzichtig zijn wanneer je de homing-procedure voor de eerste keer uitvoert. Als uw steppers de andere kant op bewegen, SCHAKEL dan gewoon DE STROOM UIT, en draai DAARNA de connector van de motor om.
Nu dat is gebeurd, roept u autohome() aan vanuit uw setup()-functie zodat deze maar één keer wordt uitgevoerd. Laat je loop() leeg. En houd een hand op uw stroomvoorziening om deze uit te schakelen als er iets misgaat.
void setup() {
// plaats hier uw setup-code, om één keer uit te voeren:
Serial.begin(9600);
pinsetup();
autohome();
Serial.println("HOMING OK");
}
Als je geluk hebt, draaien je motoren de goede kant op, klikken de eindschakelaars precies goed en werkt de homing-routine zonder problemen. Maar als je net als ik bent, zul je kleine veranderingen moeten doorvoeren voordat alles draait. Koppel dus altijd de stroom af als de homing fout gaat, zodat je je 3D-geprinte arm niet verpest.
Ten slotte kunt u uw eigen logica in de loop() schrijven, zodat uw arm in de gewenste posities komt. Door de manier waarop de arm is gekoppeld, besturen de X- en Y-motoren de eindeffector op een bijna cartesiaanse manier.
void loop() {
XMOTOR.runToNewPosition(100);
delay(1000);
YMOTOR.runToNewPosition(50);
delay(1000);
YMOTOR.runToNewPosition(-50);
delay(1000);
YMOTOR.runToNewPosition(0);
delay(1000);
XMOTOR.runToNewPosition( 0);
vertraging(1000);
}
Conclusie
Ik heb veel tutorials gezien over het gebruik van de populaire GRBL-firmware om deze arm te bedienen. Dit betekent echter dat je een computer nodig hebt om seriële commando's naar de arm te sturen om hem te laten bewegen. Als je de MK2-arm maar een paar bewegingen nodig hebt, kun je ze eenvoudig hardcoderen in de Arduino en hem zijn eigen ding laten doen.
Dat betekent niet dat je dit niet kunt regelen met seriële commando's! U kunt hier eenvoudig een seriële scheidingstekencode in opnemen en de XY- en Z-motorstappen als een string verzenden (gescheiden met speciale tekens - bijv. 5, 6, 7* die de X-motor met 5 stappen zou verplaatsen, de Y met 6 en de Z bij 7. De * wordt gebruikt om het einde van de string aan te geven).
Je kunt dit ook verder ontwikkelen om de 3D-ruimtecoördinaten van de eindeffector te verzenden en de Arduino de vereiste stappen te laten berekenen met behulp van inverse kinematica, of zelfs elementaire trigonometrie.
Veel plezier! En mijn oprechte dank aan alle briljante ontwerpers op Thingiverse!
Code
- robotarm
robotArmArduino
Pak de bestanden uit en open met Arduino IDEGeen voorbeeld (alleen downloaden).
MK2 Robotarm-controller - Github
Link naar github-repositoryhttps://github.com/yasaspeiris/MK2-Robot-Arm-ControllerAangepaste onderdelen en behuizingen
Robotarm MK2 Plus op Thingiverse
Credits voor het ackyltle CAD-bestand op thingiverse.comProductieproces
- Motorcontroller integreert Arm Cortex-M0 core
- Dual Arm SCARA-robot
- MeArm Robotarm - Uw robot - V1.0
- Robotarm bestuurd via Ethernet
- Littlearm 2C:bouw een 3D-geprinte Arduino-robotarm
- DIY Arduino-robotarm – bestuurd door handgebaren
- Bedien de Arduino-robotarm met Android-app
- Joystick-controller voor MeArm Robot - Opnamecoördinaten
- Realtime Robotics onthult nieuwe robotcontrollercomputer
- Draaicentrum uitgerust met robotarm
- Robot combineert collaboratieve robotarm met mobiel platform