学习运行 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 初始化串口
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查看该设备的配置方式。
最后一行表示ttyUSB0,因此发送者代码需要更改如下:
用于接收数据的代码与直接 Tx/Rx 连接中的代码相同。
示例输出
现在让我们看看我们的代码的实际效果。
sender.py在 Raspberry Pi 上执行会输出以下信息:
receiver.py在 Raspberry Pico 上运行显示:
结论
本文介绍了使用 (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()是数据。