Skip to main content

Светодиодная сосулька на микроконтроллере: ATtiny13 и 20 светодиодов

  • Теоретическое отступление.

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

Вывод микроконтроллера может находится в трех состояниях: вход, выход с лог. 0 и выход с лог. 1. Вот как раз режим входа без подтяжки (высокоимпедансное состояние) и позволяет подключить к каждой паре выводов по два встречно-параллельно включенных светодиода. Фактически, вывод переведенный в Z-состояние ведет себя как не подключенный к схеме, и никакого влияния на нее не оказывает. Такое подключение получило название "Чарлиплексинг", по имени ее создателя  Чарли Аллена. Впрочем, этим методом пользовались и ранее.

На упрощенной схеме показана суть работы:

Рис. 1 Чарлиплексинг

При таком подключении возможное количество светодиодов рассчитывается по простой формуле: K = N * (N-1), где N - количество выводов.


  • Практическая часть.

С теорией разобрались, самое время применить эти знания на практике. У контроллера ATtiny13 восемь выводов. Из них два - питание, и еще один - RESET. Значит, под нашу затею остается 5 выводов. Считаем количество подключаемых светодиодов по уже известной формуле:

количество светодиодов = 5 * (5-1) = 20

Мы можем подключить 20 светодиодов, что довольно неплохо, но хотелось бы еще использовать кнопку для переключения эффектов. Но если мы выделим отдельный пин для кнопки, то количество светодиодов сразу сократится до 12 (4 * (4-1)), что слишком расточительно. Потому немного схитрим, и подключим кнопку к выводу RESET.

Да, вывод RESET можно сделать обычным пином порта, но тогда микроконтроллер станет недоступен для последовательного ISP программирования, что очень неудобно, параллельный программатор есть далеко не у всех. Да и ситуация когда микросхема выпаивается из платы каждый раз когда нужно ее прошить а потом запаивается для проверки обратно, довольно нелепа. Потому кнопку мы подключим, но RESET отключать не будем. Но тогда ведь МК просто будет перезагружаться при каждом нажатии кнопки? Разумеется, но при этом еще и будут переключаться программы. Как? Об этом чуть ниже.

А пока рисуем схему:

Схема проста до безобразия, между каждой парой выводов подключены встречно-параллельно светодиоды. Например, для того чтобы зажечь светодиод HL14 необходимо сконфигурировать выводы PB1 и PB0 как выходы (а все остальные как входы) и подать на вывод PB1 лог. 1 а на вывод PB0 лог. 0.

//**********************[ПОДКЛЮЧАЕМЫЕ ФАЙЛЫ]*************************************

#include <avr/io.h>			// работа с AVR
#include <avr/pgmspace.h>		// работа с FLASH памятью

//*************************[ОПРЕДЕЛЕНИЯ]*****************************************

#define DDR_LED  DDRB			// порт светодиодов
#define PORT_LED PORTB

//********************[ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ]************************************

const uint8_t ddr_config[] PROGMEM =		// конфигурация выходов для каждой пары светодиодов (10)
{
	((1 << 0) | (1 << 4)),			// 1  2
	((1 << 0) | (1 << 3)),			// 3  4
	((1 << 3) | (1 << 4)),			// 5  6
	((1 << 1) | (1 << 3)),			// 7  8
	((1 << 2) | (1 << 0)),			// 9  10
	((1 << 2) | (1 << 1)),			// 11 12
	((1 << 1) | (1 << 0)),			// 13 14
	((1 << 1) | (1 << 4)),			// 15 16
	((1 << 2) | (1 << 3)),			// 17 18
	((1 << 2) | (1 << 4))			// 19 20
};

const uint8_t port_config[] PROGMEM =		// непосредственное включение каждого светодиода (20)
{
	(1 << 4),				// 1
	(1 << 0),				// 2
	
	(1 << 3),				// 3
	(1 << 0),				// 4
	
	(1 << 4),				// 5
	(1 << 3),				// 6
	
	(1 << 3),				// 7
	(1 << 1),				// 8
	
	(1 << 0),				// 9
	(1 << 2),				// 10
	
	(1 << 1),				// 11
	(1 << 2),				// 12
	
	(1 << 0),				// 13
	(1 << 1),				// 14
	
	(1 << 4),				// 15
	(1 << 1),				// 16	
	
	(1 << 3),				// 17
	(1 << 2),				// 18
	
	(1 << 4),				// 19
	(1 << 2),				// 20
};

//****************************[ОСНОВНОЙ ЦИКЛ]*************************************

int main(void)
{
    DDR_LED = pgm_read_byte(&ddr_config[6]);	  // выбор соответствующей пары светодиодов
    PORT_LED = pgm_read_byte(&port_config[13]);   // включение светодиода

    while (1)
    {

    }  
}

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

С остальными флагами разберемся в другой раз, а сейчас нас интересует бит EXTRF - External Reset Flag. Этот бит выставляется в 1 в том случае, если причиной перезагрузки был низкий уровень на выводе RESET. Отлично, это нам и нужно. При каждом запуске будем проверять этот бит, и если он выставился в 1, то значит была нажата кнопка, и можно менять скорость/режимы.

