Пользователь
0,0
рейтинг
24 октября 2014 в 09:52

Система для «Своей игры» из песочницы



Привет, Хабр! Так получилось, что одним из моих увлечений являются интеллектуальные игры. Это «Что? Где? Когда?», «Своя игра», «Эрудит-квартет», «Брейн-ринг» и прочие. И вот, однажды мне захотелось сделать своими руками систему для этой игры. Если вам интересен процесс создания с нуля такого устройства — приглашаю под кат.

Предыстория


Коротко о правилах «Своей игры»:
Группа игроков (как правило, до 4-х человек) садится за игровые места. Объявляется тема, состоящая из пяти вопросов. Вопросы идут по возрастанию сложности и соответственно оцениваются — от 10 до 50 баллов. Ведущий объявляет номинал вопроса и начинает его зачитывать. В любой момент чтения вопроса игрок подает сигнал, после которого ведущий прекращает читать вопрос и начинает отсчет времени — подавшему сигнал игроку дается 3-5 секунд на ответ. В случае правильного и своевременного ответа, игрок получает количество баллов, равное номиналу вопроса. В ином случае у игрока отнимается это количество баллов (Итоговый счет может быть глубоко отрицательным).

Сигналом в этой игре может быть все что угодно — от хлопка в ладоши в простейшем случае, до нажатия кнопки специализированной системы для «Своей игры». Подавляющее большинство таких систем являются самодельными (не настолько интеллектуальные игры популярны, чтобы ставить это дело на поток). Кроме того, эти системы зачастую обладают различными недостатками.

Перечислю некоторые из недостатков в системах, с которыми мне приходилось иметь дело:
  • большие габариты;
  • работа только от сети 220В;
  • работа только в связке с компьютером (взаимодействие со специальным Windows-приложением);
  • некачественные, залипающие кнопки (например, от дверных звонков);

В нашем городе тренировки по интеллектуальным играм проходят каждую неделю, по воскресеньям. Причем, в зависимости от времени года и погоды, мы можем собраться в местном парке — это намного приятнее, чем коптиться в душном помещении. Из-за своих недостатков, имеющиеся в нашем распоряжении готовые системы было просто лень приносить из дому. Поэтому, зачастую приходилось играть «на хлопки». Точность определения первого, успевшего подать сигнал, оставляла желать лучшего. Часто бывало, что мнения присутствующих по этому поводу разделялись — казалось, что первым хлопнул тот, кто стоит к тебе ближе. Все эти факторы натолкнули меня на мысль о создании своей реализации игровой системы. Да и вообще, было интересно получить опыт создания устройства с нуля — от проекта до готового изделия.

Проект


Для начала, я решил определиться с основной концепцией устройства. Для себя отметил принципиальные пункты, которые должны быть реализованы в системе:
  • Удобные пульты с надежными кнопками и светодиодной индикацией (подтверждение игроку, что он первый нажал на кнопку);
  • Разъемное соединение пультов и устройства. Решено было сделать разъемы как на пультах, так и на самой системе. Был выбран разъем 4P4C (RJ11, обычно применяется в телефонных аппаратах). Такой выбор был сделан из-за небольших размеров и простоты ремонта кабеля — при наличии обжимного инструмента и коннекторов проблема решается в считанные минуты;
  • Два возможных источника питания — внешний и внутренний. Забегая вперед — именно в реализации схемы питания я совершил наибольшее число ошибок;
  • Система должна иметь разъем внутрисхемного программирования (ISP), чтобы можно было без лишних хлопот менять прошивку микроконтроллера;
  • Не должно быть привязки к любым другим устройствам (компьютер и т.п.);
  • Небольшие габариты.

В качестве «мозгов» устройства я выбрал чрезвычайно популярный у радиолюбителей микроконтроллер от Atmel — Atmega8. Хотя для функционала системы с головой хватило бы какого-нибудь Attiny, у него был фатальный недостаток — он не лежал у меня в столе. В отличие от вышеупомянутой Atmega.

Затем я на скорую руку набросал приблизительную принципиальную схему:



В качестве внешнего источника питания был выбран валявшийся без дела блок питания от старого модема — на выходе он имеет 12 В переменного напряжения. В роли внутреннего источника я выбрал батарейку типа «Крона» — ошибка №1. Для выработки необходимых для микроконтроллера 5 В я поставил линейный стабилизатор LM7805 — ошибка №2. О том, что это ошибки, я на практике узнал уже после сборки и тестирования устройства. Оказалось, что у «Кроны» весьма низкая емкость, да еще и почти половина ее уходила в никуда — на подогрев линейного стабилизатора. Однако, об этом позже.

Кнопки и разъемы, которые я выбрал для устройства, пришлось покупать на ebay — уж слишком высокие цены запрашивали местные торговцы. Правда, 10-миллиметровые светодиоды таки пришлось приобрести на радиорынке — ни на ebay, ни на aliexpress я не нашел индикаторных разноцветных светодиодов нужного диаметра.

Одним из важнейших и определяющих дальнейшее действие шагов был выбор корпуса. В своем городе ничего подходящего мне по качеству найти не удалось — пришлось воспользоваться торговыми площадками в Интернете. Устраивающий меня вариант нашелся в Киеве, там и были заказаны 5 корпусов — для основного блока и для пультов.

И вот, имея на руках все необходимые элементы, я стал продумывать дизайн устройства.

Печатные платы


Имея на руках корпуса, я приступил к разработке печатных плат. Вот, что у меня вышло:

Печатная плата основного блока

Печатная плата блока светодиодов

Печатная плата кнопки


Макеты печатных платы создавались в программе Sprint Layout, в конце будут ссылки на исходники. Используйте, модифицируйте — в общем, делайте с ними все что хотите.

Сами печатные платы я делал методом ЛУТ (лазерно-утюжная технология) — по моему скромному мнению, это наиболее простой и доступный простому смертному способ сделать печатную плату приемлемого качества.

Код


Тут, собственно, листинг программы микроконтроллера. Возможно, код не самый изящный, но он работает и свою функцию выполняет на ура.

Код программы на языке C
#define F_CPU 4000000UL

#define f 349
#define a 440
#define cH 523

