×

制作陌生人事物帮助我板

消耗积分:0 | 格式:zip | 大小:0.01 MB | 2022-12-12

卓侨汉

分享资料个

描述

万圣节快乐!今天我们本着万圣节的精神,将学习一个教程来制作一个陌生人事物“帮助我”板。

您需要的零件:

  • Arduino 或同等产品
  • 发光二极管
  • 9V电池
  • 夏普

Elegoo Uno R3 完整入门套件非常适合此用途,因为它包含 4 种不同的 LED 颜色。幸运的是,我周围还有一些其他颜色的 LED,这样我就可以为项目添加更多变化。

原理图

 
poYBAGOSyUSAQNeEAAAvb1iLv5s048.png
 

为了使用更少的 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 要求。

步骤1

现在我们有了要使用的电路,第一步是拿起硬纸板或硬纸板并布置字母表。确保事先在一张纸上试一试,这样你才能得到正确的字母间距和大小

 
pYYBAGOSyUqAHcvWAAAepD0bI8s657.jpg
 

第2步

接下来我们将在字母下方钻孔。尽量让这些间隔开,以便 LED 引线可以轻松插入孔中。

 
poYBAGOSyU2AZxiJAAAiWgq3ptQ427.jpg
 

步骤 3

钻完所有孔后,就可以插入所有 LED 了。我选择尝试让 LED 随机。将它们全部插入相同的极性方向,这样更容易接线。我在左侧插入了每个带有长引线的 LED。在查看原理图时,这使得 LED 接线变得非常容易。

 
poYBAGOSyVGAc3dNAAAlPYOYZ-Q447.jpg
 

第4步

现在是时候开始焊接了。您需要将电路板翻转到背面。确保执行此操作时 LED 不会掉落。当我将它翻转到背面时,我通过将另一块芯片板放在 LED 的顶部来做到这一点。

 
 
 
 
pYYBAGOSyVSAd-ufAAAptx2nu-M889.jpg
 
1 / 2
 

步骤 5

现在继续添加你的 Arduino,9V 电池并将所有东西连接到适当的引脚。还可以使用电工胶带确保没有短路。我把我的放在 LED 的引线和 Arduino 的背面。然后我使用电工胶带将 9V 电池和 Arduino 固定到电路板背面。

 
 
 
 
pYYBAGOSyViAV95xAAA6pIPG6N4971.jpg
 
1 / 2
 

第 6 步 – 编码

现在我们将开始编码。您可以通过使用 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)
发评论

下载排行榜

全部0条评论

快来发表一下你的评论吧 !