Вдохновленный статьей про светодиоды на снегу , захотелось попробовать сделать что-то подобное дома.
В комментариях к той статье я разместил идеи и небольшую кучу фотографий.
Несмотря на то, что снега сейчас в Подмосковье не хватает, энтузиазма это не уменьшило; скорее, наоборот, реализовать идею как можно скорее, пока еще лежит снег.
Первой попыткой была лампочка со статически светящимся светодиодом, но чуть позже была доделана плата с небольшим кусочком динамика.
Как это работает и как сделать нечто подобное – смотрите под катом.
P.S. «Готовность» материалов, скорее всего, распространяется на радиолюбителей.
Как это все началось
Для начала нам понадобится:- Прозрачный конус из-под бахил (можно приобрести в ближайшей поликлинике)
- Держатель для батарейки CR2032 (они разные, нам нужен с зажимом сбоку)
- RGB светодиод (я использовал планарный, размер 5050, диффузный)
- Несколько резисторов (тоже планарных, 100 Ом - будем питать от 3В - батарейки)
- Кусок стекловолокна с медной фольгой
- Медный купорос или хлорное железо (или то, чем вы привыкли травить платы)
Плата рисуется легко (даже не запускал принтер, достал маркер для рисования на компакт-дисках и быстро зарисовал, после чего сразу бросил в травильный раствор, сфотографировать не успел ).
Вот как выглядит чертеж платы:
После травления плату следует вырезать по форме держателя батареи (проще всего это сделать, предварительно просверлив отверстия и вставив держатель сзади, затем обвести держатель маркером.
ВНИМАНИЕ! Полярность имеет значение! Следите за положением «ушка» держателя!) и припаяйте светодиод, резисторы и держатель.
Вот что из этого получается:
Один резистор на плате намеренно не припаян, хотелось получить фиолетовое свечение, для этого нужно включить красный и синий каналы, отключив зеленый.
Так получится самый простой светильник.
Покрываем плату лаком (на самом деле это не обязательно, но так дорожки меньше потемнеют), вставляем батарейку, упаковываем в колбу и идем лепить снежки!
И тут Остап пострадал
Как программист, питающий слабость к любой микроконтроллерной технике, я решил адаптировать к этой штуке небольшую микросхему, которая приносила бы немного больше радости, заставляя светодиод красиво переливаться разными цветами.Для этого я взял широко известный в узких кругах контроллер Atmel ATtiny45 (хотел ATtiny13, но неожиданно их не оказалось в коробке, разница только в объёме памяти.
Программа для этого света поместится в ATtiny13).
), нарисовал плату в Eagle и с помощью лазерно-утюжной технологии перенес полученный рисунок на фольгированную печатную плату.
По сравнению с предыдущей версией на плате появился конденсатор для более стабильного питания и сам микроконтроллер.
Что касается компонентов, то придется обойтись небольшими затратами, поскольку место на плате ограничено.
Я даже не предусмотрел разъем для программирования; К пинам припаял провода (специально для этого каналы светодиодов были на пинах программирования, а RESET вынес на отдельную площадку).
Резисторы и конденсаторы на этой плате имеют размер 0805. Пока платы травились, я начал работать над программой.
В ATtiny45 аппаратный вывод ШИМ-сигнала поддерживается на выводах PB0, PB1 и некоторых других.
PB2 не было в этом списке.
Но плата уже нарисована и вытравлена, поэтому я решил сделать программный ШИМ с использованием второго таймера (Timer1).
Для того, чтобы сделать лампу более гибкой в настройке, я использовал такой механизм.
Чип содержит ПЗУ (EEPROM).
В первой ячейке мы будем хранить число, обозначающее режим работы.
После каждого включения будем увеличивать это значение на 1 и сохранять в ПЗУ.
Так, выдернув аккумулятор в разъеме, можно переключать режимы работы.
Чтобы не пропустить нужный, я продублировал каждый режим (фактически следующий режим включается после двух выдержек батареи).
Весь код на C (для компилятора AVR-GCC)
Электрическая схема и разводка печатной платы (из Eagle CAD)#include <avr/io.h> #include <avr/eeprom.h> #include <util/delay.h> #include <avr/interrupt.h> #define r_pwm(pwm) OCR0A = pwm #define b_pwm(pwm) OCR0B = pwm #define g_pwm(pwm) OCR1A = pwm #define NUM_MODES 16 int main(void) { /* Init LED GPIO pins */ DDRB = 7; /* pins 0, 1, 2 */ /* Init PWM timers */ /* Timer0 is for R and G channels */ TCCR0A = (1<<COM0A1)|(1<<COM0B1)|(WGM01)|(WGM00); TCCR0B = (1<<CS00); /* divide by 1 */ /* Timer 1 is for B channel; enable interrupts */ TIMSK = (1<<OCIE1A)|(1<<TOIE1); TCCR1 = (1<<CS10); /* divide by 1 */ sei(); /* Get mode value from the EEPROM and update it */ uint8_t mode = eeprom_read_byte((uint8_t *) 1); mode++; if (mode >= NUM_MODES) mode = 0; eeprom_write_byte((uint8_t *) 1, mode); uint8_t i; while(1) { switch(mode >> 1) { case 0: r_pwm(255); break; case 1: g_pwm(255); break; case 2: b_pwm(255); break; case 3: r_pwm(255); g_pwm(255); break; case 4: g_pwm(255); b_pwm(255); break; case 5: r_pwm(255); b_pwm(255); break; case 6: r_pwm(255); g_pwm(255); b_pwm(255); break; case 7: for (i=0; i < 255; i++) { r_pwm(255-i); g_pwm(i); _delay_ms(20); } for (i=0; i < 255; i++) { g_pwm(255-i); b_pwm(i); _delay_ms(20); } for (i=0; i < 255; i++) { b_pwm(255-i); r_pwm(i); _delay_ms(20); } } } return 0; } ISR(TIM1_OVF_vect) { if (OCR1A != 0) PORTB |= (1<<2); } ISR(TIM1_COMPA_vect) { PORTB &= ~(1<<2); }
Биты предохранителей можно посчитать Здесь , я посчитал, что 1 МГц мне будет достаточно для комфортного ШИМ и низкого энергопотребления.
В общем, фьюз-биты оказались стандартными для tiny45, поэтому менять их не нужно.
Мне не терпелось побыстрее опробовать новую поделку на практике, поэтому я наспех обрызгал ее лаком из баллончика и дал полежать под лампой минут 5, взял и выбежал на улицу с фотоаппаратом (он уже был довольно поздний вечер, как раз подходящие условия для тестирования).
И вот результат (видео ничем не отличается от вставленного выше для привлечения внимания):
Снежки совершенно не хотели образовываться, и все же я разогрела в руках горсть снега и все получилось!
В равной степени важно
Огромное спасибо товарищу за идею.Кидар .
Все материалы по этому проекту я разместил в Дропбокс .
Когда будет время, подготовлю отдельный make-файл, а теперь после распаковки: make antares && make build, после чего загружаете файл images/antares.hex на чип удобным для вас способом.
Спасибо за внимание! УПД: Обновлены архивы с исходными файлами; Сейчас к печатной плате прилагается PDF-файл для самостоятельной печати, а в архиве с программой есть hex-файл с готовой прошивкой.
Теги: #Сделай сам или Сделай сам #RGB #light #attiny #attiny13 #snow #LED #ATtiny45 #светящийся снег
-
Почему Я Не Верю В 3D Карты
19 Oct, 24 -
Поддержка Sap Hana: Новые Возможности
19 Oct, 24 -
Usb-Убийца
19 Oct, 24