Stepper Delta Robot

https://www.thingiverse.com/thing:4294731

This is a fun little delta robot that is mostly 3D printed with no special parts. The delta robot uses 3 stepper motors to move.

Parts Required

  • 1x Arduino UNO
  • 1x CNC shield
  • 3x 28byj-48 Stepper motor
  • 3x Limit switch
  • 6x 7x40mm Springs (end to end)
  • 6x M3 nuts
  • 30x M3 screws
  • 3D printed parts
    • 1x base
    • 3x arms
    • 6x connecting rods
    • 3x parallels
    • 1x platform

Printing

The parts do not need to be printed with high quality but it helps.
Some of the parts of the robot are difficult to print because they are a sphere. When the print starts (depending on printing settings), the spheres do not have much to start printing on. After some experimenting, I worked out it was better to drop the part down into the bed by 0.2-0.3mm (Z=-0.2 or -0.3mm).
After the prints finished printing its best to file/sand the sphere and the sphere socket to make them smooth. Avoid taking too much off.

How It is Assembled

Starting from the top and working down the robot stating with the base. The base is where the motors and limit switches are mounted. The base will also be used to hold the robot while in operation. The limit switch will be used to HOME the robot.
After the motors and limit switches are mounted the arms can be attached to the motor. Ensure the arm is the correct way around with notch facing away from the robot.

Next is to assemble the connecting rods, the connecting rods are used to connect the arms/motors to the platform. Connect the parallel 3d part to the middle of 2 connecting rods with M3 screws, it will be best if you first drill the parallel 3d part with a 3mm to make the screw more smooth. The parallels will ensure the connecting rods do not rotate out of the sockets.
Next, add 2 springs to the connecting rods, 1 at the top and 1 at the bottom, going between each side. The springs will help the spheres of the arms and the platform stay within there socket.

After the connecting rods are assembled, they can be attached to the robot. 1 at a time, attach the connecting rod from the arm to the platform. I used a bit of graphite powder on the spheres and sockets to help them slide around easily. The first end of the connecting rods is easy to get in place, the other is not as much. you will need to force each side of the connecting rod a little bit apart and push it into place. try not to pull them too far apart, you don’t want to bend the part. Once in place, the connecting rod should stay in place, they could pop out when the robot puts them in tight angles.

The Controller and Software

The controller is an Arduino UNO with a CNC sheld. X, Y and Z Stepper motor drivers are used to control the stepper motors. Each arm has 1 stepper motor and 1 limit switch. The limit switch is connected to the corosponding axis pin and ground (if the stepper motor uses the X axis driver, then it will use the X limit switch)

The sotfware is below and requires 2 libraries, DeltaKinematics and AccelStepper. DeltaKinematics is used to calulate the forward and inverse kinematics of the delta robot. The AccelStepper is used to control the stepper motors. Both have links below.

Delta Kinematics library: https://github.com/tinkersprojects/Delta-Kinematics-Library
AccelStepper library: https://www.arduinolibraries.info/libraries/accel-stepper
Gcode library: https://github.com/tinkersprojects/G-Code-Arduino-Library

Code for Project

GNU General Public License v3.0

#include <DeltaKinematics.h>
#include <AccelStepper.h>

#define Multiplier 91.02222222
#define HomeAngle -79 //11 degrees from vertical or 79 degrees from horizontal


#define Speed 1000
#define Acceleration 50000000.0

#define AStepPin 2
#define BStepPin 3
#define CStepPin 4

#define ADirPin 5
#define BDirPin 6
#define CDirPin 7

#define ALimitPin 9
#define BLimitPin 10
#define CLimitPin 11

#define enablePin 8

DeltaKinematics DK(0.040,0.126,0.035,0.035);

AccelStepper stepperA(1,AStepPin,ADirPin);
AccelStepper stepperB(1,BStepPin,BDirPin);
AccelStepper stepperC(1,CStepPin,CDirPin);

