張振宇,侯奕辰,陳哲奕,汪 燁
(上海電機(jī)學(xué)院 機(jī)械學(xué)院,上海 201306)
豐年蝦是一種營養(yǎng)價(jià)值非常高的魚飼料,以魚飼料為目的的豐年蝦孵化需要用淡鹽水進(jìn)行,鹽度為10‰,最適宜的溫度在30℃左右,期間適當(dāng)?shù)慕o予光照,孵化時(shí)間大約為22 h[1]。最好在孵化時(shí)給予充足的氧氣,孵化完后需要立刻當(dāng)作飼料進(jìn)行喂食,否則營養(yǎng)價(jià)值會(huì)大大流失[2]。但目前市場上都只有單純的孵化設(shè)備,并且需要人工自己控制豐年蝦卵的投放量和鹽的投放量,無法做到自動(dòng)喂養(yǎng),不夠自動(dòng)化也不夠人性化。本文基于以上幾個(gè)問題進(jìn)行了豐年蝦卵自動(dòng)孵化投食系統(tǒng)的設(shè)計(jì)。
結(jié)構(gòu)示意圖如圖1所示,豐年蝦卵儲(chǔ)存在裝置上部,步進(jìn)電機(jī)安裝在轉(zhuǎn)盤上,通過步進(jìn)電機(jī)的轉(zhuǎn)動(dòng)可以使豐年蝦卵落入下方孵化倉內(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)動(dòng)的角度,一個(gè)周期為20 ms,控制脈沖內(nèi)的高電平時(shí)間以達(dá)到控制旋轉(zhuǎn)的角度,也就是控制占空比。高電平時(shí)間可在0.5~2.5 ms內(nèi)選擇,0.5 ms代表旋轉(zhuǎn)0°,2.5 ms代表旋轉(zhuǎn)180°。
溫度傳感器:用于實(shí)時(shí)監(jiān)控孵化倉內(nèi)水溫的變化,溫度傳感器使用的型號(hào)為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ù)大量儲(chǔ)存空間的數(shù)據(jù)移至外部儲(chǔ)存器,所以可以通過外擴(kuò)FLASH的方式將需要被作為圖像顯示的數(shù)據(jù)集中存儲(chǔ)到外部空間內(nèi),內(nèi)部FLASH可以只儲(chǔ)存代碼,這樣能夠更高效地利用單片機(jī)的內(nèi)部FLASH。
2.2.1 FreeRTOS
FreeRTOS是一個(gè)開源的實(shí)時(shí)操作系統(tǒng),提供的功能包括任務(wù)管理、時(shí)間管理、信號(hào)量、消息隊(duì)列和內(nèi)存管理,可基本滿足較小系統(tǒng)的需要[3]。操作系統(tǒng)的任務(wù)調(diào)度器會(huì)決定在某一時(shí)刻處理器應(yīng)該執(zhí)行哪個(gè)任務(wù),所以多個(gè)任務(wù)同時(shí)運(yùn)行并不代表著處理器在同一時(shí)刻真的執(zhí)行了若干個(gè)任務(wù),由于切換任務(wù)的時(shí)間非常短,并且通常情況下一個(gè)任務(wù)并不會(huì)占用太多的時(shí)間,所以從人類的角度去看就像是處理器在同時(shí)執(zhí)行多個(gè)任務(wù)一樣。
FreeRTOS是一款非常小型且輕量化的實(shí)時(shí)操作系統(tǒng),內(nèi)核文件僅有3個(gè).c文件,只需要6 K~12 K的ROM占用空間[4]。
在本方案中,UI界面擁有人機(jī)交互的功能需要接受用戶的點(diǎn)擊,擁有特定的定時(shí)要求,并且需要與后端硬件進(jìn)行交互,為了支持流暢的用戶界面圖形引擎需要不斷地進(jìn)行幀刷新,在這種復(fù)雜的情景下圖形引擎很有可能因?yàn)槊τ谒⑿滦碌膱D像幀而導(dǎo)致處理器無法及時(shí)處理別的任務(wù),同時(shí)也有可能因?yàn)檎趫?zhí)行某個(gè)實(shí)時(shí)性并不需要強(qiáng)的任務(wù)而導(dǎo)致圖像沒有及時(shí)刷新而產(chǎn)生卡頓感,在這種情況下使用RTOS去調(diào)度或者同步這些若干個(gè)任務(wù)會(huì)顯得更加高效和方便,避免上述產(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個(gè)部分組成:
Model:Model用于和開發(fā)板的非UI部分硬件進(jìn)行通信,Model既可以從UI中接收事件將其反饋到底層硬件,也可以從底層硬件接收信息并通過Presenter來更新View中的UI界面。
View:View用于負(fù)責(zé)顯示UI界面,接收來自觸摸屏的點(diǎn)擊,并可以將事件傳送至Presenter,同時(shí)也可以接收從Presenter帶來的信息。
Presenter:連接Model與View的中間層,負(fù)責(zé)當(dāng)前View顯示的Screen的邏輯,接收來自View的點(diǎn)擊事件以及來自Model的數(shù)據(jù)。
TouchGFX[6]軟件包中擁有專門的操作系統(tǒng)接口,這些接口在OSWrappers.c中:
signalVSync():垂直同步信號(hào),使顯示器為下一幀做好準(zhǔn)備,可以使用FreeRTOS的信號(hào)量進(jìn)行同步。
waitForVSync():等待垂直同步,這個(gè)函數(shù)會(huì)阻塞直到信號(hào)量可以被使用。
takeFrameBufferSemaphore():圖形引擎直接訪問幀緩沖區(qū)。
giveFrameBufferSemaphore():安全地釋放幀緩沖區(qū)信號(hào)量。
2.2.3 系統(tǒng)設(shè)計(jì)
系統(tǒng)框架如圖2所示,F(xiàn)reeRTOS會(huì)根據(jù)優(yōu)先級(jí)來調(diào)度所有的任務(wù)并控制STM32F429IGTx對(duì)所有的硬件進(jìn)行驅(qū)動(dòng)。

圖2 系統(tǒng)框架圖
用戶可以通過LCD上設(shè)置的UI界面來控制需要連續(xù)孵化幾次并選擇是否開始孵化,UI界面如圖3所示。

圖3 UI界面
當(dāng)用戶按下開始孵化鍵后,整個(gè)裝置會(huì)以如圖4所示流程圖的方式進(jìn)行自動(dòng)供卵的操作:

圖4 孵化流程圖
首先開始供卵,步進(jìn)電機(jī)會(huì)旋轉(zhuǎn)360°讓豐年蝦卵落入孵化倉,然后啟動(dòng)舵機(jī)開始加鹽,加完鹽后啟動(dòng)水泵,這些步驟與孵化豐年蝦卵相比并不會(huì)持續(xù)太長的時(shí)間,然而在水泵向孵化倉加滿水后需要打開溫度傳感器和加熱棒并且同時(shí)打開氣泵,這3個(gè)并行任務(wù)是要在孵化過程中持續(xù)進(jìn)行的,所以啟動(dòng)步進(jìn)電機(jī)、啟動(dòng)舵機(jī)、啟動(dòng)水泵這3個(gè)步驟屬于一個(gè)任務(wù),并將其稱為Task1,而打開溫度傳感器、啟動(dòng)氣泵以及打開加熱棒這3個(gè)并行步驟屬于另一個(gè)任務(wù),將其稱為Task2,Task2接收來自Task1執(zhí)行完畢后釋放的二值信號(hào)量Semaphores1進(jìn)行同步。
STM32F429IGTx擁有RTC設(shè)備,這是一款專門用于長時(shí)間定時(shí)的時(shí)鐘,在有紐扣電池的情況下還能保持掉電運(yùn)行,通過RTC可以精準(zhǔn)控制孵化的時(shí)間,等時(shí)間到后進(jìn)入中斷并釋放另一個(gè)二值信號(hào)量Semaphores2將Task2重新設(shè)為阻塞態(tài)。
二值信號(hào)量Semaphores2也會(huì)被Task3接收到,這時(shí)Task3會(huì)先打開位于投食口的電磁閥,喂養(yǎng)完畢后再打開排水口的電磁閥。
用戶可以在設(shè)置次數(shù)頁面設(shè)置需要自動(dòng)孵化并喂養(yǎng)的次數(shù),在設(shè)置完畢后,次數(shù)將會(huì)被作為列表項(xiàng)寫入隊(duì)列List中,并且所有任務(wù)都會(huì)接收到List中的信息,這樣所有的任務(wù)就會(huì)知道它們需要被執(zhí)行多少次。Task1在接收到List不為NULL后開始執(zhí)行任務(wù)并依次執(zhí)行下去直到Task3被執(zhí)行完畢,而Task3被執(zhí)行完畢后同樣會(huì)釋放一個(gè)二值信號(hào)量Semaphores3給Task1以此來同步循環(huán)已經(jīng)結(jié)束可以開始進(jìn)入下一個(gè)循環(huán)(如果有的話)。
通過實(shí)驗(yàn)可以確保整套方案是可行的,并且能夠做到人機(jī)交互和整個(gè)流程自動(dòng)化的功能,與人工養(yǎng)殖豐年蝦卵相比更加方便,實(shí)物如圖5所示。

圖5 實(shí)物演示圖
經(jīng)過評(píng)估,本方案通過運(yùn)用FreeRTOS來統(tǒng)籌管理所有的任務(wù),能夠做到實(shí)時(shí)性并且電子元器件之間能夠互相配合。通過步進(jìn)電機(jī)做到自動(dòng)供卵的功能以及使用舵機(jī)完成自動(dòng)加鹽的功能,同時(shí)通過溫度傳感器和加熱棒完成恒溫的功能,STM32F429也能保證22 h后結(jié)束孵化步驟并控制電磁夾緊閥來完成喂養(yǎng)和排水。
本方案討論了當(dāng)今豐年蝦養(yǎng)殖的現(xiàn)狀,并根據(jù)現(xiàn)狀提出了一種自動(dòng)孵化并投食豐年蝦的方案,彌補(bǔ)了當(dāng)今在豐年蝦養(yǎng)殖方面自動(dòng)化的空白。但是本方案依舊處于實(shí)驗(yàn)室階段,不足以進(jìn)行市場化且仍有改善的空間,主要問題有設(shè)備過于笨重,如果做成獨(dú)立的設(shè)備會(huì)造成安裝難的問題,解決方法可以將方案中的電子元器件小型化或者直接將本方案與魚缸或者養(yǎng)魚設(shè)施集成在一起成為一個(gè)整體。