pi4j 树莓派 gpio
Raspberry Pi上最令人兴奋的入门活动之一是您在常规PC或笔记本电脑上无法做到的事情-使现实世界发生某些事情,例如使LED闪烁或控制电动机。 如果您以前做过类似的事情,则可能是使用RPi.GPIO库通过Python 完成的 ,该库已在无数项目中使用。 现在,有一种与物理组件进行交互的更为简单的方法:一种名为GPIO Zero的新友好Python API。
吉尔斯·布斯摄。 经许可使用
我最近写了有关Raspberry Pi Zero的信息 ,这是5美元的计算机,并且是负担得起的硬件世界的最新版本。 尽管名称相似,但GPIO Zero和Raspberry Pi Zero项目无关,并且没有耦合。 GPIO Zero库可以在所有Raspberry Pi模型上使用,并且与Python 2和Python 3兼容。
RPi.GPIO库是基础知识,它提供了使用Pi的GPIO引脚执行简单操作的所有基本功能-将引脚设置为输入或输出,读取输入,将输出设置为高或低,等等。 GPIO Zero建立在此之上,并为日常组件提供了一系列简单的接口,因此您无需将引脚2设置为高电平来打开LED,而是拥有一个LED对象并打开它。
GPIO端口标签–来自rasp.io/portsplus
入门
使用GPIO零,您可以导入正在使用的接口的名称,例如: from gpiozero import LED
此外,您还必须正确连接正在使用的所有组件并将它们连接到GPIO引脚。 注意,有些引脚分配给3V3、5V和GND。 一些是特殊目的,其余是通用。 有关更多信息,请参考pinout.xyz或使用端口标签 :
用以下代码闪烁LED:
from gpiozero import LED
from time import sleep
led = LED(17)
while True:
led.on()
sleep(1)
led.off()
sleep(1)
或者,使用LED的blink()
方法,但请确保通过signal.pause()
使程序保持活动状态, signal.pause()
所示:
from gpiozero import LED
from signal import pause
led = LED(17)
led.blink()
pause()
输出设备
除了基本的LED接口外,使用on()
, off()
, toggle()
和blink()
,GPIO Zero还为Buzzer和Motor提供了类,它们的工作方式类似:
from gpiozero import Buzzer, Motor
from time import sleep
buzzer = Buzzer(14)
motor = Motor(forward=17, backward=18)
while True:
motor.forward()
sleep(10)
motor.backward()
buzzer.beep()
sleep(10)
buzzer.off()
还有用于PWMLED的接口(控制亮度,而不仅仅是打开/关闭),以及用于RGB LED的接口,RGB LED是由红色,绿色和蓝色部分组成的LED,利用它们的亮度来提供全彩色控制。
甚至还有一个用于TrafficLights的界面。 提供连接到红色,琥珀色和绿色指示灯的引脚号,然后使用以下命令进行控制:
lights = TrafficLights(2, 3, 4)
lights.on()
lights.off()
lights.blink()
lights.green.on()
lights.red.on()
等等。
输入设备
最简单的输入设备是按钮,提供的界面使按下按钮即可轻松控制程序:
from gpiozero import Button
button = Button(14)
while True:
if button.is_pressed:
print("Pressed")
使用按下按钮来控制程序的另一种方法是使用wait_for_press
:
button.wait_for_press()
print("pressed")
这将暂停程序,直到按下按钮,然后继续。 另外,您可以将动作连接到按钮按下,而不是轮询按钮状态:
button.when_pressed = led.on
button.when_released = led.off
在这里,方法led.on
作为按下按钮时要运行的动作传递,而方法led.on
在按钮释放时led.off
。 这意味着当按下按钮时,LED点亮,而在释放按钮时,LED熄灭。 除了使用其他GPIO零对象方法外,您还可以使用自定义函数:
def hello():
print("Hello")
def bye():
print("Bye")
button.when_pressed = hello
button.when_released = bye
现在,每次按下按钮时,都会调用hello
函数并显示“ Hello”。 释放按钮时,它会打印“再见”。
以这种方式使用自定义功能可能是运行一组GPIO指令的好方法,例如交通信号灯序列:
def sequence():
lights.green.off()
lights.amber.on()
sleep(1)
lights.amber.off()
lights.red.on()
sleep(20)
lights.amber.on()
sleep(1)
lights.green.on()
lights.amber.off()
lights.red.off()
lights.green.on()
button.when_pressed = sequence
现在,当按下按钮时,交通灯将从绿色变为红色,然后等待20秒钟,然后以通常的方式变回红色。
感测器
交换另一个输入设备(例如基本传感器)的按钮可以打开一个有趣的项目世界。 代替按钮,使用运动传感器:
from gpiozero import MotionSensor
sensor = MotionSensor(15)
然后使用sensor.if_motion
, sensor.wait_for_motion
和sensor.when_motion
。 为LightSensor提供了类似的接口。
模拟设备
Raspberry Pi没有本地模拟输入引脚,但是您可以轻松地连接ADC(模数转换器)并访问模拟输入设备(例如电位计 )并读取其值:
from gpiozero import MCP3008
pot = MCP3008()
while True:
print(pot.value)
电位计返回的值从0到1,这意味着您可以轻松地将它们连接到输出设备:
from gpiozero import PWMLED, MCP3008
led = PWMLED(4)
pot = MCP3008()
while True:
led.value = pot.value
现在,LED的亮度直接由电位器值控制。
另外,GPIO零的聪明功能使您可以将两个设备直接连接在一起,而无需在循环内不断更新。 每个输出设备都有一个source
属性,它可以读取一个无限的值生成器。 所有设备(输入和输出)都具有一个values
属性,该属性是一个无限生成器,始终产生设备的当前值:
from gpiozero import PWMLED, MCP3008
led = PWMLED(4)
pot = MCP3008()
led.source = pot.values
这与前面的示例完全相同,只是不需要while
循环。
您可以将多个模拟输入连接到同一个ADC(MCP3008芯片提供8个通道)。 本示例使用三个电位器,使用相同的方法可以控制RGB LED中的每个颜色通道:
led = RGBLED(red=2, green=3, blue=4)
red_pot = MCP3008(channel=0)
green_pot = MCP3008(channel=1)
blue_pot = MCP3008(channel=2)
led.red.source = red_pot.values
led.green.source = green_pot.values
led.blue.source = blue_pot.values
这使您可以将三个电位器用作RGB LED的颜色混合器。
捆绑接口
像TrafficLights界面一样,还有其他用于捆绑组件的组件,尤其是在常用的简单附加板上使用的组件。
通用LED板或LED集合,可一起或单独控制:
from gpiozero import LEDBoard
lights = LEDBoard(2, 3, 4, 5, 6)
lights.on()
lights.off()
lights.leds[1].on()
lights.leds[3].toggle()
lights.leds[5].on()
lights.leds[2].blink()
lights.leds[4].blink()
Ryanteck TrafficHAT:
from gpiozero import TrafficHat
hat = TrafficHat()
hat.on()
hat.off()
hat.lights.blink()
hat.buzzer.on()
hat.button.when_pressed = hat.lights.on
hat.button.when_released = hat.lights.off
请注意,TrafficHat接口不需要一组引脚号,因为它们已在类中定义。
连接两个电动机并制成机箱,您将拥有一个Raspberry Pi机器人:
from gpiozero import Robot
robot = Robot(left=(4, 14), right=(17, 18))
robot.forward()
robot.backward()
robot.reverse()
robot.left()
robot.forward()
robot.stop()
将所有东西归零
现在有了一个零名称项目套件,为什么不将它们结合使用? 用GPIO零和PyGame零编程的Pi零动力机器人怎么样?
GPIO Zero和PyGame Zero可以很好地协同工作-完美地为GPIO组件创建屏幕界面。
由itsAll_Geek2Me摄 。 经许可使用。
现在就试试!
自12月以来, Raspbian Jessie映像中已包含GPIO Zero,因此您可以从raspberrypi.org/downloads获取副本。 如果您有较旧的映像,请使用以下命令进行安装:
sudo apt-get update
sudo apt-get install python3-gpiozero python-gpiozero
在REPL中打开IDLE和原型,或创建一个文件来保存脚本。 您也可以使用常规的Python Shell,或安装IPython并使用它。
更多
阅读有关GPIO零的更多信息:
- 阅读文档的完整文档
- GitHub上的GPIO零源
- MagPi#39中的GPIO零
- GPIO零:在bennuttall.com上为物理计算开发新的友好的Python API
- GPIO零入门学习资源
- raspi.tv上的GPIO零介绍
- RasP.iO Pro HAT Kickstarter-完美的GPIO零
- 保持物理计算简单化-Giles Booth
- GPIO零:乔治,我想我明白了—麦克·霍恩(Mike Horne)
翻译自: https://opensource.com/education/16/2/programming-gpio-zero-raspberry-pi
pi4j 树莓派 gpio