You are on page 1of 10

Task 1:

• Robot type, structure and configuration

Yamaha YK900XG (Completely beltless) SCARA robot

Fig. 1: YK900XG SCARA Robot Structure

Fig. 2: YK900XG SCARA Robot Configuration

• Maximum payload: 20 kg (Standard type), 19 kg (Tool flange mount type)


• Operating range (Working envelope):

Fig. 3: YK900XG SCARA Robot Working Envelope

1
Fig. 4: YK900XH SCARA Robot Dimensions; Top and Side View

• Robot’s accuracy: 0.1mm


• Four components:

2. Links

3. Joints

4. Base
1. End effector

Figure 5: Components of YK900XG SCARA Robot

• 1 closed control loop


• No actuator instead electrical shaft motor with ball screw and rotary shaft is used

2
Figure 6: YK900XG SCARA Robot Electrical Motor

• Resolver is a magnetic type sensor used for position detector (provide closed loop control)
• Programming, I/O point trace, Remote command, RS-232C port communication to operate RCX340
controller before control a robotic manipulator.

Task 2:

1. Applications for SCARA robot:


• Assembly applications
• Semiconductor wafers handling
• Biomed applications
• Packaging
• Palletizing
• Machine loading

2. PUMA 560 articulated robot can replace SCARA based on above applications

3. PUMA 560:
a) Advantages:
• Flexibility to reach over or under an object
• Good workspace
b) Disadvantages:
• Counterbalance problem
• Poor resolution and accuracy due to rotary joints
• High moment of inertia and dynamic instability due to vibrations
Task 3:

Link (i) 𝜃𝑖 (𝐽𝑜𝑖𝑛𝑡 𝑎𝑛𝑔𝑙𝑒) 𝛼𝑖 (𝑇𝑤𝑖𝑠𝑡 𝑎𝑛𝑔𝑙𝑒) 𝑎𝑖 (𝐿𝑖𝑛𝑘 𝑙𝑒𝑛𝑔𝑡ℎ, 𝑚) 𝑑𝑖 (𝐿𝑖𝑛𝑘 𝑜𝑓𝑓𝑠𝑒𝑡, 𝑚)
1 𝜃1 π/2 0 0
2 𝜃2 0 0.4318 0
3 𝜃3 -π/2 0.0203 0.1500
4 𝜃4 π/2 0 0.4318
5 𝜃5 -π/2 0 0
6 𝜃6 0 0 0
Table 1: D-H convention parameters of PUMA 560

3
Figure 7: PUMA 560 Forward Kinematics Matrix

Figure 8: PUMA 560 Transformation Matrix

4
% Task 4

%D-H parameters of Puma560

L(1)=Link([0,0,0,pi/2,0]);

L(2)=Link([0,0,0.4318,0,0]);

L(3)=Link([0,0.15,0.0203,pi/2]);

L(4)=Link([0,0.431,0,pi/2,0]);

L(5)=Link([0,0,0,-pi/2,0]);

L(6)=Link([0,0,0,0,0]);

%Create a SerialLink for Puma560 defined by a vector of Link class objects

puma560=SerialLink(L,'name','Puma560');

%forward kinematics

fk=puma560.fkine([0,0,0,0,0,0]);

%display graphical representation of Puma560

puma560.plot([0,0,0,0,0,0]);

%drive the graphical Puma560

puma560.teach();

Fig. 9: PUMA 560 Forward Kinematics Simulation

5
%Task 5 (Tower_Hanoi.m)

function hanoi_auto(disk)
disk=input('Number of Disks:'); %set number of disks to be solved by robot

%hold on: retains plots in current axes so that new plots can be added
%axis equal: sets aspect ratio of x,y axis for the data units to be same in both axis
direction
hold on,axis equal
axis(0.5+[0,120,0,60]) % set values in x,y axis
set(gca,'xtick',[],'ytick',[],'xcolor','w','ycolor','w')
%set white background for tower,disks
set(gca,'color','k') %set black background as overall background
ground=[120.5,1.5;120.5,0.5;0.5,0.5;0.5,1.5]; %black background dimension
%white background 3 towers for column_1,2,3 dimension (length,height,thickness)
column_1=[21,1.5;21,44;19,44;19,1.5];
column_2=[61,1.5;61,44;59,44;59,1.5];
column_3=[101,1.5;101,44;99,44;99,1.5];
step=0; %initial step increment
arrow=[1];k=1;control=1; %arrow=robot gripper,k= thickness of 3 disks, control=allow
to start pick/place
A=[];B=[];C=[]; %position A (first tower), B (second tower), C(third tower); position
for arrow to pick/place
A=disk:-1:1; %step increment of arrow from position A either go right or left by 1
step
%3 disks dimension for block_1,2,3
block_1=@(l,h)[20+2*l,-250;20+2*l,3*h+1.5;20-2*l,3*h+1.5;20-2*l,3*h-1.5];
block_2=@(l,h)[60+2*l,-250;60+2*l,3*h+1.5;60-2*l,3*h+1.5;60-2*l,3*h-1.5];
block_3=@(l,h)[100+2*l,-250;100+2*l,3*h+1.5;100-2*l,3*h+1.5;100-2*l,3*h-1.5];
% 3 disks dimension for block__ picked by arrow
block__=@(l,p)[p+2*l,45-1.5;p+2*l,45+1.5;p-2*l,45+1.5;p-2*l,45-1.5];
%gcf:returns the handle of the current figure, co:planar figure
set(gcf,'tag','co','CloseRequestFcn',@clo);
function clo(~,~)
control=0; %in case GUI is closed due to interruption (half way quit)
%prevent multiple planar figures appear after quit GUI
delete(findobj('tag','co'));
clf
close
end

