*本週(5/3)有來上課*
由課本上定義,滑塊之滑動方向若與水平方向有一距離e時
稱為偏置機構,而其中e稱之偏置量
而此偏置機構可視為一個四連桿結構
其中偏置量將影響滑桿機構之活動範圍
<本題著重在極限位置之分析>
首先依題目給定R=50,L=55,e=10
由課本之slider_limit函式
計算滑塊水平滑行最大距離(即衝程)和界限角度
以下為程式內容:
function [ s theta21,theta22 ] = slider_limit( R,L,e )
%R= 曲桿長
%L= 連桿長
%e= 偏置量
d2g = pi/180;
th1 = asin(e./(R+L));
th2 = asin(e./abs(R-L));
s = (R+L).*cos(th1)-abs(R-L).*cos(th2);
theta21 = th1/d2g;
theta22 = th2/d2g;
執行後得到以下結果:
slider_limit( 50,55,10 )
abs(s)
abs(theta21)
abs(theta22)
ans =
1.0452e+002 -8.6603e+000i
ans =
104.8809
ans =
5.4650
ans =
117.4463
直接對各項取絕對值
我們得到衝程為104.88
界限角度為5.47和117.45
討論:
在這邊我先發現了個問題
由於篇置量固定
最大衝程應該出現在曲桿和連桿為一直線時
由畢氏定理計算出值應為104.52?
接著利用老師講義上所提供繪製極限位置之函式(drawsldlimits)
此程式除呼叫sld_angle_limits獲得迴轉之範圍外
呼叫drawsldlink函數繪出各桿之位置。
以下為函式內容:
function [Qstart, Qstop]=sld_angle_limits(r,theta1,linkdrive)
%輸入函數:
%r = 四連桿之長度向量
%theta1 = 第一桿之夾角,角度表示(deg)
%linkdrive = 驅動模式(=0 第二桿驅動; =1 第三桿驅動 =2 滑塊驅動)
%輸出(兩個角度)
%Qstart = 驅動桿(第二桿或第三桿)之最低限角度 (deg)
%Qstop = 驅動桿(第二桿或第三桿)之最高限角度 (deg)
r1=r(1);r2=r(2);r3=r(3);r4=r(4);
g2d=180/pi;
switch linkdrive
case 0 %crank
if r3+r4=0 & r3>r4
Qstart=asin((r4-r3)/r2);Qstop=asin((r4+r3)/r2);
elseif r3+r4>=r2 & r3>=r4 & 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=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;
function [values]=drawlinks(r,th1,th2,mode,linkdrive)
%r = 四桿之向量位置
%th1 = 第一桿水平角度
%th2 = 驅動桿水平角度
%mode = +1 or -1 組合模數,負值表閉合型;正值表分支型
%linkdriver = 0 (驅動桿為第二桿); 1 (驅動桿為第三桿)
if nargin<5,linkdrive=0;end
if nargin<4,mode=1;end
[values b]=f4bar(r,th1,th2,0,0,mode,linkdrive);
rr=values(:,1);
rr(3,1)=rr(1,1)+rr(4,1);
rx=real(rr(:,1));rx(4)=0;
ry=imag(rr(:,1));ry(4)=0;
if b==1
plot([0 rx(1)],[0 ry(1)],'k-','LineWidth',4);
hold on;
if linkdrive==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)],'g-','LineWidth',1.5);
plot(rx,ry,'bo');
text(0,0,' O');text(rx(1),ry(1),' R');
text(rx(2),ry(2),' Q');text(rx(3),ry(3),' P');
else
fprintf('Combination of links fail at degrees %6.1f\n',th2);
end
axis equal
grid on
function drawsldlimits(r,th1,sigma,driver)
%r = 四桿之向量位置
%th1 = 第一桿水平角度
%sigma = +1 or -1 組合模數,負值表閉合型;正值表分支型
%driver = 0 (驅動桿為第二桿); 1 (驅動桿為第三桿) ;2(滑塊驅動)
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
雖然題目只給定R,L,e之值 也就是相當於四連桿之r2,r3,r4
由於前面slider_limit已求得衝程為104.88 也就是相當於四連桿之r1
因此在drawsldlimits函式中
即可直接代入四桿之值
(1)曲桿驅動(以第二桿為驅動桿)
因為曲桿驅動
driver為0
>> axis([-110 110 -40 40])
drawsldlimits([104.88 50 55 10],0,-1,0)
Qstart =
3.6000e-006
Qstop =
360.0000
討論:
在這邊我發現了一個問題
照程式結果跑出來的角度可作360度旋轉
但是根據課本上所述:
"若曲柄須能完成360度的迴轉,則其相關連桿之長度須依其所能夠成三角形關係而定
而若有偏置的情形時,則連結桿與曲柄之長度差應大於偏置距離e"
與本題條件所給R-L<0條件不符,顯然有錯誤
在請教過歐陽太閒同學後
發現是sld_angle_limits程式碼中少了r3>=r4>0這種情況(也就是講義所列第二情形)
因此將原程式碼中:
elseif r3+r4>=r2 & r4>=r3 & r3>=0
Qstart=asin((r4-r3)/r2);Qstop=pi-asin((r4-r3)/r2);
修正為:
elseif r3+r4>=r2 & r3>=r4 & r3>=0
Qstart=asin((r4-r3)/r2);Qstop=pi-asin((r4-r3)/r2);
重新跑過一次後:
axis([-110 110 -40 40])
drawsldlimits([104.88 50 55 10],0,-1,0)
title('第二桿驅動極限位置 -b94611040')
Qstart =
-64.1581
Qstop =
244.1581
得到了正確的結果

(2)連桿驅動(以第三桿為驅動桿)
%drive為1
axis([-110 110 -40 40])
drawsldlimits([104.88 50 55 10],0,-1,1)
title('第三桿驅動極限位置 -b94611040')
Qstart =
-46.6582
Qstop =
226.6582

(3)滑塊驅動
%driver為2
>> axis([-110 110 -40 40])
drawsldlimits([104.88 50 55 10],0,-1,2)
title('滑塊驅動極限位置 -b94611040')
Qstart =
-104.5227
Qstop =
104.5227

需特別注意
由於滑塊驅動屬於直線運動
故在程式中之Qstart及Qstop值為第一桿位移之最大與最小量。
討論
做到這邊 一直在思考r1的長度問題
原本是使用slider_limit計算出之最大衝程直接當作r1
但是後來考慮到此為滑塊驅動情況
當為曲稈驅動時會有角度的限制
因此試的代入其他值至r1 發現結果一樣
後來觀察sld_angle_limits程式碼
發現限制角度運算都是使用r2,r3和r4
r1會隨運動角度不同而改變 因此設任何值似乎並不影響
接著分別就第二及第三桿驅動之運動狀態作成動畫:
(1)曲桿驅動(以第二桿為驅動桿)
1 則留言:
你的有些討論我都沒想過耶!!!厲害喔!!
張貼留言