《 Simon》游戏的树莓派面包板入门指南

面包板使您无需焊接即可创建电路。这是尝试电子学的绝佳工具,但可能会令人生畏。建立一个项目可以帮助您在学习时保持动力。

有几个简单的游戏可以使Raspberry Pi入门项目更加出色。一个简单的入门游戏是Simon。西蒙是一款记忆游戏,其中一系列指示灯以随机顺序闪烁,并且玩家必须记住该顺序。随着玩家的前进,序列的长度会增加。

所需组件

首先,您需要满足以下条件:

  1. 树莓派
  2. 带有Raspbian操作系统的microSD卡已闪烁
  3. 4个不同颜色的LED
  4. 4个电阻器(从220欧姆到1千欧姆的任何电阻)
  5. 4个按钮
  6. 1个面包板
  7. 跨接电缆,用于连接所有设备

您可以在该项目中使用任何Raspberry Pi,但是Pi Zero模型在没有焊接的情况下不容易连接到面包板上。无论使用哪种型号,都将需要电源,显示器,键盘和鼠标。

如果您以前从未设置过Raspberry Pi,则可以在Raspberry Pi初学者指南中学习如何为本教程做好一切准备。

您将在本教程中编写Python代码,并且可以使用任何文本编辑器来编写它,但是您可能会发现代码编辑器更容易。 Raspberry Pi OS上已经安装了几个,Thonny的设计使初学者很容易。无论您使用哪一种,都需要能够保存并运行代码才能遵循本教程。

面包板入门

如果您以前从未使用过面包板,则可能需要阅读面包板教程作为开始。了解面包板的工作原理将帮助您了解如何创建电路。

Raspberry Pi具有两行通用输入/输出(GPIO)引脚。这些引脚使您可以将组件连接到Raspberry Pi。有些针脚发送信息,有些针脚提供电源,有些针脚将电子设备接地。

我们将从在面包板上添加LED灯开始。如果您以前从未使用过面包板上的LED灯,则可能需要阅读教程,以更深入地说明其工作原理

首先将GPIO引脚连接到板上。只要是GPIO引脚而不是电源或接地引脚,哪个引脚都没有关系。上面是GPIO引脚的图表,可帮助您确定要使用的引脚。本教程使用的引脚号为18,也标记为GPIO 24。

该引脚将为面包板供电,并使Raspberry Pi与板上的组件通信。然后将Pi上的6号插针连接到面包板的接地导轨。这将使电路板接地并使我们能够创建电路。

来自Raspberry的功率过高,无法直接连接LED。使用电阻可降低功率水平,并防止LED烧坏。将电阻器的一侧连接到GPIO引脚插入的同一条线,另一端连接到面包板的另一侧。然后将LED的正极放在电阻之后。 LED的负极可以直接连接至负极。最终结果应类似于上图。彻底检查接线,然后打开Pi。 LED应该点亮。

现在,您已经使用Raspberry Pi制作了一个电路,可以使用代码进行控制。

使用Python代码控制LED

本教程分步介绍了代码,但是如果您想随时参考完成的代码,可以在Pastebin上找到它。

目前,电源由LED供电,但我们想控制其开启和关闭的时间。以下Python代码将使我们与董事会对话。

 
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BOARD)
GPIO.setwarnings(False)
red = 18
GPIO.setup(red, GPIO.OUT)
GPIO.output(red, GPIO.LOW)

前几行进行了设置。 Raspberry Pi GPIO库已导入。 as GPIO只是让我们将RPi.GPIO称为GPIO来节省一些输入。 GPIO引脚模式设置为BOARD 。您不必使用此设置,但是通过按GPIO行中的引脚顺序来引用它们会更容易。

最后,我们将警告设置为false。这将停止不必要的警告。

接下来的三行控制LED。红色LED固定在GPIO引脚18上。不用记住,变量红色将存储该位置。接下来,GPIO.setup告诉我们的程序,它是将信息发送出去红色图钉。最后,我们设置GPIO。红色引脚上的输出。当您运行该程序时,指示灯将熄灭。要重新打开它,请将GPIO.LOW切换为GPIO.HIGH,然后再次运行该程序。

