運用Arduino探究視覺暫留



文/陸健榮、鄭依佩 

 
在資訊與電子的時代,運用科技進行教學或探究與實作,可能會有兩難:程式難、電路難。所以在入門之初我們要謹記先哲「知難行易」的原則,老師或學生不需要完全理解程式或電路,然後才進行探究或實作;就像是享受哼唱歌曲或是把玩智慧手機,先從最簡易的著手,逐步熟悉擴充各種功能,愈玩愈大愈多交流。例如,眾所熟悉的WORD或EXCEL等應用軟體都有許多範例,套入範例就可以用WORD或EXCEL做好許多事情,進而發展出自己的特色。微控制器是近代科技的基礎,其原理與構造固然與手機的原理與構造一般,屬於專業領域;然而其應用於生活、娛樂或教學,卻也如手機般平易近人。尤其是開源的硬/軟體的應用,也有許多簡易好用的範例,方便新手入門,如能善加運用,則事半功倍。本文介紹如何從Arduino最基本的範例--Blink(閃爍)著手,進行探究與實作,並且逐步加入程式、數學、與電路等跨學科與跨領域的基本素養。
視覺暫留是生理與認知方面的有趣現象,古今中外已有應用於類似走馬燈、留影盤之類的娛樂或遊戲。現代應用方面,視覺暫留也是顯示科技、影片或動畫,以至於科學玩具……的基礎。本文中介紹如何運用新科技--開源微控制器,對於視覺暫留現象進行定量的探究與實作,同時訓練測量與分析以及程式與電路等跨領域的基本素養。


一、開源微控制器Arduino的硬體與軟體


「開源」顧名思義是開放的資源,既然是資源就值得循序漸進,慢慢探索開發。Arduino源起於2003年義大利的伊夫雷亞(Ivrea)國際設計學院的教授們所開發之經濟又容易使用的硬體與軟體,提供給新手或專家們用來設計創造互動裝置[1]。Arduino的軟體下載安裝以及硬體與電腦的連接,與其他3C產品類似,網路上與坊間參考資料很多,初入門可以從簡易的Arduino入門手冊之一著手[2]。

圖1是 Arduino入門款UNO的硬體構造簡圖。雖然是簡圖,看起來也頗為複雜。新手入門先只從圖中橘黃色的長方形LED小燈開始,以免見樹不見林。最右邊標示ON的LED小燈為電源顯示燈,亮了表示有通電。不同廠牌的ON-LED燈可能會是其他紅或綠的不同顏色。另外有一顆中央偏左上標示為L的橘黃色LED小燈,在初次接通新買的UNO之後,它會持續閃爍(Blink或眨眼)。這是因為硬體UNO之內已存有Blink的基本程式。

 
圖1. Arduino UNO簡圖,起初只使用橘黃色LED小燈


軟體方面,我們也從最基本的範例Blink開始。安裝好Arduino的軟體之後,其視窗如圖2所示,左半圖與右半圖分別是中文版面與英文版面,是不是和文書軟體WORD很類似? 最上方是所編輯的檔案名稱,剛開啟WORD之初,尚未選擇檔案之時,WORD視窗的最上方會自動給一個「文件一」的檔名。Arduino也會自動給一個「Sketch_月_日」的檔名,顯示於最上方。WORD視窗用於管理「文件」,Arduino視窗則是用於管理「Sketch」,也就是程式的「草稿(碼)」,玩家們常稱程式(碼)為programing(code)。因為程式總是會被擴充或改進,也就常以「Sketch(草稿)」來稱呼程式。

Arduino軟體的操作也與WORD類似,以滑鼠點擊左上的「檔案(File)」,會展開一系列有關於檔案管理的選單,如圖2所示。一開始先點選紅色虛線框標示的「範例(Examples)」,我們從中先挑一個最基本的範例來玩。進入範例視窗之後會展開一個分類視窗。

圖2. Arduino 軟體視窗功能選項

圖3顯示,分類視窗從01.基本類(01.Basic)開始,接著有02.數位類(02.Digital) ,03.類比類(03.Analog)……。不同時期的版本,下方的類別總數會有所不同,前幾項基本的類別倒是都一樣。選擇了01.Basic類別之後,再從中挑選Blink程式草案。Blink的中譯為眨眼或閃爍。在安裝好圖1的Arduino UNO硬體之後,通常的基本測試程序也是按照圖3,依序開啟視窗:Example → 01.Basic → Blink,進行硬體與軟體的溝通測試。Blink草案開啟之後,其程式的視窗如圖4所示。然後點擊其中的②編譯鍵,將英文程式編譯為機器語言,也就是硬體UNO板懂得的語言。編譯無誤之後,接著點擊③上傳鍵,將程式送往硬體UNO板,執行Blink程式。圖4程式之末有兩個紅色方框所標示的兩行相同指令 ” Delay 1000; ” 「延遲1000 ms (毫秒)」。第一個「延遲」發生在內建橘黃色LED發亮之後,第二個「延遲」發生在該LED變暗之後。因此內建LED會重複的亮1秒,暗一秒。學生可以調整延遲的毫秒數,例如將兩個” Delay 1000; ”,都改為” Delay 2000; ”,進行圖4之②、③兩步驟之後,則LED亮暗的延遲時間變長,可觀察到LED變為亮2秒,暗2秒。學生可以調整不同的毫秒數,進行「控制變因」與「觀察結果」的練習。

