Посох для Деда Мороза

от автора

Каждый год 31-го декабря я в костюме Деда Мороза и жена в роли Снегурочки разъезжаем по городу по своим друзьям с поздравлениями. Поскольку уже скоро наступит Новый Год, я решил проверить, все ли у меня к нему готово и достал из подвала свой давно видавший виды посох. К моему удивлению, пролежав в подвале целый год он исправно работал даже сейчас! Его аккумулятор все еще как-то заряжен! Посох не очень ярко, но светится. Конечно придется подзарядить, да и смотрю один светодиод перестал работать, но это дело поправимое — починим.

Этот посох я изготовил еще в 2012-м году и с тех пор он служил мне верой и правдой. Штука достаточно простая, но очень эффектная, особенно ему радуются дети. Он почти как меч джедая — только посох, а для настоящего Деда Мороза — это вещь просто необходимая. Решил написать про него здесь на Хабре — вдруг кто-то проникнется идеей и сделает такой и себе к Новому Году, время еще есть.

Для изготовления посоха понадобятся:

  • кусок пластиковой водопроводной трубы 1.3 метра;
  • немного блестящей самоклейки для украшения;
  • кусок сетевого кабеля UTP-5 или любого другого подходящего;
  • синие светодиоды, хотя бы 24 штуки;
  • аккумулятор;
  • кнопка включения;
  • любая маленька плата микроконтроллера или FPGA, у кого что есть, которую вы умеете программировать;
  • большой шар-елочная игрушка, который можно разделить пополам и чтобы в него можно было спрятать и плату и аккумулятор.

Необходимые запчасти видны на этом фото:

Устройство посоха очень простое. Тут особенно и писать нечего. Берем белую водопроводную пластиковую трубу и сверлим несколько отверстий на одинаковом расстоянии 200 мм. У меня получилось 6 отверстий.

Распускаем кабель UTP-5 на несколько витых пар. Нужно шесть пар проводов. Запускаем их в отверстия и выводим через один конец трубы, туда, где будет волшебный шар посоха. Там где пары проводов заходят в отверстия трубы зачищаем их и плотно оборачиваем вокруг трубы на некотором расстоянии друг от друга. Спаиваем. К получившейся «шине» по кругу посоха припаиваем параллельно 4 синих светодиода:

Вверху трубы нужно просверлить отверстие побольше и туда вклеить кнопку включения управляющей платы:

У меня в качестве платы управления идет платка «Марсоход». Тут стоит ПЛИС Альтеры MAX II и поскольку плата изначально предназначалась для подлючения маломощных игрушечных двигателей, то на плате выводы чипа объединены по 10 штук, чтобы выдать ток побольше. Таких объединенных выводов на плате как раз 6 штук — это «сигналы» платы f0, f1, f2, f3, f4, f5. Значит я могу напрямую питать от этих выводов светодиоды не боясь спалить вывод ПЛИС. Так же на самой плате есть 8 желтых светодиодов — их тоже можно зажигать. Если шар на вершине посоха полупрозрачный, то это тоже добавит визуального эффекта.

Если вы будете использовать в посохе к примеру Ардуино, то возможно придется спаять небольшую платку с транзисторными ключами для управления многими светодиодами, так как с одного пина микроконтроллера лучше не брать больше 10-15мА, а нам нужно для светодиодов гораздо больше.

Плату нужно прошить управляющей программой. Идея такая, что когда нажимаешь на посохе кнопку, то включается плата и она сразу же начинает зажигать на посохе огни. Тут у кого какая фантазия. Я сперва зажигаю по очереди все светодиоды от первого ряда до шестого, а потом гашу по очереди с шестого по первый.

Код на 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~40Гц — эта частота определяет скорость эффекта и вторая частота mclk~320Гц, в восемь раз выше. Сигнал mclk дополнительно модулирует выводы опять же, чтоб они не всегда были включены, чтоб не так ярко светили светодиоды и не грелся чип.

Не знаю нужно ли занаучивать эту статью. Но на всякий случай напишу, что вышеприведенный код 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 

Как именно производится симуляция проектов можно почитать, например, вот здесь.

Ну и по результатам симуляции можно получить вот такие временные диаграммы сигналов:

Если вы задумаете делать этот проект на Ардуине — это тоже можно. Я правда не большой знаток Ардуины, но мне кажется, что код может выглядеть как-то так:

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); 	} } 

В итоге должно получиться что-то вот такое:

Несмотря на то, что проект в целом очень простой, у зрителей и у случайных прохожих 31-го декабря вызывает неизменный восторг. Особенно когда выходишь на заснеженной улице из автомобиля в костюме Деда Мороза, подходишь к случайному прохожему и освещая путь посохом даришь мандаринку.


ссылка на оригинал статьи https://habr.com/ru/post/479404/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *