Чарлиплексинг светодиодов давно известен и широко используется. Чарлиплексинг кнопок мало известен и практически не используется.
Давайте разберёмся, можно ли применить чарлиплексинг кнопок в джойстике.
В джойстиках используются несколько способов подключения кнопок без применения дополнительных микросхем.
При прямом подключении кнопок к N контактам Ардуино можно подключить N кнопок, а количество проводов к N кнопкам равно N+1 (+1 - это GND). Все контакты Ардуино находятся в режиме ввода с внутренней подтяжкой к 1 (PULLUP):
В прямоугольной матрице кнопок одна часть контактов матрицы (ряды) являются передающими, а другая часть (колонки) являются приёмными:
Прямоугольная матрица считывается так:
пины колонок устанавливаются в режим ввода, с внутренней подтяжкой к 1.
пины рядов устанавливаются в режим вывода.
на один пин рядов устанавливается 0, на остальные пины устанавливается 1.
считываются пины колонок. У нажатой кнопки из ряда считается 0, у отпущенной кнопки из ряда считается 1.
осталось повторить считывание для остальных рядов кнопок.
В прямоугольной матрице кнопок к N контактам Ардуино можно подключить до N*N/4 кнопок.
Диоды в прямоугольной матрице нужны для возможности правильного считывания одновременно нажатых двух или более кнопок из разных рядов, чтобы 0 из установленного ряда не попал через пару нажатых кнопок в другой ряд, вызвав этим ложное срабатывание кнопок.
Кольцевая матрица
Разделение контактов матрицы на передающие и считывающие слишком расточительно. Это разделение сложилось исторически в давние времена, когда ещё использовались отдельные микросхемы - регистры вывода и регистры ввода. В настоящее время любой контакт микропроцессора может работать и на ввод и на вывод и умеет переключать режим ввода/вывода мгновенно во время работы. Это позволяет создать кольцевую матрицу кнопок - матрицу, у которой все контакты равноправны.
При считывании кнопок по очереди один из контактов кольцевой матрицы работает на вывод - "говорит ", а все остальные работают на ввод - "слушают".
Из этой схемы ещё не видно никакого кольца, но зато понятно, почему я раньше называл кольцевую матрицу "двойной треугольной матрицей".
Обозначим пару кнопок и пару диодов в виде кружка с двумя точками - кнопками:
Тогда кольцевую матрицу c 2, 3, 4 или 5 контактами можно изобразить в виде:
Теперь видим, что все контакты матрицы равноправны и расположены по кольцу.
Кольцевая матрица считывается так:
один пин устанавливаются в режим вывода, на нём устанавливается 0.
все остальные пины устанавливаются в режим ввода, с внутренней подтяжкой к 1.
считываются установленные на ввод пины. У нажатой кнопки, если её диод подключен катодом в сторону пина, находящегося сейчас в режиме вывода, считается 0. У отпущенной кнопки считается 1.
осталось повторить считывание для остальных пинов, ещё не бывших в режиме вывода.
В кольцевой матрице кнопок к N контактам Ардуино можно подключить до N*(N-1) кнопок.
О защите от ложного срабатывания кнопок
В кольцевой матрице кнопок обязательно использование внешних PULLUP подтягивающих резисторов на каждом пине матрицы, внутренних PULLUP резисторов 10kOm в Ардуино недостаточно. Внешние PULLUP резисторы вместе с диодами матрицы обеспечивают защиту от ложного срабатывания кнопок при одновременном нажатии двух и более кнопок.
Защита основана на том, что прямое падение напряжения на одном кремниевом диоде меньше порогового напряжения входов Ардуино 1,43 ... 1,57V, а прямое падение напряжения на двух и более последовательно включенных кремниевых диодах больше этого порога, при условии правильного выбора номинала PULLUP резисторов.
Я определил, что для Ардуино с питанием 5V (USB) сопротивление PULLUP резисторов должно быть в диапазоне 0,82 ... 3,75 kOm. Я выбрал средний стандартный номинал из этого диапазона - 2 kOm.
Диоды могут быть только кремниевые, любого типа. Я использовал диоды LL4148. Это SMD аналог диодов 1N4148 (КД522).
Не годятся диоды германиевые и Шоттки, у них слишком малое прямое падение напряжения.
О максимальном количестве подключенных кнопок
Как я уже говорил выше, с помощью N контактов (проводов) можно подключить:
до N-1 кнопок (-1 - это провод GND) - для прямого (линейного) подключения кнопок.
до N*N/4 кнопок - для прямоугольной матрицы.
до N*(N-1) кнопок - для кольцевой матрицы.
Насколько велика разница, показывает следующая таблица и график.
Синяя кривая (К/П) показывает отношение количества подключенных кнопок при кольцевой матрице к количеству подключенных кнопок при прямоугольной матрице. Видим, что с увеличением количества пинов это отношение стремится к 4.
Впечатляющий результат!
Об особенностях разводки кольцевой матрицы
Из схемы кольцевой матрицы видим, что к каждому пину Ардуино подключено гораздо больше кнопок и диодов, по сравнению с прямоугольной матрицей. Это может усложнить разводку печатной платы или навесной монтаж матрицы.
Поэтому сейчас я расскажу банальные вещи, о которых часто не задумываются новички.
Чтобы упростить разводку и монтаж, нужно вспомнить о том, что последовательно соединённые элементы можно менять местами. Работа схемы от этого не изменится. Новички об этом часто забывают.
В прямоугольной матрице каждая кнопка всегда включена последовательно с диодом. Их можно поменять местами. Следующие две схемы эквивалентны в работе:
Кольцевая матрица состоит из пар кнопок с диодами. Для таких пар следующие четыре схемы эквивалентны:
Замена диодов с кнопками местами может упростить разводку или облегчить навесной монтаж, например, если использовать выводы кнопок как монтажные стойки.
Вот, для примера, односторонняя PCB кольцевой матрицы на 5 пинов, 20 кнопок:
В этой матрице тоже некоторые диоды (LL4148) с кнопками поменялись местами, для удобства разводки.
Видео
Кольцевая матрица (чарлиплексинг кнопок) позволяет увеличить количество кнопок в несколько раз, по сравнению с прямоугольной матрицей.
Кольцевая матрица позволяет создать джойстик с большим количеством кнопок без дополнительных микросхем.
Для проверки кольцевой матрицы разработан скетч RingButtonBox, о котором вы узнаете здесь:
Настройки скетча для кольцевой матрицы
Обсудить: Кольцевая матрица (чарлиплексинг кнопок)
Удачи!
#joystick #ringmatrix #charlieplexing #ringbuttonbox #diy #чарлиплексинг #матрица