跳转到内容

维基少年:树莓派/树莓派 LED 生日蜡烛

来自维基教科书,开放世界中的开放书籍

由安德鲁·奥克利撰写教程
公有领域 2015 年 4 月 17 日
www.cotswoldjam.org

本教程将向您展示如何使用树莓派计算机构建一个基于 LED(光)和光电二极管(光检测器)的生日蜡烛。

您将能够“吹灭”LED - 它将关闭并播放一首曲子!

Words you will see on the screen are highlighted like this
Words you need to type in are highlighted and underlined

在每行末尾,您通常需要按 ↵ Enter 键。

您的导师应该已经为您准备好了您的树莓派。如果没有,请参阅文末的“准备”部分。

发光二极管 (LED)

[编辑 | 编辑源代码]

LED(发光二极管)有一个短腿和一个长腿。如果您在边缘周围摸摸,您还会发现一个平坦的边缘。短腿和平坦的边缘始终连接到负极(接地)。

电阻可以以任何方式连接。我们使用的是 270 欧姆(红红棕)电阻,但 220-470 欧姆之间的任何电阻都可以正常工作。

光敏电阻 (LDR)

[编辑 | 编辑源代码]

光敏电阻 (LDR) 也称为光电二极管或光敏电阻,可以以任何方式连接。当有更多光线时,它们让更多电流通过。我们使用的是一个额定值为 2 到 20,000 欧姆的电阻,但大多数在爱好者工具包中找到的光电二极管都可以正常工作。

电容器

[编辑 | 编辑源代码]

电容器有一个短腿和一个长腿,以及一侧的条纹。与 LED 一样,它们必须使用短腿和条纹连接到负极(接地)。我们使用的是 1 微法拉电容器,您也应该使用它。

电容器存储少量的电荷,然后当它充满时,它会释放所有电荷。

  • 如果您将其连接到强电荷,它会更快地释放电荷。
  • 如果您将其连接到弱电荷,它需要更长时间才能释放电荷。

跳线(也称为 DuPont 线)将电子元件连接到 GPIO 引脚。您还应该有两根短跳线和一根长跳线(全部为“母对母” - 两端都有孔)。

按照以下步骤构建电路。首先放置组件,最后放置跳线。不用担心回形针,现在还不需要。

以下是您在插入跳线之前面包板应该是什么样子的。

以下是连接了跳线的面包板。

腿部修剪

[编辑 | 编辑源代码]

当元件从工厂出来时,它们有长腿(线)。您的导师可能已经修剪了您元件的腿,在这种情况下,您无需再次修剪。如果您的元件有长腿,那么在您剪断它们之前,您应该通过将其连接到树莓派并运行程序来试用您的电路。

如果您需要修剪腿部,您可以使用厨房剪刀或特殊的剪线工具。无论哪种方式,在剪断元件的腿部时都要小心。

  • 不要将腿部修剪得太短,以至于它们不伸入面包板孔中。
  • 对于 LED 和电容器,请记住您可以使用 LED 边缘或电容器条纹来区分正负,即使您将两条腿都修剪到相同的长度。

连接树莓派

[编辑 | 编辑源代码]

按照图表连接跳线。

Raspberry Pi 的 GPIO 端口上的引脚编号如下。在旧型号上,只有 26 个引脚,但它们仍然从左侧的 1 和 2 开始。

顶行是偶数,底行是奇数。

测试程序

[编辑 | 编辑源代码]

启动你的 Raspberry Pi,登录并进入桌面。如果你需要登录,默认用户名是 pi,密码是 raspberry。如果桌面仍然没有出现,输入 startx 并按下 ↵ Enter 键。

从菜单中选择编程 - Python 2(不是 Python 3)。然后使用文件,新建窗口创建一个新程序。点击文件,另存为并通过双击 python 然后双击 candle 进入 python/candle 文件夹。保存为:mycandle.py

点亮 LED

[编辑 | 编辑源代码]

让我们从点亮 LED 开始。输入以下程序,或从示例文件夹中的 mycandle1.py 加载它

import RPi.GPIO as GPIO, time

GPIO.setmode(GPIO.BOARD)
GPIO.setwarnings(False)
pin_write=7
GPIO.setup(pin_write, GPIO.OUT)

GPIO.output(pin_write, GPIO.HIGH)
time.sleep(2)
GPIO.output(pin_write, GPIO.LOW)

使用文件 - 保存保存程序。现在保持 Python 窗口打开,并通过进入主桌面菜单 - 附件 - 终端启动一个终端会话。你应该看到一个黑色窗口打开。

在终端中,输入

cd python/candle
sudo python mycandle.py

你应该看到 LED 亮起两秒钟,然后程序结束。你可以通过再次输入 sudo python mycandle.py 来重复程序。

让我们快速看看这个程序在做什么。

