树莓派与Pico通信 Raspberry Pi 和 Raspberry Pico 之间的串行连接GPIO编程,Pico

By 管理员8

2023-09-10 19:35:57

浏览量672

已赞0

学习运行 MicroPython 的 Raspberry Pico 和运行 Python 的 Raspberry Pi 之间的串行连接的要点。 本文介绍了建立成功连接的基础知识。

硬件连接选项

要从 Pi 连接到 Pico,有三个选项:

1.直接 USB 转 USB
2.直接 Tx/Rx 引脚
3.USB-TTL 到 Rx/Rx

由于 Raspberry Pico 还比较年轻,MicroPython 堆栈的技术成熟度会影响这些连接中的哪些可以使用。

如何在 Raspberry Pi 上启用 Tx/Rx 引脚

1.通过树莓派的Raspi-Config 初始化串口

Image

2.禁用该/dev/ttyS0服务


3.从引导中删除控制台



有趣的是,Pi 仍然会通过 Tx/Rx 引脚发送系统消息 - 这可能是您一直在寻找的特定用例。这是我关闭 Pi 时的示例输出。


在所有示例中,将数据从 Raspberry Pi 发送到 Pico 都是相同的代码,仅进行了少量修改: Pico 连接的端口。

使用此样板代码:

# sender.py
import time
import serial
ser = serial.Serial(
  port='/dev/ttyS0', # Change this according to connection methods, e.g. /dev/ttyUSB0
  baudrate = 115200,
  parity=serial.PARITY_NONE,
  stopbits=serial.STOPBITS_ONE,
  bytesize=serial.EIGHTBITS,
  timeout=1
)

msg = ""
i = 0

while True:
    i+=1
    print("Counter {} - Hello from Raspberry Pi".format(i))
    ser.write('hello'.encode('utf-8'))
    time.sleep(2)
解释:

第 2 行:导入serial启用串行连接的库

第 4 行:创建一个串行对象,其配置与默认 Pico UART 配置完全相同(波特率 115200、字节大小 8 位等)。该port部分需要根据连接方式进行定制——详情见下文

第 19 行:要发送数据,首先发送encode字符串数据,然后将write其发送到串行对象现在让我们检查接收方。


接收数据:USB 到 USB 连接

在撰写本文时,Pico 上运行的 MicroPython 的最新版本是MicroPython v1.16 on 2021-06-18. 此版本没有用于通过 USB 进行串行通信的内置库。然而,在这个Pico 论坛线程中,用户提供了一个纯 MicroPython 实现,该实现在第二个 Pico CPU 核心上生成一个线程,该线程主动侦听通过 USB 传入的字节。我在早期的机器人原型中尝试了这段代码,并可以使用它通过 Pico 上的 USB 接收消息,命令我的机器人移动。

这是我的工作示例:


接收数据:Tx/Rx 引脚连接

Tx/Rx 引脚之间的直接连接意味着:

1.连接地线:Pi PIN 6 至 Pico Pin 3

2.将 Tx 连接到 Rx:Pi PIN 8 (GPIO 14) 到 Pico Pin 1 (GPIO 0)

3.将 Tx 连接到 Rx:Pi PIN 10 (GPIO 15) 到 Pico Pin 2 (GPIO 1)

如上所述,您还需要配置 Raspberry Pi 以启用这些引脚。完成后,使用以下代码:

# receiver.py / Tx/Rx => Tx/Rx
import os
import machine
from time import sleep

uart = machine.UART(0, 115200)
print(uart)

b = None
msg = ""

while True:
    sleep(1)
    if uart.any():
        b = uart.readline()
        print(type(b))
        print(b)
        try:
            msg = b.decode('utf-8')
            print(type(msg))
            print(">> " + msg)
        except:
            pass
在这个程序中:

第 6 行:创建一个 uart实例通过访问 Pico 的内部 machine.UART实例。 这与配置发件人代码的值相同。 请注意, MicroPython 文档 还允许您创建不同配置的 UART 实例,例如使用较慢的波特率。

第 14 行:条件 uart.any()当 UART 连接上至少有一个字符可用时,返回一个正整数。

第 13 行:要读取数据,请使用 read(i)在哪里 i是字符数,或 readline()读取所有字符,直到到达换行符。 使用单个字符更高效、更快,如果您需要交换复杂的信息,使用完整的行更可靠。

第 18 行:A try - except块开始于...

第 20 行:……接收到的消息被解码然后打印。 如果有任何错误,程序将继续运行而不引发错误。

接收数据:USB-TTL 到 Tx/Rx 引脚连接

首先,你需要一个 USB-TTL 适配器,它至少有两种不同的芯片组:FT232RL 和 CH340g


将适配器插入 Picos USB 端口,然后用于dmesg查看该设备的配置方式。

Image

最后一行表示ttyUSB0,因此发送者代码需要更改如下:

Image

用于接收数据的代码与直接 Tx/Rx 连接中的代码相同。

示例输出

现在让我们看看我们的代码的实际效果。

sender.py在 Raspberry Pi 上执行会输出以下信息:

Image

receiver.py在 Raspberry Pico 上运行显示:

Image

结论

本文介绍了使用 (Micro)Python 连接 Raspberry Pi 与 Raspberry Pico 的三个选项。第一个选项是 USB 到 USB,需要外部 MicroPython 库来接收数据。第二种选择是直接从两台机器连接 Rx/Tx。对 Pi 进行一些配置后,它可以稳定工作。第三种选择是使用 USB-FTL 转 Tx/Rx。无需配置,开箱即用。


考虑到源代码,在 Pi 上它是库pyserial:打开一个与 Pico 具有相同配置(波特率、停止位)的串行连接对象,并使用serial.write(). 在 Pico 上,它是machine.UART访问内置 UART 或可配置的构建对象。用于uart.readline()接收字节,然后decode()是数据。


本文章最后由 超级版主2023-09-10 19:58 编辑
发表评论
请先 注册/登录 后参与评论

已有0 发布

默认   热门   正序   倒序
    查看更多评论
    (0) 分享
    分享

    扫二维码或复制链接分享该篇文章

    取消
    已有0次打赏
    本站免责声明
    1、本站资源,均来自网络或个人用户发布,版权归原作者,所有资源和文章仅限用于学习和研究目的 。
    2、不得用于商业或非法用途,否则,一切责任由该用户承担 !

    侵权删除请致信 E-Mail:cxg88@qq.com