树莓派2(Raspbian Stretch)GPIO引脚卡输入高电平模式,电机故障求助
树莓派GPIO卡滞+电机故障排查指南
嘿,看你在Raspbian Stretch的树莓派2上搭避障小车时踩坑了——GPIO引脚卡IN/HIGH模式、电机动不了,还没配DC-DC转换器,我来帮你一步步捋清楚问题:
一、先把代码里的低级错误修好
你的代码片段里有变量名拼写错误,还同时混用了gpiozero和RPi.GPIO两个GPIO库,这俩库会抢GPIO控制权,直接导致配置失败!先给你修正两个版本的代码,选一个用就行:
版本1:用RPi.GPIO(适合精细控制)
import RPi.GPIO as GPIO from time import sleep # 先把引脚定义清楚(BCM模式) MOTOR_A_IN = 5 MOTOR_A_OUT = 6 TEST_LED = 17 def setup_gpio(): GPIO.setmode(GPIO.BCM) # 把电机和LED引脚都设为输出模式 GPIO.setup(MOTOR_A_IN, GPIO.OUT) GPIO.setup(MOTOR_A_OUT, GPIO.OUT) GPIO.setup(TEST_LED, GPIO.OUT) def test_hardware(): # 先测LED,验证GPIO能不能正常工作 GPIO.output(TEST_LED, GPIO.HIGH) sleep(2) GPIO.output(TEST_LED, GPIO.LOW) sleep(2) # 再测电机正转/反转 GPIO.output(MOTOR_A_IN, GPIO.HIGH) GPIO.output(MOTOR_A_OUT, GPIO.LOW) sleep(3) GPIO.output(MOTOR_A_IN, GPIO.LOW) GPIO.output(MOTOR_A_OUT, GPIO.HIGH) sleep(3) # 停止电机 GPIO.output(MOTOR_A_IN, GPIO.LOW) GPIO.output(MOTOR_A_OUT, GPIO.LOW) def cleanup(): GPIO.cleanup() # 程序结束必须执行,不然GPIO会被锁死 if __name__ == "__main__": try: setup_gpio() test_hardware() finally: cleanup()
版本2:用gpiozero(更简洁,适合快速开发)
from gpiozero import Motor, LED from time import sleep # 直接初始化电机和LED motor = Motor(forward=5, backward=6) led = LED(17) # 先测LED led.on() sleep(2) led.off() sleep(2) # 再测电机 motor.forward() sleep(3) motor.backward() sleep(3) motor.stop()
二、解决GPIO引脚卡IN/HIGH模式的问题
如果改完代码还是不行,大概率是GPIO被异常锁定或者硬件有问题:
- 强制释放GPIO资源:程序崩溃后GPIO容易被锁,在终端跑这几条命令强制重置引脚:
跑完再重新运行测试代码。sudo rpi-gpio set 5 op dl # 把引脚5设为输出、低电平 sudo rpi-gpio set 6 op dl # 同理处理引脚6 sudo rpi-gpio set 17 op dl # 处理LED引脚 - 检查硬件短路:把电机驱动和树莓派的连接全拔掉,只留LED,再测GPIO。如果LED能正常亮灭,说明是电机驱动那边的接线有短路(比如引脚接反、电机线碰GND)。
- 电源问题是核心!:你没配DC-DC转换器,电机启动时会瞬间拉低树莓派的电源电压,直接搞乱GPIO模块的供电,导致引脚锁死。电机的电流远大于树莓派GPIO能扛的16mA,必须给电机单独供电,用DC-DC转换器隔离电机和树莓派的电源,一定要把树莓派的GND和电机驱动的GND连在一起,不然信号没法正常传输。
三、最后提个关键提醒
树莓派GPIO的输出电流极小,绝对不能直接驱动电机!必须用L298N或者TB6612这类电机驱动模块,配合外部电源(比如4节AA电池),DC-DC转换器是用来把电机电源的电压降到树莓派能用的5V(如果你的电机驱动需要5V供电的话),没有它的话,电机启动时的电压波动会直接搞垮树莓派的系统。
内容的提问来源于stack exchange,提问作者themadcoderz




