2007年6月16日 星期六

清大資工張智星教授的網頁

http://neural.cs.nthu.edu.tw/jang/

前兩篇提到的書和powerpoint檔就是這位教授所作。在他的個人網頁裡,不只有上次我po的Matlab簡報檔的連結,還有範例程式碼、習題解答、補充習題、勘誤表等等。我認為是不錯的學習Matlab的輔助教材。大家有空可以看看!

2007年6月13日 星期三

實際見識F1安全科技的發達



這是上個禮拜,F1加拿大站在比賽時所發生的嚴重車禍。Sauber BMW F1 Team的車手Robert Kubica以170mph的時速衝撞水泥護欄,車輛經過多次翻滾及撞擊後幾乎全毀。但駕駛艙卻完好無缺,車手也只有輕微腦震盪及腳踝扭傷,經過全身檢查後,隔天就出院了!



這是1972年,在F1場上發生的嚴重車禍。Ferrari的車手Gilles Villeneuve在這場車禍中不幸喪生。



這是1994年5月1號在義大利Imola賽道上發生的嚴重車禍,Williams Renault的車手Ayrton Senna在這場車禍中不幸喪生。

從1994年Senna的車禍之後,FIA(國際汽車聯盟)就致力於提高F1的安全性,將安全規格逐年提高。在這樣的主張下,發展出了可藉由撞擊時的潰縮與碎裂來吸收強大撞擊力道的碳纖維車身,以及保護車手頸部的HANSS裝置(簡單來說就是F1車手肩膀上的東西和頭盔所形成的一套保護系統)。1994年之後,F1場上也有過幾次嚴重車禍,但歸功於這些發達的安全科技,車手都能全身而退(Senna是最後一位因比賽車禍而喪生的F1車手)。回頭看看Robert Kubica的車禍影片,是不是碎片四處飛,車手的頸部也受到強烈的甩動?要不是碳纖維車身的車鼻和兩側進氣口的潰縮區,以及HANSS裝置,雙雙發生作用,如此強烈的撞擊力道下,車手是幾乎必死無疑的。比較1994年Senna的車禍就可以看得出來,Senna發生車禍時,車子是從側向去撞擊牆壁,車速也比Kubica發生車禍時要慢,但是兩者的結果卻大相逕庭。

這些高科技的安全技術,如今也開始慢慢轉移到市售車上,如潰縮區的概念已經引入眾多車種中。希望在不久的將來,我們平日開的車也能有一樣的安全性能。

Matlab程式應用的powerpoint

最近跟清大的學長聊天,聊到了Matlab。學長說他認識一位資工系的教授,叫做張智星,曾經出過兩本跟Matlab有關的書:「MATLAB 程式設計─入門篇」、「MATLAB程式設計與應用」。其中 「MATLAB程式設計─入門篇」就是劉昶志同學在機動學論壇的文章提到的那本書,而那位清大的學長也將這本書的投影片傳給了我。我稍微看了一下,還滿淺顯易懂,可以配合著教授的「Matlab在工程上的應用」 網路講義看,相信會有更好的學習效果。以下是投影片的連結:
http://homepage.ntu.edu.tw/~b94202029/slide.rar

作業十三

b94202029 物理二 張哲輔
我本週有上課。

1. 試設計一組複式齒輪,使其轉速比為125(請說明思考步驟及結果)。

step 1:決定複式齒輪組的齒輪數

通常兩相接齒輪的轉速比不宜超過10。假設我們使用的齒輪組所有相接齒輪間的轉速比都是10,則使用兩組時,轉速比為10*10=100,尚未超過125;使用三組時,轉速比為10*10*10=1000,超過125,故我們最少必須使用三組齒輪之組合。(也可使用超過三組齒輪之組合,但沒有必要)

step 2:決定齒輪類別

系統參數 全齒 全齒 全齒 栓齒
壓力角(度) 14.5 20 25 20
k值 1 1 1 0.8
N值 31.90 17.10 11.20 13.68
最低齒數 32 18 12 14

若沒有特殊需求,所有類別都可以選用。我們在這裡決定所有的齒輪都用壓力角為20度的全齒。為避免干涉現象,齒數必須在18以上。
注意共軸的大齒輪和小齒輪不一定要使用同樣類型的齒輪,只要相接的齒輪使用同一種類型就好。例如我們可以選用:第一個小齒輪使用a類型、同軸的大齒輪使用b類型;跟前一軸大齒輪相接的小齒輪b類型、同軸的大齒輪c類型……以此類推。

step 3:決定大小齒輪的齒數

我們先決定小齒輪齒數。齒數只要在18以上就不會產生干涉現象,故我們直接選用18齒。由於我們選用三組齒輪之組合,又轉速比為125,故每組齒輪的齒數比值都選5,就可以得到125的轉速比。以這樣的齒數比值,可以算出大齒輪齒數為18*5=90齒。
注意:有時候我們會希望齒數比值是每組齒輪都一樣的,這時候我們就會把轉速比開n次方根(n是齒輪組數),然後決定小齒輪到底要幾齒時大齒輪的齒數會最接近整數。但有時我們也可以接受齒數比值不一樣的情形,這時候我們就會把轉速比拿來做因式分解,再從眾多因數中選擇適當的組合,決定出齒數比值。


