Arduino色散、折射、全反射實驗創作過程分享

文/張敏娟、吳翼翀

 本文背景


2020 年12 月13 日,在台北市科教館一樓大廳前,聚集了許多參加2020第三屆全國科學教具創意設計競賽的參賽選手們。經過了一天的決賽之後,大家坐在椅子上等著公布名次,依照慣例,壓軸放在最後。司儀:現在宣布最佳人氣獎,獲獎的是…,接著宣布佳作、第三名、第二名,眼看只剩下最後兩個獎項,突然間聽到司儀喊了我們,意外獲得了第二名 (圖一)。


圖1.2020 第三屆全國科學教具創意設計競賽,獲得第二名的照片。頒獎者為台師大駱芳鈺教授(左),吳翼翀(中)與指導教授張敏娟(右)。

一、研究光學實驗的起因

設計這個作品時,主要想讓有興趣接觸幾何光學的學生們,用簡單的方法與工 具,以幾百元就可以做出普物實驗室等級的光學實驗。整個實驗的架構示意 圖,如圖二,左邊是Arduino模組、可變電阻、電阻、LED、麵包板,組成光 源。中間是自製單狹縫盒子。右邊是白板、自製量角器、半圓柱透鏡。我們利 用Arduino開發模組(圖三),透過程式撰寫(附錄),將Arduino腳位以 PWM(脈寬調變)的方式調整輸出電壓(圖四),進而控制LED的亮度。用直徑 5mm的LED做為光源(圖五),除了便宜、小巧、好固定,還容易置換成不 同顏色的LED。


圖2.實驗架構圖。左邊是Arduino模組與可變電阻、麵包板、電阻、LED組成光源。中間是自製單狹縫盒子。右邊是白板、自製量角器、半圓柱透鏡。


圖3.使用的Arduino開發模組,由江翠國中賴雲立老師所設計。


圖4.將Arduino腳位以PWM(脈寬調變)的方式調整輸出電壓。


圖5.用直徑5mm的LED做為光源(左),接上Arduino模組發光(右)。

二、單狹縫盒子設計

一開始用簡單的盒子,上面固定LED燈,後方加一個厚紙板做成單狹縫,過濾 LED燈所發出的光,但是LED光源的發散角很大,於是改用珍珠板,切割後用 保麗龍膠黏成長方形的盒子(圖六),盒子前方黏上兩塊方形板子,形成一個 單狹縫,另一個方形板子挖一個洞放LED(圖七)。這個珍珠板盒子過濾光源 的效果優良,組裝又簡單。


圖6.以珍珠板切割後,用保麗龍膠黏成長方形的盒子。


圖7.黏上兩塊方形板子,形成一個單狹縫(左),挖一個洞放LED(右)。

三、光路測量設計

在網路上找到無版權的量角器圖片,影印下來黏在厚紙板上,小心的裁切厚紙 板,就完成一個量角器。量角器下方放一個白板(圖八)。


圖8.光路測量設計。打開電源後,以可變電阻調整給LED的電壓(左),光 通過單狹縫之後,射出路徑可由自製量角器觀察(右)。

四、實驗內容

實驗分成兩個部分,一個是色散與折射,另一個是全反射。 1.關於色散與折射實驗,已知空氣的折射率,我們藉由觀察入射角跟折射 角,理解Snell定理, 。若要找出半圓柱透鏡的折射 率,以入射角為操縱變因,折射角為應變變因,透過數據分析 。知道探究原理之後,開始實作。想要改變入射光與半圓柱玻璃透鏡表面 的夾角𝜃",有兩種辦法,一種是旋轉入射光源保持半圓柱玻璃透鏡不動,另一 種是反過來,旋轉半圓柱玻璃透鏡而保持入射光源不動。兩者相比,旋轉入射 光源太麻煩,而旋轉半圓柱玻璃透鏡卻非常簡單,所以我們採用後者。從0 度 開始,旋轉半圓柱玻璃透鏡,為了更好控制旋轉以及避免量角器滑動,我們加 上了一個圓形小磁鐵,讓小磁鐵同時吸住量角器與白板(圖九)。半圓柱玻璃 透鏡旋轉時,其實是透過旋轉量角器一起帶動,讓光的入射角每次增加10度, 觀察對應的折射角度,記錄於實驗表中(表一)。再把實驗表的數值輸入 execl,得出𝑛"的擬合斜率(圖十)。因為光會色散的關係,寫實驗數據時,紀錄 白光的中間位置角度,將白光色散的角度當作系統誤差值,一起紀錄。之前試 過壓克力稜鏡,色散的角度較大,光也較暗,因此捨棄不用。


圖9從0度開始,旋轉半圓柱透鏡,觀察入射角與折射角(左)。右圖為壓克 力稜鏡,色散的角度較大,光也較暗,測量誤差較大。


表一.同時驗證Snell’s Law 與光的可逆性。半圓柱玻璃透鏡旋轉,觀察對應的 折射角度。左邊表格,光從密介質到疏介質,右邊表格是為了驗證光的可逆 性,反過來,讓光從疏介質到密介質。


