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