Кодовый замок на ардуино: схема

Содержание

Кодовый замок на Arduino можно приспособить для различных целей. Это могут быть двери, шкатулки, сейфы или запуск какого-либо действия, например, запуск ракеты).

Техническое задание

Разработать кодовый замок на Arduino, который управляет электромагнитным реле. При правильном вводе 5-значного кода, срабатывает реле и загорается зеленый светодиод. Через 5 секунд реле приходит в изначальное состояние и зеленый светодиод гаснет. Если код введен неверно, то загорается красный светодиод в течение 5 секунд. Код можно вводить бесконечное количество раз.

Необходимые компоненты

Плата Arduino Uno
Модуль клавиатуры (матричная клавишная панель)
Буззер (звонок)
ЖК дисплей 16х2
Резистор 1 кОм
Транзистор BC547
Макетная плата
Источник питания
Соединительные провода

В представленном проекте мы будем использовать технологию мультиплексирования для подключения клавиатуры (с помощью которой и будет вводиться пароль) к плате Arduino Uno. Мы будем использовать клавиатуру 4х4 которая содержит 16 кнопок (клавиш). В обычном режиме для подключения 16 кнопок к плате Arduino нам бы понадобилось 16 контактов, но с использованием технологии мультиплексирования нам будет достаточно 8 контактов для подключения 16 кнопок. Более подробно об этом можно прочитать в статье про подключение клавишной панели к Arduino.

Технология мультиплексирования является простым и эффективным способом уменьшения числа используемых контактов микроконтроллера при взаимодействии с большим числом кнопок (клавиш). В основном в этой технологии используется два простых приема: сначала сканируются строки, а потом сканируются столбцы. Но поскольку в Arduino мы используем специальную библиотеку для работы с клавиатурой, используя технологию мультиплексирования, нам нет необходимости писать специальный код для реализации этой технологии, по сравнению, например, с подключением клавишной панели к микроконтроллеру AVR.

Разработка

Давайте для начала смоделируем схему в Proteus

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

#define LED1 10 // красный светодиод

#define LED2 11 // зеленый светодиод

#define RELAY 12 // реле на замок

#define NUM_KEYS 5 // количество знаков в коде

charbutton_pressed;//массив для хранения нажатых кнопок

intk=;// счетчик нажатий

ints=;// счетчик совпадений нажатых кнопок с верными

constbyteROWS=;// количество строк в матрице клавиатуры

constbyteCOLS=;// количество столбцов

byterowPins=<. >;// пины подключенных строк

bytecolPins=<. >;// пины подключенных столбцов

Keypadkeypad=Keypad(makeKeymap(keys),rowPins,colPins,ROWS,COLS);// создаем объект клавиатуры для работы с ней

pinMode(LED1,OUTPUT);// красный светодиод

pinMode(LED2,OUTPUT);// зеленый светодиод

pinMode(RELAY,OUTPUT);// реле управления замком

digitalWrite(RELAY,HIGH);// вход реле инверсный, поэтому его сразу включаем (?!)

if(key!=NO_KEY)// если она все-таки есть

button_pressed=key;//сохраняем эту кнопочку в массиве

k=k+;// запоминаем сколько уже кнопок нажали

if(k==NUM_KEYS)// если нажали нужное количество кнопок

if(button_pressed==myarraw)// и проверим нажатые кнопки с верным кодом

if(s==NUM_KEYS)//если у нас все кнопки совпали с кодом, то включаем реле

digitalWrite(RELAY,LOW);// включили реле

digitalWrite(LED2,HIGH);// зажгли зеленый светик (пользователь ввел верный код)

delay(5000);// ждем 5 секунд пока горит светик зеленый и включено реле

digitalWrite(RELAY,HIGH);// гасим реле

digitalWrite(LED2,LOW);// гасим светик

k=;//сбрасываем счетчик нажатий нашей переменной

s=;// сбрасываем счетчик совпадений нашей переменной

digitalWrite(LED1,HIGH);// включаем красный светик (пользователь ввел неверный код)

delay(5000);// ждем 5 секунд

digitalWrite(LED1,LOW);// гасим красн светик

k=;// обнуляем счетчики, чтобы начать все заново

Описание кода

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

#define LED1 10 // красный светодиод

#define LED2 11 // зеленый светодиод

#define RELAY 12 // реле на замок

#define NUM_KEYS 5 // количество знаков в коде

В данном проекте, нам потребуется использовать три значения, которые мы будем использовать при написании нашего кода. Мы могли бы пойти стандартным путем и создать три переменные, присвоить им имена и значения, и затем просто использовать их. Но мы решили пойти немножко дальше, и показать, как можно еще более удобным способом решить данную задачу. Мы создаем 4 директивы, LED1, LED2 и RELAY, NUM_KEYS и присваиваем им постоянное значение, которое идет после названия директивы. После значения, точку с запятой, как мы привыкли, закрывать нашу строку, ставить не требуется.

charbutton_pressed;//массив для хранения нажатых кнопок

