инженер-системотехник
0,0
рейтинг
18 декабря 2013 в 22:24

Реверс-инжиниринг мерцающего светодиода перевод

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


Конечно, самый интересный вопрос — как они работают? Учитывая, что стоят они буквально по несколько центов за штуку, там внутри не может быть какой-то дорогой электроники. В связи с этим возникает еще один вопрос: правда ли эти светодиоды хуже, чем многочисленные «свечи» на микроконтроллерах, схем которых полно в интернете?


Устройство относительно простое. В стандартном 5-миллиметровом корпусе размещены кристалл светодиода и микросхема, которая чуть больше первого по размеру. Схема контроллера соединена как с положительным, так и с отрицательным выводами. Третьей перемычкой к ней подключен анод светодиода, в то время как катодом он «сидит» на отрицательном выводе.

В блоге Evil Mad Scientist недавно был рассказ о похожих светодиодах. Там было показано, как они «поют», если преобразовать изменения яркости в звук. А также — как с их помощью управлять более мощным диодом. Подобные трюки основаны на том, что светодиод потребляет больший ток в те моменты, когда контроллер зажигает его ярче. Обычный светодиод, включенный последовательно с мерцающим, показывает очень похожие изменения яркости. Иными словами, падение напряжения на добавочном резисторе изменяется пропорционально яркости.


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


На диаграмме выше показаны изменения яркости диода в течение примерно минуты, записанные с частотой выборки 1 МГц. Заметны интервалы, когда светодиод непрерывно включен, и периоды, когда его яркость каким-то образом модулируется. Светодиод никогда не выключается надолго. Это разумно, ведь настоящая свеча тоже ярко светит большую часть времени, снижая яркость на короткие периоды мерцания.


Более пристальный взгляд покзывает, что сигнал имеет широтно-импульсную модуляцию. Это означает, что перед нами цифровая схема, без всяких аналоговых трюков.

Любопытно, что частота сигнала — примерно 440 Гц, как у стандартного камертона (нота Ля первой октавы — прим. перев.). Совпадение? Или разработчик просто взял генератор из какой-то музыкальной схемы? Так что есть доля правды в рассказах о «музыкальности» этих светодиодов. Каждый «кадр» постоянной яркости составляет ровно 32 такта и длится около 72 мс. Это соответствует 13-14 кадрам в секунду.

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


График яркости в зависимости от времени наводит на некоторые мысли: изменения яркости случайны, дискретны и имеют неравномерное распределение. Кажется, существуют 16 уровней яркости, низшие 4 из которых используются очень редко. Им соответствуют только 13 из 3600 отсчетов.


Постороение гистограммы открывает всю картину: фактически используется только 12 уровней яркости. Ровно половина кадров имеет максимальную яркость, остальные значения распределены примерно поровну.

Как это может быть реализовано на аппаратном уровне? Вполне вероятно, используется генератор равномерно распределенных случайных чисел, которые пропускают через простую функцию-формирователь. Для того распределения, которое мы наблюдаем, требуется как минимум 12x2=24 дискретных уровня. Половина из них отображаются в один. Это весьма любопытно, так как генератор, скорее всего, выдает двоичные числа. Наиболее логичной была бы разрядность числа 5 бит, а это 32 состояния. Отобразить 32-уровневую дискретную случайную величину в 24 уровня, не изменив распределения, не так просто, как кажется. Не забываем также, что это совсем не критичная схема, и у разработчика, вероятно, не было много времени на красивое решение. Поэтому он применил самое простое, своего рода хак.

Единственный простой способ, что приходит на ум — просто отбрасывать неподходящие значения и брать следующее случайное число. Нежелательные значения можно легко отделить по битовой маске. Так как схема синхронная, есть только конечное число попыток, пока не начнется следующий кадр. Если контроллер не уложился в заданное количество попыток, он застрянет на «неправильном» значении. Помните редкие выбросы на графике яркости?

Реализация на ANSI-C могла бы выглядеть так:
    char attempts=0;
    char out;
    while(attempts++<MAX_ATTEMPTS) 
    { 
        out=RAND()&0x1f; 
        if ((out&0x0c)!=0) break; // отбрасываем значения, у которых 2-й и 3-й биты нулевые 
    } 
    if (out>15) out=15; // верхняя половина диапазона соответствует максимальной яркости


Можно узнать, сколько делается попыток? По статистике, доля a=0,25 всех чисел должн быть отброшена и сгенерирована заново. Вероятность того, что за n попыток не будет выбрано «правильное» число, равна an.
   n=1      0,25
   n=2      0,0625
   n=3      0,015625
   n=4      0,003906


