【问题标题】:Using Python and pyserial to run python scripts on a pico (RP2040)使用 Python 和 pyserial 在 pico (RP2040) 上运行 python 脚本
【发布时间】:2021-11-15 04:02:00
【问题描述】:

我的最终目标是通过 PC 上的 GUI 界面控制 PCB 上的多个外围芯片。为此,我的计划是在 PCB 上集成一个 RP2040(和内存),以保存所有 python 脚本并编程/监控所有外围芯片。然后,使用 PC 与 RP2040 接口,通过串口发送命令以在 pico 上执行特定的 python 文件。 我意识到这有点令人困惑,所以附上的框图应该会有所帮助。


Block diagram

从框图的左侧开始,我有一台运行 tkinter GUI 的 PC。我目前正在 Thonny 运行 tkinter gui。 (最终我希望它成为一个可执行文件,但这超出了本文的范围) gui 有许多按钮可以选择要运行的 python 脚本。 PC 通过 USB 电缆连接到 PCB。 USB 数据线连接到 RP2040 的 USB 输入(引脚 47,48)。 PCB 上的内存包含许多与 GUI 中的按钮相对应的 python 脚本。理想情况下,在 PC 上按下一个按钮会在 pcb 上执行相应的 py 文件。


到目前为止我的工作: 我真正的专长在于外围芯片和 PCB 设计,在这种情况下是 2-18GHz 收发器的前端,如果我的一些 python 问题看起来很基础或有误导性,那么我就这么说吧。我已经编写并测试了 pico 内存中的所有 .py 文件。为了测试这些脚本,我使用 Thonny 连接到我的 pico 并简单地运行 (f5) 脚本,其中外围设备连接到正确的 GPIO。我还能够让 tkinter 工作并创建可以执行命令的功能按钮。使用 pyserial 模块,我还可以通过 USB 连接到 pico 并写入...字符串。不是很有用,只是一个开始。


import serial

ser = serial.Serial('COM3', 38400, timeout=1, parity=serial.PARITY_EVEN, rtscts=1)
s = ser.read(100)       # read up to one hundred bytes or as much is in the buffer

print(ser.name)                # check which port was really used
ser.write(b'ToggleLED.py')     # write a string
ser.close()                    # close port

剩余任务:我在过去 2 天里惨败的最后一个任务实际上是尝试通过串行端口执行位于 pico 内存上的 .py 文件。我没有经验/幼稚的想法是简单地发送一个带有文件名的字符串,显然不正确。关于如何使用该 pyserial 模块执行这些 py 文件有什么想法吗?


顺便说一句,如果有更好的解决方案,请随时分享!也许文件应该位于 PC 上,我一次发送 1 个命令?

【问题讨论】:

  • 你在树莓派上运行什么代码来响应串行字符串?或者您是否正在与树莓派上的串行 终端 交互?如果您不知道,请从 命令行 运行python -m serial.tools.miniterm --parity E --rtscts COM3 38400,这将打开一个具有相同参数的串行终端。这应该会告诉您您是否最终进入了终端。
  • RP2040 上的 Python 是什么?电路Python?微蟒?其他?使用 CircuitPython,您可以简单地将新文件复制到大容量存储类磁盘,并将其命名为 code.py,CircuitPython 将在看到它时重新启动并运行。如果您不想要“重启”功能,您可能需要通过 RP2040 上的程序监控串行端口。我不记得它是否支持子进程,但你可能只是 import 来自主文件的文件(这需要在你的主程序中硬编码所有文件名)但这是一种方法。

标签: python pyserial raspberry-pi-pico


【解决方案1】:

在您澄清 pi 上正在运行的内容之前,我无法对您的系列问题发表任何意见(请参阅我的评论:我会在您这样做时更新此答案),但是“有没有更好的方法”:可能.

由于 Pi 运行的是完整的操作系统,因此有几个选项。您基本上是在为 Pi 创建一个网络连接。虽然这个可以通过串口完成(使用 Pi,大概充当假的 USB 串行设备),它也可以更传统地通过 wifi 或以太网完成。最后,您可以在 Pi 上托管您的界面,并在网络浏览器中与之交互,从而将第二台计算机从图片中删除。您决定采用哪个选项完全取决于您,并且在这里确实是题外话(尽管它可能在 SE 的其他地方成为话题)。

向 pi 发送命令并让它运行脚本是远程过程调用。您可能想查找一些通常用于执行此操作的协议(如 JSON-RPC),但基本方法将在 pi 上运行代码:

def do_something():
    pass
def do_something_else():
    pass

functions = {"something": do_something, "something_else": do_something_else}

while True:
    cmd = get_input() # blocks until input comes
    if cmd in functions:
        reply(f"Running {cmd}")
        output = functions[cmd]()
        reply(f"{cmd} returned with output {output}")
    else:
        reply(f"Invalid command {cmd}")

这是示意图:pi 上的 get_input() 究竟是什么取决于您最终连接的方式以及您最终使用的协议(如果有的话)。请注意,我已经内置了确认:你想知道事情是成功还是失败。

虽然您可以将这些命令存储在单独的脚本中并调用它们,但如果它们只是 python 脚本,则没有理由不直接从 pi 上运行的代码调用这些函数。

【讨论】:

    【解决方案2】:

    我已经看到了这个问题的两种不同的解决方案:

    1. 使用运行 REPL(python shell)的 Pi pico,可以简单地从主机上运行的 python 程序发送文本字符串(Windows 或 Raspberry Pi 等,连接到 USB com 端口,关闭 Thonny 窗口) ,并作为 python 命令发送到 pico。这种方法在以下内容中有详细说明:

    https://blog.rareschool.com/2021/01/controlling-raspberry-pi-pico-using.html

    在 pico 方面,只需要定义一些将从 REPL 执行的函数。例如:

    from machine import Pin
    
    # use onboard LED which is controlled by Pin 25
    led = Pin(25, Pin.OUT)
    # Turn the LED on
    def on():
        led.value(1)
    # Turn the LED off
    def off():
        led.value(0)
    

    发送到pico的任何字符串,如

    on()
    

    将相应地执行。

    1. 在第二种方法中,pico 将从 USB 串行端口读取每一行并将该行解析为命令和附加参数,与预定义命令列表进行比较并相应地执行。我使用 Arduino Due 做到了这一点,并且正在将其移植到 pico(= 还没有要显示的代码 :-()。

    【讨论】:

      猜你喜欢
      • 2023-01-03
      • 2022-11-05
      • 2018-06-09
      • 1970-01-01
      • 2016-08-06
      • 2019-08-21
      • 2013-08-11
      • 1970-01-01
      • 2015-02-18
      相关资源
      最近更新 更多