2007年6月7日 星期四

Homework 13

Homework 13
b94611001 歐陽太閒

6/7全程上課

一、複式齒輪之設計


實際運用齒輪時,必須建立一齒列(train),才能夠發揮齒輪的加減速,以及調整扭矩的功能,而且在較複雜的機構如行星齒輪系或者是差速器等,齒列分析是不可避免的.

本次作業題目為設計一轉速比125的複式齒輪齒列.
首先我們利用課本所教導的方法,將VR=125開根號

>>sqrt(125)

ans =

  11.1803

顯然大於10,會使齒輪負荷過大且製造不便因此不適於以兩個齒輪組成的齒列,
因此我們嘗試開三次方根

>>125^(1/3)

ans =
    5

可以得到一個漂亮的整數比,因此我們可以得到

ω1/ω2=5
ω2/ω3=5
ω3/ω4=5

因此VR=ω1/ω4=125

由此也可以得到齒數比:

N2/N1=5
N3/N2=5
N4/N3=5

1.因此考慮複式齒輪組


同樣的,齒輪的徑節(Dp),周節(Pc)和壓力角必須相同才能正常旋轉

也限制最小齒數為14齒,徑節=8,壓力角=25
得到

N1=14
N2=14*5=70
N3=14
N4=14*5=70

以contact_ratio(徑節,齒數1,齒數2,[壓力角])程式來計算接觸比,其中N2,N3共軸(coaxial)

>>[c_ratio,c_length,ad,pc,pb,r2,r3,ag]=contact_ratio(8,14,70,25)

c_ratio =接觸比
   1.4565
c_length =接觸長度
   0.5184
ad =齒冠
   0.1250
pc =周節
   0.3927
pb =基周節
   0.3559
r2 =齒輪2節圓直徑
   1.7500
r3 =齒輪3節圓直徑
   8.7500
ag =
  20.1547   17.2971   37.4518齒輪2的接近角/遠退角/作用角
   4.0309   3.4594    7.4904 齒輪3的接近角/遠退角/作用角


因此我們可以得到c_ratio=1.4565大於1不會過載,且齒輪G1直徑1.7500,G2直徑8.7500,G3直徑1.7500,G4直徑8.7500
就算水平排列也可以得到

>>1.75+(8.75/2)+(1.75/2)+(8.75/2)+(1.75/2)+8.75
ans =
   21

遠小於簡單齒列的最終端齒輪節圓直徑218.75,大幅度節省空間,也可以大幅節省成本,

另外
徑節(Dp)=8
周節(Pc)=0.3927
壓力角=25
齒冠=0.1250

也都合乎標準,不至於造成損壞.
然而,複式齒輪組較特殊的是由於有共軸,因此在撰寫程式時要較為小心.


故我們可以得到如下


只顯示節圓與基圓時



所以我們可以寫出以下結果

程式結構
1.清除畫面及程式資訊
2.參數引入draw_gear.m
3.建立基本物件
a.利用bushing畫基座
b.建立齒輪
c.利用bushing畫節圓和基圓
4.利用while進行動畫繪製
a.轉角
b.畫出新位置

function geartrain2(Dpitch,nn1,nn2,nn3,nn4,nn5,nn6,phi,ww)
%13.1 歐陽太閒b94611001 本程式改寫自老師的 move2_rack.m
%本程式改寫自老師的move2_rack %Dpitch=節矩,nn1=R2齒數,nn2=R3齒數,nn3=R3齒數,phi=壓力角,ww=nn1角速度
clf;
%清除畫面
d2r=pi/180;
%角徑轉換
unit1=0.01;
%動畫單位
phir=phi*d2r; pc=pi/Dpitch;
%計算pc
title('作業13 作者:歐陽太閒b94611001');
%資訊
xlabel('x-axis cm'); ylabel('y-axis cm');
hold on;
[coord,rp,rb]=draw_gear(Dpitch,nn1,phi,360,0,0);%將參數引入draw_gear.m,畫第一齒輪
[coord2,rp2,rb2]=draw_gear(Dpitch,nn2,phi,360,0,0);
%將參數引入draw_gear.m,畫第二齒輪
[coord3,rp3,rb3]=draw_gear(Dpitch,nn3,phi,360,0,0);
%將參數引入draw_gear.m,畫第三齒輪
[coord4,rp4,rb4]=draw_gear(Dpitch,nn4,phi,360,0,0);
%將參數引入draw_gear.m,畫第四齒輪
[coord5,rp5,rb5]=draw_gear(Dpitch,nn5,phi,360,0,0);
%將參數引入draw_gear.m,畫第五齒輪
[coord6,rp6,rb6]=draw_gear(Dpitch,nn6,phi,360,0,0);
%將參數引入draw_gear.m,畫第六齒輪
del=2.5;
coord2=rotate2D([coord2(:,1),coord2(:,2)],+del,0,0);
coord3=rotate2D([coord3(:,1),coord3(:,2)],+del,0,0);
coord4=rotate2D([coord4(:,1),coord4(:,2)],+del,0,0);
coord5=rotate2D([coord5(:,1),coord5(:,2)],+del,0,0);
coord6=rotate2D([coord6(:,1),coord6(:,2)],+del,0,0);
xc1=coord(:,1);yc1=coord(:,2);%將計算結果引出
xc2=coord2(:,1);yc2=coord2(:,2);%將計算結果引出
xc3=coord3(:,1);yc3=coord3(:,2);%將計算結果引出
xc4=coord4(:,1);yc4=coord4(:,2);%將計算結果引出
xc5=coord5(:,1);yc5=coord5(:,2);%將計算結果引出
xc6=coord6(:,1);yc6=coord6(:,2);%將計算結果引出
coord=bushing(rp/6,0,0);%利用bushing畫基座
coord2=bushing(rp2/6,rp+rp2,0);
coord4=bushing(rp4/6,rp+rp2+rp3+rp4,0);
coord5=bushing(rp4/6,rp+rp2+rp3+rp4+rp5+rp6,0);
xb1=coord(:,1);yb1=coord(:,2);
xb2=coord2(:,1);yb2=coord2(:,2);
xb4=coord4(:,1);yb4=coord4(:,2);
xb5=coord5(:,1);yb5=coord5(:,2);
plot(xb1,yb1,'r-');%畫出大小齒輪基座
plot(xb2,yb2,'r-');
plot(xb4,yb4,'r-');
plot(xb5,yb5,'r-');
pini=line('xdata',[],'ydata',[],'erasemode','xor','linewidth',1,'color','r');
%建立handler
gear=line('xdata',[],'ydata',[],'erasemode','xor','linewidth',1,'color','b');
gear2=line('xdata',[],'ydata',[],'erasemode','xor','linewidth',1,'color','b');
gear3=line('xdata',[],'ydata',[],'erasemode','xor','linewidth',1,'color','g');
gear4=line('xdata',[],'ydata',[],'erasemode','xor','linewidth',1,'color','g');
gear5=line('xdata',[],'ydata',[],'erasemode','xor','linewidth',1,'color','r');
[coord4]=bushing(-rp2,rp+rp2,0.2);%利用bushing畫節圓和基圓
plot(coord4(:,1),coord4(:,2),'b:');
[coord5]=bushing(-rb2,rp+rp2,0.2);
plot(coord5(:,1),coord5(:,2),'k:');
[coord6]=bushing(-rp,0,0);
%利用bushing畫節圓和基圓
plot(coord6(:,1),coord6(:,2),'b:');
[coord7]=bushing(-rb,0,0);
plot(coord7(:,1),coord7(:,2),'k:');
[coord8]=bushing(-rp3,rp+rp2,0); plot(coord8(:,1),coord8(:,2),'b:');
[coord9]=bushing(-rb3,rp+rp2,0); plot(coord9(:,1),coord9(:,2),'k:');
[coord10]=bushing(-rp4,rp+rp2+rp3+rp4,0); plot(coord10(:,1),coord10(:,2),'b:');
[coord11]=bushing(-rb4,rp+rp2+rp3+rp4,0); plot(coord11(:,1),coord11(:,2),'k:');
axis equal;
ang=0;
angp=ww*unit1;
while 1%利用while進行動畫繪製
rot1=rotate2D([xc1,yc1],ang,0,0);%進行轉角,產生新座標
rot2=rotate2D([xc2,yc2],-ang*(nn1/nn2),rp+rp2,0);
rot3=rotate2D([xc3,yc3],-ang*(nn1/nn2),rp+rp2,0);
rot4=rotate2D([xc4,yc4],ang*((nn1/nn2)^2),rp+rp2+rp3+rp4,0);
rot5=rotate2D([xc5,yc5],ang*((nn1/nn2)^2),rp+rp2+rp3+rp4,0);
rot6=rotate2D([xc6,yc6],-ang*((nn1/nn2)^3),rp+rp2+rp3+rp4+rp5+rp6,0);
set(pini,'xdata',rot1(:,1),'ydata',rot1(:,2));%分別畫出大小齒輪
set(gear,'xdata',rot2(:,1),'ydata',rot2(:,2));
set(gear2,'xdata',rot3(:,1),'ydata',rot3(:,2));
set(gear3,'xdata',rot4(:,1),'ydata',rot4(:,2));
set(gear4,'xdata',rot5(:,1),'ydata',rot5(:,2));
set(gear5,'xdata',rot6(:,1),'ydata',rot6(:,2));
drawnow; %繪製
pause(1/ww);
ang=ang+angp;
end %程式結束