void setup() 
{  
  Serial.begin(115200);
  
  pinMode(ALimitPin, INPUT_PULLUP);
  pinMode(BLimitPin, INPUT_PULLUP);
  pinMode(CLimitPin, INPUT_PULLUP);
  pinMode(enablePin, OUTPUT);
  digitalWrite(enablePin,HIGH);
  
  stepperA.setMaxSpeed(Speed);
  stepperA.setSpeed(Speed);
  stepperA.setCurrentPosition(0);
  stepperA.setAcceleration(Acceleration);
  
  stepperB.setMaxSpeed(Speed);
  stepperB.setSpeed(Speed);
  stepperB.setCurrentPosition(0);
  stepperB.setAcceleration(Acceleration);
  
  stepperC.setMaxSpeed(Speed);
  stepperC.setSpeed(Speed);
  stepperC.setCurrentPosition(0);
  stepperC.setAcceleration(Acceleration);

  
  Serial.println("START");
  Serial.println("Enabling");
  
  Enabled();
  Serial.println("HOME");
  HomeMachine();
  Serial.println("SETTING");
}

void loop() 
{

  DK.x =  0.000;
  DK.y =  0.000;
  DK.z = -0.100;
  SetMotors();  // cal of inverse Delta Kinematics is done inside SetMotors()
  delay(3000);

  DK.x =  0.000;
  DK.y =  0.050;
  DK.z = -0.100;
  SetMotors();  // cal of inverse Delta Kinematics is done inside SetMotors()
  delay(3000);

  DK.x =  0.000;
  DK.y = -0.050;
  DK.z = -0.100;
  SetMotors();  // cal of inverse Delta Kinematics is done inside SetMotors()
  delay(3000);
}



void SetMotors()
{  
  Serial.print("Error"); 
  Serial.println(DK.inverse()); // cal inverse Delta Kinematics
  double A = DK.a*Multiplier;
  double B = DK.b*Multiplier;
  double C = DK.c*Multiplier;
  Serial.println(DK.a);
  Serial.println(DK.b);
  Serial.println(DK.c);
  Serial.println(DK.x);
  Serial.println(DK.y);
  Serial.println(DK.z);
  Serial.println();
  stepperA.moveTo(A);
  stepperB.moveTo(B);
  stepperC.moveTo(C);
  
  while(stepperA.distanceToGo() != 0 || stepperB.distanceToGo() != 0 || stepperC.distanceToGo() != 0)
  {
    stepperA.run();
    stepperB.run();
    stepperC.run();
  }
}












void Enabled()
{
  digitalWrite(enablePin,LOW);
}

void Disabled()
{
  digitalWrite(enablePin,HIGH);
}


void HomeMachine()
{
  while(digitalRead(ALimitPin) == HIGH || digitalRead(BLimitPin) == HIGH || digitalRead(CLimitPin) == HIGH)
  {
    if(digitalRead(ALimitPin) == HIGH)
    {
      stepperA.move(-10);
      stepperA.run();
    }
    if(digitalRead(BLimitPin) == HIGH)
    {
      stepperB.move(-10);
      stepperB.run();
    }
    if(digitalRead(CLimitPin) == HIGH)
    {
      stepperC.move(-10);
      stepperC.run();
    }    
  }
  
  stepperA.setCurrentPosition(HomeAngle*Multiplier);
  stepperB.setCurrentPosition(HomeAngle*Multiplier);
  stepperC.setCurrentPosition(HomeAngle*Multiplier);
}

Related Projects

G-Code-Arduino-Library

G-Code-Arduino-Library

This is a library that allows any machine or robot to be controlled by G-Code What is G-Code? G-Code is the instructions that 3D Printer and CNC used to create there part. G-Code is a set of instruction commands sent to the controller of the machine to be performed. Position, feed rate, and tool used are some of the items that G-Code can control. The G-Code can either be sent from the …
Read more


Servo Delta Robot

Servo Delta Robot

I found the Delta Robot to be interesting in how it works and how it can be used. I thought it would be interesting to try and make one out of parts I had around and 3D printed parts. Unlike most of the Delta 3D printers, this robot uses a hinge method. This method gives the robot more flexibility than the ball joint.This robot uses 3 hobby servos with arms and rods to allow the robot to move …
Read more


Delta-Kinematics-Library

Delta-Kinematics-Library

Delta-Kinematics-Library https://tinkersprojects.com/ Forward and Inverse Kinematics Library for Delta robot. Thank you to: http://forums.trossenrobotics.com/tutorials/introduction-129/delta-robot-kinematics-3276/ https://www.marginallyclever.com/other/samples/fk-ik-test.html …
Read more


Latest Projects

Popular Projects