#include <avr/io.h> // Ввод/вывод, все стандартно
#include <util/delay.h>	// Нам будут нужны временные задержки
#include <avr/interrupt.h> // Без прерываний тоже никуда

// Гасим засветившиеся светодиоды

void clear_led(void)
{
	PORTB = 0b00110000;
	PORTC = 0xFF;
}

int blink_led(int num)
{
	clear_led();
	_delay_ms(100);
	PORTB |= (1<<num);
	_delay_ms(100);
	clear_led();
	_delay_ms(100);
	PORTB |= (1<<num);
	_delay_ms(100);
	clear_led();
	_delay_ms(100);
	PORTB |= (1<<num);
	_delay_ms(100);
	clear_led();
	_delay_ms(100);
	PORTB |= (1<<num);
	_delay_ms(100);
	clear_led();
	_delay_ms(100);
	PORTB |= (1<<num);
	_delay_ms(100);
	return 0;
}

// Голос нашей программы, аргументы функции - длительность и тон соответственно

void song(void)
{
	_delay_ms(500);
	int T = 1000000/440;
	int k = 500000/T;
	int i = 0;
	int tempo = 1;
	while(i<k)
	{
		PORTD = 0b11111111; // 	Здесь мы делаем меандр: ставим высокий уровень на ножке
		_delay_us(T/2);		//	Ждем некоторое время
		PORTD = 0b01111111;	//	Ставим низкий уровень
		_delay_us(T/2);		//	Снова ждем. Вот и готова последовательность прямоугольных импульсов
		i++;
	}
	PORTB |= (1<<0);
	PORTB |= (1<<1);
	PORTB |= (1<<2);
	PORTB |= (1<<3);	
	PORTD = 0b01111111;
	_delay_ms(500/tempo);		// Завершить все же лучше тишиной :)


	T = 1000000/440;
	k = 500000/T;
	i = 0;
	while(i<k)
	{
		PORTD = 0b11111111; // 	Здесь мы делаем меандр: ставим высокий уровень на ножке
		_delay_us(T/2);		//	Ждем некоторое время
		PORTD = 0b01111111;	//	Ставим низкий уровень
		_delay_us(T/2);		//	Снова ждем. Вот и готова последовательность прямоугольных импульсов
		i++;
	}
	clear_led();	
	_delay_ms(500/tempo);		// Завершить все же лучше тишиной :)

	T = 1000000/440;
	k = 500000/T;
	i = 0;
	while(i<k)
	{
		PORTD = 0b11111111; // 	Здесь мы делаем меандр: ставим высокий уровень на ножке
		_delay_us(T/2);		//	Ждем некоторое время
		PORTD = 0b01111111;	//	Ставим низкий уровень
		_delay_us(T/2);		//	Снова ждем. Вот и готова последовательность прямоугольных импульсов
		i++;
	}
	PORTB |= (1<<0);
	PORTB |= (1<<1);
	PORTB |= (1<<2);
	PORTB |= (1<<3);	
	PORTD = 0b01111111;
	_delay_ms(500/tempo);		// Завершить все же лучше тишиной :)

	T = 1000000/349;
	k = 350000/T;
	i = 0;
	while(i<k)
	{
		PORTD = 0b11111111; // 	Здесь мы делаем меандр: ставим высокий уровень на ножке
		_delay_us(T/2);		//	Ждем некоторое время
		PORTD = 0b01111111;	//	Ставим низкий уровень
		_delay_us(T/2);		//	Снова ждем. Вот и готова последовательность прямоугольных импульсов
		i++;
	}
	PORTD = 0b01111111;
	_delay_ms(350/tempo);		// Завершить все же лучше тишиной :)

	T = 1000000/523;
	k = 150000/T;
	i = 0;
	while(i<k)
	{
		PORTD = 0b11111111; // 	Здесь мы делаем меандр: ставим высокий уровень на ножке
		_delay_us(T/2);		//	Ждем некоторое время
		PORTD = 0b01111111;	//	Ставим низкий уровень
		_delay_us(T/2);		//	Снова ждем. Вот и готова последовательность прямоугольных импульсов
		i++;
	}
	PORTD = 0b01111111;
	_delay_ms(150/tempo);		// Завершить все же лучше тишиной :)

	T = 1000000/440;
	k = 500000/T;
	i = 0;
	while(i<k)
	{
		PORTD = 0b11111111; // 	Здесь мы делаем меандр: ставим высокий уровень на ножке
		_delay_us(T/2);		//	Ждем некоторое время
		PORTD = 0b01111111;	//	Ставим низкий уровень
		_delay_us(T/2);		//	Снова ждем. Вот и готова последовательность прямоугольных импульсов
		i++;
	}
	PORTD = 0b01111111;
	_delay_ms(500/tempo);		// Завершить все же лучше тишиной :)

	T = 1000000/349;
	k = 350000/T;
	i = 0;
	while(i<k)
	{
		PORTD = 0b11111111; // 	Здесь мы делаем меандр: ставим высокий уровень на ножке
		_delay_us(T/2);		//	Ждем некоторое время
		PORTD = 0b01111111;	//	Ставим низкий уровень
		_delay_us(T/2);		//	Снова ждем. Вот и готова последовательность прямоугольных импульсов
		i++;
	}
	PORTD = 0b01111111;
	_delay_ms(350/tempo);		// Завершить все же лучше тишиной :)

	T = 1000000/523;
	k = 150000/T;
	i = 0;
	while(i<k)
	{
		PORTD = 0b11111111; // 	Здесь мы делаем меандр: ставим высокий уровень на ножке
		_delay_us(T/2);		//	Ждем некоторое время
		PORTD = 0b01111111;	//	Ставим низкий уровень
		_delay_us(T/2);		//	Снова ждем. Вот и готова последовательность прямоугольных импульсов
		i++;
	}
	PORTD = 0b01111111;
	_delay_ms(150/tempo);		// Завершить все же лучше тишиной :)

	T = 1000000/440;
	k = 1000000/T;
	i = 0;
	while(i<k)
	{
		PORTD = 0b11111111; // 	Здесь мы делаем меандр: ставим высокий уровень на ножке
		_delay_us(T/2);		//	Ждем некоторое время
		PORTD = 0b01111111;	//	Ставим низкий уровень
		_delay_us(T/2);		//	Снова ждем. Вот и готова последовательность прямоугольных импульсов
		i++;
	}
	PORTB |= (1<<0);
	PORTB |= (1<<1);
	PORTB |= (1<<2);
	PORTB |= (1<<3);	
	PORTD = 0b01111111;
	_delay_ms(1000);		// Завершить все же лучше тишиной :)
	clear_led();

} 

