维基少年:树莓派/树莓派 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) 也称为光电二极管或光敏电阻,可以以任何方式连接。当有更多光线时,它们让更多电流通过。我们使用的是一个额定值为 2 到 20,000 欧姆的电阻,但大多数在爱好者工具包中找到的光电二极管都可以正常工作。
电容器如果接线错误,可能会断裂。请务必仔细检查正负连接器是否正确! |
电容器有一个短腿和一个长腿,以及一侧的条纹。与 LED 一样,它们必须使用短腿和条纹连接到负极(接地)。我们使用的是 1 微法拉电容器,您也应该使用它。
电容器存储少量的电荷,然后当它充满时,它会释放所有电荷。
- 如果您将其连接到强电荷,它会更快地释放电荷。
- 如果您将其连接到弱电荷,它需要更长时间才能释放电荷。
跳线(也称为 DuPont 线)将电子元件连接到 GPIO 引脚。您还应该有两根短跳线和一根长跳线(全部为“母对母” - 两端都有孔)。
重要 - 将光电二极管弯曲以朝向光线。您需要弯曲光电二极管的顶部,使其“面向”LED。请参阅照片以获取示例。 |
按照以下步骤构建电路。首先放置组件,最后放置跳线。不用担心回形针,现在还不需要。
以下是您在插入跳线之前面包板应该是什么样子的。
以下是连接了跳线的面包板。
当元件从工厂出来时,它们有长腿(线)。您的导师可能已经修剪了您元件的腿,在这种情况下,您无需再次修剪。如果您的元件有长腿,那么在您剪断它们之前,您应该通过将其连接到树莓派并运行程序来试用您的电路。
如果您需要修剪腿部,您可以使用厨房剪刀或特殊的剪线工具。无论哪种方式,在剪断元件的腿部时都要小心。
- 不要将腿部修剪得太短,以至于它们不伸入面包板孔中。
- 对于 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 开始。输入以下程序,或从示例文件夹中的 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.py
或 mycandle.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(不是数字零)。
原始PDF在维基共享资源上:Cjam-led-candle-tutorial.pdf
#!/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)
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)
|
|
无法播放此文件?请参阅 媒体帮助。 |