买了一个树莓派小车的配件,当然,有二次开发板板,不过原理相同。
买的板子是创乐博的智能小车套件。
以下代码来自其指导文件,但是文件都是英文,没有代码讲解,导致很难看得懂。本人重新写了,并给出自己的理解,代码也是略有不同,但是从零写起,可以让自己真正明白原理。
import RPi.GPIO as GPIO
import time
#绑定对应的引脚,来自于图纸
PWMA=18
AIN1 = 22
AIN2 = 27
PWMB=23
BIN1= 25
BIN2 = 24
18引脚控制的是左侧两个电机
23引脚控制的右侧两个电机
AIN1、AIN2、BIN1、BIN2控制的是左右两侧电机的正转和翻转
2、设置引脚模式和输入输出
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
# 设置引脚为输出
GPIO.setup(PWMA, GPIO.OUT)
GPIO.setup(AIN1, GPIO.OUT)
GPIO.setup(AIN2, GPIO.OUT)
GPIO.setup(PWMB, GPIO.OUT)
GPIO.setup(BIN1, GPIO.OUT)
GPIO.setup(BIN2, GPIO.OUT)
#电机
leftMotor = GPIO.PWM(PWMA, 100)
rightMotor = GPIO.PWM(PWMB, 100)
leftMotor.start(0)
rightMotor.start(0)
这样,设置基本完成,电机就处于待命状态了。
要使得小车前进,我们需要让四个电机转动起来,既然是前进,当然是电机正转
def forward(speed,runtime):
leftMotor.ChangeDutyCycle(speed)
GPIO.output(AIN1, True)#AIN1高电平则正转
GPIO.output(AIN2, False)#如果为True则翻转
rightMotor.ChangeDutyCycle(speed)
GPIO.output(BIN1, True)
GPIO.output(BIN2, False)
time.sleep(runtime)#维持状态的时间,如果不给命令执行其他,将会继续执行
当四轮正转的时候,实现了基本的前进功能。
后退当然也是同理,只需要反向设置就好了。
def backword(speed, backtime):
leftMotor.ChangeDutyCycle(speed)
GPIO.output(AIN2, True) # AIN2
GPIO.output(AIN1, False) # AIN1
rightMotor.ChangeDutyCycle(speed)
GPIO.output(BIN2, True) # BIN2
GPIO.output(BIN1, False) # BIN1
time.sleep(backtime)
至此,前进和后退的功能就实现了。
最后通过调用函数,来实现小车运行。
if __name__ == '__main__':
try:
while True:
forward(50,3)
except KeyboardInterrupt:
GPIO.cleanup()
一定要调用 GPIO.cleanup()函数来清空引脚上的相关设置,否则引脚将被占用,对程序的下次运行可能会有影响。
电机连接在电路板上,ChangeDutyCycle可以让我们来设置速度,通过改变占空比来实现。
速度设定好了,设定其正转或者翻转,则是通过连接的AIN1和AIN2接口来实现。(这里是电路模块的名字,实际操作中也可以起不同的名字,或者接入不同的接口)