int beep(int k, int j) 		//функция бипа
{
	int i = 0;
	while(i<k)
	{
		PORTD = 0b11111111; // 	Здесь мы делаем меандр: ставим высокий уровень на ножке
		_delay_us(j);		//	Ждем некоторое время
		PORTD = 0b01111111;	//	Ставим низкий уровень
		_delay_us(j);		//	Снова ждем. Вот и готова последовательность прямоугольных импульсов
		i++;
	}
	PORTD = 0b01111111;		// Завершить все же лучше тишиной :)
	return 0;
} 

void reset_wait(void)
{
	short t = 0;

	while(t==0)
	{
		if(!(PIND & (1<<PIND4)))
		{
			_delay_ms(5);
			if(!(PIND & (1<<PIND4)))
			{
				t = 1;
				clear_scr();
				clear_led();
			}
		}
	}
}


int bond007(void)	//	Функция-шпион для отслеживания нажатия клавиш
{
	short i = 0;
	short p = 0;
	int t = 300;
	int tone = 100;

	while(i==0) 			//	Цикл отслеживания нажатия кнопок
	{ 						//	Открывающие скобки цикла отслеживания нажатий кнопок
		if(!(PIND & (1<<PIND0)) || !(PIND & (1<<PIND1)) || !(PIND & (1<<PIND2)) || !(PIND & (1<<PIND3)) || !(PIND & (1<<PIND6)))  
		//Если хотя бы одна из кнопок игроков нажата
		{ 					//	Открывающие скобки "Если хотя бы одна из кнопок игроков нажата"
			_delay_ms(5); 	//	Защита от дребезга
			if(!(PIND & (1<<PIND0))) 	//	Проверка нажатия кнопки игрока 1
			{ 					//	Открывающая скобка "Проверка нажатия кнопки игрока 1"
				p = beep(t, tone);	//	Пищим
				i=1; 				//	Флаг завершения цикла отслеживания нажатия кнопки
				clear_led();
				p = blink_led(0);
				reset_wait();
				i=0;
			} 				//	Закрывающая скобка "Проверка нажатия кнопки игрока 1"
			else
			{
				if(!(PIND & (1<<PIND1))) //Проверка нажатия кнопки игрока 2, остальное все аналогично
				{
					p = beep(t, tone);
					i=1;
					clear_led();
					p = blink_led(1);
					reset_wait();
					i=0;
				}
				else
				{
					if(!(PIND & (1<<PIND2))) //Проверка нажатия кнопки игрока 3
					{
						p = beep(t, tone);
						i=1;
						clear_led();
						p = blink_led(2);
						reset_wait();
						i=0;
					}
					else
					{
						if(!(PIND & (1<<PIND3))) //Проверка нажатия кнопки игрока 4
						{
							p = beep(t, tone);
							i=1;
							clear_led();
							p = blink_led(3);
							reset_wait();
							i=0;
						}
					}
				} 
			} 
		} 		//	Закрывающие скобки "Если хотя бы одна из кнопок игроков нажата"
	} 			//	Закрывающие скобки цикла отслеживания нажатий кнопок 
	return i;
}


int main(void) 			//	Главная функция
{  					//	Открывающие скобки главной функции
	DDRC = 0xFF; 	//	Порт С на выход
	PORTC = 0xFF; 	//	Подтягивающие резисторы вкл. на порт С
	DDRD = 0b10000000; 	//	порт Д на вход, кроме 8й ножки, она на выход у нас, пищалка там
	PORTD = 0b01111111; 	//	подтягивающие резисторы на весь порт Д, окромя 8го бита, ибо на нем динамик у нас.
	DDRB = 0xFF; 		//	Порт Б на выход
	PORTB = 0b00110000; 	//	Подтягивающие резисторы на 5 и 6 биты порта Б

	song();

	short i = 0;
	while(1) 			//	Вечный цикл памяти погибших на Клендату
	{ 				//	Открывающие скобки вечного цикла
		i = bond007();
	} 				//	Закрывающие скобки вечного цикла
	return 0;
}

Если вдруг случится, что кто-то откроет кат и посмотрит на код, у этого человека наверняка возникнет вопрос — что за ерунда занимает большую его часть. Дело в том, что мне захотелось внести в устройство какую-нибудь изюминку, и в качестве этой изюминки я выбрал приветствие при включении. Сразу после того, как первые электроны побегут по цепи, эта черная коробочка с разноцветными светодиодами и красной кнопкой начинает весело играть отрывок из всем известного «Имперского марша».

Вот как это выглядит:


Кроме самой мелодии, на этом коротком видео можно лицезреть пример работы системы: по нажатию кнопки загорается соответствующий светодиод на основном устройстве и индикатор. В таком состоянии система блокируется до нажатия ведущим красной кнопки сброса системы. Вот, собственно, и вся логика работы.

Ошибки в проекте


Как я уже писал выше, основные ошибки на этапе проектирования касались системы питания устройства. Ужасный КПД линейного стабилизатора, который буквально превращает в тепло «лишние» 4В при питании от «Кроны» — апофеоз энергонеэффективности. Да и сама «Крона» — далеко не лучший выбор. Этот элемент питания обладает малой емкостью (около 600 мА*ч), и его хватает очень ненадолго. С такой схемой питания система во время первого тестирования в боевых условиях проработала не больше часа. Меня это абсолютно не устраивало, поэтому пришлось переделывать эту часть схемы.

Незадолго до этого проекта я познакомился с литий-ионными аккумуляторами форм-фактора 18650. Они зарекомендовали себя с наилучшей стороны. Как минимум, даже у дешевых китайских аккумуляторов емкость в пересчете на единицу объема была значительно выше, чем у «Кроны».

