Замок на ардуино.
Если вы хотите собрать кодовый замок на Ардуино, то вы попали по адресу.Сегодня поговорим о кодовом замке на клавиатуре 4х4. Я буду использовать кнопочную клавиатуру, потому что мембранная очень ненадёжная и у неё не всегда хороший контакт. Да и смотрится она не очень. Правда у неё есть плюс – она влагозащищённая.
Это моё третье видео про системы доступа.
Первые два – это доступ по отпечатку пальцев, и доступ по карте RFID. Больше я не знаю какую систему ещё собрать и на чём. Если знаете, то напишите, и я сниму про неё видео.
Все эти видео со всеми скетчами можно посмотреть на канале.
Для работы с клавиатурой мы будем использовать библиотеку Keypad. С этой библиотекой поставляются несколько примеров.
Рассмотрим самый простой CUSTOM KEYPAD. Этот пример выводит в монитор порта номер нажатой кнопки.
В первых строчках мы задаём количество строк и рядов клавиатуры. В моём случае это 4х4.
Затем указываем названия этих кнопок.
Теперь к каким пинам будем подключаться.
Теперь проводим инициализацию клавиатура и создаём переменную класса Keypad.
В цикле луп получаем значение нажатой кнопки и выводим в монитор.
Есть пример для подключения сразу 3 клавиатур, так что подключить несколько клавиатур к одной библиотеки не проблема. Главное чтобы хватило пинов на Ардуино.
Если видео не затянется надолго, то в конце я опишу, что делают остальные примеры.
Мы же сейчас остановимся на работе кодового замка.
Описание рабочего примера.
Сделаем так чтобы при правильном наборе цифр и букв на клавиатуре загорался зелёный светодиод и срабатывало реле., а если был неправильно набран код, то срабатывала пищалка и загорался красный светодиод. Количество попыток неограниченно, но можно было бы сделать определённое число раз, и система блокировалась бы, скажем на 10 минут.
Конец набора кода определяется по нажатии кнопки решётка.
Если вы начали набирать код и ошиблись, то нажимаете звёздочку и набираете снова.
Установка кода и количества символов в коде меняется в двух строчках и тоже не ограничена. Я пробовал код их 10 символов и всё работало.
После правильного набора, через 5 секунд, система обнуляется и снова встаёт в режим ожидания набора кода. Реле отключается, а светодиод гаснет.
При неправильном наборе Загорается красный светодиод на 1 секунду и играет мелодия. После этого светодиод гаснет, а система снова встаёт в режим ожидания.
Алгоритм работы действующего скетча такой.
Нажимаем 4 цифры или буквы, а пятой нажимаем знак решётка # — это даёт сигнал, что набор закончен и начинается проверка введённого кода. Ну а про результат я уже писал. К реле можно подключить электромагнитный замок или сервомотор которые будут открывать дверь или что-нибудь другое.
Схема подключения.
Расположение выводов от клавиатуры бывает разное, так что у вас могут быть абсолютно другие контакты.
Узнавайте при покупке и в скетче вписывайте свои данные.
Описание скетча.
Скетч хорошо прокомментирован, поэтому я здесь быстро пробегу по коду, чтобы не задерживать вас.
Пин код arduino
В данной статье мы познакомимся с такой великолепной и интересной по своим возможностям платформе как Arduino Uno. Данная статья является обзорной и ориентирована исключительно на начинающих.
Что такое Arduino UNO
Arduino UNO по своей природе это плата расширения для микроконтроллера, которая делает работу с данными микроконтроллером значительно проще и удобнее (в рассматриваемой нами Arduino UNO Rev3 установлен микроконтроллер ATmega328p).
Если бы микроконтроллер не обладал такой платой, то нам бы пришлось использовать программатор что бы запрограммировать данный микроконтроллер, а так же собрать необходимую минимальную электрическую схему из обязательных электронных компонентов что бы дать возможность работать микроконтроллеру. Так же нам бы пришлось использовать специальные средства программирования и разбирается в разных низкоуровневых настройках микроконтроллера связанной с такой «самостоятельной» работой с микроконтроллером.
Arduino UNO решает все эти проблемы, он предоставляет всю необходимую среду для работы микроконтроллера, а так же делает его программирование крайне простым делом не требующим от вас каких либо сложных знаний или дополнительного оборудования кроме вашего ПК. Более того, производители предоставили широкие возможности питания Arduino: USB или любой источник питания от 7В до 12В, что позволяет питать плату как от USB порта вашего ПК так и от блока питания или обычной батарейки, например «кроны».
Все что вам необходимо что бы запрограммировать ваш Arduino это подключить его по USB к вашему ПК и используя предоставленную среду разработки написать код и нажать кнопку «Загрузить на микроконтроллер», дальше среда разработки сделает все сама.
Внимание: Вы не можете установить в данную плату любой подходящий по размерам микроконтроллер, во первых, электрические компоненты платы рассчитаны именно на данную серию микроконтроллеров, а так же все микроконтроллеры идущие в составе плат имеют встроенную специальную программу, которая предназначена для начальной инициализации микроконтроллера и обеспечивает возможность работы микроконтроллера с USB.
И так что же такое Arduino UNO теперь думаю немного понятнее, теперь давайте знаем что же он может.
Программа для Arduino
При программировании Arduino с помощью среды разработки, вам потребуется знать о назначений двух функций.
Когда микроконтроллер начинает выполнять вашу программу эта функция запускается самой первой, и запускается только ОДИН раз. Как правило ее назначение установить значения требуемых пинов (на вход или на выход, об этом мы поговорим чуть ниже) а так же произвести другие необходимые вашей программе начальные установки.
Эта функция и является основной рабочей функцией вашего Arduino. После выполнения функции setup() ваш микроконтроллер приступит к выполнению именно этой функции и когда функция дойдет до конца, микроконтроллер начнет ее выполнение повторно, и так до бесконечности. Думаю название функции loop (петля) говорит само за себя. В общем эта функция которая будет выполняться по кругу пока будет подключено питание.
Стандартный шаблон программы для Arduino выглядит так:
Включение требуемых файлов если нужно Объявление глобальных переменных если нужно Объявление прототипов функций если нужно void setup() < Код настройки >
Управление пинами Arduino
В целом, задача микроконтроллера сводится к тому что бы контролировать порты ввода-вывода, которые разработчики представили для нашего удобства в виде пинов. К данным пинам удобно подключатся, что делает процедуру подключения Arduino в схему весьма простым делом, не требуется ничего паять, нужно просто воткнуть соединительные провода в гнезда нужных пинов а другие концы подсоединить например к вашей схеме на макетной плате или к вашему проекту.
Данные пины обладают двумя очень важными особенностями, пины могут как подавать напряжение так и проверять наличие напряжения, что позволяет вам как подать необходимое напряжение на пин так и проверить наличие напряжения на нужных пинах, для этого при программировании Arduino вам необходимо указать в каком режиме будет работать тот или иной пин на вход (вы будите проверять наличие напряжение) или на выход (вы будите подавать на пин напряжение), это очень важно, так как без этой информации ваш Arduino может работать не корректно. Как правило такую установку вы делаете в функции setup, которая например может выглядеть так:
Обратите внимание, что пины вы можете указывать именно так как они пронумерованы на вашей плате, а среда разработки уже сама позаботится о том что бы превратить данные цифры в истинные адреса портов ввода-вывода, что в очередной раз облегает нам работу делая ее максимально простой и прозрачной.
Пины это средство общения вашего Arduino с внешним миром, с их помощью он может как «говорить» так и «слушать», но не все пины одинаковы.
На плате Arduino UNO существуют 3 вида пинов: Цифровые пины. Это пины: 0,1,2,4,7,8,12 Цифровые пины с функцией PWM (Широтно-импульсная модуляция). Это пины: 3,5,6,9,10,11,13 Аналоговые пины: Это пины: А0,А1,А2,А3,А4,А5
Цифровые пины Если пин работает на вход (INPUT), то любое напряжение на нем, рассматривается микроконтроллером как 1 (единица), а если напряжение отсутствует то 0 (ноль). Таким образом используя цифровой пин на выход, вы можете только узнать о том факте есть на пине напряжение или нет, но не то какой оно величины, для этого есть другие пины, о которых будет сказано чуть ниже. Получить информацию о состоянии данного типа пина в можете так:
В переменную val будет записано значение 1 или 0, что будет означать: 1 — есть напряжение, 0 — нет напряжения.
Если пин работает на выход (OUTPUT), то вы можете либо подать на пин максимальное напряжение либо подать на пин нулевое напряжение, но регулировать уровень напряжения вы не сможете. Подать напряжение на пин вы можете следующим образом:
Константы HIGH и LOW в данном контексте означают, подать/выключить (HIGH) и не подавать/выключить (LOW). В целом просто цифровой пин это как выключатель, имеющий лишь два положение либо «Вкл.» либо «Выкл.» и вы можете либо узнавать положение выключателя либо управлять этим выключателем.
Цифровые пины с функцией PWM Если пин работает на вход (INPUT), то он совершенно аналогичен обычному цифровому пину работающему на вход.
Если пин работает на выход (OUTPUT), то с помощью функции PWM мы получаем возможность контролировать напряжением и подавать его от нулевого до максимального (на самом деле меняется не напряжение а сигнал PWM но в целом выглядит именно как изменение напряжения). Для того что бы сделать это, вам потребуется всего пара строк кода (Запишите в требуемый цифровой пин с функцией PWM любое значение от 0 до 255):
Таким образом возможный диапазон напряжений «размазывается» по диапазону от 0 до 255 соответственно. То есть получается следующие, если к примеру ваш Arduino может выдавать на пин от 0В до +5В, то значение 0 будет равно 0В, значение 255 будет равно +5В, а например значение 128 будет равно 2.5В, так как 128 это половина диапазона 0-255. Таким образом вы можете рассчитать любое требуемое вам напряжение в данном диапазоне.
Аналоговые пины Если пин работает на вход (INPUT), то данный пин может узнавать уровень напряжения которое присутствует на нем. Эти пины как правило являются теми самыми «рабочими лошадками» которые получают информацию об уровне напряжения с различных аналоговых датчиков.(Например в эксперименте: Ночной светильник, вы будите получать информацию о напряжение с фоторезистора что бы определить уровень освещенности) Получить значение информацию об уровне напряжения на пине можно так:
В переменную val будет записано значение от 0 до 1023. Диапазон возвращаемых данной функцией значений от 0 до 1023, уровень напряжение на пине от нуля до максимального будет «размазано» по данному диапазону, таким образом 0 будет соответствовать отсутствию напряжения а 1023 будет соответствовать максимальному входящему напряжению.
Если пин работает на выход (OUTPUT), то данный пин работает совершенно так же как и цифровой пин с функцией PWM. И совершенно все что было сказано про цифровой пин с функцией PWM выше, применимо к аналоговым пинам работающим на выход. Установить требуемый уровень напряжения на пине можно так:
Важно обратить внимание на следующие, хотя пины и называются аналоговыми и способны изменять уровень входящего напряжения, так как микроконтроллер имеет встроенный АЦП (аналогово-цифровой преобразователь) но вот выходное напряжение достигается опять такие с помощью PWM сигнала, так как Arduino UNO не имеет встроенного ЦАП (цифро-аналоговой преобразователь) что бы выдавать аналоговый сигнал. Таким образом, в режиме работы аналоговых пинов на выход, вы получаете именно PWM сигнал. В большинстве случаев это не имеет никакого значения, но в некоторых ситуациях может быть очень важным.
В целом с помощью описанных выше базовых функций управления пинами, вы можете управлять внешними устройствами а так же получать информацию от этих устройств. В этом и есть суть микроконтроллера, получать информацию с пинов, «прогонять» ее через логику и расчеты и в зависимости от результатов выставлять какие-то значения на другие пины.
А в заключении пара важных моментов которые вы обязаны помнить: Обязательно устанавливаете режимы пинов, (желательно делать это в функции setup), какой пин в каком режиме вы будите использовать, с помощью функции pinMode(), это обязательно, следите за этим. Arduino способен пропускать через каждый пин ток не более чем 20 mA (миллиампер), а это значит что вы должны всегда следить за этим в своих проектах, и при необходимости обязательно использовать токоограничивающие резисторы. В противном случае вы можете легко сжечь микроконтроллер. Максимальное напряжение питания 12В, не подавайте напряжение выходящие за этот предел, это может привести к выходу из строя вашего Arduino.
Вот в общем то и все, этих знаний об Arduino уже достаточно для ваших первых экспериментов. А теперь пришла пора от теории и скучного чтения перейти к практике, и начать уже наконец использовать ваш Arduino с эксперимента — Маячок.
Способы чтения и управления портами ввода-вывода Arduino
Для взаимодействия с окружающим миром нужно настроить выводы микроконтроллера на приём или передачу сигнала. В результате каждый пин будет работать в режиме входа и выхода. На всеми любимой плате Arduino сделать это можно двумя способами, как именно вы узнаете из этой статьи.
Способ первый – стандартный язык для Arduino IDE
Всем известно, что Ардуино программируется на C++ с некоторой адаптацией и упрощениями для новичков. Он называется Wiring. Изначально все порты ардуино определяются как входы, и нет нужды задавать это в коде.
Порты обычно прописываются в функции инициализации переменных:
Для этого используется команда pinMode, у неё достаточно простой синтаксис, сначала указывается номер порта, затем его роль через запятую.
pinMode (nomer_porta, naznachenie)
С помощью этой команды внутренняя схема микроконтроллера конфигурируется определенным образом.
Есть три режима в которых может работать порт: INPUT – вход, в этом режиме происходит считывание данных с датчиков, состояния кнопок, аналогового и цифрового сигнала. Порт находится в т.н. высокоимпедансном состоянии, простыми словами – у входа высокое сопротивление. Устанавливается это значение, на примере 13 пина платы, при необходимости так:
pinMode (13, INPUT);
OUTPUT – выход, в зависимости от команды прописанной в коде порт принимает значение единицы или нуля. Выход становится своего рода управляемым источником питания и выдаёт максимальный ток (в нашем случае 20 мА и 40 мА в пике) в нагрузку к нему подключенную. Чтобы назначить порт как выход на Arduino нужно ввести:
pinMode (13, OUTPUT);
INPUT_PULLUP – порт работает как вход, но к нему подключается т.н. подтягивающий резистор в 20 кОм.
Условную внутреннюю схему порта в таком состоянии вы видите ниже. Особенностью этого входа является то, что входной сигнал воспринимается как проинвертированный («единица» на входе воспринимается микроконтроллером как «ноль»). В таком режиме вы можете не использовать внешние подтягивающие резисторы при работе с кнопками.
pinMode (13, INPUT_PULLUP);
Данные принимаются с портов и передают на них командами:
digitalWrite(пин, значение) – переводит выходной пин в логическую 1 или 0, соответственно на выходе появляется или исчезает напряжение 5В, например digitalWrite (13, HIGH) – подаёт 5 вольт (логическую единицу) на 13 пин, а digitalWrite (13, low) – переводит 13 пин в состояние логического ноля (0 вольт);
digitalRead(пин) – считывает значение со входа, пример digitalRead (10), считывает сигнал с 10 пина;
analogRead(пин) – считывает аналоговый сигнал с аналогового порта, вы получаете значение в диапазоне от 0 до 1023 (в пределах 10-битного АЦП), пример analogRead (3).
Способ два – управление портами через регистры Atmega и ускорение работы кода
Такое управление конечно простое, но в этом случае есть два недостатка – большее потребление памяти и низкое быстродействие при работе с портами. Но вспомните что такое Arduino независимо от варианта платы (uno, micro, nano)? В первую очередь, это микроконтроллер AVR семейства ATMEGA, в последнее время используется МК atmega328.
В Arduino IDE вы можете программировать на родном для этого семейства языке C AVR, так, как если бы вы работали с отдельным микроконтроллером. Но обо всем по порядку. Чтобы управлять портами Ардуино таким образом вам нужно сначала внимательно рассмотреть следующую иллюстрацию.
Возможно кому-то будет нагляднее изучать порты в таком виде (на рисунке тоже самое, но в другом оформлении):
Здесь вы видите соответствие выводов Ардуино и названий портов атмеги. Итак, у нас есть 3 порта:
Исходя из изображенного на рисунках, я составил таблицу соответствия портов Ардуино и Атмеги, она пригодится вам в дальнейшем.
У Atmega есть три регистра длиной в 8 бит, которые управляют состоянием портов, например, порта B разберемся в их назначении проведя аналогии со стандартными средствами wiring описанными в начале статьи:
PORTB – Управление состоянием вывода. Если пин находится в режиме «Выхода», то 1 и 0 определяют наличие этих же сигналов на выходе. Если же пин находится в режиме «Входа», то 1 подключает подтягивающий резистор (тоже что и INPUT_PULLUP рассмотренный выше), если 0 – высокоимпедансное состояние (аналог INPUT);
PINB – регистр чтения. Соответственно в нём находится информация о текущем состоянии выводов порта (логическая единица или ноль).
DDRB – регистр направления порта. С его помощью вы указываете микроконтроллеру чем является порт – входом или выходом, при этом «1» — выход, а «0» — вход.
Вместо буквы «В» может быть любая другая согласно названиям портов, например, PORTD или PORTC аналогично работают и другие команды.
Научитесь разрабатывать устройства на базе микроконтроллеров и станьте инженером умных устройств с нуля: Инженер умных устройств
Помигаем светодиодом, заменим стандартную функцию digitalWrite(). Для начала вспомним как выглядит исходный пример из библиотеки Arduino IDE.
Это код всем известного «blink», который демонстрирует мигание светодиодом, встроенным в плату.
В комментариях даны пояснения к коду. Логика такой работы заключается в следующем.
Команда PORTB B00100000 переводит PB5 в состояние логической единицы, смотрим, а те картинки и таблицу что расположены ниже и видим, что PB5 соответствует 13 пину Ардуины.
Буква «В» перед цифрами говорит о том, что мы в записываем значения в двоичном виде. Нумерация в двоичном коде идёт справа налево, т.е. здесь единица стоит в шестом с правого края бите, что говорит микроконтроллеру о взаимодействии с состоянием шестого бита регистра порта B (PB5). В таблице ниже изображена структура порта D, она аналогична и приведена для примера.
Вы можете задавать значение не в двоичном, а в шестнадцатеричном виде, например, для этого открываем калькулятор windows и в режиме «ВИД», выбираем вариант «Программист».
Вводим желаемое число:
И нажимаем на HEX:
В таком случае переносим это всё в Arduino IDE, но уже вместо приставки «В» будет «0х».
Но при таком вводе возникает проблема. Если у вас к другим пинам подключено что-либо, то внося команду типа B00010000 – вы все выводы кроме 13 (PB5) обнулите. Вы можете вносить данные на каждый пин по отдельности. Это будет выглядеть следующим образом:
Такая запись может показаться непонятной, давайте разберемся.
Это операция логического сложения, |= значит прибавить к содержимому порту что-либо.
А это значит, что нужно сложить слово из 8 бит в регистре с единицей, смещенной на 5 бит – в результате, если было 11000010 получается 11010010. На этом примере видно, что изменился только PB5, остальные биты этого регистра остались без изменений, как и остались неизменными состояния выводов микроконтроллера.
Но при логическом сложении возникает проблема – вы не можете превратить единицу в ноль, потому что:
Нам на помощь придёт логическое умножение и инвертирование:
&= значит умножить содержимое порта на определенное число.
А это число, на которое мы умножает. Знак «
» обозначает инвертирование. В нашем случае проинвертированная единица является нулем. То есть мы умножаем содержимое порта на ноль, сдвинутый на 5 бит. Например, было 10110001, стало 10100001. Остальные биты остались без изменений.
Тоже самое можно сделать с помощью операции инвертирования (^):
Чтение с портов, аналог digitalRead() выполняют с помощью регистра PIN, на практике это выглядит так:
Здесь мы проверяем равно ли выражение в скобках реальному состоянию портов, т.е. аналогично тому, если бы мы написали if (digitalRead(12) == 1).
Пошаговое обучение программированию и созданию устройств на микроконтроллерах AVR: Программирование микроконтроллеров для начинающих
Заключение
Для чего такие сложности с управлением портами, если можно использовать стандартные удобные функции? Всё дело в быстродействии и размерах кода. При использовании второго способа, рассмотренного в статье размер кода, значительно снижается, а быстродействие увеличивается на несколько порядков. Стандартный digitalWrite() выполнялся за 1800 мкс, а запись прямо в порт за 0,2 мкс, а digitalRead() за 1900 мкс, а стал также за 0,2 мкс. Этот способ управления был найден на просторах сети и часто встречается в коде готовых проектов.