保存代码,然后单击运行以查看其运行情况。如果您的代码编辑器中没有运行按钮,请保存它并在终端窗口中运行python myfilename.py 。您首先需要导航到与新Python文件相同的目录。如果不确定如何查看Raspberry Pi速查表

增加一个以上的LED

要创建游戏Simon,我们需要四个不同颜色的灯光。您用于设置红色LED的相同步骤可用于设置其他三个。您的接线应如下图所示:

您的代码应如下所示:

 
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BOARD)
GPIO.setwarnings(False)
red = 18
yellow = 22
green = 24
blue = 26
GPIO.setup(red, GPIO.OUT)
GPIO.setup(yellow, GPIO.OUT)
GPIO.setup(green, GPIO.OUT)
GPIO.setup(blue, GPIO.OUT)
GPIO.output(red, GPIO.HIGH)
GPIO.output(yellow, GPIO.HIGH)
GPIO.output(green, GPIO.HIGH)
GPIO.output(blue, GPIO.HIGH)

一旦你已经测试了发光二极管,设置GPIO.outputGPIO.LOW再次打开每一个关闭。

尽管所用电线的颜色无关紧要,但请尝试使用对您有意义的颜色,以帮助您更容易地阅读电路板。例如,黑线通常用于接地线。在此电路中,您可能要使电线的颜色与LED灯的颜色匹配。

使用按钮控制LED

首先在板上添加一个按钮。该按钮将需要同时连接到地面和GPIO引脚。该电路应如下所示:

为了使按钮控件成为LED,我们需要添加代码。设置按钮类似于设置LED,不同之处在于GPIO引脚设置为输入而不是输出。此代码还设置了Pi上的内部上拉电阻,这是使按钮正常工作所必需的。

 GPIO.setup(32,GPIO.IN,pull_up_down = GPIO.PUD_UP)

现在我们需要代码来检查按钮是否被按下。

 
game = True
while game:
redButtonState = GPIO.input(32)
if redButtonState == 0:
GPIO.output(red, GPIO.HIGH)
time.sleep(1)
GPIO.output(red, GPIO.LOW)

我们希望程序继续检查是否按下了按钮,因此我们使用while循环。因为循环永远不会为假,所以它将一直运行并检查按钮,直到我们通过按停止按钮或使用键盘快捷键Ctrl + c手动结束程序为止。

接下来,为了更轻松地引用按钮GPIO引脚发送给我们的输入,我们将该信息保存在变量redButtonState中。如果我们的按钮输入更改为0,则表明该按钮已被按下。

如果按下该按钮,则红色LED将亮起。然后,一秒钟后,LED将熄灭。为此,我们使用time.sleep(1)函数。要使此工作正常进行,您将需要在脚本顶部导入时间库。

