You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用PySerial等库将Arduino C++代码转换为Python代码

Arduino EMG舵机控制Python迁移方案

你需要采用「Arduino负责底层硬件读写 + Python端跑业务逻辑通过串口通信」的架构实现需求,Python本身无法直接访问Arduino的引脚资源,不能直接把原C++代码完全改成纯Python在电脑上运行,具体实现步骤如下:

前置依赖准备

  • Arduino端:使用IDE自带的Servo标准库即可,无需额外安装第三方组件
  • Python端:安装串口通信库pyserial,安装命令:
pip install pyserial

第一步:烧录Arduino端适配固件

原代码中阈值判断、舵机角度决策逻辑迁移到Python端实现,Arduino仅负责两个基础功能:持续读取EMG传感器模拟值上传到串口、接收串口下发的角度指令驱动舵机转动,固件代码如下:

#include <Servo.h>

#define EMG_PIN 0
#define SERVO_PIN 3
Servo SERVO_1;

void setup(){
  Serial.begin(115200);
  SERVO_1.attach(SERVO_PIN);
}

void loop(){
  // 读取EMG值上传
  int emg_value = analogRead(EMG_PIN);
  Serial.println(emg_value);

  // 接收串口下发的舵机角度指令
  if(Serial.available() > 0){
    int angle = Serial.parseInt();
    // 过滤无效角度值,避免舵机打齿
    if(angle >=0 && angle <=180){
      SERVO_1.write(angle);
    }
    // 清空串口缓冲区残留数据
    while(Serial.available() > 0) Serial.read();
  }
  delay(10); // 控制采样频率,和原代码逻辑运行速度基本一致
}

第二步:编写Python端控制代码

Python端逻辑和原C++逻辑完全对齐:读取串口上传的EMG值、和设定阈值比对、下发对应舵机角度指令,同时打印采集值方便调试阈值,代码如下:

import serial
import time

# 配置参数,和原C++代码保持一致
THRESHOLD = 250
BAUD_RATE = 115200
# 串口端口号需自行替换:Windows一般为COM3/COM4,Mac/Linux一般为/dev/ttyACM0
SERIAL_PORT = "COM3"

if __name__ == "__main__":
    ser = None
    try:
        # 初始化串口连接
        ser = serial.Serial(SERIAL_PORT, BAUD_RATE, timeout=1)
        # 等待Arduino复位完成
        time.sleep(2)
        print("串口连接成功,开始采集控制...")

        while True:
            # 读取一行EMG采集值
            line = ser.readline().decode("utf-8").strip()
            if not line:
                continue
            try:
                emg_value = int(line)
            except ValueError:
                continue
            
            # 和原C++逻辑完全一致的阈值判断
            if emg_value > THRESHOLD:
                target_angle = 170
            else:
                target_angle = 10
            
            # 下发舵机角度指令
            ser.write(f"{target_angle}\n".encode("utf-8"))
            # 打印采集值,方便校准阈值
            print(f"当前EMG采集值: {emg_value}, 舵机目标角度: {target_angle}")
            time.sleep(0.01)

    except KeyboardInterrupt:
        print("程序手动退出")
    except Exception as e:
        print(f"运行异常: {str(e)}")
    finally:
        if ser and ser.is_open:
            ser.close()
            print("串口已关闭")

运行注意事项

  • 烧录Arduino固件时,必须关闭所有占用对应串口的程序(包括Python运行进程、串口监视器),否则会出现端口占用报错
  • 运行Python代码前,需确认串口号和实际Arduino连接的端口一致,波特率必须和固件中设置的115200匹配
  • 校准阈值时,可以先观察Python控制台打印的EMG值,记录握拳、放松状态下的数值区间,再调整THRESHOLD参数到合适值
  • 如果舵机出现抖动、转动无力的情况,不要使用Arduino板载5V引脚给舵机供电,需外接独立电源供电,共地即可

内容的提问来源于stack exchange,提问作者kiliango

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 03:36:57