Доля аномально низких уровней яркости составляет 13/3600=0,0036, что хорошо совпадает с вариантом n=4. Таким образом, MAX_ATTEMPTS==4.

Обратите внимание, что более простым решением было бы просто использовать значение из предыдущего кадра, если встретилось недопустимое число. Этот вариант можно было бы исключить, исходя из автокорреляции (см. ниже). Наиболее же простое, вероятно, решение — изменить схему ШИМ — не было здесь использовано.

Последний кусочек головоломки — это сам генератор случайных чисел. Типичным способом генерации случайных последовательностей в цифровых схемах является применение сдвиговых регистров с линейной обратной связью. Такой регистр выдает псевдослучайную битовую последовательность, которая повторится не позже, чем через 2x-1 тактов, где x — разрядность регистра. Одной из особенностей таких последовательностей (и хороших псевдослучайных последовательностей в целом) является то, что их автокорреляционная функция равна единице только в точке 0 и в координатах, кратных длине последовательности. Во всех остальных интервалах она нулевая.


Я рассчитал автокорреляцию всей последовательности значений. Самоподобия не было найдено вплоть до 3500 кадров (на графике выше показано только 1200), что означает уникальность мерцания на протяжении по меньшей мере 4 минут. Неясно, наблюдалось ли дальнейшее повторение последовательности, или логический анализатор автора просто не позволял записывать дольше — прим. перев. Поскольку на каждый кадр нужно как минимум 5 бит случайных данных (а учитывая механизм отбрасывания нежелательных чисел — еще больше), псевдослучайная последовательность имеет длину по меньшей мере 17500 бит. Для этого потребуется регистр разрядности не менее 17, либо настоящий аппаратный генератор случайных чисел. В любом случае, интересно, как много внимания при разработке уделили тому, чтобы картина мерцания не повторялась.

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

Каков же лучший алгоритм мерцания? Можно ли улучшить этот?