Однако, с выбором этих элементов питания сразу появлялась другая проблема. Номинальное напряжение на таком аккумуляторе — 3.7 В. А этого недостаточно, чтобы запитать Atmega8. На помощь снова пришли ушлые китайцы — чтобы получить заветные 5 В я взял лежавший без дела повышающий преобразователь на LM2577. Вырвав с корнем злополучную LM7805 (оставшиеся в плате ножки можно будет увидеть на фото, размещенные дальше), я внедрил в систему питания аккуратную схемку, созданную трудолюбивыми жителями КНР.

Кроме того, на время тестирования этого варианта схемы я решил отказаться от возможности подключения внешнего источника питания. Полевые тесты прошли на ура — после многих часов эксплуатации не было никаких признаков разряда аккумулятора или просадки напряжения («Крона» просадки давала — видимо, не могла отдавать необходимый схеме ток). Я решил продолжать тесты до тех пор, пока мой доблестный noname 18650 не откажется запускать схему.

Кстати, в описании лота при покупке была заявлена емкость около 3700 мА*ч — очень самоуверенно даже для китайцев, учитывая стоимость одной банки в районе 3$. Но вышло так, что за несколько месяцев работы (что говорит еще и о низком саморазряде аккумуляторов) батарейка так и не села. Потому я сдался раньше и зарядил аккумулятор для безотказной работы устройства на одном важном мероприятии, о котором будет упомянуто позже.

Фотографии


Здесь привожу фото получившегося аппарата, в том числе и вид изнутри. Это для того, чтобы было видно, что все сделано по-честному — никакой неонки внутре там нет.















Итог


Система получилась работоспособная, выполняющая свою функцию на 100%. Помимо тренировок, она была протестирована на ЧУСИ-2013 (Чемпионат Украины по «Своей игре» 2013-го года), на котором ваш покорный слуга был одним из ведущих.

Это был замечательный опыт, который, как известно, сын ошибок трудных. В итоговой реализации устройство потеряло часть функций, которые задумывались изначально. Например, я отказался от возможности подключения внешнего блока питания — даже при активном использовании системы, посредственного аккумулятора хватает на многие месяцы.

Ниже прилагаю ссылки, по которым можно скачать макеты печатных плат (в формате .lay) и готовую прошивку для микроконтроллера. Буду рад, если кому-нибудь пригодятся мои наработки.

Печатная плата основной части;
Печатная плата блока светодиодов;
Печатная плата кнопки;
Прошивка.
@Serezha_zp
карма
2,0
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое

