В предыдущей статье мы реализовали программный UART в ATtiny13. Чтобы показать целесообразность применения программного UART в ATtiny13 пришло время заюзать этот интерфейс в реальном устройстве.
Выбор реального устройства пал на устройства ввода – keypad. Кто не в курсе – это набор (матрица) клавиш, часто 3х4 (а-ля телефон). Такие кейпады продаются в радиомагазинах.
Вот купил один:
Также заиметь такой кейпад можно способом расковыривания ненужной оргтехники (телефоны, калькуляторы – все пойдет в ход!) или, брутально, отпилить ножовкой по металлу кусок от ненужной «клавы» для PC.
Для классического варианта обслуживания матрицы клавиш нужно 3+4=7 линий (ножек микроконтроллера), но у ATtiny13 есть только 5 (не считая сброса), кроме того, одна ножка нам нужна для передачи сообщений по UART – итого 4. Не сходится. Но ничего, мы подключим keypad к ATtiny13 нестандартно! Используя АЦП микроконтроллера, мы обойдемся всего тремя ножками. Вот так:
На схеме не указан разъем для программирования, но я надеюсь Вы знаете куда его приткнуть. Пунктиром показаны не обязательные элементы, они могут понадобится в случае больших помех на линиях АЦП и не надежного срабатывания клавиш (конденсаторы подобрать экспериментально, но не более 0.01мкФ).
Идея такого подключения матрицы клавиш заключается в том, что на линиях строк, при помощи резисторного делителя напряжения, создаются разные потенциалы. При нажатии на клавишу соответствующий потенциал прикладывается к определенной линии столбца, где он оценивается соответствующим АЦП. По результатам оценки потенциала можно однозначно сделать вывод, о том какая клавиша нажата.
Раз мы обошлись всего тремя ножками для обслуживания keypad’а оставшеюся ножку используем для световой и звуковой сигнализации – клавиатура у нас будет «пикать» и красиво светить светодиодиком :).
В устройстве (прошивке) реализовано:
— устранение дребезга контактов;
— автоповтор при удержании клавиши;
— озвучивание нажатой клавиши;
— Shift-режим – расширение возможностей кейпада;
— индикация включения Shift-режима.
Работает устройство следующим образом:
При нажатии на клавишу, через UART, передается соответствующий символ (пример: нажали клавишу 1 – по UART передался символ «1»). При длительном удержании клавиши включается автоповтор — по UART непрерывно передаются символы нажатой клавиши.
При нажатии на любую из клавиш подается звуковой сигнал – «пиканье».
При нажатии клавиши «*» включается Shift-режим – загорится светодиод. В Shift-режиме при нажатии на клавиши по UART будут передаваться символы латиницы (пример: нажали клавишу 1 –по UART передался символ «A»; 2 – «B»; 3 – «C» и т.д.). Это сделано для того, чтобы расширить функциональность кейпада. Например, при помощи кейпада в нормальном режиме вводятся данные, а в Shift-режиме он используется для навигации по меню (по аналогии с Num Lock ПиСишной клавиатуры). Клавиши «*», «0» и «#» передают по UART одни и те-же символы в обоих режимах (реализация общих для режимов клавиш, например: если клавишу «#» Ваш проект будет воспринимать как «Enter» , то этот «Enter» будет работать в любом режиме). Повторное нажатие «*» выключит Shift-режим.
Настройки передатчика UART:
— Скорость — 9600;
— Количество бит данных — 8;
— Стоп-бит – 1;
— Бит четности – нет.
(Baud Rate: 9600, 8 Data, 1 Stop, No Parity).
А вот и сама прошивка для ATtiny13:
047-T13-Key-to-UART.zip (2923 Загрузки)
047-T13-fusebits.png (2899 Загрузок)
Выводы:
Реализовав драйвер клавиатуры на ATtiny13 мы освободили: 6 ножек микроконтроллера Вашего проекта; как минимум, один таймер; память и процессорное время на обработку матрицы. Теперь для того, чтобы подключить клавиатуру к вашему проекту достаточно одной ножки микроконтроллера и минимальной обработки принятых символов.
Смотрим демонстрацию устройства:
048-Демонстрация: 047-Драйвер матричной клавиатуры 3х4 на ATtiny13 с UART выходом.
P.S.
Программа драйвера клавиатуры вышла размером в 140 слов — это всего 30% доступной памяти — жалко! Если есть какие пожелания, в плане чего добавить, пишите, будем добавлять!
Прикольно! Нашел что надо теперь можно убрать не нужные функции сделать так чтобы устройство самого общаться с телефонной линией и можно будет воскресить кучу старых стационарных телефонных аппаратов (нужны по работе)…
Только код переделать под себя.
Большое спасибо за интересную с практической точки зрения, и легкую в поторении конструкцию. Это была моя первая конструкция на микроконтроллере. Я делал с автономным питанем от батареи CR2032 (батерейный отсек идеально вписался на имеющиюся макетку). Боялся что ничего не получиться, потому что входы АЦП привязаны к уровню напряжения +5В, и придеться как-то править исходник, но даже с севшей батарейкой (2.7В) все прекрасно работает, разве что бузер очень тихо пикает. Ниже 2.7В уже начинаються кракозябры вместо цифер и символов, или вообще не работает. Вобщем респект. Постараюсь еще что-то повторить, ресурс супер, добавил в закладки, буду советовать всем инересующимся знакомым.
Фото того, что получилось: http://piccy.info/view3/6212113/cdf84d3f0f3c7daac4b6b25769f8567b/
Конструкция собрана для личного опробования такого метода создания клавиш и конечно не претендует на «самые лучшие клавиши года» :). Большого от нее не ожидал, но конструкция удивила надежной работой даже с потрепанными клавишами.
Все таки возьмите тини13
Attiny12V пойдёт?
ИМХО ненадёжная конструкция. Иза Куда проще поставить парочку регистров. И опрашивать эту конструкцию динамически. Сюда же можно добавить динамическую индикацию. У мя так в частотометре сделано.
По ножкам совместимы, но как поведет себя прошивка — это нужно пробовать.
А на Tiny15 такое можно?
Теоретически можно, но если смысл в нем? На клаве будет поудобней …
Или есть какие-то особые соображения?
А возможно по этой схеме сделать джостик для компа? чтобы нажатие кнопки определялось в опциях клавиатуры в игре
Уведомление: калькулятор битов « Эхо блогосферы
Наверно, подожду исходник на Си.
А то что-то исходник на AB не идет.
Исходник выложил (вродь там все нормально закоментированно).
А следующим проектом будет драйвер линейки семисегментных цифровых индикаторов (тоже на ATtiny13). Есть неплохая идея реализации.
Конечно.
А пока если не сложно выложи программу в Algorithm Builder.
Какой следующий проект?
Исходника на С не существует, так как программа написана в Algorithm Builder. Но, в качестве изучения С, мне самому будет интересно реализовать то-же самое на С. Поэтому, чуть позже, когда завершу следующее устройство, я попробую наваять программу на С и выложить ее здесь. Так пойдет?
хотелось бы увидеть весь исходник описанного проекта.
— работа с клавиатурой через АЦП
— устранение дребезга контактов;
– автоповтор при удержании клавиши;
– озвучивание нажатой клавиши;
– Shift-режим – расширение возможностей кейпада;
– индикация включения Shift-режима.
Имеется в виду саму процедуру работы с клавиатурой через АЦП?
Интересная идея. Надо будет подумать над этим. Заделать брелок-ключ с паролями?
А код на Си для Mega8 можно?
Возможно ли использовать «лишний» пин для тактирования и подключить клавиатуру к PS/2 ? Тогда если останется память можно будет на доп. функциональные клавиши забить свои пароли, к примеру)