Упрощенная принципиальная схема проекта представлена следующим рисунком. На данном рисунке не отображены выводы питания, а также в качестве исполнительного механизма используется светодиод. В качестве управляющего выбран микроконтроллер ATmega8.
Для реализации проекта необходимо задействовать 4 вывода микроконтроллера, а именно ввод данных с «кнопочного поля 0-9», ввод данных с кнопки «сохранить код», вывод для управления исполнительным устройством «замок», вывод подтверждения ввода цифры «цифра».
Для ввода кода используется наборное поле 0-9, выполненное в виде делителя напряжения с переменным коэффициентом деления. Коэффициенты подобраны следующим образом, при нажатии 0 на выходе формируется напряжение 0 вольт, 1- 0.5, 2 — 1.0, 3- 1.5, 4- 2.0, 5- 2.5, ..,9- 4.5, а в свободном состоянии 5 вольт.
Для замера потенциала с «кнопочного поля 0-9» я использовал вывод микроконтроллера связанный с АЦП, это «PINCO». Для возможности замера напряжения на выводе «PINCO», на холст добавлены блоки «ADC_ATmega8A» и «ADC PinCO».
Блок «ADC_ATmega8A» настраивает параметры встроенного в микроконтроллер аналого-цифрового преобразователя, в настройках указал значение опорного напряжения равное напряжению питания микроконтроллера. Таким образом я настроил АЦП для измерения напряжения в диапазоне 0-5 вольт. Для получения значения напряжения на выводе микроконтроллера «PINCO» я использовал блок «ADC PinCO». На выводе блока будет получен дискретный сигнал в диапазоне 0-1023 пропорциональный величине напряжения на выводе «PINCO», причем 0 вольт соответствует значение 0, а 5 вольтам значение 1023. Для приведения напряжения удобному для нас значению я использовал блок «деления» и «константу».
При делении входного диапазона 0-1023 на 90 мы получаем диапазон удобный для нас 0-11 диапазон 0-11. Причем нажатию «кнопки 0» будет соответствовать значение 0, 1- 1, ..,9- 9, а в свободном состоянии (ни одна кнопка не нажата) будет значение 11. Для фиксации события устойчивого состояния линии, использую блок «задержка» и блок «равенство».
На выходе блока «задержка» мы получаем значение которое было на входе блока «задержка» в предыдущем рабочем цикле. При равенстве значений в предыдущем цикле и в текущем мы фиксируем устойчивое состояние линии, при этом на выходе блока «равенство» будет сигнал логической 1 (true), в противном случае 0 (false). Для отфильтровывания значения 11 «свободного состояния линии» используем блоки «меньше», константу 11 и блок логическое «И».
На выводе блока «логическое И» будет присутствовать логическая единица если линия находится в устойчивом состоянии и значение после делителя меньше 11. Чтобы ограничить допустимую скорость ввода значений с «кнопочного поля 0-9», это повышает помехоустойчивость и ограничивает скорость «подбора кода», использую блок «задержка включения» и необходимый ему блок «счетчик миллисекунд».
Для окончательного формирования сигнала «ввода цифры» отследим нарастающий фронт и по данному сигналу сформируем одиночный импульс «ввода цифры». Для этого используем блок «RTRIG».
С целью читаемости схемы и уменьшения дополнительных соединительных линий добавлю «переходы» соединительных линий. Первый переход «введенная цифра», второй «сигнал ввода цифры». Задействуем вывод управляющий светодиодом «цифра принята», в моей схеме это вывод микроконтроллера «PinB6».
Воспользуемся сигналами «введенная цифра» и «сигнал ввода цифры», а так же блоками для хранения дискретных чисел «память» и организуем логику хранения последних введенных чисел. В моем случае я использовал четыре блока «память», что будет определять секретность замка в четыре цифры.
Логика работает следующим образом при поступлении «сигнала ввода символа» значение «введенная цифра» будет записано в блок «память 1», в свою очередь значение ранее содержащее в блоке «память 1» запишется в в блок «память 2» итд. В блоках «память 1»- «память 2» будут хранится последние введенные цифры. Причем в блоке «память 1» будет хранится последняя введенная цифра, в блоке «память 2»- предпоследняя, итд. Добавим «переходы» для значений вводимых символов.
Для хранения кода замка будем использовать энергонезависимую EEPROM память микроконтроллера. Каждую цифру кода будем хранить в отдельной ячейки EEPROM. В нашем случае нам потребуется 4 ячейки памяти. Выберем адреса ячеек EEPROM для хранения кода, для своего проекта я выбрал ячейки 10, 11, 12, 13.
Чтобы считать значение хранящиеся в ячейках EEPROM будем использовать блок «чтение байта EEPROM».
В итоге у нас имеются цифры введенные с «кнопочного поля 0-9» и цифры полученные из ячеек EEPROM, остается сделать сравнение цифр и сформировать сигнал управления исполнительным механизмам замка. Для данной задачи я использовал блок «равенство» и блок «логическое И».
На данном этапе логика кодового замка полностью функционирует, единственное остается «научить» микроконтроллер самостоятельно сохранять нужный пользователю код замка в память EEPROM. Для данной задачи я использую внешний сигнал «сохранить код» и по данному сигналу сформирую импульс записи EEPROM, для этого я воспользуюсь блоками логический вход «PinD6» и блоком «RTRIG», а так же для удобства создам соответствующий переход.
Построим логику записи данных в EEPROM, все сигналы и данные уже сформированы ранее, непосредственно для записи данных в EEPROM будем использовать блок «запись байта в EEPROM».
Логика работы кодового замка описана, общий вид проекта выглядит следующим образом.
Собираем проект:
После сборки проекта мы получили исполняемый *.hex файл размером 1450 байт, делаем вывод что нам можно использовать микроконтроллер с размером flash памяти 2 кбайта.
Тестирование проекта:
Комментарии (20)
lingvo
06.07.2016 16:23А что в этом подходе нестандартного?
lihouzov
06.07.2016 16:39Это попытка переносы промышленного языка FBD на микроконтроллеры.
lingvo
06.07.2016 23:35Да, это нестандартно, но на сегодняшний момент уже устарело. Сейчас действительно интересно не столько графическое программирование, сколько моделирование этого всего на десктопе — еще до этапа компиляции кода. То есть вы должны иметь возможность промоделировать ваш замок со всех сторон на десктопе со всех сторон, и отладить его, прежде чем загружать код в контроллер. Так можно гораздо быстрее найти и исправить ошибки. Типичным представителем этого подхода есть Matlab/Simulink.
lihouzov
07.07.2016 06:22Была идея использовать для эмуляции утилиту avrsim но к сожалению список поддерживаемых для эмуляции устройств достаточно мал. Сейчас есть идея создать блок «debug», кидаешь ее на форму и программа подключится к устройству и будет возможность внутрисхемной отладки.
lingvo
07.07.2016 11:27Внутрисхемная отладка — это хорошо, но не всегда возможно.
Во первых нужен отдельный порт и соединение с хостом, во вторых, когда оно работает в реал-тайме не всегда возможно отследить или задать нужные сигналы в нужное время. Моделирование гораздо проще в этом плане.
ElectricFromUfa
07.07.2016 12:05Ну зачем же так сложно. Да и к чему эта привязка к конкретной архитектуре микроконтроллера и подключение к устройству вообще. Пользователи же захотят не имея контроллера отладить несложную схему.
У вас же некий FBD-интерпретатор в микроконтроллере? Вы когда-нибудь захотите его перенести на другое железо.
На мой взгляд, достаточно научить вашу среду исполнять в режиме эмуляции тот же FBD-микрокод, который разбирает сейчас микроконтроллер. Ну и дать возможность при симуляции менять входные воздействия.
Я бы ещё попытался поднять работу с периферией микроконтроллера на уровень выше, чтобы максимально отвязать их от конкретного микроконтроллера, а в среде накидывать только логику поведения.lingvo
08.07.2016 10:47И это уже давно изобретено, разработано и продается. Называется Soft-PLC. Адруина, конечно, слишком слабовата для этого, но даже Распберри уже вполне справляется.
SoftPLC — это некий рантайм — операционка реального времени + интерпретатор, который выполняется на заданной платформе и обеспечивает не только выполнение нужного кода в реальном времени, а и его загрузку, выполнение по шагам, отладку, просмотр всех переменных во время работы, работу с периферией через стандартные интерфейсы, коммуникации типа Modbus RTU и т.д.
Типичный пример — Codesys. Рантаймы есть для множества платформ. Моделирование в свою очередь обеспечивается в самой среде программирования. Есть еще TwinCAT. Из опенсоурсного есть Beremiz -его, помоему даже на ту же ардуину и портировали.
VDG
06.07.2016 17:40Подтягивающий резистор на PD6 избыточен, так как есть внутренний.
lihouzov
06.07.2016 17:50Да, совершенно верно избыточный, его можно убрать а в свойстве блока PinD6 выбрать «подтяжка к VCC».
IIvana
07.07.2016 03:14Конечно нестандартно — использовать многоногую Мегу где сгодилась бы и 8-ногая Тинька… Ах да, это же из-за того, что этот визуальный чудо-редактор нам полтора килобайта кода нагенерил… Ну тогда можно развивать нестандартность дальше, и переписать проект на распберри пи, ардуине или вообще на десктопе — на скретче…
lihouzov
07.07.2016 06:24Полтора килобайта кода можно поместить и в 8-ногую тиньку, а по мне это очень даже неплохо поместить данную схему в полтора килобайта.
diller61
07.07.2016 09:56на самую распространенную 13 тиньку нет, там только килобайт
а вообще полтора килобайта на такую задачу это расточительство.
Делая сейчас проектик: измеритель частоты импульсов с медианным фильтром и управление двумя независимыми каналами ШИМ с примитивным ПИД-регулятором на одном — занимает у меня на данный момент ~800 байт. И это на C и я не супер спец по программированию МК, а на ассемблере можно было бы еще ужать.Carburn
07.07.2016 16:53В деньгах экономия большая выходит?
diller61
07.07.2016 17:39тинька стоит 22 руб, мега8 35руб в розницу, sop и tqfp исполнение соответственно
здесь больше вопрос целесообразности и задействования ресурсов
размеры меньше, разводка платы под восьминогий корпус тоже проще и быстрее чем под 32-ногий (и дешевле как и пайка если говорить о промышленности)
в конце концов(в порядке бреда уже) тини13 элементарно легче
safari2012
07.07.2016 15:37Зачем вообще было цифровые кнопки на одну ногу сажать, когда куча ног свободными осталась?
dammer
Интересный обзор, но с точки зрения наглядности и удобства управления логикой мне больше нравится ДРАКОН.
На видео решение похожей задачи