Светящиеся снежки, или Украшаем Новый Год «подручными материалами»

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

    Первой попыткой была колба со статично светящимся светодиодом, но чуть позже была закончена плата с небольшой долькой динамики.



    Как это работает и как сделать что-то похожее — смотрите под катом.
    P.S. «Подручность» материалов, скорее всего, распространяется на радиолюбителей.

    Как всё начиналось


    Для начала нам понадобится:
    • Прозрачная колбочка из-под бахил (можно взять в ближайшей поликлинике)
    • Холдер для батарейки типа CR2032 (они бывают разные, нам нужен с зажимом сбоку)
    • Светодиод RGB (я использовал планарный, типоразмера 5050, рассеивающий)
    • Немножко резисторов (тоже планарных, на 100 Ом — питать будем от 3В — батарейки)
    • Кусок стеклотекстолита с медной фольгой
    • Медный купорос или хлорное железо (или ещё в чём вы привыкли травить платы)

    image
    Плата рисуется элементарно (я даже не стал раскочегаривать принтер, достал маркер для рисования на CD-дисках и быстренько нацарапал, после чего моментально забросил это в раствор травиться, сфотографировать не успел).
    Вот так выглядит рисунок платы:


    После вытравливания плату следует вырезать по форме холдера для батарейки (проще всего это сделать, заранее просверлив отверстия и вставив холдер сзади, затем обвести маркером холдер. ВНИМАНИЕ! Полярность имеет значение! Следите за положением «ушка» холдера!) и напаять светодиод, резисторы и холдер.

    Вот что из этого получается:
    image

    На плате нарочно не запаян один резистор, я хотел получить пурпурное свечение, для этого нужно включить красный и синий каналы, отключив зелёный.

    Вот так получается простейшая светилка. Плату покрываем лаком (на самом деле не обязательно, но так дорожки с меньшей вероятностью потемнеют), вставляем батарейку, упаковываем в колбу и идём лепить снежки!

    И тут Остапа понесло


    Как программист, который неровно дышит в сторону всякой микроконтроллерной техники, я решил приспособить к делу небольшой чип, который привнесёт чуть больше радости в эту штуковину, заставляя светодиод красиво переливаться разными цветами.

    Для этого я взял широко известный в узких кругах контроллер Atmel ATtiny45 (хотел ATtiny13, но их неожиданно в ящике не оказалось, разница только в размере памяти. Программа для этой светилки поместится в ATtiny13), нарисовал плату в Eagle и с помощью лазерно-утюжной технологии перенёс полученный рисунок на фольгированный текстолит.
    image
    По сравнению с предыдущей версией, на плате появился конденсатор для более стабильного питания и сам микроконтроллер. В плане компонентов тут приходится обходиться малой кровью, так как пространство на плате ограничено. Даже разъёма для программирования я не предусмотрел, подпаивался проводками к пинам (специально для этого каналы светодиода оказались на пинах для программирования, а RESET я вывел отдельной площадкой). Резисторы и конденсаторы на этой плате типоразмера 0805.

    Пока платы травились, я занялся программой. В ATtiny45 аппаратный вывод ШИМ-сигнала поддерживается на ножках PB0, PB1 и ещё на нескольких. PB2 в этом списке не оказалось. Но плата уже нарисована и травится, поэтому я решил сделать программный ШИМ, применив второй таймер (Timer1).

    Для того, чтобы сделать светилку более гибкой в настройке, я применил такой механизм. В чипе есть ПЗУ (EEPROM). В первой ячейке будем хранить число, которое задаёт режим работы. После каждого включения будем увеличивать это значение на 1 и сохранять его в ПЗУ. Так, дёргая батарейкой в разъёме, можно переключать режимы работы. Для того, чтобы не пропустить нужный, каждый режим я продублировал (фактически, следующий режим включится после двух передёргиваний батарейки).

    Весь код на Си (для компилятора AVR-GCC)
    #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);
    }
    


    Электрическая схема и разводка печатной платы (из Eagle CAD)




    Fuse-биты можно посчитать здесь, я посчитал, что 1МГц мне хватит для комфортного ШИМ и для низкого энергопотребления. Вообще говоря, фьюз-биты оказались стандартными для tiny45, так что их можно не менять.

    Мне уже не терпелось поскорее опробовать новую поделку на практике, потому, наспех прыснув лаком из баллончика и дав 5 минут полежать под лампой, я взял её и выбежал на улицу с камерой (был уже довольно поздний вечер, как раз годные условия для тестирования).

    И вот результат (видео не отличается от вставленного сверху для привлечения внимания):

    Снежки совсем не хотели лепиться, и всё-таки я разогрел в руках горстку снега и всё получилось!


    Немаловажно


    За идею огромное спасибо тов. Kidar.

    Все материалы по этому проектику я выложил в Dropbox. Когда появится время, подготовлю отдельный makefile, а сейчас после распаковки: make antares && make build, после чего удобным для вас способом загружаете файл images/antares.hex на чип.

    Спасибо за внимание!

    UPD: Обновил архивы с исходными файлами; теперь в комплекте с печатной платой идёт PDF-файл для самостоятельной печати, а в архиве с программой — hex-файл с готовой прошивкой.

    Комментарии 30

      0
      Молодец! На сколько хватает?
        0
        Ну, экспериментально не проверял, но можно посчитать из потребляемого тока и ёмкости типичной CR2032:

        Самый большой ток (в режиме «все светодиоды на полную, белый свет») — 6.37 мА.
        Когда не горит красный светодиод (в любом режиме) — не выше 1.8 мА.

        Примем стандартную величину в 5 мА. Ёмкость CR2032 — 225 мА/ч.
        Если не брать в расчёт экспоненту Пекерта, время работы от одной батарейки — 45 часов.
        Если считать ток разряда 1.8 мА — 125 часов.
          0
          Для красного светодиода лучше поставить резистор чуть большего номинала.
            0
            Для красного светодиода лучше поставить резистор чуть большего номинала.

            Не смог открыть схему (нет программы для ее просмотра). Там какие номиналы установлены?

            Собирал как-то другую схему с напряжением 3,3 вольта.
            Там для тока 15 мА на каналах RGB установлены резисторы соответственно 68-10-10 Ом. То есть, на красном почти в 7 раз больший номинал.

            P.S.
            Прочитал, по 100 Ом стоят на всех каналах. Да, лучше добавить на красный. Хотя все зависит от яркости.
              +1
              Дело в том, что красные светодиоды, обычно, рассчитаны на меньшее напряжение, чем синие и зеленые, соответственно и резистор для них надо подбирать большего номинала.
              В любом даташите на rgb светодиод указано нужное напряжение для каждого цвета, и если для сиенго/зеленого обычно указано 3в, то для красного меньше — 2.2в.
                0
                Я сначала по 100 Ом навесил, после сборки оказалось, что всё довольно равномерно светится. Но вообще мне кажется, что в такой схеме лучше наоборот — уменьшить сопротивление на G и B. Дойдут руки — перепаяю. Хотя и сейчас всё в порядке.
        0
        В комментариях к той статье Вы писали:
        Когда расквитаюсь с зачётами — попробую сделать платку с контроллером ATtiny13

        Может теперь преподам по снежку на Новый Год и с зачетами будет легче?
        Хорошо, когда такое простое дело способствует углубленному изучению предмета!
          0
          А схему можно добавить в топик, а то из Dropbox скачал и выяснилось, что нет каких-то программ для просмотра…
            +1
            Добавил PDF-файл с разводкой в Dropbox (уже отзеркаленный!), плюс картинки со схемой и печатной платой.
            +8

              0
              Еще бы как-то включать/выключать и изменять режимы работы без манипуляции с батарейкой…
                +1
                На ум приходит контроллер с GSM-модулем, отправляешь смс с кодом, снежок светится другим цветом \ меняется интенсивность. Кстати, интересно было бы использовать такую идею для геокэшинга.
                  +1
                  Кажется, для такой маленькой вещицы это уже перебор %)
                    0
                    Возможно, зато «it's magic!» :)
                    0
                    С bluetooth всё становится лучше :)
                      0
                      А ещё относительно контактный метод — IR приёмник, или просто оптосенсор для приёма кодированного светового сигнала.
                        0
                        Интересно прохождение ИК-излучения через снег.
                        Поглотится, отразится, частично достигнет приемника в снегу?
                          0
                          В зависимости от глубины, думаю, будет вести себя как обычный свет, но поглощаться снегом значительно сильнее, потому что это тепловое излучение. Поэтому я и написал — относительно контактный, потому что синий зуб через снег пройдёт, а для оптики нужно извлекать девайс из под снега.
                            0
                            В общем, нужны испытания. Если прятать в снежок, то расстояние до датчика будет в диапазоне 1...5 см.
                  0
                  Kidar, если бы у меня под рукой были герконы, как в вашем случае, их можно было бы встроить в конструкцию. Но герконов не оказалось, да и манипуляции с батарейкой не очень сложные.
                    0
                    Манипуляции не сложные, но:
                    — есть риск неправильно установить батарейку;
                    — требуется вскрытие устройства и соответственно, происходит попадание снега внутрь;
                    — на это также необходимо время, что сокращает срок жизни батареек;
                    — при этом мерзнут руки.

                    С герконом тоже не очень нравится (необходим магнит и он хрупкий, то есть опасный для детей).
                    Вот если что-то простое… Тряхнул (стукнул, перевернул) — включилось, или поменялась программа.
                      +1
                      Да, интересно… Есть такая штука, как Rolling Ball Switch, используются как индикаторы вибрации. Вроде бы простейшие не очень дорогие. Можно будет попробовать такой применить, при встряхивании обрабатывать прерывание на контроллере, переключая режим. Вместо выключения посылать контроллер в глубокий сон (он там около 1 мкА кушать будет, но это совсем не фатально, несколько лет будет держаться от CR2032).

                      И тогда пускать светяшки в производство, что уж там ;)
                    +2
                    Можно использовать G датчик, чтобы менять цвет при полета снежка, например.
                    www.rct.ru/catalogue/2075/2076/2091/vbs030600.41363.html
                      +1
                      Спасибо и за Rolling Ball Switch, и за sensor switch, не знал про такие простые датчики.
                      Посмотрел, их оказывается очень много видов и они не такие дорогие. Есть даже видео с примером использования.
                    0
                    Геокешингом увлекался, действительно интересное занятие.
                    Идея с GSM-контроллером неплохая, но годится наверное для больших елок (так как дороговато выйдет) — зажечь сугроб, снежную фигурку, макушку ели и т. п.
                    Для массовой конструкции надо что-то проще. Я в снежке использовал геркон, но тоже не совсем удобно — нужен магнит.
                    Если подключить геркон к контроллеру, то уже можно управлять светодиодами, но геркон хрупок.

                      +3
                      Я имел в виду подсветку именно сугроба для указания тайника. Прибываешь к указанному месту, выполняешь какую-нибудь загадку, получаешь кодовое слово, его же отправляешь на номер и вуаля возле тебя магическим образом начинается светиться сугроб с тайником. Для летнего периода тоже можно что-то придумать, мне кажется.
                        0
                        Кстати, очень интересная идея для зимних игрищ! Приму к сведению ;)
                          0
                          Не «Ночной дозор», случаем?
                          Искал про Rolling Ball Switch, нашел кубик для игровых костей. Схема конечно старая, сейчас даже контроллер такой не найти, но неплохая. Там на красных светодиодах вообще по 560 Ом поставили.
                      0
                      Помимо упомянутых выше Rolling Ball Switch (sensor switch), в качестве простого датчика можно использовать пьезоэлемент.
                      Провел простой опыт, для зажигания светодиода вполне хватает импульса, вырабатываемого пьезоизлучателем. Если вместо светодиода в этом видео подключить вход микроконтроллера, то это будет простейшим датчиком. Так как в микроконтроллере вход через внутренний диод подключен к источнику питания, то генерируемый при воздействии на пьезокристалл импульс не должен повредить микросхему.
                      Еще один способ. Дождаться, когда профессор Чжун Линь Ван (Zhong Lin Wang) начнет выпускать датчики, работающие на трибоэлектрическом эффекте.

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

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