2018年1月24日 星期三

(轉貼)更#手做#詳細教學#夾娃娃機#opensource,生日禮物#圖超多

一開始由於女朋友生日快到了,在網路上看到許多手做扭蛋機、什麼存錢筒之類的,就想說要做一個獨一無二的生日禮物,因為做過一台巧克力3D印表機,因此對於結構設計的部分不太擔心,但是程式的部分就是完全沒有接觸過,因此花了不少的時間在學習Arduino程式上面,在製作的過程中,也遭遇了許多的失敗與挫折,但最終還是成功地完成了這個特別的生日禮物。


以Arduino控制3顆360度伺服馬達控制爪子在空間中的絕對位置,並搭配1顆180度伺服馬達控制爪子,各方向以光學限位開關避免撞邊,整體設計要求外觀簡單、控制可靠度、維修模組化。

製作流程

主要分為以下7個階段
一、整體規劃與設計(2周)
二、材料購買(2周)
三、程式撰寫(2周)
四、電路測試(3天)
五、機體製作與3D列印(3周)
六、整體測試與參數修改(1周)
七、完成

第一階段,整體規劃與設計
1.整體外觀,先構想整台機器的大小以及規格,要考量到最大移動空間,以及零組件最少占用體積。
2.選定骨架使用6061鋁合金,市面上最常用的鋁型材,強度夠、重量輕。
3.底板與前面板,使用PP瓦楞板,容易取得、價格尚可,顏色較為美觀且切割與製作方便。
4.電子零件
4-1.X(左右)、Y(前後)、Z(上下)馬達,選用360度伺服馬達,控制上較步進馬達簡單,體積較小,扭力超高(1CM/19KG),價格稍高。
4-2.抓子馬達,使用180度伺服馬達,可精準控制轉動角度,用以控制爪臂。
4-3.光學限位開關,X、Y使用光學限位開關,避免使用者移動過度,導致撞邊,使用光學開關而非機械式主要因為是非直接觸碰式開關,有較大的緩衝範圍。
4-4.按鈕,他就是按鈕。
4-5.投幣孔感應,一樣以光學限位開關作為感應,錢幣通過可感應。
4-6.Arduino uno 開發版,方便使用。
4-7.麵包版,電路接線。
4-8.USB電源供應器,考量使用方便,且電壓穩定,易於替換,因此使用2A雙孔USB變壓整流器(就是手機充電器)
4-9.USB電源、傳輸線,由於伺服馬達遇到阻力時,堵轉電流會到1.8A以上,因此一般USB傳輸線是不可使用的,因此選用3A電源傳輸線。
5.外殼,壓克力或是聚碳酸酯,這兩種材質一直很難抉擇,壓克力強度較低、較容易加工,聚碳酸酯(防彈玻璃)價格較高,強度超強、耐衝擊,不易加工(需要用電鋸)。最後選擇壓克力。
6.外殼水轉印,壓克力外殼,使用水轉印技術,在壓克力上轉印出圖案。
7.塑膠零組件,全部自行繪圖與3D列印
8.鋁型材用滑輪,露天拍賣

第二階段,材料購買

1.鋁型材、3向連接器,露天拍賣
2.電子零件,ICSHOP購買
3.壓克力,附近五金行,和老闆騎車雙載拿著一片2mm厚90CM*180CM的壓克力,超級慢、慢慢騎 騎回家的,差點被風吹斷
4.3D列印機、3D列印PLA線材,露天拍賣3DPW購買
5.特殊工業泡棉膠,大賣場
6.防撞條,大賣場
7.彈簧,五金行
8.銅箔、電線,附近電子材料行
9.USB電源,附近賣場
所有零件還有工具
舊的印表機突然壞掉,新買的3D印表機
冒著生命危險拿回家的壓克力板
要生出這麼大的紙板也是蠻難的...

以下為購買清單

第三階段,程式撰寫
程式在撰寫過程中,幾乎全部使用函式的方式撰寫,避免過於攏長且更改參數較容易。
設計概念
首先需要投錢後才可運行,因此程式碼在最外圈以一個if判別式來判斷是否已經投錢,接著進入待控制模式,等待使用者控制搖桿,同時馬達(servo.X/Y/Z)做出相對的運動,同時前後左右4顆限位開關皆在作用,保護機體避免撞邊,在移動的函式(MOVE)中,同時判斷限位開關LOW&&搖桿HIGH才進行移動,任一條件不符合,則無法移動,使用者要抓取時,按下抓取鈕,程式從移動的函式(MOVE)中跳出,進行抓取的函式(catch)先降下6秒後,delay一秒,後爪子的伺服馬達(servo.c)轉動50度,接著delay二秒後升起,最上面Z軸機械式限位開關,停止上升,接著自動歸零至起始點(以左側及前面的限位開關判斷),爪子鬆開(角度設定為0度),程式結束,等待下次投錢。
以下程式碼



