熱門(mén)資訊
項(xiàng)目分類(lèi)
貓糧自動(dòng)分配器
來(lái)源:3XMaker 發(fā)布時(shí)間:2018年08月24日貓糧自動(dòng)分配器
它通過(guò)提供每日貓食量,在預(yù)設(shè)時(shí)間自動(dòng)為寵物提供食物。
養(yǎng)寵物需要承擔(dān)很大的責(zé)任,首先是給他們食物;不幸的是,繁忙的生活方式和強(qiáng)制的工作時(shí)間并不能滿(mǎn)足我們四腳朋友的需要,而且任何靠自己生活的人都很難按時(shí)提供寵物餐。為了解決任何寵物主人,特別是貓和狗主人都非常重視的問(wèn)題,我們?cè)O(shè)計(jì)了一種稱(chēng)為Felixmatic的設(shè)備:它是一種實(shí)用的自動(dòng)干食分配器,為貓(或小狗)配備了一個(gè)大容量容器,可以很容易地從頂部打開(kāi),當(dāng)它是一個(gè)碗收集kibble時(shí),它是PPLIDE。我們知道我們已經(jīng)可以在市場(chǎng)上找到自動(dòng)售貨機(jī),但是,我們的例子是獨(dú)特的,因?yàn)樗梢跃幊虨槊刻?餐,以提供非常精確的數(shù)量的干糧。
項(xiàng)目
分配器的工作方式比市場(chǎng)上的普通產(chǎn)品更為復(fù)雜和完整,事實(shí)上,它不僅提供食物,而且還提供我們確定的確切劑量;基本上,在預(yù)先設(shè)定的時(shí)間,容器底部的耳蝸會(huì)轉(zhuǎn)動(dòng),并在碗中滴下一定量的kibble,由專(zhuān)門(mén)的衛(wèi)士進(jìn)行調(diào)節(jié)。右側(cè)傳感器。
為了實(shí)現(xiàn)這一功能,我們的點(diǎn)膠機(jī)由一個(gè)機(jī)械部分和一個(gè)電子部分組成;前者由PLA、3-D打印部件組裝而成,而電子部分由一個(gè)Arduino UNO板組成,我們?cè)谠摪迳蠎?yīng)用了一個(gè)RTC屏蔽,一個(gè)帶LCD顯示屏的特定屏蔽,一個(gè)連續(xù)旋轉(zhuǎn)的模型。伺服和稱(chēng)重傳感器;后者用于稱(chēng)重干燥食物的量,一旦達(dá)到所需的量,伺服操作耳蝸停止。LCD顯示器通過(guò)Arduino板的插腳8、3、5、6、7進(jìn)行管理;相反,稱(chēng)重傳感器通過(guò)A0插腳進(jìn)行讀取,它本身提供模擬信號(hào)。為了設(shè)計(jì)簡(jiǎn)單,我們決定使用專(zhuān)門(mén)用于測(cè)量和重量顯示的屏蔽,如圖所示與Arduino UNO Rev.3接口,并連接到稱(chēng)重傳感器。這個(gè)被稱(chēng)為重量防護(hù)罩的防護(hù)罩安裝了一個(gè)8個(gè)字符的2行液晶顯示屏,在我們的項(xiàng)目中,它被用來(lái)安裝機(jī)器。除顯示器外,我們還集成了INA125,一種專(zhuān)門(mén)為測(cè)量?jī)x器(如天平)開(kāi)發(fā)的高精度放大器。我們將在這個(gè)屏蔽上焊接鍵連接,這將遵循這些頁(yè)面上提出的接線(xiàn)圖(圖1),顯示與稱(chēng)重傳感器的連接(我們已經(jīng)為這些連接提供了一個(gè)接線(xiàn)板)。
如你所見(jiàn),五個(gè)常開(kāi)的鍵必須連接到公共接地,電阻的刻度,因?yàn)槲覀儗⑹褂肁/D轉(zhuǎn)換器讀取它們以保存Arduino的線(xiàn)路;基本上,由Arduino的5 V供電的多個(gè)分頻器在A2模擬線(xiàn)路上輸出8 V,。
0V for P1;
1,7V for P2;
2,53V for P3;
2,92 for P4;
3,26V for P5.
圖 1
稱(chēng)重傳感器的重量可達(dá)1.000克,其主體由鋁合金制成;輸出靈敏度為1 mV/V(±0.15 mV),非線(xiàn)性(滿(mǎn)刻度)為0.05%;滿(mǎn)刻度滯后為0.05%。在10°C的滿(mǎn)刻度下,由于熱推導(dǎo)產(chǎn)生的誤差為0.05%。電池的輸入電阻為1千歐(±10歐姆),與輸出電阻相同。絕緣電阻為2.000 mohm,工作溫度范圍為-10°C至+55°C。為了連接稱(chēng)重傳感器,有四根電線(xiàn):
rad為正(5伏);
黑色為負(fù)(GND);
綠色是OUT +;
白色是OUT–。
四根電線(xiàn)必須延伸到重量護(hù)罩右側(cè)的接線(xiàn)板上。
固件
#include <LiquidCrystal.h>來(lái)管理LCD 8×2監(jiān)視器
#include <EEPROM.h>在eeprom中寫(xiě)入一些值
#include <Wire.h>與RTC的接口
#include <DS1307RTC.h>管理rtc
#include <TimeLib.h>方便管理已用時(shí)間
讓我們來(lái)看一下代碼中的主要變量和函數(shù),這樣您就可以輕松地為其他目的定制項(xiàng)目。
為了管理稱(chēng)重傳感器檢測(cè)到的值,我們包括5個(gè)變量,其中4個(gè)變量用于校準(zhǔn)稱(chēng)重傳感器本身:
loadA 凈重量(皮重,單位:克);
AnalogvalA 稱(chēng)重傳感器讀取的與load相關(guān)的克數(shù)相對(duì)應(yīng)的類(lèi)似物的重量;
loadB任何載荷的重量(單位:g);
AnalogvalB稱(chēng)重傳感器讀取的與克數(shù)相對(duì)應(yīng)且與loadB相關(guān)的模擬值重量;
第五個(gè)變量是模擬值average,它將包含使用稱(chēng)重傳感器測(cè)量的有效重量的結(jié)果,即凈重,對(duì)應(yīng)發(fā)行的kibble克數(shù)。注意,loada是用來(lái)計(jì)算皮重的,這使得分配器可以將kibble的設(shè)定重量減去皮重,放到碗中。
在固件中,還有兩個(gè)數(shù)據(jù)陣列:
MealHour[10]
MealMinute[10]
如你所見(jiàn),這些陣列包含食物的分配時(shí)間,并將在每次打開(kāi)分配器時(shí)進(jìn)行計(jì)算。在此階段中,草圖將初始化串行端口(通過(guò)該端口,您可以使用PC監(jiān)視程序調(diào)試)和LCD。之后,它將調(diào)用函數(shù) ResetMeals() and Initialize().
reset meals()函數(shù)重置與進(jìn)餐分配相關(guān)的存儲(chǔ)單元:在EEPROM(其結(jié)構(gòu)如表1所示)中,通過(guò)設(shè)置一個(gè)標(biāo)志來(lái)設(shè)置有效進(jìn)餐分配,該標(biāo)志在每天00.00恢復(fù)為零,再次由reset meals()函數(shù)設(shè)置,因此允許重新開(kāi)始一天的進(jìn)餐周期。
函數(shù)initialize()調(diào)用其內(nèi)部的其他函數(shù):
reset()
load()
sort()
函數(shù)reset()允許重置數(shù)組mealhour[]和mealminute[],以確保這些變量沒(méi)有錯(cuò)誤的值。
load()例程負(fù)責(zé)從eeprom中獲取值,并將其復(fù)制到作為參數(shù)傳遞的數(shù)組中。
最后,sort()函數(shù)負(fù)責(zé)使用算法(冒泡排序)對(duì)數(shù)組進(jìn)行排序,當(dāng)我們希望確保進(jìn)餐時(shí)間由分配器自動(dòng)管理時(shí),它非常有用,即使它們是隨機(jī)存儲(chǔ)的,而不是以增加的方式存儲(chǔ)的,因此確保您的寵物在正確的時(shí)間吃飯。
分配器工作核心的最后一個(gè)功能稱(chēng)為supply():它是一個(gè)功能,當(dāng)調(diào)用時(shí),根據(jù)稱(chēng)重傳感器檢測(cè)到的重量來(lái)管理伺服;換句話(huà)說(shuō),例程命令伺服向上旋轉(zhuǎn),直到稱(chēng)重傳感器向Arduino提供與DoS對(duì)應(yīng)的重量相等的讀數(shù)。e待供應(yīng),然后停止伺服。此后,伺服旋轉(zhuǎn)輸出螺旋并停止它,這樣當(dāng)供給必須停止時(shí),它就像一個(gè)分隔器阻止了kibble。
在這個(gè)例行程序中,還有一個(gè)函數(shù)unjam()用于取消供應(yīng)機(jī)構(gòu)的平衡,以防某些kibble卡在節(jié)流孔中并阻止其旋轉(zhuǎn);通過(guò)使節(jié)流孔在一個(gè)方向旋轉(zhuǎn)五次,在另一個(gè)方向旋轉(zhuǎn)五次來(lái)嘗試解鎖。如果操作完成后,食物仍有庫(kù)存,系統(tǒng)將在LCD上顯示錯(cuò)誤消息;如果食物用完,也會(huì)發(fā)生同樣的情況,并且LCD上會(huì)顯示另一個(gè)錯(cuò)誤消息。由于kibble用完或供給機(jī)構(gòu)卡住而導(dǎo)致的供給缺失都以同樣的方式檢測(cè)到:在發(fā)送分配命令后的幾分鐘內(nèi)沒(méi)有凈重。
用戶(hù)界面
現(xiàn)在,讓我們來(lái)看看用戶(hù)界面,它由五個(gè)鍵和安裝在重量保護(hù)板上的顯示器組成,鍵的功能如下:
P1(向下按鈕):用于向下滾動(dòng)菜單;
P2(OK按鈕):用于確認(rèn)選項(xiàng);
P3(減少按鈕):用于減少用餐次數(shù);
P4(減少按鈕)用于增加用餐次數(shù);
P5(分配按鈕);只能在初始屏幕中使用(圖2),此鍵用于手動(dòng)分配kibble,無(wú)論何時(shí)我們想要添加超過(guò)預(yù)設(shè)劑量的食物,或隨時(shí)供應(yīng)食物。
啟動(dòng)系統(tǒng)后,您將看到主屏幕(圖2),第一行顯示當(dāng)前時(shí)間(如果顯示00:00:00,則必須配置時(shí)間;我們將在下面看到如何操作);第二行顯示單詞push,箭頭朝下:表示我們將繼續(xù)配置分配器的功能字符。特性。當(dāng)我們看到這個(gè)屏幕時(shí),我們可以按P5手動(dòng)分配kibble,并決定劑量。
現(xiàn)在,您將看到菜單有兩個(gè)選項(xiàng):膳食和克(圖3)。如果按兩次鍵,返回命令(圖4)將帶您返回主屏幕。
使用鍵選擇“Feeds”(膳食)選項(xiàng),將打開(kāi)一個(gè)菜單(圖5),您可以在其中選擇要為您的貓?zhí)峁┑纳攀硵?shù)量,最多每天9頓。
要選擇用餐數(shù)量,請(qǐng)使用指針停留在第一行,然后按下減少鍵(P3)以減少用餐數(shù)量。您可以按“增加”鍵(之前),這將增加一天的用餐次數(shù)。按OK確認(rèn)(P2)。要返回主屏幕,請(qǐng)單擊“上一步”保留以前的設(shè)置。按下OK(p2)后,您將返回上一個(gè)子菜單;這用于設(shè)置進(jìn)餐時(shí)間(圖6)。選擇餐數(shù)后,我們可以繼續(xù)并指示分發(fā)kibble的時(shí)間和分鐘數(shù)。例如,如果我們一天選擇三頓飯,圖6中的屏幕將顯示三次,每頓飯一次;對(duì)于每個(gè)屏幕,我們必須指示分發(fā)食物所需的時(shí)間。
綜上所述,為了在分配器上設(shè)置顯示時(shí)鐘,放置在按鍵上,您必須將指針?lè)旁诘谝恍校缓竽梢园础霸黾踊驕p少”鍵來(lái)增加或減少與時(shí)間相對(duì)應(yīng)的數(shù)字,直到您想要的時(shí)間為止。要修改分鐘數(shù),請(qǐng)按“確定”,然后再次按“減少”或“增加”以使用相同的步驟選擇分鐘數(shù)。選擇小時(shí)和分鐘后,按向下移動(dòng)第二行上的指針,然后按OK確認(rèn)并保存確切時(shí)間。完成時(shí)間設(shè)置后,可以返回圖2所示的主屏幕。要設(shè)置每頓飯的克數(shù),請(qǐng)按向下鍵;這樣您就可以進(jìn)入主菜單。再向下按一次,將指針移到克數(shù)的第二行(圖7),然后按OK。打開(kāi)子菜單(圖8)設(shè)置每頓飯的克數(shù)后,可以按“增加”或“減少”來(lái)調(diào)整體重。
一旦你決定了每餐食物的重量(即克數(shù)),如圖9所示,移動(dòng)第二行的指針,按OK保存設(shè)置。如果您不想確認(rèn)新的設(shè)置,請(qǐng)使用指針向下滾動(dòng),直到回到上一步,然后按OK返回上一個(gè)菜單(圖9)。
機(jī)械結(jié)構(gòu)
既然我們已經(jīng)解釋了系統(tǒng)的工作原理,我們就可以進(jìn)入組裝階段:電子部分放在基座上,三維打印作為機(jī)械結(jié)構(gòu)的其余部分。在底座中,我們將Arduino、護(hù)罩和鑰匙放置在專(zhuān)用隔間的右側(cè),如圖1所示進(jìn)行連接,并將其安裝在蓋子上,使用小的自螺紋2.5×10 mm金屬螺釘固定;蓋子上印有五個(gè)鑰匙的孔和顯示器的窗口。仍然在底座內(nèi)部,在實(shí)際分配器下方的部分,您將使用兩個(gè)螺釘將大理石板固定到稱(chēng)重傳感器上,然后必須將哪個(gè)傳感器應(yīng)用到底座上;在移動(dòng)板上,您將放置收集Kibble的碗。
后者是3-D打印,但你也可以自己使用,前提是它的底座比放置在稱(chēng)重傳感器上的移動(dòng)板小(直徑),并且它足夠短以避免接觸結(jié)構(gòu)的其余部分。事實(shí)上,重量并不重要,正如本文開(kāi)頭所解釋的,固件計(jì)算皮重,然后將皮重減去將kibble放入碗中時(shí)檢測(cè)到的重量。圖10所示為塊,圖11所示為結(jié)構(gòu)的分解圖,圖12所示為機(jī)構(gòu)的內(nèi)部視圖,尤其是關(guān)于基于伺服機(jī)構(gòu)作用的螺旋元件的Kibble分配機(jī)構(gòu)的內(nèi)部視圖。
請(qǐng)注意,通過(guò)一個(gè)3D打印圓適配器,用兩個(gè)螺釘將固定碗的移動(dòng)板應(yīng)用到稱(chēng)重傳感器臂上。列表1顯示允許設(shè)置供應(yīng)時(shí)間的固件部分。在那一方面,清單2顯示了管理Kibble分配的固件部分:它是用于供應(yīng)食物的功能。
List1
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 | void SetOra(int i) { char bottone[8]; int posCursor=0, opcMenu=-2; int Ore=0,Minuti=0; int flag=0; int NO=1,NM=10; lcd.clear(); lcd.setCursor(2,0); stampa(Ore); lcd.setCursor(4,0); lcd.print(“:”); lcd.setCursor(5,0); stampa(Minuti); lcd.setCursor(2,1); lcd.print(“ok”); do{ strcpy(bottone,”null”); LeggiBottone( bottone, A2, 200); lcd.setCursor(0, posCursor); lcd.write(byte(0)); if(!strcmp(bottone,”giu”)) MuoviCursore(&posCursor, 1, ‘m’); else if(!strcmp(bottone,”ok”)||!strcmp(bottone,”incr”)||!strcmp(bottone,”decr”))
opcMenu = posCursor; switch( opcMenu ) { case 0: if(!strcmp(bottone,”incr”)) { if(flag==0){ Ore=Ore+1; if(Ore>= 25) Ore--; lcd.setCursor(2, 0); stampa(Ore); } else{ Minuti=Minuti+1; if(Minuti >= 60) Minuti--; lcd.setCursor(5, 0); stampa(Minuti); } } else if( !strcmp(bottone,”decr”) ) { if(flag==0){ Ore=Ore-1; if (Ore <= 0) Ore++; lcd.setCursor(2, 0); stampa(Ore); } else{ Minuti=Minuti-1; if(Minuti <= 0 ) Minuti++; lcd.setCursor(5, 0); stampa(Minuti); } } else if(!strcmp(bottone,”ok”)) { if(flag==0) flag=1; else flag=0; } opcMenu = -2; break; case 1: if(!strcmp(bottone,”ok”)){ EEPROM.update(NO+i,Ore); EEPROM.update(NM+i,Minuti); opcMenu = -1; } break; }; }while(opcMenu != -1); mem=1; } |
如您所見(jiàn),計(jì)數(shù)器變量檢查嘗試丟棄食物的次數(shù);如果達(dá)到5,它將提供錯(cuò)誤消息,因?yàn)檫@意味著機(jī)制有問(wèn)題或容器為空。
List2
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 | void eroga(){ float load; int analogValue; float flag=0; contatore=0; int val = word(EEPROM.read(19), EEPROM.read(30)); do { analogValue = analogRead(A1); analogValueAverage = 0.99*analogValueAverage + 0.01*analogValue; unsigned long currentMillis = millis(); if(currentMillis - previousMillis2 > interval2){ previousMillis2 = currentMillis; load = analogToLoad(analogValueAverage); if(currentMillis - previousMillis5 > interval5){ previousMillis5 = currentMillis; Serial.println(“copio flag”); flag=load; } if(currentMillis - previousMillis4 > interval4){ previousMillis4 = currentMillis; Serial.println(“controllo se blocca”); if(load<=flag+1 && load>=flag-1) sblocca(); if(contatore>=5){ servo.detach(); lcd.clear(); lcd.setCursor(1,0); lcd.print(“ERRORE”); lcd.setCursor(0,1); lcd.print(“!!!!!!!!”); while(1){} } } servo.attach(9); servo.write(0); } }while(load <= val); servo.detach(); } |
在這兩種情況下,您都需要照顧它,因?yàn)闄C(jī)器不提供食物,而且……您的寵物的肚子會(huì)隆隆作響!!
結(jié)論
對(duì)于任何寵物主人來(lái)說(shuō),我們的自動(dòng)售貨機(jī)都是一個(gè)有用的好主意,尤其是整個(gè)系統(tǒng)都是基于現(xiàn)有的Arduino,這使得一切變得簡(jiǎn)單。我們建議的機(jī)制不具有約束力,因?yàn)槿魏螕碛?-D打印機(jī)的人都可以根據(jù)需要采用商用分配器。
然而,該系統(tǒng)可以適應(yīng)其他用途,而不是嚴(yán)格地指給寵物喂食:它可以用來(lái)供應(yīng)各種物質(zhì),也可以……通過(guò)提供少量的糖和煙來(lái)避免一些不良習(xí)慣,例如過(guò)度消費(fèi)糖和煙……
總之,它是一個(gè)定時(shí)分配器,可以很容易地定制,這里看到用于供應(yīng)食物,但也能夠管理許多其他事情。

南京合越智能,增強(qiáng)智造,增強(qiáng)感知,增強(qiáng)交互!
業(yè)務(wù)合作
(我們會(huì)第一時(shí)間與您聯(lián)系)網(wǎng)站導(dǎo)航
聯(lián)系方式
- 微信:13815863530(手機(jī)同號(hào))
- QQ:38260484
- 3XMaker@163.com