文章目录
- 前言
- 一、代码实例
- 二、基础用法
- 1.GPIO.setmode--设置引脚编号
- 2.GPIO.setwarnings(False)--GPIO口警告
- 3.设置channel多通道方法
- 4.GPIO.setup--设置通道
- 5.GPIO.input(channel)--读取 GPIO 引脚的值
- 6.GPIO.output(channel, state)--设置 GPIO 引脚的输出状态
- 7.同一个调用中输出到多通道
- 8.GPIO.cleanup()--清理释放
- 三、RPi.GPIO 中使用 PWM
- 1.创建 PWM 实例:
- 2.启动 PWM:
- 3.改变频率:
- 4.更改占空比:
- 5.要停止 PWM:
- 四、总结
前言
树莓派中有40个引脚,就是GPIO,意思就是通用型输入输出。使用Python对其进行控制,就要使用第三方库 RPi.GPIO,这里简单介绍一下
一、代码实例
以下是双色LED灯实验,将中间引脚接入物理引脚编号为11的,将S接入物理引脚编号为12,G接入管脚为GND。
import time
try:
import RPi.GPIO as GPIO # 导入GPIO模块
except RuntimeError:
print("Error importing RPi.GPIO!这可能是因为你需要超级用户权限。你可以通过使用'sudo'来运行你的脚本来实现这一点")
colors = [0xFF00, 0x00FF, 0x0FF0, 0xF00F]
makerobo_pins = [11, 12] # PIN管脚字典 GPIO.BOARD对应实际物理管脚 GPIO.BCM对应BCM编码
GPIO.setmode(GPIO.BOARD) # 采用实际的物理管脚给GPIO口
GPIO.setwarnings(False) # 去除GPIO口警告
GPIO.setup(makerobo_pins, GPIO.OUT) # 设置Pin模式为输出模式
GPIO.output(makerobo_pins, GPIO.LOW) # 设置Pin管脚为低电平(0V)关闭LED
p_R = GPIO.PWM(makerobo_pins[0], 1000) # 设置频率为1KHz
p_G = GPIO.PWM(makerobo_pins[1], 1000) # 设置频率为1KHz
# 初始化占空比为0(led关闭)
p_R.start(0)
p_G.start(0)
# 按比例缩放函数
def makerobo_pwm_map(x, in_min, in_max, out_min, out_max):
return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min
# 设置颜色
def makerobo_set_Color(col): # 例如:col = 0x1122
# 第一个col=0xFF00 转为2进制 为16位1111 1111 0000 0000
R_val = col >> 8 # 前8位给红色
G_val = col & 0x00FF # 后8位给红色
# 把0-255的范围同比例缩小到0-100之间
R_val = makerobo_pwm_map(R_val, 0, 255, 0, 100)
G_val = makerobo_pwm_map(G_val, 0, 255, 0, 100)
p_R.ChangeDutyCycle(R_val) # 改变占空比
p_G.ChangeDutyCycle(G_val) # 改变占空比
# 调用循环函数
def makerobo_loop():
while True:
for col in colors:
makerobo_set_Color(col)
time.sleep(0.5)
# 释放资源
def makerobo_destroy():
p_G.stop()
p_R.stop()
GPIO.output(makerobo_pins, GPIO.LOW) # 关闭所有LED
GPIO.cleanup() # 释放资源
# 程序入口
if __name__ == "__main__":
try:
makerobo_loop() # 调用循环函数
except KeyboardInterrupt: # 当按下Ctrl+C时,将执行destroy()子程序。
makerobo_destroy() # 释放资源
二、基础用法
1.GPIO.setmode–设置引脚编号
使用Python操作树莓派引脚时,有两种编码方式:
- 一种是 BOARD编号,即树莓派上实际物理引脚编号
GPIO.setmode(GPIO.BOARD) # BOARD编号,采用实际的物理管脚给GPIO口
- 另一种是BCM 编号,指的是 Broadcom SOC 上的频道编号,可以对应图表来说明哪个通道编号连接到 RPi 板上的哪个引脚。
GPIO.setmode(GPIO.BCM) # BCM编号
建议使用 BOARD 编号,这种实际物理管脚的优势在于,无论 RPi 的电路板版本如何,您的硬件始终可以工作。您无需重新连接连接器或更改代码。而 BCM 编号,可能会在 Raspberry Pi 板的修订版之间中断。
- 以下为树莓派管脚图:可参考
2.GPIO.setwarnings(False)–GPIO口警告
你的树莓派的GPIO上可能有多个脚本/电路,因此,如果 RPi.GPIO 检测到某个引脚已配置为默认值(输入)以外的其他内容,则在尝试配置脚本时会收到警告,其实没有影响。要禁用这些警告:
GPIO.setwarnings(False) # 去除GPIO口警告
3.设置channel多通道方法
设置多个通道可以一起设置,可以使用列表或元组把他们作为一个整体
- 列表方式
makerobo_pins = [11, 12] # PIN管脚字典 GPIO.BOARD对应实际物理管脚 GPIO.BCM对应BCM编码
- 元组
makerobo_pins = (11, 12) # PIN管脚字典 GPIO.BOARD对应实际物理管脚 GPIO.BCM对应BCM编码
4.GPIO.setup–设置通道
4.1 GPIO.setup(channel, GPIO.IN)
- 将通道配置为输入, makerobo_pins为设置多通道的列表方式
GPIO.setup(makerobo_pins, GPIO.IN) # 设置Pin模式为输入模式
4.2 GPIO.setup(channel, GPIO.OUT)
示例代码中:
- 将通道配置为输出, makerobo_pins为设置多通道的列表方式
GPIO.setup(makerobo_pins, GPIO.OUT)) # 设置Pin模式为输出模式
4.3 GPIO.setup(channel, GPIO.OUT, initial=GPIO.HIGH)
- 还可以为输出通道指定初始值:
5.GPIO.input(channel)–读取 GPIO 引脚的值
这将返回 0 / GPIO.LOW / False 或 1 / GPIO.HIGH / True。
6.GPIO.output(channel, state)–设置 GPIO 引脚的输出状态
状态可以是 0 / GPIO.LOW / False 或 1 / GPIO.HIGH / True。
7.同一个调用中输出到多通道
chan_list = [11,12] # 适用于列表或元组
GPIO.output(chan_list, GPIO.LOW) # 设置所有GPIO.LOW
GPIO.output(chan_list, (GPIO.HIGH, GPIO.LOW)) # 设置第一个高和第二个低
示例代码中:
GPIO.output(makerobo_pins, GPIO.LOW) # 设置Pin管脚为低电平(0V)关闭LED
8.GPIO.cleanup()–清理释放
8.1 要在脚本结束时进行清理:
GPIO.cleanup()
8.2 程序退出时,可能不想清理每个频道而留下一些设置。可以清理单个频道、频道列表或元组:
GPIO.cleanup(channel)
GPIO.cleanup( (channel1, channel2) )
GPIO.cleanup( [channel1, channel2] )
简单说一下频率和占空比,不是专业的,望补充:
- 频率:每秒钟信号从高电平到低电平再回到高电平的次数。PWM是间接的,高电平是亮,低电平不亮,即高低电平交替,频率很快,所以人眼基本分辨不出来是一亮一暗的,而且高电平亮的时候会激活LED,低电平的时候LED不会瞬间暗,而是有一个由明到暗的一个过程。或许有疑问,为什么不一直高电平就常亮,因为高低电平的信号才方便我们进行控制。这里感谢我的嵌入式开发同事讲解。
- 占空比:高电平持续时间和低电平持续时间之间的比例。占空比越大,那个信号强度就越高,比如这里双色LED灯中,红色信号占空比大,就先显红色。
1.创建 PWM 实例:
p = GPIO.PWM(channel, frequency) #(通道、 频率)
示例代码中:
makerobo_pins = [11, 12] # PIN管脚字典
...
p_R = GPIO.PWM(makerobo_pins[0], 1000) # 设置频率为1KHz
p_G = GPIO.PWM(makerobo_pins[1], 1000) # 设置频率为1KHz
2.启动 PWM:
p.start(dc) # 其中 dc 是占空比 (0.0 <= dc <= 100.0)
示例代码中:
# 初始化占空比为0(led关闭)
p_R.start(0)
p_G.start(0)
3.改变频率:
p.ChangeFrequency(freq) # 其中 freq 是以赫兹为单位的新频率
4.更改占空比:
p.ChangeDutyCycle(dc) # 其中 0.0 <= dc <= 100.0
示例代码中:
# 设置颜色
def makerobo_set_Color(col): # 例如:col = 0x1122
...
p_R.ChangeDutyCycle(R_val) # 改变占空比
p_G.ChangeDutyCycle(G_val) # 改变占空比
5.要停止 PWM:
p.stop()
示例代码中:
# 释放资源
def makerobo_destroy():
p_G.stop()
p_R.stop()
...
还有一些高级用法,比如线程回调,后面有时间再写吧。
欢迎各位交流。您的点赞是我坚持的动力。