Думаю, каждый сталкивался с нехваткой выводов у выбранного контроллера. Принципиальных путей решения данной проблемы ровно два: менять контроллер на более многоногий или менять схему, чтобы упихнуться в существующие ноги.
Например, классика жанра — кнопки. Когда их две-три, то проще всего повесить каждую на свою ногу, особенно если на этих ногах есть внешнее прерывание. Тогда и работать с ними одно удовольствие. А если кнопок больше десятка? Если идти по первому пути, то с кличем «больше ножек!» выбираем какой-нить TQFP64 и оккупирем два порта. У такого решения есть очевидный плюс — каждая кнопка анализируется независимо от других, поэтому возможны любые аккорды. Минусы тоже очевидны: много ног ушло почти в никуда.
Второй путь — преобразовать схему так, чтобы подсократить количество занимаемых ног. Тут простора для творчества побольше. Начиная от PC-style (отдельный контроллер, который занимается опросом клавиатуры и преобразует нажатие клавиш в удобоваримый последовательный код, хоть в 1-wire) и сдвиговых регистров (как на джойстиках Dendy) заканчивая клавиатурами на резистивных делителях, подключаемых к АЦП. Весь вопрос — в стоимости.
Варианты с матрицей клавиш уже рассматривались, сдвиговый регистр подключали, а вот клавиатура на делителях осталась как-то незаслуженно забыта. Восполним пробел.
Первое, что сразу приходит в голову — поставить цепочку резисторов и кнопками коротить их на землю. Примерно так:
Посмотрим, как оно работает.
- Если не нажата ни одна кнопка, то выход Vout подтянут к Vref через резистор R1, соответственно Vout = Vref.
- Если нажата кнопка S1, то она тянет Vout к земле, и на выходе Vout = 0.
- Если нажата кнопка S2, то схема преобразуется в резистивный делитель: верхнее плечо образует резистор R1, нижнее плечо — R2. Поскольку номиналы этих резисторов равны, то на выходе Vout = Vref / 2.
- Если нажата кнопка S3, то в нижнее плечо включается резисторы R2 и R3, и коэффициент деления стал 2/3.
Сведем данные в таблицу (исходим из 8-битного АЦП, т.е. при Vout = Vref его значение 255):
Понятное дело, что если взять не одинаковые резисторы, то можно добиться более равномерного распределения. Но, используя принцип Оккама (Не следует множить сущее без необходимости), мы ставим то, что уже закуплено в невообразимых количествах, не расширяя номенклатуру. По динамике значений видно, что уже к 10 кнопке мы не сможем четко распознавать кнопки, а учитывая, что резисторы у нас не идеальные (есть расброс значений), то и калибровать придется каждый экземпляр клавиатуры. Да, можно задействовать несколько входов АЦП, повесив на каждый по своей клавиатурке (благо на той же меге из 8 штук), но мы же не ищем легких путей.
На просторах интернета нашел улучшенную схему построения клавиатуры на резисторных делителях. Все следы ведут на сайт http://www.edn.com, но там я не нашел оригинала статьи.
Если посмотреть глобально, то принцип остался такой же — одно плечо делителя неизменно, другое формируется из комбинации резисторов в зависимости от нажатых кнопок. Весь пафос в том, что подобрав значения резисторов, можно расширить диапазон изменения напряжения Vout (например, в прошлой схеме напряжения меньше чем Vref/2 получить не удавалось).
Посмотрим подробнее на комбинации резисторов. При нажатии кнопки в верхнее плечо делителя подключается от 0 до 3 резисторов Ra, Rb, Rc и от 0 до 3 резисторов Rd, Re, Rf. Например, при нажатии кнопки S(1,2) соберется такая цепочка: Ra-S(1,2)-Re-Rf
Для упрощения расчетов примем:
Ra = Rb = Rc = R1, Rd= Re = Rf = R2
Формула для расчета выходного напряжения примет вид:
, где x,y – обозначения в скобках соответствующей кнопки (S(x,y)).
Для того, чтобы не перепутать кнопки, соотношение резисторов R1/R2 должно быть не менее 4.
Составим табличку значений АЦП для нажатий кнопки S(x,y):
Из таблички видно, что кнопки различимы, даже с учетом 1% погрешности резисторов.
Мультиплексирование вывода
Теперь посмотрим, какие способы экономии ножек при подключения светодиодов придумал сумрачный гений.
Способ первый, он же простейший — один светодиод — один вывод. Все просто, понятно и мило. Ну и токоограничительный резистор не забыть. По одному на светодиод. Плюсы такого решения — чистейшей воды статика. Ничего не мерцает, можно зажигать в любой комбинации.
Начинаем мультиплицировать.
К одной ножке можно подключить сразу два светодиода, один катодом на землю, другой — анодом на питание. Естественно, каждый через свой токоограничительный резистор. Подобная схема разбиралась DiHaltом в разделе «отладка». В чем пафос — когда ножка процессора находится в состоянии «1», то горит нижний светодиод. Когда «0» верхний. Когда ножка находится в состоянии «input» (High-Z), то не горит ни один светодиод. На самом деле могут тускло светиться оба, но ведь всегда можно подобрать сопротивление резисторов так, чтобы напряжения на оба светодиода не хватало.
Итак, коэффициент мультипликации 2 (на один вывод можно посадить два светодиода).
Уже лучше. Но обратим внимание, что оба светодиода гореть одновременно уже не смогут. Поэтому, чтобы у пользователя создалось впечатление, что горят оба светодиода, надо их переключать с частотой не менее 50Гц. При этом получается, что половину времени горит один светодиод, половину — другой. Из-за того, что у светодиодов практически нет инертности, то и яркость свечения светодиода визуально упадет в два раза.
Едем дальше. А давайте-ка организуем матрицу светодиодов. Посмотрим на схему включения стандартной светодиодной матрицы 8х8:
Что у нас тут? Светодиоды собраны в строки и столбцы. Если подать «1» в столбец, а одну (или несколько) строк соединить с землей, то загорятся светодиоды на пересечении этихстрок и столбца. Естественно, если допустимый ток через ножку процессора не позволяет кормить сразу несколько светодиодов, то его всегда можно умощнить транзистором. Ну или зажигать по одному светодиоду за раз. Только это совсем грустно будет.
Итак, подобьем итоги — на 16 ножек получается 64 светодиода. Коэффициент мультипликации 4. И с увеличением матрицы он будет расти, ведь с применением 2N ножек мы сможем подключить N*N светодиодов.
Обратим внимание, в каком режиме работают задействованные выводы: столбцы — либо «1» либо отключены, строки — либо «0», либо отключены. Как-то недогружены. Наверно этой мыслью задался дядька Чарли Аллен (или Эллен, если правильно произносить). И предложил схему, которая с его легкой руки стала называться «Чарлиплексинг». В чем суть? Предложение такое — между каждой парой ножек контроллера подключить по паре встречно-параллельных светодиодов. Опять же, подобная схема рассматривалась DiHaltом в курсе обучения, но тогда она так гордо не называлась.
Как оно работает? Если на ногу 1 подать единичку, а на ногу 2 — нолик, то загорится светодиод Led1, если подать уровни наоборот, то загорится Led2. Все вроде просто. Посчитаем — с помощью N ножек мы можем управлять N*(N-1) светодиодами. Это почти в два раза лучше, чем в случае с полной матрицей. Но если в матрице мы могли зажечь целиком колонку, то тут такой фокус пройдет с трудом — выход контроллера не потянет. Например, мы ногу 2 опустили в ноль, а 1 и 3 — в единицу. При этом загорятся светодиоды Led1 и Led4 (одновременно, без всякого мухлежа), но через ногу 2 пойдет двойной ток. А если ножек будет 8, то и восьмикратный. Что делать? Конечно же подпирать транзистором.
Что тут? Практически схема матричного мультиплицирования, но с одним но — колонки подключены через транзисторы к тем же выводам строк. Соответственно, подав «1» на строку, мы тем самым подаем и «1» на соответствующую колонку (открыв транзистор). При этом мы можем зажечь всю колонку, мощи транзистора хватит.
Коэффициент мультипликации здесь — как и при применении чарлиплексинга, а частота обновления (а значит и яркость) может быть на порядок лучше.
Ну и завершающий шажок, чтобы совсем порвать мозг — жлобоплексинг. Попробуем подключить к трем выводам процессора 12 светодиодов (!).
Разберемся. Как подключены светодиоды D2-D7 должно быть понятно. Классический чарлиплексинг. А вот остальные — это уже интересней.
Резисторы R1, R2, R4 образуют делитель напряжения. При этих номиналах разница потенциалов на резисторе R2 (а соответстенно и между базами транзисторов) будет чуть больше чем 1.6 вольта. Учитывая, что между эммитерами транзисторов подключена минимум цепочка из двух светодиодов, то этого напряжения недостаточно, чтобы открыть транзистор. А теперь представим, что на один из выводов процессора подали логическую «1». При этом напряжения достаточно, чтобы скомпенсировать падение напряжения на нижнем желтом диоде, нижний транзистор открывается и через светодиод течет ток, зажигая его. Аналогично зажигаются и верхние, красные светодиоды (D8-D10), только в этот раз на нужные выходы подается логический «0».
Когда мы управляем внутренними шестью светодиодами (D2-D7) то на одной из ног у нас обязательно будет «1», а на какой-то другой «0». При этом оба транзистора закрыты, соответственно ни верхние, ни нижние светодиоды не горят.
Итого — N*(N-1) + 2N = N*(N+1)
По-моему, чемпион по жлобоплексингу определен 🙂
Оцените статью!