劉正云 謝作如
日晷是白天通過(guò)測(cè)日影定時(shí)間的儀器。利用日晷計(jì)時(shí)的方法是人類(lèi)在天文計(jì)時(shí)領(lǐng)域的重大發(fā)明。但傳統(tǒng)日晷的最大不足在于要靠人工去看時(shí)間,這很不方便。如果利用Arduino配合傳感器做一個(gè)可以自動(dòng)判斷時(shí)間的智能日晷,能否既保留古代科技的偉大,又結(jié)合現(xiàn)代科技的神奇呢?
在設(shè)計(jì)智能日晷之前,我們首先要知道日晷的工作原理,這要從影子開(kāi)始說(shuō)起。當(dāng)物體被太陽(yáng)照射時(shí),會(huì)有影子產(chǎn)生。在一天的不同時(shí)刻,影子的長(zhǎng)短以及方向在不斷改變。首先,是影子長(zhǎng)短的改變,早晨物體的影子最長(zhǎng),隨著時(shí)間的流逝,影子逐漸縮短,直至中午達(dá)到最短,一過(guò)中午,影子又慢慢變長(zhǎng);其次,是影子方向的改變,在北回歸線(xiàn)以北的地方,早晨影子在西邊,中午影子在北邊,傍晚影子在東邊。
日晷通常由晷針和晷面組成,垂直穿過(guò)圓盤(pán)中心的是晷針,與地軸平行;石制的圓盤(pán)叫做晷面,安放在石臺(tái)上,呈南高北低,與赤道平行。從原理上來(lái)說(shuō),根據(jù)影子的長(zhǎng)度或方向都可以計(jì)時(shí)。一天當(dāng)中,太陽(yáng)最高位于正南,為地方時(shí)12點(diǎn)。根據(jù)每小時(shí)走15度的運(yùn)動(dòng)規(guī)律,太陽(yáng)的運(yùn)動(dòng)軌跡每變動(dòng)15度,時(shí)差就相差一小時(shí)。日影與太陽(yáng)位置保持相反,太陽(yáng)的位置變動(dòng)多少度,影子的位置也會(huì)跟著變動(dòng)多少度。早晨,影子投向盤(pán)面西端的卯時(shí)附近(如圖1);當(dāng)太陽(yáng)達(dá)正南最高位置(上中天)時(shí),針影位于正北(下)方,指示著當(dāng)?shù)氐奈鐣r(shí)正時(shí)刻(如圖2)。午后,太陽(yáng)西移,日影東斜,依次指向未、申、酉各個(gè)時(shí)辰(如圖3)。
日晷的晷面有十二個(gè)刻度,即子、丑、寅、卯、辰、巳、午、未、申、酉、戌、亥,分別代表了十二個(gè)時(shí)辰,每個(gè)刻度與現(xiàn)代時(shí)間的對(duì)應(yīng)關(guān)系如圖4所示。根據(jù)日晷的運(yùn)行原理,只要利用傳感器得到影子的方向,就能計(jì)算出當(dāng)前的時(shí)間。那么,利用什么辦法能獲知影子的方向呢?有一個(gè)很簡(jiǎn)單的辦法,在一個(gè)晷針或者晷盤(pán)的下方布滿(mǎn)光線(xiàn)傳感器,即光線(xiàn)傳感器陣列,哪個(gè)方向的傳感器數(shù)值最小,就可以得知影子的方向。但是這樣需要好多個(gè)光線(xiàn)傳感器,又浪費(fèi)又不好看。于是,筆者采用了一個(gè)折中的方案,讓舵機(jī)帶著一個(gè)光線(xiàn)傳感器轉(zhuǎn)動(dòng),然后算出數(shù)值最小的角度。至于時(shí)間的顯示,可以用LED來(lái)表示,發(fā)光比晷盤(pán)上的數(shù)字更加明顯。
首先要設(shè)計(jì)的是晷面和晷針。筆者使用AI設(shè)計(jì)軟件分別設(shè)計(jì)出晷面以及裝器材的盒子,用激光切割機(jī)切割出來(lái),并在晷盤(pán)上放置七個(gè)LED發(fā)光模塊,分別代表早晨6點(diǎn)、8點(diǎn)、10點(diǎn),中午12點(diǎn),下午2點(diǎn)、4點(diǎn)、6點(diǎn)這七個(gè)時(shí)間點(diǎn),兩個(gè)LED發(fā)光模塊的中間則對(duì)應(yīng)上午7點(diǎn)、9點(diǎn),中午11點(diǎn),下午1點(diǎn)、3點(diǎn)、5點(diǎn),如圖5所示。
將智能日晷的晷針根部連接舵機(jī)模塊,晷針上連接橫向結(jié)構(gòu)件,并放置光線(xiàn)傳感器模塊,整個(gè)智能日晷的啟動(dòng)由按鈕控制。按下按鈕,程序啟動(dòng),舵機(jī)轉(zhuǎn)動(dòng)并帶動(dòng)晷針在晷面上方轉(zhuǎn)動(dòng)180度,用光線(xiàn)傳感器模塊測(cè)量七個(gè)時(shí)辰十三個(gè)時(shí)間點(diǎn)的陰影強(qiáng)弱程度,光線(xiàn)最弱位置的時(shí)間點(diǎn)即為此時(shí)的具體地方時(shí)間,若地方時(shí)為上午6、8、10、12時(shí)及下午2、4、6時(shí)整,則對(duì)應(yīng)LED發(fā)光模塊點(diǎn)亮;若地方時(shí)為上午7、9、11時(shí)及下午1、3、5時(shí)整,則其左右兩邊的LED發(fā)光模塊一起點(diǎn)亮。
智能日晷用到的硬件器材清單如下:Romeo控制器(可以用任何一款A(yù)rduino主板)、LED發(fā)光模塊、模擬環(huán)境光線(xiàn)傳感器、舵機(jī)、按鈕。分別將七個(gè)LED發(fā)光模塊連接在Arduino Romeo控制器的數(shù)字針腳上,如針腳2、3、4、5、6、7、8;將光線(xiàn)傳感器接在Arduino Romeo控制器的模擬針腳上,如模擬針腳1;將舵機(jī)接在Arduino Romeo控制器的數(shù)字針腳,如針腳11;同時(shí),將控制程序啟動(dòng)的按鈕接在控制板的數(shù)字針腳上,如針腳13,硬件連接如圖6所示。
智能日晷的程序主要包含三個(gè)部分:一是獲取各個(gè)角度的光線(xiàn)數(shù)值;二是計(jì)算出最小的數(shù)值位置;三是顯示時(shí)間。即移動(dòng)點(diǎn)亮相應(yīng)的LED。智能日晷運(yùn)行流程圖如圖7所示。
在應(yīng)用啟動(dòng)之初,首先,需要將七個(gè)LED(針腳2~8)全部熄滅,將舵機(jī)轉(zhuǎn)到0度待命,同時(shí)將0度(也就是早上6點(diǎn))位置上的光線(xiàn)值賦給最小光線(xiàn)值變量minLight,程序如下頁(yè)圖8所示。
主程序第一部分是轉(zhuǎn)動(dòng)舵機(jī)并獲取晷面上午6點(diǎn)到下午6點(diǎn)共13個(gè)時(shí)間點(diǎn)所在位置光線(xiàn)值的程序。使用數(shù)組light[]存放不同位置的光線(xiàn)值。舵機(jī)在晷面不同時(shí)間點(diǎn)的具體位置依次轉(zhuǎn)動(dòng),根據(jù)日晷工作原理可知,每?jī)蓚€(gè)時(shí)間點(diǎn)間隔15度。因此,舵機(jī)轉(zhuǎn)動(dòng)、舵機(jī)下方對(duì)應(yīng)LED點(diǎn)亮、光線(xiàn)傳感器獲取不同時(shí)間點(diǎn)位置的光線(xiàn)值并將其存儲(chǔ)在數(shù)組中的具體程序如下頁(yè)圖9所示,變量a為數(shù)組light[]的下標(biāo)。根據(jù)數(shù)學(xué)運(yùn)算可得知,舵機(jī)轉(zhuǎn)動(dòng)角度為a×15,舵機(jī)下方對(duì)應(yīng)LED針腳值為a÷2+2。
其次,也是智能日晷最重要的地方,是求出不同時(shí)間點(diǎn)位置光線(xiàn)值中最小的一個(gè),也就是太陽(yáng)陰影的所在點(diǎn),哪個(gè)時(shí)間點(diǎn)位置光線(xiàn)值最小,該位置所顯示的時(shí)間點(diǎn)即為此時(shí)具體地方的時(shí)間。
求13個(gè)數(shù)值中的最小值,可將第一個(gè)數(shù)值與后面一個(gè)數(shù)值相比較,取兩者之間較小的一個(gè),再與下一個(gè)數(shù)值進(jìn)行比較,取小者,依次循環(huán),直至將13個(gè)時(shí)間點(diǎn)的光線(xiàn)值全部比較完畢,程序中將最小光線(xiàn)值用minLight表示,將最小光線(xiàn)值時(shí)所對(duì)應(yīng)的下標(biāo)a賦值給servoLocation,LED所在針腳值變量用ledLocation表示,ledLocation由數(shù)組的下標(biāo)a換算而來(lái),ledLocation=a÷2+2。
minLight初始值已經(jīng)在應(yīng)用啟動(dòng)準(zhǔn)備程序中被賦值為早上6點(diǎn)位置的光線(xiàn)值,第二部分主程序如圖10所示。
最后,將晷針移至光線(xiàn)最暗的時(shí)間點(diǎn)位置,并點(diǎn)亮此處的LED發(fā)光裝置。倘若晷針正好指向LED發(fā)光裝置,則點(diǎn)亮該LED;倘若晷針指向兩個(gè)LED發(fā)光裝置之間,則同時(shí)點(diǎn)亮其左右兩個(gè)LED發(fā)光裝置。通過(guò)servoLocation取余2的值,來(lái)判斷光線(xiàn)最暗的時(shí)間點(diǎn)位置是在一個(gè)LED上方,還是兩個(gè)LED中間,其數(shù)學(xué)運(yùn)算表達(dá)式為“servoLocation % 2”(如圖11)。
當(dāng)然,整個(gè)智能日晷由按鈕按下啟動(dòng),千萬(wàn)不要忘記按鈕功能實(shí)現(xiàn)的程序編寫(xiě)。
完成硬件和代碼后,現(xiàn)在可以開(kāi)始測(cè)試了:按下按鈕,晷針運(yùn)行180度之后,又回到光線(xiàn)最暗的地方,并點(diǎn)亮了相應(yīng)的LED發(fā)光裝置。當(dāng)看到日冕變得智能后,有沒(méi)有一種“老樹(shù)開(kāi)花”的感覺(jué)呢?
當(dāng)然,要實(shí)現(xiàn)影子的智能測(cè)量還有很多方法,利用攝像頭識(shí)別也是很好的方案之一。這需要學(xué)習(xí)圖片處理方面的知識(shí),要求較高,并且智能硬件要改為樹(shù)莓派或者lattepanda,才能完成圖像數(shù)據(jù)的運(yùn)算處理。
智能日晷是一個(gè)非常適合中小學(xué)生的研究項(xiàng)目,其價(jià)值是將現(xiàn)代電子技術(shù)與古代天文科學(xué)原理相結(jié)合,通過(guò)動(dòng)手造物的形式,讓學(xué)生真正理解影子、太陽(yáng)和時(shí)間之間的關(guān)系。小學(xué)科學(xué)課程中本來(lái)就有相關(guān)的學(xué)習(xí)內(nèi)容,二者完全可以結(jié)合起來(lái)學(xué)習(xí)。
通過(guò)現(xiàn)代電子技術(shù),重新對(duì)傳統(tǒng)工具、玩具等進(jìn)行設(shè)計(jì),可以改造成很有趣的STEAM項(xiàng)目,如使用距離傳感器制作手勢(shì)控制的二胡;使用馬達(dá)和無(wú)線(xiàn)遙控器制作可遙控的電動(dòng)龍舟;使用蜂鳴器、LED發(fā)光模塊等制作更具互動(dòng)效果的舞獅;利用多個(gè)舵機(jī)、MP3模塊和激光切割設(shè)計(jì)獨(dú)具一格的皮影;等等。在Mixly、Ardublock、Scratch等圖形化編程軟件的幫助下,智能硬件的學(xué)習(xí)門(mén)檻已經(jīng)越來(lái)越低,它有必要作為一個(gè)學(xué)習(xí)工具在中小學(xué)課堂中普及。
[1]王德昌.日晷——時(shí)間的雕塑和測(cè)量[J].科學(xué),2005,57(04):55-58.
[2]日晷[EB/OL].https://baike.baidu.com/item/%E6%97%A5%E6%99%B7/765113?fr=aladdin,2018-1-1.