如何用 Raspberry Pi 制作自动南瓜灯

这是我制作完美南瓜派的秘方。
19 位读者喜欢这篇文章。
A vignette of green, orange, and yellow pumpkins in front of a brick wall

Lauren Pritchett, CC BY-SA 4.0

万圣节快到了,这是我最喜欢的节日和派对时光之一。今年,我决定用自动化运动感应来为我的部分装饰品增添(南瓜)风味。这篇惊悚的文章将逐步向您展示我是如何制作它们的,从构建和接线到编码。这不是您普通的周末项目,它需要大量的用品和构建时间。但这是一种有趣的玩转 Raspberry Pi 并融入这个令人难忘的节日气氛的方式。

此项目所需物品

  • 一个大型塑料南瓜
  • 一台 Raspberry Pi 4(带外围设备)
  • 一套与 Raspberry Pi 兼容的 Arduino 入门套件
  • 一把热熔胶枪
  • 彩带,最好是节日主题颜色

您在入门套件中需要的物品包括一个红外运动传感器、一个面包板、两个小型 LED 灯、一条将面包板连接到 Raspberry Pi 的带状线,以及将所有这些部件连接在一起的电缆。您可以在网上找到所有这些物品,我建议购买入门套件,以便您可以进行超出此项目的其他有趣的事情。

Raspberry Pi computer board

Jess Cherry CC BY-SA 4.0

Cables and and LEDs for the project

Jess Cherry CC BY-SA 4.0

Project supplies including breadboard, cables, LEDs, and elements of the Arduino starter kit

Jess Cherry CC BY-SA 4.0

安装 Raspberry Pi OS 和预配置

收到我的 Pi(包括 SD 卡)后,我上网并按照 Raspberry Pi Imager 说明进行操作。这允许将操作系统快速安装到 SD 卡上。注意:您需要能够将 SD 卡放入 SD 卡读卡器插槽中。我有一个外接 SD 卡读卡器,但有些计算机内置了读卡器。在您的本地计算机上,您还需要一个 VNC 查看器。

安装操作系统并运行更新后,我还需要执行一些额外的步骤才能使一切正常工作。为此,您需要以下内容

  • Python 3
  • Python3-devel
  • Pip
  • RPi GPIO (pip install RPi.GPIO)
  • 代码编辑器(Thonny 在 Raspberry Pi OS 上)

接下来,设置 VNCviewer,以便在您将 Pi 隐藏在南瓜中时可以登录。

为此,运行以下命令,然后按照以下说明进行操作。

sudo raspi-config

当此菜单弹出时,选择“接口选项”

Raspberry Pi Software Configuration Tool menu

Jess Cherry CC BY-SA 4.0

接下来,选择 VNC 并在弹出窗口中启用它

Raspberry Pi Software Configuration Tool menu of interface options

Jess Cherry CC BY-SA 4.0

您也可以使用安全外壳 (SSH) 来执行此操作,但在故障排除阶段,我使用了 VNC。登录到您的 Raspberry Pi 后,收集 IP 地址并将其用于 SSH 和 VNC 连接。如果您已移动房间,您也可以使用路由器或 WiFi 交换机来告诉您 Pi 的 IP 地址。

现在一切都已安装完毕,您可以继续使用灯构建面包板了。

每个人都应该尝试南瓜面包(板)

许多人没有见过或使用过面包板,因此我添加了我的零件图片,从我的基本组件开始。

GPIO Extension Board and Ribbon Cable

Jess Cherry CC BY-SA 4.0

Breadboard

Jess Cherry CC BY-SA 4.0

这两个部件与中心的扩展护罩组装在一起,如图所示。

Breadboard with cables, pins, and ribbons, partially set up for the project

Jess Cherry CC BY-SA 4.0

带状线连接到 Raspberry Pi 中的引脚插槽,使该板成为我们可以编码和玩耍的新扩展。带状线不是必需的,它只是使 GPIO 引脚的使用更加方便。如果您不想购买带状线,您可以将母对公跳线直接从 Pi 上的引脚连接到面包板。以下是您需要的组件

  • Raspberry Pi(版本 4 或 3)
  • 面包板
  • GPIO 扩展带状电缆
  • 跳线(x6 公对公)
  • 电阻 220Ω
  • HC-SR501 或任何类似的接近传感器 (x1)
  • LED (x2)

组装电路板

一旦您拥有了所有部件,就可以将所有东西组装在一起。首先,查看电路板上引脚的定义方式。这是我的个人扩展板;您拥有的扩展板可能不同。引脚定义在您进行编码时很重要,因此请务必妥善保管您的电缆。以下是我的扩展原理图。

如您所见,原理图既有物理板上定义的 BCM(Broadcom SOC 通道)GPIO 编号,也有您在代码中使用的物理编号,用于创建例程和函数。

Schematic of Raspberry Pi extension board

Jess Cherry CC BY-SA 4.0

