维基少年:树莓派/树莓派 GPIO Zero 反射计时器
教程作者:Andrew Oakley
公有领域 2016 年 2 月 1 日
www.cotswoldjam.org
本 Python 编程教程向您展示了如何使用 LED 灯和按钮以及新的 GPIO Zero 库。
Words you will see on the screen, or that you need to type in, are highlighted like this.
在每行末尾,您通常需要按下↵ Enter键。
您的导师应该已经为您准备好了树莓派,并给了您一袋组件。如果没有,请参阅末尾的“准备工作”部分。
LED 始终需要与电阻器一起连接。如果您在没有电阻器的情况下连接它们,它们会烧毁,而且很可能无法再次使用。 |
发光二极管 (LED) 是一种灯泡,具有短脚和长脚。如果您摸摸边缘,还会发现一个平边。短脚和平边总是连接到负极(接地)。
电阻器 可以以任何方式连接。较低值(较低欧姆)的电阻器将允许更多电流通过,并使 LED 更亮;较高值将允许更少的电流通过,并使 LED 更暗。我们使用的是 270 欧姆电阻器,但 220-470 欧姆之间的任何电阻器都可以正常工作。
开关 可以以任何方式连接。按下时,它允许电流流动;松开时,电流停止。这种类型的按钮称为“瞬时按下接通开关”。
您还应该有一个面包板和一些跳线。您应该有 3 根长的公对母线(一端突出,另一端凹陷),以及 1 根短的公对公线(两端突出)。
不要担心线的颜色 - 本教程的作者是色盲。 |
按照所示连接面包板。
面包板允许我们快速构建电子电路的原型(即测试)。该板具有顶部部分和底部部分。每部分的所有垂直孔都相互连接,因此如果您将东西插入垂直列,它们将形成连接。
树莓派使用两组编号来指代通用输入输出引脚(GPIO 引脚)。
“板编号”只是从左下角的 1 开始,一直向上和向右,一直到 40。
“BCM 编号”(Broadcom 编号)是树莓派处理器识别引脚连接的方式。
GPIO Zero 使用 BCM 编号。
- 将 LED 的短脚连接到接地连接。
- 将电阻器连接到 LED 的长脚。
- 将电阻器的另一端连接到引脚16 (GPIO 23)。
打开树莓派电源,进入桌面。
从菜单中选择编程 - Python 3。然后使用文件,新建窗口创建新程序。
输入以下程序,或者您可以使用文件,打开打开 python/reaction 文件夹中的 led.py
程序。
from gpiozero import LED
from time import sleep
led=LED(23)
led.on()
sleep(2)
led.off()
使用文件,保存将此程序保存为 led.py,然后通过选择运行菜单,运行模块来运行它。
您应该看到 LED 亮起 2 秒,然后熄灭。
不工作?检查一下:
- GPIO引脚是否正确
- LED的正负极是否正确;短腿接地 (GND)
- 元件是否在面包板上的正确垂直列上
- 没有拼写错误,没有缺少括号,并且你使用了圆括号而不是尖括号、花括号或方括号
这个程序在做什么?
[edit | edit source]from gpiozero import LED
from time import sleep
前两行告诉计算机学习一个新东西。计算机可以从其他人编写的程序中学习,我们称这些其他程序为“库”。我们的指令告诉计算机从 GPIOZero 库学习关于 LED 的知识,并从 time 库学习关于休眠的知识。
led=LED(23)
然后,我们创建一个 LED 对象。我们说 LED 连接到 GPIO 23。
led.on()
sleep(2)
led.off()
打开 LED,等待 2 秒,然后关闭 LED。
检测按钮
[edit | edit source]电路
[edit | edit source]现在添加按钮和连接线。
短跳线应从与现有接地线相同的列,到连接到按钮一条腿的列。
剩下的长跳线应从连接到按钮另一条腿的列,到 **引脚 18 (GPIO 24)** Raspberry Pi 上。
程序
[edit | edit source]在 Python 3 中,使用 文件,新建窗口 创建一个新程序。键入以下程序,或者也可以使用 文件,打开 打开 python/reaction 文件夹中的 button.py 程序。
from gpiozero import Button
from signal import pause
def press():
print ( "Button PRESSED!" )
def unpress():
print ( "Button unpressed!" )
button = Button(24)
button.when_released = unpress
button.when_pressed = press
pause()
缩进在 Python 中很重要。例如,你必须在 print
单词之前键入两个空格。这些缩进定义了一个代码块,因此有了 def
这个词。
使用 文件,保存 将此程序保存为 button.py,然后通过选择 运行 菜单,运行模块 来运行它。
按住按钮。Python 3 shell 窗口中应该显示 "Button PRESSED!"
。
松开按钮。应该显示 "Button unpressed!"
。你可以多次按住并松开按钮。
通过选择 Shell 菜单,重启 shell 来停止程序。
这个程序在做什么?
[edit | edit source]def press():
print ( "Button PRESSED!" )
def unpress():
print ( "Button unpressed!" )
这些称为函数。它们定义 (def
) 应该发生的事情,并为该操作命名。代码缩进以表明它属于该函数。press()
函数显示 "Button PRESSED!"
,unpress()
函数显示 "Button unpressed!"
。
button = Button(24)
button.when_released = unpress
button.when_pressed = press
在这里,我们设置一个按钮对象并告诉计算机它连接到 GPIO 24。
我们还告诉计算机,当按钮被按下或松开时该怎么做。
pause()
这告诉计算机等待事件发生,例如按钮按下。
按钮和 LED 结合
[edit | edit source]在 Python 3 中,使用 文件,新建窗口 创建一个新程序。
键入以下程序,或者也可以使用 文件,打开 打开 python/reaction 文件夹中的 led-button.py
程序。
from gpiozero import Button, LED
from signal import pause
def press():
print ( "Button PRESSED!" )
led.on()
def unpress():
print ( "Button unpressed!" )
led.off()
led=LED(23)
led.off()
button=Button(24)
button.when_released=unpress
button.when_pressed=press
pause()
使用 文件,保存 将此程序保存为 led-button.py,然后通过选择 运行 菜单,运行模块 来运行它。
按下按钮,LED 应该亮起;松开按钮,它应该熄灭。
通过选择 Shell 菜单,重启 shell 来停止程序。
反应时间器
[edit | edit source]在 Python 3 中,使用 文件,新建窗口 创建一个新程序。
键入以下程序,或者也可以使用 文件,打开 打开 python/reaction 文件夹中的 reaction.py
程序。
from gpiozero import LED, Button
from signal import pause
from random import uniform
from time import time, sleep
timestarted=None
def press():
global timestarted,led,button
print ( "Reaction time: %.3f" % (time()-timestarted) )
led.off()
sleep(2)
reset()
def reset():
global timestarted,led
sleep(uniform(0.5,3))
led.blink(0.1,0.4,4,False)
led.on()
timestarted=time()
led=LED(23)
led.off()
button=Button(24)
button.when_pressed=press
reset()
pause()
使用 文件,保存 将此程序保存为 reaction.py
,然后通过选择 运行 菜单,运行模块 来运行它。
LED 将闪烁四次,然后在第五次闪烁时,它将保持亮起,直到你按下按钮。
尝试在第五次闪烁亮起时尽快按下按钮。
你将看到你的反应时间,以秒为单位。
你可以玩多少次都可以,尝试挑战你的朋友看看谁的反应最快。玩够了之后,通过选择 Shell 菜单,重启 shell 来停止程序。
这个程序在做什么?
[edit | edit source]我们在反应程序中引入了几个新概念。
我们使用一个名为 timestarted
的值来记录第五次闪烁开始的时间。然后,我们可以将它与用户按下按钮的时间进行比较,这将告诉我们反应时间。
像 timestarted
这样被命名的值称为 **变量**,因为它们包含的实际值可能会改变。
有些变量是 **全局** 的。这意味着它们可以在程序的任何地方使用。
print ( "Reaction time: %.3f" % (time()-timestarted) )
%.3f
告诉计算机打印一个小数,小数点后有 3 位小数。
我们要打印的数字是现在的时间值减去最后一次闪烁开始的时间值。这是以秒为单位测量的。
sleep(uniform(0.5,3))
uniform
命令在这里用于在 0.5 到 3 之间选择一个随机数。它可能会选择一个小数而不是整数。该命令称为 uniform
,因为如果你调用它足够多次,你将得到一个均匀的随机数分布,你最终将获得该范围内所有可能的数字。
led.blink(0.1,0.4,4,False)
此命令告诉 LED 闪烁 0.1 秒,然后等待 0.4 秒,然后重复 4 次。
最后一个值 False
告诉它在继续执行下一个命令之前等待完成。如果你使用 True
,它会在继续闪烁的同时开始执行下一个命令!我们在这里不希望这样。
你可以在以下网站找到更多关于 GPIO Zero 命令的信息:http://pythonhosted.org/gpiozero
准备工作
[edit | edit source]本教程需要以下电子元件
- 1× 面包板 - 迷你 170 点
- 1× LED - 5mm 漫射通孔,红色
- 1× 电阻 - 碳膜 270 欧姆通孔
- 1× 开关 - 2 针触觉按钮通孔
- 3× 公对母跳线 - 20 厘米
- 1× 公对公跳线 - 10 厘米
本教程的文件可以在以下网站找到:http://www.cotswoldjam.org/downloads/2016-01/
你需要 Raspbian Jessie,包括 Python 3、IDLE 和 GPIO Zero。一旦你安装了 Raspbian Jessie 并连接了互联网,你可以通过进入 菜单,附件,终端 并键入以下命令来确保所有其他文件都已安装:
sudo apt-get update
sudo apt-get dist-upgrade
sudo apt-get install python3-gpiozero wget
mkdir –p ~/python
cd python
wget http://www.cotswoldjam.org/downloads/2016-01/reaction-timercode.zip
unzip reaction-timer-code.zip
exit
dist-upgrade
可能需要一段时间,如果你的系统最近没有更新,可能需要半小时。如果 apt-get
告诉你已经安装了软件包,不要担心。
文件
[edit | edit source]本教程的原始 PDF 文件位于 Wikicommons 上:Cjam-reaction-tutorial.pdf
button.py
[edit | edit source]from gpiozero import Button
from signal import pause
def press():
print ( "Button PRESSED!" )
def unpress():
print ( "Button unpressed!" )
button = Button(24)
button.when_released = unpress
button.when_pressed = press
pause()
led.py
[edit | edit source]from gpiozero import LED
from time import sleep
led=LED(23)
led.on()
sleep(2)
led.off()
from gpiozero import Button, LED
from signal import pause
def press():
print ( "Button PRESSED!" )
led.on()
def unpress():
print ( "Button unpressed!" )
led.off()
led=LED(23)
led.off()
button=Button(24)
button.when_released=unpress
button.when_pressed=press
pause()
from gpiozero import LED, Button
from signal import pause
from random import uniform
from time import time, sleep
timestarted=None
def press():
global timestarted,led,button
print ( "Reaction time: %.3f" % (time()-timestarted) )
led.off()
sleep(2)
reset()
def reset():
global timestarted,led
sleep(uniform(0.5,3))
led.blink(0.1,0.4,4,False)
led.on()
timestarted=time()
led=LED(23)
led.off()
button=Button(24)
button.when_pressed=press
reset()
pause()