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

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

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

Из ящика было выужено:
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

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

RSS свернуть / развернуть
Прикольная штука получилась. Я вот тоже как пытался определить коэф. для цветов, но так и не определил. интенсивность цветов в спектре белого цвета разная, похоже от туда надо коэф. рассчитывать. Может кто нибудь знает уже готовое решение по выбору коэф. поделитесь ссылкой.
0
Я в какой-то советской книге по ремонту телевизоров видел в самом начале, там эти коэфициенты были написаны для основных цветов. Потом поделюсь.

P.S. А аналоговым методом можно как-нибудь достигнуть похожего эффекта переливания цветов?
0
Насколько я помню, в преобразовании RGB->YCC Y (яркость, оно же — единственный канал при трансформировании картинки в ЧБ) формула Y=0.31R+0.56G+0.13B. Вполне возможно, что это те самые коэффициенты.
Тут, правда, еще придется вносить поправку на разную излучаемую мощность кристаллов.
0
Сперва подумал это силиконовая сиська.
0
  • avatar
  • pkm
  • 17 января 2012, 23:33
что за песня на видео?)
0
Отрывок из композиции собственного сочинения.)
0
тогда реквестирую полную версию и других сочинений)
0
Их мало, которые в более-менее пристойном качестве. И все какие-то разно-разные.)
В последнее время музыкой заниматься времени особо нет — учёба, диплом, другие дела.))
Раз, два, три, четыре, пять, шесть.
С последней поаккуратнее.)
0
спасиб, скачал)
0
я тоже сейчас потихоньку делаю лампу настроения. только на моей цвет меняется крутилкой (энкодером), в одну и другую сторону, смешиваются только 2 цвета, соответственно получается 765 цветов.
пока все на моей жуткой самодельной макетке. ищу по магазинам подходящие детали (пластик) для сборки.
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.