代入以下指令,其中驅動齒輪角速度=300rad/s
>>geartrain2(8,14,70,14,70,14,70,25,300)

可得到以下影片


影片


而角速度達到600rad/s時
>>geartrain2(8,14,70,14,70,14,70,25,600)

可以得到以下影片:



另外,齒輪有一大優勢便是可以改變動力輸出位置,因此改寫程式如下

functiongeartrain2(Dpitch,nn1,nn2,nn3,nn4,nn5,nn6,phi,ww)
%13.1 歐陽太閒b94611001 本程式改寫自老師的 move2_rack.m
%本程式改寫自老師的move2_rack %Dpitch=節矩,nn1=R2齒數,nn2=R3齒數,nn3=R3齒數,phi=壓力角,ww=nn1角速度 clf;
%清除畫面 d2r=pi/180;%角徑轉換 unit1=0.01;%動畫單位 phir=phi*d2r; pc=pi/Dpitch;
%計算pc title('作業13 作者:歐陽太閒b94611001'); %資訊 xlabel('x-axis cm'); ylabel('y-axis cm'); hold on; [coord,rp,rb]=draw_gear(Dpitch,nn1,phi,360,0,0);%將參數引入draw_gear.m,畫第一齒輪
[coord2,rp2,rb2]=draw_gear(Dpitch,nn2,phi,360,0,0);
%將參數引入draw_gear.m,畫第二齒輪
[coord3,rp3,rb3]=draw_gear(Dpitch,nn3,phi,360,0,0);
%將參數引入draw_gear.m,畫第三齒輪
[coord4,rp4,rb4]=draw_gear(Dpitch,nn4,phi,360,0,0);
%將參數引入draw_gear.m,畫第四齒輪
[coord5,rp5,rb5]=draw_gear(Dpitch,nn5,phi,360,0,0);
%將參數引入draw_gear.m,畫第五齒輪
[coord6,rp6,rb6]=draw_gear(Dpitch,nn6,phi,360,0,0);
%將參數引入draw_gear.m,畫第六齒輪
del=2.5;
coord2=rotate2D([coord2(:,1),coord2(:,2)],+del,0,0);
coord3=rotate2D([coord3(:,1),coord3(:,2)],+del,0,0);
coord4=rotate2D([coord4(:,1),coord4(:,2)],+del,0,0);
coord5=rotate2D([coord5(:,1),coord5(:,2)],+del,0,0);
coord6=rotate2D([coord6(:,1),coord6(:,2)],+del,0,0);
xc1=coord(:,1);yc1=coord(:,2);%將計算結果引出
xc2=coord2(:,1);yc2=coord2(:,2);%將計算結果引出
xc3=coord3(:,1);yc3=coord3(:,2);%將計算結果引出
xc4=coord4(:,1);yc4=coord4(:,2);%將計算結果引出
xc5=coord5(:,1);yc5=coord5(:,2);%將計算結果引出
xc6=coord6(:,1);yc6=coord6(:,2);%將計算結果引出
coord=bushing(rp/6,0,0);%利用bushing畫基座
coord2=bushing(rp2/6,rp+rp2,0);
coord4=bushing(rp4/6,rp+rp2+rp3+rp4,0);
coord5=bushing(rp4/6,rp+rp2+rp3+rp4+rp5+rp6,0);
xb1=coord(:,1);yb1=coord(:,2);
xb2=coord2(:,1);yb2=coord2(:,2);
xb4=coord4(:,1);yb4=coord4(:,2);
xb5=coord5(:,1);yb5=coord5(:,2);
plot(xb1,yb1,'r-');%畫出大小齒輪基座
plot(xb2,yb2,'r-');
plot(xb4,yb4,'r-');
plot(xb5,yb5,'r-');
pini=line('xdata',[],'ydata',[],'erasemode','xor','linewidth',1,'color','r');
%建立handler gear=line('xdata',[],'ydata',[],'erasemode','xor','linewidth',1,'color','b');
gear2=line('xdata',[],'ydata',[],'erasemode','xor','linewidth',1,'color','b');
gear3=line('xdata',[],'ydata'[],'erasemode','xor','linewidth',1,'color','g');
gear4=line('xdata'[],'ydata'[],'erasemode','xor','linewidth',1,'color','g');
gear5=line('xdata',[],'ydata'[],'erasemode','xor','linewidth',1,'color','r');
[coord4]=bushing(-rp2,rp+rp2,0.2);%利用bushing畫節圓和基圓
plot(coord4(:,1),coord4(:,2),'b:');
[coord5]=bushing(-rb2,rp+rp2,0.2);
plot(coord5(:,1),coord5(:,2),'k:');
[coord6]=bushing(-rp,0,0);
%利用bushing畫節圓和基圓
plot(coord6(:,1),coord6(:,2),'b:');
[coord7]=bushing(-rb,0,0);
plot(coord7(:,1),coord7(:,2),'k:');
[coord8]=bushing(-rp3,rp+rp2,0); plot(coord8(:,1),coord8(:,2),'b:');
[coord9]=bushing(-rb3,rp+rp2,0); plot(coord9(:,1),coord9(:,2),'k:');
[coord10]=bushing(-rp4,rp+rp2+rp3+rp4,0); plot(coord10(:,1),coord10(:,2),'b:');
[coord11]=bushing(-rb4,rp+rp2+rp3+rp4,0); plot(coord11(:,1),coord11(:,2),'k:');
axis equal;
ang=0;
angp=ww*unit1;
while 1%利用while進行動畫繪製
rot1=rotate2D([xc1,yc1],ang,0,0);%進行轉角,產生新座標
rot2=rotate2D([xc2,yc2],-ang*(nn1/nn2),rp+rp2,0);
rot3=rotate2D([xc3,yc3],-ang*(nn1/nn2),rp+rp2,0);
rot4=rotate2D([xc4,yc4],ang*((nn1/nn2)^2),rp+rp2+rp3+rp4,0);
rot5=rotate2D([xc5,yc5],ang*((nn1/nn2)^2),rp+rp2+rp3+rp4,0);
rot6=rotate2D([xc6,yc6],-ang*((nn1/nn2)^3),rp+rp2+rp3+rp4+rp5+rp6,0);
set(pini,'xdata',rot1(:,1),'ydata',rot1(:,2));%分別畫出大小齒輪
set(gear,'xdata',rot2(:,1),'ydata',rot2(:,2));
set(gear2,'xdata',rot3(:,1),'ydata',rot3(:,2));
set(gear3,'xdata',rot4(:,1),'ydata',rot4(:,2));
set(gear4,'xdata',rot5(:,1),'ydata',rot5(:,2));
set(gear5,'xdata',rot6(:,1),'ydata',rot6(:,2));
drawnow; %繪製
pause(1/ww);
ang=ang+angp;
end %程式結束


