基于RPI 3B+的AlphaBot2机器人启动电机后自动断电如何解决?
可编程导航机器人电机启动断电问题
我正在组装一款可编程导航机器人,可通过读取标识牌上的指令(如卫生间右转)在室内导航,硬件采用AlphaBot2套件和RPI 3B+。
图像处理部分运行正常,但运动控制模块出现异常:我编写了简易PID控制器驱动电机,但电机一启动机器人就自动断电。
相关代码如下:
PID与电机驱动代码
iPWM = 20 # initial motor power in duty cycle MAX_PWM = 100 dt = 0.001 # time step #PID PARAMETERS# KP = 0.2 KD = 0.01 KI = 0.00005 targets = ['BATHROOM', 'RESTAURANT', 'BALCONY'] class PID(object): def __init__(self,target): self.target = target self.kp = KP self.ki = KI self.kd = KD self.setpoint = 320 self.error = 0 self.integral_error = 0 self.error_last = 0 self.derivative_error = 0 self.output = 0 def compute(self, pos): self.error = self.setpoint - pos #self.integral_error += self.error * TIME_STEP self.derivative_error = (self.error - self.error_last) / dt self.error_last = self.error self.output = self.kp*self.error + self.ki*self.integral_error + self.kd*self.derivative_error if(abs(self.output)>= MAX_PWM-iPWM and (((self.error>=0) and (self.integral_error>=0))or((self.error<0) and (self.integral_error<0)))): #no integration self.integral_error = self.integral_error else: #rectangular integration self.integral_error += self.error * dt if self.output>= MAX_PWM-iPWM: self.output = MAX_PWM-iPWM elif self.output <= -MAX_PWM: self.output = iPWM - MAX_PWM return self.output class MOTORS(object): def __init__(self,ain1=12,ain2=13,ena=6,bin1=20,bin2=21,enb=26): self.AIN1 = ain1 self.AIN2 = ain2 self.BIN1 = bin1 self.BIN2 = bin2 self.ENA = ena self.ENB = enb self.PA = iPWM self.PB = iPWM GPIO.setmode(GPIO.BCM) GPIO.setwarnings(False) GPIO.setup(self.AIN1,GPIO.OUT) GPIO.setup(self.AIN2,GPIO.OUT) GPIO.setup(self.BIN1,GPIO.OUT) GPIO.setup(self.BIN2,GPIO.OUT) GPIO.setup(self.ENA,GPIO.OUT) GPIO.setup(self.ENB,GPIO.OUT) self.PWMA = GPIO.PWM(self.ENA,500) self.PWMB = GPIO.PWM(self.ENB,500) self.PWMA.start(self.PA) self.PWMB.start(self.PB) self.stop() def forward(self): self.PWMA.ChangeDutyCycle(self.PA) self.PWMB.ChangeDutyCycle(self.PB) GPIO.output(self.AIN1,GPIO.LOW) GPIO.output(self.AIN2,GPIO.HIGH) GPIO.output(self.BIN1,GPIO.LOW) GPIO.output(self.BIN2,GPIO.HIGH) def updatePWM(self,value): if value<0: self.PA = iPWM+abs(value) self.PB = iPWM self.PWMA.ChangeDutyCycle(self.PA) self.PWMB.ChangeDutyCycle(self.PB) if value>0: self.PA = iPWM self.PB = iPWM+value self.PWMB.ChangeDutyCycle(self.PB) self.PWMA.ChangeDutyCycle(self.PA) if value ==0: self.PA = iPWM self.PB = iPWM self.PWMB.ChangeDutyCycle(self.PB) self.PWMA.ChangeDutyCycle(self.PA) GPIO.output(self.AIN1,GPIO.LOW) GPIO.output(self.AIN2,GPIO.HIGH) GPIO.output(self.BIN1,GPIO.LOW) GPIO.output(self.BIN2,GPIO.HIGH) def stop(self): self.PWMA.ChangeDutyCycle(0) self.PWMB.ChangeDutyCycle(0) GPIO.output(self.AIN1,GPIO.LOW) GPIO.output(self.AIN2,GPIO.LOW) GPIO.output(self.BIN1,GPIO.LOW) GPIO.output(self.BIN2,GPIO.LOW)
摄像头采集循环调用代码
cx = int(x+w//2) if d<= 60: mot.stop() GPIO.cleanup() dutyCycle = pid.compute(cx) pwm = mot.updatePWM(dutyCycle)
排查修复方案
- 供电问题优先排查:AlphaBot2双电机启动峰值电流可达2A以上,普通树莓派Micro USB供电无法承载,会触发过流保护断电。建议用输出3A以上的18650电池组给电机驱动独立供电,树莓派单独供电,避免电机电流波动拉低系统电压。
- PID参数调整:当前KD参数过高,dt仅为0.001s会放大摄像头采样的噪声,导致瞬间PWM输出过大。可先将KD调低到0.001,KI暂时设为0,测试基础运动正常后再逐步微调参数。
- 功率限制修改:初始iPWM可先降到10,MAX_PWM限制到60,避免电机满功率启动触发过流。
- 硬件接线检查:确认电机正负极、驱动模块接线没有虚接短路,GPIO引脚没有接错。
内容的提问来源于stack exchange,提问作者ofer simchovitch
相关产品推荐
相关产品推荐