Комментарии (79)

  • +3
    Если вы использовали Li-ion аккумулятор 3,7 В, то зачем повышать напряжение до 5 В?
    Рабочая частота ATmega8 не превышала ведь 8 МГц. Только номиналы резисторов при светодиодах нужно уменьшить.
    • 0
      Подозреваю, что ТС просто планировал использовать от какого-то блока питания.
      • +1
        Верно, изначально предполагалось питание и от внешнего блока.
  • +4
    Имхо транзисторы на светодиодах лишние, т.к. атмега имеет достаточный выходной ток на пинах.
    • +1
      Зато, если что, можно их поменять и коммутировать что-то помощнее, какое-ниудь световое табло…
      • +1
        Поменять их хотя бы стоит на полевые — серии IRL от всемирных самогонщиков
      • +1
        Транзисторы поставил именно для запаса по мощности — была мысль сделать большие и заметные внешние светодиодные блоки для индикации.
    • +2
      Более того, резисторы идущие на базу имеют слишком маленький номинал, в итоге с МК идёт почти такой же ток, как и через светодиод, а общее потребление системы удваивается.
    • +1
      Подтягивающие резисторы тоже лишние, у контроллера свои есть. Светодиоды можно подключать без балластного резистора, при условии питания их импульсным током — об этом прямо заявлено в даташите на странице 51. Импульсное питание светодиодов сбережет энергию.

      Для сбережения энергии можно также усыплять контроллер на время ожидания нажатий на кнопки и поставить диоды Шоттки.
      • 0
        Спасибо, про импульсное питания светодиодов подумаю при проектировании следующей, универсальной системы.
      • 0
        Не нашел на 51 странице, что можно не ставить токоограничительные резисторы.
        Или вы про это?:
        The pin driver is strong enough to drive LED displays directly.

        я это понял так: у выхода достаточный ток для питания светодиода
        • 0
          LED дисплей — устройство, работающее в импульсном режиме. Нетрудно расчитать параметры импульсов так, чтобы средний ток через светодиод не превышал его законные 20ma. Светодиод портится от перегрева кристалла, на перегрев влияет только ток (напряжение на переходе — константа), так что если средний ток не превышать, то и перегрева не будет.
          • +1
            Про расчет импульсного режима я понимаю, хотя тут есть свои хитрости например частота импульсов — она должна зависеть от теплоемкости кристалла.
            Мне как раз было интересно почитать про это в даташите, вы говорите, что это есть на странице 51. Там есть только о том, что выход может питать LED, что и так очевидно, а про импульсный режим без резистора ничего не вижу.
          • +1
            >LED дисплей — устройство, работающее в импульсном режиме

            И вот это не совсем понял, разве LED дисплей — это не просто матрица LED? en.wikipedia.org/wiki/LED_display
            Из чего следует, что он в импульсном режиме должен работать?
            • 0
              Вот руководство от Атмел со всеми пояснениям терминов и рассчетами.
              • +1
                Эм? Это про LCD, а не LED.
                • 0
                  В руководстве написано, что Атмел понимает под Direct drive и матричным дисплеем. Без импульсного переключения строк и столбцов такой дисплей неинформативен.

                  Так как светодиодные дисплеи сильно разняться по характеристикам, вряд ли удастся найти аналогичный документ на них.

                  Тем не менее, идея для расчета параметров дана, параметры работы для светодиода в импульсном режиме надо искать в его даташите.
                  • +2
                    >В руководстве написано, что Атмел понимает под Direct drive

                    Да, там написано, что это управление дисплеем без специального промежуточного хардварного драйвера. И?

                    >Без импульсного переключения строк и столбцов такой дисплей неинформативен.
                    >Тем не менее, идея для расчета параметров дана

                    Импульсное переключение, о котором идет речь в этом даташите, нужно чтобы снизить деградацию LCD от электрофореза, из-за постоянного напряжения. К информативности дисплея это никакого отношения не имеет.

                    И там нет идеи для LED — там ничего нет про управление действующим током путем ШИМ.
                    А главное ничего нет про отсутствие резистора у светодиода, с чего и возник вопрос.
                  • +1
                    >параметры работы для светодиода в импульсном режиме надо искать в его даташите

                    Кстати и в даташитах светодиодов такого не встречал, вольт-амперная характеристика в даташите дается только в узком диапазоне, 5 вольт там и близко нет. Поэтому даже непонятно какой ток будет течь в пике и как это рассчитывать.
                    Кстати сжечь можно не только светодиод но и вывод у микросхемы, там тоже нужно как-то рассчитать выделенное тепло.
                    • 0
                      Расставляю точки над Ё — в заблуждение меня ввела схема:
                      Скрытый текст


                      Как видите, резисторов нет.
                      Однако в тексте и про резисторы написано, и фото платы с резисторами приводится: eldigi.ru/articles/termometr_na_attiny2313_ds18b20

                      Тем не менее, теория для питания светодиодов импульсами имеется www.electrosad.ru/Electronics/SPower.htm

                      И вопрос о питании светодиодов прямо от выводов AVR периодически всплывает:
                      electronics.stackexchange.com/questions/1342/is-it-ok-to-attach-an-led-directly-to-a-5v-attiny
                      www.avrfreaks.net/forum/5v-avr-lower-voltage-leds-without-resistors?page=1

                      В обсуждениях выделяется три стороны:
                      -Этого делать нельзя — сгорит и дисплей, и контроллер
                      -Это делать можно: www.swharden.com/blog/2014-02-27-directly-driving-7-segment-display-with-avr-io-pins/
                      -Нужны надежные расчеты и эксперименты. Я отнесу себя сюда.

                      • +1
                        Вот статья с подробностями: tinkerlog.com/2009/04/05/driving-an-led-with-or-without-a-resistor/
                        В конце вывод
                        After all this computing and datasheet staring I think it is safe to let out the current limiting resistor in some cases. You have to take a closer look at specs to get an idea on how it will work out.

                        После всех этих подсчетов и пристального чтения даташитов, я делаю вывод, что выбрасывание балластного резистора безопасно в некоторых случаях. Вам следует подробно изучить спецификации, чтобы получить представление о том, как это будет работать.
                        • 0
                          >Вот статья с подробностями: tinkerlog.com/2009/04/05/driving-an-led-with-or-without-a-resistor/

                          И он там пишет
                          Most of the times there is no voltage given for IF(peak), so we can not be sure at what voltage we will reach the 160 mA in the example. Looking at the graph, I would assume that you could go up to 3 V, maybe 3.2 V, but I haven’t tested it out.

                          То есть то же самое, о чем я писал выше — в даташитах не указывается вольт-амперметр характеристика за пределами рабочих значений. Поэтому непонятно как рассчитать ток на 5 вольтах.
                          Он попробовал на удачу и только на 3 вольтах (и он сам пишет, что при выше 3 вольт он скорее-всего бы превысил ток), у него заработало, — но это не метод для продакшена. Никто не дает гарантии, что вы не превысите макс импульсный ток на другом типе LED или том же типе, но из другой партии. Данных в даташите, чтобы это рассчитать нету, только на удачу.
                          • 0
                            А нет атм 5 вольт на счетодиодах, выходной тарнзистор драйвера порта контроллера не является идеальным, и он начинает играть роль этого резистора. И чем меньше напряжение питания тем выше номинал.
                            • 0
                              Из даташита при токе 20ма будет напряжение 4.2В, при более высоком токе график не нарисован.
                              • 0
                                Я предлагаю сменить вектор поиска с «выбросим долой резистор» на «сделаем такой драйвер для светодиода от пина контроллера, чтобы не обогревать атмосферу».
                                • 0
                                  Можно посчитать сколько там реально тепла выделяется.
                                  Пусть будет красный светодиод, 2.4В падение напряжения при 20мА.
                                  Пусть у микроконтроллера питание 5В. При токе 20мА напряжение на ноге будет 4.1В.
                                  Итого у нас на резисторе падает 1.7В при токе 20мА. Это всего 34 милливатта мощности. Я думаю этим можно пренебречь. Кроны из статьи хватит на неделю, чтобы непрерывно греть этот резистор.

                                  Кстати, если питать от 3 вольт, то резистор можно не ставить — на ноге будет всего 1,5 вольта при 20мА, это больше падения напряжения на светодиоде.
                                  • 0
                                    опечатка: это больше меньше падения напряжения на светодиоде
                      • 0
                        >И вопрос о питании светодиодов прямо от выводов AVR периодически всплывает:

                        По первой ссылке спрашивают «почему у меня сгорел микроконтроллер?» :)

                        >Это делать можно: www.swharden.com/blog/2014-02-27-directly-driving-7-segment-display-with-avr-io-pins/

                        А если точнее, то там пишут, что так делать нельзя и что если бы он делал для продакшена, то он бы так тоже делать не стал:
                        I don’t use current limiting resistors. I’m not making a consumer product. It works fine, especially multiplexed. Yeah I could use transistors and CLRs to drive the segments to have them bright and within current specifications, but I’m not building an airplane or designing a pacemaker, I’m making a test device at minimum cost!


                        Понятно, что в теории через ШИМ можно управлять действующим значением тока.
                        Но на практике даже у однотипных светодиодов есть разброс падения напряжения, которое еще зависит и от температуры воздуха.
                        Поэтому если импульсно питать, то параметры ШИМ надо будет подбирать под конкретный экземпляр светодиода, в чем нет практического смысла. Если стоит задача снизить потребление, то надо использовать 3,3 V схему, там выделяемая мощность на резисторе будет минимальной. Ну или добавлять отдельный драйвер для LED.
                      • 0
                        Резисторами становятся в таких случаях транзисторы выходного драйвера контроллера, у них имеется какое-то сопротивление которое не даёт бесконтрольно расти току.
                        Но блин, какие при этом на шине возникают импульсные токи! Помехи в эфир, помехи самим себе же…
                        • 0
                          Но этого сопротивления не хватит, чтобы при постоянном токе не сжечь светодиод и выходной транзистор. ШИМ все равно нужен, но тут проблема в его расчете, так как режим не стандартный и данных в даташите не достаточно для полного расчета.
                          Про помехи согласен, будет ад, в общем такой подход в проектировании не верный, надо драйвер ставить или резистор.
  • 0
    Будем очень рады также ссылкам на такие корпуса…
    А вообще неплохие кнопки KD-2 без фиксации — очень четкий клик…
    • 0
      Корпуса, которые я использовал для системы: BOX-FB04 и BOX-KA15. На тот момент они стоили 50.91 грн и 14.29 грн соответственно. Их можно найти и в других магазинах. Например, BOX-FB04 на мастерките
    • 0
      это же кастомизированный аналог корпуса интернета

      image
  • +3
    В целом, очень приятно видеть такую самоделку — на самостоятельно изготовленных платах, с самостоятельно разведенной схемой. Гораздо целостнее выглядит по сравнению с ардуиной и бредбордом в обувной коробке.

    Для работы над схемой и разводкой очень рекомендую интегрированный пакет, например KiCad.
    • 0
      Спасибо за рекомендацию, обязательно попробую этот пакет.
  • +3
    Начинающим электронщикам стоит выносить свои первые схемы устройств на любой радиотехнический форум, там сразу покажут ошибки и избыточность. А потом — готовое и отлаженное устройство можно и сюда ))
  • +5
    У нас в клубе (Рига) есть две системы от Друзя, стоят что-то порядка 150 евро.

    Из плюсов:
    — отдельный большой выносной индикатор ответа игрока (для каждой кнопки), очень зрелищно на соревнованиях
    — световой индикатор обратного отсчета, переключения режимов, тонкая настройка (от режима игры до громкости писка) и т.п.
    две нефикирующиеся кнопки на пульте управления (старт и сброс), что дает больше контроля за игрой ведущему. Например, в вашей схеме нет ключевого для Брейна и СИ понятия «фальстарт», если я правильно понял. Имхо, это единственная серьезная проблема вашей схемы.
    — очень, очень приятные металлические кнопки-концевики

    В вашей системе понравилось:
    — аккумулятор (это даже не «понравилось», а просто великолепно)
    — разъемы
    — большие диоды на коробке
    — аккумулятор (нет, это гениально)
    — марш
    — возможность перепрошивки

    Еще у нас в клубе есть «самопальная» система, завязанная на компьютер. Плюс использования ноутбука (сегодня он есть у каждого) — бесконечно гибкая настройка игроков и режимов. Система сделана на сетевом хабе, все включается через RJ45, поддерживается 8 (а теоретически — куда больше) кнопок. Но мне лично (я регулярно веду СИ) на ноуте неудобно. Две физические кнопки на блоке питания куда удобнее жать вслепую, да и мороки с сетапом поменьше, да и ноутбук, хоть и есть у каждого, не каждый хочет таскать.

    Еще вот для интереса прочих читающих, «полупромышленная» система за 23000 рублей (или 31000, если на 8 кнопок). Фактически, улучшенный клон системы Друзя, а цена — просто шок.

    Вообще, я давно хотел написать мобильный софт, чтобы использовать смартфоны как для ведущего, так и для игроков вместо кнопок. Если соединить все в ad hoc wi fi или по bluetooth, лагать не должно.

    • 0
      Игрокам стоит дать «конкретные» большие и тактильно отзывчивые кнопки, по которым не страшно лупить.
      Смартфон такому ТЗ увы не отвечает.
      • +1
        Вот такие, блютузные :)



        www.indiegogo.com/projects/bttn
        • 0
          Большой вопрос по времени отклика и синхронизации. Нужно < 10ms, иначе для игры они не подойдут.
          • 0
            Я протестировал связку Arduino + NRF24L01+, лаг не более 3мс.
            • 0
              Так этот модуль не является bloetooth-устройством — это обыкновенная радива.
              • 0
                Я не говорил, что это блютуз-устройство, разумеется :) Но и не совсем обыкновенная. Обыкновенная — это типа 433МГц, гараж открывать. А тут умная и надежная штука, многие хвалят. Вот доедет до меня мешок этих модулей, буду тестировать на конфликты при одновременной передаче данных, расскажу.

                Блютуз я тоже протестирую, кстати, спасибо за напоминание. Осложняет только мое неумение писать программы под телефон, а двух bt-модулей для Ардуино у меня нет. Впрочем, если с Андроида можно через терминал что-то послать… В общем, поглядим.
    • 0
      Не пугай людей. В самопальной системе только корпус от сетевого хаба, в внутре у него ардуина (и неонка).

      А в целом это классическая дилемма Универсальной Громоздкой Системы против Штуки, Которая Делает Только Одно, Зато Хорошо (Unix-way).

      П.С. Зато на самопальной был забавный мод для развлекательной чгк-афтер-парти- нажатие на кнопку засчитывается только тогда, когда участник орет ответ достаточно громко. Do not try this at home.
      • 0
        Я был уверен, что ты придешь и все разъяснишь. Про Ардуину не знал, думал, правда, все сетевое :)
    • +2
      Да, система Друзя — хорошая вещь. Но они, как Вы и сказали, стоят порядка 150 евро. Полная стоимость моей системы (без учета работы, конечно), на тот момент обошлась мне в 300-400 грн (около 30-40 евро на тот момент). Плюс, конечно, удовольствие от того, что это сделано собственными силами.

      Про режимы — эта система позиционировалась как система исключительно для «Своей игры» и «Эрудит-квартета», потому никаких других режимов у нее нет. У нас (Украина) «Своя игра» в 99% случаев играется без фальстартов, чемпионаты всех уровней (заканчивая чемпионатом Украины) играются по таким правилам.

      Но у меня давно уже зреет в голове план сделать универсальную систему. Чтобы в ней уже был и режим «Что? Где? Когда?» (у нас в городе ведущий до сих пор держит на столе позаимствованные у кого-нибудь из присутствующих наручные часы с секундной стрелкой), и режим «Брейн-ринга» (с фальстартами, случайной задержкой перед стартовым сигналов, подсчетом очков, etc.). Но также хочется, чтобы такая система по прежнему оставалась компактной (многие элементы, обеспечивающие дополнительную зрелищность, должны быть подключающимися внешне, но и без них система не должна терять функционал — для тех же игр на природе или в автобусе).

      Еще вот для интереса прочих читающих, «полупромышленная» система за 23000 рублей (или 31000, если на 8 кнопок).

      Действительно, шокирующая стоимость. Во многом из-за таких цен самоделки будут лидировать по количеству.
    • 0
      Лагать, к сожалению, будет. Средние кнопочники без труда выжимают 10мс, а то и меньше. Как вариант я думал использовать что-то вроде Precision Time Protocol для синхронизации отсчета, а потом сравнивать время, но готовой реализации под Android не было.
      • 0
        Согласен, даже есть устоявшаяся фраза — «выйти из десятки». Человеку, который не выходит из десятки, делать на кнопке, по-моему, нечего.
      • 0
        Я вот попробовал понажимать кнопку с помощью веб-теста:
        www.humanbenchmark.com/tests/reactiontime
        или вот faculty.washington.edu/chudler/java/redgreen.html

        Попробуйте сами, поделитесь результатом.

        Я как-то даже не представляю, как можно выжать 10мс. У меня получается около 240мс, я попросил еще нескольких игроков попробовать — у них порядка 180мс. Расскажите (это и к Serezha_zp просьба) подробнее, как именно можно «выжать 10мс» среднему (или даже хорошему) кнопочнику? Варианты «следите за лицом/пальцем ведущего» не предлагать.
        • 0
          Задумался над этим вопросом. Появилось предположение, что это «выйти из десятки» на самом деле является искаженным «выйти из десятых». Т.е. значения, меньшие 0.1 с (100 мс) — мне это кажется более правдоподобным. Сам я в кнопочники определенно не гожусь, по этим тестам у меня в среднем 200-220 мс :) В нашем городском клубе интеллектуальных игр есть люди с отличной реакцией (в частности, победитель прошлогодней «Суперкнопки» на МолЧУБР). Так вот у него средний результат действительно на порядок (двоичный) лучше, чем у среднестатистического человека. По крайней мере, «обжать» его получается только случайно, когда жмешь наугад на грани фальстарта.
          • 0
            В «меньше 100мс» я еще готов поверить (но хотел бы увидеть своими глазами). В общем, я тут потестировал радиоверсию своячной кнопки. По документам время передачи и подтверждения приема меньше 500 микросекунд, на практике в зашумленной десятком вайфаев квартире через толстую стенку получается 1-3мс задержка, т.к. требуется 4-5 «выстрелов», чтобы надежно пробиться до приемника. Это, впрочем, на случайном канале — менее или более шумный я не искал.

            На фоне реакции в 100-250мс задержка в 1-3мс (она еще и с большой вероятностью консистентна для всех кнопок) не представляет угрозы справедливой игре.

            Вот видео, если интересно

    • 0
      Вообще, я давно хотел написать мобильный софт, чтобы использовать смартфоны как для ведущего, так и для игроков вместо кнопок. Если соединить все в ad hoc wi fi или по bluetooth, лагать не должно.

      SIGram поищите в Google play
  • +3
    Где-то классе в 6-7 делал нечто подобное. Транзисторы видел только в журнале «В помощь радиолюбителю» (в мечтах собрать настоящую рацию), микроконтроллеров тогда ещё в помине не было, компьютеры типа «Агат» или «Электроника 60» стоили как автомобиль.
    Зато у меня был конструктор «Электротехника в 200 опытах»
    В общем, система была следующая: две катушки друг напротив друга, между ними свободно болтающийся якорь на ламельке, который коммутировал напряжение либо на одну лампочку, либо на другую. Катушки были подключены к обычным бытовым выключателям, разнесенным на противоположные столы, обычным сетевым проводом (продавщица в магазине очень удивилась, когда пацан 12 лет деловито выбирал провода и выключатели). Вот так организовал в классе «брейн ринг». Было ещё «поле чудес» с барабаном (картонным диском), который вращался от моторчика со скоростью вентилятора :)
  • 0
    Моя брейн-система состояла из 3-х реле и пищалки. Этого хватает для фиксации срабатывания и индикации фальстарта.
  • 0
    Вообще-то контроллер нормально может работать от 2.7В(на 1Мгц, что установлено по умолчанию на новом контроллере) так что повышать напряжение вобщем-то и не надо можно запитать напрямую от аккумулятора или через стабилизатор на 3.3В от 6В блока питания или 5-вольтовой телефонной зарядки(mini-USB). На вход внешнего питания подключить еще контроллер заряда литиевой батареи, тогда разбирать ничего не надо чтобы заряжать аккумулятор.
    Кстати, можно было использовать не 18650 а какой-нибудь телефонный — они плоские и удобны для помещения в такие корпуса.
    Светодиоды, правда, некоторые не смогут работать в полную яркость на посаженном аккумуляторе.

    Емкость для кроны в 600ма*ч — это только дорогущая энержайзер и т.п. а типичная емкость у кроны — 100ма*ч и 250ма*ч у более дорогих щелочных.
    • 0
      Спасибо, идея с зарядкой устройства без разборки мне нравится — внесу как обязательный пункт в ТЗ следующей системы

      Кстати, можно было использовать не 18650 а какой-нибудь телефонный
      Пока что места внутри с головой хватает и для 18650, да и соотношение емкость/цена на данный момент радует. Если встанет вопрос об еще большей миниатюризации — тогда буду думать в сторону телефонных аккумуляторов.

      типичная емкость у кроны — 100ма*ч и 250ма*ч у более дорогих щелочных
      Благодарю за пояснение. Действительно, не может у системы быть насколько больше потребление, чтобы 600 мА*ч хватило всего на один час.
  • 0
    А диод D1 что делает?
    • 0
      Диод D1 не пускает ток от батарейки к внешнему блоку питания.
      • 0
        Это уже делает диодный мост. D1 лишний.
        • 0
          Согласен, его можно было безболезненно исключить из схемы.
  • 0
    Вероятно, стоило бы сразу внести изменения в схему и предоставить окончательный вариант. Диод D1, кстати, не нужен — развязку даст диодный мост. Отсутствие индикации фальстарта — фатальный недостаток.
    • 0
      Про фальстарты писал выше. Повторюсь:
      Про режимы — эта система позиционировалась как система исключительно для «Своей игры» и «Эрудит-квартета», потому никаких других режимов у нее нет. У нас (Украина) «Своя игра» в 99% случаев играется без фальстартов, чемпионаты всех уровней (заканчивая чемпионатом Украины) играются по таким правилам.

      По поводу окончательного варианта схемы — согласен. Все модификации, сделанные после первого варианта (который и изображен на принципиальной схеме), не документировались, так как по сути являлись довольно простыми, не вносившими принципиальных изменений в схемотехнику. Так получилось, что на этом варианте системы я получил какой-то опыт, в некоторых местах «набил шишки». Надеюсь, это поможет избежать их в следующих проектах.
  • 0
    Вот, для олдфагов:
    Брейн-система на реле
    image
    Схема состоит из пары реле типа РЭС-10, двух кнопок, тумблера, и 3 лампочек. Фальстарт индицируется по краткому срабатыванию лампочки (можно параллельно ей электролит впихнуть для заметности). Извините, несколько кондово, но придумывалась лет так 16 назад. И да, вспоминал навскидку, возможно что напутал.

  • 0
    Дилетантский и «оффтопичный» вопрос: а почему-бы не реализовать такую систему чисто программно, на смартфонах + сетевом сервисе (локальном или облачном)? Понятно, что для электронщика не тот fun, зато вышло бы быстро и совсем дешево.
    • +1
      Встречный вопрос — а зачем?
    • +1
      Как программисту мне эта идея пришла сразу, но требования к задержке очень высокие (как уже писал выше — она просто обязана быть меньше 10мс, а лучше около 1мс.). Такой точности, в принципе, можно достичь, но проблема в том что она непредсказуема (нельзя угадать какой был лаг на момент нажатия). Как вариант — можно было бы синхронизировать часы по GPS, но GPS есть далеко не во всех телефонах (в среде гиков их, конечно, большинство, но в нашем клубе их не так уж много). Плюс тактильные ощущения от кнопки тоже важны. В общем, идея не лишена смысла, но ИМХО, физические кнопки на данный момент выходят практичнее :)
      • 0
        она просто обязана быть меньше 10мс, а лучше около 1мс

        Да, сурово это у вас :) Я далек от «интеллектуальных игр» (если не считать разработку software игрой), только один раз в жизни играл в «Что, где, когда?» в NYC (правда, в одной команде с бывшим чемпионом СССР по «Брейн-рингу»)
        С такими requirements программные решения на смартфонах отпадают однозначно.
        • 0
          Лобовые решения отпадают, да… проблему точной синхронизации времени у клиентов человечество вообще-то решило(нет, не GPS а технология проще и вообще до GPS-ной эры) и даже не нужно изобретать. Есть такая штука как NTP. необходимости в точном времени нет, поэтому можно реализовать протокол для закрытых внутресетевых часов, и если сама сеть позволяет(нет огромных потерь пакетов и стабильная задержка) то синхронизировать время на клиентах относительно опорного можно с точностью до 1мс.
      • +1
        Я думаю, GPS не нужен, достаточно локального NTP-подобного сервера точного времени, там алгоритмы синхронизации отработаны с учетом задержки сигнала до сервера и обратно. Но вот… клиент тогда должен быть черным ящиком и защищен от подмены сигналов игроком. А что если у игрока будет патченый клиент который выдаёт время нажатия на +100мс раньше?
        • 0
          Тут еще вопрос с точностью часов на клиенте, выставить-то выставим, а куда они потом убегут — не ясно.
          Остается только регулярно слать udp пакеты с серийным номером и состоянием кнопки, а на сервере уже время считать, с шагом 10ms.
          Хотя это все автоматически начинает зависеть от чистоты эфира — много работающих устройств (а их будет много, на таком-то сборище) и плакали идеальные 1.5ms вайфаевского пинга.
          • 0
            за одну секунду они не успеют убежать. Да и сколько там, даже за минуту отклонение будет небольшое — типичная точность бытовых часов — 30 секунд в месяц, это даёт точность хода 1 секунды в сутки или 0.1мс ухода за одну секунду.
            тем более что скорость ухода можно зафиксировать программно и компенсировать его если недостаточно будет принудительной ежесекундной синхронизации(на самом деле даже интервала в 10 сек хватит).
            Но… даже и этих извращений не нужно — пусть клиенты постоянно передают на сервер текущее время по команде с сервера(это даст общую точку отсчета), дополнительно к этому времени сервер будет знать величину задержки с каждого клиента, которую может сам же и компенсировать.
    • 0
  • 0
    Отличная работа. Очень нравится Ваш подход как к разработке так и к наполнению статьи. Так держать, товарищ! =)
    • 0
      Спасибо, приятно, что оценили.
  • –1
    Кнопки надо беспроводные.
  • +1
    Начал проектировать свой велосипед свою систему, зашел посмотреть на код. Насколько я вижу, все нажатия, произошедшие с разницей менее 5 мсек, считаются «одновременными», т.е. подают сигнал. А дальше приоритет у той кнопки, условие которой проверяется первым. Т.е. теоретически игрок, сидящий на кнопке с меньшим номером, имеет фору в пять миллисекунд. Обогнал его на 6 мс? Ок. Обогнал только на 4? Сработает все равно его кнопка.

    Это кажется несправедливым, хоть и маловероятным.
    • 0
      Это банальная защита от дребезга контактов. Исходный код открыт, в своем устройстве можете можете убрать это, но я бы не рекомендовал :)
  • 0
    Внезапно увидел статью перенесенной на Geektimes O_o. Но ведь программирование микроконтроллеров, код на C и прочее… Странное решение, в общем.
    • 0
      Потому что конкретная конструкция воплощенная в железе. Малейший признак DIY — место теперь на гиктаймсе…

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.