前言: 老實說一開始選擇教授時,並沒有想太多,只想找涼的教授,我記得當時的考量是 「對我們學校來說還是考研趕快換學校重要」因此沒有挑戰硬一點的主題/教授 XD。所以最後我找了全系最涼的教授,專題主題每年都只定Arduino(原因應該是省錢又省時,也不太需要教),6個專題生分成3組,每組2人。
「Arduino + APP 遠端遙控」 ,其他主題包裝自己想。 既然技術簡單、架構清楚,看來要比的是創意和想法了~~~。在某一天的午後,我和組員要去買飲料,突然靈機一動,要是市面上手搖杯和飲料都能自動調配和無線操控,應該蠻不錯的喔!!! 因此我們的專題 「Smart Drinks 智慧飲料機」誕生了。
概念 我們將想達成的目標簡單分成幾個 part,來一一解決 APP + Wifi連接 + 移動飲料的方法 + 飲料機身 由於移動、調配飲料的方法是關鍵,會影響到整題機身設計 所以我們先設計調飲料方法(怎麼做,怎麼設計)。
取料、調配方法: 我們打算透過一個容器來裝載飲料原料,讓容器底部開孔,而底部之下黏一個紙板,紙板也開孔,但容器孔和紙板孔先不對齊,由servo motor來控制旋轉角度,進而使紙板孔和容器孔對齊,內容物則會自然落下。
所以這種取料方式,容器必須有一定高度,因此機身設計必須考慮這點。那可想而知,飲料杯必須在底部移動,進行取料,最後還要加水。
移動方式: 設計 X、Y軸滑台(類似夾娃娃機上方的移動橫桿),來讓飲料杯進行前後,左右的移動。 在大致規劃好要怎麼取料移動後,著手進行機身的設計
機身設計: 透過便宜又環保的松木層板來進行裁切和組裝
由於沒有過木工經驗,耗費許久時間在木工上(木工已加入工具人skill set內)XD。 接著實作上方的取料罐和伺服馬達:
取料罐:隨便一個罐子(有蓋),將底部開洞,紅色蓋子處也開洞(洞口可自行設計形狀)
接著將紙板或珍珠板開略大於紅色蓋子孔的扇形洞,並透過小螺絲穿過紙板和容器板(以方便轉動)
為了防止servo motor轉動時容器跟著轉動,用熱溶膠固定鐵絲和取料罐在層板上
這樣取料罐架構基本上就完成了,接著就重複3次,因為我們設了3個取料罐 開始實作最麻煩的X、Y軸滑台: 材料:步進馬達 x 2、螺旋軸 x 2(或直接去網購 絲軸)、軸承座 x 4、束帶、培林 x2、鐵桿 x 2 裁好合適的木頭並鑽孔放入鐵桿和 螺旋軸+ 步進馬達(*放入螺旋軸前須放入培林,避免螺旋軸轉動時將木板轉出來),最後放入軸承座來乘載X軸,x軸做法同上。
VIDEO
我們碰到最大的問題是:X軸太重,難以支撐,因此整個軸承座會卡住,南以轉動,後臨時透過小型玩具車來支撐解決這個問題
這樣飲料機身部分也完成了!!
硬體接線部分:
所用元件:
1 2 3 4 5 6 7 8 9 - NodeMCU - Arduino Mega板 - L298N x 2 - 4-channel relay - 1-channel relay - servo x4 - stepper motor x2 - 沉水馬達 x2 - power supply(可改用多個電池盒)
想法:透過NodMCU接收指令來操控4個繼電器開關,每個繼電器又分別接到Arduino板電源,每個Arduino板對應一種飲料,預先燒好的code在Arduino內,電源開啟時則會自動執行取料和飲料調配程式。
ps. 上圖有只有實作一個Arduino板 ps.每個Arduino板必須在連到一個控制沉水馬達的繼電器上
水管的位置會是飲料放置的起始點和終點(取原料回原位加水)
NodeMCU 接線:
1 2 3 4 5 - 4路繼電器 - 分別接到4個Arduino電源孔 - 4個Arduino 板分別將L298N 控制接腳接出來,分別控制滑台XY軸 - 4個Arduino 其他pin 腳接出來控制4個 servo motor - 4個Arduino 某pin腳出來 接出來到沉水馬達訊號線。
注意電壓分配
Arduino程式部分:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 Arduino程式部分: #include <Stepper.h> #include <Servo.h> #define STEPS 200 #define WATER 24 Stepper Y (STEPS, 8 , 9 , 10 , 11 ) ; Stepper X (STEPS, 4 , 5 , 6 , 7 ) ; Servo goal; int pos;void setup () { goal.attach(12 ); goal.write(0 ); X.setSpeed(160 ); Y.setSpeed(160 ); pinMode(WATER,OUTPUT); } void loop () { delay(500 ); X.step(-24000 ); delay(1000 ); for (pos = 0 ; pos <= 120 ; pos += 1 ) { goal.write(pos); delay(15 ); } for (pos = 120 ; pos >= 0 ; pos -= 1 ) { goal.write(pos); delay(15 ); } delay(1000 ); X.step(22000 ); delay(1000 ); digitalWrite(WATER, HIGH); delay(5000 ); digitalWrite(WATER, LOW); delay(5000 ); }
如果想要取後排的飲料,就必須,先移動Y軸到後排再移動X軸到定點,接著servo motor轉動取料,再移動X軸至原位,Y軸移至起始位置加水,最後啟動抽水馬達則完畢。
程式必須根據容器擺放位置,和原料出料時間,抽水量多寡來調整delay時間,且前排不需要移動Y軸。
NodeMCU 程式碼:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 #define RELAY1 D7 #define RELAY2 D8 #define RELAY3 D5 #include <ESP8266WiFi.h> #include <WiFiClient.h> #include <ESP8266WebServer.h> String command; const char * ssid = "專題" ;ESP8266WebServer server (80 ) ; int counter = 0 ;void setup () {pinMode(RELAY1, OUTPUT); pinMode(RELAY2, OUTPUT); pinMode(RELAY3, OUTPUT); Serial.begin(115200 ); WiFi.mode(WIFI_AP); WiFi.softAP(ssid); IPAddress myIP = WiFi.softAPIP(); Serial.print("AP IP address: " ); Serial.println(myIP); server.on ( "/" , HTTP_handleRoot ); server.onNotFound ( HTTP_handleRoot ); server.begin(); } void relay1 () { delay(1000 ); digitalWrite(RELAY1,HIGH); delay(180000 ); digitalWrite(RELAY1,LOW); delay(5000 ); } void relay2 () { delay(1000 ); digitalWrite(RELAY2,HIGH); delay(180000 ); digitalWrite(RELAY2,LOW); delay(5000 ); } void relay3 () { delay(1000 ); digitalWrite(RELAY3,HIGH); delay(145000 ); digitalWrite(RELAY3,LOW); delay(5000 ); } void loop () { server.handleClient(); command = server.arg("State" ); if (command == "L" ) { relay1(); } else if (command == "R" ) { relay2(); } else if (command == "I" ){ relay3(); } else if (command == "F" ){ counter ++; Serial.println(counter); } } void HTTP_handleRoot (void ) {if ( server.hasArg("State" ) ){ Serial.println(server.arg("State" )); } server.send ( 200 , "text/html" , "" ); delay(1 ); }
手機端
當時不會寫手機App :(,因此用簡單的MIT AppInventor 來製作
實際操作
容器填料
裝水容器加水
power supply on
手機連到Wifi AP
開啟 APP選擇想喝的飲料
等待機器完成
整體圖
還有LED跑馬燈
結語 此專題有很多可以改進的地方,不論是器材的選購以及馬達的穩定度 雖然Arduino真的很簡單,但只要點子夠多還是發展無窮。
未來發展
上方原料罐可設計成可拆卸式
可以設計攪拌模組(直流馬達配冰棒棍之類的XD)
防水設計
APP 改用 Android Studio 設計,比較多彈性
直接選購結合 ESP8266和繼電器的模組(後來才知道有這東西)
語音辨識,不用APP
加熱器:可同時冷、熱水沖泡