圖10.以線性函數擬合的半圓柱玻璃透鏡折射率,

2.關於全反射實驗,跟上一個折射實驗類似,只不過這次我們用了紅色、綠 色、藍色玻璃紙,產生紅光、綠光、藍光,慢慢旋轉半圓柱玻璃透鏡,直到折 射光不見了,記錄此時全反射的臨界角度,如圖十一。以Snell定理推估此時的 半圓柱玻璃透鏡折射率,跟上一個實驗比較(表二),結果與白光差異在2% 以內,達到普物實驗的水準。(改用紅光、綠光、藍光LED也可以)


圖11.全反射實驗,旋轉半圓柱玻璃透鏡,直到折射光不見了,記錄此時全反 射的臨界角度(左)。以全反射計算透鏡折射率的推導過程(右)。


表二.紅光、綠光、藍光,產生全反射臨界角的角度。跟折射實驗的白光結果 1.5377相比,。表中結果表 示,差異在2%以內。

 問題與討論


一、 為什麼紅光的臨界角最大,而藍光的臨界角最小?

折射率n 跟光波的速率有關,不同顏色的光波,波速不同,折射率也不同。
折射率 ,𝒄為光速= ,𝒗為光波在介質中的速率。
紅光能量最小,波長最長,波速最快,折射率n 較小,因此臨界角較大。
藍光能量最大,波長最短,波速最慢,折射率n 較大,因此臨界角較小。

二、 為什麼在色散實驗中,藍光偏折角度最大,紅光偏折角度最小?

同上一題,藍光的波速最慢,紅光波速最快,所以藍光的折射率比紅光的折射 率大,代表藍光或是紅光的折射率, 為空氣的折射率= 𝟏。 。在相同入射角𝜽𝟏下,越大 也越大, 越大的值也越大。
在色散實驗中,藍光的折射角最大,所以偏折角度也最大。紅光的折射角 最小,所以偏折角度也最小。
 

 附錄 Arduino 開發板驅動程式碼如下:
#include //引用程式庫
LiquidCrystal_I2C lcd(0x27, 20, 3); //16列4行
byte potPin = A0; //analog腳位
byte ledPin = 5; //nano可以PWM的腳位
int potValue = 0; //設定A0讀取變數為potValue,類比輸出值
byte analog = 0; //儲存轉換範圍值
double V = 0; //全部都能用double來,可以取很多小數點
boolean state = 0; //宣告一個按鈕狀態的變數
void setup()
{
pinMode(4,INPUT_PULLUP); //特定輕觸型按鈕要打INPUT_PULLUP
///////////////////////////////////////////////
lcd.begin(); //開始
lcd.home(); //游標設定在原點
lcd.setCursor(0,0); //游標設定在(0列,0行),可選擇一個用就好
lcd.print("Hello"); //標好游標後輸出文字
delay(500);
lcd.setCursor(1,1); //游標設定在(1列,1行)
lcd.print("Wellcome to System"); //接再"hello world"後輸出文字
delay(800);
lcd.clear(); //lcd螢幕清除
///////////////////////////////////////////////
pinMode(ledPin, OUTPUT); //led腳位輸出
Serial.begin(9600); //讀取數值速度(鮑率)
//////////////////////////////////////////////
}
void loop()
{
potValue = analogRead(potPin); //讀取A0的值代入
analog = map(potValue, 0, 1023, 0, 255); //0~1023是Arduino輸入的範圍,
0~255是調整範圍
Serial.print("analog="); //電腦監控視窗跑的數字
Serial.println(analog); //電腦監控視窗跑的數字
/////////////////////////////////////////////////////////
analogWrite(ledPin, analog); //給led輸出多少
/////////////////////////////////////////////////////////
lcd.setCursor(0,0); //lcd游標再(0列,0行)
lcd.print("analogRead="); //lcd顯示"analog="
lcd.print(int(analog)); //lcd在"analog="後顯示變數analog,記得用
double之類的
/////////////////////////////////////////////////
V =(double(analog))*5/255; //要把0~255數值轉換成輸出電壓0~5V
lcd.setCursor(0,1); //lcd在(0列,1行)
lcd.print("Output V="); //lcd顯示"Output V="
lcd.print(V); //在"Output V="後顯示V的數值
Serial.print("V="); //電腦監控視窗跑的數字
Serial.println(V); //電腦監控視窗跑的數字
delay(50);
lcd.clear();
////////////////////////////////////////////////
boolean state = digitalRead(4); //設定一個變數測量狀態
Serial.print("state="); //顯示變數結果
Serial.println(state); //顯示變數結果
if (state == 0)
{
lcd.setCursor(1,2);
lcd.print("push!");
}
/////////////////////////////////////////////////////
}



張敏娟
指導教授 輔仁大學物理系 副教授
吳翼翀
學生 輔仁大學物理系 光電物理組 四年級