Зачем он нужен
Недавно я писал статью про самодельный 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 для отображения картинок.
В общем, идей как это можно использовать — много.
На github, как обычно плата, программа, реализация протокола 1-wire и динамической индикации. Кому нужно, можете использовать в своих проектах.
Автор: myowndevice