圖3. 進入Example視窗,選擇01.Basic類別,再從中挑選Blink程式草案


圖4. Blink 範例視窗與執行步驟說明(右方框)

二、 發現問題

如果將圖4的Blink程式中兩個紅線框的”Delay 1000;”,都改為”Delay 100;”,進行圖4之②、③兩步驟之後,則延遲時間變短,改為亮0.1秒,暗0.1秒;學生會發現LED仍然一閃一閃,但是閃得快多了。如果將”Delay 1000;”,都改為”Delay 10;”,進行圖4之②、③兩步驟之後,則延遲時間變得更短,改為亮0.01秒,暗0.01秒。有些學生會觀察到LED仍然是一閃一閃的,只是閃得非常快速;有些學生則會觀察到LED不閃了,而是持續地亮著。如果將”Delay 1000;”,都改為”Delay 1;”,進行②、③兩步驟之後,則延遲時間變得更短,改為亮0.001秒,暗0.001秒。所有學生都會認為LED不閃了,而是持續亮著。我們發現兩個有趣的問題值得探究:

2-1. 閃爍時間小於一個特定值之後,LED「看起來不再閃爍」,究竟這個特定時間是多久呢?
2-2. 不同的人對LED開始「看起來不閃爍」的特定閃爍時間是不相同的,究竟是如何的不同呢?


三、 視覺暫留探究與實作

光進入視覺系統之後會在視網膜上成像,經過認知系統產生視覺影像。當光消失之後,視覺影像仍然保留一段時間,稱為視覺暫留。通常的日光燈大約每秒閃爍百餘次,但是因為視覺暫留,所以我們察覺不到日光燈的閃爍。我國古代的走馬燈約是視覺暫留最早的應用,這一類的應用也是「知難行易」的最佳寫照。現代常見的應用是電影與動畫的拍攝和放映,視覺暫留使得一幅幅畫面得以連續動態呈現,早期畫面更新率(frame per second,簡稱fps)約是每秒6或8張,如今約是每秒120張。究竟我的視覺暫留時間是多少呢?是不是大家都一樣呢?如何不同?我們將運用Arduino的入門範例--Blink,著手定量地探究視覺暫留的時間。

3-1. 測量與數據
例如,將圖4的Blink範例之中兩紅線框的”Delay 1000;”,都改為”Delay 100;”,進行圖4之②、③兩步驟之後,則延遲時間變短,變為亮0.1秒,暗0.1秒;學生會發現內建LED仍然一閃一閃。持續減小”Delay” 的毫秒數,一直到眼睛看不出內建LED燈的閃爍,此時”Delay”的毫秒數即為視覺暫留時間。請班上學生將測得的視覺暫留時間,依照在電腦教室的座位,填入黑板的數據表,如表1所示。

表1. 全班座位以及視覺暫留時間數據(單位:毫秒)



圖5. 全班視覺暫留時間的統計長條圖與高斯分布

3-2. 數據分析與建構模型
全班的視覺暫留時間數據統計的結果,如表2所示。


表2. 全班視覺暫留時間數據統計(單位:毫秒)

依據表2的數據,可以繪製如圖5所示的長條圖,並且得知全班大多數學生的視覺暫留時間約是10毫秒,少數人較短或較長。我們可以粗略描繪全班視覺暫留的分布模型,類似於圖5的虛線,接近一個常態分佈。從圖形上我們也可以初步研判,最多數同學的視覺暫留時間約是10毫秒,或說全班視覺暫留時間的平均值約為 毫秒。大多數同學分布在9.5毫秒到11.5毫秒之間,或是說視覺暫留時間的分布寬度約是 毫秒。中央最多的人數約為 人。我們可以依據測量的數據,對此模型進行更確切的描繪與表達。

四、 改進與調整

