第15W上課任務
1. 任務一:
請以 W15 練習為網誌標題, 800x600 為畫布大小, 在畫布正中央畫一個半徑為 250 畫素, 壓力角 20, 齒數為 36 齒的漸開線正齒輪輪廓.
2. 任務二:
完成後, 請在正齒輪中央寫上自己的學號, 並建立第二個 800x600 的畫布, 請畫出只有上半齒形的漸開線正齒輪輪廓 , 且該齒輪廓下方水平線, 連接兩端齒根圓點交的直線以紅色繪製, 且在齒輪下方以藍色字元寫上自己的學號.
3. 任務三
請各學員在各自 github 倉儲中的 data/py 目錄中, 編寫一個可以採圓心座標, 節圓半徑, 齒數, 壓力角與定位角度作為輸入的齒輪程式函式, 交由組長從各組員的 submodule 設定中呼叫導入, 以便在各分組的網頁中完成一個畫出所有組員協同繪圖的齒輪減速組圖, 且各齒輪正中心必須寫上組員學號, 各組按照學號大小排序, 分別由最右邊齒數 16 齒開始囓合, 依序增加 2 齒, 當排至平面四齒囓合後, 第五位組員則以垂直方向向下囓合兩個齒輪後, 轉由右至左水平排列, 直至所有組員均各提供一個協同囓合用的齒輪為止.
4. 任務四
請依照上述規劃, 在 Onshape 完成相同齒輪組的囓合協同繪圖.
對圖片點擊左鍵
5. 任務五
各組員與組員請同時用 Youtube 與 vimeo, 紀錄上述各階段程式編寫與繪圖配置的 mp4 影片檔案, 標題為"協同產品設計實習第十五週練習"
但因為製作速度比拍影片快和輕鬆,也不怕網路不給利而Lag,再加上找起重點比看
影片簡單,所以我決定不製作影片,而來製作筆記
Code gear
開頭
主要是以下程式的名稱 可改變名稱,不引響程式內容
顯示齒數跟範圍
齒輪外齒顯示的範圍,顯示的齒數,由圓心垂直線向右長出 第行92 for j in range(n): n = 齒數 參考 for j in range(-9,10,+1):
顯示全部樣貌(因為36為全部的齒數) for j in range(36):
注意: 不能輸入負值 for j in range(-9):
可以輸入36(總齒數)以上的數量 for j in range(50):
控制左右方向長出的齒量
-3為向左長出3,3為向右長出3 for j in range(-3,3):
注意: 如果都輸入正數,會以右邊為顯示左邊為消除 因為左邊大於右邊,所以全消光 for j in range(7,3):
注意: 如果都輸入負數,會以左邊為顯示右邊為消除 顯示左7個齒,但會消去起點延伸的3個齒 for j in range(-7,-3):
注意: 不能左正右負 for j in range(7,-3):
疑問: 為何在最後要+1 for j in range(-9,10,+1):
設定 半徑/齒數/壓力角
第157~161行 r = 250
齒數
n = 36
壓力角
pa = 20
r = 半徑 n = 齒數 pa = 壓力角
疑問: r是代表齒輪的哪個半徑? 是 節圓半徑? 齒底半徑? 齒高半徑? ????
齒輪名稱
第177行 這就是名稱 id="onegear2" 這名稱要跟第301行canvas = doc['onegear2'] 名稱onegear2要對到 注意: 沒對到就不會顯示
注意: 要是名稱跟上方齒輪一樣會重疊 canvas = doc['onegear']
控制紅線位置
第209行 self.create_line(midx-rp, midy, midx, midy) 有一到四格,順序為 x / y / x / y rp為長出,輸入一個rp,就會長出一個rp個長度,rp為一個值 正負決定方向 在midx +rp為向右長出,-rp為向左長出 在midy +rp為向下長出,-rp為向上長出
注意: 只能長出一條線,所以要是對midx and midy輸入rp 就會長出斜線 self.create_line( midx-rp, midy+rp, midx, midy) 說明: 以圓心出發,x向左一個rp,y向下一個rp,到達的這位置為終點 ,以圓心連到終點,完成此線
同時對兩個midx or midy輸入相同正負號的rp,是不會顯示紅線 self.create_line( midx, midy+rp, midx, midy+rp)
組合齒輪
在 canvas = doc["gear3"] ctx = canvas.getContext("2d") 下方開始設定齒輪
壓力角
每個齒輪的壓力角都一樣 pa = 20
齒數
齒輪一到齒輪四的齒數 n_g1 = 16 n_g2 = 18 n_g3 = 20 n_g4 = 22
模數
模數定義: D(節圓直徑)/T(齒數),模數相同的齒輪才能憶起配合 說明: m 為模數, 根據畫布的寬度(800), 計算適合的模數大小 m = (0.8*canvas.width)/(n_g1+n_g2+n_g3+n_g4)
節圓半徑
m(模數)T(齒數) = D(節圓直徑) 說明: 所以m(模數)T(齒數)/2(切半) = D/2(節圓半徑) rp_g1 = mn_g1/2 rp_g2 = mn_g2/2 rp_g3 = mn_g3/2 rp_g4 = mn_g4/2
圓心座標
先定義出齒一圓心 說明: 繪圖第1齒輪的圓心座標, 因為希望繪圖佔去 canvas.width 說明: 的 80%, 所以兩邊各預留 10% 距離 x_g1 = canvas.width0.1+rp_g1 說明: y 方向繪圖區域上方預留 canvas.height 的 20% y_g1 = canvas.height0.2+rp_g1
接著依序下去,注意: 每個圓心都要保持水平,都要是為y_g1 說明: 第2齒輪的圓心座標, 假設排列成水平, 表示各齒輪圓心 y 座標相同 x_g2 = x_g1 + rp_g1 + rp_g2 y_g2 = y_g1 說明: 第3齒輪的圓心座標 x_g3 = x_g1 + rp_g1 + 2rp_g2 + rp_g3 y_g3 = y_g1 說明: 第4齒輪的圓心座標 x_g4 = x_g1 + rp_g1 + 2rp_g2 + 2*rp_g3+rp_g4 y_g4 = y_g1
組合
將一到四的齒輪組合,並簽上學號 說明: 將第1齒輪順時鐘轉 90 度, 也就是 math.pi/2 說明: 使用 ctx.save() 與 ctx.restore() 以確保各齒輪以相對座標進行旋轉繪圖 ctx.save() 說明: translate to the origin of second gear ctx.translate(x_g1, y_g1) 說明: rotate to engage ctx.rotate(math.pi/2) 說明: put it back ctx.translate(-x_g1, -y_g1) 繪製第一個齒輪輪廓 Spur(ctx).Gear(x_g1, y_g1, rp_g1, n_g1, pa, "blue") ctx.restore()
ctx.beginPath() ctx.fillStytle = "#0000ff" ctx.font = "20px ScriptS" ctx.fillText("40423222",x_g1-30,y_g1) ctx.stroke()
將第2齒輪逆時鐘轉 90 度之後, 再多轉一齒, 以便與第1齒輪進行囓合 ctx.save() translate to the origin of second gear ctx.translate(x_g2, y_g2) rotate to engage ctx.rotate(-math.pi/2-math.pi/n_g2) 說明: put it back ctx.translate(-x_g2, -y_g2) Spur(ctx).Gear(x_g2, y_g2, rp_g2, n_g2, pa, "black") ctx.restore()
ctx.beginPath() ctx.fillStytle = "#000000" ctx.font = "20px ScriptS" ctx.fillText("40423228",x_g2-30,y_g2) ctx.stroke()
說明: 將第3齒輪逆時鐘轉 90 度之後, 再往回轉第2齒輪定位帶動轉角, 然後再逆時鐘多轉一齒, 以便與第2齒輪進行囓合 ctx.save() 說明: translate to the origin of second gear ctx.translate(x_g3, y_g3) 說明: rotate to engage 說明: math.pi+math.pi/n_g2 為第2齒輪從順時鐘轉 90 度之後, 必須配合目前的標記線所作的齒輪 2 轉動角度, 要轉換到齒輪3 的轉動角度 說明: 必須乘上兩齒輪齒數的比例, 若齒輪2 大, 則齒輪3 會轉動較快 說明: 第1個 -math.pi/2 為將原先垂直的第3齒輪定位線逆時鐘旋轉 90 度 說明: -math.pi/n_g3 則是第3齒與第2齒定位線重合後, 必須再逆時鐘多轉一齒的轉角, 以便進行囓合 說明: (math.pi+math.pi/n_g2)n_g2/n_g3 則是第2齒原定位線為順時鐘轉動 90 度, 說明: 但是第2齒輪為了與第1齒輪囓合, 已經距離定位線, 多轉了 180 度, 再加上第2齒輪的一齒角度, 因為要帶動第3齒輪定位, 說明: 這個修正角度必須要再配合第2齒與第3齒的轉速比加以轉換成第3齒輪的轉角, 因此乘上 n_g2/n_g3 ctx.rotate(-math.pi/2-math.pi/n_g3+(math.pi+math.pi/n_g2)n_g2/n_g3) 說明: put it back ctx.translate(-x_g3, -y_g3) Spur(ctx).Gear(x_g3, y_g3, rp_g3, n_g3, pa, "red") ctx.restore()
ctx.beginPath() ctx.fillStytle = "#ff0000" ctx.font = "20px ScriptS" ctx.fillText("40423245",x_g3-30,y_g3) ctx.stroke()
說明: 將第4齒輪逆時鐘轉 90 度之後, 再往回轉第3齒輪定位帶動轉角, 然後再逆時鐘多轉一齒, 以便與第3齒輪進行囓合 ctx.save() 說明: translate to the origin of second gear ctx.translate(x_g4, y_g4) 說明: rotate to engage ctx.rotate(-math.pi/2-math.pi/n_g4+(math.pi+math.pi/n_g2)n_g2/n_g3+(math.pi+math.pi/n_g3)n_g3/n_g4) 說明: put it back ctx.translate(-x_g4, -y_g4) Spur(ctx).Gear(x_g4, y_g4, rp_g4, n_g4, pa, "green") ctx.restore()
ctx.beginPath() ctx.fillStytle = "#008000" ctx.font = "20px ScriptS" ctx.fillText("40423248",x_g4-30,y_g4) ctx.stroke()
Oshape
在這我是使用正齒輪
齒輪的基本設定
模數都為(800*0.8)/(16+18+20+22) = 8.421 孔洞都為直徑20mm 壓力角都為20度 齒厚度為10mm 第一齒輪到第四齒輪的齒數為 n = 16 / 18 / 20 / 22
距離
第一齒輪到第四齒輪的節圓直徑為 D = 134.736 mm / 151.578 mm / 168.42 mm / 185.262 mm 節圓半徑用來計算齒輪跟齒輪的距離 例如: 134.736/2+151.578/2 = 齒輪一的圓心到齒輪二的圓心之距離
齒的接合
注意: 為了齒輪可以互相接合(不發生干涉) 所以要轉動 = 360(圓的角度)/(T(齒數)*2) = 一齒半的角度
速比
不同齒數的齒輪配合,就會產生速比 就像是第一齒輪被第二齒輪,速比就是18(齒數)/20(齒數) = 0.889
來寫個不同的模數,這樣就可以有... 做不到,因為節圓長度是用 畫布的寬來定義的
買滑鼠
齒輪圓心以下太佔空間了,便跟畫布高度跟圓心
關比指令來顯示筆記
參考對象45:
https://40423245.github.io/2017springcd_hw/blog/2017spring-cd-W15.html