万圣节快乐!今天我们本着万圣节的精神,将学习一个教程来制作一个陌生人事物“帮助我”板。
您需要的零件:
Elegoo Uno R3 完整入门套件非常适合此用途,因为它包含 4 种不同的 LED 颜色。幸运的是,我周围还有一些其他颜色的 LED,这样我就可以为项目添加更多变化。
原理图
为了使用更少的 I/O 引脚,我们将使用 5×5 矩阵。这将覆盖字母 AY。对于 Z 它将有自己的引脚。通过查看上面的示意图,您可以看到,为了打开一个 LED,该行将变为高电平,而源将被设置为低电平。例如。要打开 A,PIN 2 将设置为高电平,而 Pin 8 将设置为低电平。这只会打开 A。将一个 ROW 设置为高电平而将其他 ROWS 设置为 LOW 以及将一列设置为低电平而将其他列设置为 HIGH 的每种组合一次只会点亮一个 LED。这使用 10 个引脚 + 1 来完成所有 26 个字母。与必须为每个 LED 配备一个 I/O 相比,这使用的 I/O 引脚要少得多。
接下来要决定的是源电阻(R1-R6)。由于有不同的 LED,因此会有不同的电压降。LED 两端的电压范围为 1.5V 至 3.5V。因为这应该看起来很吓人,所以我们并不真正关心某些 LED 可能看起来更亮而其他 LED 可能看起来更暗。我们唯一关心的是确保我们不超过 Arduino 引脚可以提供的最大电流 20mA。我最终为这个项目挑选了 250 欧姆的电阻器。这为我们提供了 (5V-1.5V)/250 Ohm 至 (5V-3.5V)/250Ohms 或 14mA – 6mA 的范围。这没关系,因为我们不会超过 I/O 引脚的最大 20mA 要求。
现在我们有了要使用的电路,第一步是拿起硬纸板或硬纸板并布置字母表。确保事先在一张纸上试一试,这样你才能得到正确的字母间距和大小
接下来我们将在字母下方钻孔。尽量让这些间隔开,以便 LED 引线可以轻松插入孔中。
钻完所有孔后,就可以插入所有 LED 了。我选择尝试让 LED 随机。将它们全部插入相同的极性方向,这样更容易接线。我在左侧插入了每个带有长引线的 LED。在查看原理图时,这使得 LED 接线变得非常容易。
现在是时候开始焊接了。您需要将电路板翻转到背面。确保执行此操作时 LED 不会掉落。当我将它翻转到背面时,我通过将另一块芯片板放在 LED 的顶部来做到这一点。
现在继续添加你的 Arduino,9V 电池并将所有东西连接到适当的引脚。还可以使用电工胶带确保没有短路。我把我的放在 LED 的引线和 Arduino 的背面。然后我使用电工胶带将 9V 电池和 Arduino 固定到电路板背面。
现在我们将开始编码。您可以通过使用 digitalWrite() 进行设置来测试您的电路和布线,并将所有行设置为低,除了一列,然后将所有列设置为高,除了一列,并确保相应的 LED 为组合打开。
我们将不使用 digitalWrite(),而是直接进入 ATMEGA 微型库,通过将PORTD 和 PORTB设置为我们想要打开和关闭的数字 I/O来打开和关闭引脚。这将使编程更容易。PORTD 控制数字 I/O 引脚 0-7,而 PORTB 控制引脚 8-13。例如:如果您想打开引脚 7 并关闭所有其他引脚,只需设置 PORTD = 10000000。
首先,我们将创建一个结构来定义每个字母的端口配置。
typedef struct // Create a structure to convert Binary of the PORTs for the corresponding Letter
{
byte portd;
byte portb;
}letter_data_t;
我们将命名为 letter_data_t 的结构。接下来,我们将布置表格,根据我们连接的 5×5 矩阵将每个字母定义为一个端口。这将是 letter[] 数组。
const letter_data_t letter[] =
{
{B00000100,B11111110}, //A
{B00000100,B11111101}, //B
{B00000100,B11111011}, //C
{B00000100,B11110111}, //D
{B00000100,B11101111}, //E
{B00001000,B11111110}, //F
{B00001000,B11111101}, //G
{B00001000,B11111011}, //H
{B00001000,B11110111}, //I
{B00001000,B11101111}, //J
{B00010000,B11111110}, //K
{B00010000,B11111101}, //L
{B00010000,B11111011}, //M
{B00010000,B11110111}, //N
{B00010000,B11101111}, //O
{B00100000,B11111110}, //P
{B00100000,B11111101}, //Q
{B00100000,B11111011}, //R
{B00100000,B11110111}, //S
{B00100000,B11101111}, //T
{B01000000,B11111110}, //U
{B01000000,B11111101}, //V
{B01000000,B11111011}, //W
{B01000000,B11110111}, //X
{B01000000,B11101111}, //Y
{B10000000,B11111111}, //Z
{B00000000,B00000000} //26 = 0ff
};
现在已经使用我们上面创建的结构为每个字母建立了引用 PIN 输出的表。
接下来我们将转到代码的设置部分。每个引脚都需要设置为输出
void setup() {
// Setup each pin used as an output
pinMode(2,OUTPUT);
pinMode(3,OUTPUT);
pinMode(4,OUTPUT);
pinMode(5,OUTPUT);
pinMode(6,OUTPUT);
pinMode(7,OUTPUT);
pinMode(8,OUTPUT);
pinMode(9,OUTPUT);
pinMode(10,OUTPUT);
pinMode(11,OUTPUT);
pinMode(12,OUTPUT);
}
现在已经设置了代码并创建了表,我们将设置一些函数。该程序的主要功能是 runHelpme() 函数。这将使董事会拼写 HELP ME。这是我们试图表明“颠倒”中的某个人可能正在尝试联系我们的尝试。
void runHelpme()
{
PORTD = letter['h'-'a'].portd;
PORTB = letter['h'-'a'].portb;
delay(1000);
PORTD = letter['e'-'a'].portd;
PORTB = letter['e'-'a'].portb;
delay(1000);
PORTD = letter['l'-'a'].portd;
PORTB = letter['l'-'a'].portb;
delay(1000);
PORTD = letter['p'-'a'].portd;
PORTB = letter['p'-'a'].portb;
delay(1000);
PORTD = letter[26].portd;
PORTB = letter[26].portb;
delay(1000);
PORTD = letter['m'-'a'].portd;
PORTB = letter['m'-'a'].portb;
delay(1000);
PORTD = letter['e'-'a'].portd;
PORTB = letter['e'-'a'].portb;
delay(1000);
PORTD = letter[26].portd; //Turn off the LEDs
PORTB = letter[26].portb; //Turn off the LEDs
delay(1000);
}
这使用了我们创建的结构,并将减去我们想要的字母减去 'a' ,这是表中的第一个字母。这将通过给我们我们创建的表的想要的“字母”编号来实现。设置字母后,我们延迟一秒钟,然后打开下一个字母。
下一个我们要写的函数是一些花哨的函数,让棋盘看起来有点怪异。第一个 flair 函数将是一个 runRandom() 函数,它将随机选择字母并将它们打开随机次数。
void runRandom()
{
for(int i = 0; i<=15; i++)
{
int x = random(0,25);
PORTD = letter[x].portd;
PORTB = letter[x].portb;
delay(random(40,200));
delay(random(40,200));
delay(random(40,200));
}
}
这将运行 15 个随机字母。我们将 x 设置为 0-25 之间的随机数,它选择 26 个字母之一,然后等待 40 毫秒到 200 毫秒之间的三个随机时间。
我们要编写的最后一个函数是 flickerRandom() 函数。这将闪烁一个随机函数。我认为这无疑增加了一个很好的感觉,即董事会正在发生一些奇怪的事情。
void flickerRandom()
{
int x = random(0,25);
for(int i = 0; i<=5; i++)
{
PORTD = letter[x].portd;
PORTB = letter[x].portb;
delay(random(40,500));
PORTD = letter[26].portd;
PORTB = letter[26].portb;
delay(random(40,500));
}
}
这将在 40 毫秒至 500 毫秒的闪烁时间之间的任何位置闪烁 5 个随机字母。
现在所有的函数都写好了,是时候把所有的主循环代码放在一起了。
void loop() {
flickerRandom();
delay(2000);
runHelpme();
delay(2000);
flickerRandom();
flickerRandom();
runRandom();
}
这将首先启动闪烁例程,延迟 2 秒,显示我们的“帮助我”例程,等待 2 秒,再次连续闪烁 2 次,然后运行随机例程。这一切都表明陌生人的事情板肯定有一些奇怪的事情正在发生,如果你观察得足够近,有人可以看到它在说“帮助我”。很明显,来自 UPSIDE DOWN 的人正试图联系我们!
您可以在此处获得完整的 BreakoutBros Stranger Things 代码。
请确保您订阅以查看有关项目、教程和评论的更多更新!
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
全部0条评论
快来发表一下你的评论吧 !