树莓派中有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() # 释放资源
使用Python操作树莓派引脚时,有两种编码方式:
GPIO.setmode(GPIO.BOARD) # BOARD编号,采用实际的物理管脚给GPIO口
GPIO.setmode(GPIO.BCM) # BCM编号
建议使用 BOARD 编号,这种实际物理管脚的优势在于,无论 RPi 的电路板版本如何,您的硬件始终可以工作。您无需重新连接连接器或更改代码。而 BCM 编号,可能会在 Raspberry Pi 板的修订版之间中断。
你的树莓派的GPIO上可能有多个脚本/电路,因此,如果 RPi.GPIO 检测到某个引脚已配置为默认值(输入)以外的其他内容,则在尝试配置脚本时会收到警告,其实没有影响。要禁用这些警告:
GPIO.setwarnings(False) # 去除GPIO口警告
设置多个通道可以一起设置,可以使用列表或元组把他们作为一个整体
makerobo_pins = [11, 12] # PIN管脚字典 GPIO.BOARD对应实际物理管脚 GPIO.BCM对应BCM编码
makerobo_pins = (11, 12) # PIN管脚字典 GPIO.BOARD对应实际物理管脚 GPIO.BCM对应BCM编码
4.1 GPIO.setup(channel, GPIO.IN)
GPIO.setup(makerobo_pins, GPIO.IN) # 设置Pin模式为输入模式
4.2 GPIO.setup(channel, GPIO.OUT)
示例代码中:
GPIO.setup(makerobo_pins, GPIO.OUT)) # 设置Pin模式为输出模式
4.3 GPIO.setup(channel, GPIO.OUT, initial=GPIO.HIGH)
这将返回 0 / GPIO.LOW / False 或 1 / GPIO.HIGH / True。
状态可以是 0 / GPIO.LOW / False 或 1 / GPIO.HIGH / True。
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.1 要在脚本结束时进行清理:
GPIO.cleanup()
8.2 程序退出时,可能不想清理每个频道而留下一些设置。可以清理单个频道、频道列表或元组:
GPIO.cleanup(channel)
GPIO.cleanup( (channel1, channel2) )
GPIO.cleanup( [channel1, channel2] )
简单说一下频率和占空比,不是专业的,望补充:
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
p.start(dc) # 其中 dc 是占空比 (0.0 <= dc <= 100.0)
示例代码中:
# 初始化占空比为0(led关闭)
p_R.start(0)
p_G.start(0)
p.ChangeFrequency(freq) # 其中 freq 是以赫兹为单位的新频率
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) # 改变占空比
p.stop()
示例代码中:
# 释放资源
def makerobo_destroy():
p_G.stop()
p_R.stop()
...
还有一些高级用法,比如线程回调,后面有时间再写吧。
欢迎各位交流。您的点赞是我坚持的动力。