用arduino做一个buzz wire游戏

在这个有趣的项目中,我们将学习如何使用Arduino制作buzz wire游戏。许多需要的零件可以在初学者工具包和房子周围找到。...

在这个有趣的项目中,我们将学习如何使用Arduino**buzz wire游戏。许多需要的零件可以在初学者工具包中找到(初学者工具包中有什么?)在房子周围。这个项目使用一个Arduino,尽管你几乎可以使用任何你身边的微控制器(看看这个5美元的微控制器之间的比较,从中得到一些启示)。

buzz-wire-game-arduino

查看最终结果--它甚至播放音乐:

你需要什么

以下是完成此项目所需的核心部分:

  • 1 x Arduino UNO或类似产品。
  • 1个金属衣架。
  • 2 x 220欧姆电阻器。
  • 1 x试验板。
  • 1个压电蜂鸣器。
  • 2个鳄鱼夹。
  • 各种热缩管。
  • 外螺纹到外螺纹连接线。

Elenco TL-6 Alligator Lead Set, 10-Piece, 14 inches BUY NOW ON AMAZON

以下是一些增强构建的可选部分:

  • 1个附加压电蜂鸣器。
  • 1 x定位销杆。
  • 1 x四路七段显示器。
  • 1 x 220欧姆电阻器。
  • 1个瞬时按钮。
  • 外螺纹到内螺纹连接线。
  • 木板(用于箱子)。
  • 各种木螺丝。

只要有足够的引脚,几乎所有的Arduino都能工作。如果你不确定你需要什么,请看一下这个购买指南。

建造计划

Arduino Buzzwire Completed

虽然这看起来很复杂,但实际上是一个相当简单的项目。我将从基本游戏开始,然后添加其他组件以增加复杂性。根据可用的组件,您可以随意“选择”。

