HRP-N3 - серия источников питания с максимальной пиковой мощностью в 350% от MEAN WELL
РадиоЛоцман - Все об электронике

«Цифровая лаборатория» NR05: делаем кодовый замок

Мастер Кит NR05

Продолжаем цикл статей по использованию возможностей набора «Цифровая лаборатория» NR05 для изучения программирования микроконтроллеров на примере Ардуино и конструированию полезных электронных устройств.

Выбираем схему BMS для заряда литий-железофосфатных (LiFePO4) аккумуляторов

Наш материал не претендует на законченную конструкцию, но, как вы увидите, она вполне выполняет все основные функции кодового замка, и может послужить хорошей иллюстрацией возможностей микроконтроллеров и использования внешних подключаемых модулей. Программу для микроконтроллера можно переделывать по вашему усмотрению, добавляя или изменяя функции замка, и повышая при этом уровень ваших знаний в программировании.

Воспользуемся, прежде всего, тем, что на плате расширения, входящей в состав набора, установлен двухстрочный жидкокристаллический дисплей, а также 5 кнопок. Используем эти элементы для построения кодового замка.

Зададимся следующими требованиями:

  1. Имеется 5 кнопок для ввода кода, открывающего замок;
  2. Крайняя левая кнопка соответствует коду 1, далее слева направо — 2, 3, 4, 5;
  3. Количество цифр вводимого кода может быть любым (в разумных пределах) и просто устанавливаться в программе;
  4. Набираемый код отображается звездочками;
  5. При совпадении введенного кода с образцовым на исполнительный механизм подается положительный импульс задаваемой в программе длительности;
  6. При ошибочном наборе кода появляется сообщение об ошибке;
  7. Если код набрать частично, то через некоторое время набранные значения сбрасываются.
  8. Используем дисплей, RGB-светодиод и звукоизлучатель, входящие в набор для отображения понятной для пользователя информации.
  9. Будем открывать настоящий электромеханический замок, питающийся от 12 В.

Теперь подберем устройство, которое будет подавать на замок напряжение открывания. Это напряжение в соответствии с паспортом электромеханического замка, который мы и будем открывать, равно 12 В при токе около 1 А. Плата расширения набора NR05 не может работать с такими напряжениями и токами, поэтому необходим дополнительный модуль коммутации. Такими модулями могут быть предлагаемые компанией Мастер Кит реле MP515, или блоки реле MP2211, MP4411 в зависимости от того, захотим ли мы управлять не только замком, но и другими устройствами, например, включить свет при открывании двери. Все эти устройства совместимы с уровнями управляющих сигналов Ардуино. В нашем конкретном случае используем MP2211 – модуль с двумя реле.

Учитывая сказанное выше, нарисуем схему соединений используемых устройств:

Если внимательно посмотреть на маркировку платы расширения, то мы увидим, что зеленый канал RGB-светодиода GREEN и выход на реле CH3 подключены к одному выводу D9 Arduino Nano. В данном случае это допустимо, так как вход управляющей схемы реле имеет достаточно высокое входное сопротивление, а вывод D9 используется только как цифровой выход. В общем случае следует проверять, не подключены ли используемые вами выводы платы к одному и тому же выводу Ардуино, и не допускать такой ситуации.

Замок во время срабатывания потребляет довольно большой ток, поэтому запитываем его и управляющую схему отдельно.

Вот скетч, работающий в Ардуино, спойлер

Листинг скетча снабжен подробными комментариями, которые помогут вам разобраться в программе.

Тем не менее, обратим ваше внимание на некоторые ее особенности.

Как мы уже писали, в плате расширения применена схема подключение кнопок, использующая только один вывод Ардуино. Такая схема экономит выводы микропроцессора, но не позволяет обрабатывать одновременное нажатие нескольких кнопок; однако в нашем случае это и не нужно. Обратите внимание на функцию get_key в конце скетча. Если ни одна кнопка не нажата, функция возвращает 0, если нажата, то номер нажатой кнопки.

Также посмотрите на реализацию сравнения двух массивов: эталонного и набранного кодов:

int compareResult = 1;
for (int i = 0; i < codeLength; i++)
if (codeOrigin[i] != codePressed[i])
compareResult = 0; // если хотя бы одна пара элементов не равна

Вопрос об алгоритме такого сравнения довольно часто обсуждается на форумах по программированию, но каждый раз сводится к поэлементному сравнению, что и использовано в нашем случае. Переменная compareResult остается равной 1 в случае, если элементы массивов с одинаковыми индексами равны, и становится равной 0 в случае, если хотя бы одна пара элементов не совпадает.

Для вывода на дисплей символов кириллицы используется библиотека LiquidCrystalRus, разработанная Ильей Даниловым. Для корректной работы библиотеки в заголовке нашего скетча обязательно должны присутствовать три строки: 

#include LiquidCrystalRus.h
#include LineDriver.h
#include LiquidCrystalExt.h

  А инициализация дисплея должна выглядеть так:

LiquidCrystalRus lcd(A1, A2, A3, 2, 4, 7);

Длина вводимого кода задается предопределенной константой codeLength, например для кода из шести нажатий

#define codeLength 6

Массив эталонных значений для кода длиной 6 нажатий задается следующей строкой: 

const int codeOrigin[codeLength] = {1, 2, 3, 4, 5, 3};

Количество значений в фигурных скобках должно быть равным codeLength. Если значений будет больше, компилятор выдаст ошибку, если меньше, ошибки не будет, но в качестве недостающих элементов будут использованы случайные значения, что не даст возможности набрать код, который откроет замок.

Каждые 5 секунд программа сбрасывает набранные элементы кода. Если кнопка была нажата, то время нажатия запоминается, и отсчет пятисекундного интервала начинается снова. Это реализовано с помощью встроенной функций millis(), которая возвращает число миллисекунд, прошедших с момента начала выполнения скетча, и переменных oldTime и currentTime.

Приведем небольшой видеоролик, демонстрирующий работу кодового замка:

Для любознательных и пытливых программистов-электронщиков можно подкинуть еще несколько идей для самостоятельной доработки скетча и включения в схему модулей, расширяющих возможности замка. Например, ввести в программу мастер-код, с помощью которого замок переводится в режим программирования и запоминает нажимаемые кнопки в качестве эталонного кода, чтобы не менять этот код в скетче. Программирование нового кода заканчивается, если промежуток между нажатиями превышает определенное время.

Или, опираясь на материал, посвященный взаимодействию Ардуино со смартфоном по Bluetooth, сделать замок, который открывается кодом, посылаемым этим самым смартфоном.

Можно также достаточно просто ввести в наше устройство беспроводной канал управления. Для этого достаточно воспользоваться двумя модулями: пультом-передатчиком MP910 и одноканальным приемником с релейным выходом MP911, работающими на частоте 433 МГц. Контакты реле модуля MP2211 подключаются при этом параллельно кнопке пульта, а реле модуля приемника – к замку. Дистанция управления может быть до 100 м.

Изучайте Ардуино, изучайте микроконтроллеры и их программирование – и вы сможете создать немало умных и полезных электронных устройств!

Мастер Кит

Электронные компоненты. Бесплатная доставка по России
Для комментирования материалов с сайта и получения полного доступа к нашему форуму Вам необходимо зарегистрироваться.
Имя