制作低于5美元的POV LED空气写入器

您可以通过闪烁的LED来完成各种操作,在这个简单的项目中,我们将制造一个小型设备,当您来回挥动时,它可以在空中广播消息。它比您想像的要容易,而且零件的总成本不到5美元。

该项目利用了一种称为视觉持久性的视觉幻觉,使文本在空中出现。晚上有人快速移动点燃的烟火时,您可能会遇到这种现象。我们将使用Arduino和一些LED来模仿这种效果。该项目易于构建,几乎不需要任何组件,而且几乎不需要焊接(尽管如果您想了解一些开始使用烙铁的技巧,请查阅本指南)。

您将需要

  • Arduino(我使用了$ 2的Nano,因为它紧凑且便宜,但任何型号都可以)。
  • 5个红色LED。
  • 5个220欧姆电阻。
  • 1x翘板开关。
  • 一块protoboard。
  • 用于存放成品的外壳(我用一个涂有油漆的小纸板箱黑色)。
  • 您还需要电烙铁和一些焊料将它们放在一起。

    虽然可选,但如果您要制造任何焊锡芯,它们会非常方便焊接错误。面包板和一些连接线也可用于测试电路。

    接线

    接线简直简单。首先,如下图所示连接Arduino,LED和电阻器。

    引脚D2到D6分别连接到每个电阻器,这些电阻器连接到每个LED的正阳极(长脚)。阴极接地,然后接地回Arduino。完成后,它应该看起来像这样:

    就是这样:我们的电路已经完成!稍后我们将添加一个电池盒和一个开关,但这只是测试它是否工作的全部。

    代码

    现在将Arduino连接到计算机并打开Arduino IDE。如果您不熟悉Arduino,并希望获得良好的入门指南,此链接将非常有用。

    打开一个新草图并复制此代码。此代码是从该项目中修改的,您可以在此Gist上完整下载它。

    // how long each led stays on forint delayTime = 1;//how long between each int charBreak = 3;//how long to wait after the message is finished before it repeatsint resetTime = 20;int LED1 = 2;int LED2 = 3;int LED3 = 4;int LED4 = 5;int LED5 = 6;void setup(){pinMode(LED1, OUTPUT);pinMode(LED2, OUTPUT);pinMode(LED3, OUTPUT);pinMode(LED4, OUTPUT);pinMode(LED5, OUTPUT);}int a[] = {1, 6, 26, 6, 1};int b[] = {31, 21, 21, 10, 0};int c2[] = {14, 17, 17, 10, 0};int d[] = {31, 17, 17, 14, 0};int e[] = {31, 21, 21, 17, 0};int f[] = {31, 20, 20, 16, 0};int g[] = {14, 17, 19, 10, 0};int h[] = {31, 4, 4, 4, 31};int i[] = {0, 17, 31, 17, 0};int j[] = {0, 17, 30, 16, 0};int k[] = {31, 4, 10, 17, 0};int l[] = {31, 1, 1, 1, 0};int m[] = {31, 12, 3, 12, 31};int n[] = {31, 12, 3, 31, 0};int o[] = {14, 17, 17, 14, 0};int p[] = {31, 20, 20, 8, 0};int q[] = {14, 17, 19, 14, 2};int r[] = {31, 20, 22, 9, 0};int s[] = {8, 21, 21, 2, 0};int t[] = {16, 16, 31, 16, 16};int u[] = {30, 1, 1, 30, 0};int v[] = {24, 6, 1, 6, 24};int w[] = {28, 3, 12, 3, 28};int x[] = {17, 10, 4, 10, 17};int y[] = {17, 10, 4, 8, 16};int z[] = {19, 21, 21, 25, 0};int eos[] = {0, 1, 0, 0, 0};int excl[] = {0, 29, 0, 0, 0};int ques[] = {8, 19, 20, 8, 0};int space[] = {0, 0, 0, 0, 0};void displayLine(int line){int myline;myline = line;if (myline>=16) {digitalWrite(LED1, HIGH); myline-=16;} else {digitalWrite(LED1, LOW);}if (myline>=8)  {digitalWrite(LED2, HIGH); myline-=8;}  else {digitalWrite(LED2, LOW);}if (myline>=4)  {digitalWrite(LED3, HIGH); myline-=4;}  else {digitalWrite(LED3, LOW);}if (myline>=2)  {digitalWrite(LED4, HIGH); myline-=2;}  else {digitalWrite(LED4, LOW);}if (myline>=1)  {digitalWrite(LED5, HIGH); myline-=1;}  else {digitalWrite(LED5, LOW);}}void displayChar(char c){if (c == 'a'){for (int i = 0; i <5; i++){displayLine(a[i]);delay(delayTime);}displayLine(0);}if (c == 'b'){for (int i = 0; i <5; i++){displayLine(b[i]);delay(delayTime);}displayLine(0);}if (c == 'c2'){for (int i = 0; i <5; i++){displayLine(c2[i]);delay(delayTime);}displayLine(0);}if (c == 'd'){for (int i = 0; i <5; i++){displayLine(d[i]);delay(delayTime);}displayLine(0);}if (c == 'e'){for (int i = 0; i <5; i++){displayLine(e[i]);delay(delayTime);}displayLine(0);}if (c == 'f'){for (int i = 0; i <5; i++){displayLine(f[i]);delay(delayTime);}displayLine(0);}if (c == 'g'){for (int i = 0; i <5; i++){displayLine(g[i]);delay(delayTime);}displayLine(0);}if (c == 'h'){for (int i = 0; i <5; i++){displayLine(h[i]);delay(delayTime);}displayLine(0);}if (c == 'i'){for (int it = 0; it <5; it++){displayLine(i[it]);delay(delayTime);}displayLine(0);}if (c == 'j'){for (int i = 0; i <5; i++){displayLine(j[i]);delay(delayTime);}displayLine(0);}if (c == 'k'){for (int i = 0; i <5; i++){displayLine(k[i]);delay(delayTime);}displayLine(0);}if (c == 'l'){for (int i = 0; i <5; i++){displayLine(l[i]);delay(delayTime);}displayLine(0);}if (c == 'm'){for (int i = 0; i <5; i++){displayLine(m[i]);delay(delayTime);}displayLine(0);}if (c == 'n'){for (int i = 0; i <5; i++){displayLine(n[i]);delay(delayTime);}displayLine(0);}if (c == 'o'){for (int i = 0; i <5; i++){displayLine(o[i]);delay(delayTime);}displayLine(0);}if (c == 'p'){for (int i = 0; i <5; i++){displayLine(p[i]);delay(delayTime);}displayLine(0);}if (c == 'q'){for (int i = 0; i <5; i++){displayLine(q[i]);delay(delayTime);}displayLine(0);}if (c == 'r'){for (int i = 0; i <5; i++){displayLine(r[i]);delay(delayTime);}displayLine(0);}if (c == 's'){for (int i = 0; i <5; i++){displayLine(s[i]);delay(delayTime);}displayLine(0);}if (c == 't'){for (int i = 0; i <5; i++){displayLine(t[i]);delay(delayTime);}displayLine(0);}if (c == 'u'){for (int i = 0; i <5; i++){displayLine(u[i]);delay(delayTime);}displayLine(0);}if (c == 'v'){for (int i = 0; i <5; i++){displayLine(v[i]);delay(delayTime);}displayLine(0);}if (c == 'w'){for (int i = 0; i <5; i++){displayLine(w[i]);delay(delayTime);}displayLine(0);}if (c == 'x'){for (int i = 0; i <5; i++){displayLine(x[i]);delay(delayTime);}displayLine(0);}if (c == 'y'){for (int i = 0; i <5; i++){displayLine(y[i]);delay(delayTime);}displayLine(0);}if (c == 'z'){for (int i = 0; i <5; i++){displayLine(z[i]);delay(delayTime);}displayLine(0);}if (c == '!'){for (int i = 0; i <5; i++){displayLine(excl[i]);delay(delayTime);}displayLine(0);}if (c == '?'){for (int i = 0; i <5; i++){displayLine(ques[i]);delay(delayTime);}displayLine(0);}if (c == '.'){for (int i = 0; i <5; i++){displayLine(eos[i]);delay(delayTime);}displayLine(0);}if (c == ' '){for (int i = 0; i <5; i++){displayLine(space[i]);delay(delayTime);}displayLine(0);}delay(charBreak);}void displayString(char* s){  for (int i = 0; i<=strlen(s); i++){  displayChar(s[i]);  }}void loop(){  //Change the text inside here to change the text displayed.  //Make sure to keep the brackets and the quotation marks.displayString("..hello!..");delay(40);}

    保存草图并将其上传到您的电路板上。如果出现任何错误,请确保选择了正确的板卡和COM端口。您的LED应该开始闪烁。如果没有,请检查面包板上的所有连接。在代码开头声明的整数决定了文本显示的速度。数值越大,挥动设备的速度就越快。我发现这里使用的数字效果很好。

    现在进行快速测试。断开Arduino与USB电缆的连接,然后将电池座连接到arduino的VIN和GND引脚上。

    现在可以随意移动它了,请小心地尝试摆动前面的LED。如果您周围足够暗,您应该会看到一些字母在空中形成。我发现它有助于设置手机来捕获它。

    它有效!

    准备就绪的铁!

    在原型板上放置Arduino板,电阻器和LED,如下所示:

    当然,只要电路保持不变,就可以使布局尽可能紧凑。确保您在Arduino的每一侧留出至少一行原型板触点,以用于组件和电源。如果您是电子产品的初学者,那么这里有一些很棒的技巧。

    我们将把LED阴极成一条线焊接在一起以形成共同点,就像我们制作LED矩阵时所做的一样

    折叠每个阴极,使其与另一个阴极重叠,然后焊接它们以形成一条连续的线。现在,我们需要将阳极焊接到旁边的电阻器脚上。我发现最简单的方法是将每条脚焊接到各自的焊盘上,然后将烙铁放在它们之间,以加热两个接头,最后再添加更多的焊料以弥合它们之间的间隙。

    检查每个连接以确认其已牢固连接,然后使用剪钳从电阻器和LED上断开多余的支脚。

    现在重复相同的任务,但是这次连接另一端我们的电阻连接到Arduino的腿。这是焊接中最棘手的部分。每个电阻都单独连接到其Arduino引脚,否则电路将无法正常工作。我在这里犯了几个错误,不得不多次使用焊芯来清除多余的焊锡。

    一旦您建立了所有正确的连接,请仔细检查它们是否与邻域重叠。如果您可以在此处使用万用表,则可以使用连续性模式来检查每个引脚的电阻上只有一条不间断的线。如果您只有万用表,那么本文中有个很好的入门指南。

    检查完每个连接后,从电阻腿上剪掉多余的长度

    添加电源

    现在从GND引出一根电线将Arduino引脚固定到焊接阴极线末端附近的一个孔中,然后将电池座的黑线放在旁边。

    现在以相同方式将导线焊接到GND引脚我们使用了电阻,然后将两条导线都焊接到阴极线的末端以为电路创建一个公共接地。

    最后,将一条导线连接到arduino的VIN引脚上,然后将在那根电线和电池组之间切换。为这张照片中的热熔胶开关道歉,我不得不拆除完成的机器才能拍摄到这个阶段!

    全部焊接在一起后,放入电池并轻拂开关。恭喜你!电路完成。如果看不到任何东西亮起,请仔细检查每个焊点,看哪里可能有断裂或短路。

    外壳

    现在,我们可以正常工作了,让我们把它放在一个盒子里。尽管您可以使用在业余商店中购买的盒子甚至旧的特百惠盒子来制作一些永久性的东西,但这里还是使用了一个彩绘的纸板箱。为了获得额外的极客信誉,您甚至可以在这些便宜的3D打印机之一上自己进行3D打印。

    通过对Protoboard进行打分,并对其进行打分,然后小心地折掉不需要的零件。

    将电路放入机箱中,并标记需要LED和开关的位置戳。您还可以选择标记Arduino板上USB连接器与边缘的交汇处,以便无需打开包装盒即可将其插入以更改文本。在外壳上钻出或切出所需的孔。

    现在,在LED的边缘添加一些热胶并将其粘贴到位。我在电路下粘了一块海绵,以便它能紧密地放在盒子里。将开关连接到外壳。我使用了热胶,尽管螺钉或螺栓会使连接更牢固。您也可以在使用电池时将电池座粘在电路板的背面,以防止其在内部移动,但是请确保壳体上的任何金属触点都不会碰到您的任何焊接点!

    工作完成!

    关闭机箱,您就完成了!要更改文本,请将USB电缆连接到Arduino板上,然后在 loop 方法中的 displayString 之后更改括号内的文本。找到一个黑暗的地方,玩得开心!

    您是否曾经构建过POV机器并知道改进设计的方法?您打算自己建造一个吗?在下面的评论中告诉我们有关您的项目的信息,我们很乐意听到!

    标签: Arduino 电子技术