可以得到不同方向的動力輸出:
>> geartrain2(8,14,70,14,70,14,70,25,300)




利用此方法對動力進行轉向,不但設計方便,動力損失少,結構穩定,且節省空間,因此應用得非常普遍,而若中間的齒列進行調整,甚至可做成共軸機構,更加方便
共軸結構

function geartrain3(Dpitch,nn1,nn2,nn3,nn4,nn5,nn6,phi,ww)
%13.1 歐陽太閒b94611001 本程式改寫自老師的 move2_rack.m
%本程式改寫自老師的move2_rack %Dpitch=節矩,nn1=R2齒數,nn2=R3齒數,nn3=R3齒數,phi=壓力角,ww=nn1角速度
clf;
%清除畫面
d2r=pi/180;
%角徑轉換
unit1=0.01;
%動畫單位
phir=phi*d2r; pc=pi/Dpitch;
%計算pc
title('作業13 作者:歐陽太閒b94611001');
%資訊
xlabel('x-axis cm'); ylabel('y-axis cm');
hold on;
[coord,rp,rb]=draw_gear(Dpitch,nn1,phi,360,0,0);%將參數引入draw_gear.m,畫第一齒輪
[coord2,rp2,rb2]=draw_gear(Dpitch,nn2,phi,360,0,0);
%將參數引入draw_gear.m,畫第二齒輪
[coord3,rp3,rb3]=draw_gear(Dpitch,nn3,phi,360,0,0);
%將參數引入draw_gear.m,畫第三齒輪
[coord4,rp4,rb4]=draw_gear(Dpitch,nn4,phi,360,0,0);
%將參數引入draw_gear.m,畫第四齒輪
[coord5,rp5,rb5]=draw_gear(Dpitch,nn5,phi,360,0,0);
%將參數引入draw_gear.m,畫第五齒輪
[coord6,rp6,rb6]=draw_gear(Dpitch,nn6,phi,360,0,0);
%將參數引入draw_gear.m,畫第六齒輪
del=2.5;
coord2=rotate2D([coord2(:,1),coord2(:,2)],+del,0,0);
coord3=rotate2D([coord3(:,1),coord3(:,2)],+del,0,0);
coord4=rotate2D([coord4(:,1),coord4(:,2)],+del,0,0);
coord5=rotate2D([coord5(:,1),coord5(:,2)],+del,0,0);
coord6=rotate2D([coord6(:,1),coord6(:,2)],+del,0,0);
xc1=coord(:,1);yc1=coord(:,2);%將計算結果引出
xc2=coord2(:,1);yc2=coord2(:,2);%將計算結果引出
xc3=coord3(:,1);yc3=coord3(:,2);%將計算結果引出
xc4=coord4(:,1);yc4=coord4(:,2);%將計算結果引出
xc5=coord5(:,1);yc5=coord5(:,2);%將計算結果引出
xc6=coord6(:,1);yc6=coord6(:,2);%將計算結果引出
coord=bushing(rp/6,0,0);%利用bushing畫基座
coord2=bushing(rp2/6,rp+rp2,0);
coord4=bushing(rp4/6,rp+1.7,rp3+rp4-0.6);
xb1=coord(:,1);yb1=coord(:,2);
xb2=coord2(:,1);yb2=coord2(:,2);
xb4=coord4(:,1);yb4=coord4(:,2);
xb5=coord5(:,1);yb5=coord5(:,2);
plot(xb1,yb1,'r-');%畫出大小齒輪基座
plot(xb2,yb2,'r-');
plot(xb4,yb4,'r-');
plot(xb5,yb5,'r-');
pini=line('xdata',[],'ydata',[],'erasemode','xor','linewidth',1,'color','r');
%建立handler
gear=line('xdata',[],'ydata',[],'erasemode','xor','linewidth',1,'color','b');
gear2=line('xdata',[],'ydata',[],'erasemode','xor','linewidth',1,'color','b');
gear3=line('xdata',[],'ydata',[],'erasemode','xor','linewidth',1,'color','g');
gear4=line('xdata',[],'ydata',[],'erasemode','xor','linewidth',1,'color','g');
gear5=line('xdata',[],'ydata',[],'erasemode','xor','linewidth',1,'color','r');
[coord4]=bushing(-rp2,rp+rp2,0.2);%利用bushing畫節圓和基圓
plot(coord4(:,1),coord4(:,2),'b:');
[coord5]=bushing(-rb2,rp+rp2,0.2);
plot(coord5(:,1),coord5(:,2),'k:');
[coord6]=bushing(-rp,0,0);
%利用bushing畫節圓和基圓
plot(coord6(:,1),coord6(:,2),'b:');
[coord7]=bushing(-rb,0,0);
plot(coord7(:,1),coord7(:,2),'k:');
[coord8]=bushing(-rp3,rp+rp2,0); plot(coord8(:,1),coord8(:,2),'b:');
[coord9]=bushing(-rb3,rp+rp2,0); plot(coord9(:,1),coord9(:,2),'k:');

axis equal;
ang=0;
angp=ww*unit1;
while 1%利用while進行動畫繪製
rot1=rotate2D([xc1,yc1],ang,0,0);%進行轉角,產生新座標
rot2=rotate2D([xc2,yc2],-ang*(nn1/nn2),rp+rp2,0);
rot3=rotate2D([xc3,yc3],-ang*(nn1/nn2),rp+rp2,0);
rot4=rotate2D([xc4,yc4],ang*((nn1/nn2)^2),rp+1.7,rp3+rp4-0.6);
rot5=rotate2D([xc5,yc5],ang*((nn1/nn2)^2),rp+1.7,rp3+rp4-0.6);
rot6=rotate2D([xc6,yc6],-ang*((nn1/nn2)^3),0,0);
set(pini,'xdata',rot1(:,1),'ydata',rot1(:,2));%分別畫出大小齒輪
set(gear,'xdata',rot2(:,1),'ydata',rot2(:,2));
set(gear2,'xdata',rot3(:,1),'ydata',rot3(:,2));
set(gear3,'xdata',rot4(:,1),'ydata',rot4(:,2));
set(gear4,'xdata',rot5(:,1),'ydata',rot5(:,2));
set(gear5,'xdata',rot6(:,1),'ydata',rot6(:,2));
drawnow; %繪製
pause(1/ww);
ang=ang+angp;
end %程式結束

