文章目录
- 介绍
- 使用说明
- 代码
- 电平控制
- PWM控制
介绍
GPIO(General Purpose I/O Ports)意思为通用输入/输出端口,通过它们可以输出高低电平或者通过它们读入引脚的状态(是高电平或是低电平)。
树莓派使用GPIO的方法有很多种,库函数包括了wiringPi以及RPi.GPIO,这里我主要介绍RPi.GPIO库,这个库是树莓派系统自带的。
使用说明
1、首先加载库
import RPi.GPIO as GPIO
2、设置编码规范
gpio.setmode(gpio.BOARD)
这里需要解释的是:因为要使用GPIO口,那么你得明确使用的是哪一个口(下面代码中 pin 对应的就是端口号),这就引入了一个编号问题,目前存在的有三种编码规范。
1)BOARD: 从左到右,从上到下:左边基数,右边偶数:1-40
2)BCM:编号侧重 CPU 寄存器,根据 BCM2835 的 GPIO 寄存器编号
3)wpi: 编号侧重实现逻辑,把扩展 GPIO 端口从 0 开始编号,这种编号方便编程。
通过一张图我们就能看清楚
3、引脚设置
# 将引脚设置为输入模式
GPIO.setup(pin, GPIO.IN)
# 将引脚设置为输出模式
GPIO.setup(pin, GPIO.OUT)
# 为输出的引脚设置默认值
GPIO.setup(pin, GPIO.OUT, initial=GPIO.HIGH)
4、控制电平
GPIO.output(pin, state)
状态可以设置为0 / GPIO.LOW / False / 1 / GPIO.HIGH / True
也可以一次性设置多个引脚
pin_list = [11,12]
GPIO.output(pin_list, GPIO.LOW)
5、读取引脚的输入状态
GPIO.input(pin)
6、释放
GPIO.cleanup()
代码
电平控制
控制方法有两种,第一种是直接用高低电平实现控制,这样的方法电机速度只有最大速度以及停止;在后面会介绍使用PWM实现变速控制。
完整代码:
# coding:utf-8
# 本代码实现 树莓派+L298N驱动板 小车的2s前进运动
import RPi.GPIO as gpio
import time
# 定义引脚,你怎么接的怎么改
in1 = 12
in2 = 16
in3 = 18
in4 = 22
# 设置GPIO口为BOARD编号规范
gpio.setmode(gpio.BOARD)
# 设置GPIO口为输出
gpio.setup(in1, gpio.OUT)
gpio.setup(in2, gpio.OUT)
gpio.setup(in3, gpio.OUT)
gpio.setup(in4, gpio.OUT)
# 设置输出电平
gpio.output(in1, gpio.HIGH)
gpio.output(in2, gpio.LOW)
gpio.output(in3, gpio.HIGH)
gpio.output(in4, gpio.LOW)
# 秒级延迟
time.sleep(2)
# 释放
gpio.cleanup()
PWM控制
现在来介绍一下PWM控制的方法:
1、设置PWM波频率,频率越高,调节反应越快
pwm = gpio.PWM(pin, 500)
2、对PWM控制速度进行初始化
pwm.start(0) # 括号中范围为0.0~100.0,0为不动,100为最大
3、过程中调整速度
pwm.ChangeDutyCycle(50) # 括号中范围为0.0~100.0,0为不动,100为最大
4、PWM控制结束
pwm.stop()
完整代码
# coding:utf-8
# 实现树莓派小车的变速控制
import RPi.GPIO as gpio
import time
# 定义引脚,你怎么接的怎么修改
in1 = 12
in2 = 16
in3 = 18
in4 = 22
# 设置GPIO口为BOARD编号规范
gpio.setmode(gpio.BOARD)
# 设置GPIO口为输出
gpio.setup(in1, gpio.OUT)
gpio.setup(in2, gpio.OUT)
gpio.setup(in3, gpio.OUT)
gpio.setup(in4, gpio.OUT)
# 设置PWM波,频率为500Hz
pwm1 = gpio.PWM(in1, 500)
pwm2 = gpio.PWM(in2, 500)
pwm3 = gpio.PWM(in3, 500)
pwm4 = gpio.PWM(in4, 500)
# 初始化
pwm1.start(0)
pwm2.start(0)
pwm3.start(0)
pwm4.start(0)
pwm1.ChangeDutyCycle(50)
pwm2.ChangeDutyCycle(0)
pwm3.ChangeDutyCycle(50)
pwm4.ChangeDutyCycle(0)
# 停3秒
time.sleep(3)
pwm1.stop()
pwm2.stop()
pwm3.stop()
pwm4.stop()
gpio.cleanup()
效果是电机转3秒停下来
在这里补充一个L298N的工作原理图
通过上图可以发现,本来就有一对PWM波控制的接口,所以可以只接两根ENA和ENB,然后控制这两个就行