if (MCUSR & (1 << EXTRF))					// если сброс был вызван нажатием на кнопку
	{
		if (++speed > MAX_SPD)				// если скорость дошла до максимальной
		{
			speed = 0;				        // сброс скорости
			if (++mode > MAX_EFF) mode = 0; // увеличиваем номер эффекта, и проверяем на корректность
		}
		
		eeprom_write_byte(&EE_mode, mode);	 // запись в EEPROM
		eeprom_write_byte(&EE_speed, speed);
		
		MCUSR &= ~(1 << EXTRF);				 // сброс флага сброса :-)
	}

Всего режимов работы пять (каждый режим имеет три скорости):

  1. Метеор (бегущий светодиод с затухающим шлейфом).
  2. Заполнение и растворение.
  3. Бегущий огонь.
  4. Бегущая тень.
  5. Мерцающие звезды.

Схема есть, плата готова, остается собрать этот конструктор и проверить в работе.


Видео

Фьюзы

В заводских фьюзах необходимо лишь отключить деление тактовой частоты на 8 (CKDIV8).

High Fuse: 0xFF
Low Fuse: 0x7A


Загрузки
Значок
Светодиодная сосулька на ATtiny13

Схема, плата (DipTrace), прошивка, исходный код.

26 комментарии в “Светодиодная сосулька на микроконтроллере: ATtiny13 и 20 светодиодов”

  1. Здравствуйте. Подскажите пожалуйста, как в этой схеме запитать светодиоды от другого источника питания? например 12В, на этой схеме как понимаю питание идет напрямую от тюньки, но не могу сообразить как запитать от другого ИП.. пробовал ставить транзистор, но что-то не работает

    1. Здравствуйте, Евгений. Увы, скорее всего - никак. Вся суть данной схемы и заключается в том, что светодиоды подключены между выводами МК. Тот же транзистор может быть либо открыт, либо закрыт. Его нельзя перевести в Z-состояние, а на этом как раз и построена вся работа. Для Вашей задачи гораздо логичнее использовать ту же ATmega8A, у нее 22 свободных вывода. Поставить транзисторные сборки, написать программный BAM для управления яркостью и пошагали. И места у нее полно, можно эффектов навертеть кучу. Пишите, если будут вопросы. Можете напрямую на почту - public@enabledevice.ru.

  2. Здравствуйте. Подскажите пожалуйста, фьюзы ставить прямые или инверсные.

    1. Здравствуйте. Фьюзы указаны в явном виде (шестнадцатеричном), и не имеет значения, чем они выставляются. Главное, чтобы у программы была возможность их в таком виде указывать. Но на самом деле все гораздо проще. Если МК новый, то Вам нужно лишь изменить состояние одного фьюза (CKDIV8) на противоположное. ТОЛЬКО ОБЯЗАТЕЛЬНО СЧИТАЙТЕ ФЬЮЗЫ, ПЕРЕД ТЕМ КАК МЕНЯТЬ ИХ И ЗАЛИВАТЬ ОБРАТНО.

      1. Спасибо, Классная гирлянда получилась. У меня еще один вопрос, можно ли в сосульке параллельно ставить по два светодиода?

  3. Огромное спасибо! Давно искал!
    За подробные пояснения к коду,принципу работы, отдельная благодарность!

  4. добрый вечер а можете прислать файл прошивки через ардуино. но в формате ino.

    1. Здравствуйте. Код писался в Atmel Studio на чистом Си. Да и вроде ардуин с Attiny13 не существует. 🙂

  5. Здравствуйте.подскажите не могу компилировать в hex ваш файл main хочу выставить разное время #define DELAY_ON 0 // пауза запуска сосульки (для того чтобы они не стартовали одновременно)

  6. Добрый день. А можно взглянуть на полный исходник? Если ДА - пишите на почту. Заранее спасибо!

    1. Здравствуйте, Александр. Полный исходник можно скачать в конце статьи.

    1. Здравствуйте. Печатная плата делалась в программе DipTrace, ее и можно скачать в конце статьи. В спринте такого нет.

      1. спс. я не силен в компонента, можно описать какие нужно спросить в магазине?

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

          1. всё как бы бегают но не которые мигают повторно. тоесть, с первой по последнюю добегают и допустим третья и четвертая еще раз мигают и пабежали поновой и сново так же. в чем может быть причина?

          2. У меня была похожая ситуация, когда с основными светодиодами еще светили в пол-накала лишние. И дело было именно в светодиодах, целая партия оказалась элементарной отбраковкой (что бывает у наших маленьких китайских друзей), а это больше тысячи штук. При обычном подключении они вполне сносно работали, а вот в такой схеме засвечивали элементарной утечкой через себя другие. Пришлось отбирать из этой кучи нормально работающие...

  7. Отличная работа. Случайно наткнулся в инете, но это как раз то что мне надо. Сможете помочь мне советом? Делаю свой проект, но пока многого не понимаю.Если ДА, напишите в личку, пожалуйста.

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

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