现在是时候连接一些电缆了。首先,从传感器开始。我的套件中提供了连接电缆,因此我将在进行过程中添加图片。这是传感器,带有电源 (+) 接地 (-) 和传感器连接到扩展板的连接。

Sensor illustration with power, ground, and sensor connection

Jess Cherry CC BY-SA 4.0

对于电缆颜色:电源为红色,接地为黑色,黄色传输传感器数据。

Photo of a hand holding the sensor with black, red, and yellow cables

Jess Cherry CC BY-SA 4.0

我将电缆插入,电源/红色连接到 5V 引脚,接地/黑色连接到 GRN 引脚,传感器/黄色连接到 GPIO 17 引脚,稍后在代码中定义为 11。

Breadboard with sensor cables attached

Jess Cherry CC BY-SA 4.0

接下来,是时候设置灯了。每个 LED 灯都有两个引脚,一个比另一个短。长边(阳极)始终与引脚电缆对齐,短边(阴极)与接地和电阻器对齐。

LED light with pin, cables, and resistor

Jess Cherry CC BY-SA 4.0

对于第一个灯,我使用 GPIO18(引脚 12)和 GPIO25 作为信号。这很重要,因为代码与这些引脚通信。您可以更改您使用的引脚,但随后您必须更改代码。这是最终结果的图表

Illustration of connections from breadboard to Raspberry Pi, sensor, and LEDs

Jess Cherry CC BY-SA 4.0

现在一切都已连接好,是时候开始编写代码了。

如何使用 Python 设置南瓜

如果您已经安装了 Python 3,那么您已经拥有了逐行开始工作所需的一切。在本例中,我将 Python 3 与 RPI 包一起使用。从导入的包开始,RPI 和 time from sleep(这有助于创建教程后面描述的闪烁效果)。我将我的 Python 文件命名为 senseled.py,但您可以将您的文件命名为您想要的任何名称。

#!/usr/bin/env python3

import RPi.GPIO as GPIO
import os
from time import sleep

接下来,定义您的两个 LED 引脚和传感器引脚。在本帖的前面,我在连接卡时提供了这些引脚编号,因此您可以在下面看到这些确切的编号。

ledPin1 = 12 # define ledPins
ledPin2 = 22
sensorPin = 11 # define sensorPin

由于在本例中您有两个灯要设置为一起闪烁,因此我还创建了一个定义的数组以供稍后使用

leds = [ledPin1, ledPin2]

接下来,使用 RPi.GPIO 包定义电路板和引脚的设置。为此,设置电路板上的模式。我选择在我的设置中使用物理编号系统,但如果您愿意,可以使用 BCM。请记住,您永远不能同时使用两者。以下是每个示例

# for GPIO numbering, choose BCM 
GPIO.setmode(GPIO.BCM) 
 
# or, for pin numbering, choose BOARD 
GPIO.setmode(GPIO.BOARD) 

对于本示例,请使用我的设置中的引脚编号。将两个引脚设置为输出模式,这意味着所有命令都输出到灯。然后,将传感器设置为输入模式,以便当传感器检测到运动时,它会将数据输入到电路板以输出灯。以下是这些定义的示例

def setup():
 GPIO.setmode(GPIO.BOARD) # use PHYSICAL GPIO Numbering
 GPIO.setup(ledPin1, GPIO.OUT) # set ledPin to OUTPUT mode
 GPIO.setup(ledPin2, GPIO.OUT) # set ledPin to OUTPUT mode
 GPIO.setup(sensorPin, GPIO.IN) # set sensorPin to INPUT mode

现在电路板和引脚已定义,您可以将您的主函数放在一起。为此,我在 for 循环中使用数组,然后根据传感器输入使用 if 语句。如果您不熟悉这些函数,您可以查看此

快速指南.

如果传感器接收到输入,则 LED 输出为高电平(通电)0.03 秒,然后为低电平(断电),同时打印消息 led turned on.。如果传感器未收到输入,则 LED 关闭电源,同时打印消息 led turned off

def main():
 while True:
 for led in leds:
 if GPIO.input(sensorPin)==GPIO.HIGH:
 GPIO.output(led, GPIO.HIGH)
 sleep(.05)
 GPIO.output(led, GPIO.LOW)
 print ('led turned on >>>')
 else :
 GPIO.output(led, GPIO.LOW) # turn off led
 print ('led turned off <<<')

虽然您可以在数学上选择亮度级别,但我发现设置通电和断电之间的睡眠计时器更容易。我在多次测试创建闪烁蜡烛效果所需的时间后设置了此计时器。

最后,您需要进行一些清理以在程序结束时释放您的资源

def destroy():
 GPIO.cleanup() # Release GPIO resource

现在一切都已定义为运行,您可以运行您的代码了。启动程序,运行设置,尝试您的 main,如果收到 KeyboardInterrupt,则销毁并清理所有内容。