核心机械由一个线形状和一个在把手上的环组成。球员必须在没有两个触摸的情况下引导循环。如果两触,电路完成,蜂鸣器发出声音。当然,可以使用无微控制器构建这个电路,但是在这里面有什么乐趣(还有你怎么才能听蒙蒂·Python的《飞行马戏团》主题曲呢?

课程

Arduino Buzzwire Course

这是球员必须引导他们的循环的形状。这是整个比赛的基础,所以好好做!我选择了一小滴,然后是一次大的攀登。将金属衣架弯曲成您需要的形状。铜线或铜管同样工作,尽管衣架可能是最便宜的。

你可能需要戴上手套,用钳子或锤子把事情弄得完美。用螺栓切割器切掉多余的部分。留下两个垂直的支柱,推动通过基地。为了安全起见,你得把切好的部分锉平。最后,切割两片热缩管,并将其放置在端部,如下所示:

Arduino Buzzwire Insulation

这将使环路与球场隔离,提供一个起点/终点或安全区。或者,胶带,甚至吸管将做,如果你没有任何热缩管。

现在在课程的一端连接一根电缆。这里有两种选择:要么焊接,要么使用鳄鱼夹。鳄鱼夹是更容易的选择,但焊接是一个更可靠和长期的选择。一定要先用砂纸将衣架表面“磨光”,并使用大量的助焊剂。(以前从未焊接过?在这里学习如何使用。)

根据下一步在底座上钻的孔的大小,可能需要先将电缆穿过安装孔。使用两根绞合在一起的电线将提高耐用性:

Arduino Twisted Wire

使用演练来完成这一点有很大帮助:

Drill Chuck Wire Twisting

基地

Arduino Buzzwire Case

是时候建立基地了。这有助于保持球场在一个直立的位置,以及提供一个地方锚电子到。我用了一些松木边角料,尽管你可以用房子周围的任何东西——甚至一个纸板箱。

把三块切成“n”形。简单地把这三块拧在一起。切记先在侧件上钻一个导向孔,以防侧件开裂。你可能想在螺丝上钻埋头孔(特别是当你要填充然后上漆的时候),我强烈推荐一个埋头孔钻头。如果你没有一个沉孔工具或钻孔,一个更大直径的钻头将做的把戏。

钻出两个足够远的孔,以便课程结束时能坐进去。在底面埋头,准备胶合。

把手

Arduino Buzzwire Handle

现在是**循环/控制器的时候了。在衣架的一端拧一小块,形成一个带有小金属把手的环。确保将切割边缘锉平,必要时用胶带/泡沫覆盖。

Arduino Buzzwire Loop

这将形成电路的另一半——当这个回路接触到路线时,它将完成电路(就像一个开关)。焊接(或使用鳄鱼夹)另一个电线底部这个,完全一样,你以前的课程。

为实际手柄切一小段销钉。这个金属环将**这个把手。如果你没有任何销钉,你可以用砂带或砂光机磨圆一块方形软木(你也可以用砂纸,但要花很长时间)。

在这个把手上钻个洞。这需要足够大,以适应金属环和电线通过:

Arduino Buzzwire Handle Hole

这是可以做到的支柱演习,虽然这是棘手的。车床可以完美地完成这项工作:

是的,我很清楚这是一台金属车床(对任何有兴趣的人来说,这是一台从30年代开始的博利制表车床。我想是3C,但如果你知道更多的话,我很想听听你的来信)。

你也可以用圆珠笔的中心删除。

最后,用热胶水将电缆和线圈固定在把手上。热胶将提供一个强大的(但不是永久性的)夹具,所以这是完美的。

结束

将金属丝层**底座的孔中。别忘了先添加循环/控制器。再次使用热胶水将基层固定在基层上,方法是按如下方式填充基层底面的沉孔:

Arduino Buzzwire Soldering

电路

这是完整的电路图。你不必把你的问题弄得这么复杂——我们把每一部分都分解一下,继续读下去。

Arduino Buzzwire Full Circuit

首先,将两个压电元件连接到数字管脚10和11。极性并不重要:

Arduino Piezo Circuit

你不必使用两个压电元件——我这样做的唯一原因是当电线接触时会有更大的嗡嗡声。将一端连接到数字管脚,另一端连接到接地。

现在**金属层和把手:

Arduino Buzzwire Circuit

同样,这两个线绕哪条线都无关紧要。电路的这一部分完全像一个按钮或开关——当回路接触到球场时,播放器完成电路。确保包含两个电阻器。

一个电阻器将电路接地(称为下拉电阻器),确保电路不“浮动”(这允许Arduino检测电路变化)。另一个电阻器保护Arduino。当两部分接触时,+5V进入数字管脚。如果这个电阻不存在的话,就会出现死短路——如果你幸运的话,你的电脑会因为吸取太多电流而断开USB插座。

将信号线(图上的紫色)连接到数字针脚9。

接下来,将按钮连接到数字针脚2:

Arduino Piezo Button Circuit

最后,连接七段式LED显示屏:

Arduino Seven Segment Circuit

这个特殊的模型来自Seeed。它使用TM1637驱动四个显示器——这意味着只需要两个数字管脚。将GND连接到Arduino接地,VCC连接到Arduino+5V。将D10连接到Arduino数字针脚13,将CLK连接到数字针脚12。

代码

要使此项目正常工作,您需要另外两个文件。第一个被称为

pitches.h

. 这个文件只需将注释名映射到它们的压电值。这使得编写一首曲子容易得多,例如,你可以简单地说“NOTE_uc3”而不是“31”。这是在公共领域,可以在Arduino网站上获得。按照说明创建一个名为

pitches.h

(或者,将代码粘贴到现有脚本中)。

接下来,你需要一种方法来在压电上演奏音符/旋律。AnthonyDigirolamo在Github上的这篇文章包含了您需要的代码。复制“voidbuzz”和“}}”之间的所有内容并将其粘贴到主文件中。供参考:

