更#手做#詳細教學#夾娃娃機#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電源,附近賣場 所有零件還有工具
megapx
舊的印表機突然壞掉,新買的3D印表機
megapx
冒著生命危險拿回家的壓克力板
megapx
要生出這麼大的紙板也是蠻難的...
megapx
以下為購買清單
megapx
第三階段,程式撰寫 程式在撰寫過程中,幾乎全部使用函式的方式撰寫,避免過於攏長且更改參數較容易。 設計概念 首先需要投錢後才可運行,因此程式碼在最外圈以一個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); else Z.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; } else gohome(); } endd: Serial.println("end"); delay(1000); } } 第四階段,電路測試 在裝上整體結構前,先將整體電路接好、測試,避免裝機後修改不便,並驗證程式使否有誤,確認完成後再進行下一步驟。 第五階段,機體製作與3D列印 機體設計上,因為要求最大移動空間且最小體積,同時4周不可突出,因為要黏合壓克力板,因此設計上較為複雜 以下所有3D列印的檔案 都是自行研發測試修改後的最終檔案 投幣孔
megapx
megapx
用光遮斷感應器來判斷有沒有錢通過,高度剛好是10元大小,因此1、5、50元都是不行用的
megapx
Z軸感應器
megapx
讓機器知道爪頭已經到達定位,才不會把線扯斷
megapx
限位開關
megapx
限位開關
megapx
就是這根薄薄的東西
megapx
用光遮斷感應器來Y軸馬達座
megapx
megapx
Y軸滑塊*2
megapx
megapx
X軸同步輪
megapx
megapx
Y軸同步輪
megapx
megapx
零錢盒 可以卡住,拿起來的時候也方便的卡榫
megapx
爪子 蠻複雜的,想了非常久,要如何用馬達來控制爪頭的開合,光是爪子就總共有20幾個零件
megapx
megapx
megapx
搖桿 要怎麼做才能把前後左右的訊號傳給電路板,這也想了很久
megapx
印出來組裝後的樣子
megapx
黏上銅箔
megapx
裡面也要
megapx
裝上電線,這樣只要碰到任一點,那條線就會短路,判斷為HIGH
megapx
搖桿拔起來的樣子
megapx
X軸吊車(前)
megapx
前後分離,易於維修與組裝
megapx
他的上面
megapx
皮帶移動用
megapx
megapx
前後分開的
megapx
X軸馬達固定
megapx
megapx
X軸吊車(後)
megapx
組裝到一半的時候
megapx
爪子的線超級長(2.6公尺)
megapx
非常多又很亂的線
megapx
避免鬆脫,全部都先焊接後再熱收縮套保護
megapx
終於都在麵包版上弄好了
megapx
黏在機器底層的位置
megapx
待續..貌似圖片太多不能上傳了 預告:水轉印、最終測試與包裝 第六階段,整體測試與參數修改 第七階段,完成,包裝 簽名檔-宜大 火哥
愛心
1.1萬
529
全部留言