Skip to content

12. Mechanical Design, Machine Design

This week Hero shot!


This week Checklist

Group assignment

  • [✓] Design a machine that includes mechanism + actuation + automation.
  • [✓] Build the mechanical parts and operate it manually.
  • [✓] Document our work.

Individual assignment

  • [✓] Document my individual contribution.

Group assignment

This two weeks, our group try to design a robot arm that includes mechanism + actuation + automation. Please click here to see more details of our group assignment.


My individual contribution

The first draft of project, it is a 4 DOF robot arm and additional 1 DOF for replaceable head for different usage.

Use Fusion 360 to design and simulate robot arm action.

Use my PCB board to control the robot arm.

Before assembly, component test is very important procedure.

Adopt hidden wire design, most of the wires will not be exposed.

The pin of axis 5 is located at the end of the robot arm, which is convenient to replace different heads.

This is robot arm with spoon holder.

This is clamp for robot arm.

At present, three heads for different purposes have been designed for this robotic arm.


Coding

I want to make the robot arm action smoother, I wrote a subprogram of runServoPrg, which can divide the posts in the action into many parts and execute them one by one.

// System value
// ----------------------------------------------------------------------------------------------------

const int numberOfServos = 5; // Number of servos
const int numberOfACE = 6; // Number of action code elements
int servoCal[] = { 0, 0, 0, 0, 0, }; // Servo calibration data
int servoCurrentPos[] = { 0, 0, 0, 0, 0, }; // Servo current position
int servoOldPos[] = { 0, 0, 0, 0, 0, }; // Servo old position
int servoPrgPeriod = 20; // 20 ms
int servoPin[] = {5, 8, 9, 14, 15 }; // Initializing servo pin ( head to base )
int runProgram = false; // Flag for run program

const int buttonPin = 2; // The number of the pushbutton pin
int buttonState = 0; // Variable for reading the pushbutton status
const int ledPin = 4; // The number of the LED pin

// ----------------------------------------------------------------------------------------------------



// Action code
// ----------------------------------------------------------------------------------------------------

// Zero
int servoPrg00step = 1;
int servoPrg00 [][numberOfACE] PROGMEM = {
  // P05, P08, P09, P14, P15, ms
  {   90,  90,  90,  90,  90, 1000  }, // zero position
};

// Bread
int servoPrg01step = 12;
int servoPrg01 [][numberOfACE] PROGMEM = {
  // P05, P08, P09, P14, P15, ms
  {   90,  90,  90,  90,  40, 1000  }, // 轉向白碗
  {   90,  70,  10,  70,  40, 1000  }, // 放下機械臂
  {   70,  70,  15,  80,  45, 1000  }, // 放下湯匙
  {   80,  75,  10,  60,  45, 1000  }, // 升起湯匙
  {   85,  60,  10,  70, 110, 1000  }, // 轉向黃碗
  {   30, 100,  75, 100, 120, 1000  }, // 倒糖漿
  {   50, 100, 115, 140, 125, 1000  }, // 移到面包左上角
  {   50, 100, 100, 130, 140, 1000  }, // 移到面包左下角
  {   50, 100,  10,  30, 115, 1000  }, // 移到面包右下角
  {   50, 100,  50,  90, 100, 1000  }, // 移到面包右上角
  {   85,  60,  10,  70, 110, 1000  }, // 轉向黃碗
  {   90,  70,  10,  70,  40, 1000  }, // 轉向白碗放下機械臂
};

// ----------------------------------------------------------------------------------------------------



// Setup
// ----------------------------------------------------------------------------------------------------

void setup() {
  // Declaring servo pin as an output mode
  for(int s = 0; s < 5; s++){
    pinMode(servoPin[s], OUTPUT);
  }

  pinMode(buttonPin, INPUT); // Initialize the pushbutton pin as an input mode
  pinMode(ledPin, OUTPUT); // Initialize the LED pin as an output mode

  servoPos(90, 90, 90, 90, 90);
  runServoPrg(servoPrg00, servoPrg00step); // zero position
}

// ----------------------------------------------------------------------------------------------------



// Loop
// ----------------------------------------------------------------------------------------------------

void loop () {
  buttonState = digitalRead(buttonPin); // read the state of the pushbutton value

  // check if the pushbutton is pressed
  if (buttonState == LOW) {
    digitalWrite(ledPin, HIGH);
    runServoPrg(servoPrg01, servoPrg01step); // bread action
  } else {
    digitalWrite(ledPin, LOW);
  }

  delay(100);
}

// ----------------------------------------------------------------------------------------------------



// Function
// ----------------------------------------------------------------------------------------------------

void servoPos(int a1, int a2, int a3, int a4, int a5) {
  servoPulse(servoPin[0], a1);
  servoPulse(servoPin[1], a2);
  servoPulse(servoPin[2], a3);
  servoPulse(servoPin[3], a4);
  servoPulse(servoPin[4], a5);
  servoOldPos[0] = a1;
  servoOldPos[1] = a2;
  servoOldPos[2] = a3;
  servoOldPos[3] = a4;
  servoOldPos[4] = a5;
  delay(400);
}

void servoPulse (int servo, int angle) {
  int pwm = (angle*11) + 500; // Convert angle to microseconds
  digitalWrite(servo, HIGH);
  delayMicroseconds(pwm);
  digitalWrite(servo, LOW);
}

void runServoPrg(int servoPrg[][numberOfACE], int step)
{
  for (int i = 0; i < step; i++) { // Loop for step

    int totalTime = servoPrg[i][numberOfACE - 1]; // Total time of this step

    // Get servo start position
    for (int s = 0; s < numberOfServos; s++) {
      servoCurrentPos[s] = servoOldPos[s] - servoCal[s];
    }

    for (int j = 0; j < totalTime / servoPrgPeriod; j++) { // Loop for time section
      for (int k = 0; k < numberOfServos; k++) { // Loop for servo
        servoPulse(servoPin[k], (map(j, 0, totalTime / servoPrgPeriod, servoCurrentPos[k], servoPrg[i][k])) + servoCal[k]);
        servoOldPos[k] = (map(j, 0, totalTime / servoPrgPeriod, servoCurrentPos[k], servoPrg[i][k])) + servoCal[k];
      }
      delay(servoPrgPeriod);
    }
  }
}

// ----------------------------------------------------------------------------------------------------

Downloads

Robot Arm Fusion 360 Project f3d file

Robot Arm Code ino file


Last update: April 20, 2022