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

    Досить важко знайти людину, яка не дивилася б чудовий радянський фільм «Кін-Дза-Дза!»
Думаю, що у багатьох було бажання зібрати візатор — прилад, який дозволяє відрізняти чатлан ​​від пацаки.
 
 
 
Зараз я розповім, як можна зібрати це чудовий пристрій. Жартівне, звичайно ж :)
 
Немає нічого складного в миганні світлодіодами та писку пьезодінаміком. Найцікавіше і складне в цьому завданні — отримувати завжди один і той же результат для кожної людини. В голові було перебрано багато ідей, але в результаті було вирішено, що людей треба все-таки якось мітити. Само собою, в першу чергу так помітити треба себе, щоб гордо бути чатланин, перед яким повинні робити «Ку!»
 
 image
 
Однак, така мітка повинна бути невидима для оточуючих. Рішення прийшло досить швидко. Я взяв пульт від телевізора і переконався, що він відмінно пробиває крізь футболку. Так було вирішено використовувати в візаторе ДУ-приймач типу TSOP17xx, а під футболку ховати маленьку плату з інфрачервоним світлодіодом, який відповідно повинен блимати аналогічно тому, як блимають світлодіоди в пультах ДУ.
 
 

Робимо «мітку»

Я швидко накидав плату такий мітки:
 
 
 
У центрі мікроконтролер 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 батарейок, але для повної надійності краще взяти три або навіть чотири.
 
Ось що вийшло:
 
 
 
 
Якщо фотографувати себе в темряві і без спалаху, то можна побачити як він просвічує крізь футболку:
 
 
 
Людському оку це, само собою, недоступно. До речі, кріпити мітку виявилося набагато зручніше на звичайний пластир.
 
 

Робимо сам візатор

Отже, в візаторе у нас мають бути:
 
     
  • Мікроконтролер, я взяв ту ж ATmega8A, але це знову ж надміру
  •  
  • ДУ-приймач TSOP17xx
  •  
  • Світлодіод зелений, для пацаки
  •  
  • Світлодіод помаранчевий, для чатлан ​​
  •  
  • Кнопка включення
  •  
  • Пьезодінамік, т.к. у фільмі візатор видавав ще й звук
  •  
 
Плата вийшла такою:
 
 
 
Алгоритм роботи такої:
 
     
  1. Користувач натискає кнопку, яка просто подає живлення
  2.  
  3. У перебігу половини секунди чекаємо сигналу від ДУ-приймача
  4.  
  5. Якщо сигнал був, запалюємо помаранчевий світлодіод, інакше зелений
  6.  
  7. У нескінченному циклі видаємо відповідний писк, поки харчування не припиниться
  8.  
 
Відповідно код:
 
// Немного дефайнов
#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);
		}
	}
}

 
Плата візатора разом з батарейкою вийшла такою:
 
 
Пробачте за бруд на платі, у мене зламалася ультразвукова ванна.
 
Потім я швиденько накидав 3D модельку корпусу, щоб надрукувати його на 3D принтері. У цей момент я вже не особливо старався, тому вийшло вельми колгоспно:
 
 
 
Тепер можна розігрувати друзів! Звичайно, за умови, що вони не читають Хабрахабр. Реакція зазвичай дуже позитивна :) Відео з демонстрацією пристрої в роботі:
 
     
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.