圣诞老人的工作人员



每年的12月31日,我都穿着圣诞老人的服装,而我的妻子则扮演着“雪姑娘”的角色,祝贺我开车环游我的朋友们。 由于新年快到了,我决定检查一下是否一切准备就绪,并从地下室中抽出了我疲惫的员工。 令我惊讶的是,他在地下室呆了一年之后,即使现在也能正常工作! 他的电池仍然以某种方式充电! 工作人员不是很明亮,但是会发光。 当然,我必须充电,并且我正在观察一个LED停止工作,但这是可以解决的-我们将对其进行修复。

我在2012年聘请了这名员工,从那时起,它一直忠实地为我服务。 事情很简单,但是却非常有效,尤其是孩子们对此感到高兴。 他几乎就像绝地剑一样-只有一把杖,对于真正的圣诞老人-这是必要的。 我决定在哈布雷(Habré)上写关于他的文章-突然有人会受到这个想法的启发,并在新年之际为自己实现了这一想法,但仍有时间。

要聘请员工,您需要:

  • 一根1.3米的塑料水管;
  • 有点光泽的自粘装饰。
  • 一条UTP-5网络电缆或任何其他合适的电缆;
  • 蓝色LED,至少24个;
  • 电池
  • 电源按钮;
  • 任何具有可编程内容的小型微控制器或FPGA板;
  • 一个大型的球形圣诞树玩具,可以将其分成两半,以便将板子和电池都隐藏在其中。

必要的部分在这张照片中可见:



员工的设备非常简单。 尤其没有什么可写的。 我们用白色的塑料水管在200毫米的相同距离处钻几个孔。 我有六个洞。

我们将UTP-5电缆分成几对双绞线。 需要六对电线。 我们将它们发射到孔中,并通过管道的一端输出,到达工作人员的魔球所在的位置。 在成对的电线进入管道孔的地方,我们将它们清洗并紧紧缠绕在管道上,彼此之间保持一定距离。 我们焊接。 到工作人员围成一圈的结果“总线”中,并联焊接4个蓝色LED:



在管道的顶部,您需要钻一个更大的孔,并将控制板的电源按钮粘贴到此处:



我有火星漫游者围巾作为控制板。 这是Altera MAX II的FPGA,由于该板最初是用于连接低功耗玩具引擎的,所以板上的芯片输出被分成10个部分,以提供更多的电流。 板上只有6个这样的组合针脚-这些是板子f0,f1,f2,f3,f4,f5的“信号”。 因此,我可以根据这些结论直接为LED供电,而不必担心烧毁FPGA的输出。 板上本身也有8个黄色的LED-也可以被点燃。 如果员工顶部的球是半透明的,那么这也会增加视觉效果。

例如,如果您在工作人员中使用Arduino,则可能必须用晶体管键焊接一条小围巾来控制许多LED,因为最好不要从微控制器的一个引脚上接10-15mA以上的电流,但是我们需要更多的LED。

该板需要使用控制程序进行刷新。 这个想法是,当您按下工作人员上的按钮时,面板将打开,并且立即开始点亮工作人员上的灯。 那谁有什么幻想。 我首先依次点亮从第一行到第六行的所有LED,然后关闭从第六行到第一行的转向灯。

Verilog HDL代码可能会更好地解释我的意思:

module effect( input wire clk, input wire mclk, output wire [7:0]leds, output wire f0, output wire f1, output wire f2, output wire f3, output wire f4, output wire f5 ); reg [3:0]cnt; reg [5:0]bits; initial begin bits= 6'h00; cnt = 4'h0; end always @(posedge clk) if(cnt==11) cnt<=0; else cnt <= cnt + 1'b1; always @* begin case(cnt) 4'h0: bits = 6'b000001; 4'h1: bits = 6'b000011; 4'h2: bits = 6'b000111; 4'h3: bits = 6'b001111; 4'h4: bits = 6'b011111; 4'h5: bits = 6'b111111; 4'h6: bits = 6'b011111; 4'h7: bits = 6'b001111; 4'h8: bits = 6'b000111; 4'h9: bits = 6'b000011; 4'ha: bits = 6'b000001; default: bits = 6'b000000; endcase end assign f0 = bits[0] & mclk; assign f1 = bits[1] & mclk; assign f2 = bits[2] & mclk; assign f3 = bits[3] & mclk; assign f4 = bits[4] & mclk; assign f5 = bits[5] & mclk; assign leds = {bits[5],bits[5],bits[4],bits[3],bits[2],bits[1],bits[0],bits[0]}; endmodule 

这不是顶层模块,而是effect.v模块,从顶层模块提供了clk〜40Hz的两个时钟频率-该频率决定了效果的速度,第二个频率mclk〜320Hz,高8倍。 mclk信号还会再次调制输出,以使它们不会始终打开,从而使LED不会发出如此明亮的光并且芯片不会发热。

我不知道我是否需要记住这篇文章。 但是以防万一,我将写到上面的Verilog代码可以使用此测试平台进行完全模拟:

 `timescale 1ms / 1us module tb; reg clock = 1'b0; always #10 clock = ~clock; reg [3:0]counter=0; always @(posedge clock) counter <= counter+1; wire [7:0]wleds; wire wf0,wf1,wf2,wf3,wf4,wf5; effect inst( .clk( counter[2] ), .mclk( clock ), .leds( wleds ), .f0( wf0 ), .f1( wf1 ), .f2( wf2 ), .f3( wf3 ), .f4( wf4 ), .f5( wf5 ) ); initial begin $dumpfile("out.vcd"); $dumpvars(0,tb); #10000; $finish(); end endmodule 

例如,可以在此处阅读如何精确模拟项目。

好了,根据仿真的结果,您可以获得这些信号的时序图:



如果您打算在Arduin上进行此项目-这也是可能的。 我确实不是Arduina的大鉴赏家,但是在我看来,代码可能看起来像这样:

 int start_pin = 2; int end_pin = 8; void setup() { for (int i = start_pin; i< end_pin; i++ ) pinMode(i, OUTPUT); } void loop() { for (int i = start_pin; i< end_pin; i++ ) { digitalWrite(i, HIGH); delay(250); } for (int i = start_pin; i< end_pin; i++ ) { digitalWrite(i, LOW); delay(250); } } 

结果应该是这样的:


尽管整个项目非常简单,但12月31日的观众和临时路人总是很高兴。 尤其是当您在积雪的街道上穿着圣诞老人的衣服从车上下来时,您会接近一个随机的路人并与工作人员照亮道路,然后给一只duck。

Source: https://habr.com/ru/post/zh-CN479404/


All Articles