[Из песочницы] Светодиодный «смайлик». Технология мультиплексирования методом «Чарли»
Привет всем! Хочу рассказать историю появления одного устройства, на примере которого я начал учиться работать с электроникой. Возможно, это будет интересно тем, кто тоже хочет приобщиться к сообществу разработчиков электроники, но не знает, с чего начать.
Под катом я попробовал рассказать о том, что у меня получилось, как я это сделал и что хочется сделать дальше.Когда-то достаточно давно я заказал с ebay.com Arduino контроллер, который длительное время валялся у меня в столе. В то время я не занимался электроникой и все не решался начать с ней знакомство. И вот наступил момент, когда я все-таки решил опробовать Arduino. К этому времени я прочитал множество форумов и «первых шагов» по использованию данного контроллера, поэтому уже не так боялся что-нибудь спалить при сборке первой схемы (готовых arduino shield’ов у меня не было и нет до сих пор).
Вначале, как и все начинающие, поморгал светодиодами, подключил пару кнопок, попробовал зажигать светодиоды от нажатия на них. Но хотелось двигаться и развиваться дальше. Смотрел в интернете на разные устройства, которые собирают с использованием данного контроллера — «облизывался». Покупать что-то мне не хотелось, в основном останавливало время доставки покупок из-за границы, так как купить что-то интересное можно было только там.
Особенно мне понравился Arduino LOL-shield. Начал больше читать про него и посмотрел схему.
К этому моменту в моем багаже знаний и умений уже была самостоятельно изготовленная плата Arduino Single Side с помощью технологии ЛУТ. Самое интересное, что она у меня сразу после сборки заработала, и я до сих пор не понимаю огромное количество людей, которые собирали ту же самую плату по той же самой схеме и в комментариях к статье по ее сборке и запуску жаловались, что она у них не работает.
Одним словом, я решил самостоятельно сделать такой же shield.
Мультиплексирование методом «Чарли«После изучения схемы LOL shield’а выяснилось, что работает он на основе метода Чарлиплексирования. Если поискать в интернете, то находится достаточно большое количество информации о том, что это за метод и как его можно использовать. Я попробую в нескольких словах рассказать о нём. В классическом варианте, плюс светодиода (через нагрузочный резистор) подключается к цифровому выходу Arduino, а минус — к земле. Схема подключения показана ниже:
При таком подключении на цифровые контакты контроллера (14 выводов) можно подключить всего 14 светодиодов. Можно использовать и другие схемы включения светодиодов, например, с помощью сдвиговых регистров и тогда количество светодиодов можно легко увеличить.
Метод Чарлиплексирования позволяет подключить до N*(N-1) светодиодов на N выводов микроконтроллера. То есть если у нас 2 вывода микроконтроллера, то подключить можно 2 светодиода, если 3 выхода — то уже 6 светодиодов, 4 — 12 светодиодов и т. д. Схемы включения светодиодов будут следующие:
Из этих схем видно как включаются светодиоды и как, добавляя задействованные контакты, увеличивается количество подключенных светодиодов.
Придумал эту схему инженер Чарли Аллен в 1995 году. Основывается схема на 3-х состояниях выводов микроконтроллера: 5В (HIGH), 0В (LOW) и состояние INPUT. Когда ножка микроконтроллера находится в состоянии INPUT, то так как включается подтягивающий резистор, она как бы полностью отключается от схемы и ток через нее не течет. Можно свести возможные состояния всех светодиодов для схемы с шестью светодиодами в таблицу:
Светодиод Pin1 Pin2 Pin3 LED1 LOW HIGH INPUT LED2 HIGH LOW INPUT LED3 INPUT HIGH LOW LED4 INPUT LOW HIGH LED5 LOW INPUT HIGH LED6 HIGH INPUT LOW То есть для того, чтобы зажечь светодиод LED1 нужно на выводы микроконтроллера Pin1, Pin2, Pin3 установить состояния указанные в таблице для этого светодиода.
Программа в среде Arduino IDE для того, чтобы зажечь светодиод LED1 будет выглядеть следующим образом (схема подключена на цифровые выводы Arduino 11, 12, 13):
Текст скэтча для среды Arduino IDE int pin1 = 11; int pin2 = 12; int pin3 = 13;
void setup () { pinMode (pin1, INPUT); // устанавливаем все выводы в состояние «отключенных от схемы» pinMode (pin2, INPUT); pinMode (pin3, INPUT);
pinMode (pin1, OUTPUT); // установим нужные выводы в состояние для включения светодиода pinMode (pin2, OUTPUT); digitalWrite (pin2, HIGH); // включим светодиод }
void loop () {
} После загрузки этой программы в микроконтроллер и ее запуска должен загореться светодиод LED1 в схеме.Небольшое замечание к схеме: у меня на схеме отсутствуют токоограничивающие резисторы на светодиодах. Они нужны, так как ток через светодиоды течет такой же, как и при их классическом подключении. Но так как задействованы две ноги контроллера для включения светодиода, то вместо резистора на 100Ом на плюсовую ногу светодиода я ставлю резисторы по 50Ом на каждую ногу контроллера. Может быть это и не совсем правильно, но по крайней мере у меня при такой схеме светодиоды достаточно длительное время уже работают, пока ни один из них не вышел из строя.
Из таблицы выше и приведенного примера понятно, что одновременно при таком включении можно зажечь только 1 светодиод. Для того, чтобы обеспечить одновременную работу нескольких светодиодов используется быстрое переключение работающих светодиодов в схеме. Человеческий глаз не успевает увидеть это переключение и создается впечатление, что одновременно горят несколько светодиодов.
Приведу пример, как одновременно «зажечь» все светодиоды в схеме из 6-ти светодиодов.
Текст скэтча для среды Arduino IDE #define n 3 // для удобства работы запишем порты с подключенными светодиодами в массив int pin[n]={11,12,13}; int i, j;
void setup () {
// устанавливаем все порты в состояние INPUT
for (byte i=0; i void loop () {
for (i=0; i Схему я нарисовал в EagleCAD и там же ее развел. К сожалению, особой красотой схема не блещет — это была одна из первых моих схем, которые я развел самостоятельно. Там получилась куча перемычек. Основное ее достоинство, что она односторонняя и без металлизированных переходных отверстий. Однако, схема вполне рабочая. Выглядела она вот так после изготовления: Для того, чтобы хоть как-то улучшить вид схемы, а именно закрыть перемычки на лицевой стороне, я сделал накладку из стеклотекстолита с отверстиями под светодиоды. В качестве последнего шага, написал скетч для Arduino, который бы выводил разные смайлики. Скачать схему и разведенную плату, а также скетч с программой можно тут. В моем скетче разные виды смайликов задаются с помощью шестнадцатеричного кода. Каждый раз «руками» считать этот код мне было лень, поэтому я написал дополнительную программу на Delphi, где можно визуально отметить те светодиоды, которые нужно зажечь в смайлике и программа сама генерирует код смайла. Интерфейс программы выглядит вот так: Исходный код программы на Delphi и саму программу для генерации смайликов можно взять тут. Пока я писал и отлаживал программу для смайлика, я уже начал задумываться о том, как сделать вторую часть схемы. Не будешь же ходить с платой Arduino и воткнутой туда платой «смайлика» на вечеринке или носить ее в таком виде в качестве брелка. На этапе отладки скетча, она у меня просто подключалась к плате Arduino и лежала на столе. [embedded content] Что получилось дальше, я попробую рассказать в следующей части статьи.