Дополнение: Я наконец нашел время написать эмулятор. Написанная на ANSI-C программа, эмулирующая поведение этого светодиода, здесь. Код написан под AVR, но его легко портировать под любой другой контроллер. Репозиторий на Гитхабе содержит все данные и исходные коды, использованные в процессе реверс-инжиниринга светодиода.
Перевод: CpldCpu
Dmitry Yakhontov @Ocelot
карма
389,5
рейтинг 0,0
инженер-системотехник
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

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

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

  • +1
    Сильно! :) Спасибо за разбор, было интересно.
    Еще есть такого же типа только RGB — они самостоятельно переливаются всеми цветами, реализованно наверняка точно так же через ШИМ только уже не в случайном порядке а вполне организованно. Размеры микросхемы только удивляют.
    • +1
      Ну если вспомнить что на совсем небольшом кристалле центрального процессора счет транзисторов уже давно идет на миллиарды, то размеры микросхемы не так уж удивительны :)
      • 0
        Тут можно уточнить: размеры кристалла практически любой микросхемы, где нет силовых цепей (например усилители) и огромных объёмов памяти, такие же.
        Можно взять напильник, спилить корпус, и убедиться в этом :)
  • +1
    А что будет, если такой диод аккуратненько облучить рентгеном? В какую сторону начнет штормить?
  • +3
    Очень удивился, увидев, что у меняющего цвет диода садового фонарика две ножки. То есть, он тоже имеет логику внутри. Дело было на даче, и такого сложного реверсинга не проводил, ограничился измерением продолжительности циклов. Красная, синяя и зеленая компонента путём проецирования на цветные листочки была выделена и измерена. У каждой оказался свой шаблон включения с разными периодами порядка минуты. Вспомнил шифровальные машины, порадовался, что полный цикл будет долгим.
    • +3
      Вспомнился винрарный пост про простые числа habrahabr.ru/post/117160/. Здесь вероятно похожая история: если период изменения каждого из цветов будет простым числом, то период повторения суммарного цвета будет равен произведению этих чисел. То есть, к примеру, период смены цветов 17, 29, 53 секунды для каналов RGB даст в итоге более 7 часов уникальных цветов без повторения.
    • 0
      Вполне возможно, что в одном корпусе — два диода включенные параллельно, но в разной полярности. Выключатель переполюсует питание — загорается другой.
      А если поставить простейший мультивибратор, включаемый в очередном положении выключателя в цепи питания, то будут по очереди гореть оба, что при даже достаточно невысокой частоте создаст иллюзию третьего цвета.
  • +7
    Дайте ссылку на эту статью камраду, который вытравливает пластик микросхемы и фоткает их содержимое под микроскопом.
    • +5
      Вы имеете ввиду вероятно BarsMonster
    • +11
      Хе-хе, действительно очень интересная микросхема. Как получится купить — вскрою.
      Главное найти где купить такие светодиоды.
      • +1
        Практически в любом магазине радиодеталей.
        • 0
          Под новый год их обычно сметают подчистую как горячие пирожки.
      • 0
        мне такие попали в этом комплекте — dx.com/p/152881

        Их там два десятка — с быстрым и медленным мерцанием.
      • 0
        +1, это было бы очень интересно!
        • 0
          Как раз прямо сейчас лежит под микроскопом
          • 0
            Ой как замечательно! А я как раз переписываюсь сейчас с человеком из Evil Made Scientist. Говорит, что эти светодиоды при старте горят по-разному, значит генератор случайных чисел у них инициализируется тоже по-разному. Значит, их можно вставлять в ряд!
  • НЛО прилетело и опубликовало эту надпись здесь
    • +4
      Смотрите глубже! Это замаскированный приемник вражеских зашифрованных сигналов. А что? С современной микроэлектроникой можно прятать закладки туда, где никто даже не подумает искать, да хоть в светодиоды.
  • +1
    Весь этот «контроллер» реализуется на одном(1) стабилитроне и RC цепочке из резистора 1 мом и конденсатора 360pf. И все. Не надо городить никаких анализаторов вокруг простейшей конструкции.
    • +1
      Тогда будет просто мигалка. А как добиться случайного мерцания?
      • +1
        Стабилитрон можно использовать как генератор белого шума.
        • 0
          Это будет уже довольно сложно. Надо искать простое решение, оно не может не быть.
          • +1
            • 0
              Почему она трясётся?
              • 0
                Почему лампочка трясется? Без понятия, наверное, у оператора дрожали руки.

                А разряд «прыгает», потому что зазор между электродами снизу чуть меньше, чем сверху. Разряд зажигается в нижней части (где легче), за счет конвекции переносится наверх, гаснет и снова зажигается снизу. Своего рода лестница Иакова.
  • 0
    в конце статьи почему то ожидал исходники программы которая проигрывает мигание светодиода
  • 0
    Данный светодиод можно использовать как настоящий генератор случайных чисел. Как говориться дешево и сердито. А если использовать два светодиода и суммировать результата получится вообще сказка :)
    • 0
      Хороший генератор, только очень медленный: около 200 бит/с.
    • 0
      Возможно, что они проигрывают одну и ту же последовательность бит при включении, поэтому простое суммирование может не получиться.
  • 0
    Ну не для всех задач нужно генерировать много случайных чисел, ну и буфер можно приспособить :)
  • 0
    Было бы интересно вставить такие светодиоды в электронный тортик: http://habrahabr.ru/post/243499/

    Но тут может быть несколько нюансов. Во-первых, будут ли они генерировать разные случайные числа при их одновременном включении. Во-вторых, не привнесет ли их работа шум.

    Вообще, раз в светодиоды уже вставляют микросхемы, то почему бы не сделать светодиод-свечу, которую можно задуть. Кому там пишут, чтобы сделали?
  • 0
    Нашел на просторах интернета. Картинка потерялась, пришлось искать в кеше:



    Upper left is GND pad.
    Lower right is VCC pad.
    Upper right is output to LED anode.

    To the left of the LED output pad is the large serpentine LED driver transistor.

    Between the GND pad and serpentine transistor is Power on Reset with the metal plate the capacitor and a long trace loop to form a resistor for an RC time constant.

    In the lower region, to the left of the VCC pad, is a similar pad which forms a capacitor. With the serpentine resistor connected to the upper left of this pad, this, forms the on board RC oscillator. The drive transistor is center bottom with four T-flip-flop divider stages repeated to the lower left of the chip.

    The middle of the chip has three horizontal bands.

    The upper band (just below the GND pad and extending across to the LED pad) is a 9-stage divider chain along with miscellaneous logic at right. This divides down the RC clock. Additionally various taps from the divider chain are used in the second horizontal region.

    The second horizontal region has several EXOR gates (center) which combine outputs from the divides chain, along with various outputs from region three below.

    Region three has several cells wired as shift registers. Near the left is misc logic, then two shift rigisters, then an EXOR gate, then five additional shift register cells. At the far right is a buffer which then drives the previously mentioned large serpentine transistor to the LED pad.

    The shift register cells are very similar to the T-flip-flop cells used in the 9-stage divider chain, but wired differently.

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