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