Визатор своими руками

Достаточно трудно найти человека, который не смотрел бы замечательный советский фильм «Кин-Дза-Дза! «Думаю, что у многих было желание собрать визатор — прибор, который позволяет отличать чатлан от пацаков.a52a4d14a8db280b6a215062bfb3ea2b.jpg

Сейчас я расскажу, как можно собрать это замечательное устройство. Шуточное, конечно же:)Нет ничего сложного в мигании светодиодами и писке пьезодинамиком. Самое интересное и сложное в этой задаче — получать всегда один и тот же результат для каждого человека. В голове было перебрано много идей, но в итоге было решено, что людей надо всё-таки как-то метить. Само собой, в первую очередь так пометить надо себя, чтобы гордо быть чатланином, перед которым должны делать «Ку!»

image

Однако, такая метка должна быть невидима для окружающих. Решение пришло достаточно быстро. Я взял пульт от телевизора и убедился, что он отлично пробивает сквозь футболку. Так было решено использовать в визаторе ДУ-приёмник типа TSOP17xx, а под футболку прятать маленькую плату с инфракрасным светодиодом, который соответственно должен мигать аналогично тому, как мигают светодиоды в пультах ДУ.

Делаем «метку«Я быстро набросал плату такой метки: afd6a58a22d41fcff3ea9eabfe582523.png

В центре микроконтроллер ATmega8A. На самом деле это очень излишне, тут хватило бы и какого-нибудь ATtiny, но ничего проще у меня в наличии не было. Да можно было бы и вообще без микроконтроллера обойтись, но так гораздо проще подстраивать тайминги. Сверху два отверстия под ИК-светодиод, который включается через транзистор, и ещё два отверстия намечены, чтобы можно было продеть нитку и повесить устройство на шею.

Прошивка же проще некуда:

int main (void) { // Настраиваем ногу C3 на вывод DDRC |= (1<<3); while (1) { // Пауза в 50 миллисекунд между сигналами, иначе ДУ-приёмник будет его игнорировать _delay_ms(50); int t; // Мигаем светодиодом 100 раз for (t = 0; t < 100; t++) { // Включаем светодиод PORTC |= (1<<3); // Пауза в 11 наносекунд _delay_us(11); // Выключаем светодиод PORTC &= ~(1<<3); // Пауза в 11 наносекунд _delay_us(11); } } } Мигание светодиода будет происходить постоянно, пока подаётся питание. У меня используется пауза в 11 наносекунд, что даёт частоту примерно в 45-46 килогерц. С этим значением стоит поэкспериментировать оно зависит от типа ДУ-приёмника и сильно влияет на то, как хорошо сигнал будет ловиться через футболку.

Увы, для такого яркого (если так можно сказать про невидимый ИК-свет) свечения требуется достаточно большой ток, поэтому батарейки придётся прятать в карман. Достаточно двух AA батареек, но для полной надёжности лучше взять три или даже четыре.

Вот что получилось:

5aac7afa2b434044b9c71f12b6c99886.jpgcf56f0f53ef74b6391c261b1ba72212d.jpg

Если фотографировать себя в темноте и без вспышки, то можно увидеть как он просвечивает сквозь футболку:

870da5414d0643d9aaad5a894069e9fb.jpg

Человеческому глазу это, само собой, недоступно. Кстати, крепить метку оказалось гораздо удобнее на обычный пластырь.

Делаем сам визатор Итак, в визаторе у нас должны быть: Микроконтроллер, я взял ту же ATmega8A, но это опять же излишне ДУ-приёмник TSOP17xx Светодиод зелёный, для пацаков Светодиод оранжевый, для чатлан Кнопка включения Пьезодинамик, т.к. в фильме визатор издавал ещё и звук Плата получилась такой:

ab31fd41f24547bd902f9c93d8bf1de5.PNG

Алгоритм работы такой:

Пользователь нажимает кнопку, которая просто подаёт питание В течении половины секунды ждём сигнала от ДУ-приёмника Если сигнал был, зажигаем оранжевый светодиод, иначе зелёный В бесконечном цикле издаём соответствующий писк, пока питание не прекратится Соответственно код:

// Немного дефайнов #define LED_GREEN_ON PORTC |= (1<<2) #define LED_GREEN_OFF PORTC &= ~(1<<2) #define LED_ORANGE_ON PORTC |= (1<<1) #define LED_ORANGE_OFF PORTC &= ~(1<<1) #define SOUND_0 PORTD &= ~(1<<5) #define SOUND_1 PORTD |= (1<<5) #define SIGNAL (!(PINC&1))

int main (void) { // Вход для ДУ-приёмника DDRC &= ~1; // Подтяжка PORTC |= 1; // Светодиоды изначально выключены LED_GREEN_OFF; LED_ORANGE_OFF; // Светодиоды на вывод DDRC |= (1<<1) | (1<<2); // Пищалка на вывод DDRD |= (1<<5); // На всякий случай немного ждём, пока питание будет стабильным _delay_ms(50); int t; int chatlanin = 0; // 500 раз ждём по миллисекунде for (t = 0; t < 500; t++) { // Проверяем - есть ли сигнал на ДУ-приёмнике, если он есть, то это чатланин! if (SIGNAL) chatlanin = 1; _delay_ms(1); }

// Включаем соответствующий светодиод if (chatlanin) { LED_ORANGE_ON; } else { LED_GREEN_ON; }

// Бесконечно воспроизводим звук while (1) { // Высокий для чатлан if (chatlanin) { SOUND_1; _delay_ms (1); SOUND_0; _delay_ms (1); } // Пониже для пацаков else { SOUND_1; _delay_ms (7); SOUND_0; _delay_ms (7); } } } Плата визатора вместе с батарейкой получилась такой:

6cc1181c26e6485281d65464981d4afc.jpgПростите за грязь на плате, у меня сломалась ультразвуковая ванна.

Затем я быстренько набросал 3D модельку корпуса, чтобы напечатать его на 3D принтере. В этот момент я уже не особо старался, поэтому получилось весьма колхозно:

19a6b5e3b9c341b78c4d386f1ac2536e.jpg

Теперь можно разыгрывать друзей! Конечно, при условии, что они не читают Хабрахабр. Реакция обычно очень позитивная :) Видео с демонстрацией устройства в работе:

[embedded content]

© Habrahabr.ru