void buzz(int targetPin, long frequency, long length) { /* Buzzer example function by Rob Faludi http://www.faludi.com https://gist.github.com/AnthonyDiGirolamo/1405180 */ long delayValue = 1000000/frequency/2; // calculate the delay value between transiti*** //// 1 second's worth of microseconds, divided by the frequency, then split in half since //// there are two phases to each cycle long numCycles = frequency * length/ 1000; // calculate the number of cycles for proper timing //// multiply frequency, which is really cycles per second, by the number of seconds to //// get the total number of cycles to produce for (long i=0; i < numCycles; i++){ // for the calculated length of time... digitalWrite(targetPin,HIGH); // write the buzzer pin high to push out the diaphragm delayMicroseconds(delayValue); // wait for the calculated delay value digitalWrite(targetPin,LOW); // write the buzzer pin low to pull back the diaphragm delayMicroseconds(delayValue); // wait again for the calculated delay value }}

最后一个库是控制七段显示,如果不使用,可以跳过此步骤。这个库被称为TM1637,由Seeed创建,该公司创建了驱动板。

在Arduino IDE中,转到“管理库”(Sketch&gt;Include Library&gt;Manage Libraries)。这会引起图书馆经理的注意。允许它几秒钟更新,然后在右上角的搜索框“TM1637”中搜索。将找到两个库——您想要的是“TM1637”,而不是“TM1637Display”。选择,然后单击“安装”。

这个库的最后一个任务——它还没有完成!目前,库只能显示数字0--9和字母A--F。如果这涵盖了您希望显示的所有内容,则可以跳过此步骤。如果没有,则需要修改代码。放松点!这并不像听起来那么难,如果可以使用ArduinoIDE编写代码,就可以做到这一点。

首先,打开库文件夹。这将在您的Arduino文件夹中。在Mac OS X上,这是

/Users/Joe/Documents/Arduino/Libraries

. 打开名为TM1637的文件夹。您需要编辑名为

TM1637.cpp

--您可以安全地忽略另一个扩展名为

.h

. 在您最喜欢的文本编辑器(对我来说,这是Sublime text 3)、记事本或Arduino IDE中打开此文件。

修改第三行代码:

static int8_t TubeTab[] = {0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71};//0~9,A,b,C,d,E,F

对此:

static int8_t TubeTab[] = {/* defaults */0x3f, // 0 0x06, // 10x5b, // 20x4f, // 3 0x66, // 4 0x6d, // 5 0x7d, // 6 0x07, // 7 0x7f, // 8 0x6f, // 90x77, // A -- 100x7c, // b -- 110x39, // C -- 120x5e, // d -- 130x79, // E -- 140x71, // F -- 15/* additional */0x174, // h -- 16 0x176, // H -- 17 0x138, // L -- 18 0x15, // M -- 19 0x137, // n -- 20 0x73, // P -- 21 0x67, // q -- 22 0x131, // r -- 23 0x78, // t -- 24 0x240 // - 25};

现在可以保存并关闭此文件。在每个元素之后,注释描述了这是什么字符。注释的下一部分是元素的索引。

是时候开始编写实际代码了。首先,包括前面提到的两个库:

#include <TM1637.h>#include <pitches.h>

现在创建显示对象:

TM1637 *_display = new TM1637(12, 13);

如果您不理解语法,请不要担心--这行告诉Arduino引脚12和13连接到一个七段显示器,并对其进行适当的配置。

歌曲存储在

melody

tempo

. 它们包含音乐的所有音符和音符持续时间。如果您想更改音乐,请修改这些数组(虽然这不像粘贴音符值那么简单,但计时是音乐中非常重要的一部分)。这个

songState

变量只存储最后一个播放的音符的位置。这确保旋律从头到尾播放,而不是前后不一致地跳跃:

int songState = 0; int melody[] = { NOTE_F4,...}int tempo[] = { 8,...}

注意,我已经删除了数组的内容,请参见下面的完整代码。

这段代码是非阻塞的——这意味着Arduino可以同时执行多个任务。有关更多信息,请参阅此说明。定时器是这样设置的:

unsigned long previousMillis1 = 0;c***t long interval1 = 1500;

变量

previousMillis1

将在稍后阶段更新以存储当前时间。这个

interval1

变量存储代码执行之间的等待时间——在本例中为1.5秒。定义为

c***t

,这意味着它是常量并且永远不会改变--这允许Arduino进一步优化代码。

内部

setup()

有一些事情正在发生。首先,设置输入和输出。必须这样做,以便Arduino知道与每个引脚连接的是什么:

pinMode(9, INPUT); // setup circuitpinMode(10, OUTPUT); // setup buzzer 1pinMode(11, OUTPUT); // setup buzzer 2pinMode(2, INPUT); // setup button

现在需要配置显示器:

_display->set(5); // set brightness_display->point(false); // remove colon_display->init(); // start display

方法

set

,

point

,和

init

都包含在

_display

对象。使用指针(“->”)而不是点来访问这些。同样,不要担心语法(尽管如果你想了解更多,请查找C++指针)。

主循环有两种游戏模式:挑战和自由发挥。自由游戏允许玩家无限次数地玩。挑战模式使用

showCountdown

方法。它用这个按钮来启动和停止计时器。目前,更改游戏模式的唯一方法是手动编辑名为

mode

. 看看是否可以添加另一个按钮来执行此操作,并适当地修改代码。

这个

buzz

方法播放给它的音符。这与

sing

. 唱法贯穿每个音符并演奏。这个方法是定期调用的,尽管它只会在上次播放后经过足够的时间播放下一个音符。一旦歌曲结束,它会将歌曲重置为第1节(songState=14)。您可以将其设置为零,以便在歌曲开始时就开始播放,但是这样做的原因是为了跳过介绍。在Arduino通电后播放一次介绍,然后不再播放。

这个

showFree

showPlay

方法只需在显示器上写上“FrEE”和“PLAY”。注意free中的“r”是小写的,而其他字符都是大写的。这是七段显示的限制之一。它们不能显示字母表中的每个字母,它们可以显示的一些字符必须是混合大小写的。

这个

toggleFreePlay

方法在“自由”和“播放”之间闪烁显示。同样,它以一种非阻塞的方式来实现这一点。

另一个有用的方法是

showNumber

. 这会将数字写入显示器的中间两个字符,如下所示:

Arduino Buzzwire Display

显示器不够聪明,不知道如何显示大量的数字,它必须明确告诉做什么。此方法使用一些简单的逻辑来显示每个字符上的适当数字。

最后使用的方法是

showCountdown

. 这个计数器从20开始,每秒钟减少一个。如果该值为零,它会发出三次蜂鸣,表示时间已过。

下面是所有代码:

#include <TM1637.h> // include display library#include <pitches.h> // include pitchesTM1637 *_display = new TM1637(12, 13); // create display object, 12 = CLK (clock), 13 = D10 (data)// musicint songState = 0;int melody[] = { NOTE_F4, NOTE_E4, NOTE_D4, NOTE_CS4, NOTE_C4, NOTE_B3, NOTE_AS3, NOTE_A3, NOTE_G3, NOTE_A3, NOTE_AS3, NOTE_A3, NOTE_G3, NOTE_C4, 0, NOTE_C4, NOTE_A3, NOTE_A3, NOTE_A3, NOTE_GS3, NOTE_A3, NOTE_F4, NOTE_C4, NOTE_C4, NOTE_A3, NOTE_AS3, NOTE_AS3, NOTE_AS3, NOTE_C4, NOTE_D4, 0, NOTE_AS3, NOTE_G3, NOTE_G3, NOTE_G3, NOTE_FS3, NOTE_G3, NOTE_E4, NOTE_D4, NOTE_D4, NOTE_AS3, NOTE_A3, NOTE_A3, NOTE_A3, NOTE_AS3, NOTE_C4, 0, NOTE_C4, NOTE_A3, NOTE_A3, NOTE_A3, NOTE_GS3, NOTE_A3, NOTE_A4, NOTE_F4, NOTE_F4, NOTE_C4, NOTE_B3, NOTE_G4, NOTE_G4, NOTE_G4, NOTE_G4, 0, NOTE_G4, NOTE_E4, NOTE_G4, NOTE_G4, NOTE_FS4, NOTE_G4, NOTE_D4, NOTE_G4, NOTE_G4, NOTE_FS4, NOTE_G4, NOTE_C4, NOTE_B3, NOTE_C4, NOTE_B3, NOTE_C4, 0};int tempo[] = { 8, 16, 8, 16, 8, 16, 8, 16, 16, 16, 16, 8, 16, 8, 3, 12, 16, 16, 16, 8, 16, 8, 16, 8, 16, 8, 16, 8, 16, 4, 12, 12, 16, 16, 16, 8, 16, 8, 16, 8, 16, 8, 16, 8, 16, 4, 12, 12, 16, 16, 16, 8, 16, 8, 16, 8, 16, 8, 16, 8, 16, 4, 16, 12, 17, 17, 17, 8, 12, 17, 17, 17, 8, 16, 8, 16, 8, 16, 8, 1 };// non blocking setup// free playunsigned long previousMillis1 = 0; // time words last changedc***t long interval1 = 1500; // interval between changing// musicunsigned long previousMillis2 = 0; // time last changedc***t long interval2 = 100; // interval between notesint displayStatus = 0; // keep track of what's displayedint mode = 0; // keep track of game mode -- change to 0 or 1 for different modesbool countdown = false;unsigned long previousMillis3 = 0; // time last changedc***t long interval3 = 1000; // interval between countdownint count = 20; // challenge mode timervoid setup() { // put your setup code here, to run once: pinMode(9, INPUT); // setup circuit pinMode(10, OUTPUT); // setup buzzer 1 pinMode(11, OUTPUT); // setup buzzer 2 pinMode(2, INPUT); // setup button _display->set(5); // set brightness _display->point(false); // remove colon _display->init(); // start display}void loop() { // put your main code here, to run repeatedly: if(mode == 0) { // challenge mode if(digitalRead(2) == HIGH) { delay(25); if(digitalRead(2) == HIGH) { countdown = true; // stop the countdown } else { countdown = false; // stop the countdown } } if(countdown) { showCountdown(); // advance countdown } } else { // free play toggleFreePlay(); } if(digitalRead(10) == HIGH) { delay(25); if(digitalRead(10) == HIGH) { while(digitalRead(10) == HIGH) { buzz(11, NOTE_B0, 1000/24); } } } else sing();}void showCountdown() { // countdown the time remaining unsigned long currentMillis = millis(); // current time if (currentMillis - previousMillis3 >= interval3) { previousMillis3 = currentMillis; --count; showNumber(count); if(count == 0) { // game over countdown = false; count = 20; // reset countdown // buzz 3 times buzz(11, NOTE_B0, 1000/24); delay(100); buzz(11, NOTE_B0, 1000/24); delay(100); buzz(11, NOTE_B0, 1000/24); } }}void showNumber(int number) { // show numbers (maximum 99) on display _display->display(0, 25); // write - to segment 1 _display->display(3, 25); // write - to segment 4 // write number to middle of displayif(number == 10){ _display->display(1,1); _display->display(2,0);}else if(number > 9){ _display->display(1,1); int newVal = number - 10; _display->display(2, newVal);}else{ _display->display(1,0); _display->display(2,number);}}void toggleFreePlay() { // scroll between words without blocking unsigned long currentMillis = millis(); // current time if (currentMillis - previousMillis1 >= interval1) { previousMillis1 = currentMillis; if(displayStatus == 1) showPlay(); else showFree(); }}void showPlay() { // write "PLAY" to the display _display->display(0, 21); // write P to segment 1 _display->display(1, 18); // write L to segment 2 _display->display(2, 10); // write A to segment 3 _display->display(3, 4); // write Y to segment 4 displayStatus = 2;}void showFree() { // write "Free" to the display _display->display(0, 15); // write F to segment 1 _display->display(1, 23); // write r to segment 2 _display->display(2, 14); // write E to segment 3 _display->display(3, 14); // write E to segment 4 displayStatus = 1;}void buzz(int targetPin, long frequency, long length) { /* Buzzer example function by Rob Faludi http://www.faludi.com https://gist.github.com/AnthonyDiGirolamo/1405180 */ long delayValue = 1000000/frequency/2; // calculate the delay value between transiti*** //// 1 second's worth of microseconds, divided by the frequency, then split in half since //// there are two phases to each cycle long numCycles = frequency * length/ 1000; // calculate the number of cycles for proper timing //// multiply frequency, which is really cycles per second, by the number of seconds to //// get the total number of cycles to produce for (long i=0; i < numCycles; i++){ // for the calculated length of time... digitalWrite(targetPin,HIGH); // write the buzzer pin high to push out the diaphragm delayMicroseconds(delayValue); // wait for the calculated delay value digitalWrite(targetPin,LOW); // write the buzzer pin low to pull back the diaphragm delayMicroseconds(delayValue); // wait again for the calculated delay value }}void sing() { // play the song in a non blocking way unsigned long currentMillis = millis(); if (currentMillis - previousMillis2 >= interval2) { previousMillis2 = currentMillis; int noteDuration = 1000 / tempo[songState]; buzz(10, melody[songState], noteDuration); int pauseBetweenNotes = noteDuration; delay(pauseBetweenNotes); // stop the tone playing: buzz(10, 0, noteDuration); ++songState; // start song again if finished if(songState > 79) { songState = 14; // skip intro } }}

将此文件另存为“buzzwire”(文件gt;另存为),然后将其上载到您的板(文件&gt;上载)。如果您不确定如何上传Arduino,或者代码看起来有点吓人,请看一下我们的Arduino初学者指南。一切都好,你现在应该有自己的嗡嗡声电玩——酷!

如果你看完这篇文章后做了一些很酷的东西,我很乐意看到——请在下面的评论中告诉我!

  • 发表于 2021-03-17 09:39
  • 阅读 ( 237 )
  • 分类:IT

你可能感兴趣的文章

你现在可以做10个预算的arduino星球大战项目

... 在本文中,我们将介绍一些基于Arduino的星球大战项目,你可以在预算。这些项目有的只花了几美元,有的甚至高达40美元。我们还加入了一些更大项目的链接,虽然没有一个项目可以说是预算意识强,但...

  • 发布于 2021-03-12 05:05
  • 阅读 ( 273 )

6个显示器从arduino输出数据

所以,你有一个Arduino。你已经学会了一些基础知识,也许你已经按照初学者指南开始了。接下来呢? ...

  • 发布于 2021-03-12 19:42
  • 阅读 ( 258 )

关于arduino你一直想知道的10件事

Arduino是你能学到的最好的极客爱好之一,因为它涉及到一点点东西:电路、编码、自己动手、解决问题、创造力等等。但即使你没有任何这方面的经验,你仍然应该学习Arduino——即使只是基础知识。 ...

  • 发布于 2021-03-13 02:49
  • 阅读 ( 235 )

arduino入门:初学者指南

Arduino是一个开源的电子产品原型平台,它是世界上最流行的平台之一——除了Raspberry Pi之外。销量超过300万台(更多的是以第三方克隆设备的形式):是什么让它这么好,你能用它做什么? ...

  • 发布于 2021-03-14 15:19
  • 阅读 ( 290 )

10个涉及编程或脚本的有益爱好

... Arduino是电子、编程和休闲的完美结合。它是一个开源的微控制器(即一个微型的单电路计算机),具有各种组件和可编程逻辑。把它想象成**使用的乐高,使用实际的线路...

  • 发布于 2021-03-14 18:18
  • 阅读 ( 265 )

带有oled显示屏的arduino复古游戏

...没有想过要花多少功夫才能写出自己的复古游戏?Pong为Arduino编写代码有多容易?加入我,我告诉你如何建立一个Arduino供电的迷你复古游戏控制台,以及如何从头开始编码乒乓球。最终结果如下: ...

  • 发布于 2021-03-16 17:37
  • 阅读 ( 232 )

如何用arduino和unity制作自定义游戏控制器

...戏控制器与Unity游戏引擎一起使用。这个控制器将由一个Arduino Uno提供动力,不过你也可以在这个项目中使用许多替代品中的一个。我们还将创建一个基本的游戏,你将使用你的控制器,以避免下降的物体和减慢时间。 ...

  • 发布于 2021-03-17 05:47
  • 阅读 ( 585 )

15个优秀的arduino初学者项目

Arduino项目可能很难知道从哪里开始。幸运的是有这么多的选择。这里有15个初学者Arduino项目,让你去! ...

  • 发布于 2021-03-23 11:30
  • 阅读 ( 356 )

100美元以下的7款最佳机械臂套件

... 你可以用Arduino控制机械臂套件,通过USB编程,甚至用液压遥控器。虽然许多机械臂套件都很贵,但你不必花很多钱来获得乐趣。 ...

  • 发布于 2021-03-23 13:59
  • 阅读 ( 335 )

为2018年世界杯打造10个足球主题diy项目

... 1arduino蓝牙记分板 ...

  • 发布于 2021-03-24 15:20
  • 阅读 ( 257 )
死者赤いの瞳
死者赤いの瞳

0 篇文章

相关推荐