Столкнулся с проблемой нехватки портов контроллера для управляющих клавиш. Клавиатура аж 4×3. Можно использовать различные интерфейсы последовательной передачи, но есть вариант и по-проще.
У меня был в распоряжении один аналоговый пин разрешением 10бит. Что нам это дает? — 1024 различных состояний на входе, по-другому, в теории, мы можем подключить 255 кнопок, используя резисторы. 😀 Но в реальности из-за помех и неточностей количество снизится до ~30.
Примерная схема:
Благодаря резисторам разного номинала, каждая кнопка будет иметь свой уникальный уровень сигнала, по которому мы сможем ее определить. Важно: сопротивления резисторов R1, R3, R4, R5 должны быть меньше сопротивления R2. (иначе сигнала не будет) Кн1=R1; Кн2=R3; Кн3=R4; … Еще один вариант:
Здесь же используются резисторы одного номинала, но подключенные последовательно. Кн1=max; Кн2=R1; Кн3=R1+R2. Суть та же.
Использование
Для начала подключите собранную схему к МК с программой, выводящей состояние аналогово порта. Нажимайте клавиши и определите два граничных значения каждой кнопки(от и до).
В дальнейшем опрос кнопок клавиатуры будет происходить простыми условиями:
1 2 3 4 5 | int a = analogRead(A2); //Читаем состояния if (a>202 && a<403) {} //Нажата кнопка1 if (a>600 && a<768) {} //Нажата кнопка2 ....... |
У меня получилась такая штука:
Серьезный недостаток конструкции: нельзя нажать одновременно две и более кнопок.