Перевод даташита AVR245: Code Lock with 4x4 Keypad and I2C LCD on a tinyAVR [1], посвященного практической реализации кодового замка на микроконтроллере AVR.
Особенности кодового замка:
• Пример приложения идеально демонстрирует эффективное использование портов микроконтроллера, так что кодовый замок можно сделать на микроконтроллере с небольшим количеством выводов (14-выводный ATtiny24). • Клавиатурная матрица 4x4 опрашивается через порты ввода/вывода (I/O). • Для генерации звуков через пьезоэлектрический излучатель используется таймер/счетчик. • Для обмена с экраном LCD (интерфейс I2C™) используется USI (универсальный последовательный интерфейс) в двухпроводном режиме (TWI). • Программа firmware микроконтроллера полностью написана на C.
[1 Введение]
Кодовые замки делают задачу управления доступа в помещение более гибкой и простой для конфигурирования. Механические замки требуют изготовления новых ключей, когда нужно дать привилегию доступа новым пользователям. Традиционный замок может быть переконфигурирован или заменен для изменения привилегий доступа одного пользователя, и если ключи потеряны, то требуется замена всего замка или его кодовой вставки. Подобные ситуации могут произойти, когда люди переезжают с одного места на другое, или когда компания принимает на работу новых сотрудников (или увольняет старых). Кодовые замки имеют преимущество, так как их можно просто перепрограммировать и оно могут держать в памяти уникальные коды для каждого пользователя.
Этот апноут описывает, как создать кодовый замок на микроконтроллере AVR и других подходящих компонентах. Кодовый замок использует клавиатурную матрицу 4x4 для ввода пользователя, пьезоэлектрический динамик для звуковых оповещений и экран LCD для вывода информации, см. рис. 1-1. Разработка основана на устройствах ATtiny24/44/84, но её можно просто портировать на другие микроконтроллеры AVR.
Рис. 1-1. Блок-схема кодового замка.
[2 Теоретические основы работы кодового замка]
Описываемый кодовый замок содержит tinyAVR, клавиатуру, LCD, пьезоизлучатель и электромеханический (дверной) замок. AVR постоянно сканирует клавиатуру в ожидании ввода пользователя, и откроет замок, когда будет введена правильная комбинация цифр кода. LCD используется для обратной связи и отображения информации о состоянии замка. Маленькая пьезопищалка используется для выдачи звуковых подтверждений о нажатиях клавиш и состоянии замка (оповещение о том, что дверь открыта).
2.1 Клавиатура
Устройством ввода является стандартная матрица кнопок 4x4. Поле клавиатуры содержит 16 клавиш, расположенных симметрично в 4 строках по 4 клавиши в каждой. Каждый столбец и строка подключен к порту I/O микроконтроллера.
Микроконтроллер постоянно сканирует клавиатуру, устанавливая все выводы строк (это выходы) в лог. 1, кроме одного, и при этом считывает состояние всех портов столбцов (это входы). Все входы столбцов имеют разрешенные верхние внутренние нагрузочные резисторы (pull-up), так что когда кнопка нажата, то на одном из входов столбцов будет прочитан низкий логический уровень.
2.2 Пьезоэлектрический излучатель
Пьезоэлектрические звуковые компоненты дают чистый, хорошо различимый звук, свободный от гармоник. При этом устройства могут генерировать громкий звук при малом энергопотреблении, что идеально подходит для применения совместно с микроконтроллерами.
Излучателем звука в пьезодинамике служит диафрагма. Приложенное постоянное напряжение (DC) к обкладкам диафрагмы заставляет её деформироваться, а если подключить переменное напряжение (AC), то из-за возникающих механических колебаний получается звук. Высота звука, который производит пьезоизлучатель, прямо пропорциональна частоте приходящего переменного сигнала.
Таймер/счетчик AVR хорошо подходит для генерации сигнала управления для пьезоизлучателя.
2.3 LCD
Дисплей, используемый в этой разработке, имеет 2 строки по 16 символов (2x16 LCD), который имеет встроенный контроллер. Специальная особенность дисплея - наличие интерфейса I2C™ с контролером. Интерфейс I2C полностью совместим с двухпроводным интерфейсом (Two-Wire Interface, TWI) который имеется в микроконтроллерах AVR, и поскольку ATtiny24 оборудован универсальным последовательным интерфейсом (Universal Serial Interface, USI), который может работать в режиме TWI, то это означает, что LCD может управляться через только 2 вывода порта.
[3 Реализация]
Аппаратно замок реализован довольно просто. Прототип (макет) довольно просто изготовить с помощью STK500, STK505, если подключить клавиатуру и LCD к разъемам через соединительные кабели.
Прим. переводчика: можно также взять любую из макетных плат AVR-USB-MEGA16, AVR-USB162, AVR-USB162MU, AVR-USB32U4. На каждой из них есть макетное поле, на котором удобно собрать схему замка.
3.1 Аппаратная начинка замка
Схема показана на рисунке ниже.
Рис. 2-1. Принципиальная электрическая схема кодового замка.
Электрический замок является специфическим компонентом, и может быть электромеханической защелкой, магнитным запором, или любым другим замком, управляемым через реле. Такие замки делают многие производители, включая к примеру ASSA, ABLOY, Headen и ESMI.
3.2 Программная часть (firmware)
Код firmware микроконтроллера написан целиком на языке C. Это делает разработку простой для понимания, и делает будущие доработки и разработки на основе этого проекта максимально наглядными.
Программное обеспечение имеет полную документацию на основе doxygen, которая берет информацию из исходного кода (см. readme.html). В документации также приведены требования к компилятору.
3.2.1 Обзор алгоритма firmware
Алгоритм работы программы микроконтроллера показан на рисунке ниже.
Рис. 2-2. Диаграмма алгоритма основной программы замка.
3.2.2 Драйвер TWI
Драйвер TWI осуществляет поддержку протокола последовательного интерфейса с LCD. Драйвер базируется на апноуте AVR310, и использует универсальный последовательный интерфейс (Universal Serial Interface, USI) в двухпроводном режиме (Two-Wire Mode, TWI). Драйвер TWI предоставляет низкоуровневый слой обмена данными между драйвером LCD и контроллером LCD. Модуль драйвера TWI реализован в файлах:
• USI_TWI_Master.c • USI_TWI_Master.h
3.2.3 Драйвер LCD
Драйвер LCD предоставляет дружественный интерфейс между основной программой и контроллером индикатора LCD. В комплект базовых функций драйвера LCD входят функции инициализации и очистки LCD. Также предоставляются функции для записи одного символа в любое место на экране индикатора, и вывод на экран целой строки текста. Модуль драйвера LCD реализован в файлах:
• LCD.c • LCD.h
3.2.4 Драйвер клавиатуры
Драйвер клавиатуры использует таймер/счетчик 0 (timer/counter 0) для отсчета интервалов последовательности сканирования клавиатуры. После того, как таймер/счетчик переполнится, происходит переход к следующей активной строке, и по достижении последней строки сканирование начинается заново с первой. Нажатия на клавишу регистрируются и декодируются с использованием прерываний по изменению логического уровня на выводе (Pin Change Interrupt). Модуль драйвера клавиатуры реализован в файлах:
• KPD.c • KPD.h
Примечание: в данной разработке порт отладки debugWIRE требует одной из ножек ATtiny24, которая используется для клавиатуры. Когда в файле KPD.h задан символ DEBUGWIRE, то эта ножка будет освобождена для отладки, но при этом нельзя использовать последнюю строку клавиатуры.
Прим. переводчика: чтобы можно было использовать ножку debugWIRE как обычный порт GPIO, требуется перепрограммирование фьюзов микроконтроллера ATtiny24.
3.2.5 Таймер событий (Event Timer)
В разработке используется сторожевой таймер (watchdog) в качестве обработчика окна события (event window handler). Каждое клавиатурное нажатие обновляет таймер watchdog, и если не было обнаружено никаких клавиатурных нажатий за заданное время, то сработает прерывание watchdog (по переполнению таймера). Для микроконтроллеров серий ATtiny24/44/84 можно выбрать, что будет происходить при переполнении watchdog - либо прерывание, либо аппаратный сброс.
Обработчик прерывания watchdog очистит буфер клавиатуры и очистит строку LCD от символов, которые были введены.
3.2.6 Драйвер пьезопищалки (Buzzer Driver)
Пьезоэлектрический излучатель звука подключен к выходу таймера/счетчика 1. Функция управления пищалкой использует входной параметр для прямой установки выходной частоты звука. Это означает, что ответ по частоте излучения будет обратно пропорционален параметру функции. Другими словами, увеличение значения параметра при вызове функции будет уменьшать частоту звука.
Более дружественный интерфейс должен был бы брать обратную величину от параметра в качестве значения для программирования таймера счетчика. Но это не было сделано по двум причинам: во-первых, генерируемые звуки достаточно просты, чтобы их заранее задать константами, а во-вторых, применение обратной величины потребует операций деления и значительно увеличит размер кода.
[4 Быстрый старт, как работает замок для пользователя]
Подайте питание на схему замка. Программа firmware отобразит приветственное сообщение:
Вторая строка будет пока пустой. Понажимайте цифровые клавиши на панели ввода. Дисплей обновиться, и будет показывать буфер клавиатуры:
Если в течение нескольких секунд не будут нажиматься клавиши, то буфер клавиатуры и вторая стока будут очищены.
Введите кодовую последовательность 1234. Программа примет эту комбинацию как код доступа, и подаст через реле открывающее напряжение на электрический замок. Строка прогресса покажет, сколько времени замок будет оставаться открытым:
[5 Указания по разработке]
Здесь рассмотрены некоторые идеи по улучшению и продолжению разработки кодового замка.
5.1 Защита от статического электричества (ESD Protection)
В некоторых случаях может потребоваться защита внутренней электроники от внешнего статического электричества (Electro-Static Discharge, ESD, электростатический разряд). Это можно осуществить добавлением токоограничивающих резисторов, включенных последовательно с столбцами и строками клавиатурной матрицы - в том месте, где они подключаются к микроконтроллеру. Как это сделать, показано на рисунке ниже.
Рис. 5-1. ESD-защита портов клавиатуры.
Резисторы могут иметь номинал около 1 кОм, или немного меньше.
5.2 Как можно освободить ножки I/O микроконтроллера
Эта разработка использует все доступные порты GPIO 14-выводного микроконтроллера AVR (ATtiny24). Это не очень удобно, поскольку для GPIO задействована даже ножка сброса (используется также как порт отладки GPIO). Для приложений, которым нужно больше портов I/O, можно было бы освободить некоторые порты, так что не будет необходимости мигрировать на микроконтроллер с большим количеством ножек. На сегодняшний день, для нашего кодового замка можно применить даже 8-выводный микроконтроллер AVR (например, ATtiny45 или ATtiny85). В этом разделе приведены советы по экономии портов ввода/вывода.
5.2.1 Уменьшение клавиатуры
Матрицу клавиатуры 4x4 можно было бы заменить на 4x3. Почти всегда этого будет достаточно, так как останутся 10 цифровых кнопок и две для дополнительных функций. Этот подход позволит сэкономить 1 порт I/O.
5.2.2 Мультиплексирование клавиатуры и LCD
Рассмотрите возможность совмещение портов для клавиатуры и LCD. Не требуется записывать в LCD и читать клавиатуру одновременно. Таким образом, эти функции могут быть мультиплексированы, и это позволит освободить 2 порта ввода/вывода. Прим. переводчика: однако это либо усложнит схему, либо усложнит код.
5.2.3 Компактный клавиатурный интерфейс
Рассмотрите вариант, что применение диодов позволит уменьшить количество выводов, требуемых для чтения клавиатуры. Можно использовать только 4 I/O для управления клавиатурной матрицей 4x3. Это изменение сохранит до 4 портов I/O. Для такого подключения потребуется 6 диодов, как показано на рис. ниже.
Рис. 5-2. 4-проводный интерфейс с клавиатурой 3x4.
В такой конфигурации драйвер клавиатуры может быть аналогичный тому, что применяется обычно; будут отличаться только коды возврата от портов I/O. Теперь не будет зависимости один-к-одному между нажатой клавишей и возвращенному коду. Нажатие одной клавиши может поменять состояние больше чем одного порта I/O.
Алгоритм для сканирования клавиатуры следующий. Сначала все 4 порта I/O устанавливаются как входы, и разрешаются резисторы pull-up. Затем одна из ножек I/O настраивается на выход с лог. уровнем 0, и читается состояние остальных портов I/O. Трехбитный считанный код покажет, была ли нажата кнопка в соответствующей строке, или нет. Таким же образом повторяется сканирование всех портов I/O, подключенных к клавиатуре.
Прим. переводчика: можно также уменьшить количество подключений к клавиатуре, если применить каналы АЦП и набор резисторов. К примеру, несколько кнопок можно опрашивать, если они будут подключены ко входу АЦП через набор резисторов. Какая кнопка нажата, можно определить по уровню напряжения, которое будет считано с помощью АЦП.
5.3 Дополнительные устройства с интерфейсом I2C
код firmware уже содержит в себе драйвер для обмена по шине I2C, так что очень просто можно добавить поддержку других устройств с интерфейсом I2C, так как их можно подключить параллельно к той же самой шине. Вот несколько примеров таких устройств:
• Карт-ридеры (доступ может быть организован не вводом кода, установкой в считыватель карты-ключа). • Сенсоры отпечатка пальца. • Сенсоры для удаленного управления (такие как инфракрасный пульт, или радиоинтерфейс). • Дополнительные микросхемы памяти (к примеру, для хранения кодов доступа.
5.4 Добавление нескольких кодов доступа
В разработке можно применить индивидуальные кода доступа для каждого пользователя. Количество кодов ограничено только объемом доступной памяти. Изначально программа firmware помещается в память ATtiny24 без каких-либо техник сжатия кода. Если применить оптимизацию кода по размеру (путем установки компилятора IAR в режим генерации кода для релиза, Release Mode), то можно освободить место в памяти программ для хранения дополнительных кодов доступа. Конечно же, больше места в памяти имеют другие микроконтроллеры, полностью совместимые по функционалу и портам GPIO, такие как ATtiny44 и ATtiny84.
Прим. переводчика: для хранения кодов доступа можно использовать также EEPROM, встроенную в AVR, или внешние микросхемы EEPROM, которые имеют интерфейс I2C. Эти микросхемы можно также подключить к шине I2C вместе с контроллером LCD.
[Ссылки]
1. AVR245: Code Lock with 4x4 Keypad and I2C LCD on a tinyAVR site:atmel.com. 2. Подключение клавиатуры к AVR. 3. 131121AVR245.zip - исходный код замка, документация. |
Комментарии
microsin: чтобы запрограммирова ть микроконтроллер , нужно сначала файлы на языке C скомпилировать (с помощью пакета AVR Studio + WinAVR или Atmel Studio на Windows или avr-libc на Linux). В результате получится двоичный файл прошивки (в формате BIN или HEX, в зависимости от процесса компиляции). Далее с помощью стандартного программатора этот файл прошивки нужно запрограммирова ть в память микроконтроллер а.
microsin: можно, но придется доработать программу и переработать схему. Дело в том, что у MT-16S2H интерфейс не I2C, а параллельный. Также придется использовать AVR с увеличенным количеством портов, потому что у ATtiny24 не хватит ножек для управления дисплеем.
В общем случае совершенно не принципиально, какой используется дисплей. Главное требование - программный драйвер для него должен учитывать тип интерфейса и систему команд используемого дисплея.
microsin: в Интернете есть реализации замков на микроконтроллер ах AVR, и MSC51. И некоторые имеют энергонезависим ую память, и позволяют менять коды ключей. Например, см. на этом сайте раздел Программировани е -> MCS51.
1) Какая будет реакция замка на отсутствие электричества?
2) Какой тип клавиатуры используется (емкостной, мембранная, т. д.)? Создает ли помехи клавиатура, если да, то как считывать правильно с нее?
microsin: в этом даташите не рассматриваются вопросы бесперебойной подачи электроэнергии и борьбы с помехами. Здесь рассматривается исключительно реализация замка. Так что если не предусмотрели резервного питания, то при отсутствии электричества замок работать не будет. Точно также, если Вы не предусмотрели средства защиты от помех и их фильтрации, то они будут влиять на чтение клавиатуры.
Чтобы организовать правильное чтение клавиатуры в условиях помех, нужно всего лишь применить подавление дребезга контактов - аппаратное и программное. Как это делается - см. Википедию и другие ресурсы сети.
microsin: что-то не понял, Денис. Вы хотите, чтобы я перевел за Вас даташит AVR526 и проанализировал схему замка? Думаю, что лучше Вам проделать это самостоятельно. ИМХО на первый взгляд, кардинальные переделки не понадобятся.
RSS лента комментариев этой записи