function draw(~,~)
%prevent 3 arrow displayed, only 1 arrow to pick/place
delete(findobj(gcf,'type','text'))
%prevent picked blocks by arrow remain stagnant on black background
delete(findobj(gcf,'type','patch'))
text(5,-4,'step=') %step taken to pick/place
text(20,-4,num2str(step)) %display step taken
text(5,-10,'level=') %number of disks involved
text(20,-10,num2str(disk)) %display number of disks
%add white colour for tower bottom
fill(ground(:,1),ground(:,2),'w','EdgeColor','none')
%add white colour for each tower
fill(column_1(:,1),column_1(:,2),'w','EdgeColor','none')
fill(column_2(:,1),column_2(:,2),'w','EdgeColor','none')
fill(column_3(:,1),column_3(:,2),'w','EdgeColor','none')
%add colour for arrow
text(40*arrow(1)-20-2,55,'\downarrow','Color','w','Fontsize',25)
if length(arrow)==2 %when block is picked by arrow
p=40*arrow(1)-20;
block=block__(arrow(2),p);

6
%add colour to block picked by arrow
fill(block(:,1),block(:,2),'w','EdgeColor','none')
end
for i=1:length(A)
block=block_1(A(i),k*i);
%block placed at position A
fill(block(:,1),block(:,2),'w','EdgeColor','none')
end
for i=1:length(B)
block=block_2(B(i),k*i);
%block placed at position B
fill(block(:,1),block(:,2),'w','EdgeColor','none')
end
for i=1:length(C)
block=block_3(C(i),k*i);
%block placed at position C
fill(block(:,1),block(:,2),'w','EdgeColor','none')
end
end

function key(event)
switch event
case 'leftarrow'
if arrow(1)-1~=0
arrow(1)=arrow(1)-1;step=step+1; %when arrow moves left
end
case 'rightarrow'
if arrow(1)-3~=0
arrow(1)=arrow(1)+1;step=step+1; %when arrow moves right
end
case 'uparrow'
if length(arrow)==1
if (arrow(1)==1)&&(~isempty(A))
arrow=[arrow(1),A(end)]; %when arrow moves up at position A
A(end)=[]; %disable arrow's upward direction at position A
end
if (arrow(1)==2)&&(~isempty(B))
arrow=[arrow(1),B(end)]; %when arrow moves up at position B
B(end)=[]; %disable arrow's upwward direction at position B
end
if (arrow(1)==3)&&(~isempty(C))
arrow=[arrow(1),C(end)]; %when arrow moves up at position C
C(end)=[]; %disable arrow's upward direction at position C
end
end
case 'downarrow'
if length(arrow)==2
if (arrow(1)==1)
if isempty(A) %if position A has no block
A=[A,arrow(2)]; %when arrow moves down at position A
arrow(2)=[]; %disable arrow's downward direction at position A
else
if A(end)>arrow(2) %if position A has any block
A=[A,arrow(2)]; %when arrow moves down at position A
arrow(2)=[]; %disable arrow's downward direction at position A
end
end
end
if (arrow(1)==2)
if isempty(B) %if position B has no block
B=[B,arrow(2)]; %when arrow moves down at position B
arrow(2)=[]; %disable arrow's downward direction at position B
else
if B(end)>arrow(2) %if position B has any block
B=[B,arrow(2)]; %when arrow moves down at position B

7
arrow(2)=[]; %disable arrow's downward direction at position B
end
end
end
if (arrow(1)==3)
if isempty(C) %if position C has no block
C=[C,arrow(2)]; %when arrow moves down at position C
arrow(2)=[]; %disable arrow's downward direction at position C
else
if C(end)>arrow(2) %if position C has any block
C=[C,arrow(2)]; %when arrow moves down at position C
arrow(2)=[]; %disable arrow's downward direction at position C
end
end
end
end
end
pause(0.2)
%initiate input of pick/place process starting with number of disks typed in
if control==1
draw()
else
pause %stop input process
end
end
draw()
matrix=[1 2 3]; %bottom disk to top disk at initial position

%Task 8

digui(disk,matrix)
function digui(n,structdigui) %GUI activation
if n==1 %activates if only 1 disk remaining
move(structdigui(1),structdigui(3));
else %activate pick/place if more than 1 disk
digui(n-1,[structdigui(1),structdigui(3),structdigui(2)])
move(structdigui(1),structdigui(3))
digui(n-1,[structdigui(2),structdigui(1),structdigui(3)])
end
end
function move(a,b) %GUI sends commands to arrow to move from a (start) to b(end)
while arrow(1)~=a
if arrow(1)>a %After successfully pick/place disk at position a
key('leftarrow')
else %Before successfully pick/place disk at position a
key('rightarrow')
end
end
key('uparrow')
while arrow(1)~=b
if arrow(1)>b %After successfully pick disk at position b
key('leftarrow')
else %Before successfully pick disk at position b
key('rightarrow')
end
end
key('downarrow')
end
end

8
Flowchart for Tower of Hanoi GUI Simulation

Run Tower_Hanoi.m file

Yes
Type CTRL+C in Half way
Command Window quit GUI

No

9
%Task 6

%Create model of Puma 560 manipulator

mdl_puma560;

%Forward kinematics

fk=p560.fkine([0,0,0,0,0,0]);

%Connvert forward kinematics to inverse kinematics

ik=p560.ikine6s(fk);

%display graphical representation of Puma560

p560.plot([0,0,0,0,0,0]);

%display D-H parameters of Puma560

p560.teach();

Figure 10: PUMA 560 Inverse Kinematics Simulation

10

You might also like