Skip to content

MicroBot

Brandon King| Summer, 2022

Thesis

The goal with Microbot was to design a small 6DOF robot arm, while retaining the ability to pickup >200g payload. I was a broke college student at the time, so the smaller joint lengths meant less money spent on motors.


I started the napkin sketch phase as I always do:

  1. Patent Research
  2. Open source docs
  3. Technical Papers


After some quick calculations arm length and torque calcs, I landed on this design footprint which was 300mm x 300mm:


Microbot CAD Model

Early CAD model


Design Process

I believe design and hardware iteration should be intertwined. Often these two are seperated which leads to a delayed feedback loops


For about a month I spent my nights testing and iterating on each joint. This process includes tolerances, ease of assembly, wiring configurations, etc.


Chess.com Tweet Screenshot

Full Assembly


Initial testing

Once each joint had been redesigned a few times, I landed on a aesthetic/function that I was happy with. Initial testing of the assembled arm included: testing motors/electronics, stopless homing, etc.

Axis Homing

Homing Code

6DOF Homing Code Snippet
delay(10000);
digitalWrite(EN321_PIN, LOW);
digitalWrite(EN4_PIN, LOW);
digitalWrite(EN5_PIN, LOW);
digitalWrite(EN6_PIN, LOW);
delay(1000);
// go to the home position (all joints equal to 0)
// joint #2
digitalWrite(DIR2_PIN, HIGH);
int delValue=4000;
int incValue = 7;
int accRate=530;
int totSteps=2791*2;
for (int i=0; i < totSteps; i++)
{
 if (totSteps > (2*accRate + 1)){
    if (i < accRate){
      //acceleration
      delValue = delValue - incValue;
    } else if (i > (totSteps - accRate)){
      //decceleration
      delValue = delValue + incValue;
    }
  } else {
    //no space for proper acceleration/decceleration
    if (i < ((totSteps - (totSteps % 2))/2)){
      //acceleration
      delValue = delValue - incValue;
    } else if (i > ((totSteps + (totSteps % 2))/2)){
      //decceleration
      delValue = delValue + incValue;
    }
  }
  digitalWrite(PUL2_PIN, HIGH);
  delayMicroseconds(delValue);
  digitalWrite(PUL2_PIN, LOW);
  delayMicroseconds(delValue);
}
// joint #3
digitalWrite(DIR3_PIN, HIGH);
delValue=4000;
incValue=7;
accRate=530;
totSteps=6569;
for (int i=0; i < totSteps; i++)
{
 if (totSteps > (2*accRate + 1)){
    if (i < accRate){
      //acceleration
      delValue = delValue - incValue;
    } else if (i > (totSteps - accRate)){
      //decceleration
      delValue = delValue + incValue;
    }
  } else {
    //no space for proper acceleration/decceleration
    if (i < ((totSteps - (totSteps % 2))/2)){
      //acceleration
      delValue = delValue - incValue;
    } else if (i > ((totSteps + (totSteps % 2))/2)){
      //decceleration
      delValue = delValue + incValue;
    }
  }
  digitalWrite(PUL3_PIN, HIGH);
  delayMicroseconds(delValue);
  digitalWrite(PUL3_PIN, LOW);
  delayMicroseconds(delValue);
}
// joint #5
digitalWrite(DIR5_PIN, HIGH);
delValue=4000;
incValue=7;
accRate=530;
totSteps=90/dl5;
for (int i=0; i < totSteps; i++)
{
 if (totSteps > (2*accRate + 1)){
    if (i < accRate){
      //acceleration
      delValue = delValue - incValue;
    } else if (i > (totSteps - accRate)){
      //decceleration
      delValue = delValue + incValue;
    }
  } else {
    //no space for proper acceleration/decceleration
    if (i < ((totSteps - (totSteps % 2))/2)){
      //acceleration
      delValue = delValue - incValue;
    } else if (i > ((totSteps + (totSteps % 2))/2)){
      //decceleration
      delValue = delValue + incValue;
    }
  }
  digitalWrite(PUL5_PIN, HIGH);
  delayMicroseconds(delValue);
  digitalWrite(PUL5_PIN, LOW);
  delayMicroseconds(delValue);
}

//--------------------------------------------------------GoGoGo-------------------
curPos1=0.0;
curPos2=0.0;
curPos3=0.0;
curPos4=0.0;
curPos5=90.0;
curPos6=0.0;
float Xhome[6]={164.5, 0.0, 241.0, 90.0, 180.0, -90.0}; //{x, y, z, ZYZ Euler angles}

float X1[6]={164.5, 0.0, 141.0, 90.0, 180.0, -90.0};
float X11[6]={164.5+14.7, 35.4, 141.0, 90.0, 180.0, -90.0};
float X12[6]={164.5+50.0, 50.0, 141.0, 90.0, 180.0, -90.0};
float X13[6]={164.5+85.3, 35.4, 141.0, 90.0, 180.0, -90.0};
float X14[6]={164.5+100.0, 0.0, 141.0, 90.0, 180.0, -90.0};
float X15[6]={164.5+85.3, -35.4, 141.0, 90.0, 180.0, -90.0};
float X16[6]={164.5+50.0, -50.0, 141.0, 90.0, 180.0, -90.0};
float X17[6]={164.5+14.7, -35.4, 141.0, 90.0, 180.0, -90.0};

float X18[6]={164.5+50.0, 0.0, 141.0, 90.0, 180.0, -90.0};

float X2[6]={264.5, 0.0, 141.0, 0.0, 90.0, 0.0};
float X3[6]={164.5, 100.0, 141.0, 90.0, 90.0, 0.0};
float X4[6]={164.5, -100.0, 141.0, 90.0, -90.0, 0.0};

float Jhome[6], J1[6], J11[6], J12[6], J13[6], J14[6], J15[6], J16[6], J17[6], J18[6], J2[6], J3[6], J4[6];
InverseK(Xhome, Jhome);
InverseK(X1, J1);
InverseK(X11, J11);
InverseK(X12, J12);
InverseK(X13, J13);
InverseK(X14, J14);
InverseK(X15, J15);
InverseK(X16, J16);
InverseK(X17, J17);
InverseK(X18, J18);
InverseK(X2, J2);
InverseK(X3, J3);
InverseK(X4, J4);

Future Plans

I am now working on neural network pick and place using a low res camera on Joint 6.

Comments