我在 Raspberry Pi Pico 中有一个小的 python 文件,可以通过 PCA9685 伺服控制器控制伺服系统:
import time
from adafruit_servokit import ServoKit
import busio
import board
import time
kit = ServoKit(channels=16, i2c=(busio.I2C(board.GP1, board.GP0)))
def rotateservo():
kit.servo[0].angle = 100
time.sleep(1)
kit.servo[0].angle = 0
time.sleep(1)
kit.servo[0].angle = 180
从 Pico 调用时该函数工作正常。 我正在寻找一种使用 pyserial 从 PC 调用该函数的方法
import serial
ser = serial.Serial('COM5', 115200, timeout=timeout)
ser.write('rotateservo()'.encode())
ser.close()
这只是输出数字 13,我假设它是字符串的长度。如何使用 pyserial 调用 Pi Pico 上的函数?
这里有一种方法可以做到这一点。我在 Pico W 上运行它(如果它不是“W”,您需要将“LED”更改为 13):
import select
import sys
from machine import Pin
import utime
gpio_no = 'LED'
led = Pin(gpio_no, Pin.OUT)
# setup poll to read USB port
poll_object = select.poll()
poll_object.register(sys.stdin,1)
led.value(0)
led.toggle()
utime.sleep(1)
led.toggle()
def blink():
led.value(1)
utime.sleep(.2)
led.value(0)
utime.sleep(.2)
def function_1():
print("Executing function 1")
blink()
def function_2():
print("Executing function 2")
blink()
blink()
print("Started looking")
while True:
# check usb input
if poll_object.poll(0):
#read as character
ch = sys.stdin.read(1)
if ch == "1":
function_1()
elif ch == "2":
function_2()
else:
print (ch, "Received. Was expecting 1 or 2")
led.value(1)
utime.sleep(1)
led.value(0)
如果接收到“1”,则执行 function_1,该函数会使 LED 短暂闪烁一次,并发回一条消息。如果它收到“2”,它会短暂地使 LED 闪烁两次并发回另一条消息。对于所有其他字符,它会闪烁更长的时间(1 秒),并发送不同的消息。
这是在 PC 上用 Python 运行的代码(将 COM7 替换为您正在使用的端口号)。
import serial
import time
ser = serial.Serial('COM7', 9600, write_timeout=0)
to_send = ['1', '2', '3']
for a in to_send:
bytes_sent = ser.write(bytes(a, 'UTF-8'))
print(f"Sent {bytes_sent} bytes ({a})")
line = ser.readline()
print(f"Received: {line.decode('UTF-8') }")
time.sleep(1)
ser.close()
print("done")
它使用pyserial模块,并以一秒的间隔发送“1”、“2”和“3”。这些信息被 Pico 接收,并闪烁响应,并将文本发送回 PC,确认其收到的内容。这是电脑打印输出:
Sent 1 bytes (1)
Received: Executing function 1
Sent 1 bytes (2)
Received: Executing function 2
Sent 1 bytes (3)
Received: 3 Received. Was expecting 1 or 2
done
设置此功能时,您需要将 Pico 程序作为 main.py 运行(从 Pico 运行)。一旦运行,您需要将 Thonny 从串行端口上移除,否则您将无法从 Python 代码访问它。为此,请单击右下角的 Thonny,并将其设置为除您正在使用的 COM 端口之外的任何端口(例如“本地 Python”)。