謝作如 蔡慧敏
鬧鐘在我們?nèi)粘I钪惺殖R?,幾乎所有的手機都自帶了鬧鐘功能。不知道大家是否記得指針式鬧鐘(如圖1)?,F(xiàn)在的鬧鐘,純機械的幾乎絕版了,就連指針式的電子鬧鐘也不多見了。利用開源硬件,做一個復古的指針式鬧鐘,讓它能定時鬧鈴,應該是挺有趣的。
● 器材和原理
鬧鐘至少需要指針和鈴聲。因此,舵機和蜂鳴器是必要的電子模塊。舵機可以做指針,每分鐘轉(zhuǎn)動一定的角度。當舵機轉(zhuǎn)到預定的角度(預定時間)時,停止轉(zhuǎn)動并讓蜂鳴器響起,這就是定時鬧鐘的核心功能了。至于控制板,當然選擇Arduino了。
舵機的工作過程是把所接收到的電信號轉(zhuǎn)換為電動機軸上的角位移或角速度輸出,可以精確控制其旋轉(zhuǎn)的角度。為了辨別舵機的轉(zhuǎn)動,我們需要做一個指針固定在舵機上。鬧鐘的原型如圖2所示。
● 建模和編程
我們先確定做一個1小時的鬧鐘,指的是最大時間長度(最大量程)是1小時的鬧鐘。然后找一張紙剪成圓形,用一個畫了刻度的半圓(180度)來表示鬧鐘的指針。簡單計算下,舵機每分鐘轉(zhuǎn)動的單位角度是3度,即180/60=3(度)。如果要定時15分鐘,當舵機轉(zhuǎn)過45度時就要“鬧鈴”了。
你能否歸納出定時n分鐘時舵機轉(zhuǎn)過的角度?答案就是3×n度。為了讓舵機順時針轉(zhuǎn)動,舵機的初始角度要設定為180度,即從180度到0度旋轉(zhuǎn)。那么,舵機的角度隨時間的增加而減小,因此n分鐘的定時,舵機停止轉(zhuǎn)動的角度就是(180-3n)度,如表1所示。
弄明白原理,就可以開始編程了。我們采用的編程工具是Mixly(米思齊)。編程工具Mixly可以通過掃描文尾的二維碼下載。以1小時鬧鐘定時15分鐘為例,具體代碼見下頁圖3。
那么,如何制作一個最大量程為15分鐘或者3小時之類的鬧鐘?在代碼中預設的最小單位角度(3度)不變的情況下,只用修改延時即可。例如,最大里程是3小時,可知每分鐘轉(zhuǎn)1度(180度/180=1度),轉(zhuǎn)過單位角度(3度)需要180秒,所以延時時間為180000毫秒?,F(xiàn)在,你能否歸納出最大量程為n分鐘的鬧鐘需要的延時時間呢?整理出一個表格去看就會更加清晰,如表2所示。
● 作品測試
既然是鬧鐘,其定時的長度肯定要能夠允許用戶自行定義。要實現(xiàn)這樣的功能,需要增加一個按鈕和旋鈕:當按下按鈕時,調(diào)整舵機的初始角度,使舵機回到原點。旋鈕的作用即是記錄需要的時間,為了增加效果,旋鈕上也需要安裝一個指針。
本例子將信號線連接到9號數(shù)字針腳。將蜂鳴器的紅線與控制板的正極相連,黑線插在2號數(shù)字針腳上。
旋鈕的輸出值是0~1024,可是舵機旋轉(zhuǎn)的角度是0~180度,如何實現(xiàn)兩者的關聯(lián)呢?Arduino中提供了map函數(shù)(Mixly中翻譯為“映射”),實現(xiàn)前者與后者的對應關系,并返回映射后的數(shù)值。其實,只要數(shù)學還過得去,就能明白這個關系式其實很簡單:舵機角度=(旋鈕值÷1024)×180。調(diào)試時,最好利用串口將數(shù)據(jù)讀出來觀察。
完整的代碼如圖4所示。為了方便測試,代碼中將延時時間設定為300毫秒。掃描二維碼可以看到作品的演示視頻。
● 拓展提升
定時鬧鐘的前期工作基本完成,最后可以發(fā)揮自己的想象,加上裝飾,畫上刻度。當當當……炫酷的定時鬧鐘就這樣制作完成了。根據(jù)自己的需要動手制作不同里程的鬧鐘吧,只要去做了,你一定會驚訝于自己的創(chuàng)意的。我們設計的作品如圖5所示。
最后,要出個題目考考大家:按照上面的思路,“延時”所需要的時間越長,這個鬧鐘的誤差值就會越大,如何提高精度,將誤差減小呢?要解決這個問題,還需要繼續(xù)加強編程能力。
如果對相關內(nèi)容感興趣,請關注主持人博客。