2/6/07

7.4 滑塊連桿(RRRP)之迴轉限制

與四連桿一樣,滑塊四連桿在轉動之過程中,仍然受到長度及其他角度之限制,驅動桿無法繞原點作完整之迴轉。這些限制有些基於三角形三邊之構成原理;有些則是基於二桿平行之原則。

四連桿迴轉過程中,有可能其中兩桿會連成一線,或重疊成一線,前者若成立時,即變成三角形,後者若重疊時,亦會構成另一個三角形。理論上連桿構成三角形應不會有相對運動。故可稱為四連桿之運動極限。由這兩個極端位置,可以知道四連桿之最終運動限制。

下面的圖形是利用drawsldlimits函數繪出,繪圖過程中並呼叫sld_angle_limits。此兩程式內容將待後述,目前僅觀察其搭配之成果。當驅動桿為第二及第三桿時,其Qstart與Qstop分別表示驅動桿之最小及最大角度;但當驅動件為滑塊時,其不再是角度,而是其對應之桿一最小及最大長度,亦即r1min與r1max。所繪出之圖中,粗黑色桿表示地桿,但其長度會依滑塊之位置而變。細黑色為第四桿,即固定點垂直於滑塊滑動面之距離,或稱為偏離量。藍色為驅動桿,紅色為連結桿。

A. 第二桿為驅動桿


測試滑塊連桿之組成,以第二桿為驅動桿時有下列四種情況:

(1)當r3≧r4≧0,且 r3+r4 ≦ r2時(例如:[ 1 5 3 1])

  θmin =θ1 + sin-1((r4-r3) / r2)
  θmax =θ1 + sin-1((r4+r3) / r2)