Здесь мы знакомимся с новым типом массивов и переменных char, в котором помимо цифровых значений, могут храниться символьные, например буквы, и различные знаки. Итак, мы создаем массив myarraw, который содержит 5 знаков, (не забываем про создание директивы). В данный массив мы записываем 5 значений, которые содержатся в фигурных скобках. Они будут являться кодом, по которому будет открываться наш замок, их вы впоследствии сможете поменять на любые другие. Затем нам нужно создать еще один массив, также 5 знаков, в котором будут храниться значения, наших нажатых кнопок.

intk=;// счетчик нажатий

ints=;// счетчик совпадений нажатых кнопок с верными

Здесь мы объявляем две переменные, к и s, и присваиваем им значение 0. В первой из них у нас будет храниться количество нажатий, а во второй количество совпадений, кода для открытия замка, который мы задали ранее в массиве, с кодом набранным на клавиатуре.

constbyteROWS=;// количество строк в матрице клавиатуры

constbyteCOLS=;// количество столбцов

Здесь же, мы задаем 2 константы формата byte, в целях экономии памяти, нашего контроллера мы пользуемся форматом для хранения переменных byte, а не привычный многим формат int. В данном случае он будет избыточен, для наших задач.

Теперь же, нам нужно будет создать, таблицу соответствия, кнопок клавиатуры символам, которые будут сохраняться в наших массивах. Как мы видим, их расположение, совпадает с нанесенными значками на клавиатуре.

byterowPins=<. >;// пины подключенных строк

bytecolPins=<. >;// пины подключенных столбцов

Ну а здесь, нам требуется создать два массива, по 4 знака каждый, соответственно по количеству строк и столбцов, и задать, к каким пинам ардуино они у нас будут подключены. Формат переменной, как и в прошлом случае, у нас выбран byte.

Keypad keypad=Keypad(makeKeymap(keys),rowPins,colPins,ROWS,COLS);// создаем объект клавиатуры для работы с ней

Здесь нужно остановиться подробнее: Библиотека Keypad, описывает класс работы с клавиатурой. Т.е. создает тип данных “клавиатура”, у этого типа данных свои параметры, которые мы указываем в скобках. Типа то, что клавиатура 4*4, к каким пинам подключены строки, к каким столбцы, и таблицу соответствия кнопок нашим символам. Т.е. Keypad это тип данных, наподобие int или char. Затем мы пишем имя своей переменной (создаваемого объекта) keypad с параметрами этой переменной в скобках. Как будто присваиваем значение этой переменной. И дальше работаем как с переменной, у которой можно менять параметры.

У этого класса есть разные методы – функции, к которым мы можем обращаться, чтобы работать с объектом, а еще есть внутренние, закрытые функции, которые работают сами, и мы не можем к ним обращаться. Т.е. keypad.getKey() – метод к которому мы обращаемся, чтобы получить значение нажатой клавиши, но у конкретной клавиатуры keypad. Классы позволяют создать несколько объектов. Т.е. мы можем подключить к ардуино 100 клавиатур и создать 100 объектов этих клавиатур. И потом работать с каждой по отдельности. Типа keypad1.getKey(), keypad2.getKey()… В рамках данной статьи, подробно разбирать, работу с классами и объектами, я думаю будет излишним, те кто заинтересуется данным вопросом, думаю что сможет теперь самостоятельно, найти информацию поиском.

pinMode(LED1,OUTPUT);// красный светодиод

pinMode(LED2,OUTPUT);// зеленый светодиод

pinMode(RELAY,OUTPUT);// реле управления замком

digitalWrite(RELAY,HIGH);// вход реле инверсный, поэтому его сразу включаем

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

Здесь мы опрашиваем нашу клавиатуру, были ли нажаты какие либо кнопки на клавиатуре.

if(key!=NO_KEY)// если она все-таки есть

button_pressed=key;//сохраняем эту кнопочку в массиве

k=k+;// запоминаем сколько уже кнопок нажали

if(k==NUM_KEYS)// если нажали нужное количество кнопок

Если была нажата какая либо из кнопок, то выполняем действие, сохраняем кнопку в массиве button_pressed. Затем наш счетчик нажатий, после нажатия первой кнопки, мы увеличиваем на единицу. Если количество нажатий соответствует значению, нашей директиве NUM_KEYS, то есть 5, мы выполняем код, следуем дальше.

if(button_pressed==myarraw)// и проверим нажатые кнопки с верным кодом

Итак, в цикле for, мы присваем переменной uint8_t i, что означает INT 8 бит, значение 0. Затем проводим сравнение, если значение i меньше 5, мы увеличиваем на единицу значение i, и выполняем условие 5 раз. Сравниваем по символьно значения наших массивов, в котором хранятся набранные значения кнопок, и заданные нами в начале, для проверки на совпадение, на открытие замка. Если совпали значения, то счетчик совпадений, увеличиваем на единицу.

Для изменения кода доступа достаточно поменять значения цифр в строке 11 на свои цифры.

Сборка в железе

Для работы в железе нам понадобится собственно сама плата Arduino Uno