>>geartrain3(8,14,70,14,70,14,70,25,300)





2.簡單齒輪組時:


各齒輪的徑節(Dp),周節(Pc)和壓力角必須相同才能正常旋轉

若限制最小齒數為14齒(壓力角25度防止內切的最小齒數),並且限制徑節=8,壓力角=25
可以得到

N1=14
N2=14*5=70
N3=N2*5=350
N4=N3*5=1750

因此以contact_ratio(徑節,齒數1,齒數2,[壓力角])程式來計算接觸比


>>[c_ratio,c_length,ad,pc,pb,r2,r3,ag]=contact_ratio(8,14,70,25)

c_ratio =接觸比
   1.4565
c_length =接觸長度
   0.5184
ad =齒冠
   0.1250
pc =周節
   0.3927
pb =基周節
   0.3559
r2 =齒輪2節圓直徑
   1.7500
r3 =齒輪3節圓直徑
   8.7500
ag =
  20.1547  17.2971   37.4518 齒輪2的接近角/遠退角/作用角
   4.0309   3.4594    7.4904 齒輪3的接近角/遠退角/作用角

因此我們可以得知接觸比c_ratio=1.4565大於1,不會有過載危險,
且齒輪G1節圓直徑=1.75,齒輪G2節圓直徑=8.75.

>>[c_ratio,c_length,ad,pc,pb,r2,r3,ag]=contact_ratio(8,70,350,25)
以下摘錄比較重要的部份
c_ratio =接觸比
   1.6043
c_length =接觸長度
   0.5710
pc =周節
   0.3927
pb =基周節
   0.3559
r2 =齒輪2節圓直徑
   8.7500
r3 =齒輪3節圓直徑
  43.7500
因此我們可以得知接觸比c_ratio=1.6043大於1,不會有過載危險,
且齒輪G3節圓直徑=43,75.

>>[c_ratio,c_length,ad,pc,pb,r2,r3,ag]=contact_ratio(8,350,1750,25)
c_ratio =接觸比
   1.6493
r2 =齒輪2節圓直徑
  43.7500
r3 =齒輪3節圓直徑
  218.7500

因此我們可以得知接觸比c_ratio=1.6493大於1,不會有過載危險,
且齒輪G4節圓直徑=218.75.

另外本組簡單齒列中的

徑節(Dp)=8
周節(Pc)=0.3927
壓力角=25
齒冠=0.1250

皆合乎標準,可減速VR=125

然而簡單齒列算出的結果令人不甚滿意的地方在於,佔用空間極大(終端齒輪G4節圓直徑高達218.75),且製造成本相當高,另外

,課本中未提到的是,如此大直徑的齒輪在旋轉時,轉動慣量I相當的巨大,難以啟動和煞車,而且材料本身將承受極大的負荷,雖

然理論上可行,但卻難以利用.

而計算結果繪製成圖則如下圖:


單純只有節/基圓時


而此齒列之模擬,可撰寫一程式如下:

程式結構
1.清除畫面及程式資訊
2.參數引入draw_gear.m
3.建立基本物件
a.利用bushing畫基座
b.建立齒輪
c.利用bushing畫節圓和基圓
4.利用while進行動畫繪製
a.轉角
b.畫出新位置

functiongeartrain1(Dpitch,nn1,nn2,nn3,nn4,phi,ww)
%13.1 歐陽太閒b94611001 本程式改寫自老師的 move2_rack.m
%本程式改寫自老師的move2_rack
%Dpitch=節矩,nn1=R2齒數,nn2=R3齒數,nn3=R3齒數,phi=壓力角,ww=nn1角速度

clf; %清除畫面

d2r=pi/180;%角徑轉換
unit1=0.01;%動畫單位
phir=phi*d2r;
pc=pi/Dpitch; %計算pc
title('作業13 作者:歐陽太閒b94611001'); %資訊
xlabel('x-axis cm');
ylabel('y-axis cm');
hold on;
[coord,rp,rb]=draw_gear(Dpitch,nn1,phi,360,0,0);%將參數引入draw_gear.m,畫第一齒輪
[coord2,rp2,rb2]=draw_gear(Dpitch,nn2,phi,360,0,0);%將參數引入draw_gear.m,畫第二齒輪
[coord3,rp3,rb3]=draw_gear(Dpitch,nn3,phi,360,0,0);%將參數引入draw_gear.m,畫第三齒輪
[coord4,rp4,rb4]=draw_gear(Dpitch,nn4,phi,360,0,0);%將參數引入draw_gear.m,畫第四齒輪
del=2.5
coord2=rotate2D([coord2(:,1),coord2(:,2)],+del,0,0);
coord3=rotate2D([coord3(:,1),coord3(:,2)],+del,0,0);
coord4=rotate2D([coord4(:,1),coord4(:,2)],+del,0,0);
xc1=coord(:,1);yc1=coord(:,2);%將計算結果引出
xc2=coord2(:,1);yc2=coord2(:,2);%將計算結果引出
xc3=coord3(:,1);yc3=coord3(:,2);%將計算結果引出
xc4=coord4(:,1);yc4=coord4(:,2);%將計算結果引出
coord=bushing(rp/6,0,0);%利用bushing畫基座
coord2=bushing(rp2/6,rp+rp2,0);
coord3=bushing(rp3/6,rp+(2*rp2)+rp3,0);
coord4=bushing(rp4/6,rp+(2*rp2)+(rp3*2)+rp4,0);
xb1=coord(:,1);yb1=coord(:,2);
xb2=coord2(:,1);yb2=coord2(:,2);
xb3=coord3(:,1);yb3=coord3(:,2);
xb4=coord4(:,1);yb4=coord4(:,2);
plot(xb1,yb1,'r-');%畫出大小齒輪基座
plot(xb2,yb2,'r-');
plot(xb3,yb3,'r-');
plot(xb4,yb4,'r-');
pini=line('xdata',[],'ydata',[],'erasemode','xor','linewidth',1,'color','r');%建立handler
gear=line('xdata',[],'ydata',[],'erasemode','xor','linewidth',1,'color','b');
gear2=line('xdata',[],'ydata',[],'erasemode','xor','linewidth',1,'color','G');
gear3=line('xdata',[],'ydata',[],'erasemode','xor','linewidth',1,'color','b');
[coord4]=bushing(-rp2,rp+rp2,0.2);%利用bushing畫節圓和基圓
plot(coord4(:,1),coord4(:,2),'b:');
[coord5]=bushing(-rb2,rp+rp2,0.2);
plot(coord5(:,1),coord5(:,2),'k:');
[coord6]=bushing(-rp,0,0);%利用bushing畫節圓和基圓
plot(coord6(:,1),coord6(:,2),'b:');
[coord7]=bushing(-rb,0,0);
plot(coord7(:,1),coord7(:,2),'k:');
[coord8]=bushing(-rp3,rp+(2*rp2)+rp3,0);
plot(coord8(:,1),coord8(:,2),'b:');
[coord9]=bushing(-rb3,rp+(2*rp2)+rp3,0);
plot(coord9(:,1),coord9(:,2),'k:');
[coord10]=bushing(-rp4,rp+(2*rp2)+(2*rp3)+rp4,0);
plot(coord10(:,1),coord10(:,2),'b:');
[coord11]=bushing(-rb4,rp+(2*rp2)+(2*rp3)+rp4,0);
plot(coord11(:,1),coord11(:,2),'k:');
axis equal;
ang=0;
angp=ww*unit1;
while 1%利用while進行動畫繪製
rot1=rotate2D([xc1,yc1],ang,0,0);%進行轉角,產生新座標
rot2=rotate2D([xc2,yc2],-ang*(nn1/nn2),rp+rp2,0);
rot3=rotate2D([xc3,yc3],ang*(nn2/nn3),rp+(2*rp2)+rp3,0);
rot4=rotate2D([xc4,yc4],-ang*(nn2/nn3),rp+(2*rp2)+(2*rp3)+rp4,0);
set(pini,'xdata',rot1(:,1),'ydata',rot1(:,2));%分別畫出大小齒輪
set(gear,'xdata',rot2(:,1),'ydata',rot2(:,2));
set(gear2,'xdata',rot3(:,1),'ydata',rot3(:,2));
set(gear3,'xdata',rot4(:,1),'ydata',rot4(:,2));
drawnow; %繪製
pause(1/ww);
ang=ang+angp;
end
%程式結束