圖7.3 第二桿驅動,有限度迴轉(r = ([1 5 3 1] )


drawsldlimits([1 5 3 1],0,-1,0)
Qstart = -23.578
Qstop = 53.13


(2)當r4≧r3≧0,且 r3+r4 ≧ r2時(例如:[ 1 5 3 4])

θmin =θ1 + sin-1((r4-r3) / r2)
θmax =θ1 +π- sin-1((r4-r3) / r2)




圖2.4 第一及第二象限中運轉,第三桿與第四桿重合(r =[1 5 3 4])

drawsldlimits([1 5 3 4],0,1,0)
Qstart = 11.537
Qstop = 168.46


(3)當r3≧-r4≧0,且 r3-r4 ≦ r2時(例如:[1 5 3 -1])

θmin =θ1 + sin-1((r4-r3) / r2)
θmax =θ1 +sin-1((r4+r3) / r2)




圖7.5 與圖7之情形相同,但前後角度限制相反(r =[1 5 3 -1])



drawsldlimits([1 5 3 -1],0,1,0)
Qstart =-53.13
Qstop = 23.578

(4) 當-r4≧r3≧0,且 r3-r4 ≧ r2時(例如: [1 5 3 -5])

θmin =θ1 + sin-1((r4-r3) / r2)
θmax =θ1 +π- sin-1((r4-r3) / r2)



圖7.6 第三與第四桿共線,與圖8相同但相反,r=[1 5 3 –5]

drawsldlimits([1 5 3 -5],0,1,0)
Qstart =-156.42
Qstop =-23.578

B. 第三桿為驅動桿


第三桿結合桿為驅動桿時,則只要r2≧|r3|+|r4|之條件成立,結合桿即可完全迴轉,即 0≦θ3≦2π。當r2≧|r3|+|r4|條件不能成立時,迴轉會開始有限制,即在第二桿與滑動線相垂直時會發生。

(1) 當0≦r4,且0≦r2-r4≦r3 時 (例如:[3 3 6 1])

 θmin =θ1 +sin-1((r4-r2) / r3)
 θmax =θ1+π- sin-1((r4-r2) / r3)



圖7.7兩側對稱,第二桿垂直於第一桿(r =[3 3 6 1])


drawsldlimits([3 3 6 1],0,-1,1)
Qstart =-19.471
Qstop =199.47

(2) 當0≦r4,且r2+r4≦r3 時 (例如:[3 2 6 3])

 θmin =θ1 +sin-1((r4-r2) / r3)
 θmax =θ1+ sin-1((r4+r2) / r3)




圖7.8 第二桿垂直於第一桿(r =[3 2 6 3 ])


drawsldlimits([3 2 6 3],0,-1,1)
Qstart =9.5941
Qstop =56.443

(3) 當r4≦0,且0≦r2+r4<r3(例如:[3 3 6 -2])

θmin =θ1 –π-sin-1((r4+r2) / r3)
θmax =θ1+ sin-1((r4+r2) / r3)




圖7.9 不同角度但在第三及第四象限內之活動(r =[3 3 6 -2])


drawsldlimits([3 3 6 -2],0,-1,1)
Qstart =-189.59
Qstop =9.5941

(4) 當r4≦0,且r2-r4<r3 時 (例:[3 3 8 -4])

θmin =θ1+ sin-1((r4-r2) / r3)
θmax =θ1+ sin-1((r4+r2) / r3)


圖7.10 第一及第四象限中活動,兩角度者和為(r =[3 3 8 -4 ])


drawsldlimits([3 3 8 -4],0,-1,1)
Qstart =-61.045
Qstop =-7.1808

C. 滑塊為驅動桿


由於屬於直線運動,故在程式中之Qstart及Qstop值為第一桿位移之最大與最小量。

(1)當|r2-r3|>r4時,其條件限制於r1所給之長短,其值為:

rmin = {[r2-r3]2-r42}1/2
rmax = {[r2+r3]2-r42}1/2



圖7.11 滑塊驅動之情形r=[3 3 8 4]

drawsldlimits([3 3 8 4],0,-1,2)
Qstop =10.247

其對應之第二桿角度為:

θmin =θ1 + sin-1((r2+r3) / r4),
θmax =θ1 +sin-1((r2-r3) / r4)

其對應之第二桿角度為:

θmin =θ1 + sin-1((r2+r3) / r4)
θmax =θ1 +sin-1((r2-r3) / r4)


圖7.12 滑塊驅動之情形r=[3 8 3 4]


drawsldlimits([3 8 3 4],0,-1,2)
Qstart =3
Qstop =10.247


(2) 當|r2-r3|< r4時, r1 值為:

rmin = -{[r2+r3]2-r42}1/2
rmax = {[r2+r3]2-r42}1/2

其對應之第二桿角度為:

θmin =θ1 + sin-1((r2+r3) / r4),
θmax =θ1 +π- sin-1((r2+r3) / r4)



圖7.13 滑塊驅動之情形r=[3 8 3 6]

qstart =-9.2195
qstop = 9.2195


sld_angle_limits函數


觀察上面討論之四個極限角度,可以寫一組程式進行計算。由於以第三桿驅動與第二桿驅動,在計算上僅是將其中之r2與r3之位置對調即可。為尋找上述極限角度θmin、θmax,可用函數fb_angle_limits進行尋找,其格式如下:

function [Qstart, Qstop]=sld_angle_limits(r,theta1,linkdrive)

其中輸入項目有:
r = 四連桿之長度向量,其定義與前函數相同。
theta1 = 第一桿之夾角,角度表示(deg)。
linkdrive = 驅動模式(=0 第二桿驅動; =1 第三桿驅動 =2 滑塊驅動)。
而輸出項為兩個角度:
Qstart = 驅動桿(第二桿或第三桿)之最低限角度 (deg)
Qstop = 驅動桿(第二桿或第三桿)之最高限角度 (deg)

上述中若linkdrive=2,表示滑塊驅動,因此輸出項Qstart、Qstop不再表示角度,而是第一桿之最小長度r1min至最大長度r1max。因此其第二桿之對應角度必須另行計算。

drawsldlimits函數則是呼叫sld_angle_limits.m函數,然後將其極限位置繪出。其輸入項目與drawsldlinks函數相同。

程式內容



function [Qstart, Qstop]=sld_angle_limits(r,theta1,linkdrive)
%
%function [Qstart, Qstop]=sld_angle_limits(r,theta1,linkdrive)
%Find initital & final angles of driving link for slider
% linkdrive= 0 for crank; 1 for coupler as the driver, with
% Qstart & Qstop as the limit angles of driving link.
% linkdrive=2 for slider as input, with Qstart & Qstop as its
% initial & final positions of r1
% Variables
% r= linkage row vector (cm)
% Examples:[Qst,Qsp]=sld_angle_limits([1 5 3 1],30,0)
r1=r(1);r2=r(2);r3=r(3);r4=r(4);
g2d=180/pi;
switch linkdrive
case 0 %crank
if r3+r4<r2 & r4>=0 & r3>r4
Qstart=asin((r4-r3)/r2);Qstop=asin((r4+r3)/r2);
elseif r3+r4>=r2 & r4>=r3 & r3>=0
Qstart=asin((r4-r3)/r2);Qstop=pi-asin((r4-r3)/r2);
elseif r3-r4<=r2 & r4<0 & r3>=-r4
Qstart=asin((r4-r3)/r2);Qstop=asin((r4+r3)/r2);
elseif r3-r4>=r2 & r3>=0 & -r4>=r3
Qstart=-pi-asin((r4+r3)/r2);Qstop=asin((r4+r3)/r2);
else
Qstart=0;Qstop=2*pi;
end
case 1 %coupler
if r2-r4<=r3 & r4>=0 & r2>=r4
Qstart=asin((r4-r2)/r3);Qstop=pi-asin((r4-r2)/r3);
elseif r2+r4<r3 & r4>=0
Qstart=asin((r4-r2)/r3);Qstop=asin((r4+r2)/r3);
elseif r2+r4<=r3 & r4<=0 & r2+r4>=0
Qstart=-pi-asin((r4+r2)/r3);
Qstop=asin((r4+r2)/r3);
elseif r2-r4<r3 & r4<=0
Qstart=asin((r4-r2)/r3);Qstop=asin((r4+r2)/r3);
else %r2>=(r3+abs(r4))
Qstart=0;Qstop=2*pi;
end
case 2 %slider displacement
Qstart=0;Qstop=0;
arg2=(r2+r3)^2-r4^2;
if abs(r2-r3)>=r4
arg1=(r2-r3)^2-r4^2;
if arg1>0,Qstart=sqrt(arg1);end;
Qstop=sqrt(arg2);
else
if arg2<0, return; end
Qstart=sqrt(arg2);Qstop=-sqrt(arg2);
end
theta1=0;g2d=1;
end %case
if Qstop<Qstart,TT=Qstart;Qstart=Qstop;Qstop=TT;end
adjust=(Qstop-Qstart)*1e-8;
Qstart=theta1+(Qstart+adjust)*g2d;
Qstop=theta1+(Qstop-adjust)*g2d;


滑塊外形函數sldbox


這是搭配drawsldlinks函數,繪出滑塊外形之程式。其輸入為滑塊之長度與高度,以及其中心點位置。這個滑塊也會隨其方位迴轉。其功能也可以與前述之sldblks函數比較。

function [coords] = sldbox(length,height,x0,y0,theta)
%
%function [coords] = sldbox(length,height,x0,y0,theta)
% Determines the coordinates of points for the block.
% The input:
% length,height = length & height of the block
% [x0,y0] = coordinates of the central block
% theta = rotation angle relative to the horizontal x axis (deg)
% The results are returned in the vector "coords".
theta=theta*pi/180;dx=abs(length)/2;dy=abs(height)/2;
if dy==0,
coords=[-dx,0;dx,0];
else
coords=[-dx,-dy;+dx,-dy;+dx,+dy;-dx,+dy;-dx,-dy];
end
c=cos(theta);s=sin(theta);
trsf=[c s;-s c];
coords=coords*trsf;
coords(:,1)=coords(:,1)+x0;
coords(:,2)=coords(:,2)+y0;


繪出滑塊連桿位置函數drawsldlinks程式


程式必須呼叫drawsldlinks函數繪出對應之連桿及滑塊位置。此程式未來可以作為其他多項之用途。

function [values]=drawsldlinks(r,th1,th2,sigma,driver)
%function drawlinks(r,th1,th2,sigma,driver)
%draw the positions of four-bar links
%call sldlink funcion
%r: row vector for four links
%th1: frame angle
%th2: crank angle or couple angle
%sigma: assembly mode
%driver: 0 for crank, 1 for coupler
%
% Example:
% drawsldlinks([1 2 3 4],0,60,1,0)
%clf;
[values b]=sldlink(r,th1,th2,10,0,sigma,driver);
rr=values(:,1);
rr(3)=rr(3)+rr(2);
rx=real(rr);rx(4)=0;
ry=imag(rr);ry(4)=0;
if b==1
plot([0 rx(1)],[0 0],'k-','LineWidth',4);%ground line
hold on;
plot([0 rx(1)],[0 ry(1)],'g-','LineWidth',1.5);
if driver==0
plot([0 rx(2)],[0 ry(2)],'b-','LineWidth',1.5);
plot([rx(2) rx(3)],[ry(2) ry(3)],'r-','LineWidth',2);
else
plot([0 rx(2)],[0 ry(2)],'r-','LineWidth',2);
plot([rx(2) rx(3)],[ry(2) ry(3)],'b-','LineWidth',1.5);
end
plot([rx(1) rx(3)],[ry(1) ry(3)],'k-');
plot(rx,ry,'bo');
text(0,0,' O');text(rx(1),ry(1),' R');
text(rx(2),ry(2),' P');text(rx(3),ry(3),' Q');
length=max(abs(values(2:3,1)));
len=.20*length;ww=.15*length;
[coords] = sldbox(len,ww,rx(3),ry(3),th1);
plot(coords(:,1),coords(:,2),'r-','LineWidth',2);
[coords] = sldbox(len*3,0,rx(3),ry(3)-ww/2,th1);
plot(coords(:,1),coords(:,2),'r:','LineWidth',1.5);
else
fprintf('Combination of links fails at degrees %6.1f\n',th2);
end
axis equal
grid on


繪出滑塊連桿界限函數drawsldlimits程式


這是呼叫之主程式,程式中特別處理當驅動桿為滑塊時之情形。由於滑塊主動時,其得到之Qstart及Qstop值不是角度,而是其對應r1之長度,故必須求其對應之桿二角度,以便繪出相對位置之連桿。

此程式除呼叫sld_angle_limits獲得迴轉之範圍外,呼叫drawsldlink函數繪出各桿之位置。

function drawsldlimits(r,th1,sigma,driver)
%function drawlmits(r,th1,sigma,driver)
%draw the positions of slide-crank links
%call sldlink.m funcion
%r: row vector for four links
% th1: frame angle
% sigma: assembly mode
% driver: 0 for crank, 1 for coupler,3 for block move
% Example:
% drawsldlimits([1 2 3 4],10,1,0)
%
g2d=180/pi;
[Qstart, Qstop]=sld_angle_limits(r,th1,driver)
if Qstart==0 & Qstop==0, return; end
switch driver
case 0 %Link 2 as driving link
[rr]=drawsldlinks(r,th1,Qstart,sigma,driver);
text(real(rr(2,1)/2),imag(rr(2,1)/2),['s1=' num2str(Qstart,'%6.1f')]);
[rr]=drawsldlinks(r,th1,Qstop,sigma,driver);
text(real(rr(2,1)/2),imag(rr(2,1)/2),['s2=' num2str(Qstop,'%6.1f')]);
case 1 %Link 3 as driving link
[rr]=drawsldlinks(r,th1,Qstart,sigma,driver);
text(real(rr(2,1)+rr(3,1)/2),imag(rr(2,1)+rr(3,1)/2),...
['s1=' num2str(Qstart,'%6.1f')]);
[rr]=drawsldlinks(r,th1,Qstop,sigma,driver);
text(real(rr(2,1)+rr(3,1)/2),imag(rr(2,1)+rr(3,1)/2),...
['s1=' num2str(Qstop,'%6.1f')]);
case 2 %Slide as driving link
if abs(r(2)-r(3))<r(4)
angx=asin((r(2)+r(3))/r(4))*g2d;
tmax=th1+angx;
tmin=th1+180-angx;
else
tmin=th1+asin((r(2)+r(3))/r(4))*g2d;
tmax=th1+asin((r(2)-r(3))/r(4))*g2d;
end
r(1)=Qstart;offr=0.1*Qstart;
[rr]=drawsldlinks(r,th1,tmin,sigma,driver);
text(real(rr(1,1)/2),imag(rr(1,1)/2)+offr,['r1=' num2str(Qstart,'%6.1f')]);
r(1)=Qstop;
[rr]=drawsldlinks(r,th1,tmax,sigma,driver);
text(real(rr(1,1)/2),imag(rr(1,1)/2)-offr,['r1=' num2str(Qstop,'%6.1f')]);
end
axis equal
grid on