一个按钮正常工作后,您可以再添加三个,每个LED一个。您的代码应如下所示:

 
import random
import time
import RPi.GPIO as GPIO
GPIO.setmode (GPIO.BOARD)
GPIO.setwarnings(False)
red = 18
yellow = 22
green = 24
blue = 26
GPIO.setup(red, GPIO.OUT)
GPIO.setup(yellow, GPIO.OUT)
GPIO.setup(green, GPIO.OUT)
GPIO.setup(blue, GPIO.OUT)
GPIO.setup(32, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(36, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(38, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(40, GPIO.IN, pull_up_down=GPIO.PUD_UP)
game = True
while game:
redButtonState = GPIO.input(32)
if redButtonState == 0:
GPIO.output(red, GPIO.HIGH)
time.sleep(1)
GPIO.output(red, GPIO.LOW)

yellowButtonState = GPIO.input(36)
if yellowButtonState == 0:
GPIO.output(yellow, GPIO.HIGH)
time.sleep(1)
GPIO.output(yellow, GPIO.LOW)
greenButtonState = GPIO.input(38)
if greenButtonState == 0:
GPIO.output(green, GPIO.HIGH)
time.sleep(1)
GPIO.output(green, GPIO.LOW)
blueButtonState = GPIO.input(40)
if blueButtonState == 0:
GPIO.output(blue, GPIO.HIGH)
time.sleep(1)
GPIO.output(blue, GPIO.LOW)

您的董事会应如下所示:

现在所有电子设备都已安装到位。如果有任何问题,请检查代码中是否有任何错误。请记住,如果遇到困难,可以从Pastebin下载完整代码

创造游戏

该项目已经涵盖了开始使用面包板所需的所有基础知识。但是将这些技能转化为游戏确实可以展示您的能力!

在《西蒙》中,玩家看到一系列的灯光闪烁,必须记住图案。仅一盏灯即可轻松启动。每个级别都会向图案添加随机灯光,以使游戏更难。

创建图案

这一步很简单。一个阵列将保持我们的灯光模式。第二个阵列将为我们的存储GPIO引脚。每个游戏循环,新的随机灯光将添加到图案阵列的末尾。我们使用随机数。 randint()函数选择介于0和3之间的数字,代表4个LED。

 
pattern = []
lights = [red, yellow, green, blue]
while game:
pattern.append(random.randint(0,3))

接下来,我们必须点亮灯以显示图案。

 while game:
pattern.append(random.randint(0,3))

for x in pattern:
GPIO.output(lights[x], GPIO.HIGH)
time.sleep(1)
GPIO.output(lights[x], GPIO.LOW)
time.sleep(0.5)

在两个灯之间暂停很重要。这样可以更轻松地查看图案中是否背对背使用了相同的光源。

获取玩家输入

接下来,游戏必须等待玩家猜测灯光的顺序。该程序必须检查模式中的每个指示灯并等待播放器按下按钮。这需要嵌套循环:

 
for x in pattern:

waitingForInput = True

while waitingForInput:
redButtonState = GPIO.input(32)
yellowButtonState = GPIO.input(36)
greenButtonState = GPIO.input(38)
blueButtonState = GPIO.input(40)

if redButtonState == 0:
GPIO.output(red, GPIO.HIGH)
waitingForInput = False
time.sleep(1)
GPIO.output(red, GPIO.LOW)

if yellowButtonState == 0:
GPIO.output(yellow, GPIO.HIGH)
waitingForInput = False
time.sleep(1)
GPIO.output(yellow, GPIO.LOW)

if greenButtonState == 0:
GPIO.output(green, GPIO.HIGH)
waitingForInput = False
time.sleep(1)
GPIO.output(green, GPIO.LOW)

if blueButtonState == 0:
GPIO.output(blue, GPIO.HIGH)
waitingForInput = False
time.sleep(1)
GPIO.output(blue, GPIO.LOW)

上面的大多数代码都在重用我们编写的用于测试按钮的代码。

相关: Python成为未来编程语言的6个原因

检查玩家的输入

从这里开始,很容易检查玩家是否输入了正确的图案。每次他们按下按钮时,游戏都可以检查该按钮是否正确。为此,向每个按钮输入添加另一个if语句:

 
if redButtonState == 0:
GPIO.output(red, GPIO.HIGH)
waitingForInput = False
if x != 0:
game = False
time.sleep(1)
GPIO.output(red, GPIO.LOW)

来自我们的for循环的变量x具有下一盏灯的数量。红色LED指示灯位于第一个位置,即数字0。如果玩家在图案中有0的情况下按了红色LED按钮,那么它们是对的!如果没有,他们输掉比赛。将变量game设置为false将停止我们的游戏循环并结束程序。

恭喜你!您从头开始构建了游戏!

创建游戏为此项目添加了更多代码,而不仅仅是添加LED和按钮。努力完成可以向朋友和家人展示的最终项目,可以帮助您保持动力。

这个游戏很简单。挑战自己,以改进基本设计。如果玩家输了,灯可能会闪烁。也许您想挑战自己,为游戏添加声音。您的想象力是唯一的极限!

好的,那还有您需要处理的硬件。