跳转到内容

维基少年:树莓派/树莓派 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 根短的公对公线(两端突出)。

点亮 LED

[编辑 | 编辑源代码]

按照所示连接面包板。

面包板允许我们快速构建电子电路的原型(即测试)。该板具有顶部部分和底部部分。每部分的所有垂直孔都相互连接,因此如果您将东西插入垂直列,它们将形成连接。

树莓派使用两组编号来指代通用输入输出引脚(GPIO 引脚)。

“板编号”只是从左下角的 1 开始,一直向上和向右,一直到 40。

“BCM 编号”(Broadcom 编号)是树莓派处理器识别引脚连接的方式。

GPIO Zero 使用 BCM 编号。

  1. 将 LED 的短脚连接到接地连接。
  2. 将电阻器连接到 LED 的长脚。
  3. 将电阻器的另一端连接到引脚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()

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()

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()
华夏公益教科书