因此代入geartrain1(8,14,70,350,1750,25,400)可得影片如下

>>geartrain1(8,14,70,350,1750,25,400)

影片

令人驚訝的是,由於最後的兩個齒輪過於巨大,電腦無法承受如此巨大的運算量,因此顯示出斷斷續續的影片,並非影像擷取軟體所造成,由此可知簡單齒輪組之效益甚低,因此還是選擇複式齒輪組為優,而更複雜如行星,共軸,差速等齒輪系皆是從複式齒輪發展而來.


二、最得意的作業


在本學期中,我最感到得意的作業為第9次作業,由於在做第九次作業的過程當中,花費了大量的時間研究程式的內容,例如深刻

體會到老師在程式中的Euler化可以大幅簡化計算,節省電腦的運算資源,另外就是在解讀程式的過程中發現了sldlink有部分

程式碼問題即f=@(num,ndg),round(num*10^ndg)/10^ndg;等,也了解到就算只是微小的錯誤也會造成整個程式運作上出現嚴重

問題,另外便是在第9次作業中,滑塊分析牽涉到路徑,偏移量等等,因此做了很多不同的嘗試(例如不同驅動桿情況下的分析)
當然另外就是本次作業利用了許多介面專業的形式例如下圖


其中的第二個表格是在我們的目前的作業當中很少利用的,但是這種表示形式卻在論文等未來我們會面臨的報告形式非常常見,如果要製作必須使用其他軟體,但MATLAB卻可以讓我們直接顯示出來.也因此學習得了同時顯示多資訊的方法,在程式執行時,真有一種滿足的成就感.當然在分析的過程中,老師所教導的數學化的座標分析法,利用微分求得速度,加速度等資訊,也是整合了前幾次作業中的四連桿,端桿,動畫等等的內容,因此我對於此次作業最感得意.
另外,第5次作業中對於棒球投手手部運動學資訊的論文搜尋,也是由於突發奇想,想更進一步的探討,因此想辦法找到相關的資

訊,不過仍不如第9次作業中那麼完整.

心得:
學期快要結束,在本學期的課程中,十三次作業讓我們學到了非常多的內容,不僅僅是機動學,而MATLAB的應用也將會對未來有

極大的正面幫助(學長和其他科系的朋友也是如此認為),這種能夠親自動手做的經驗,雖然不是用機具實際製造,也已經可以初

步了解機械結構的奧秘,感謝老師這學期的指導!

機動學作業心得(流程)

b94611001 歐陽太閒

機動學這門課與其他科目有相當大的不同,主要是其學習評鑑以每週一次的作業為主,因此作業的寫作就非常重要.然而在這麼多次的作業當中,雖然每次作業的要求都不同,但仍可以歸納成以下流程,為個人的一點心得:

1.審題

仔細而小心的了解題目中所要求的目標,如此才能了解每章學習的重點,而就如考試一樣,審題要考慮條件,每章內容,以及最重要的,要求結果.如此才能正確而豐富地做出有效的結果,而不會白費工夫.

2.查詢資料

審題後便可以開始回憶當次上課所學的內容,以及參考老師的網路講義和課本資料,但通常還有利用Google或者其他搜尋器搜尋,而搜尋後有些資料雖然在作業中不一定用得到,但仍可以收納在書籤中,說不定下次就會用到.

3.規劃作業

作業的每個小題間通常有絲路的連貫性,因此可以挑選具有"絲路起點"效果的小題先開始,並且嘗試以講義中有的資料填入,並參考過去寫過的作業,站在自己所累積的資料上,可以節省許多時間.而且規劃先後順序也有利於釐清思路.

4.開始寫作

開始寫作時通常先參考老師的網路講義,以擷取老師的智慧結晶,從而進行發想,是否有某處可以改進,或者有某處可以應用於本次作業.

通常此時會遇到最大的瓶頸是數學表示以及MATLAB的邏輯和指令,通常也是經過不斷嘗試和修正,並且回到步驟2查詢,並且進行調整.

另外通常使用螢幕錄影專家和PhotoImapct來做圖形和影片的處理

5.檢查

作業完成後,進行完整的審視,通常在此時會發現許多有趣的問題和小錯誤,並可以進行修改,減少發佈後修改的時間

6.儲存

儲存時,影片常儲存於Google Video或者Youtube,而圖片則存於Flickr或者Imageshack.

而在儲存時關於>,<等符號,由於blogger在此方面的自動轉換支援不足,因此要非常小心的修正,而排版時要注意各小題的分段,標題,內文顏色等是否合於閱讀,並且趁此機會再次檢查.

7.發布

在作業繳交截止後按下發佈即可

機動學作業雖然要花費許多時間,但可以重新整理上課所學的內容,另外也增加了許多實際操作了解機構運作的機會,而不單純只是考試計算,是一種相當不同的體驗.

謝謝老師.

2007年6月1日 星期五

另一種可能及齒輪

b94611001 歐陽太閒

在我們的機動學課程中討論了各種可動機構,不過除了以Matlab-like和Pro/E等軟體進行分析以外,也有另一種可能性: Java:
此網頁以Java實做包含四連桿,快回等機構,也相當有趣.
Brock Institute for Advanced Studies
link

而關於本次的作業(齒輪),我們可以參考Gears Encyclopedia
其中有對多數齒輪名詞的解釋以及公式和計算範例,可以查詢以利本次作業

Gears Encyclopedia
link

2007年5月31日 星期四

Homework 12

第12次作業
b94611001 歐陽太閒

5/31日曾全程來上課。

齒輪是機構中最重要的一種元件,可以在很少損失的情況(worm除外)下傳遞動力至任意方向,本次作業要分析的是一組標準全齒輪齒輪之徑節=8,齒數為30T與48T,工作壓力角20度(也分析14.5及25度)


1.接觸線長度,與接觸比



接觸比(Contact ratio)即同時有幾對齒相互嚙合。數值越大力量分散較平均,接觸比最好大於1
以免出現未嚙合等現象

接觸比 mc = 接觸路徑長度/基周節

或者課本的


