牟曉東
眾所周知,高中物理本身就是一門(mén)實(shí)驗(yàn)性極強(qiáng)的“燒腦”學(xué)科,但在實(shí)際的物理教學(xué)過(guò)程中仍存在很多使用傳統(tǒng)的手工測(cè)量方式來(lái)獲取實(shí)驗(yàn)數(shù)據(jù)的現(xiàn)象,效率比較低,而且在增加更多的實(shí)驗(yàn)誤差的同時(shí)還有可能會(huì)影響到最終物理實(shí)驗(yàn)規(guī)律的歸納與總結(jié)。
如果根據(jù)不同的物理實(shí)驗(yàn)特點(diǎn)引入開(kāi)源硬件進(jìn)行編程,可利用計(jì)算機(jī)的高速運(yùn)算和傳感器的動(dòng)態(tài)獲取實(shí)時(shí)實(shí)驗(yàn)數(shù)據(jù)來(lái)降低操作難度和減小實(shí)驗(yàn)誤差,而且也能夠極大地提高學(xué)生的學(xué)習(xí)興趣。以“勻加速直線(xiàn)運(yùn)動(dòng)”物理實(shí)驗(yàn)為例,我們來(lái)嘗試使用樹(shù)莓派結(jié)合超聲波傳感器,通過(guò)Python編程和Plotly作“位移s-時(shí)間t”圖像,對(duì)勻加速直線(xiàn)運(yùn)動(dòng)進(jìn)行探索研究。
實(shí)驗(yàn)器材包括樹(shù)莓派3B+主板和古德微擴(kuò)展板各一塊,HC-SR04超聲波傳感器一個(gè),紅色LED燈一支,充電寶一個(gè),實(shí)驗(yàn)小車(chē)一個(gè),1.2米滑軌一個(gè),擋板一個(gè),橡皮筋若干,墊腳物若干,橡皮一塊。
首先,將古德微擴(kuò)展板正確安裝于樹(shù)莓派主板上;接著,將超聲波傳感器的四個(gè)引腳插入擴(kuò)展板的20號(hào)和21號(hào)引腳,注意電源正極VCC端、接地GND端、Trig信號(hào)發(fā)射端及Echo信號(hào)接收端要一一對(duì)應(yīng);最后,將紅色LED燈按照“長(zhǎng)腿正、短腿負(fù)”的原則插入12號(hào)引腳,并且借助于橡皮筋將樹(shù)莓派和充電寶捆綁于小車(chē)上,放置于滑軌起始端(前方用橡皮塞住車(chē)輪以防滑行);滑軌末端直立固定好擋板,作為超聲波傳感器的目標(biāo)測(cè)試靶,滑軌起始端放置墊腳物,模擬不同坡度的光滑斜面(如圖1)。
“勻加速直線(xiàn)運(yùn)動(dòng)”實(shí)驗(yàn)分若干次進(jìn)行,每次不斷增加墊腳物來(lái)提高滑軌起始端的高度,相當(dāng)于滑軌的光滑斜面傾角在不斷增加;每變化一次斜面的傾角,都控制小車(chē)從“坡頂”(滑軌起始端)由靜止開(kāi)始下滑,作勻加速直線(xiàn)運(yùn)動(dòng),直至運(yùn)動(dòng)到“坡底”(滑軌末端)。在整個(gè)運(yùn)動(dòng)過(guò)程中,樹(shù)莓派會(huì)控制超聲波傳感器不斷測(cè)試并記錄小車(chē)與擋板間的距離,同時(shí)也會(huì)標(biāo)注每個(gè)位移數(shù)據(jù)所對(duì)應(yīng)的時(shí)刻,并且將這些數(shù)據(jù)均寫(xiě)入文件中進(jìn)行保存;最后,編程讀取數(shù)據(jù)進(jìn)行物理圖像的繪制,在分析物理實(shí)驗(yàn)數(shù)據(jù)的過(guò)程中歸納和總結(jié)出勻加速直線(xiàn)運(yùn)動(dòng)的特點(diǎn)和規(guī)律。
使用數(shù)據(jù)線(xiàn)將樹(shù)莓派與充電寶連接,啟動(dòng)其操作系統(tǒng)。運(yùn)行Windows的“遠(yuǎn)程桌面連接”程序,輸入樹(shù)莓派的IP地址(比如:192.168.1.113)進(jìn)行連接,登錄成功后點(diǎn)擊“編程”-“ThonnyPythonIDE”菜單,開(kāi)始Python代碼編程。
從gpiozero庫(kù)模塊中導(dǎo)入控制LED燈和超聲波傳感器的LED類(lèi)和DistanceSensor類(lèi):“from gpiozero import LED,DistanceSensor”,導(dǎo)入time時(shí)間模塊用來(lái)控制循環(huán)的時(shí)間間隔:“import time”;導(dǎo)入csv模塊——“import csv”,作用是建立csv文件并向其中寫(xiě)入實(shí)驗(yàn)數(shù)據(jù);再導(dǎo)入warnings模塊——“import warnings”,準(zhǔn)備對(duì)程序運(yùn)行時(shí)可能出現(xiàn)的“意外錯(cuò)誤”提示代碼進(jìn)行過(guò)濾屏蔽:“warnings.filterwarnings("ignore")”,即設(shè)置其為“忽略”狀態(tài),否則每次程序運(yùn)行結(jié)束后都會(huì)出現(xiàn)“warnings.warn(DistanceSensorNoEcho('no echo received'))”的紅色代碼錯(cuò)誤提示,雖不影響程序運(yùn)行但比較令人討厭。
建立變量Red_LED,其值對(duì)應(yīng)插入擴(kuò)展板12號(hào)引腳的紅色LED燈:“Red_LED = LED(12)”;建立變量sensor,通過(guò)語(yǔ)句“sensor = DistanceSensor(echo=21,trigger=20,max_distance=4)”對(duì)HC-SR04超聲波傳感器的類(lèi)進(jìn)行實(shí)例化,其中的“echo=21”和“trigger=20”分別對(duì)應(yīng)超聲波傳感器的信號(hào)回收端與發(fā)射端所插接的擴(kuò)展板21號(hào)和20號(hào)引腳,“max_distance=4”是將超聲波傳感器的最大檢測(cè)距離設(shè)置為4米(不帶該參數(shù)的話(huà),其測(cè)量的極限是1米的距離);建立變量X_Time,賦值為0:“X_Time = 0”,作用是設(shè)置實(shí)驗(yàn)的第一個(gè)時(shí)刻點(diǎn)(即圖像的坐標(biāo)原點(diǎn));建立空列表Y_Dis:“Y_Dis = []”,準(zhǔn)備用來(lái)存放實(shí)驗(yàn)過(guò)程中與每一個(gè)時(shí)刻X_Time所對(duì)應(yīng)的超聲波測(cè)距值,即“位移”。
在while循環(huán)中,每次都是先為變量dis進(jìn)行賦值:“dis = round(sensor.distance,4)”,通過(guò)round()函數(shù)進(jìn)行四舍五入處理,保留4位小數(shù),單位是“米”,相當(dāng)于精確到“毫米”;語(yǔ)句“Red_LED.off()”的作用是關(guān)閉紅色LED燈,結(jié)合下方if條件的選擇結(jié)構(gòu)中的“Red_LED.on()”點(diǎn)亮LED燈,共同實(shí)現(xiàn)只有在有效測(cè)距時(shí)才會(huì)亮起紅色LED燈作為提示;根據(jù)實(shí)驗(yàn)器材的參數(shù),將超聲波傳感器的“有效測(cè)距”限制為0.05-1.1米之間:“((dis<=1.1000)and (dis>0.0500))”,亮燈的同時(shí)還會(huì)在屏幕下方通過(guò)print語(yǔ)句來(lái)輸出提示信息:“print("開(kāi)始記錄數(shù)據(jù):",dis)”;語(yǔ)句“Y_Dis.append(dis)”的作用是將每次測(cè)試獲取的dis位移值通過(guò)追加的方式保存至Y_Dis列表中,語(yǔ)句“time.sleep(0.05)”的作用是控制每次循環(huán)測(cè)試的時(shí)間間隔均為0.05秒,同時(shí)再通過(guò)語(yǔ)句“X_Time += 0.05”將變量X_Time進(jìn)行0.05的“自增”。
需要注意的是,在該“while…True…”循環(huán)中要建立與if條件判斷對(duì)應(yīng)的else分支,其執(zhí)行語(yǔ)句只有“break”一行,作用是在dis變量處于“小于等于0.05米”的臨界盲區(qū)或“大于1.1米”的滑軌越界區(qū)時(shí)能夠“跳出”循環(huán)以中止無(wú)效實(shí)驗(yàn)數(shù)據(jù)的采集,防止“死循環(huán)”的產(chǎn)生。
新建一個(gè)名為“data1.csv”的文件,并且準(zhǔn)備以追加的方式進(jìn)行數(shù)據(jù)的填充,同時(shí)加入?yún)?shù)“encoding='utf-8'”,防止在進(jìn)行文件信息讀寫(xiě)時(shí)出現(xiàn)漢字“亂碼”現(xiàn)象,參數(shù)“newline=''”的作用是防止在向csv文件寫(xiě)數(shù)據(jù)時(shí)出現(xiàn)多余的空行問(wèn)題:“with open('data1.csv','a',encoding='utf-8',newline='') as f:”。接著,通過(guò)csv模塊中的writer等函數(shù)進(jìn)行數(shù)據(jù)寫(xiě)入,其中的“writer.writerow(['Time','Distance'])”是寫(xiě)入第一行的標(biāo)題信息“Time”和“Distance”,對(duì)應(yīng)的是時(shí)間和位移;再通過(guò)for循環(huán)開(kāi)始將本次實(shí)驗(yàn)的每組時(shí)間與位移的對(duì)應(yīng)值寫(xiě)到data1.csv文件中,循環(huán)的次數(shù)由range()函數(shù)來(lái)控制,其參數(shù)為“int(X_Time*20)”——因?yàn)槊看窝h(huán)的時(shí)間間隔是0.05秒;語(yǔ)句“writer.writerow([i/20,Y_Dis[i]])”的作用是將一個(gè)列表全部寫(xiě)入csv文件的同一行,該列表包括時(shí)刻和對(duì)應(yīng)的位移值;最后,通過(guò)“print("寫(xiě)入csv文件結(jié)束?。海贝蛴≥敵鎏崾拘畔?,并將程序代碼保存為“勻加速直線(xiàn)運(yùn)動(dòng)數(shù)據(jù)采集.py”(如圖2)。
先在滑軌起始端下方只放置一塊墊腳物,再點(diǎn)擊Run按鈕測(cè)試運(yùn)行程序后再輕輕撤掉小車(chē)前方的阻塞橡皮,保證其由靜止?fàn)顟B(tài)開(kāi)始向滑軌末端作勻加速直線(xiàn)運(yùn)動(dòng)。當(dāng)開(kāi)始進(jìn)行數(shù)據(jù)的記錄操作時(shí),樹(shù)莓派上的紅色LED燈會(huì)發(fā)光提示,同時(shí)在程序下方也有“開(kāi)始記錄數(shù)據(jù):1.0113”等提示信息;直到小車(chē)運(yùn)動(dòng)至滑軌末端停止,紅色LED燈熄滅,程序提示:“開(kāi)始寫(xiě)入csv文件……”、“寫(xiě)入csv文件結(jié)束!”。此時(shí),在程序所在的文件夾中會(huì)新生成一個(gè)名為data1.csv的數(shù)據(jù)文件,調(diào)用Excel打開(kāi)后就會(huì)看到有兩列數(shù)據(jù),分別對(duì)應(yīng)Time和Distance(如圖3)。
將Python程序代碼中的“with open”中的參數(shù)修改一下,比如先改為data2.csv;然后將滑軌起始端再增加一塊墊腳物,第二次測(cè)試運(yùn)行該程序,會(huì)生成第二個(gè)csv實(shí)驗(yàn)數(shù)據(jù)文件data2.csv;按照同樣的操作方式,持續(xù)進(jìn)行六次實(shí)驗(yàn),最終得到從data1.csv到data6.csv共六個(gè)實(shí)驗(yàn)數(shù)據(jù)文件。
將六個(gè)csv文件全部復(fù)制至data文件夾,運(yùn)行Jupyter并新建文件“繪制data1實(shí)驗(yàn)數(shù)據(jù)的單個(gè)圖像.ipynb”。首先,導(dǎo)入plotly和pandas模塊:“import plotly”、“import pandas as pd”;點(diǎn)擊“運(yùn)行”按鈕后再將data1.csv中的數(shù)據(jù)讀取進(jìn)來(lái):“data1 = pd.read_csv('data/data1.csv')”,此時(shí)可通過(guò)“data1.head()”語(yǔ)句來(lái)查看該csv文件中的前五條數(shù)據(jù)內(nèi)容(包括Time和Distance標(biāo)題)。
接著,導(dǎo)入plotly模塊中的graph_objects:“import plotly.graph_objects as go”,建立變量line1并按照pltly的參數(shù)規(guī)則進(jìn)行賦值:“l(fā)ine1 = go.Scatter(x=data1['Time'],y=data1['Distance'],name='第一次實(shí)驗(yàn)')”;然后,建立變量fig并指定其畫(huà)圖對(duì)象為line1:“fig = go.Figure(line1)”,再進(jìn)行畫(huà)圖布局的更新:“fig.update_layout(title = "位移-時(shí)間圖像",xaxis_title = "時(shí)間:t(s)",yaxis_title = "位移:s(m)")”,包括圖像的標(biāo)題名稱(chēng)、X和Y兩個(gè)坐標(biāo)軸的顯示名稱(chēng)等信息;最后,通過(guò)語(yǔ)句“fig.show()”進(jìn)行圖像的繪制,點(diǎn)擊“運(yùn)行”后就看到下方出現(xiàn)了位移-時(shí)間圖像(如圖4)。
與上述操作類(lèi)似,新建文件“同時(shí)繪制data1-6實(shí)驗(yàn)數(shù)據(jù)的多個(gè)圖像.ipynb”,同樣是導(dǎo)入相關(guān)的模塊并增加多個(gè)變量進(jìn)行賦值,比如data2至data6、line2至line6,最后仍是通過(guò)語(yǔ)句“fig.show()”進(jìn)行多個(gè)圖像的同時(shí)繪制,得到了六組實(shí)驗(yàn)數(shù)據(jù)的對(duì)比顯示效果,均以不同顏色來(lái)區(qū)分(如圖5)。如果去除若干個(gè)無(wú)效實(shí)驗(yàn)數(shù)據(jù)的話(huà),這些圖像在一定程度上非常直觀(guān)地反映出了勻加速直線(xiàn)運(yùn)動(dòng)規(guī)律。
(1)嚴(yán)格而言,文中使用超聲波傳感器所測(cè)量并存儲(chǔ)的Dis變量值并非小車(chē)的直線(xiàn)運(yùn)動(dòng)位移數(shù)據(jù),而是它與目標(biāo)靶之間的直線(xiàn)距離值,也因此在最終畫(huà)出的位移-時(shí)間圖像中顯示的位移是隨時(shí)間增加而減小。如果將樹(shù)莓派連同超聲波傳感器在水平面上進(jìn)行180°轉(zhuǎn)向,并且將擋板從滑軌末端移至起始端,這樣才會(huì)獲取到真正的小車(chē)勻加速直線(xiàn)運(yùn)動(dòng)的各個(gè)位移數(shù)據(jù)。
(2)為了減小實(shí)驗(yàn)誤差,得到更為精準(zhǔn)的數(shù)據(jù)與圖像,可考慮將滑軌的長(zhǎng)度適當(dāng)增加,比如延長(zhǎng)至3米;同時(shí)再考慮對(duì)滑軌與水平面之間的夾角進(jìn)行更為精確的控制,而不是僅僅通過(guò)粗略地增減墊腳物的數(shù)量來(lái)控制斜面的傾角,最終繪制出的位移-時(shí)間圖像就更具規(guī)律性。
(3)對(duì)于同樣的滑軌,其實(shí)還可以考慮在其上均勻鋪設(shè)光滑絲綢、長(zhǎng)木塊條、粗糙毛巾等具有不同靜摩擦系數(shù)的各種物品,在固定或是改變斜面傾角的前提下進(jìn)行若干次小車(chē)的勻加速直線(xiàn)運(yùn)動(dòng)對(duì)比實(shí)驗(yàn),從而繪制出各相關(guān)物理量的不同圖像。
(4)在“勻加速直線(xiàn)運(yùn)動(dòng)數(shù)據(jù)采集.py”程序的循環(huán)結(jié)構(gòu)中,考慮到所使用的HC-SR04超聲波傳感器的測(cè)量頻率較低問(wèn)題,同時(shí)又要兼顧數(shù)據(jù)采樣的“密度”,因此設(shè)置每個(gè)循環(huán)周期中的時(shí)間間隔值為50ms,設(shè)置太小的話(huà)就更容易導(dǎo)致HC-SR04超聲波傳感器“反應(yīng)”不過(guò)來(lái),從而產(chǎn)生更多的無(wú)效數(shù)據(jù)。如果條件允許,可嘗試使用US-100超聲波傳感器來(lái)取代HC-SR04超聲波傳感器,程序中的50ms便可以設(shè)置得更小些(比如25ms),同樣情況下數(shù)據(jù)的采樣率就會(huì)提高一倍,最終生成的圖像就顯得更“圓滑”、更漂亮。
(5)實(shí)驗(yàn)數(shù)據(jù)的采集及圖像繪制的兩段Python代碼程序其實(shí)是可以進(jìn)行“合并”的,最終實(shí)現(xiàn)實(shí)驗(yàn)數(shù)據(jù)的獲取、存儲(chǔ)及作圖的“一條龍”式輸出,尤其是多種不同的實(shí)驗(yàn)情況對(duì)應(yīng)各自的數(shù)據(jù)存儲(chǔ)及圖像的動(dòng)態(tài)生成。
(6)在實(shí)驗(yàn)數(shù)據(jù)的采集時(shí),Python程序是在循環(huán)結(jié)構(gòu)中通過(guò)if語(yǔ)句判斷Dis的值是否在0.05米和1.1米之間((dis<=1.1000) and (dis>0.0500))來(lái)觸發(fā)數(shù)據(jù)的記錄的,如果在實(shí)驗(yàn)器材中增加光電門(mén)、霍爾傳感器或是電磁開(kāi)關(guān),可以更加“硬性”地減少無(wú)效數(shù)據(jù)的記錄。
(7)在“勻加速直線(xiàn)運(yùn)動(dòng)”實(shí)驗(yàn)器材的基礎(chǔ)上進(jìn)行一定的改裝,可以非??焖俚貙⑵洹白兩怼睘榇螯c(diǎn)計(jì)時(shí)器,通過(guò)超聲波傳感器與目標(biāo)靶間的無(wú)接觸式極小空氣阻力運(yùn)動(dòng)方式,極大地減小傳統(tǒng)電磁打點(diǎn)計(jì)時(shí)器的探針與紙帶間的打點(diǎn)摩擦阻力因素,實(shí)驗(yàn)數(shù)據(jù)自然會(huì)更加趨向于“理想狀態(tài)下”。
(8)如果增加第二個(gè)或更多個(gè)樹(shù)莓派進(jìn)行物聯(lián)網(wǎng)編程式的實(shí)驗(yàn)數(shù)據(jù)傳輸,實(shí)現(xiàn)不同實(shí)驗(yàn)探究小組間或與教師間的信息共享,課堂教學(xué)的實(shí)驗(yàn)操作效率會(huì)非常高,最終還可以在教師端根據(jù)各小組所傳輸?shù)亩嘟Mdata.csv文件進(jìn)行更多圖像的繪制對(duì)比與展示。
大家不妨一試。