羅亮 陳紅 盧解卿
Python是一種面向?qū)ο?、解釋型?jì)算機(jī)程序設(shè)計(jì)語(yǔ)言,它的設(shè)計(jì)哲學(xué)是優(yōu)雅、明確、簡(jiǎn)單。因?yàn)槠溟_源免費(fèi)的精神與簡(jiǎn)單易學(xué)的特點(diǎn),自1989年問世以來,尤其是2004年以后,Python的使用率呈線性增長(zhǎng)并被TIOBE編程語(yǔ)言排行榜評(píng)為2010年度語(yǔ)言。
Arduino是一款便捷靈活、方便上手的開源電子原型平臺(tái),它包含可以用來做電路連接的Arduino電路板和配套的程序開發(fā)環(huán)境(Arduino IDE)?;贏rduino的項(xiàng)目,可以只包含Arduino,也可以包含Arduino和其他一些在PC上運(yùn)行的軟件,如Processing、VB、Python等。
當(dāng)我們使用Python語(yǔ)言通過串口控制Arduino讀取設(shè)備狀況并實(shí)施控制的時(shí)候,就構(gòu)成了上位機(jī)下位機(jī)系統(tǒng)。安裝有Python之類軟件實(shí)施控制的計(jì)算機(jī)為上位機(jī),能夠控制設(shè)備并獲取設(shè)備狀況的Arduino為下位機(jī),它們相互之間可以通過串行口或無線的方式進(jìn)行通訊,進(jìn)而實(shí)現(xiàn)控制與被控制。
安裝Python
Python主要分為兩大類,即Python2和Python3。Python2是目前應(yīng)用最廣泛的一個(gè)版本,最新版本號(hào)為2.7.11,適合初學(xué)者學(xué)習(xí)使用。Python3相對(duì)于Python2而言,有很多接口發(fā)生了變化并且可用的第三方庫(kù)不多且不成熟,雖然它代表以后的發(fā)展趨勢(shì),但還是不建議初學(xué)者使用。Python下載地址為:https://www.python.org/downloads/。本例是下載了2.7.11版本,文件名為python-2.7.11.msi,安裝在文件夾“C:\Python27”,安裝過程中注意在如圖1的設(shè)置中添加可執(zhí)行文件搜索路徑。
安裝Arduino
Arduino主控板部分可在淘寶網(wǎng)上通過關(guān)鍵詞“arduino uno”“arduino mini”“arduino mega”搜索購(gòu)買。Arduino集成開發(fā)環(huán)境(Arduino IDE)可訪問“https://www.arduino.cc/en/Main/Software”,根據(jù)需要下載安裝,最新版本為1.6.7,歷經(jīng)Arduino 00xx、Arduino 1.0.x、1.5.x BETA、Arduino 1.6.x四個(gè)系列的版本。本例硬件使用了Arduino Uno,軟件使用了Arduino1.5.8版本。軟件安裝在文件夾“C:\arduino158”,當(dāng)Arduino Uno主控板與計(jì)算機(jī)通過USB連接后,需要安裝驅(qū)動(dòng),驅(qū)動(dòng)文件默認(rèn)在文件夾“C:\arduino158\drivers”,安裝完成后,在設(shè)備管理器中可以看到Arduino Uno占用的串行端口號(hào),如圖2所示。
安裝Pyserial
Pyserial是協(xié)助Python控制串口通訊的第三方庫(kù)。pyserialv2.7下載地址為:http://sourceforge.net/projects/pyserial/,pyserialV3.0下載地址為:https://github.com/pyserial/pyserial。
若非Windows 64位操作系統(tǒng),下載pyserial-2.7.win32.exe直接安裝即可,否則需要使用pyserial-2.7.tar.gz文件手動(dòng)進(jìn)行安裝。安裝方法為:將pyserial-2.7.tar.gz解壓至C盤根目錄后,運(yùn)行CMD命令,進(jìn)入文件夾“C:\ pyserial-2.7”,執(zhí)行安裝命令:“python setup.py install”。具體執(zhí)行過程可參考圖3的步驟。
啟動(dòng)Arduino IDE作為下位機(jī)進(jìn)行通訊調(diào)試
當(dāng)Arduino主控板連上PC主機(jī)并安裝好相應(yīng)的驅(qū)動(dòng)程序后,我們使用鼠標(biāo)雙擊Arduino安裝文件夾中的arduino.exe可以達(dá)到啟動(dòng)Arduino集成編輯環(huán)境的目的。
啟動(dòng)完成后,可通過菜單“file→preferences”設(shè)置中文環(huán)境,通過菜單“工具→板”設(shè)置“Arduino Uno”,“工具→端口”設(shè)置“Com3(Arduino Uno)”。如表1所示,輸入相關(guān)程序代碼后,點(diǎn)擊“上傳”按鈕燒錄程序至Arduino主控板中。啟用串口監(jiān)視器后,根據(jù)程序代碼,輸入字符o,點(diǎn)擊按鈕“發(fā)送”可以發(fā)現(xiàn)Arduino主控板與數(shù)字引腳13相連的Led燈會(huì)變亮,輸入字符c,點(diǎn)擊按鈕“發(fā)送”可以發(fā)現(xiàn)Arduino主控板與數(shù)字引腳13相連的Led燈會(huì)停止發(fā)光。具體程序代碼的功能,請(qǐng)查看表1中相應(yīng)的注釋。
啟動(dòng)Python并進(jìn)行初步通訊調(diào)試
安裝完成Python運(yùn)行與編輯環(huán)境及涉及串口通訊的第三方庫(kù)pyserial后,通過“開始→所有程序→Python 2.7→IDLE(Python GUI)”或“Python(command line)”直接啟動(dòng)Python,亦可以找到Python安裝文件夾下的“python.exe”雙擊啟動(dòng)。啟動(dòng)完成后,在命令提示符“>>>”下依次輸入import serial、ser=serial.Serial(2)、ser.write(“o”)、ser.write(“c”)等命令就可以實(shí)現(xiàn)對(duì)Arduino主板上與數(shù)字引腳13相連Led燈的控制,ser.close()關(guān)閉打開的串行口,exit()退出Python運(yùn)行環(huán)境。
注意:本例Arduino使用串行口3,故serial.Serial()中的參數(shù)為2,參數(shù)始終比串行口序號(hào)小1。
有關(guān)pyserial的詳細(xì)用法,可以參考http://pythonhosted.org/pyserial/。以下的例子是先定義串行口ser,然后再對(duì)串行口ser進(jìn)行配置。
趣味拓展:隨論壇在線人數(shù)變化的燈
我們?cè)谠L問論壇時(shí),經(jīng)常會(huì)看到類似的統(tǒng)計(jì)數(shù)據(jù):。結(jié)合Python和Arduino各自擅長(zhǎng)的功能,可以輕松做到讀取在線人數(shù)并根據(jù)在線人數(shù)多少?zèng)Q定亮燈情況。表2所示代碼是簡(jiǎn)化情況,我們可以根據(jù)需要修改Python及相應(yīng)的Arduino程序,讓亮燈更加人性化。
尤其應(yīng)引起注意的是:①字符編碼問題。安裝chardet模塊,可以準(zhǔn)確知道網(wǎng)絡(luò)中獲取字符的編碼,從而正確處理。②多空一行。Python構(gòu)成語(yǔ)句塊的代碼需要多增加一個(gè)空行。詳見第18行代碼。③適當(dāng)延時(shí)。在程序執(zhí)行方式下,串行口對(duì)象ser來不及初始化,就迅速執(zhí)行后面代碼,導(dǎo)致無效write,當(dāng)加了第13行代碼后,則一切正常。④確保論壇首頁(yè)有“總計(jì)”“人在線”相關(guān)關(guān)鍵字,若無,請(qǐng)根據(jù)實(shí)際情況修改。
后記
Python第三方庫(kù)——pyserial提供了豐富的函數(shù)對(duì)串行口進(jìn)行操作,從而使Phthon能夠很方便地對(duì)Arduino進(jìn)行通訊。
在編寫程序代碼進(jìn)行控制的過程中,要注意Python、Arduino使用同樣的通訊速率并且不要太大,建議都使用9600,否則容易出現(xiàn)數(shù)據(jù)錯(cuò)誤。
經(jīng)過試驗(yàn),若上位機(jī)PC、下位機(jī)Arduino均安裝藍(lán)牙,亦可以使用pyserial進(jìn)行無線通訊達(dá)到控制的目的,有興趣的同仁可以自行嘗試。
Python的GUI編程似乎并不容易上手,其內(nèi)建的Tkinter只能進(jìn)行簡(jiǎn)單GUI布局,若要做到VB集成開發(fā)環(huán)境所見即所得的效果,估計(jì)還需要安裝wxPython、Jython之類第三方庫(kù)才能做到。圖4是使用Python的Tkinter構(gòu)建的控制Arduino主控板Led燈GUI界面,相關(guān)程序可聯(lián)系linkall@sina.com取得。