罗亮 陈红 卢解卿
Python是一种面向对象、解释型计算机程序设计语言,它的设计哲学是优雅、明确、简单。因为其开源免费的精神与简单易学的特点,自1989年问世以来,尤其是2004年以后,Python的使用率呈线性增长并被TIOBE编程语言排行榜评为2010年度语言。
Arduino是一款便捷灵活、方便上手的开源电子原型平台,它包含可以用来做电路连接的Arduino电路板和配套的程序开发环境(Arduino IDE)。基于Arduino的项目,可以只包含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取得。