RaspberyPi 4B RPi库编程
RaspberyPi 4B RPi库编程
- Raspberry PI 4B 引脚图
- RPi.GPIO模块简述
- RPi.GPIO模块示例
- output输出
- input 输入
- PWM模块
- 阻塞等待
- 事件回调
- 运行环境
Raspberry PI 4B 引脚图
树莓派实验室
RPi.GPIO模块简述
导入模块:
-
import RPi.GPIO as GPIO
-
或检查是否导入成功
try:
import RPi.GPIO as GPIO
except RuntimeError:
print(“Error importing RPi.GPIO! This is probably because you need superuser privileges. You can achieve this by using ‘sudo’ to run your script”) -
调用示例:
- GPIO.getmode()
- GPIO.setmode(GPIO.BCM)
- GPIO.setup(4, GPIO.OUT)
- GPIO.setup(4, GPIO.IN, GPIO.PUD_UP, False)
- GPIO.cleanup(4) or GPIO.cleanup()
模块函数:
-
getmode():
- 功能:返回当前GPIO引脚编号方式
- 返回值:BOARD 或 BCM
-
setmode(new_mode):
- 功能:设置GPIO引脚编号方式
- 参数:BOARD 或 BCM
-
setup(chanlist, direction, pull_up_down=20, initial=None):
- 功能:设置GPIO
- 参数:
- chanlist : GPIO编号,列表方式可以设置多个引脚如,leds=[17, 27, 22]
- direction: GPIO方向,OUT输出,IN输入
- pull_up_down:上下拉,PUD_OFF禁止,PUD_DOWN使能下拉,PUD_UP使能上拉。(仅输入模式可用!)
- initial:初始状态 False或True
-
cleanup(chanlist=None):
- 功能:清除GPIO设置
- 参数:
- chanlist:可选,不填写或None清除所有GPIO设置。填入一个GPIO编号或列表清除指定的1个或列表定义的多个GPIO设置。
-
input(channel):
- 功能:读取指定GPIO的电平状态(GPIO必须设置为IN模式)
- 参数:
- channel :引脚编号
- 返回:IO电平状态值
-
output(channel, value):
- 功能:写入指定GPIO的电平值
- 参数:
- channel :引脚编号
- value: LOW 或 HIGH
-
gpio_function(channel):
- 功能:获取GPIO当前功能模式
- 返回:当前功能模式(IN/OUT/SERIAL/SPI/I2C/HARD_PWM)其中一个的值,注意返回的是对应功能的数值!
- 参数:
- channel :引脚编号
-
wait_for_edge(channel, edge, bouncetime=None, timeout=None):
- 功能:阻塞等待(注意调用之后会一直阻塞在这里后面的代码不会继续执行,直到触发条件发生或设置的超时时间到才会继续执行后面的代码)
- 参数:
- channel :引脚编号
- edge:触发沿,RISING上升沿,FALLING下降沿,BOTH双沿
- bouncetime:去抖时间,单位毫秒
- timeout: 等待超时时间,单位毫秒
-
add_event_detect(channel, edge, callback=None, bouncetime=None):
- 功能:添加事件探测(非阻塞方式,条件满足触发调用callback函数)
- 参数:
- channel :引脚编号
- edge:触发沿,RISING上升沿,FALLING下降沿,BOTH双沿
- bouncetime:去抖时间,单位毫秒
-
event_detected(channel):
- 功能:删除事件检测,如果自上次查询该指定通道(channel) 以来,有边缘信号(edge)(即引脚电平的上升沿 RISING 或下降沿 FALLING)发生,则该函数返回 True。如果没有边缘信号发生,则返回 False。
- 参数:
- channel :引脚编号
-
add_event_callback(channel, callback):
- 功能:添加事件回调函数(一个事件可以添加多个回调函数)
- 参数:
- channel :引脚编号
- callback:回调函数
-
remove_event_detect(channel):
- 功能:移除后台事件检测
- 参数:
- channel :引脚编号
-
sleep(…):
- 功能:延时,很少用一般用time模块的sleep函数
- 参数:
- seconds: 延时时间,单位秒。
-
setwarnings(value):
- 功能:设置使能或禁止警告
- 参数:
- value: False禁止,True使能
模块属性:
-
BOARD:GPIO引脚BOARD编码方式
-
BCM:GPIO引脚BCM编码方式
-
RISING:中断上升沿触发
-
FALLING:中断下降沿触发
-
BOTH:中断双沿(上升沿/下降沿)触发
-
OUT:GPIO输出模式
-
IN:GPIO输入模式
-
PUD_OFF:禁止上下拉
-
PUD_DOWN:使能下拉
-
PUD_UP:使能上拉
-
LOW:GPIO低电平
-
HIGH:GPIO高电平
-
SERIAL:串口接口
-
SPI:SPI接口
-
I2C:I2C接口
-
HARD_PWM:硬件PWM
-
RPI_INFO:版本信息
-
RPI_REVISION:修订版本
-
UNKNOWN:未知
-
VERSION:版本
-
模块PWM类
- PWM(channel, frequency):
- 功能: 创建PWM实例
- 返回:PWM实例
- 参数:
- channel :引脚编号
- frequency :PWM频率值,单位Hz
- ChangeDutyCycle(self, dc):
- 功能:改变占空比
- 参数:
- dc: 占空比,取值范围0~100
- ChangeFrequency(self, frequency):
- 功能:改变PWM频率
- 参数:
- frequency:PWM频率值,单位Hz
- start(self, dc):
- 功能:启动PWM
- 参数:
- dc: 占空比,取值范围0~100
- stop(self)
- 功能:停止PWM输出
- PWM(channel, frequency):
RPi.GPIO模块示例
output输出
控制RGB三色灯
import RPi.GPIO as GPIO
import timeLEDR = 17
LEDG = 27
LEDB = 22GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
#GPIO.setmode(GPIO.BOARD)GPIO.setup(LEDR, GPIO.OUT, initial=False)
GPIO.setup(LEDG, GPIO.OUT, initial=False)
GPIO.setup(LEDB, GPIO.OUT, initial=False)GPIO.output(LEDR, GPIO.LOW)
GPIO.output(LEDG, GPIO.HIGH)
GPIO.output(LEDB, GPIO.LOW)
time.sleep(2.5)GPIO.output(LEDR, GPIO.LOW)
GPIO.output(LEDG, GPIO.LOW)
GPIO.output(LEDB, GPIO.HIGH)
time.sleep(2.5)GPIO.cleanup(LEDS)
# 或 GPIO.cleanup()
列表方式控制多个GPIO
import RPi.GPIO as GPIO
import timeLEDS = [17, 27, 22]GPIO.setmode(GPIO.BCM)
GPIO.setup(LEDS, GPIO.OUT, initial=True)GPIO.output(LEDS, GPIO.LOW)
GPIO.output(LEDS, (GPIO.HIGH, GPIO.LOW, GPIO.LOW))time.sleep(5)#GPIO.cleanup()
GPIO.cleanup(LEDS)
input 输入
import RPi.GPIO as GPIO
import timeKEY1 = 20
KEY2 = 21LED1 = 17
LED2 = 27GPIO.setmode(GPIO.BCM)GPIO.setup(KEY1, GPIO.IN, GPIO.PUD_UP)
GPIO.setup(KEY2, GPIO.IN, GPIO.PUD_UP)print(GPIO.gpio_function(KEY1))
print(GPIO.gpio_function(LED1))GPIO.setup(LED1, GPIO.OUT)
GPIO.setup(LED2, GPIO.OUT)while True:k1 = GPIO.input(KEY1)k2 = GPIO.input(KEY2)GPIO.output(LED1, k1)GPIO.output(LED2, k2)time.sleep(0.1)
PWM模块
import RPi.GPIO as GPIO
import timeGPIO.setmode(GPIO.BOARD)
GPIO.setup(15,GPIO.OUT, initial=True)pwm = GPIO.PWM(15, 1000)pwm.start(0) # 0~100
pwm.ChangeFrequency(2000) # frequency* (in Hz).
time.sleep(1)pwm.ChangeDutyCycle(25) # duty-cycle (which must be between 0 and 100) given by *dc*.
time.sleep(1)
pwm.ChangeDutyCycle(50)
time.sleep(1)
pwm.ChangeDutyCycle(75)
time.sleep(1)pwm.stop()
GPIO.cleanup()
阻塞等待
阻塞等待一直等待
import RPi.GPIO as GPIO
import timeGPIO.setmode(GPIO.BCM)GPIO.setup(20, GPIO.IN, GPIO.PUD_UP)print('Waitting .....')
GPIO.wait_for_edge(20, GPIO.RISING)
print('Rising Edge Come.')#GPIO.wait_for_edge(20, GPIO.FALLING)
#print('Falling Edge Come.')#GPIO.wait_for_edge(20, GPIO.BOTH)
#print('Both Edge Come.')while True:print('running ...')time.sleep(1)GPIO.cleanup(20)
阻塞等待-增加去抖时间
import RPi.GPIO as GPIO
import timeGPIO.setmode(GPIO.BCM)GPIO.setup(20, GPIO.IN, GPIO.PUD_UP)print('wait for edge...')
GPIO.wait_for_edge(20, GPIO.FALLING, bouncetime=200)
print("wait end.")while True:print("Running...")time.sleep(2.5)
阻塞等待-设置超时
import RPi.GPIO as GPIO
import timeGPIO.setmode(GPIO.BCM)
GPIO.setup(20, GPIO.IN, GPIO.PUD_UP)print('wait for edge...')
GPIO.wait_for_edge(20, GPIO.RISING, bouncetime=200, timeout=5000)
print('wait end.')while True:print('Running...')time.sleep(1)
事件回调
import RPi.GPIO as GPIO
import timeGPIO.setmode(GPIO.BCM)
GPIO.setup(20, GPIO.IN, GPIO.PUD_UP)def callback_one(channel):print('Callback One')def callback_two(channel):print('Callback Two')GPIO.add_event_detect(20, GPIO.FALLING)
GPIO.add_event_callback(20, callback_one)
GPIO.add_event_callback(20, callback_two)while True:print(' Running...')time.sleep(1)
GPIO.cleanup()
事件检测-双沿触发-判断GPIO电平值
import RPi.GPIO as GPIO
import timeGPIO.setmode(GPIO.BCM)
GPIO.setup(20, GPIO.IN, GPIO.PUD_UP)def callback_one(channel):val = GPIO.input(channel)print('callback_one value:' , val)def callback_two(channel):val = GPIO.input(channel)print('callback_two value:' , val)GPIO.add_event_detect(20, GPIO.BOTH, bouncetime=100)GPIO.add_event_callback(20, callback_one)
GPIO.add_event_callback(20, callback_two)while True:print('Running...')time.sleep(3)GPIO.event_detected(20)
GPIO.cleanup()
运行环境