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