Светодиодный «смайлик». Технология мультиплексирования методом «Чарли»

в 10:00, , рубрики: arduino, печатная плата, Программирование, светодиоды, сделай сам

Привет всем!

Хочу рассказать историю появления одного устройства, на примере которого я начал учиться работать с электроникой. Возможно, это будет интересно тем, кто тоже хочет приобщиться к сообществу разработчиков электроники, но не знает, с чего начать.

светодиодный смайлик

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

Когда-то достаточно давно я заказал с ebay.com Arduino контроллер, который длительное время валялся у меня в столе. В то время я не занимался электроникой и все не решался начать с ней знакомство. И вот наступил момент, когда я все-таки решил опробовать Arduino. К этому времени я прочитал множество форумов и «первых шагов» по использованию данного контроллера, поэтому уже не так боялся что-нибудь спалить при сборке первой схемы (готовых arduino shield'ов у меня не было и нет до сих пор).

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

Особенно мне понравился Arduino LOL-shield. Начал больше читать про него и посмотрел схему.

LOL Shield

К этому моменту в моем багаже знаний и умений уже была самостоятельно изготовленная плата Arduino Single Side с помощью технологии ЛУТ. Самое интересное, что она у меня сразу после сборки заработала, и я до сих пор не понимаю огромное количество людей, которые собирали ту же самую плату по той же самой схеме и в комментариях к статье по ее сборке и запуску жаловались, что она у них не работает.

Одним словом, я решил самостоятельно сделать такой же shield.

Мультиплексирование методом «Чарли»

После изучения схемы LOL shield'а выяснилось, что работает он на основе метода Чарлиплексирования. Если поискать в интернете, то находится достаточно большое количество информации о том, что это за метод и как его можно использовать. Я попробую в нескольких словах рассказать о нём.

В классическом варианте, плюс светодиода (через нагрузочный резистор) подключается к цифровому выходу Arduino, а минус – к земле. Схема подключения показана ниже:

Подключение светодиода к Arduino

При таком подключении на цифровые контакты контроллера (14 выводов) можно подключить всего 14 светодиодов. Можно использовать и другие схемы включения светодиодов, например, с помощью сдвиговых регистров и тогда количество светодиодов можно легко увеличить.

Метод Чарлиплексирования позволяет подключить до N*(N-1) светодиодов на N выводов микроконтроллера. То есть если у нас 2 вывода микроконтроллера, то подключить можно 2 светодиода, если 3 выхода — то уже 6 светодиодов, 4 — 12 светодиодов и т. д.
Схемы включения светодиодов будут следующие:

image
image

Из этих схем видно как включаются светодиоды и как, добавляя задействованные контакты, увеличивается количество подключенных светодиодов.

Придумал эту схему инженер Чарли Аллен в 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<n;i++) {
    pinMode(pin[i],INPUT);
    digitalWrite(pin[i],LOW);
  }
}

void loop() {
    for (i=0;i<n;i++) {    // в цикле обходим по очереди каждый PIN схемы и устанавливаем их в такое состояние, 
                                  // чтобы зажечь один из светодиодов
      pinMode(pin[i],OUTPUT);
      for (j=0;j<n;j++) {
        if (i==j) { continue; }
        pinMode(pin[j],OUTPUT);
        digitalWrite(pin[j],HIGH);
        delayMicroseconds(300);
        digitalWrite(pin[j],LOW);
        pinMode(pin[j],INPUT);
      }
      pinMode(pin[i],INPUT);
    }
}

Шесть светодиодов мне показалось мало. Все-таки изначально хотелось сделать LOL-shield. Увы, моей мечте о самостоятельной сборке LOL-shield в домашних условиях так и не удалось сбыться – развести одностороннюю плату с таким количеством светодиодов просто невозможно. Посмотрев оригинал платы у производителя, я увидел, что там плата двухсторонняя, а для минимизации переходные отверстия реализуются прямо в местах, куда запаиваются светодиоды. В домашних условиях сделать металлизацию переходных отверстий очень сложная задача.

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

Схему я нарисовал в EagleCAD и там же ее развел. К сожалению, особой красотой схема не блещет – это была одна из первых моих схем, которые я развел самостоятельно. Там получилась куча перемычек. Основное ее достоинство, что она односторонняя и без металлизированных переходных отверстий. Однако, схема вполне рабочая.

Выглядела она вот так после изготовления:

image

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

image

В качестве последнего шага, написал скетч для Arduino, который бы выводил разные смайлики.

Скачать схему и разведенную плату, а также скетч с программой можно тут.

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

image

Исходный код программы на Delphi и саму программу для генерации смайликов можно взять тут.

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

Что получилось дальше, я попробую рассказать в следующей части статьи.

Автор: ildmitry

Источник


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js