if __name__ == '__main__': # Program entrance
 print ('Program is starting...')
 setup()
 try:
 main()
 except KeyboardInterrupt: # Press ctrl-c to end the program.
 destroy()

现在您已经创建了您的程序,最终结果应如下所示

#!/usr/bin/env python3

import RPi.GPIO as GPIO
import os
from time import sleep

ledPin1 = 12 # define ledPins
ledPin2 = 22
sensorPin = 11 # define sensorPin
leds = [ledPin1, ledPin2]

def setup():
 GPIO.setmode(GPIO.BOARD) # use PHYSICAL GPIO Numbering
 GPIO.setup(ledPin1, GPIO.OUT) # set ledPin to OUTPUT mode
 GPIO.setup(ledPin2, GPIO.OUT) # set ledPin to OUTPUT mode
 GPIO.setup(sensorPin, GPIO.IN) # set sensorPin to INPUT mode

 
def main():
 while True:
 for led in leds:
 if GPIO.input(sensorPin)==GPIO.HIGH:
 GPIO.output(led, GPIO.HIGH)
 sleep(.05)
 GPIO.output(led, GPIO.LOW)
 print ('led turned on >>>')
 else :
 GPIO.output(led, GPIO.LOW) # turn off led
 print ('led turned off <<<')
 

def destroy():
 GPIO.cleanup() # Release GPIO resource

if __name__ == '__main__': # Program entrance
 print ('Program is starting...')
 setup()
 try:
 main()
 except KeyboardInterrupt: # Press ctrl-c to end the program.
 destroy()

当它运行时,它应该类似于这样。(注意:在此录制期间我仍在测试睡眠时间。)

是时候烤南瓜了

首先,我有一个非常大的塑料南瓜,是我们的家人送给我和我丈夫的礼物。

A large, smiling orange jack o'lantern

Jess Cherry CC BY-SA 4.0

最初,它的背面有一个插头,灯泡烧坏了,这首先激发了这个想法。我意识到我必须进行一些修改,首先是用钻头和曲线锯在底部切一个孔。

A man drilling a hole in the bottom of a large plastic jack o'lantern

Jess Cherry CC BY-SA 4.0

A hole that takes up most of the bottom of the plastic jack o'lantern

Jess Cherry CC BY-SA 4.0

幸运的是,南瓜背面已经有一个孔,用于连接到原始灯的电线。我可以将所有设备塞进南瓜内部,但我需要一种隐藏传感器的方法。

首先,我必须为传感器制作一个可以外部连接到南瓜的位置,所以我用茎钻了一个孔

A small hole drilled in the brown stem of the jack o'lantern

Jess Cherry CC BY-SA 4.0

然后我将传感器的所有接线都穿过孔,结果又出现了一个问题:传感器又大又怪异。我开始寻找一种装饰性的方法来解决这个问题。

The sensor hanging around the stem of the pumpkin, and a spool of ribbon

Jess Cherry CC BY-SA 4.0

事实上,我制作了全人类最可怕的彩带装饰(覆盖着热熔胶枪糊状物),但您不会注意到传感器。

A large bow with orange, black, and patterned ribbon completely covers the sensor

Jess Cherry CC BY-SA 4.0

最后,我将 Pi 和扩展卡放入南瓜中,并将电源线从背面穿过。

The breadboard and cables fit inside the hole in the bottom of the jack o'lantern

Jess Cherry CC BY-SA 4.0

一切都连接好后,我准备好 VNC 进入我的 Pi 并打开 Python,然后等待有东西移动来测试它。

VNC viewer with Python file running

Jess Cherry CC BY-SA 4.0

senseled.py running, showing led turned off switching to led turned on

Jess Cherry CC BY-SA 4.0

烘烤后注意事项

这是一个非常漫长且经过大量研究的构建过程。正如我在介绍中说的那样,这不是一个周末项目。当我开始时,我对面包板一无所知,我花了一段时间才重新编码并确定我到底想要什么。我在这里没有包含一些非常细致的细节。例如,传感器有两个旋钮,用于定义它可以拾取运动的距离以及传感器输入需要持续多长时间。虽然这是一件很棒的学习事情,但我绝对会在开始这段旅程之前做大量的研究。

我没有完成我真正想要的项目的一部分:连接到蓝牙设备并发出怪异的声音的能力。也就是说,玩 Raspberry Pi 总是很有趣的,无论是用于家庭自动化、天气跟踪,还是仅仅是愚蠢的装饰品。我希望您喜欢这次演练,并受到启发尝试类似的DIY项目。

接下来阅读什么
User profile image.
科技游民,从事我能找到的任何工作。IT 领域孤岛预防的倡导者,与所有团队共享信息的重要性。相信教育所有人并开源开发。热爱一切科技事物。关于 K8s、混沌以及我能找到的任何新奇事物! Mastodon ID

评论已关闭。

Creative Commons License本作品根据 Creative Commons Attribution-Share Alike 4.0 International License 获得许可。
© . All rights reserved.