如何用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
相关产品推荐
相关产品推荐