import 命令告诉计算机使用由其他人编写的另一个程序的部分。这些其他程序称为库。我们调用两个库;GPIO,它允许我们使用 GPIO 引脚,以及 time,它包含 sleep 命令,我们使用它来等待两秒钟。

如果程序卡住了,按住 CTRL 键并按 C。然后检查你的接线和程序中的拼写。

如果程序有效,它将点亮 LED 一秒钟,然后开始计数。然后它会说出计数是多少。小计数表示亮,大计数表示暗。

尝试用手指挡住光电管运行程序。尝试使用一些黑色卡片将光电管置于阴影中。如果你在光线充足的房间里尝试这个,房间的灯光可能比 LED 更强大——稍后我们将使用回形针和卡片制作一个遮光罩。

在程序中,你可以看到,在我们使用 GPIO.setup(pin_read, GPIO.IN) 将其设置为输入之前,我们短暂地(0.1 秒)将 pin_read 设置为输出并将电压设置为低,只是为了清除连接上的任何电压。

然后我们开始计数。我们有一个新的变量 reading,我们将其设置为零。

然后程序循环运行,直到它检测到来自电容器的高电压,每次检测到高电压时都会将 reading 计数加一。当它检测到高电压时,它会结束循环并打印出 reading 的值。

罩子与挡板 - 检测呼吸

[编辑 | 编辑源代码]

我们将使用一小块卡片挡板来检测呼吸。我们将用回形针制作一个 U 形环,然后从它上面悬挂一小块卡片。

我们将把那个环和卡片放在 LED 和光电管之间,并确保当我们吹它时,它可以被吹走。

我们还将在光电管上放一个罩子,这样它只能看到来自 LED 的光。我们将使用另外两个更大的回形针 U 形环来固定卡片。回形针在电子面包板中非常方便,因为它们可以牢固地安装在孔中!

仔细观察下面的照片,并制作你自己的罩子与挡板。

你的导师可能已经将你的回形针弯曲并剪切到合适的尺寸。如果没有,在你剪断回形针到合适的长度时,要小心飞溅的金属。

挡板由以下部分制成

  • 一块大约 2 厘米 × 1 厘米 的黑色卡片
  • 一个大约 1.5 厘米 高、1.5 厘米 宽的回形针环
  • 轻轻地弯曲卡片的一端(弯曲不要折叠)放在环上,使用少量粘性胶带将其松散固定。记住它必须是松散而精致的,以便在你吹它时可以摆动。如果你把它粘得太紧,它就不会摆动,也不会起作用。

罩子由以下部分制成

  • 一块大约 4.5 厘米 × 2 厘米 的黑色卡片
  • 两个大约 2.5 厘米 高、1.5 厘米 宽的回形针环
  • 只需轻轻地弯曲卡片,并用环固定住它

最终程序

[编辑 | 编辑源代码]

最终程序基于第二个测试程序

  • 它设置 GPIO 引脚并点亮 LED。
  • 它进行一些“校准”——它会计算出“黑暗”的读数,即挡板关闭时的读数。
  • 它循环运行,等待一个新的读数,该读数明显低于校准读数。这个较低的读数应该意味着光电管上的光线要多得多——因此挡板已经被吹走了!
  • 有一个变量 sensitivity 控制读数必须降低多少才能使程序检测到挡板被吹走。默认情况下,它设置为 50%,但你可以更改它。记住,如果程序卡住了,你可以使用 CTRL+C 来停止你的程序。
  • 当程序检测到光线时,它会播放 1893 年的曲子“Good Morning To All”。这首曲子已经不受版权保护,但你可能决定自行承担风险,用一些与生日相关的歌词一起演唱。这个程序输入起来比较长,所以如果你愿意,可以从 examples 文件夹中加载它,文件名是 candle.py
#!/usr/bin/env python

# Raspberry Pi GPIO Birthday Candles by Andrew Oakley aoakley.com Public Domain 2015
# Adapted from "Basic Photocell Reading" by Adafruit

# Import the libraries we will be using
import RPi.GPIO as GPIO, time, os
# RPi.GPIO - for controlling GPIO pins
# time - for waiting
# os - for calling the music program

# Set up the GPIO
GPIO.setmode(GPIO.BOARD)
GPIO.setwarnings(False)
pin_read=12 # GPIO 18
pin_write=7 # GPIO 4

# Sensitivity, in percent
sensitivity=50

