Skip to content

Mechanical Design, Machine Design

Mechanical Design (part 1 of 2)

Group Assignment

  1. Design a machine that includes mechanism + actuation + automation
  2. Build the mechanical parts and operate it manually.
  3. Document the group project

Machine Design (part 2 of 2)

Group Assignment

  1. Actuate and automate your machine.
  2. Document the group project

RoboMaid

RoboMaid is a 4-5 DOF robot arm that designed to assist lazy human to do some miscelious jobs such as dropping a teabag, spreating butter on bread or even picking a potato chips.

Task delegation

Jason designed the core system, including the mechanical design and the PCB. link

Terry made a nice video to present the concept and the operation of RoboMaid. link

Darren did the documentation work of this week’s group assignment and he is designing a variant that has a vacumn picker to pick things with flat surface but could not pick up by the claw. link

Manual Operation

Actuate and automate your machine

The control board

The control board used to control RoboMaid was designed by Jason in his Output Devices week. It could connect up to six IO devices including servos and provide 5V power to them. The power source is from the USB connector.

Program description

Text Only
// 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

Program Source Code


Last update: April 19, 2022