4-1.數據分析與統計表達
隨著年級的增長或是職場的精密需求,我們在測量、分析與表達溝通方面的素養,永遠有更增進與更精進的空間。運用適當的軟體或工具,我們可以更精確地計算表1之中,全班視覺暫留時間的平均值為 毫秒,以及標準差為 毫秒。平均值 可以估計常態分布的中央值或最多數值,而標準差 則可以估計該常態分布的寬度。從數據的統計表2或圖5,也可以知道中央值的人數最多,約是10多人,故 。然後依據常態分布的標準函數 ,我們可以建構這次探究活動中,「全班學生視覺暫留」分布的函數模型為 ,有如圖5中的虛線所示。透過曲線擬合 (curve fitting) 軟體或是開源網頁,將測量數據進行更切合的高斯分布擬合,可以得知全班視覺暫留時間分布的更精確模型為:

4-2.測量方法與不確定度
探索一個只知道會發生在一定範圍的未知事件,除了亂槍打鳥碰運氣之外,如何從大範圍逐步地有系統地朝向目標縮小範圍,是一個有趣而且有用的科學方法。例如圖6顯示如何用二分法有效的縮小範圍,探索方程式F(x)=0的根。首先將選定的大範圍「a1~b1」切半一分為二,並將中點命名為b2。如果方程式F(x)=0的根在左半範圍「a1~b2」之內,則F(a1) x F(b2)<0,如圖6所示;而且右半邊無根的範圍「a1~b2」則會符合F(b2) x F(b1)>0。

圖6. 二分法示意圖(以方程式求根為例)

接著便可以將「尋根」範圍的右邊界從b1點收縮到b2點,繼續在此新的小範圍之內進行相同的切半二分與檢驗,一直繼續到新的小範圍縮小到可以接受而終止的小範圍。這個終止範圍的中值便是方程式F(x)=0之根的最佳估計值,而終止範圍的半寬度,便是根的不確定度。

測量未知的視覺暫留時間,起初可能摸索來摸索去地調整亮與暗的延遲時間,一直調整到可以看見閃爍變為連續發亮的延遲時間為止,便可以記錄為視覺暫留時間的數據。雖然讀數可以精準地調整到毫秒,我們可否宣稱測量的不確定度就是毫秒了呢?如果將亮與暗的延遲時間從 0 毫秒開始,逐次遞增一毫秒,直到LED從閃爍變為連續發亮為止,我們雖可以確認遞增的不確定度約是1毫秒。可是這樣會不會太慢?萬一是從另一端1000毫秒開始,每次遞減毫秒來尋找,豈不是很漫長?

我們也可以採用類似方程式尋根的二分法,即使是從延遲時間的大範圍「0~1000」毫秒開始,在0端為持續亮,在1000端為閃爍。二分之後,在500毫秒仍為閃爍,則閃爍邊界縮至500毫秒。如此持續二分縮減,只要4次就到了閃爍邊界縮減至大約63毫秒,如圖7之右端所示。再經過3次二分之後的中點③為8毫秒,此時LED已變為連續發亮不閃爍;顯示應將連續發亮的左邊界縮至8毫秒。接著是圖中的第4次二分的中點④為12毫秒,此時LED又變為閃爍,此為新的閃爍邊界。再二分,新的閃爍邊界就到了為10毫秒,LED仍為閃爍,是為新閃爍邊界。如果就此停止,則可以採用最終範圍的中點 (8+10)/2=9毫秒,作為此次測量視覺暫留時間的最佳估計值,其不確定度為(10-8)/2=1毫秒。當然也可以此類推,繼續進行二分以求取更精密的測量值,直到所切分的區間小於應用或測量所要求的不確定度,即為所求。


圖7. 利用Arduino範例Blink,以二分法探究視覺暫留時間

以此次(圖7所示)的測量而言,其最終範圍之半即為B類不確定度uB=1.0毫秒。如果多進行幾次測量,也將會發現過度的追求精密,可能無濟於事。例如若是初步的進行了三次測量,分別是10、9、8毫秒,便可知道如圖7在進行更多更細緻的切半二分,並無太大的助益。倒是值得同法再重複測量幾次,以獲得確認的平均值。而且重複多做實驗的同時,也要控制其他的變因,確保是相同一致的重複測量。例如,可能需要在結束一次實驗之後,閉眼休息約30秒,再進行下一次實驗,以排除眼睛疲勞的因素。表3為一個學生認真的重複測量20次結果。

表3. 單一學生測量20次視覺暫留時間數據(單位:毫秒)


重複測量20次的平均值為 毫秒,統計的標準差為 毫秒。雖然重複20次測量,提高了統計上的精密度,測量的A類不確定度為 毫秒,比起B類不確定度 uB=1.0毫秒,要小了約10倍左右。不過,從組合不確定度為 毫秒 的觀點來看,重複三到五次確認即可。

參考資料

[1] Massimo Banzi,Arduino 是如何打開想像力的,TED演講
[2] 鄭依佩,Arduino入門手冊,中等教育階段領域教學研究中心


 


陸健榮
國立臺灣師範大學物理系教授
鄭依佩
國立臺灣師範大學化學系研究助理