文章目录

  • 介绍
  • 使用说明
  • 代码
  • 电平控制
  • 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 开始编号,这种编号方便编程。

通过一张图我们就能看清楚

gpio库 python 树莓派 树莓派gpio编程_树莓派


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的工作原理图

gpio库 python 树莓派 树莓派gpio编程_raspberry_02

通过上图可以发现,本来就有一对PWM波控制的接口,所以可以只接两根ENA和ENB,然后控制这两个就行