树莓派使用pyFirmata控制Arduino

尽管树莓派和Arduino是两种截然不同的硬件,但它们也被认为是两个相互竞争的开源硬件平台,两种硬件平台都非常流行,同时都有很强大的社区支持。今天我们将尝试将两者结合起来,如果你有Arduino和Raspberry pi,这篇文章将向你展示如何使用树莓派和Python来控制Arduino。

树莓派通过Python控制Arduino

 

我们将使用 PyFirmata 软件,通过树莓派上的python脚本向Arduino发出指令。PyFirmata是一个预先编译好的python程序库,它可以让任何计算机上的python脚本与Arduino之间进行串口通信。这个python库可以让用户访问Arduino上的任何针。下面我们将利用这个库,使用树莓派来控制Arduino。

需准备的前提条件

  1. 树莓派并安装Raspbian OS系统;
  2. Arduino Uno或其它的Arduino板;
  3. Arduino USB数据线
  4. 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。

树莓派运行Arduino IDE

四、然后输入lsusb命令来检查Arduino是否与树莓派正确连接。在Arduino IDE中,点击“Tools”选择你的主板型号和串口端口号。

五、上传PyFirmata固件,通过点击 File -> Examples ->  Firmata -> Standard Firmata,然后点击上传按钮。如下所示:

通过Arduino ide上传PyFirmat

如果已经成功地在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)