#include < 
Servo.h> 
Servo X; 
Servo Y; 
Servo Z; 
Servo C; 
int w; 
int e; 
int n; 
int s; 
int start; 
int cat; 
int ws; 
int es; 
int ns; 
int ss; 
int zs; 
int cats; 
void setup() {pinMode(A0, INPUT); 
pinMode(A1, INPUT); 
pinMode(A2, INPUT); 
pinMode(A3, INPUT); 
pinMode(A4, INPUT); 
pinMode(A5, INPUT); 
pinMode(2, INPUT); 
pinMode(4, INPUT); 
pinMode(7, INPUT); 
pinMode(8, INPUT); 
pinMode(12,INPUT); 
X.attach(5); 
Y.attach(6); 
Z.attach(9); 
C.attach(10); 
Serial.begin(115200); 
Serial.println("Hello World!"); 
Xs(); 
Ys(); 
C.write(0); 
}void Xw(){X.write(0); 
}void Xe(){X.write(180); 
}void Xs(){X.write(93); 
}void Yn(){Y.write(0); 
}void Yss(){Y.write(180); 
}void Ys(){Y.write(92.7); 
}void Zd(){Z.write(180); 
}void Zu(){zs = digitalRead(A5); 
if(zs==LOW)Z.write(0); 
elseZ.write(93); 
}void Zs(){Z.write(93); 
}void mov(){if(w==HIGH& 
& 
ws==LOW){Xw(); 
}else if(e==HIGH& 
& 
es==LOW){Xe(); 
}else if(n==HIGH& 
& 
ns==LOW){Yn(); 
}else if(s==HIGH& 
& 
ss==LOW){Yss(); 
}else{Xs(); 
Ys(); 
}}void catahz(){if(zs==LOW){Zu(); 
Serial.println("Zu"); 
}}void catah(){Serial.println("zd"); 
Zd(); 
delay(1000*5.5); 
Serial.println("Zs"); 
Zs(); 
Serial.println("close"); 
delay(1000); 
C.write(40); 
delay(1000*1.2); 
while(1){zs = digitalRead(A5); 
catahz(); 
if(zs==HIGH){Serial.println("Zs"); 
Zs(); 
break; 
}}}void gohome(){readsi(); 
if(es==LOW)Xe(); 
else if(es==HIGH)Xs(); 
if(ss==LOW)Yss(); 
else if(ss==HIGH)Ys(); 
}void readsi(){w = digitalRead(2); 
e = digitalRead(4); 
n = digitalRead(7); 
s = digitalRead(8); 
start = digitalRead(A0); 
cat = digitalRead(12); 
ws = digitalRead(A2); 
es = digitalRead(A1); 
ss = digitalRead(A3); 
ns = digitalRead(A4); 
zs = digitalRead(A5); 
}void input(){Serial.println("A0"); 
Serial.println(A0); 
Serial.println("A1"); 
Serial.println(A1); 
Serial.println("A2"); 
Serial.println(A2); 
Serial.println("A3"); 
Serial.println(A3); 
Serial.println("A4"); 
Serial.println(A4); 
Serial.println("A5"); 
Serial.println(A5); 
Serial.println("2"); 
Serial.println(2); 
Serial.println("3"); 
Serial.println(3); 
Serial.println("4"); 
Serial.println(4); 
Serial.println("5"); 
Serial.println(5); 
Serial.println("6"); 
Serial.println(6); 
Serial.println("7"); 
Serial.println(7); 
Serial.println("8"); 
Serial.println(8); 
Serial.println("9"); 
Serial.println(9); 
Serial.println("10"); 
Serial.println(10); 
Serial.println("11"); 
Serial.println(11); 
Serial.println("12"); 
Serial.println(12); 
}void loop(){readsi(); 
if(start==HIGH){readsi(); 
input(); 
while(1){readsi(); 
mov(); 
Serial.println("move"); 
if(cat==HIGH){break; 
}}Serial.println("catch"); 
delay(1000); 
catah(); 
while(1){Serial.println("gohome"); 
if(es==HIGH& 
& 
ss==HIGH){Serial.println("end"); 
delay(1200); 
C.write(0); 
goto endd; 
}elsegohome(); 
}endd:Serial.println("end"); 
delay(1000); 
}}















第四階段,電路測試
在裝上整體結構前,先將整體電路接好、測試,避免裝機後修改不便,並驗證程式使否有誤,確認完成後再進行下一步驟。

第五階段,機體製作與3D列印

機體設計上,因為要求最大移動空間且最小體積,同時4周不可突出,因為要黏合壓克力板,因此設計上較為複雜

以下所有3D列印的檔案
都是自行研發測試修改後的最終檔案
投幣孔

用光遮斷感應器來判斷有沒有錢通過,高度剛好是10元大小,因此1、5、50元都是不行用的

Z軸感應器
讓機器知道爪頭已經到達定位,才不會把線扯斷

限位開關
限位開關
就是這根薄薄的東西
用光遮斷感應器來Y軸馬達座


Y軸滑塊*2


X軸同步輪


Y軸同步輪


零錢盒
可以卡住,拿起來的時候也方便的卡榫

爪子
蠻複雜的,想了非常久,要如何用馬達來控制爪頭的開合,光是爪子就總共有20幾個零件



搖桿
要怎麼做才能把前後左右的訊號傳給電路板,這也想了很久

印出來組裝後的樣子
黏上銅箔
裡面也要
裝上電線,這樣只要碰到任一點,那條線就會短路,判斷為HIGH
搖桿拔起來的樣子

X軸吊車(前)
前後分離,易於維修與組裝
他的上面
皮帶移動用

前後分開的

X軸馬達固定

X軸吊車(後)

組裝到一半的時候
爪子的線超級長(2.6公尺)
非常多又很亂的線
避免鬆脫,全部都先焊接後再熱收縮套保護
終於都在麵包版上弄好了
黏在機器底層的位置

待續..貌似圖片太多不能上傳了

預告:水轉印、最終測試與包裝

第六階段,整體測試與參數修改

第七階段,完成,包裝

簽名檔-宜大 火哥

沒有留言:

張貼留言