#11 Эксперимент “Кодовый замок”
Матричная клавиатура – один из самых популярных элементов управления электронными устройствами. Они используются как для ввода числовых данных, так и для управления подключёнными компонентами. Самыми популярными типами таких кнопочных клавиатур являются матричные 12-ти или 16-кнопочные клавиатуры.
Клавиатура на 12 кнопок | Клавиатура на 16 кнопок |
Если подключать к Arduino отдельно каждую кнопку, то нам понадобится 12 или 16 пинов, т.е. для подключения одной лишь клавиатуры, нам потребуются практически все пины микроконтроллера. Но, число требуемых пинов можно сократить в 2 раза, для этого нужно подключить клавиатуру по матричной схеме.
Сегодня, мы соберём макет устройства “кодового замка”, который можно открыть только с помощью правильно введённого пароля.
Перед выполнением эксперимент прочтите:
СБОРКА УСТРОЙСТВА НА МАКЕТНОЙ ПЛАТЕ
Нам понадобятся следующие компоненты:
- Arduino Uno;
- USB-кабель для подключения к компьютеру;
- Беспаечная макетная плата;
- 1 матричная клавиатура;
- 1 пьезодинамик;
- 1 сервопривод;
- 4 резистора на 10 кОм;
- 11 соединительных проводов разных цветов.
Соберите устройство по следующей схеме:
Схема устройства на макетной плате |
Принципиальная схема устройства |
Обратите внимание:
- матричную клавиатуру можно разделить на строки (ROWS) и столбцы (COLS). Как видно из схемы, в столбцы и строки мы объединяем контакты кнопок, расположенные с одинаковой стороны;
- когда мы подадим питание на строку R1, то мы запитаем сразу 4 кнопки (S1, S2, S3, S4). Если при этом бутен нажата кнопка S3, то сигнал, пройдя через неё, попадёт на пин, соединённый с 3 столбцом;
- таким образом, подавая сигналы поочерёдно на каждую строку и принимая его на пинах, подключённых к столбцам, мы сможем определить – какая из кнопок нажата;
- пьезодинамик мы подключили к 10-му пину и он, подавая разные звуковые сигналы, будет оповещать пользователя о том, правильно введён пароль или нет;
- сервопривод мы подключаем по классической схеме к 11-му пину. Он будет служить механизмом, который откроет замок при вводе правильного пароля;
- для того, чтобы вы не запутались при подключении всех этих компонент к Arduino, ниже приведена таблица подключаемых пинов:
ПОДКЛЮЧЕНИЕ МАТРИЧНОЙ КЛАВИАТУРЫ | |
Пин на клавиатуре | Пин Arduino |
R1 | 2 |
R2 | 3 |
R3 | 4 |
R4 | 5 |
C1 | 6 |
C2 | 7 |
C3 | 8 |
C4 | 9 |
Подключение сервопривода | |
– (коричневый) | GND |
+ (красный) | +5 В |
Сигнал (оранжевый) | 11 |
Подключение пьезодинамика | |
– | GND |
+ | 10 |
- пины 2-5 Arduino соединены со строками матричной клавиатуры, на них мы будем подавать сигнал, пины 6-9 клавиатуры соединены со столбцами и на них мы будем сигнал принимать;
- для того, чтобы кнопки клавиатуры не реагировали на внешние шумы и не выдавали случайных нажатий, рекомендуется “притянуть” столбцы “земле” с помощью резисторов на 10 кОм, как показано в памятке. Т.е. наша схема подключения кнопок не что иное как схема со стягивающим резистором.
Иногда, матричные клавиатуры оснащаются управляющей схемой, которая позволяет получать нажатия большого количества кнопок по 4-м или даже 3-м проводам. В нашем случае, клавиатура представляет собой собранные на одной плате тактовые кнопки в количестве 16-ти штук. Такую клавиатуру часто обозначают как “матричная клавиатура 4×4” (по количеству строк и столбцов). Каждая кнопка нашей клавиатуры имеет условное обозначение – S1, S2, … S16. Для сегодняшнего эксперимента нам не понадобятся все кнопки, а лишь их часть – 11 из 16-ти кнопок:
К кнопкам: S1, S2, S3, S5, S6, S7, S9, S10, S11, S14 мы привяжем значения цифр: 1, 2, 3, 4, 5, 6, 7, 8, 9, 0. Таким образом цифры располагаются на большинстве устройств, оснащённых числовой клавиатурой. К кнопке S16 мы привяжем действие открытия нашего электронного замка, назовём её кнопкой ввода.
ПРОГРАММИРОВАНИЕ
Для того, чтобы “с нуля” реализовать получение кодов нажатых кнопок, нам потребуется завести несколько переменных и даже написать подпрограмму, так как алгоритм “прозвона” кнопок по строкам и получение значений нажатых кнопок на столбцах, очень громоздкий. Давайте начнём с логики работы нашей программы:
- сначала мы подадим сигнал с пина 2 Arduino на 1-ю строку клавиатуры, а затем проверим – не пришёл ли сигнал на один из пинов Arduino, соединённых со столбцами. В данном случае, в 1 ряду у нас 3 задействованных кнопки, поэтому и наличие сигнала проверить нужно на 3-х пинах – 6-м, 7-м и 8-м. Если сигнал присутствует, на 1-м столбце, то в переменную [Key], которую мы заведём, запишем значение [1], если сигнал на 2-м столбце, то значение [2], а если на 3-м, то значение [3], т.е. значение нажатой цифры на нашей клавиатуре;
- далее мы подадим сигнал на 2-ю строку клавиатуры и выполним все предыдущие проверки, а на выходе получим значения: [4], [5] или [6];
- аналогичные операции проделаем и для 3-й и 4-й строки. С них мы можем получить значения [7], [8], [9], [0] или сигнал с кнопки вводы, который обозначим как [16], просто по номеру кнопки;
- в случае, если кнопки клавиатуры не будут нажаты, то никаких значений мы получать не будем.
Давайте реализуем этот алгоритм. Запустите Arduino IDE, выберите [Инструменты] ⇒ [ArduBlock].
В разделе [Установка] нашей программы, мы задаём переменную [Key], которая будет хранить значения нажатых клавиш и присваиваем её значение [10]. Это значение нельзя набрать на клавиатуре за одно нажатие. Таким образом, мы будем значить, что если на клавиатуре получено значении меньшее 10-ти, то произошло нажатие, а если это значение больше, то нажатий нет. Это своего рода триггер, которой позволит нам легко определить нажатие клавиш.
Далее, мы посылаем высокий (HIGH) сигнал на 2-й пин Arduino и начинаем проверку. С помощью блоков [если], мы определяем: нажата ли какая-либо клавиша в 1-й строке нашей клавиатуры. Если клавиша нажата, то мы записываем в переменную [Key] соответствующее ей числовое значение [1], [2] или [3]. Обратите внимание: нажатие 4-й клавиши в ряду мы не проверяем, так как эта клавиша не используется в нашем устройстве.
Далее, мы выключаем 2-й пин. Для того, чтобы увидеть: получены ли нужные значения, можно отправлять их в последовательный порт компьютера в виде значения переменной [Key]. Перед выводом мы проверяем – была ли нажата клавиша. Если клавиша нажата, то значение [Key] будет меньше 10-ти и тогда мы отправим это значение в порт. Если же значение равно 10-ти, то данные в порт посылаться не будут. При этом, после вывода данных в порт, мы снова присваиваем переменной значение [10] вывод [Key] осуществлялся только 1 раз для каждого нового значения. Загрузите программу в Arduino, а затем запустите [Монитор последовательного порта] и проверьте работу нашей программы.
Если вы всё сделали правильно, то в последовательный порт компьютера будут выводится значения [1], [2] и [3] при нажатии соответствующих клавиш.
Далее, нам осталось повторить алгоритм для остальных строк:
Обратите внимание: подавая сигнал на последнюю 4-ю строку, мы проверяем на наличие сигнала лишь 2-й и 4-й столбец, т.к. остальные кнопки в ряду у нас не задействованы. Для того, чтобы не работать с таким громоздким алгоритмом в блоке основной программы, вынесем его в подпрограмму, которую назовём [GetKey], а в блоке основной программы оставим алгоритм вывода значений с кнопок в последовательный порт и объявление переменной [Key] в разделе [Установка] :
В тоже время, наша подпрограмма [GetKey] будет выглядеть следующим образом:
Готово, наша подпрограмма больше не будет дополняться, поэтому её можно “оттащить” в сторону, чтобы она не мешала писать основной алгоритм. Загрузите полученную программу в Arduino и проверьте её работу. Если какие-либо из кнопок 1-9 не работают, или в порт выводятся неверные значения, проверьте свой алгоритм на ошибки.
Далее, из вводимых с клавиатуры символов, нам следует получить пароль. Давайте определим длину нашего пароля в 4 цифры. Для того, чтобы получить пароль из вводимых цифр, нам понадобятся 2 переменные: [Pass], которая будет “склеивать” значения 4-х последовательно нажатых кнопок и [passlength], которая будет нужна для счёта эти хсамых 4-х символов:
Для начала, мы задаём переменной [passlength] значение [1]. Это значит, что переменная [Pass] сейчас будет записывать 1-й символ.
Как и в предыдущий раз, если обнаружится, что кнопка нажата, т.е. значение [Key] будем меньше [10], мы будем выводить данные нажатых клавиш в последовательный порт ,а заодно и записывать пароль в переменную [Pass]. Это будет происходить следующим образом:
- когда введён первый символ, он умножается на 1000 и записывается в переменную [Pass], т.е. 1 – станет 1000, 2 – станет 2000 и т.д.;
- далее, мы меняем значение переменной [passlength] на [2]. Это значит, что мы будем дописывать в переменную второй введённый с клавиатуры символ. Сам символ, мы будем предварительно умножать на 100;
- с 3-м и 4-м символом мы проделываем аналогичные операции. В ходе записи символов, 3-й символ мы умножаем на 10, а 4-й просто складываем с уже имеющимися значениями внутри переменной [Pass]. Пример работы алгоритма: допусти мы ввели символы 1, 4, 6, 9. В переменной [Pass] мы получим сумму 1·1000 + 4·100 + 6·10 + 9 = 1000 + 400 + 60 + 9 = 1469, что и будет являться нашим паролем. Т.е. умножая введённые числа на 1000, 100 и 10, мы помещали их в нужный разряд. Такая операция называется “Конкатенацией” или просто склейкой;
- пароль получен. При этом, когда переменная [passlength] увеличится до значения [5], мы заново присваиваем ей значение [1] и всё готова к новому формированию пароля из введённых символов;
- далее, если мы нажимаем нашу кнопку “ввода”, т.е. получаем код [16], то происходит вывод полученного пароля в последовательный порт;
- обратите внимание, после вывода пароля в порт, переменная [passlength] ещё раз “сбрасывается” до значения [1]. Это нужно для того, чтобы, в случае введения не 4, а 5-ти или 6-ти цифр, алгоритм не запутался и не стал помещать цифры в неправильные разряды. Т.е. кнопка ввода случит как для вывода пароля, так и для сброса счётчика длины пароля [passlength].
Давайте уберём алгоритм формирования пароля в подпрограмму и назовём её [GetPass]:
При этом, наша программа сократится и будет выглядеть следующим образом:
Осталось реализовать алгоритм, который будет проверять пароль, находящийся в переменной [Pass] и сверять его с “правильным” паролем. В случае, если пароли совпадут, сервопривод должен повернуться, а пьезодинамик издать, например, двойной высокий звук. Если пароли не совпадут, то динамик должен издать одиночный низкий звук, а сервопривод должен остаться в первоначальном положении.
Алгоритм проверки паролей и пояснения к нему – ниже:
В разделе [Установка] нашей программы мы добавили новую команду. В начале работы устройства мы поворачиваем вал сервопривода в положение 0º. Это наш режим “закрыто”.
После ввода пароля и нажатия на кнопку ввода, программа проверяет соответствует ли пароль “правильному” (в нашем случае, правильный пароль – [4123]), далее если пароли совпадают, то сервопривод поворачивается в положение 180º (режим “открыто”), а пьезодинамик издаёт два сигнала длительностью по 200 мс на частоте 440 Гц. В случае, если пароли не совпадают, динамик просто издаёт одиночный звук, длительностью 500 мс с частотой 200 Гц.
Обратите внимание, для реализации алгоритма проверки кода и открытия нашего замка, мы использовали блок [если/иначе], который позволяет задать команды как на случай выполнения условия, так и на случай, когда условие не выполняется:
Загрузите программу в Arduino и протестируйте её работу. На “кодовый замок” готов!
ЗАДАНИЯ ДЛЯ САМОСТОЯТЕЛЬНОГО ВЫПОЛНЕНИЯ
Задание 1:
Измените “правильный” пароль и добавьте в схему устройства красный и синий светодиоды. Красный светодиод должен гореть всё время, пока замок находится в закрытом состоянии, а зелёный должен зажигаться, в момент открытия замка и гаснуть в момент закрытия.
Задание 2:
Измените и дополните алгоритм таким образом, чтобы в случае ввода неправильного пароля 3 раза подряд, срабатывала сигнализация. Т.е. пьезодинамик начинал издавать постоянные короткие звуки. Сигнализации должна работать до того момента, пока устройство не будет перезагружено. Кстати, перезагрузить Arduino можно, нажав специальную кнопку “Reset”, которая находится на плате возле USB-порта.
Задание 3*:
Задействуйте все кнопки матричной клавиатуры и привяжите к нажатию каждой из них какую-либо ноту, воспроизводимую пьезодинамиком. Другими словами, вам предстоит сделать свой собственный “LaunchPad”.
Для того, чтобы получить сертификат, подтверждающий успешное прохождение курса – выполняйте тесты в конце занятий. | Пройти проверочный тест |