树莓派使用pyFirmata控制Arduino
尽管树莓派和Arduino是两种截然不同的硬件,但它们也被认为是两个相互竞争的开源硬件平台,两种硬件平台都非常流行,同时都有很强大的社区支持。今天我们将尝试将两者结合起来,如果你有Arduino和Raspberry pi,这篇文章将向你展示如何使用树莓派和Python来控制Arduino。
我们将使用 PyFirmata 软件,通过树莓派上的python脚本向Arduino发出指令。PyFirmata是一个预先编译好的python程序库,它可以让任何计算机上的python脚本与Arduino之间进行串口通信。这个python库可以让用户访问Arduino上的任何针。下面我们将利用这个库,使用树莓派来控制Arduino。
需准备的前提条件
- 树莓派并安装Raspbian OS系统;
- Arduino Uno或其它的Arduino板;
- Arduino USB数据线
- LED
在本文中,我使用的HDMI接口的树莓派显示器。如果你没有单独的树莓派显示器,你可以使用SSH客户端(Putty)或VNC服务器通过笔记本或计算机连接到树莓派来进行调试。
通过树莓派在Arduino上安装PyFirmata
要通过树莓派上传PyFirmata固件到Arduino上,我们必须在树莓派上安装Arduino IDE。可按照以下步骤安装:
一、将树莓派连接到互联网。打开命令终端,输入以下命令按回车:
sudo apt-get -y install arduino python-serial mercurial
几分钟后,这个命令将在树莓派中安装Arduino IDE。
二、现在,我们将通过github来安装pyFirmata文件:
git clone https://github.com/tino/pyFirmata
然后运行以下命令:
cd pyFirmata sudo python setup.py install
三、我们已经安装了所有必需的文件。
现在,用USB数据线把Arduino电路板和树莓派连接起来,通过在树莓派命令终端窗口中输入Arduino来启动Arduino IDE。
四、然后输入lsusb命令来检查Arduino是否与树莓派正确连接。在Arduino IDE中,点击“Tools”选择你的主板型号和串口端口号。
五、上传PyFirmata固件,通过点击 File -> Examples -> Firmata -> Standard Firmata,然后点击上传按钮。如下所示:
如果已经成功地在Arduino电路板上安装了pyFirmata固件,我们就可以通过树莓派来控制Arduino了。下面我们将通过在树莓派中编写python代码来控制Arduino上的LED灯闪烁。
Python代码释义
对于代码部分,最好去阅读pyFirmata的说明文档,这样可以更好地理解代码。下面我们将使用pyFirmata函数来编写代码。你可以通过以下链接查看pyFirmata的说明文档。
http://pyfirmata.readthedocs.io/en/latest/pyfirmata.html
在树莓派中打开文本编辑器,输入:
import pyfirmata
定义Arduino上连接LED的针脚
led_pin = 8
使用 pyfirmata.Arduino() 函数指定在Arduino电路板上使用的串口名称,作为 board 变量的实例:
board = pyfirmata.Arduino("/dev/ttyACM0") print "Code is running”
在while循环中,使用board.digital[].write()函数板来控制LED针脚的打开和关闭,并通过board.pass_time()函数来控制延迟时间。
while True: board.digital[led_pin].write(0) board.pass_time(1) board.digital[led_pin].write(1) board.pass_time(1)
代码准备好后,将代码保存为.py扩展名的文件。如:LED.py。然后再次确认树莓派和Arduino之间的USB数据线连接正常,在树莓派上打开命令终端,输入python LED.py,这样代码就会在Arduino电路板上运行了。现在,你可以看到Arduino电路板上的LED开始闪烁了。下面给出了使用pyFirmata编写的完整代码。
在Arduino上使用pyFirmata的完整代码
下面给出了LED控制代码,让大家更熟悉pyFirmata函数。这段代码和前面的代码一样,你必须使用两个for循环,一个用于增加LED亮度,另一个用于降低LED亮度。在代码中,我们将pyFirmata 库定义针脚的方式与常规定义方式都进行了测试,如: led = board.get_pin(‘d:8:p’) ,这里的“d”代表数字针。详见pyFirmata的说明文档。下面是完整的Python代码,供参考:
1、LED闪烁
import pyfirmata led_pin = 8 board = pyfirmata.Arduino("/dev/ttyACM0") while True: board.digital[led_pin].write(0) board.pass_time(1) board.digital[led_pin].write(1) board.pass_time(1)
2、LED淡入淡出
import time import pyfirmata delay = 0.3 brightness = 0 board = pyfirmata.Arduino("/dev/ttyACM0") led = board.get_pin('d:8:p') while True: # increase for i in range(0, 10): brightness = brightness + 0.1 print "Setting brightness to %s" % brightness led.write(brightness) board.pass_time(delay) # decrease for i in range(0, 10): print "Setting brightness to %s" % brightness led.write(brightness) brightness = brightness - 0.1 board.pass_time(delay)