張振宇,侯奕辰,陳哲奕,汪 燁
(上海電機(jī)學(xué)院 機(jī)械學(xué)院,上海 201306)
豐年蝦是一種營養(yǎng)價值非常高的魚飼料,以魚飼料為目的的豐年蝦孵化需要用淡鹽水進(jìn)行,鹽度為10‰,最適宜的溫度在30℃左右,期間適當(dāng)?shù)慕o予光照,孵化時間大約為22 h[1]。最好在孵化時給予充足的氧氣,孵化完后需要立刻當(dāng)作飼料進(jìn)行喂食,否則營養(yǎng)價值會大大流失[2]。但目前市場上都只有單純的孵化設(shè)備,并且需要人工自己控制豐年蝦卵的投放量和鹽的投放量,無法做到自動喂養(yǎng),不夠自動化也不夠人性化。本文基于以上幾個問題進(jìn)行了豐年蝦卵自動孵化投食系統(tǒng)的設(shè)計(jì)。
結(jié)構(gòu)示意圖如圖1所示,豐年蝦卵儲存在裝置上部,步進(jìn)電機(jī)安裝在轉(zhuǎn)盤上,通過步進(jìn)電機(jī)的轉(zhuǎn)動可以使豐年蝦卵落入下方孵化倉內(nèi);舵機(jī)通過電機(jī)伸出軸來控制加鹽倉的開關(guān);排水口與投食口分別與不同的電磁夾緊閥相連。
圖1 結(jié)構(gòu)示意圖
STM32F429IGTx:32位MCU,最高主頻180 MHz,擁有2 M的閃存和256 K的SRAM[3]。
步進(jìn)電機(jī):二相四線制直流無刷步進(jìn)電機(jī),額定電壓為5 V,步距角1.8°,通過四拍方式控制步進(jìn)電機(jī)進(jìn)行特定角度的旋轉(zhuǎn),在本方案中以旋轉(zhuǎn)一周360°為單位。
舵機(jī):可控制角度的舵機(jī)旋轉(zhuǎn)角度范圍為0°~180°,使用PWM控制正反轉(zhuǎn)以及轉(zhuǎn)動的角度,一個周期為20 ms,控制脈沖內(nèi)的高電平時間以達(dá)到控制旋轉(zhuǎn)的角度,也就是控制占空比。高電平時間可在0.5~2.5 ms內(nèi)選擇,0.5 ms代表旋轉(zhuǎn)0°,2.5 ms代表旋轉(zhuǎn)180°。
溫度傳感器:用于實(shí)時監(jiān)控孵化倉內(nèi)水溫的變化,溫度傳感器使用的型號為DS18B20,使用OneWire通信協(xié)議,需外接上拉電阻。
加熱棒:用于孵化倉內(nèi)的溫度控制以達(dá)到恒溫的目的,額定電壓12 V,單片機(jī)通過直流繼電器來控制加熱棒的開關(guān)閉和。
水泵:單片機(jī)通過直流繼電器控制水泵的開關(guān)閉合。
氣泵:單片機(jī)通過直流繼電器控制氣泵的開關(guān)閉合。
RGB屏幕:RGB電容屏用于人機(jī)交互并顯示信息,使用STM32F429的LTDC和DMA2D進(jìn)行控制,STM32的LTDC是專門用于顯示圖像的硬件設(shè)備而DMA2D則是LTDC專用的DMA設(shè)備,可以提高數(shù)據(jù)傳輸速度。
電容觸摸屏:電容觸摸屏采用GT5688觸摸控制芯片,使用IIC協(xié)議,STM32F429可通過特定的設(shè)備地址來訪問GT5688,并使用發(fā)送命令的方式來讀取觸點(diǎn)的坐標(biāo)以及大小。
SDRAM:STM32F429IGTx系列只擁有256 kB的內(nèi)部SRAM,顯示一幅大小為480*272,色深為RGB888的圖像需要的顯存通過下式可計(jì)算得出:
可知STM32F429IGTx內(nèi)部SRAM空間無法提供充足的顯存去支持圖像的顯示。為了解決顯存不足的問題需要外擴(kuò)SDRAM,STM32F429IGTx系列擁有FMC設(shè)備去外擴(kuò)SDRAM。
FLASH:STM32F429IGTx系列擁有的內(nèi)部Flash空間為2 MB,為了支持更高品質(zhì)的UI效果應(yīng)該將圖片、字模等需要占據(jù)大量儲存空間的數(shù)據(jù)移至外部儲存器,所以可以通過外擴(kuò)FLASH的方式將需要被作為圖像顯示的數(shù)據(jù)集中存儲到外部空間內(nèi),內(nèi)部FLASH可以只儲存代碼,這樣能夠更高效地利用單片機(jī)的內(nèi)部FLASH。
2.2.1 FreeRTOS
FreeRTOS是一個開源的實(shí)時操作系統(tǒng),提供的功能包括任務(wù)管理、時間管理、信號量、消息隊(duì)列和內(nèi)存管理,可基本滿足較小系統(tǒng)的需要[3]。操作系統(tǒng)的任務(wù)調(diào)度器會決定在某一時刻處理器應(yīng)該執(zhí)行哪個任務(wù),所以多個任務(wù)同時運(yùn)行并不代表著處理器在同一時刻真的執(zhí)行了若干個任務(wù),由于切換任務(wù)的時間非常短,并且通常情況下一個任務(wù)并不會占用太多的時間,所以從人類的角度去看就像是處理器在同時執(zhí)行多個任務(wù)一樣。
FreeRTOS是一款非常小型且輕量化的實(shí)時操作系統(tǒng),內(nèi)核文件僅有3個.c文件,只需要6 K~12 K的ROM占用空間[4]。
在本方案中,UI界面擁有人機(jī)交互的功能需要接受用戶的點(diǎn)擊,擁有特定的定時要求,并且需要與后端硬件進(jìn)行交互,為了支持流暢的用戶界面圖形引擎需要不斷地進(jìn)行幀刷新,在這種復(fù)雜的情景下圖形引擎很有可能因?yàn)槊τ谒⑿滦碌膱D像幀而導(dǎo)致處理器無法及時處理別的任務(wù),同時也有可能因?yàn)檎趫?zhí)行某個實(shí)時性并不需要強(qiáng)的任務(wù)而導(dǎo)致圖像沒有及時刷新而產(chǎn)生卡頓感,在這種情況下使用RTOS去調(diào)度或者同步這些若干個任務(wù)會顯得更加高效和方便,避免上述產(chǎn)生的問題[5]。
2.2.2 TouchGFX
TouchGFX是一款圖形軟件框架,為嵌入式設(shè)備設(shè)計(jì)圖形用戶界面而生,使用C++進(jìn)行開發(fā)。TouchGFX框架包括TouchGFX設(shè)計(jì)器(TouchGFXDesigner)和TouchGFX引擎[6]。
TouchGFX用戶界面遵循稱為模型-視圖-演示者(MVP)的架構(gòu)模式,這種架構(gòu)模式可以將不同功能的代碼區(qū)分開來,將UI的邏輯與可視層分離,方便進(jìn)行單獨(dú)測試。MVP架構(gòu)模式總共由3個部分組成:
Model:Model用于和開發(fā)板的非UI部分硬件進(jìn)行通信,Model既可以從UI中接收事件將其反饋到底層硬件,也可以從底層硬件接收信息并通過Presenter來更新View中的UI界面。
View:View用于負(fù)責(zé)顯示UI界面,接收來自觸摸屏的點(diǎn)擊,并可以將事件傳送至Presenter,同時也可以接收從Presenter帶來的信息。
Presenter:連接Model與View的中間層,負(fù)責(zé)當(dāng)前View顯示的Screen的邏輯,接收來自View的點(diǎn)擊事件以及來自Model的數(shù)據(jù)。
TouchGFX[6]軟件包中擁有專門的操作系統(tǒng)接口,這些接口在OSWrappers.c中:
signalVSync():垂直同步信號,使顯示器為下一幀做好準(zhǔn)備,可以使用FreeRTOS的信號量進(jìn)行同步。
waitForVSync():等待垂直同步,這個函數(shù)會阻塞直到信號量可以被使用。
takeFrameBufferSemaphore():圖形引擎直接訪問幀緩沖區(qū)。
giveFrameBufferSemaphore():安全地釋放幀緩沖區(qū)信號量。
2.2.3 系統(tǒng)設(shè)計(jì)
系統(tǒng)框架如圖2所示,F(xiàn)reeRTOS會根據(jù)優(yōu)先級來調(diào)度所有的任務(wù)并控制STM32F429IGTx對所有的硬件進(jìn)行驅(qū)動。
圖2 系統(tǒng)框架圖
用戶可以通過LCD上設(shè)置的UI界面來控制需要連續(xù)孵化幾次并選擇是否開始孵化,UI界面如圖3所示。
圖3 UI界面
當(dāng)用戶按下開始孵化鍵后,整個裝置會以如圖4所示流程圖的方式進(jìn)行自動供卵的操作:
圖4 孵化流程圖
首先開始供卵,步進(jìn)電機(jī)會旋轉(zhuǎn)360°讓豐年蝦卵落入孵化倉,然后啟動舵機(jī)開始加鹽,加完鹽后啟動水泵,這些步驟與孵化豐年蝦卵相比并不會持續(xù)太長的時間,然而在水泵向孵化倉加滿水后需要打開溫度傳感器和加熱棒并且同時打開氣泵,這3個并行任務(wù)是要在孵化過程中持續(xù)進(jìn)行的,所以啟動步進(jìn)電機(jī)、啟動舵機(jī)、啟動水泵這3個步驟屬于一個任務(wù),并將其稱為Task1,而打開溫度傳感器、啟動氣泵以及打開加熱棒這3個并行步驟屬于另一個任務(wù),將其稱為Task2,Task2接收來自Task1執(zhí)行完畢后釋放的二值信號量Semaphores1進(jìn)行同步。
STM32F429IGTx擁有RTC設(shè)備,這是一款專門用于長時間定時的時鐘,在有紐扣電池的情況下還能保持掉電運(yùn)行,通過RTC可以精準(zhǔn)控制孵化的時間,等時間到后進(jìn)入中斷并釋放另一個二值信號量Semaphores2將Task2重新設(shè)為阻塞態(tài)。
二值信號量Semaphores2也會被Task3接收到,這時Task3會先打開位于投食口的電磁閥,喂養(yǎng)完畢后再打開排水口的電磁閥。
用戶可以在設(shè)置次數(shù)頁面設(shè)置需要自動孵化并喂養(yǎng)的次數(shù),在設(shè)置完畢后,次數(shù)將會被作為列表項(xiàng)寫入隊(duì)列List中,并且所有任務(wù)都會接收到List中的信息,這樣所有的任務(wù)就會知道它們需要被執(zhí)行多少次。Task1在接收到List不為NULL后開始執(zhí)行任務(wù)并依次執(zhí)行下去直到Task3被執(zhí)行完畢,而Task3被執(zhí)行完畢后同樣會釋放一個二值信號量Semaphores3給Task1以此來同步循環(huán)已經(jīng)結(jié)束可以開始進(jìn)入下一個循環(huán)(如果有的話)。
通過實(shí)驗(yàn)可以確保整套方案是可行的,并且能夠做到人機(jī)交互和整個流程自動化的功能,與人工養(yǎng)殖豐年蝦卵相比更加方便,實(shí)物如圖5所示。
圖5 實(shí)物演示圖
經(jīng)過評估,本方案通過運(yùn)用FreeRTOS來統(tǒng)籌管理所有的任務(wù),能夠做到實(shí)時性并且電子元器件之間能夠互相配合。通過步進(jìn)電機(jī)做到自動供卵的功能以及使用舵機(jī)完成自動加鹽的功能,同時通過溫度傳感器和加熱棒完成恒溫的功能,STM32F429也能保證22 h后結(jié)束孵化步驟并控制電磁夾緊閥來完成喂養(yǎng)和排水。
本方案討論了當(dāng)今豐年蝦養(yǎng)殖的現(xiàn)狀,并根據(jù)現(xiàn)狀提出了一種自動孵化并投食豐年蝦的方案,彌補(bǔ)了當(dāng)今在豐年蝦養(yǎng)殖方面自動化的空白。但是本方案依舊處于實(shí)驗(yàn)室階段,不足以進(jìn)行市場化且仍有改善的空間,主要問題有設(shè)備過于笨重,如果做成獨(dú)立的設(shè)備會造成安裝難的問題,解決方法可以將方案中的電子元器件小型化或者直接將本方案與魚缸或者養(yǎng)魚設(shè)施集成在一起成為一個整體。