Зачем он нужен
Недавно я писал статью про самодельный bluetooth велокомпьютер. Было оживлённое обсуждение. Одним из предложений по модернизации, была идея добавить индикацию или жк экран. Идея мне понравилась. И я решил подумать как её воплотить в жизнь.
Так как велокомпьютеры уже были сделаны, корпус был практически весь занят, то вариант с жк экраном отпадал. Нужен был размер 40х30мм, с учетом всех шлейфов и проводов, и по толщине не больше 2-3мм. Также осталось немного свободных выводов. Различные светодиодные индикаторы (три цифры, шкала) не влезали. Тогда в голову и пришла очень хорошая мысль — сделать самодельный индикатор из SMD светодиодов. Взять тонкий односторонний текстолит, разместить на нём нужное количество светодиодов, в нужном порядке и получится отличный индикатор. Представив, что ко всем светодиодам нужно вести провода, я решил, что на плате поместится и дешёвый микроконтроллер, который будет сам управлять всеми светодиодами, а основной МК велокомпьютера будет управлять индикатором по одному проводу.
В итоге получился очень компактный (толщина всего 3мм) индикатор. Управление по одному проводу, и еще 2 на питание. Если у вас есть уже готовые приборы, или вы планируете сделать прибор, и нужен индикатор, то самодельный индикатор самый отличный вариант. Разберём подробнее как он работает.
20 светодиодов на 10 выводах — легко!
МК я выбрал самый не дорогой — SMT8S003, такой же как в велокомпьютере. У него всего 20 ног. Если убрать ноги питания и управления, то остаётся 14 ног. Первая задача, которую надо было решить, управлять этими ногами как можно большим количеством светодиодов.
В голову сразу пришло решение, что на одну ногу можно повесить 2 светодиода, одним выводом на GND, а вторым на VDD. На каждый светодиод по резистору. По такой схеме.
Управлять просто. Подаём на вывод 0, горит один светодиод, подаём 1 — горит второй светодиод. Переводим в третье состояние (вход) не горит ни один. Получается на 14 выводов можно повесить 28 светодиодов. Очень не плохо.
Сын нарисовал сам индикатор. Для велокомпьютера, самый полезный вид индикатора, после цифр — шкала. Индикатор состоит из 2 шкал по 8 светодиодов, и ещё 4 различных статусных светодиода. Итого 20 светодиодов. Я быстро набросал плату, протравил, запаял и начал тестировать.
Включаю МК, все выводы в третьем состоянии, ничего не должно гореть. И… Светодиоды горят. Конечно, им хватает напряжения в 5 вольт, чтобы тускло светится. Так не пойдёт, меняем схему...
Ещё больше светодиодов
Немного подумав, пришла другая идея. Подключить светодиоды не к питанию и земле, а к ещё двум выводам МК. Тогда точно можно выключить всё. Пробуем, отлично работает. За счёт динамической индикации, все красиво мигает. Можно управлять каждым светодиодом.
В итоге на будущее получилась такая схема:
Выделяем несколько управляющих выводов и рабочих. Резисторы ставим только на управляющие upr1 upr2. Таким образом, сильно упрощается схема и трассировка платы. На 14 выводах можно разместить до 96 светодиодов. 6 управляющих и 8 рабочих, плюс на каждом по 2 светодиода. Более чем достаточно, рука паять устанет.
Как оказалось можно и больше. Чарли Аллен пошёл ещё дальше, разместив по несколько светодиодов еще и между управляющими выводами. Таким образом, можно разместить на 16 выводах до 16*15 светодиодов. Но, в его схеме добавляется много резисторов, а также надо, чтобы все светодиоды были одного цвета, в общем есть небольшие проблемы. Вывод — 96 светодиодов более чем достаточно.
Управляем каждым светодиодом по отдельности
Для управления каждым светодиодом, используется метод динамической индикации. В один момент времени можно зажечь по одному светодиоду на управляющий вывод. Далее нужно перебрать все пары, это состояния индикации, и так по кругу. Так как плата уже была сделана, то я её переделал в один управляющий вывод и один резистор. Получилось 20 светодиодов на одном выводе и 10 рабочих выводов. Итого 20 состояний.
Для понижения потребления энергии, МК работает на частоте 2МГц. Чтобы перебрать 20 состояний с частотой в 50Гц хотя бы, нужен таймер с частотой в 1000Гц. Дополнительно захотелось ещё по управлять яркостью. Но получается, чтобы понизить ее в 10 раз, нужно частоту таймер 10 000Гц, а в 100 раз 100 000 Гц. При этом в обработчике прерывания нужно перебрать все варианты и зажечь нужный светодиод. В общем МК не справлялся. Пришлось перейти на вариант с PWM модуляцией.
Управляем яркостью с помощью ШИМ таймера
В итоге получилась простая программа. Используем один таймер — TIM2, с возможностью ШИМ генерации. Настраиваем частоту таймера на 1000Гц, а максимальное значение таймера 125 — разрядность ШИМ, которая будет определять градации яркости. В итоге, можно задать любое значение яркости от 0 до 125. В момент срабатывания второго прерывания таймера, по сравнению с заполнением ШИМ, выключаем все светодиоды.
В итоге получился отличный индикатор. За счёт регулирования яркости потребление в активной фазе составляет от 1 мА до 4мА.
Подключаем велокомпьютер
Сам индикатор готов, в корпусе от велокомпьютра он выглядит так:
Для управления индикатором, я выбрал протокол 1-wire. Описывать его не буду. Скажу только, что пришлось помучаться, чтобы успеть обработать прерывание и выдержать нужные тайминги, но в итоге все заработало. Велокомпьютер как Master, а индикатор как Slave. Для управления надо передать 4 байта. Первый байт — команда, яркость и один бит для перехода в спящий режим, остальные 3 байта — светодиоды, по биту на светодиод.
Первое, что пришло в голову отображать на индикаторе — это скорость и каднес. Служебные светодиоды оставить для статуса блютус, нарушения контроля скорости и каденса и еще один — контроль расстояния.
После опытных испытаний, добавил возможность отображать оставшееся расстояние от заданного или оставшиеся калории от заданных. Получилось очень удобно. Ставишь план — потратить за прогулку 2000 Кал, едешь и сразу видишь, осталось ещё половина. Вывод — индикация вещь полезная.
Сыну очень понравилось, он загорелся идеей сделать брелок — индикатор с аккумулятором в эпоксидной смоле. Пошёл думать.
Какие ещё можно сделать индикаторы
Часы — светодиоды в два круга — часы и минуты.
Стороны света — для электронного компаса.
Шкала для инкрементного поворотного энкодера.
Несколько шкал в одном индикаторе.
Сердечко для музыкальной открытки.
Матрица 8х8 для отображения картинок.
Тонкий семисегментный индикатор на одну цифру 11 светодиодов.
В общем, идей как это можно использовать — много.
На github, как обычно плата, программа, реализация протокола 1-wire и динамической индикации. Кому нужно, можете использовать в своих проектах.
Комментарии (63)
BARSRAB
03.12.2017 21:33Не пойму, зачем там сложности в виде 1-Wire? Почему не UART? Да и необходимость наличия второго МК сомнительна. Можно же тот же MAX7219 поставить и управлять по SPI.
myowndevice Автор
03.12.2017 23:16Ну почему сложности, наоборот, 1-wire простой протокол. Uart — надо для управления терять полезный порт или делать soft uart. Во вторых стоимость драйвера — как стоимость STM8. В третьих SPI — 3 провода, а тут один. В четвертых к max столько не подключишь светодиодов — нужны выводы три стейт. В общем схема с МК проще и универсальнее.
BigBeaver
03.12.2017 23:24В SPI 2 провода, если вас не интересует двухсторонняя передача. UART в этом случае укладывается в один, но SPI не чувствителен к таймингам.
BARSRAB
03.12.2017 23:28С точки зрения реализации в МК, 1-Wire сложный протокол. и сложный с точки зрения бесполезного расхода процессорных ресурсов на обеспечение таймингов. Плюс к этому он медленный. И что значит «терять полезный порт»? Для 1-Wire выводы не нужны? spi три вывода, зато никаких заморочек с таймингами. Ну и даташит вы видели на max? К ней можно подключить 64 светодиода. А еще есть rgb светодиоды с чипом ws2812, управляются по одному проводу, включаются последовательно. Ну и самых чипы можно купить. Если не надо rgb, то каждый чип может управлять тремя отдельными диодами.
dernuss
04.12.2017 03:51> Для 1-Wire выводы не нужны?
В stms003 2 порта не совсем полноценных, они для i2c и с открытым коллектором на выход.myowndevice Автор
04.12.2017 15:04SPI UART это все полезная периферия. Ее нельзя вывести на любую ножку. В этом и проблема. А тайминги не теряются в этом время прерывания работают, так что проблемы нет. Там одно узкое место — когда единица передается — 10мкс, и то прерывания могут все обработаться. И вообще никто же не просит весь 1 wire реализовывать. А вообще посмотрите код к статье, там всего 10 строк на прием и 10 на передачу. Куда уж проще — при том, что любая нога.
seri0shka
04.12.2017 00:26Прочитав название, подумал, что речь пойдёт о таком
Интересовался темой, нет в природе тонких семисегментных индикаторов, хотя я не вижу сложности промышленно изготовить семисегментные индикаторы толщиной 0,5...1,5 мм.myowndevice Автор
04.12.2017 15:01Ну так можно и такой… Если паять не тяжело.Это общая концепция. Тоже думал о таких. Не хватает тонких цифр. Даже делал прорисовку — достаточно по высоте боковые задводить и будет цифры понятно все. То есть всего 11 светодиодов на цифру — не так много. Вообще проблемы же нет сделать любую форму. В статье написано — до 96 светодиодов. Вопрос плату развести и все.
Alexeyslav
05.12.2017 17:30Вобще-то есть(вспомнить, например АЛС314, АЛС320), только совсем тонкими сделать мешает необходимость эффективного рассеивателя, иначе не сегменты будут а точки от свеодиодов. Прям как на тёплых ламповых советских АЛСxxx.
А делать длинные светоизлучающие кристаллы как на старых добрых АЛС320 почему-то не хотят или не могут… квадратные точечки микронных размеров видимо дешевле обходятся.
lingvo
06.12.2017 16:16Наверное нет потому, что сейчас не проблема сделать любой индикатор в промышленном качестве без какой либо подготовки производства. Для этого понадобится либо 3D принтер, либо CNC фрезеровщик с куском белого непрозрачного пластика и белая бумага. Я сейчас часто вижу такое решение в устройствах.
Делается так — на своей плате в нужном порядке разводите SMD светодиоды с широким углом обзора и по несколько штук на сегмент, если надо. Далее либо на 3D принтере либо на фрезеровочном станке делаете шаблон, как на рисунке выше, где в местах, где нужны сегменты вырезаете дырки. Толщина пластика может быть любая — от пары миллиметров. Главное, чтобы пластик был непрозрачным, так как его задача — изолировать свечение светодиодов разных сегментов друг от друга. Далее заклеиваете все сверху белой бумагой и ставите на свою плату. Сверху закрываете стеклом по вкусу. Эффект будет отличный. Мало того, вы можете легко вырезать любые символы, и зажигать их светодиодами разных цветов, как на приборке автомобиля.Alexeyslav
06.12.2017 17:39Там проблема возникает — недостаточное рассеивание света на малых расстояниях, будут не сегменты гореть а точки на местах светодиодов. И лист бумаги дополнительно снизит световой поток до неприемлемого. В промышленных индикаторах для этого используют специальный светорассеивающий компаунд, которым заполняют эти ниши. Но опять же, чем тоньше слой тем сильнее проявляются места установки светодиодов, и засветка сегмента становится неравномерной. Кто-то из знакомых уже давно пробовал делать такие плоские индикаторы и наступил на всевозможные грабли и камни. В итоге — тонкие индикаторы с листом бумаги очень тусклые, с рассеивающим компаундом приемлемый результат только от 4мм и больше иначе появляются островки повышенной яркости в сегменте и выглядит не очень.
seri0shka
06.12.2017 19:36недостаточное рассеивание света на малых расстояниях
На картинке выше единственно верное решение этой проблемы- несколько светодиодов на сегмент. Хотя «длинные светоизлучающие кристаллы», о которых вы упоминали, решили бы проблему полностью. Вот раскопал индикатор с советского калькулятора, толщина при снятом защитном стекле менее 1,8 мм (плата+светодиоды), с тоньшей платой можно уменьшить вдвое. Жаль, что подобное сейчас не купить.
Alexeyslav
07.12.2017 00:13Я уже упоминал такие индикаторы. Видимо проблема выращивать длинные кристаллы, или слишком дорого.
из таких АЛС314 — толщина 2.4мм
Если надо тонкие, 4мм — KCSA56-104, или вот ещё — KCSA56-105-B-26 толщина 2.4мм!nafikovr
07.12.2017 07:57для филаментных ламп так недорого, а для индикаторов дорого. чудеса…
Alexeyslav
07.12.2017 10:37У филаментных тоже маленькие кристаллы используют, просто люминофора там больше и кристаллы менее заметны на фоне общего излучения.
lingvo
06.12.2017 21:32Вопрос с недостаточной яркостью решается установкой сверхярких светодидов, коих сегодня полно. Мало кто знает, что с динамической индикацией также можно спокойно увеличивать ток светодиода в разы выше постоянного допустимого, так как светодиод работает в импульсном режиме. Это очень эффективно компенсирует потерю яркости.
Ну и я не в курсе супертонких индикаторов, наверное, там будут нюансы, но видел вполне рабочий индикатор на данном принципе с примерно 5мм толщиной и там не было никакого компаунда. Также я недавно протестировал SMD сверхяркие светодиоды с углом рассеивания в 160 градусов — это песня.Alexeyslav
06.12.2017 23:05Конечно, только с повышением яркости будет расти и потребление. Импульсный ток вы увеличиваете, но средний не растёт иначе кирдык светодиоду, количественно излучение остаётся таким же как на постоянном токе, и только биологический хак с глазами делает видимую яркость несколько больше, но не кардинально. В то время как нормальные сверхяркие индикаторы с током примерно 5мА и скважностью 0.5 дают яркий свет освещающий пол комнаты в темноте… И боюсь, с бумажкой в качестве светорассеивателя контраст сильно упадёт, как ни задирай яркость.
Вобщем, по подводным камням люди уже ходили — не получается так делать светодиодные индикаторы. А по нескольку светодиодов на сегмент это конечно выход, но весьма не бюджетный. И вопрос как включать такие диоды — последовательное соединение потребует увеличения рабочего напряжения на сегмент(такое и делают в больших индикаторах)… а параллельное — выравнивающих резисторов, иначе индикатор на пару месяцев. Но опять же, для сооовсем больших индикаторов, например с высотой цифры в 10 сантиметров эффективней использовать светящуюся бумагу.seri0shka
07.12.2017 00:00lingvo Сильно повышать яркость нельзя, иначе цифра или знак превращается в световое пятно.
Alexeyslav По несколько светодиодов на сегмент только последовательно, на бюджет не повлияет, получится 21 светодиод на цифру, стоит 12 американских копеек за цифру (посчитал по реальным ценам, недавно брал смд светодиоды здесь, не в Китае). Ну конечно для большого количества знаков такой огород городить не сильно интересно.
nafikovr
07.12.2017 08:03увеличиваем яркость, снова обретаем проблемы со светящимися точками вместо сегментов, увеличиваем плотность рассеивателя, снова теряем яркость. далее по кругу.
nafikovr
07.12.2017 08:01доводы лишены смысла, так как в промышленных масштабах подобный самосборный индикатор будет стоить как золотой, а спрос определяется далеко не домашними мастерами.
myowndevice Автор
07.12.2017 08:03К сожалению да, в произв. масштабах проще на заказ сделать LCD индикатор.
nafikovr
07.12.2017 08:06да даже LED индикатор часто по потребностям заказывают. глянул на микроволновку и стиралку от компании s...g — везде спецсимволы.
vchs
04.12.2017 00:51Max7219 или Max7221 были бы всё же проще. Три линии и всё (clk, in, latch). 64 светодиода на каждую Max. Управляемая яркость, декодирования BCD или напрямую, полностью автономное динамическое обновление, а значит 0% нагрузки на процессор (энергоэффективность). И железобетонная предсказуемость. В общем цена в 2 доп. ноги себя окупает сторицей. В Китае 29 амеро центов штука. Не думаю что STM8 дешевле. Но если задача стояла чисто DIY то вполне себе неожиданное решение у вас вышло.
myowndevice Автор
04.12.2017 15:11Ну все таки оригинальный MAX 7221 стоит больше 200руб. В китае продается подделка, работающая конечно. Ну и потребление тока 150мкА в спящем режиме — много. А У МК всего 5мкА, и можно другой подробрать еще меньше. Ну и потом МК сам запрограммировал как угодно, можно еще больше логики добавить если надо.
Например, если это шкала можно запоминать макс уровень и его подсвечивать какое то время.BigBeaver
04.12.2017 15:12Можно гейтом выключать питание схемы.
myowndevice Автор
04.12.2017 15:13еще ноги… к спи добавляются.
BigBeaver
04.12.2017 15:16Зависит от того, сколько у вас вообще потребляющей переферии и какой. Иногда удобно все заглушить разом. А еще зависит от того, какое у вас питание — есть же управляемые стабилизаторы, и тогда все уже есть из коробки для всей схемы включая МК. В общем, от задач зависит.
myowndevice Автор
04.12.2017 15:19Ну конкретно здесь все известно. Ссылка на статью про велокомпьютер есть. Он все время в спящем режиме — аккумулятор 100мА. Потребление 5мкА. Если будет 150 — то мало спать будет. Придется ноги добавлять на отключение питания. В общем с MAX не лучше выйдет. Конкретно в этом случае. А так конечно драйвер хороший. Но, вот покупать конечно надо оригинальный, а цена в этом случае совсем не Айс. А STM8, самый оригинальный.
Nataly75
07.12.2017 15:18А почему всего 20? 10 выводов могут управлять 90-ми светодиодами. Без ничего!)
Alexeyslav
07.12.2017 16:21И потом в болото застрять отлаживая вывод на эти самые 90 светодиодов. Компромисс нужен между простотой железа и простотой программы им оперирующей. Так-то вообще десятками светодиодов можно управлять вообще одной ножкой, используя явление резонанса…
myowndevice Автор
07.12.2017 17:22А откуда 20?? в статье про 90 и более. Типа не дочитал?? И потом надо каждым в отдельности… без ничего… это интересно.
Nataly75
07.12.2017 17:26Да ладно! Кто автор?))
20 светодиодов на 10 выводах — легко!myowndevice Автор
07.12.2017 17:40А дальше прочитать слабо? Еще больше светодиодов… Видимо много буков.
BigBeaver
SPI диоды в помощь. Дорогие, конечно, но зато, rgb, и без дополнительного контроллера.
igrushkin
Блин, случайно заминусил :-(((( извините
BigBeaver
Не переживайте, никто же не умер)
Kom46
Можно по spi и обычные светодиоды зажигать. Один сдвиговый регистр 74HC595 до 8 штук позволяет на себя повесить, а так же имеет выход для последовательного соединения сдвиговиков, т.е. можно ленту какого угодно размера набрать просто последовательно соединяя выход предыдущего регистра со входом следующего. Наиболее удобное решение, как по мне=)
myowndevice Автор
Сдвиговые тоже денег стоят. Почти как микроконтроллер. И яркостью сложно управлять через сдвиговый регистр — частота уже будет слишком большая. Потом яркостью надо непрерывно управлять. Яркость нужна чтобы снизить энергопотребление.
AlanDrakes
Никто не мешает управлять яркостью, подключив PWM выход ко входам /OE регистров. При этом они уходят в Z-состояние и, естественно, ток падает до нуля.
Лично у меня есть где-то проект именно с такой регулировкой яркости свечения диодов за регистрами.
BigBeaver
Тогда вы будете яркость всего дисплея задавать. SPI диоды же позволят для каждого это сделать.
nafikovr
пусть частота диммирования будет 1кГц. 20 диодов. итого 20кГц. слишком высокая? если BAM применить — можно еще ниже сделать.
BigBeaver
Это у вас одноразрядное (вкл/выкл) диммирование вышло.
nafikovr
100Гц — 10 уровней.
BigBeaver
На каждый уровень нужен период загрузки. 10 уровней с условиями, описанными выше — 200кГц. При чем, это именно частота линии данных. При софтварной реализации частота операций должна быть удвоенной.
nafikovr
какая еще софтовая реализация для spi? 10 уровней при 20кгц на spi будет 10мс период с 1мс дисретностью. что собственно 100Гц и 1000Гц описанных выше. больше в данном девайсе думаю не нужно. если настаиваете на 200кГц, то тоже частота далеко не высокая.
на досуге посмотрите на RGB LED панели с hub75 интерфесом (которые в рекламных «телевизорах» используюется). там та же реализация на сдвиговых регистрах.
BigBeaver
Самая обычная. Если аппаратных портов мало, делают софтварно, в чем проблема?.
Ах вот вы о чем. Но 100Гц это ужасно — смотреть невозможно на такое. Даже китайцы в интерьерку выше частоту ставят в разы (и все ранво плохо выглядит). Так и 10 уровней не дофига. Плавное угасание уже не сделаешь. Гугл говорит, что там отдельные каналы для яркости на большие пачки диодов (вообще-то это динамическая индикация, но можно и яркостью групп управлять). А вовсе не shiftPWM (хоть ничто и не мешает его туда впихнуть). Да даже вон на ГТ есть статья.nafikovr
таки у нас не интерьерка, а панель индикации
опять же все относительно. 10 уровней достаточно для плавного моргания, если требуется только индикация.
гугл говорит что там по три бита на пиксел (вкл/выкл для каждой компоненты) и этими тремя битами достигается полноцвет (насколько он возможен учитываю кривость примененных диодов). а то про что вы написали (вывод OE) для регулирования яркости обычно не применяется
BigBeaver
В любом случае сомнительное решение при том, что микроконтроллер для решаемых в посте задач стоит 25-50 центов, а итоговый функционал и гибкость выходят выше, как и модульность (центральному контроллеру не надо знать, как именно реализовано управление диодами).
myowndevice Автор
Одназначно на МК лучше и проще. А по яркости… надо больше запас. Человеческий глаз изменение яркости в 5 раз не замечает. Поэтому нужно 100-200 градаций. А сдвиговые регистры больше подходят когда нужна полная яркость. Просто тут смысл, для велокомпьютера, за счет яркости снизить энергопотребление. Шкалу итак хорошо видно, ну и вообще яркость вещь полезная. А потом если будет хотя бы 2 микросхемы сдвиговых регистров — то уже плата громоздкая будет и разводить сложнее.
BigBeaver
nafikovr
да я то что, я всегда за контроллер, когда он заменяет несколько корпусов. я как всегда на конкретный вопрос отвечаю.
BigBeaver
Это сложно, а ShiftPWM безумно требователен к процессорному времени и частоте. А без ШИМ сразу зубудьте об управлении яркостью. Дизайн платы тоже усложняется нехило. Кроме того, у сдвиговых регистров обычно не чистый SPI, и требуемое число управляющих линий будет 3-4 вместо 2, смотря, какие брать, и какой алгоритм управления. Опять же, больше действий ложится на ядро (чистый-то spi мы аппаратно гнать можем).
ploop
Да какие там действия, выплюнуть последовательность во время простоя?
BigBeaver
Зависит от основных задачь же. Т.к. я их не знаю, ответ от них абстрагирован.
Alexeyslav
595-е для светодиодов использовать нерационально, куда лучше использовать специальные регистры с токовым выходом под светодиоды — не нужны будут ограничивающие резисторы на каждый светодиод — всё сделают встроенные драйверы с всего одним внешним токозадающим резистором. Да и такие драйверы идут уже 16 битные, экономия на корпусах.
В преимущества регистров можно отнести масштабируемость — добавил регистр и у тебя уже строка 32 бита вместо 16.
Это не считая специализированных решений типа контроллера дисплея 16*16 или 24*8(RGB 8x8) светодиодных матриц с поддержкой 4 уровней градации яркости КАЖДОГО светодиода в отдельности и собственной памятью.
Nataly75
Резисторы ставят только трУсы.) Учитесь у братьев.)
myowndevice Автор
Ну вопрос в цене тоже. Индикатор должен быть недорогой. Ну а по сути, тут бери тоже любые припаивай.
BigBeaver
Ну рублей 200-300 + текстолит для обсуждаемого решения.