Матричная клавиатура 4х4

И модуль электромагнитного реле

А вот и видео работы:

На Алике я находил прикольные замочки, которые можно навесить на вашу дверь

Схема устройства

Схема устройства представлена на следующем рисунке и содержит в своем составе Arduino, модуль клавиатуры, буззер (звонок) и ЖК дисплей. Плата Arduino управляет всеми процессами работы схемы: считывание пароля с модуля клавиатуры, сравнение паролей, включение/выключение буззера и передача статуса на ЖК дсиплей. Клавиатура используется для ввода пароля. Буззер используется для индикации, а ЖК дисплей используется для отображения статуса операции и различных сообщений. Буззер управляется с помощью NPN транзистора.

Столбцы модуля клавиатуры непосредственно подключены к контактам 4, 5, 6, 7, а строки – к контактам 3, 2, 1, 0 платы arduino uno. ЖК дисплей подключен к плате Arduino в 4-битном режиме. Управляющие контакты RS, RW и En подключены к контактам Arduino 13, GND и 12. Контакты данных ЖК дисплея D4-D7 подключены к контактам 11, 10, 9 и 8 arduino. Буззер подключен к контакту 14(A1) arduino с помощью NPN транзистора BC547.

Как работает программа самодельного кодового замка

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

Теперь вы знаете как сделать настоящий кодовый замок, и сохранить все ваше имущество!)

Простой и интересный проект на Ардуино — подарочная книга с секретом на Ардуино

Внутри этой книги установлен механизм, открывающий специальный отсек, если отгадать все тайны этой книги. Механизмы и датчики книги управляются с помощью Ардуино. Открыть у книги можно только несколько страниц посередине. В тексте представлено несколько загадок. Отгадав первую, пользователь поймет, что нужно повернуть диск на обложке. При правильном положении диска загорится светодиод.

Далее нужно разгадать судоку и найти фразу «Повернуть книгу». Удерживая книгу вертикально, ее нужно повернуть. Третья загадка шахматная — необходимо поставить шахматные фигуры на определенные клетки. Если все сделано правильно и три загадки разгаданы, с помощью сервомотора открывается потайной отсек. Размер отсека конечно не велик, но там можно разместить, например, конфету или кольцо.

Можно придумать свои загадки и установить другие датчики, например, температуры, датчик света или даже GPS, тогда отсек откроется при нахождении пользователя с книгой в определенной точке.

Необходимые инструменты и материалы для книги с секретом на Ардуино

  • Бумага.
  • Картон.
  • Бархатный картон.
  • Декоративные камни.
  • Черный чай.
  • Ардуино.
  • Сервопривод.
  • 3 светодиода.
  • Акселерометр MPU 6050.
  • 2 геркона.
  • 2 резистора 10 кОм.
  • Резистор 220 Ом.
  • Переключатель.
  • Потенциометр 1 кОм.
  • Батарея 9 В.
  • Провода.
  • Клей.
  • Ножницы.
  • Краска.
  • 3D принтер.
  • Утюг.
  • Паяльник.
  • Клеевой пистолет.

Шаг первый: подготовка листов

У нас древняя книгу, поэтому нужно сделать так, чтобы бумага выглядела в этом стиле. Сначала печатаем на бумаге нужный текст и рисунки. Для образца текст будет в архиве ниже.

Затем сминаем бумагу и опускаем смятые листы в круто заваренный черный чай на 15 минут. Через 15 минут листы достаем и высушиваем через полотенце утюгом.

Шаг второй: сервопривод

Используем сервопривод Tower Pro 9g SG90. Остальные детали напечатаны на 3D принтере. Вся информация по ним доступна для скачивания в архиве ниже.

Шаг третий: отсеки

Книга, как бы разделена на несколько частей: обложка, передняя часть с ардуино, часть с текстом и рисунками, часть с тайником. Берем пачку листов А4 и делим пополам. В одной части вырезаем нишу под Ардуино и батарею, в другой — под сервопривод и тайник. Торцы листов внутри отсеков проклеиваем термоклеем.

Тайник, в отличие от отсека с Ардуино, будет виден, поэтому проклеиваем его картоном.

Видимые части замачиваем в чае.

Шаг четвертый: установка сервопривода

Закрепляем сервопривод в отсеке. Выводим провод. На отдельных листах закрепляем петлю замка. В нормальном положении язычок привода цепляем за петлю и отсек закрыт.

Шаг пятый: обложка

Обложку изготавливаем из картона и оклеиваем бархатным картоном.

Шаг шестой: сборка книги

Соединяем части книги с помощью степлера и клея.

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

Прохождение каждого задания информируют загорающиеся светодиоды. В обложке делаем под них отверстия, вклеиваем их и закрываем сверху декоративными стеклами.

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

Шаг седьмой: Ардуино

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

Шаг восьмой: шахматные фигуры

Шахматные фигуры можно напечатать на 3D-принтере. В нижнюю часть вклеиваем магниты (информация есть в архиве).


Источник: grand-electro.ru