故我們得到整組齒輪組的規格為:
齒輪組數 齒輪類型 壓力角 k值 小齒輪齒數 大齒輪齒數
3 全齒 20度 1 18 90

2. 請指出本學期中你自己最感得意的一次作業(請說明其原因,且該作業必須在自己的部落格內)。

我最感到得意的作業是作業十一:http://b94202029mechanisms.blogspot.com/2007/05/blog-post_30.html

之所以會對這個作業感到滿意,有幾個原因:
1.老師出題目的時候偏置量和返程運動型式都沒有規定,於是我就做出了可自由輸入偏置量和去程及返程運動型式的程式。
2.我把本次作業三個小題合併成一個大程式,且可以一次得到三個小題的figure,這是我前幾次作業一直都想學起來的技巧。我原本是想把三小題的figure統統濃縮在一個figure裡面呈現,不過做出來的結果並不是很清楚,為了維持高度的辨識性,我才決定把三小題的figure分開來呈現。
3.我原本以為把偏置量這個quantity引入後,並不會增加太多撰寫上的難度,但事實卻不然。對於有偏置量的凸輪,凸輪轉動角度和凸輪實際位置的數學關係遠比我想像中複雜,我花了大約兩小時,用網路講義的各種程式去畫圖,從圖裡面去找出轉動角度和實際位置的關係,又花了約兩小時,才把跟偏置量有關的程式碼寫完。當時已經是清晨五點,所以我印象特別深刻,也對這個程式特別有感情。
4.雖然我有四個作業100分,但是我選擇了這個95分的作業。老師在回應裡面提到x軸跟y軸不一樣,應該使用axis equal。我在撰寫這個程式時曾想過這個問題,但使用了axis([xmin xmax ymin ymax])就會使axis equal失效,使用了axis equal就會使axis([xmin xmax ymin ymax])失效,這是我很多次作業都碰到的問題,也找不到方法解決。所以我為了不讓凸輪圖形在figure上因[xmin xmax ymin ymax]未規定而上下左右擺動,選擇犧牲了axis equal。這也是我對於這個作業印象深刻的部份。

2007年6月9日 星期六

有關車子的網站

http://classroom.u-car.com.tw/classroom-home.asp
這個網站是和在機動學論壇頻頻出現的Toyota汽車教室合作的網站,兩個網站的內容幾乎一模一樣,不過這個網站在懸吊系統介紹的比較多一點,獨立式和非獨立式都有。裡面有還算清楚完整的汽車構造解說。

http://www.autoth.com/forums/index.php?s=8fbdd4738d439704882e1aad514fb623&
這個網站叫做汽車技術網,是一個論壇,有不少同好在裡面討論各種汽車方面的知識。

http://www.f1technical.net/
這是一個外國論壇,討論F1的科技。和其他討論汽車或F1的論壇不同的是,F1車隊的工程師有些會上這個論壇和大家交流,可以和製造F1賽車的人討論是一件很令人興奮的事!

2007年6月6日 星期三

作業十二

b94202029 物理二 張哲輔
我本週有上課。


徑節Pd (diametral pitch) = 8
齒數N (teeth number) = 30T / 48T
壓力角ψ(pressure angle) = 20o


第一題

(此圖是從老師的講義擷取而得)

