ENA | IN1 | IN2 | 直流电机状态 |
---|---|---|---|
0 | X | X | 停止 |
1 | 0 | 0 | 制动 |
1 | 0 | 1 | 正转 |
1 | 1 | 0 | 反转 |
1 | 1 | 1 | 制动 |
PS:驱动供电电源(6-12V) 要接12V供电5V输出用来给单片机供电,不过树莓派一般用另外独立电源供电.
使用说明:
1、直流电机的驱动:
该驱动板可驱动2路直流电机,使能端ENA、ENB 为高电平时有效,控制方
式及直流电机状态如上表所示:
直流电机进行PW]M调速,需设置IN1和IN2,确定电机的转动方向,
然后对使能端输出PWM脉冲,即可实现调速。注意当使能信号为0时,电机处于
自由停止状态,当使能信号为1,且IN1和IN2为00或11时,电机处于制动状
态,阻止电机转动。.
#coding=utf-8
import RPi.GPIO as GPIO
import time
backMotorInput1=7
backMotorInput2=11
frontMotorInput1=13
frontMotorInput2=15
#两个使能端口:
backMotorEn=12
frontMotorEn=16
GPIO.setmode(GPIO.BOARD)
#设置输出两个电机四根线对应的4个端口,要使用哪个端口需先设置声明
GPIO.setup(backMotorInput1,GPIO.OUT)
GPIO.setup(backMotorInput2,GPIO.OUT)
GPIO.setup(frontMotorInput1,GPIO.OUT)
GPIO.setup(frontMotorInput2,GPIO.OUT)
#设置便能输出使用的通道口:
GPIO.setup(backMotorEn,GPIO.OUT)
GPIO.setup(frontMotorEn,GPIO.OUT)
speed=30
soft=80
#设置脉冲控制电能输出,以控制车速:
backMotorPwm=GPIO.PWM(backMotorEn,100)
#设置脉冲控制电能输出,以控制转向力度:
frontMotorPwm=GPIO.PWM(frontMotorEn,100)
'''
配置PWM :
backMotorPwm = GPIO.PWM(backMotorEN, 100)
第一个参数为在哪个端口输出PWM波
第二个参数为方波频率为多少赫兹
'''
backMotorPwm.start(0)
frontMotorPwm.start(0)
'''开始输出PWM
backMotorPwm.start(0)
参数为占空比,单个周期中高电压占的比例
可接受的参数为数字,范围是0~100
改变频率
p.ChangeFrequency(freq) # where freq is the new frequency in Hz
改变PWM的占空比:
backMotorPwm.ChangeDutyCycle(66)
参数为占空比
可接受的参数为数字,范围是0~100
停止输出PWM,节能:
backMotorPwm.stop()
'''
#前进
def carMoveForward():
GPIO.output(backMotorInput1,GPIO.LOW)
GPIO.output(backMotorInput2,GPIO.HIGH)
backMotorPwm.ChangeDutyCycle(speed)
#后退
def carMoveBackward():
GPIO.output(backMotorInput1,GPIO.HIGH)
GPIO.output(backMotorInput2,GPIO.LOW)
backMotorPwm.ChangeDutyCycle(speed)
#直行 使前轮失控制,设置转向控制使不能,前轮回正,:
def carTurnStraight():
frontMotorPwm.ChangeDutyCycle(0)
#用低电平,使‘不能’的方式,起不到失控作用了。
GPIO.output(frontMotorEn,GPIO.LOW)
#左转
def carTurnLeft():
#使前电机能:
#变速执行时优先于使能
frontMotorPwm.ChangeDutyCycle(soft)
GPIO.output(frontMotorEn,GPIO.HIGH)
GPIO.output(frontMotorInput1,GPIO.LOW)
GPIO.output(frontMotorInput2,GPIO.HIGH)
backMotorPwm.ChangeDutyCycle(20)
#右转
def carTurnRight():
#使前电机能:
GPIO.output(frontMotorEn,GPIO.HIGH)
GPIO.output(frontMotorInput1,GPIO.HIGH)
GPIO.output(frontMotorInput2,GPIO.LOW)
frontMotorPwm.ChangeDutyCycle(soft)
backMotorPwm.ChangeDutyCycle(20)
#停止
def carStop():
GPIO.output(backMotorInput1,GPIO.LOW)
GPIO.output(backMotorInput2,GPIO.LOW)
GPIO.output(frontMotorInput1,GPIO.LOW)
GPIO.output(frontMotorInput2,GPIO.LOW)
#释放端口
def cleanGPIO():
#stop()后,依然是高电平,似无关于节能:
backMotorPwm.stop()
#print(GPIO.input(16))获得frontMotorEn引脚即第16引脚的值
#代码GPIO.input(channel)将返回一个0 / GPIO.LOW / False或者1 / GPIO.HIGH / True.
frontMotorPwm.stop()
GPIO.output(frontMotorEn,GPIO.LOW)
GPIO.cleanup()
if __name__=='__main__':
carMoveForward()
time.sleep(2)
carTurnLeft()
carMoveForward()
time.sleep(2)
carStop()
time.sleep(3)
carTurnStraight()
carMoveBackward()
time.sleep(2)
carStop()
time.sleep(2)
carTurnRight()
carMoveForward()
time.sleep(2)
cleanGPIO()
'''
carMoveBackward()
time.sleep(2)
carTurnRight()
time.sleep(2)
carTurnStraight()
carMoveForward()
time.sleep(2)
'''
可参考:
RPI.GPIO Python使用手册:
1.中文https://blog.csdn.net/oAlevel/article/details/79212949
2.英文https://sourceforge.net/p/raspberry-gpio-python/wiki/BasicUsage/