一開始由於女朋友生日快到了,在網路上看到許多手做扭蛋機、什麼存錢筒之類的,就想說要做一個獨一無二的生日禮物,因為做過一台巧克力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公尺)

非常多又很亂的線

避免鬆脫,全部都先焊接後再熱收縮套保護

終於都在麵包版上弄好了

黏在機器底層的位置

待續..貌似圖片太多不能上傳了
預告:水轉印、最終測試與包裝
第六階段,整體測試與參數修改
第七階段,完成,包裝
沒有留言:
張貼留言