要算出接觸線長度,必須先算出兩圓之節圓半徑R1&R2、齒冠a1&a2:
(齒冠的規格有兩種: 。老師程式裡使用的規格是前者,故這邊也沿用此規格。)接觸線長度可由以下公式求得:在計算接觸比之前,必須先算出基周節Pb:接觸比可由以下公式求得:我們也可以用網路講義的contact_ratio.m程式得到接觸線長度與接觸比:
[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 =
3.7500

r3 =
6

ag =
10.4850 9.9211 20.4061

6.5532 6.2007 12.7538


第二題
節圓直徑: 基圓直徑:


第三題
(此圖是從老師的講義擷取而得)

若齒輪滿足下列任一不等式則不會發生干涉情形:
將數值帶入後得:
不等式成立,故不會發生干涉現象。

我們也可以用網路講義的isinterf.m程式來分辨會不會有干涉現象(0為沒有,1為有)
[x]=isinterf(20,30,48)
x = 0


第四題

我將老師的draw_gear.m程式稍做修改後,做出第四題要的旋轉動畫。
有三個地方是修改重點:
  1. 修改成兩個齒輪的資料都必須輸入進程式內,以便同時繪出兩個齒輪。
  2. 把做齒輪數據和畫齒輪的那幾行程式碼都修改成兩個齒輪各作一次。
  3. 加入while、rotate和pause,使其變成動畫。
有關程式的解說已經附在裡面。

function draw_gearNew(Dp1,N1,phi1,range1,x01,y01 , Dp2,N2,phi2,range2,x02,y02)
% draw_gearNew(Dp1,N1,phi1,range1,x01,y01,Dp2,N2,phi2,range2,x02,y02)
% To draw a whole gear
% Inputs:
% Dp: Diametrical pitch
% N: no of teeth in a gear
% phi: pressure angle, degrees
% range: the section range to be drawn
% x0,y0: the location of the gear center
% Example draw_gearNew(8,30,20,360,0,0,8,48,20,360,9.75/2,0)

% 做第一個齒輪的數據
[coord1,theta1,rp1,rb1]=tooth(Dp1,N1,phi1);
coords1=[];i=0;
while i coord11=rotate2D(coord1,-i,x01,y01);
coords1=[coords1;coord11];
i=i+theta1;
end

% 做第二個齒輪的數據
[coord2,theta2,rp2,rb2]=tooth(Dp2,N2,phi2);
coords2=[];i=0;
while i coord12=rotate2D(coord2,-i,x02,y02);
coords2=[coords2;coord12];
i=i+theta2;
end

% 將第一個齒輪的繪圖物件通通存成handle,以便待會旋轉。
h11=plot(coords1(:,1),coords1(:,2));hold on;
[coord1]=bushing(rp1/8,x01,y01);
h21=plot(coord1(:,1),coord1(:,2),'b-');
[coord1]=bushing(-rp1,x01,y01);
h31=plot(coord1(:,1),coord1(:,2),'r:');
[coord1]=bushing(-rb1,x01,y01);
h41=plot(coord1(:,1),coord1(:,2),'b:');
axis equal;

% 將第二個齒輪的繪圖物件通通存成handle,以便待會旋轉。
h12=plot(coords2(:,1),coords2(:,2));hold on;
[coord2]=bushing(rp2/8,x02,y02);
h22=plot(coord2(:,1),coord2(:,2),'b-');
[coord2]=bushing(-rp2,x02,y02);
h32=plot(coord2(:,1),coord2(:,2),'r:');
[coord2]=bushing(-rb2,x02,y02);
h42=plot(coord2(:,1),coord2(:,2),'b:');
axis equal;

% 原本的繪圖是tooth對tooth,必須要旋轉成tooth對clearance,這樣咬合才正確
% 把其中一個齒輪做旋轉,旋轉幅度是360/(2*齒數)
rotate(h12,[0 0 1],360/(2*N2),[x02 y02 0]);

% 利用while做出無窮迴圈
while 1
rotate(h11,[0 0 1],1,[x01 y01 0]); % 其中一個齒輪每次轉一度
rotate(h12,[0 0 1],-N1/N2,[x02 y02 0]); % 另一個齒輪每次轉兩齒輪齒數比值的負值
axis equal;
pause(0.05);
end




%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function [coords,theta,rp,rb]=tooth(Dp,N,phi)
% Example tooth(10,10,20)
nn=10;
d2r=pi/180;
phir=phi*d2r;
rp=N/Dp/2;
pc=pi/Dp;
ra=rp+1/Dp;
rb=rp*cos(phir);
rd=rp-1.25/Dp;
thpb=pc/rp;% angle respect to one pitch
tp=pc/2;
rr=linspace(rb,ra,nn)';
invphi=tan(phir)-phir;
for i=1:nn
beta=acos(rp/rr(i)*cos(phir));
tt(i)=(tp/rp/2+invphi-tan(beta)+beta);
end
coord1=[rr.*cos(tt') rr.*sin(tt')];
coord3=reverse(coord1);
th1=linspace(thpb/2,thpb/2-tt(nn),nn)';
coord0=[cos(th1) sin(th1)]*rd;
th2=linspace(tt(nn),-tt(nn),nn)';
coord2=[cos(th2) sin(th2)]*ra;
coord4=reverse(coord0);
coords=[coord0;coord1;coord2;coord3;coord4];
theta=thpb/d2r;

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function [B]=reverse(A)
nn=length(A); B=A;
for i=1:nn,B(i,:)=A(nn-i+1,:);end
B=[B(:,1) -B(:,2)];

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function [coords] = bushing(rr,x0,y0)
d2r=pi/180;
theta=[360:-10:0]*d2r;
r=abs(rr);
rx=r*cos(theta);ry=r*sin(theta);
if rr<0,
rx=rx+x0;
ry=ry+y0;
coords=[rx' ry'];
return;
end;
rx1=rx/2;rx2=-rx1;
ry1=ry/2;ry2=-ry1;
r4=r+r/4;r3=r/3;
bx=[ 0 0 0 -r -r -r4 -r4 r4 r4 -r r r];
by=[r3 -r3 0 0 -r -r -r4 -r4 -r -r -r 0];
coords(:,1)=[bx rx rx1 rx2]'+x0;
coords(:,2)=[by ry ry1 ry2]'+y0;

%%%%%%%%%%%%%%%%%%%%%%%%

function [coords]=rotate2D(coord,theta,x0,y0)
th=theta*pi/180;
c=cos(th);s=sin(th);fact=[c s;-s c];
coords=coord*fact;
coords(:,1)=coords(:,1)+x0;
coords(:,2)=coords(:,2)+y0;