本實驗需要一個Arduino開發板,兩個GQY的光電門,一臺安裝了 Flash cs3和Arduino軟件的計算機。
首先,必須了解光電門連接口幾根連接線的具體作用?梢允褂檬静ㄆ、萬用表等進行測試。最后發現,雖然連接線中有六根線,但是只有三根起作用,分別是電源輸入的兩根線和信號輸出線。而且光電門的原理也非常簡單,當有物體擋住光電門時,信號輸出線便為高電平,否則為低電平。
接著,將Arduino的電壓輸入端連接到光電門的電源輸入線,將光電門的信號輸出線連接到Arduino的任意一個信號輸入端口。然后對Arduino進行編程如下(只有主要程序段,如有需要可以聯系筆者):
……
time = micros(); //得到此刻Arduino板子上的時間time
Serial.print(duration); //發送時間duration
Serial.print("t"); //發送字母t,用來分隔兩個時間
Serial.print(time); //發送板子時間time
……
可以看到Arduino端的程序非常簡單,它的作用就是發送兩個時間,一個是光電門本次被擋光的時間、另一個是光電門結束被擋光時Arduino板上的時刻。
接下來編寫Flash端的程序,因為程序代碼過長,在這里僅敘述其基本原理而不再一一寫出。
先讀取存儲在Serproxy的xml格式的數據,其實就是來自于Arduino發送的字母串(兩個時間以及中間的字母t都會被認為一整串字母),這個字母串在每次接收Arduino的數據時都會更新。Flash讀取后先對字母串進行處理,分離出兩個時間,并將它們轉換為數值形式。然后利用Flash里的setInterval(updateTimer, 10)每隔10ms運行一下主函數updateTimer。
具體要用光電門來進行什么樣的實驗、要用Flash進行一些什么樣的運算就需要編寫主函數updateTimer來實現了。例如僅僅需要實現一個將光電門擋光時間顯示出來的課件,就只需要將時間間隔數值在一個動態字符框內顯示出來即可,因為主函數每10ms就會執行一次,所以在課件中顯示出來的也幾乎就是實時的數據。
在Flash端還必須設置一些簡單的存儲數據的功能,但是因為Flash在單機運行的時候并不支持將數據輸出到其它文檔,所以這里只將這些數據存儲在一個多行顯示的字符框內。具體的界面如圖所示,每按一次保存按鈕,便會在數據框內記錄下此次實驗的兩個質量值和一個測得的加速度值。當實驗完成后,將數據框內的數據全部選中,然后復制到excel文檔中,利用excel的圖像處理功能來解決最后圖像繪制的任務(關于excel中如何處理數據,筆者在這里不再介紹,可以參考上一個實驗中的處理)。