通过pyFirmata实现树莓派控制Arduino

作者:Rishabh Jain
编译:Tony

树莓派控制Arduino

尽管就其应用程序和结构而言,Raspberry Pi和Arduino是两种不同的硬件,但是它们都被认为是两个相互竞争的开源硬件平台。他们俩都有非常强大的社区和支持。今天,我们将稍作更改,并向您展示如何利用它们。如果您同时拥有Arduino和Raspberry pi板,那么本文将向您展示如何使用Raspberry pi和Python控制Arduino

我们将使用PyFirmata固件通过Raspberry Pi python脚本向Arduino发送命令。PyFirmata基本上是python程序的预构建库包,可以将其安装在Arduino中,以允许任何计算机上的python脚本与Arduino之间进行串行通信。这个python包可以访问Arduino上的任何引脚。因此,这里我们将使用Raspberry pi在Arduino上运行python程序。

因此,在本教程中,我们将利用该库,并在Arduino开发板中使用它来通过Raspberry Pi控制Arduino

要求

  • 安装了Raspbian操作系统的Raspberry Pi
  • Arduino Uno或任何其他Arduino开发板
  • Arduino USB线
  • 发光二极管

在本教程中,我将通过HDMI电缆使用外部监视器与Raspberry Pi连接。如果没有监视器,则可以使用SSH客户端(Putty)或VNC服务器通过笔记本电脑或计算机连接到Raspberry pi。

使用Raspberry Pi在Arduino中安装PyFirmata

要在Arduino中上传PyFirmata固件,我们必须在Raspberry Pi中安装Arduino IDE。请按照以下步骤进行安装:

  • **步骤1:**将Raspberry Pi连接到互联网。打开命令终端并键入以下命令,然后按Enter
sudo apt-get -y install arduino python-serial mercurial

等待几分钟,这将需要一些时间。该命令将在您的Raspberry Pi中安装Arduino IDE。

  • **步骤2:**现在,我们将使用指定的github安装pyFirmata文件:
git clone  https://github.com/tino/pyFirmata

然后运行以下命令:

cd pyFirmata 
sudo python setup.py install
  • 步骤3: 我们已经安装了所有必需的文件和设置。

现在,使用USB电缆将Arduino开发板与Raspberry Pi连接,然后在终端窗口中键入arduino启动Arduino IDE 。

启动arduino

  • **步骤4:-**然后键入lsusb命令以检查Arduino是否与树莓派连接。

在Arduino IDE中,转到工具,然后选择板子和串行端口。

  • **步骤5:**通过单击文件->示例->固件->标准固件,然后单击上载按钮,在Arduino上上传PyFirmata固件,如下所示。

上传固件

我们已经在Arduino板上成功安装了pyFirmata固件。现在,我们可以使用Raspberry Pi控制Arduino。

为了演示,我们将通过在Raspberry Pi中编写python代码来使Arduino上的LED闪烁和渐变。

代码说明

对于编码部分,您应该阅读pyFirmata的文档以更好地理解,我们将使用pyFirmata函数编写代码。

在Raspberry Pi上打开您喜欢的文本编辑器,然后导入pyFirmata库。

import pyfirmata

在Arduino上定义引脚以连接LED

led_pin = 9

现在,我们必须使用pyfirmata.Arduino()函数编写连接Arduino板的串行端口名称,然后通过在板变量中分配端口来创建一个实例。

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为扩展名的文件来保存该代码。

打开命令终端,然后键入python blink.py以在Arduino板上运行代码。确保使用USB连接线将Arduino开发板与Raspberry Pi开发板连接。

现在,您可以在Arduino板上看到LED闪烁。

使用pyFirmata在Arduino上使LED渐变

现在,我们将编写用于使LED渐变的代码,以使您更加熟悉pyFirmata函数。此代码与上一个代码一样简单。您必须使用两个for循环,一个用于增加亮度,另一个用于降低亮度。

在此代码中,我们以不同的方式定义了引脚,例如led = board.get_pin(‘d:9:p’),其中d表示数字引脚。这是pyFirmata库的功能,部分代码如下:

led = board.get_pin('d:9: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)

现在,您可以在系统中添加更多传感器,尝试使用Raspberry pi和python脚本构建它们。

现象

附上完整代码:

#Python code for LED blink:
import pyfirmata
led_pin = 9
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)

#Python code for Fading LED:
import time
import pyfirmata

delay = 0.3
brightness = 0
board = pyfirmata.Arduino("/dev/ttyACM0")
led = board.get_pin('d:9: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)

关注微信公众号:TonyCode
Arduino学习交流群:868283450

更多内容,欢迎关注我的公众号。 微信扫一扫下方二维码即可关注:
扫码加入微信公众号:TonyCode

以下是一个树莓派Arduino之间通过SPI通信传输数据的示例代码(基于Python和C++): Python代码(树莓派端): ```python import spidev import time # 初始化SPI通信 spi = spidev.SpiDev() spi.open(0, 0) # 设置SPI通信速率 spi.max_speed_hz = 5000000 # 读取Arduino发送过来的数据 def read_data(): resp = spi.xfer2([0x00]) # 将接收到的数据从字节数组转换为整数 return int.from_bytes(resp, byteorder='big') # 将数据发送到Arduino def send_data(data): # 将要发送的数据转换为字节数组 data_bytes = int.to_bytes(data, length=2, byteorder='big') spi.xfer2(list(data_bytes)) # 主循环 while True: # 发送数据 send_data(1234) # 等待500毫秒 time.sleep(0.5) # 读取数据 recv_data = read_data() # 打印接收到的数据 print(recv_data) ``` C++代码(Arduino端): ```c++ #include <SPI.h> // 定义SPI连接所使用的引脚 #define SS_PIN 10 // 初始化SPI通信 void setup() { pinMode(SS_PIN, OUTPUT); SPI.begin(); SPI.setClockDivider(SPI_CLOCK_DIV8); // 设置SPI通信速率 } // 循环读取数据 void loop() { // 等待来自树莓派的数据 while (!SPI.transfer(0x00)) {} // 从树莓派读取数据 uint16_t data = (SPI.transfer(0x00) << 8) | SPI.transfer(0x00); // 处理接收到的数据 // TODO: 进行自己的处理逻辑 // 将处理后的数据发送回树莓派 SPI.transfer(highByte(data)); SPI.transfer(lowByte(data)); } ``` 这样,树莓派Arduino之间就可以通过SPI通信传输数据了。其中,树莓派使用Python的spidev库实现SPI通信,Arduino使用SPI库实现SPI通信。在每次循环中,树莓派会先发送数据给Arduino,然后等待Arduino回传数据,再进行下一次发送和接收。在Arduino端,可以通过SPI.transfer()函数读取和发送数据。注意,在Arduino端处理数据时,需要将接收到的字节数组合并为一个整数。如果需要,你可以根据自己的需求修改代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值