要说智能小车最核心的部分,非电机控制莫属——车要动,就得让电机转;要快慢、要前进后退,都得控制电机。这篇把树莓派控制直流电机的原理和写法讲透:PWM 调速 + 电机驱动板 + GPIO Zero 封装,让你几行代码就让小车跑起来。
为什么不能直接把电机的线怼到树莓派引脚
树莓派的 GPIO 引脚只能输出很小的电流(几个毫安级,3.3V 逻辑电平),而直流电机动辄要几百毫安甚至上安的电流。直接怼上去,要么电机纹丝不动,要么烧掉树莓派的 GPIO。所以必须经过电机驱动板(也叫电机驱动芯片/H桥如 L298N、L293D、TB6612 之类):
· 树莓派 GPIO → 驱动板信号脚(只发“怎么转”的信号,电流小)
· 外部电源 → 驱动板电源脚(真正给电机供电的大电流)
· 驱动板 → 电机两根线(输出)
一句话:树莓派负责“指挥”,驱动板负责“出力”。这也是所有靠谱智能车的标准接法。
PWM:怎么控制电机速度
PWM(脉宽调制)就是“快速开关”信号——在一个周期里,通电时间占的比例(叫占空比)决定电机平均电压,也就决定了速度:占空比大、跑得快,占空比小、跑得慢。树莓派引脚就可以输出 PWM,从而调速。方向则由驱动板的 IN1/IN2 两个信号脚的逻辑组合控制(一个高一个低 → 正转,反过来 → 反转)。
用 GPIO Zero 控制单个电机
GPIO Zero 把电机封装成 Motor 类,接好驱动板后,给两个控制脚,几行代码就正反转:
from gpiozero import Motor
from time import sleep
motor = Motor(forward=4, backward=14)
while True:
motor.forward() # 正转
sleep(5)
motor.backward() # 反转
sleep(5)
这里的 forward=4 是正转控制脚(接驱动板 IN1 的 GPIO)、backward=14 是反转控制脚(接 IN2 的 GPIO)。forward()/backward() 就让电机正转/反转。
调速也不难,直接给电机的速度赋值:
motor.forward(speed=0.5) # 半速前进
motor.backward(speed=1) # 全速后退
motor.stop() # 停
speed 取值范围 0~1,0.5 就是一半速度——PWM 占空比就在背后帮你调好了。
两个电机做成小车:Robot 类
小车至少两个驱动轮(左右各一个)。把左右两个电机组合成 Robot 对象,就能直接前进、后退、转弯:
from gpiozero import Robot, Motor
from time import sleep
robot = Robot(left=Motor(4, 14), right=Motor(17, 18))
robot.forward() # 直行
sleep(3)
robot.right() # 右转
sleep(1)
robot.backward() # 后退
sleep(2)
robot.stop() # 停
left/right 分别放左右两个电机,forward()/backward()/left()/right()/stop() 就是整套驾驶动作。想让它走个正方形、绕个圈,都是这些方法的组合。
电机控制是智能小车的“脚”。跑跑啦的全自动智能小车整机除了电机,还配了后轮双减速电机带编码器——编码器能实时回传轮子转了几圈,配合程序就能做到“前进 20cm 精确到 99% 精度”这种闭环控制,比起开环“凭感觉跑”,能实现更精准的定位走位。想配齐电机驱动这类动力套件自己攒车,可以看我们传感器模块和智能小车产品。淘宝店:paopaola.taobao.com。
小提示:电机别直接接树莓派引脚,一定过驱动板,树莓派指挥、驱动板出力,才稳。想要小车走位精准,电机带编码器做闭环是关键。
(本文整理自 Raspberry Pi 树莓派官方文档《GPIO Zero》电机/小车示例与 GPIO Zero 官方文档,CC BY-SA 4.0,来源:https://shumeipai.nxez.com/doc-zhcn/docs/program/gpio/gpiozero)


微信联系
淘宝联系