Ещё одна мигалка светодиодами.

Обнаружилась там вот такая лампа:

В итоге было решено соорудить т.н. «лампу настроения» — небольшой светильник, переливающийся разными цветами. С питанием от компьютера (в итоге получилось, что это не обязательно).
Из ящика было выужено:
ATMega8A
3 SMD СИДа красного, зелёного и синего цветов
Кусок двустороннего текстолита(за неимением другого подходящего размера)
Старый USB кабель с одним «живым» концом
Резисторы-конденсаторы и сопутствующая мелочёвка
Так как контроллер довольно «жирный» для такой простой задачи, решил заодно добавить возможность заливать прошивку в контроллер через USB с помощью BootloadHID. Потом, немного подумав, добавил возможность управлять некоторыми настройками лампы с компьютера через специально написанную для этого программу. Т.о. вся сисьтема работает на V-USB + управляющая программа, созданная по примеру, описанному тут.
В финальной версии лампа получилась двухрежимная: собственно режим «лампы настроения» и режим «недосветильника», когда лампа светится одним определённым светом. Планировался ещё режим «моргание-в-такт-музыке-проигрываемой-на-компе», но уже не успел.(
Светодиоды управляются ШИМом на три канала. Основной цикл программы выглядит так:
for(;;)
{
//Проверка нажатия на кнопку сброса режима
if ((PINC & (1 << PC5)) == 0 && mode != _RANDOM_MODE)
{
mode = _RANDOM_MODE;
writeEEPROM(MODE_ADDR, mode);
}
switch (mode)
{
case _RANDOM_MODE:
//выбор следующего "цвета"
new_r = random();
if (new_r < 100) new_r = 0;
new_g = random();
if (new_g < 100) new_g = 0;
if (new_r + new_g > 255) new_g = 255 - new_r;
new_b = 255 - new_r - new_g;
//цикл перехода к выбранному "цвету"
while (r!= new_r || g!=new_g || b!=new_b)
{
if (r!=new_r) r+= (new_r < r ? -1: 1);
if (g!=new_g) g+= (new_g < g ? -1: 1);
if (b!=new_b) b+= (new_b < b ? -1: 1);
RED_PWM = r;
GREEN_PWM = g;
BLUE_PWM = b;
usbPoll();
//delay_fade - величина задержки перехода к следующему цвету
for (i = 0; i < delay_fade; i++)
{
if (i % 32 == 0) usbPoll(); //Вызов usbPoll() с интервалом в 32 ms
_delay_ms(1);
}
}
i = delay_stop;//delay_stop - величина задержки выбранного цвета
while (mode == _RANDOM_MODE && i)
{
if (i % 4 == 0) usbPoll(); //Вызов usbPoll() с интервалом в 40 ms
_delay_ms(10);
i--;
}
break;
case _STATIC_COLOR_MODE:
usbPoll();
break;
default:
break;
}
}
При выборе новых величин скважности, значения, меньшие 100 отбрасываются, чтобы была больше вероятность появления «чистых» или почти «чистых» цветов. А ограничение суммы в 255 сделано для хоть какой-то стабилизации яркости свечения лампы. Хотя интенсивность свечения светодиода каждого цвета всё равно будет разная, и возможно следовало бы завести тут какие-то коэффициенты для каждого цвета, но времени с этим разбираться не было, ввиду срочности изготовления «подарка». При равных значениях скважности для всех трёх светодиодов явно видно, что лампа «синит».
Начальная инициализация генератора псевдослучайных чисел осуществляется с помощью АЦП (пример был взят отсюда).
Настройки режима работы лампы для пущей важности сохраняются в EEPROM.=)
У режима «лампа настроения» доступно регулирование ведичины задержки при смене цвета и задержки до перехода на следующий цвет. У режима «светильник» доступен выбор цвета светильника.
Из текстолиста ножницами вырезал кружок под внутренний диаметр лампы. Получился вот такой страшный ужЫс:

Травить пришлось раствором медного купороса, ибо ничего более дельного под рукой не оказалось, и видимо что-то где-то не угадал с концентрацией раствора. Потому, что травилось настолько долго, что под конец даже тонер кое-где размок, и возникли подтравы некоторых дорожек. :(
Ну и смешивание цветов получилось не очень хорошее, из-за того, что светодиоды отдельные. Следовало бы взять RGB светодиод, но увы, таких под рукой опять же не оказалось.
Напоследок видео с демонстрацией работы (фотоаппарат внёс искажения в цвета):
- +4
- 17 января 2012, 22:38
- QBasic
- 1
Файлы в топике:
RGB_USB_LAMP.ZIP
Прикольная штука получилась. Я вот тоже как пытался определить коэф. для цветов, но так и не определил. интенсивность цветов в спектре белого цвета разная, похоже от туда надо коэф. рассчитывать. Может кто нибудь знает уже готовое решение по выбору коэф. поделитесь ссылкой.
Я в какой-то советской книге по ремонту телевизоров видел в самом начале, там эти коэфициенты были написаны для основных цветов. Потом поделюсь.
P.S. А аналоговым методом можно как-нибудь достигнуть похожего эффекта переливания цветов?
P.S. А аналоговым методом можно как-нибудь достигнуть похожего эффекта переливания цветов?
Комментарии (10)
RSS свернуть / развернуть