所以我在 Sparkfun 网站上阅读了关于在他们的网站上生产和销售你的小工具和小工具的能力。我真的很喜欢 Particle Photon,喜欢像 Sparkfun 这样的网站,因为它们鼓励创造力。
输入利用 Particle 固件中的 tone() 功能的想法。一旦我看到它,我就知道我需要提高我在 EagleCad 中的技能,并学习一两件关于设计我的第一个 PCB 的事情。
尽管 Sparkfun 可能实际上不接受这篇文章作为提交,但我想与社区分享我的项目。
步骤 1. 设计 PCB
我使用 EagleCad 设计我的威廉希尔官方网站 和 PCB。这个概念是,拿到这个防护罩的人可以轻松地将它与从 Sparkfun 购买的现有光子防护罩一起使用。
因此,如果您有一个电池保护罩,也许还有一个原型板,现在您想要轻松地将音乐融入您的项目中,您可以做到。
因此,我进行了大量研究和修补,或多或少地复制了 Sparkfun 销售的现有防护罩的规格。当我在做的时候,我尽可能地遵循了他们的提交指南。任何购买过 Sparkfun 的 Photons shield 的人都知道 D0 和 D1 是为 I2C 保留的。所以我放置了一些焊接跳线,让用户可以选择将蜂鸣器分配给哪个引脚。
在这一点上,我发现了一个名为 OSHPark 的服务。他们是最酷的 PCB 服务。在 EagleCad 中完成 PCB 设计后,我将 brd 文件上传到 OSHPark,然后等了不到三周就拿到了实际的 PCB。不到 11.00 美元就不错了!
我从他们那里订购了一些 12 针母头和一些 12 毫米压电蜂鸣器并将其焊接起来。
Step 2. 音乐时间
因此,起初我复制并粘贴了有关使用 tone() 的文档中的示例代码。果然一打开就发出了很酷很短的小曲子!
// EXAMPLE USAGE
// Plays a melody - Connect small speaker to analog pin A0
int speakerPin = A0;
// notes in the melody:
int melody[] = {
1908, 2551, 2551, 2273,
2551, 0, 2024, 1908
}; //C4,G3,G3,A3,G3,0,B3,C4
// note durations: 4 = quarter note, 8 = eighth note, etc.
int noteDurations[] = {
4, 8, 8, 4,
4, 4, 4, 4
};
void setup(){
// iterate over the notes of the melody:
for(int thisNote = 0; thisNote < 8; thisNote++){
// to calculate the note duration, take one second
// divided by the note type.
//e.g. quarter note = 1000 / 4, eighth note = 1000/8, etc.
int noteDuration = 1000/noteDurations[thisNote];
tone(speakerPin, melody[thisNote], noteDuration);
// to distinguish the notes, set a minimum time between them.
// the note's duration + 30% seems to work well:
int pauseBetweenNotes = noteDuration * 1.30;
delay(pauseBetweenNotes);
// stop the tone playing:
noTone(speakerPin);
}
}
然后我想进一步发挥这个小项目的能力。所以我用谷歌搜索了 MarioBros 的音符,结果发现有人已经将它编码为可以在 Teensy 和 Arduino 上使用!所以我借用了代码并修改了它在 Photon 上的工作。
抱歉,我找不到用于借用代码的站点...
这是改编:
#define NOTE_B0 31
#define NOTE_C1 33
#define NOTE_CS1 35
#define NOTE_D1 37
#define NOTE_DS1 39
#define NOTE_E1 41
#define NOTE_F1 44
#define NOTE_FS1 46
#define NOTE_G1 49
#define NOTE_GS1 52
#define NOTE_A1 55
#define NOTE_AS1 58
#define NOTE_B1 62
#define NOTE_C2 65
#define NOTE_CS2 69
#define NOTE_D2 73
#define NOTE_DS2 78
#define NOTE_E2 82
#define NOTE_F2 87
#define NOTE_FS2 93
#define NOTE_G2 98
#define NOTE_GS2 104
#define NOTE_A2 110
#define NOTE_AS2 117
#define NOTE_B2 123
#define NOTE_C3 131
#define NOTE_CS3 139
#define NOTE_D3 147
#define NOTE_DS3 156
#define NOTE_E3 165
#define NOTE_F3 175
#define NOTE_FS3 185
#define NOTE_G3 196
#define NOTE_GS3 208
#define NOTE_A3 220
#define NOTE_AS3 233
#define NOTE_B3 247
#define NOTE_C4 262
#define NOTE_CS4 277
#define NOTE_D4 294
#define NOTE_DS4 311
#define NOTE_E4 330
#define NOTE_F4 349
#define NOTE_FS4 370
#define NOTE_G4 392
#define NOTE_GS4 415
#define NOTE_A4 440
#define NOTE_AS4 466
#define NOTE_B4 494
#define NOTE_C5 523
#define NOTE_CS5 554
#define NOTE_D5 587
#define NOTE_DS5 622
#define NOTE_E5 659
#define NOTE_F5 698
#define NOTE_FS5 740
#define NOTE_G5 784
#define NOTE_GS5 831
#define NOTE_A5 880
#define NOTE_AS5 932
#define NOTE_B5 988
#define NOTE_C6 1047
#define NOTE_CS6 1109
#define NOTE_D6 1175
#define NOTE_DS6 1245
#define NOTE_E6 1319
#define NOTE_F6 1397
#define NOTE_FS6 1480
#define NOTE_G6 1568
#define NOTE_GS6 1661
#define NOTE_A6 1760
#define NOTE_AS6 1865
#define NOTE_B6 1976
#define NOTE_C7 2093
#define NOTE_CS7 2217
#define NOTE_D7 2349
#define NOTE_DS7 2489
#define NOTE_E7 2637
#define NOTE_F7 2794
#define NOTE_FS7 2960
#define NOTE_G7 3136
#define NOTE_GS7 3322
#define NOTE_A7 3520
#define NOTE_AS7 3729
#define NOTE_B7 3951
#define NOTE_C8 4186
#define NOTE_CS8 4435
#define NOTE_D8 4699
#define NOTE_DS8 4978
int melodyPin = D2;
int marioMelody[] = {
2637, 2637, 0, 2637,
0, 2097, 2637, 0,
NOTE_G7, 0, 0, 0,
NOTE_G6, 0, 0, 0,
NOTE_C7, 0, 0, NOTE_G6,
0, 0, NOTE_E6, 0,
0, NOTE_A6, 0, NOTE_B6,
0, NOTE_AS6, NOTE_A6, 0,
NOTE_G6, NOTE_E7, NOTE_G7,
NOTE_A7, 0, NOTE_F7, NOTE_G7,
0, NOTE_E7, 0, NOTE_C7,
NOTE_D7, NOTE_B6, 0, 0,
NOTE_C7, 0, 0, NOTE_G6,
0, 0, NOTE_E6, 0,
0, NOTE_A6, 0, NOTE_B6,
0, NOTE_AS6, NOTE_A6, 0,
NOTE_G6, NOTE_E7, NOTE_G7,
NOTE_A7, 0, NOTE_F7, NOTE_G7,
0, NOTE_E7, 0, NOTE_C7,
NOTE_D7, NOTE_B6, 0, 0
};
int tempo[] = {
12, 12, 12, 12,
12, 12, 12, 12,
12, 12, 12, 12,
12, 12, 12, 12,
12, 12, 12, 12,
12, 12, 12, 12,
12, 12, 12, 12,
12, 12, 12, 12,
9, 9, 9,
12, 12, 12, 12,
12, 12, 12, 12,
12, 12, 12, 12,
12, 12, 12, 12,
12, 12, 12, 12,
12, 12, 12, 12,
12, 12, 12, 12,
9, 9, 9,
12, 12, 12, 12,
12, 12, 12, 12,
12, 12, 12, 12
};
int underworldmelody[] = {
NOTE_C4, NOTE_C5, NOTE_A3, NOTE_A4,
NOTE_AS3, NOTE_AS4, 0,
0,
NOTE_C4, NOTE_C5, NOTE_A3, NOTE_A4,
NOTE_AS3, NOTE_AS4, 0,
0,
NOTE_F3, NOTE_F4, NOTE_D3, NOTE_D4,
NOTE_DS3, NOTE_DS4, 0,
0,
NOTE_F3, NOTE_F4, NOTE_D3, NOTE_D4,
NOTE_DS3, NOTE_DS4, 0,
0, NOTE_DS4, NOTE_CS4, NOTE_D4,
NOTE_CS4, NOTE_DS4,
NOTE_DS4, NOTE_GS3,
NOTE_G3, NOTE_CS4,
NOTE_C4, NOTE_FS4, NOTE_F4, NOTE_E3, NOTE_AS4, NOTE_A4,
NOTE_GS4, NOTE_DS4, NOTE_B3,
NOTE_AS3, NOTE_A3, NOTE_GS3,
0, 0, 0
};
//Underwolrd tempo
int underworldtempo[] = {
12, 12, 12, 12,
12, 12, 6,
3,
12, 12, 12, 12,
12, 12, 6,
3,
12, 12, 12, 12,
12, 12, 6,
3,
12, 12, 12, 12,
12, 12, 6,
6, 18, 18, 18,
6, 6,
6, 6,
6, 6,
18, 18, 18, 18, 18, 18,
10, 10, 10,
10, 10, 10,
3, 3, 3
};
void setup(){
delay(1000);
}
void loop(){
for(int thisNote = 0; thisNote < 78; thisNote++){
int noteDuration = 1500/tempo[thisNote];
tone(melodyPin, marioMelody[thisNote], noteDuration);
int pause = noteDuration * 1.33;
delay(pause);
noTone(melodyPin);
}
delay(2000);
for(int thisNote = 0; thisNote < 56; thisNote++){
int noteDuration = 1300/underworldtempo[thisNote];
tone(melodyPin, underworldmelody[thisNote], noteDuration);
int pause = noteDuration * 1.33;
delay(pause);
noTone(melodyPin);
}
}
可以肯定的是,它会同时播放这两种曲调,而且聆听它们真的很有趣。从这里开始,我计划让它变得更加智能。例如,假设您想要触发声音,因为房子对面的另一个 Photon 发布了一个事件。
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
全部0条评论
快来发表一下你的评论吧 !