Привет всем!
Хочу рассказать историю появления одного устройства, на примере которого я начал учиться работать с электроникой. Возможно, это будет интересно тем, кто тоже хочет приобщиться к сообществу разработчиков электроники, но не знает, с чего начать.
Под катом я попробовал рассказать о том, что у меня получилось, как я это сделал и что хочется сделать дальше.
Когда-то достаточно давно я заказал с 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):
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-ти светодиодов.
#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 и там же ее развел. К сожалению, особой красотой схема не блещет – это была одна из первых моих схем, которые я развел самостоятельно. Там получилась куча перемычек. Основное ее достоинство, что она односторонняя и без металлизированных переходных отверстий. Однако, схема вполне рабочая.
Выглядела она вот так после изготовления:
Для того, чтобы хоть как-то улучшить вид схемы, а именно закрыть перемычки на лицевой стороне, я сделал накладку из стеклотекстолита с отверстиями под светодиоды.
В качестве последнего шага, написал скетч для Arduino, который бы выводил разные смайлики.
Скачать схему и разведенную плату, а также скетч с программой можно тут.
В моем скетче разные виды смайликов задаются с помощью шестнадцатеричного кода. Каждый раз «руками» считать этот код мне было лень, поэтому я написал дополнительную программу на Delphi, где можно визуально отметить те светодиоды, которые нужно зажечь в смайлике и программа сама генерирует код смайла. Интерфейс программы выглядит вот так:
Исходный код программы на Delphi и саму программу для генерации смайликов можно взять тут.
Пока я писал и отлаживал программу для смайлика, я уже начал задумываться о том, как сделать вторую часть схемы. Не будешь же ходить с платой Arduino и воткнутой туда платой «смайлика» на вечеринке или носить ее в таком виде в качестве брелка. На этапе отладки скетча, она у меня просто подключалась к плате Arduino и лежала на столе.
Что получилось дальше, я попробую рассказать в следующей части статьи.
Автор: ildmitry