def timeLowHigh ():
   # This times how long it takes for a pin to go from low to high.
   # It is handy for reading variable resistance using a capacitor.
   # If the capacitor fills slowly, there is high resistance.
   # Photocells are a type of variable resistor. When there is low light, then there is high resistance.
   # Therefore long time = darker, short time = lighter
   # Try using a 1 microfarad capacitor and a 2-20K ohm photocell.

   # Reset the reading to zero
   reading = 0
   
   # Reset the pin to low - we briefly set it to output
   GPIO.setup(pin_read, GPIO.OUT)
   GPIO.output(pin_read, GPIO.LOW)
   # Brief sleep just to let it settle on low
   time.sleep(0.01)
   
   # Now change the pin back to an input
   GPIO.setup(pin_read, GPIO.IN)
   # This takes about 1 millisecond per loop cycle
   while (GPIO.input(pin_read) == GPIO.LOW):
      reading += 1

   return reading
   
   def calibrate():
   # This turns on the LED and works out what the
   # "normal" level of dimness is with the LED on.
   
   # Turn on the LED
   GPIO.setup(pin_write, GPIO.OUT)
   GPIO.output(pin_write, GPIO.HIGH)
   
   # Read the dimness lots of times over 3 seconds
   # and keep a running tally of the average
   print ("Calibrating...")
   dimness=timeLowHigh()
   t=time.time()
   while time.time() < t+2:
      c=timeLowHigh()
      print "calibration: %05d now: %05d" % (dimness, c)
      dimness=( dimness+c )/2

   return dimness
   
# Record what normal dimness is
normal_dimness=calibrate()

while True:
   # Find out what the dimness is now
   dimness_now=timeLowHigh()
   # Print out the values
   print("dimness normal: %05d now: %05d target: %05d" % (normal_dimness, dimness_now, normal_dimness*(sensitivity/100.0) ))
   # Has the dimness fallen below the target?
   if dimness_now < normal_dimness*(sensitivity/100.0) :
      GPIO.output(pin_write, GPIO.LOW)
      print ("Good Morning to All!")
      os.system('omxplayer good-morning-to-all.ogg')
      normal_dimness=calibrate()

和以前一样,通过切换到终端窗口并输入 sudo python candle.pymycandle.py(取决于你的命名方式)来运行程序。

程序将以循环方式运行。要停止它,按住 CTRL 键并按 C

如果您的辅导老师没有为您准备树莓派和设备,或者您没有辅导老师,您可以在开始之前按照以下说明进行设置。

您需要

  • 运行Raspbian操作系统的树莓派。本教程适用于迄今为止的所有型号,包括A,A+,B,B+和2B。
  • 无焊面包板 - 我们使用的是一个小型170点面包板,但任何无焊面包板都可以。
  • 一个LED。我们使用的是一个5mm黄色的LED。它需要足够亮以触发光敏电阻,因此黄色、绿色或白色通常比红色或蓝色效果更好。
  • 一个光敏电阻,也称为光电阻。我们使用的是一个4mm 2-20k欧姆光敏电阻。
  • 四根母对母跳线,每根至少20厘米长。
  • 两根短的公对公跳线,每根约2-6厘米。我们使用的是实心线。
  • 三根曲别针,剪成U形。
  • 两小块黑色卡片;一块约4.5×2厘米,另一块约2×1厘米。

请使用最新版本的Raspbian安装。本教程编写于2015年4月,当时最新推荐的Raspbian镜像的日期为2015-02-16。您可以通过进入终端(菜单 - 附件 - 终端)并输入以下命令来创建文件夹结构并下载文件

cd
mkdir python
cd python
curl -O http://www.cotswoldjam.org/downloads/2015-04/candle.tgz
tar xvzf candle.tgz

…其中-O是减号后面跟着大写字母O(不是数字零)。

Cjam-led-candle-tutorial.pdf

[编辑 | 编辑源代码]

原始PDF在维基共享资源上:Cjam-led-candle-tutorial.pdf

mycandle1.py

[编辑 | 编辑源代码]
#!/usr/bin/env python

import RPi.GPIO as GPIO, time, os

GPIO.setmode(GPIO.BOARD)
GPIO.setwarnings(False)
pin_write=7

GPIO.setup(pin_write, GPIO.OUT)
GPIO.output(pin_write, GPIO.HIGH)
time.sleep(2)
GPIO.output(pin_write, GPIO.LOW)

mycandle2.py

[编辑 | 编辑源代码]
import RPi.GPIO as GPIO, time

GPIO.setmode(GPIO.BOARD)
GPIO.setwarnings(False)
pin_write=7
pin_read=12

GPIO.setup(pin_write, GPIO.OUT)
GPIO.output(pin_write, GPIO.HIGH)
time.sleep(1)

GPIO.setup(pin_read, GPIO.OUT)
GPIO.output(pin_read, GPIO.LOW)
time.sleep(0.01)
GPIO.setup(pin_read, GPIO.IN)

reading=0
while (GPIO.input(pin_read) == GPIO.LOW):
   reading += 1

print "Reading: %d" % reading

GPIO.output(pin_write, GPIO.LOW)

Good Morning to All.ogg

[编辑 | 编辑源代码]
华夏公益教科书