因此我們可以利用講義中程式:
[c_ratio, c_length,ad,pc,pb,r2,r3,ag]=contact_ratio(徑節,齒數1,齒數2,[壓力角]')

[c_ratio, c_length,ad,pc,pb,r2,r3,ag]=contact_ratio(8,30,48,14.5)
c_ratio = 接觸比
2.0308
c_length = 接觸長度
0.7721
ad = 齒冠
0.1250
pc = 周節
0.3927
pb = 基周節
0.3802
r2 = 齒輪2節圓直徑
3.7500
r3 = 齒輪3節圓直徑
6
ag =
12.6898 11.6797 24.3695 齒輪2的接近角/遠退角/作用角
7.9311 7.2998 15.2309 齒輪3的接近角/遠退角/作用角

[c_ratio, c_length,ad,pc,pb,r2,r3,ag]=contact_ratio(8,30,48,20)
c_ratio = 接觸比
1.7005
c_length = 接觸長度
0.6275
ad = 齒冠
0.1250
pc = 周節
0.3927
pb = 基周節
0.3690
r2 = 齒輪2節圓直徑
3.7500
r3 = 齒輪3節圓直徑
6
ag =
10.4850 9.9211 20.4061 齒輪2的接近角/遠退角/作用角
6.5532 6.2007 12.7538 齒輪3的接近角/遠退角/作用角


[c_ratio, c_length,ad,pc,pb,r2,r3,ag]=contact_ratio(8,30,48,25)
c_ratio = 接觸比
1.5028
c_length = 接觸長度
0.5349
ad = 齒冠
0.1250
pc = 周節
0.3927
pb = 基周節
0.3559
r2 = 齒輪2節圓直徑
3.7500
r3 = 齒輪3節圓直徑
6
ag =
9.1921 8.8419 18.0340 齒輪2的接近角/遠退角/作用角
5.7450 5.5262 11.2712 齒輪3的接近角/遠退角/作用角


2.節圓、基圓直徑



根據圖片

節圓(Pitch Circle)節面之正剖面,為代表齒輪的虛擬圓
R=齒數/(徑節)
基圓(Base Circle)用以產生漸開線的虛擬圓
Rb=R*cos(壓力角)


a.首先,節圓的計算
徑節=8,齒數=30,48

R2=30/8=3.7500
R3=48/8=6

b.基圓之計算(稍小於節圓)
1.壓力角=14.5

因此:

Rb2=3.7500*cos(14.5*pi/180)=3.6306
Rb3=6*cos(14.5*pi/180)=5.8089

draw_gear(8,30,14.5,360,0,0)




2.壓力角=20

Rb2=3.7500*cos(20*pi/180)=3.5238
Rb3=6*cos(20*pi/180)=5.6382




3.壓力角=25

Rb2=3.7500*cos(25*pi/180)=3.3987
Rb3=6*cos(25*pi/180)=5.4378



或者根據Gears Encyclopedia
(Pd/cos(helix angle))*cos(atan(tan(正壓力角)/cos(helix angle)))

Gears Encyclopedia

3.齒輪的干涉


根據老師的講義,兩齒輪關係如圖

利用MP>AP,可獲得幾何關係:

因此:



故根據講義/課本中所提供的公式

(N22+2N2 x N3)sin2>= 4 + 4N3

302 + 2(30)(48)sin2(20)> 4 + 4(48)

1236.89>196
不會發生干涉

若利用講義中的[x]=isinterf(phi,N1,N2)

>>[x]=isinterf(20,30,48)
x =
0

function [x]=isinterf(phi,N1,N2)
%% Test if the gear set exists an interference% phi:pressure angle, in degrees
% N1,N2:teeth of both gears
% x=0:no interference; x=1 interence existsx=0;
sinx=sin(phi*pi/180); %先計算好角度
if N2<N1,nn=N1; %判定大小決定是大齒輪或小齒輪
N1=N2;N2=nn;
end
if N1*(N1+2*N2)*sinx*sinx<4*(1+N2), %帶入公式
x=1;
end



4.draw_gear.m與動畫



繪製一齒輪需要極繁雜的程式,在ProE或者AutoCAD中都有plug-ins代勞,但我們這次為了了解程式的應用,故嘗試利用老師的draw_gear.m來繪製


另外,發現一個相當有趣的現象,即在漸開線齒輪繪製時,由於程式的360度重疊的關係(可能由於無法整除),故在轉動時會缺齒,重疊越多缺齒越多,而del(第二齒輪初始偏移量)似乎與徑節有關

function [coords]=draw_gear(Dp,N,phi,range,x0,y0)
Dp=節矩
N=齒數
phi=壓力角
range=繪出之部份
x0,y0=齒輪中心座標

此為一利用漸開線繪製齒輪的程式,因此我們可以暫時註解其plot,輸出其運算值,並寫成另一程式來進行本題目齒數30與齒數48T壓力角20之雙正齒輪運動動畫

因此利用
draw_gear.m
bushing.m
rotate2D.m


我們可以寫出程式如下:

程式結構
1.清除畫面及程式資訊
2.參數引入draw_gear.m
3.建立基本物件
a.利用bushing畫基座
b.建立齒輪
c.利用bushing畫節圓和基圓
4.利用while進行動畫繪製
a.轉角
b.畫出新位置


function move_gear(Dpitch,nn1,nn2,phi,ww)
%12.4 歐陽太閒 b94611001 本程式改寫自老師的 move2_rack.m
%本程式改寫自老師的move2_rack
%Dpitch=節矩,nn1=R2齒數,nn2=R3齒數,phi=壓力角,ww=nn1角速度

clf; %清除畫面

d2r=pi/180;%角徑轉換
unit1=0.01;%動畫單位
phir=phi*d2r;
pc=pi/Dpitch; %計算pc
title('作業12 作者:歐陽太閒 b94611001'); %資訊
xlabel('x-axis cm');
ylabel('y-axis cm');
hold on;
[coord,rp,rb]=draw_gear(Dpitch,nn1,phi,360,0,0); %將參數引入draw_gear.m,畫第一齒輪
[coord2,rp2,rb2]=draw_gear(Dpitch,nn2,phi,360,0,0); %將參數引入draw_gear.m,畫第二齒輪
xc1=coord(:,1);yc1=coord(:,2); %將計算結果引出
xc2=coord2(:,1);yc2=coord2(:,2);%將計算結果引出
del=3
coord2=rotate2D([coord2(:,1),coord2(:,2)],+del,0,0);
coord=bushing(rp/6,0,0); %利用bushing畫基座
coord2=bushing(rp2/6,rp+rp2,0);
xb1=coord(:,1);yb1=coord(:,2);
xb2=coord2(:,1);yb2=coord2(:,2);
plot(xb1,yb1,'r-'); %畫出大小齒輪基座
plot(xb2,yb2,'r-');
pini=line('xdata',[],'ydata',[],'erasemode','xor','linewidth',1,'color','r'); %建立handler
gear=line('xdata',[],'ydata',[],'erasemode','xor','linewidth',1,'color','b');

[coord3]=bushing(-rp2,rp+rp2,0.2); %利用bushing畫節圓和基圓
plot(coord3(:,1),coord3(:,2),'b:');
[coord4]=bushing(-rb2,rp+rp2,0.2);
plot(coord4(:,1),coord4(:,2),'k:');

[coord5]=bushing(-rp,0,0); %利用bushing畫節圓和基圓
plot(coord5(:,1),coord5(:,2),'b:');
[coord6]=bushing(-rb,0,0);
plot(coord6(:,1),coord6(:,2),'k:');



axis equal;
ang=0;
angp=ww*unit1;
while 1 %利用while進行動畫繪製
rot1=rotate2D([xc1,yc1],ang,0,0); %進行轉角,產生新座標
rot2=rotate2D([xc2,yc2],-ang*(nn1/nn2),rp+rp2,0);
set(pini,'xdata',rot1(:,1),'ydata',rot1(:,2)); %分別畫出大小齒輪
set(gear,'xdata',rot2(:,1),'ydata',rot2(:,2));
drawnow; %繪製
pause(1/ww);
ang=ang+angp;
end
%程式結束


因此我們代入

move_gear(8,30,48,20,100)

可得到
圖片

影片
影片


move_gear(8,30,48,14.5,100)

可得到
圖片

影片
影片



move_gear(8,30,48,25,100)


可得到
圖片

影片

影片

MATLAB完整指令對照表

b94611001 歐陽太閒

由於我們在使用MATLAB的過程中,常常會為了尋找一個適當的指令而花費許多時間,或者有更適當的指令但卻不會使用,而網路上的資料常常過於零碎,或者由於語言的隔閡,使得我們常常漏失寶貴的資訊,無法發揮MATLAB的強大功能,因此在網路上搜尋MATLAB指令對照表並排版之,可以快速搜尋指令,並且搭配help使用.

由於篇幅過大,故放在我的個人空間,請移駕以下網址
link

其內容包括
1 常用指令(General Purpose Commands)
2 運算符和特殊算符(Operators and special characters)
3 程式語言結構(Programming language constructs)
4 基本矩陣函數和操作(Elementary matrices and matrix manipulation)
5 基本數學函數(Elementary math functions)
6 特殊函數(Specialized math functions)
7 矩陣函數和數值線性代數(Matrix functions-numerical linear algebra)
8 資料分析和傅裏葉變換(Date analysis and Fourier transforms)
9 音頻支援(Audio support)
10 插補多項式函數(Interpolation and polynomials)
11 數值泛函函數和ODE 解算器(Function functions and ODE solvers)
12 二維圖形函數(Two dimensional graphs)
13 三維圖形函數(Three dimensional graphs)
14 特殊圖形(Specialized graphs)
15 控制碼圖形(Handle Graphics)
16 圖形用戶介面工具(Graphical user interface tools)
17 字串(Character string)
18 檔輸入/輸出(File input/output)
19 時間和日期(Time and dates)
20 資料類型(Data types and structures)
21 範例(E xamples and demonstrations)
22 符號工具包(Symbolic Math Toolbox)
23 其他

台大網頁空間之利用

b94611001 歐陽太閒

我們平時繳交作業,或者暫存檔案/個人文件時總是需要一個獨立的空間,然而校外的空間常常是不易使用或者速度緩慢,但學校提供了一個相當好的網頁空間服務,其官方完整使用方法如下
link

概述如下
1.知道自己的帳號密碼
2.使用支援SSL的FTP軟體(如免費的smartftp)
http://www.smartftp.com/
3.分別在主機名稱填入homepage.ntu.edu.tw,帳號,密碼
4.選用explicit SSL連線
5.連線後建立public_html目錄
6.可以上傳html檔至public_html目錄
7.檔案位址即http://homepage.ntu.edu.tw/~學號/

2007年5月24日 星期四

Homework 11

第十一次作業
b94611001 歐陽太閒
本週(5/24)有來上課

一,凸輪資料分析:


本次作業的凸輪之資料如下
升程:
加速度運動:0-100°滯留後開始提升(rise)到5cm,並且在200-260°間滯留,而後進入返程.
返程:
加速度運動:260-320°間為返程至0cm,滯留至360°
刻度:
10°

以上之狀況可做如下分析(加速度運動)θ為輸入角度,β=區間

升程上半段位移:y(θ)=2h(θ/β)²
升程下半段位移:y(θ)=h[1-2(1-θ/β)²]
返程上半段位移:y(θ)=h[1-2(1-θ/β)²]
返程下半段位移:y(θ)=2h(1-θ/β)²

因此我們可以利用老師講義中的parabol_cam.m來進行此凸輪在不同角度時的位置,速度,加速度對角度的關係:

function [y, yy, yyy]=parabol_cam(phi, phi_in,beta_range,direct,travel,rpm)
各項參數分別的代表意義為:
phi=當前輸入角度
phi_in=升降程起始角度
beta_range=本程所經之角度
direct=方向,1為升程,-1為返程
travel=衝程
rpm=轉速

因此可以對於凸輪的運動進行分析,在此選擇返程也為一加速度運動,當然也可以選擇其他運動.

程式架構:
1.程式資訊
2.建立向量
3.計算升程引用parabol_cam
4.計算停滯
5.計算返程引用parabol_cam
6.計算停滯
7.向量合成
8.繪圖

故撰寫程式如下:

function [ss, vv, aa]=acccam(rstart,rend,rstart2,rend2,c,stroke)
%作者 b94611001 歐陽太閒
%rstart=升程起始角度,rend=升程結束角度,rstart2=降程開始角度,rend2=降程結束角度,c=分割度數,stroke=衝程
%for example:acccam(100,200,260,320,10,5)

title('作業11 作者:歐陽太閒 b94611001'); %資訊
xlabel('x-axis degree');
ylabel('y-axis cm');
axis equal;
itmr=rstart/c; %進行角度處理
itme=rend/c;
itmr2=rstart2/c;
itme2=rend2/c;
hold on; %多層繪圖

theta1=linspace(0,0,itme); %建立一0向量

for q=1:itmr %先填入升程前的角度
theta1(q)=q*c
end
for j=itmr:length(theta1); %計算升程
theta1(j)=j*c; %填入角度
[ss1(j), vv1(j), aa1(j)]=parabol_cam(theta1(j),rstart,rend-rstart,1,stroke,0); %引用parabol_cam
end

theta2=linspace(rend,rstart2,itmr2-itme+1); %計算滯留
ss2=linspace(ss1(itme),ss1(itme),itmr2-itme+1); %延續升程資料
vv2=linspace(vv1(itme),vv1(itme),itmr2-itme+1);
aa2=linspace(0,0,itmr2-itme+1);

theta3=rstart2:c:rend2 %計算返程
for k=1:(length(theta3))
[ss3(k), vv3(k), aa3(k)]=parabol_cam(theta3(k),rstart2,rend2-rstart2,-1,5,0) %引用parabol_cam
end;

theta4=linspace(rend2,360,(360/c)-itme2+1); %計算滯留
ss4=linspace(ss3(length(theta3)),ss3(length(theta3)),(360/c)-itme2+1);
vv4=linspace(vv3(length(theta3)),vv3(length(theta3)),(360/c)-itme2+1);
aa4=linspace(0,0,(360/c)-itme2+1);

theta=[theta1 theta2 theta3 theta4];
ss=[ss1 ss2 ss3 ss4]; %合併向量
vv=[vv1 vv2 vv3 vv4];
aa=[aa1 aa2 aa3 aa4];
h1=plot(theta,ss,'b-',theta,vv,'k-',theta,aa,'r-') %繪製
legend('位移','速度','加速度',3) %標註


因此我們可以輸入以下指令

>>acccam(100,200,260,320,10,5)

結果如圖


只顯示位移時:
結果如圖



當然我們也可以使用老師的plot_dwell.m來進行繪製,但plotdwell只適用於末段為回程者,但我們也可以測試之.
升程:
加速度運動:0-100°滯留後開始提升(rise)到5cm,並且在200-260°間滯留,而後進入返程.
返程:
加速度運動:260-360°間為返程至0cm
刻度:
10°

可以輸入以下指令

>>plot_dwell(0:10:360,5,[2 2],[100 200 260])

結果如圖



二,凸輪工作曲線


在此作業中,需繪製第一題中的凸輪之工作曲線半徑為15公分,順時鐘方向旋轉,梢形垂直接觸從動件,長10cm
因此本題可以老師的

function [x,y]=pincam(cth,r0,s,e,L,range,pattern,cw)

為基礎,由於選擇的範圍dwell.m無法處理,故無法直接使用pincam.m,因此改寫一程式pincam_acc,其中引用了上一題中的acccam.m計算結果,而

可得此凸輪之工作曲線.

程式架構:
1.程式資訊
2.處理偏置量
2.引入acccam計算資料(位移)
3.計算轉軸並存入向量
4.繪製延伸線及梢
5.繪圖

程式碼如下:

function [x,y]=pincam_acc(cth,r0,s,e,L,rstart,rend,rstart2,rend2,cw)
%作者 b94611001 歐陽太閒
%rstart=升程起始角度,rend=升程結束角度,rstart2=降程開始角度,rend2=降程結束角度,cth=範圍,s=衝程,r0=凸輪基圓半徑
%e=偏置量,L:從動件(銷型)長度,cw:凸輪轉動方向(+1,-1)
%for example:pincam_acc([0:10:360],15,5,0,10,100,200,260,320,+1)
title('作業11 作者:歐陽太閒 b94611001'); %資訊
xlabel('x-axis cm');
ylabel('y-axis cm');
th=cth*pi/180;
s0=sqrt(r0*r0-e*e); %含偏置量時計算
[ss,vv,aa]=acccam(rstart,rend,rstart2,rend2,10,s) %引入acccam計算資料
for i=1:length(cth) %引入範圍內的位移,並以軸旋轉
t=th(i)*cw;
A=[cos(t) -sin(t);sin(t) cos(t)];%以軸轉
ym=ss(i);
x0=s0+ym;
Sx=[0 x0 x0+L;e e e];
X=A\Sx;
x(i)=X(1,2);y(i)=X(2,2);
line(X(1,1:2),X(2,1:2)); %繪製延伸線
line(X(1,2:3),X(2,2:3),'linewidth',3,'color','blue') %繪製梢
end
hold on;
plot([0 x],[0 y],'ro',x,y,'k-') %繪圖
rb = linspace(0, 2*pi, 301);
plot(r0*cos(rb), r0*sin(rb),'r-'); %畫基圓
axis equal;


輸入pincam_acc([0:10:360],15,5,0,10,100,200,260,320,-1)

>>pincam_acc([0:10:360],15,5,0,10,100,200,260,320,-1)

結果如圖


顯示基圓時:



而假設有偏置量e=5時

>>pincam_acc([0:10:360],15,5,5,10,100,200,260,320,-1)

結果如圖


本題若選擇為
升程:
加速度運動:0-100°滯留後開始提升(rise)到5cm,並且在200-260°間滯留,而後進入返程.
返程:
加速度運動:260-360°間為返程至0cm

符合dwell.m的設計,則可使用pincam.m

輸入
pincam([0:10:360],15,5,0,10,[100 200 260],[2 2],-1)
結果如圖


>>pincam([0:10:360],15,5,0,10,[100 200 260],[2 2],-1)

與剛剛撰寫的pincam_acc([0:10:360],15,5,0,10,100,200,260,360,-1)結果相同

>>pincam_acc([0:10:360],15,5,0,10,100,200,260,360,-1)

結果如圖



三,凸輪之動畫


在本程式中,嘗試利用rotate(把手,[1 0 0],角度)這個命令,可以大幅減少程式碼,並且嘗試更簡潔的動畫結構.

程式結構如下:
1.程式資訊
2.處理偏置量
2.引入acccam計算資料(位移)
3.計算轉軸並存入向量
4.進行動畫繪製
a.旋轉及平移
b.暫停


因此撰寫以下程式:

function [x,y]=pincammov(cth,r0,s,e,L,rstart,rend,rstart2,rend2,cw)
%作者 b94611001 歐陽太閒
%rstart=升程起始角度,rend=升程結束角度,rstart2=降程開始角度,rend2=降程結束角度,cth=範圍,s=衝程,r0=凸輪基圓半徑
%e=偏置量,L:從動件(銷型)長度,cw:凸輪轉動方向(+1,-1)
%for example:pincam_acc([0:10:360],15,5,0,10,100,200,260,320,+1)
title('作業11 作者:歐陽太閒 b94611001'); %資訊
xlabel('x-axis cm');
ylabel('y-axis cm');
th=cth*pi/180;
s0=sqrt(r0*r0-e*e); %含偏置量時計算
[ss,vv,aa]=acccam(rstart,rend,rstart2,rend2,10,s) %引入acccam計算資料

for i=1:length(cth) %引入範圍內的位移,並以軸旋轉
t=th(i)*cw;
A=[cos(t) -sin(t);sin(t) cos(t)];%以軸轉
ym=ss(i);
x0=s0+ym;
Sx=[0 x0 x0+L;e e e];
X=A\Sx;
x(i)=X(1,2);y(i)=X(2,2);
end

h1=plot([0 x],[0 y],'ro',x,y,'k-') %標點
axis equal;
axis([-25 25 -25 25]);

for j=1:100 %進行旋轉
q=37-rem(j,37);
ys=r0+ss(q);
%clf;
h2=line([0 0],[ys ys+L],'linewidth',3,'color','blue'); %繪製梢
rotate(h1,[0 0 1],(-10));
pause(0.1);
h2=line([0 0],[ys ys+L],'linewidth',3,'color','white');
pause(0.05)
end

輸入pincam_acc([0:10:360],15,5,0,10,100,200,260,320,-1)

>>pincam_acc([0:10:360],15,5,0,10,100,200,260,320,-1)

結果如圖


影片


附錄:acccam(100,200,260,320,10,5) 運算結果

ss =
Columns 1 through 7
0 0 0 0 0 0 0
Columns 8 through 14
0 0 0 0.1000 0.4000 0.9000 1.6000
Columns 15 through 21
2.5000 3.4000 4.1000 4.6000 4.9000 5.0000 5.0000
Columns 22 through 28
5.0000 5.0000 5.0000 5.0000 5.0000 5.0000 5.0000
Columns 29 through 35
4.7222 3.8889 2.5000 1.1111 0.2778 0.0000 0.0000
Columns 36 through 39
0.0000 0.0000 0.0000 0.0000
vv =
Columns 1 through 7
0 0 0 0 0 0 0
Columns 8 through 14
0 0 11.4592 12.6051 13.7510 14.8969 16.0428
Columns 15 through 21
5.7296 4.5837 3.4377 2.2918 1.1459 0 0
Columns 22 through 28
0 0 0 0 0 0 -82.7606
Columns 29 through 35
-85.9437 -89.1268 -9.5493 -6.3662 -3.1831 -0.0000 -0.0000
Columns 36 through 39
-0.0000 -0.0000 -0.0000 -0.0000
aa =
Columns 1 through 7
0 0 0 0 0 0 0
Columns 8 through 14
0 0 6.5656 6.5656 6.5656 6.5656 6.5656
Columns 15 through 21
-6.5656 -6.5656 -6.5656 -6.5656 -6.5656 -6.5656 0
Columns 22 through 28
0 0 0 0 0 0 -18.2378
Columns 29 through 35
-18.2378 -18.2378 18.2378 18.2378 18.2378 18.2378 0
Columns 36 through 39
0 0 0 0