林炳權(quán) 石皓宇 車宇 李鵬 梁飛翔 唐強(qiáng) 蔡志崗
關(guān)鍵詞 Arduino;教學(xué)改革;脈沖寬度調(diào)制技術(shù)(PWM 技術(shù));計算機(jī)編程
電子技術(shù)綜合設(shè)計實(shí)驗(yàn)作為光電信息專業(yè)、物理學(xué)專業(yè)的一門重要的綜合課程,在本科生經(jīng)過電子技術(shù)理論知識的學(xué)習(xí)后,通過硬件設(shè)計、通訊控制、軟件編程可以鍛煉學(xué)生的實(shí)驗(yàn)技巧從而全面地提升其電子技術(shù)綜合設(shè)計能力。中山大學(xué)物理學(xué)院開設(shè)的電子技術(shù)綜合設(shè)計實(shí)驗(yàn)課中,通過讓學(xué)生焊接安裝控制電路,控制兩個直流電機(jī)的輸入電壓,將經(jīng)過兩個不同轉(zhuǎn)速的偏心轉(zhuǎn)輪平面鏡的反射后的激光,形成特定形狀的激光圖案,通過改變兩個直流電機(jī)的電壓比,可以得到不同形貌的激光圖案[1]。通過焊接控制電路,學(xué)生可實(shí)現(xiàn)的幾個特定電壓比值的輸出電路,通過聲音采集模塊可以實(shí)現(xiàn)在幾個不同電壓比之間的切換。但上述方法會導(dǎo)致輸出圖案形式單一,并且焊接電路中由于單個壞掉的電子元器件導(dǎo)致的實(shí)驗(yàn)問題難以排查,給實(shí)驗(yàn)教學(xué)帶來一些不便。Arduino作為一款便捷靈敏、易于上手的開源電子開發(fā)平臺,具有操作簡便、功能豐富等特點(diǎn),已廣泛應(yīng)用于各種電路系統(tǒng)的開發(fā)[2-4]。將Arduino單片機(jī)引入電子技術(shù)綜合設(shè)計實(shí)驗(yàn)課程中,不僅可以拓展控制電路的開發(fā)設(shè)計方式,還可以通過引入其他的傳感器模塊讓學(xué)生在C語言的基礎(chǔ)上自行編程,豐富了實(shí)驗(yàn)教學(xué)內(nèi)容。通過引入Arduino單片機(jī)調(diào)控模式,將傳統(tǒng)焊接電子電路的內(nèi)容擴(kuò)增為“原理設(shè)計電路連接軟件編程”的連貫?zāi)J?,提高了學(xué)生的學(xué)習(xí)主動性和學(xué)習(xí)興趣,降低電子技術(shù)實(shí)驗(yàn)中電路焊接不當(dāng)引起的故障率,促進(jìn)教學(xué)質(zhì)量的提高。
1 實(shí)驗(yàn)原理
本文以Arduino單片機(jī)作為控制電路的核心部件,結(jié)合L293D芯片、紅外信號接收模塊、激光器、直流電機(jī)、偏心轉(zhuǎn)輪反射鏡等硬件,實(shí)現(xiàn)紅外信號通訊、PWM 信號輸出調(diào)控直流電機(jī)的轉(zhuǎn)速,從而改變激光圖案的形狀的目的。
1.1 Arduino簡介
Arduino是2005年意大利米蘭交互設(shè)計學(xué)院的老師開發(fā)設(shè)計的一款開源開放的電子技術(shù)創(chuàng)意平臺。Arduino包含硬件(各種不同類型的Arduino開發(fā)板)和軟件(用于代碼編譯的集成開發(fā)環(huán)境,Arduino IDE,以及第三方提供的圖形化編程環(huán)境如Mind+、Scratch3.0等)。由于Arduino的編程具有類似java、C++ 等常用編程語言的Processing/Wiring開發(fā)環(huán)境[4],入門簡單,功能多樣,價格低廉,被廣泛應(yīng)用于電子技術(shù)設(shè)計和互動產(chǎn)品開發(fā)等方面,受到廣大電子技術(shù)開發(fā)者的青睞。
Arduino UNO 開發(fā)板是目前最常用的Arduino開發(fā)板,以ATmega328 MCU 微控制器為核心,一般具有以下結(jié)構(gòu):
(1) 1個USB接口,可通過USB數(shù)據(jù)線與電腦實(shí)現(xiàn)通信,將Arduino IDE 程序上傳到開發(fā)板中,也可通過該口為開發(fā)板供電,電壓為5V;
(2) 1個電源插口,可使用DC電源為開發(fā)板供電,電壓為9V,使開發(fā)板具有驅(qū)動較大功率外部設(shè)備的能力;
(3) 14個數(shù)字I/O引腳,可進(jìn)行數(shù)字電信號的輸入和輸出,其中有6個引腳支持PWM 模式輸出;
(4) 6個模擬輸入端,可進(jìn)行模擬電信號的輸入;
(5) 一個16MHz的晶振,用于產(chǎn)生單片機(jī)所需的時鐘頻率;
(6) 1個復(fù)位按鈕、1個5V DC 輸出和1個3.3V DC輸出等其他接口[2]。
Arduino IDE是一款A(yù)rduino專用的程序編譯器,是Arduino的集成開發(fā)環(huán)境。它將單片機(jī)的寄存器封裝在核心庫中,是單片機(jī)程序代碼GCCAVR的二次封裝。開發(fā)者只需了解Arduino開發(fā)板中各端口的作用,編寫程序代碼并上傳到Arduino開發(fā)板中,不需要了解開發(fā)板內(nèi)部寄存器的設(shè)置方法,降低了Arduino開發(fā)板的使用難度。同時,Arduino也兼容GCCAVR,對于實(shí)時性要求較高的項目,開發(fā)者也可直接對寄存器進(jìn)行編程設(shè)置[3]。
正是由于Arduino IDE對單片機(jī)程序代碼的二次封裝,使得使用者不需要了解單片機(jī)的內(nèi)部硬件結(jié)構(gòu)和寄存器設(shè)置,只需要清楚每一個端口的作用就可以利用基礎(chǔ)的C語言知識編寫程序代碼并讓Arduino實(shí)現(xiàn)想要的功能。
以Arduino中自帶的閃爍程序?yàn)槔凑杖鐖D2所示的代碼上傳到Arduino UNO 板上,并將13號引腳連接LED正極,LED負(fù)極與GND引腳連接,就可以看到燈泡亮暗交替閃爍。通過如上簡單的程序,就可以實(shí)現(xiàn)利用Arduino電路板控制電子元器件的目的。
除此之外,Arduino開發(fā)板可連接其他輸入和輸出模塊,實(shí)現(xiàn)更多的功能設(shè)計。開發(fā)者在Arduino IDE中編寫程序并上傳到Arduino開發(fā)板中,通過數(shù)字輸入接口或模擬輸入端連接聲音傳感器、紅外接收模塊、超聲波接收模塊等輸入元件,進(jìn)行信號接收、動作采集等操作,并通過數(shù)字輸出接口或PWM 輸出端連接直流電機(jī)、蜂鳴器、顯示屏等輸出元件,進(jìn)行信號發(fā)送、動作輸出等操作,達(dá)到感知外界、影響外界的目的[4,5]。
Arduino通過計數(shù)器與寄存器實(shí)現(xiàn)PWM 輸出。計數(shù)器按照一定的規(guī)則在最低值與最高值之間重復(fù)計數(shù),當(dāng)計數(shù)器的值與比較寄存器中設(shè)定的值相同時,切換數(shù)字輸出的邏輯電平,實(shí)現(xiàn)對高電平輸出時間的調(diào)制[7]。
Arduino UNO 開發(fā)板的3、5、6、9、10、11號數(shù)字I/O 引腳支持PWM 輸出,3、9、10、11號引腳輸出的PWM 信號頻率約為490Hz,5、6號引腳輸出的PWM 信號頻率約為980Hz。analogWrite(pin,value)是Arduino IDE中控制PWM 輸出的專用函數(shù),pin是PWM 輸出引腳的編號,value是輸出的脈沖信號的占空比大小,取值范圍為0~255,對應(yīng)輸出的模擬電壓值為value/255 ×5V。
2 實(shí)驗(yàn)介紹
2.1 傳統(tǒng)電路焊接實(shí)驗(yàn)
傳統(tǒng)的實(shí)驗(yàn)過程采用時鐘定時觸發(fā)或音控觸發(fā)的方式,學(xué)生焊接控制電路板,實(shí)現(xiàn)對激光圖案的定時變換或音控變換,圖4為控制電路流程示意圖。
定時觸發(fā)模式采用555多諧振蕩電路輸出周期可調(diào)脈沖信號;音控觸發(fā)模式通過放大電路和整形電路使聲音信號形成穩(wěn)定的脈沖信號。在方波脈沖信號上升沿的觸發(fā)下,十進(jìn)制計數(shù)器4017循環(huán)輸出Q0、Q1、Q2、Q3四路高電平,再經(jīng)分壓電路獲得四組不同的工作電壓,進(jìn)而通過反轉(zhuǎn)電路和驅(qū)動電路控制兩個直流電機(jī)的轉(zhuǎn)向和不同的轉(zhuǎn)速比。激光經(jīng)過兩個電機(jī)上的偏心反射鏡的連續(xù)反射,在白屏上形成不同的激光圖案[1,8]。
實(shí)驗(yàn)要求學(xué)生焊接復(fù)雜的控制電路板,只能實(shí)現(xiàn)幾個特定電壓比值的輸出電路,且電路難以采用其他信號觸發(fā)模式。由于單個壞掉的電子元器件導(dǎo)致的實(shí)驗(yàn)問題難以排查,實(shí)驗(yàn)耗時長、輸出圖案形式單一以及實(shí)驗(yàn)過程中存在的虛焊等問題導(dǎo)致該實(shí)驗(yàn)擴(kuò)展性低。
2.2 基于Arduino改進(jìn)后的實(shí)驗(yàn)
本文引入Arduino對實(shí)驗(yàn)途徑進(jìn)行擴(kuò)展,使實(shí)驗(yàn)更具創(chuàng)新性。圖5是改進(jìn)后的實(shí)驗(yàn)的示意圖。其控制過程如下:1)信號模塊:摁下紅外遙控器發(fā)出紅外信號,Arduino通過紅外信號接收模塊接收讀取到電信號,不同的按鍵對應(yīng)到Arduino中不同的電信號;2)計算模塊:Arduino根據(jù)接收到的紅外信號計算調(diào)控出對應(yīng)電壓比的PWM 模擬電壓信號,再經(jīng)過L293D 芯片等比放大并驅(qū)動兩個直流電機(jī);3)硬件模塊:激光經(jīng)過兩個不同轉(zhuǎn)速的偏心旋轉(zhuǎn)鏡面的連續(xù)反射,在屏幕上形成特定的激光圖案。改變兩個電機(jī)的轉(zhuǎn)速比可得到不同形狀的激光圖案。
2.2.1 紅外信號輸入
Arduino單片機(jī)可與時鐘傳感器、聲音傳感器、光敏電阻傳感器等多種輸入模塊連接,實(shí)現(xiàn)多種信號輸入途徑。本文采用紅外信號輸入實(shí)現(xiàn)對實(shí)驗(yàn)裝置的控制。
圖5的右下角部分為紅外信號接收模塊與遙控器。將紅外信號接收模塊的輸出接口(即模塊上的OUT引腳)與Arduino UNO 的7號引腳連接,用于傳輸信號,并通過連接Arduino UNO的5V輸出端口為模塊提供工作電壓。當(dāng)接收到紅外遙控器發(fā)出的紅外信號時,接收模塊內(nèi)置的程序?qū)t外信號進(jìn)行解調(diào)、編碼,輸出六位十六進(jìn)制編碼。
在Arduino IDE庫管理器中下載安裝IRremote庫文件,通過調(diào)用enableIRIn()函數(shù)可觸發(fā)模塊接收紅外信號,再通過調(diào)用decode()函數(shù)可將紅外信號解調(diào)、編碼為相應(yīng)的六位十六進(jìn)制編碼[9]。
2.2.2 L293D芯片
由于Arduino單片機(jī)的輸出電壓最高為5V,不足以驅(qū)動12V 直流電機(jī),本文結(jié)合L293D芯片實(shí)現(xiàn)直流電機(jī)驅(qū)動電路。圖6為L293D芯片的原理圖。16號引腳連接5V 電源,為芯片的調(diào)控電路提供工作電壓;8號引腳連接12V 電源,為芯片的驅(qū)動電路提供工作電壓。2、7、10、15號引腳為控制信號輸入引腳;3、6、11、14號引腳為驅(qū)動信號輸出引腳,用于輸出信號以驅(qū)動電機(jī)工作。1、9號引腳為使能引腳,當(dāng)使能引腳置于高電平時,相應(yīng)的輸入輸出引腳被激活啟用,輸出與控制信號同相的驅(qū)動電壓[10]。
將電機(jī)1的兩端連接L293D芯片的3、6號輸出引腳。相應(yīng)的2、7號輸入引腳中的一個引腳置于高電平,另一個引腳置于低電平,兩個輸出引腳的輸出電壓形成電勢差,驅(qū)動電機(jī)轉(zhuǎn)動。當(dāng)不同的引腳被置于高電平時,電勢差極性相反,電機(jī)轉(zhuǎn)向改變。
電機(jī)2的一端連接L293D 芯片的11號輸出引腳,另一端接地。當(dāng)10號輸入引腳置于高電平時,14號輸出引腳輸出高電平電壓,形成電勢差,驅(qū)動電機(jī)轉(zhuǎn)動。
將PWM 模擬信號輸入1、9號使能引腳,相應(yīng)的輸出引腳輸出相同占空比、峰值較高的PWM模擬信號,實(shí)現(xiàn)電機(jī)兩端電壓值的改變。
2.2.3 程序設(shè)計
在Arduino IDE上編寫程序,根據(jù)輸入的紅外信號調(diào)控PWM 模擬信號的輸出,程序設(shè)計如圖7所示。
程序開始時,定義引腳、轉(zhuǎn)速、轉(zhuǎn)向等變量,設(shè)定引腳的模式。使用enableIRIn()函數(shù)觸發(fā)紅外信號接收模塊接收信號,通過decode()函數(shù)判斷是否成功接收到紅外信號,若接收到紅外信號,則將接收到的紅外信號解調(diào)、編碼為六位十六進(jìn)制編碼并賦值給變量results,并在Arduino IDE 的串口監(jiān)視器中顯示紅外信號的編碼和編碼位數(shù);若未接收到信號,則各變量保持不變,Arduino輸出信號不變。
接收到紅外信號后,使用if-else語句將紅外信號編碼與數(shù)字0~9、符號+、-對應(yīng),并賦值到變量Input。根據(jù)變量Input的值的不同,改變轉(zhuǎn)速speed、轉(zhuǎn)向Direction等變量。
為實(shí)現(xiàn)對兩個電機(jī)轉(zhuǎn)速的分別調(diào)控,定義變量channal,當(dāng)按下按鍵“CH+”時,channal=1,對電機(jī)1進(jìn)行調(diào)控;當(dāng)按下按鍵“CH-”時,channal=2,對電機(jī)2進(jìn)行調(diào)控。
為實(shí)現(xiàn)多組不同電壓比值的輸出,定義轉(zhuǎn)速變量speed調(diào)控電機(jī)轉(zhuǎn)速,將數(shù)字按鍵0~9對應(yīng)speed變量由0~255等間距賦值;
由于電機(jī)1正轉(zhuǎn)、電機(jī)2反轉(zhuǎn)時形成的激光圖案與電機(jī)1反轉(zhuǎn)、電機(jī)2正轉(zhuǎn)時形成的激光圖案一致,在程序中僅定義方向變量Direction調(diào)控電機(jī)1的轉(zhuǎn)向,保持電機(jī)2的轉(zhuǎn)向不變。
將上述變量作為函數(shù)參數(shù),調(diào)用digitalWrite()和analogWrite(pin,value)函數(shù),改變相應(yīng)輸出引腳的電平狀態(tài)和PWM 信號的占空比,控制每個電機(jī)的轉(zhuǎn)速和轉(zhuǎn)向。
3 結(jié)果分析
將程序上傳至Arduino中,通過遙控器按鍵“CH+”“CH-”選擇需要控制的電機(jī),再通過數(shù)字按鍵0~9,設(shè)定輸出引腳的模擬電壓值,得到不同的輸出電壓,經(jīng)L293D 芯片驅(qū)動電機(jī)以不同的轉(zhuǎn)速或轉(zhuǎn)向轉(zhuǎn)動。激光經(jīng)由特定轉(zhuǎn)速比的兩個直流電機(jī)攜帶的偏心反射鏡的連續(xù)反射,在白屏上形成特定的激光圖案。改變兩個直流電機(jī)的不同轉(zhuǎn)速比,可以得到不同形狀的激光圖案。
以電壓比的正負(fù)區(qū)分電機(jī)轉(zhuǎn)向的改變,分別設(shè)定兩個直流電機(jī)的電壓比為-9∶5,-3∶2,3∶2,在白屏上獲得相應(yīng)的激光圖案,如圖11左側(cè)所示。
為了驗(yàn)證實(shí)驗(yàn)設(shè)計的準(zhǔn)確性,我們還進(jìn)行了理論上的計算,并使用MATLAB軟件對激光圖案的形成過程進(jìn)行仿真模擬,理論分析過程如下:
實(shí)驗(yàn)裝置中,電機(jī)上的偏心反射鏡所在平面的法線方向與電機(jī)轉(zhuǎn)軸不平行,而是存在一個3°的夾角。圖8中電機(jī)的兩個反射鏡面位置為電機(jī)轉(zhuǎn)動下反射鏡面的兩個極端位置,成一個6°的夾角。點(diǎn)狀激光直接照射在直流電機(jī)上的偏心反射鏡上,由于反射鏡所在平面的法線方向與電機(jī)轉(zhuǎn)軸方向存在夾角,故當(dāng)電機(jī)轉(zhuǎn)動時,反射的點(diǎn)狀激光不是固定的一個方向,而是成一個圓錐面,在白屏上呈現(xiàn)為一個圓形或橢圓。經(jīng)第一個反射鏡反射的激光照射在第二個反射鏡上,發(fā)生第二次反射,在白屏上呈現(xiàn)的圖像為兩個圓形軌跡運(yùn)動的疊加合成[11]。
在白屏上建立直角坐標(biāo)系,如圖9所示。以水平方向?yàn)闄M坐標(biāo)、豎直方向?yàn)榭v坐標(biāo),記經(jīng)過兩次反射后,在白屏上顯示的激光點(diǎn)的橫坐標(biāo)為x,縱坐標(biāo)為y,則
其中,第一次反射形成的圓形軌跡的半徑為R1,角速度為ω1,第二次反射形成的圓形軌跡的半徑為R2,角速度為ω2。
利用MATLAB軟件對激光圖案的形成過程進(jìn)行仿真實(shí)驗(yàn),代碼程序如下。
修改MATLAB代碼中的兩個轉(zhuǎn)速變量的比值為-9∶5、-3∶2、3∶2,并適當(dāng)調(diào)節(jié)激光時間,運(yùn)行程序,分別得到相應(yīng)的仿真激光圖案,如圖10右側(cè)所示。
從實(shí)驗(yàn)結(jié)果與仿真結(jié)果可以看出,當(dāng)兩個電機(jī)的轉(zhuǎn)向相反且轉(zhuǎn)速比為9∶5和3∶2時,激光圖案呈現(xiàn)花瓣形狀,隨著電壓比的增大,“花瓣”越來越窄且多;當(dāng)兩個電機(jī)的轉(zhuǎn)向一致且轉(zhuǎn)速比為3∶2時,激光圖案為心形線繞一點(diǎn)旋轉(zhuǎn)而成。
需要指出的是,實(shí)驗(yàn)過程中由于兩個電機(jī)轉(zhuǎn)動的初始相位差的存在,激光圖案會繞中心緩慢旋轉(zhuǎn)。因此在實(shí)驗(yàn)過程中,實(shí)際激光圖案是通過手機(jī)拍照,利用延長手機(jī)的快門時間實(shí)現(xiàn)的;仿真得到的激光圖案是通過在畫布上同時繪制激光點(diǎn)的軌跡方程實(shí)現(xiàn)的。由于手機(jī)設(shè)置的快門時間較長,而仿真實(shí)驗(yàn)繪制的激光圖案為一個周期內(nèi)激光點(diǎn)的運(yùn)動軌跡,故在兩個直流電機(jī)轉(zhuǎn)速比為9∶5且轉(zhuǎn)動方向相反時,實(shí)驗(yàn)觀察到的圖形“花瓣”數(shù)目要明顯多于Matlab模擬的實(shí)驗(yàn)結(jié)果。但是實(shí)際觀測到的激光圖案與仿真結(jié)果保持一致,由于圖案會圍繞中心旋轉(zhuǎn)。在另外兩個轉(zhuǎn)速比下,實(shí)際激光圖案也是在圍繞著中心旋轉(zhuǎn)的(這一點(diǎn)從實(shí)際觀測到的激光圖并未構(gòu)成閉合曲線也可以明顯看出)。
實(shí)際實(shí)驗(yàn)結(jié)果與仿真實(shí)驗(yàn)結(jié)果一致。至此,我們借助Arduino中PWM 調(diào)制技術(shù),實(shí)現(xiàn)了對激光圖案形狀的紅外遙控控制。
4 結(jié)語
以Arduino單片機(jī)為核心,通過“原理設(shè)計硬件連接軟件編程”實(shí)現(xiàn)了用PWM 調(diào)制方式控制激光圖案的電子技術(shù)綜合設(shè)計實(shí)驗(yàn)內(nèi)容,豐富了傳統(tǒng)的電子實(shí)驗(yàn)教學(xué)。通過調(diào)節(jié)占空比,控制輸出電壓進(jìn)而生成多種不同的PWM 信號,調(diào)節(jié)出多種不同的激光圖案。該實(shí)驗(yàn)設(shè)計方案通過利用Arduino單片機(jī)中脈沖調(diào)制技術(shù),通過讓學(xué)生親自動手設(shè)計硬件連接、電路設(shè)計以及軟件編程,在充分學(xué)習(xí)了電子技術(shù)的基礎(chǔ)上自行設(shè)計出基于PWM 調(diào)制控制的激光圖案系統(tǒng),能夠完整地培養(yǎng)學(xué)生的電子技術(shù)綜合設(shè)計和應(yīng)用能力。基于開源系統(tǒng)的Arduino單片機(jī)實(shí)驗(yàn)很適合本科生,結(jié)合物理測量和光電技術(shù),開展各種實(shí)際應(yīng)用。