Darbe.ru

Быт техника Дарби
5 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

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

AimsK

Радиоэлектроника и техника, которая нас окружает. Описание готовых конструкций, изготовление самодельных устройств, ознакомление с элементарными основами радиотехники в теории и на практике.

Страницы

  • Главная страница
  • Содержание
  • Контакты
  • Наш канал на YouTube

среда, 28 августа 2019 г.

FLProg Arduino Atmega8 и немного Visual Studio

1.После установки программы подключил Arduino UNO к USB порту, нашел папку (у меня здесь по умолчанию C:Program Files (x86)FLProgideV3) и запустил файл «arduino exe». Теперь все готово для создания программатора на базе UNO.

2.В меню «Инструменты — Плата» выбрал «UNO», программатор «AVRISP mkll» и «Порт COM5» возможно у вас номер порта будет другой.

3.Далее в меню «Файл-Примеры» выбрал скетч «ArduinoISP»

4. Затем перешел к пункту меню «Скетч» и нажал «Загрузка» или что тоже самое стрелка в кружке. Все прошивка залита, программатор готов.

5. Далее перешел в меню «Файл – Настройки» здесь я нечего не менял только в поле «Дополнительные ссылки для Менеджера плат» вставил вот эту ссылку ( https://raw.githubusercontent.com/sleemanj/optiboot/master/dists/package_gogo_diy_atmega8_series_index.json ) и нажал окей.

6. И снова выбрал «Инструменты-Плата» далее перешел в раздел «Менеджер плат» там нашел установочный пакет, он был в самом низу, как показано на картинке 7.

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

8. Опять перехожу в «Инструменты-Плата» и ищу ATmega8/A и выбираю ее.

9. Теперь снова к пункту «Инструменты — Программатор» и меняю его нажатием с «AVRISP mkll» на «Arduino as ISP» вот так.

10. Если все правильно, то должны появиться дополнительные настройки микроконтроллера, здесь я нечего не менял. Теперь временно отключаю питание UNO и подключаю к ней ATmega8 (мануал здесь) он заранее размещен на макетной плате и согласно верхнего рисунка соединяю к нему шесть проводов. Проверяю все ли правильно и снова подаю питание, в меню «Инструменты» см. картинку 10 жму «Записать загрузчик».

11. Наконец-то микроконтроллер ATmega8 готов к заливке. Пробую скетч с мигающим светодиодом, все работает, но надо что-то посерьёзнее. Подключаю LCD дисплей 1602 к шине I2C через плату конвертер. Нужно соединить два провода для питания VCC, GND (ножки 7 и 8) и два провода к пинам A4-SDA, A5-SCL микросхемы ATmega8 (ноги 27 и 28 соответственно). Пробую записать скетч из примеров, перехожу «Файл-Примеры» выбираю программку «LiquidCrystal_I2C – BlinkingCursor» 11 рисунок.

12. Далее в меню «Скетч» выбираю и жму «Загрузить через программатор», перемигивание светодиодов на UNO свидетельствует о том, что идет загрузка файла.

Через несколько секунд на дисплее появился текст с мигающим курсором и без см. фото ниже, и надпись в программе загрузка завершена, рисунок 13, если нет ничего, то необходимо настроить контрастность на плате I2C.

Все отлично работает. Закрываю программу Arduino IDE и отключаю устройство.

Дополнительно уже к этой схеме добавляю часы реального времени DS3132 также к шине I2C, еще соединяю три кнопки без фиксации для управления таймером одним контактом к минусу другим к ножкам микроконтроллера D2, D3, D4 и пятивольтовое реле два провода к питанию, а третий управляющий провод к пину D7 мк ATmega8.

Снова включаю и теперь уже запускаю программу FLProg, создаю входы и выход выбираю в настройках часы и дисплей и пробую составить алгоритм работы простого таймера, который будет включать и отключать нагрузку через реле по истечению установленного времени, ранее я уже делал что-то подобное, но для Arduino Nano в ней флэш памяти 32к а в ATmega8 не более 8к с учетом загрузчика.

Ну вот, кажется, вариант таймера готов. Триггеров, экранов, переменных, всего надо поменьше и вот ОН момент. Нажимаю Компилировать, пока все идет хорошо.

Появилось окно программы Arduino IDE, здесь выбираю «Скетч» и жму «Загрузить через программатор», еще несколько секунд ожидания и прошивка записана в микроконтроллер. Появилась надпись загрузка завершена и размеры файла, я так полагаю что залез впритык, рисунок 16.






















Немного о работе таймера. Время задается в секундах в верхней строке, например для 3-х минутного отчета необходимо набрать 180 секунд. Управление тремя кнопками — одна кнопка пуск, две другие добавить и убавить на одну секунду, при одновременном нажатие последних происходит сброс счетчика. В нижней строчке идет прямой отчет в формате часов. Визуально в конце заметно раннее срабатывание реле на 1с., но при старте показания на дисплее тоже отстают, так что есть компенсация.
Работа таймера на видео.

Чтобы Visual Studio работала с Arduino и микроконтроллерами, необходимо установить в меню «Расширения» см. на рисунке дополнительный пакет, настроить связи, подключить библиотеки и теперь создаваемые прошивки можно записывать напрямую из VS в Ардуину в моем случае в Атмегу8.

Разрешите представиться – проект FLProg 04.12.2015 14:22

e5b43a5a40fc4a76a7d237ad0304d937.jpg

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

Читайте так же:
Мигает монитор ноутбука что делать

Среды программирования плат ардуино можно разделить на следующие типы:

  1. Прокачанные «Блокноты»
  2. Текстовые среды разработки
  3. Графические среды, визуализирующие структуру кода.
  4. Графические среды, отображающие код в виде графики.
  5. Визуальные среды программирования, не использующие кода.

Рассмотрим каждый тип.

Прокачанные «Блокноты»

К этому типу относятся оригинальная среда программирования Arduino-IDE, а так же множество её клонов.

f2b23aeb31024cc2b90355861641b809.PNG

Проектирование программы для контроллера в ней происходит на языке Processing/Wiring, который является диалектом языка Си (скорее Си++). Эта среда представляет собой, по сути, обычный текстовый редактор с возможностью загрузки написанного кода в контроллер

Текстовые среды разработки

Альтернативой Arduino IDE является среда разработки от производителя микроконтроллеров Atmel — AVRStudio.

1bec7a6ff3b64c49a28516c1b6ba9099.png

Программирование в ней ведётся на чистом C, и она уже имеет намного больше возможностей и более похожа на серьёзные IDE для «настоящих» языков программирования.

Эти два типа программ рассчитаны на опытных программистов, которые хорошо знают язык и могут с помощью них создавать серьёзные проекты.

Графические среды, визуализирующие структуру кода.

Это программы, которые, по сути, являются расширением форматирования для обычного текстового редактора кода. В нем программа так же пишется на языке С, но в более удобном варианте. Сейчас таких сред очень много, самые яркие примеры: Scratch, S4A, Ardublock. Они очень хорошо подходят для начального обучения программированию на языке С, поскольку отлично показывают структуру и синтаксис языка. Но для больших серьёзных проектов программа получается громоздкой.

db88e9a366c8431ea59d8ad35f6f9d03.jpg

Графические среды, отображающие код в виде графики

Это программы, скрывающие код и заменяющие его графическими аналогами. В них так же повторяется структура языка, формируются циклы, переходы, условия. Так же очень хорошо подходят для обучения построению алгоритмов, с последующим переходом на программирование на классических языках. И так же не подходят для построения больших проектов ввиду громоздкости получаемого отображения. Пример такой программы: MiniBlog, Algorithm Builder, Flowcode

4eb81ee2a90b451887aa7a618f5e6c2f.png

Описанные выше типы программ рассчитаны на программистов или на тех, кто решил изучать классическое программирование. Но для изготовления конечного устройства кроме непосредственно программирования контроллера обычно требуется разработка внешней обвязки платы, разработка и расчет силовой части, входных развязок и многого другого. С этим у программистов часто возникают проблемы. Зато с этим прекрасно справляются электрики и электронщики. Но среди них мало программистов, которые смогли бы составить программу для контроллера. Сочетание программиста и электронщика — достаточно редкий случай. В результате такой ситуации реальных, законченных проектов на основе плат Arduino (да и других контроллеров) единицы. Для решения этой проблемы и служат программы последнего типа.

Визуальные среды программирования, не использующие кода.

Данные программы реализуют принцип, который уже много лет применяется практически всеми производителями контроллеров промышленного применения. Он заключается в создании программ для контроллера на языках FBD или LAD. Собственно говоря, как таковыми языками они не являются. Это, скорее, графические среды для рисования принципиальных или логических схем. Вспомним, что процессоры далеко не всегда были микропроцессорами, а создавались на базе цифровых микросхем. Поэтому тем, кто привык работать с цифровой техникой, больше понравится работа на них, чем написание кода на классических языках программирования. Примером таких программ являются проекты Horizont и FLProg. Программы этого типа хорошо подходят как для изучения построения импульсной и релейной техники, так и для создания серьезных проектов.

c706671bae264eaabaa627a4f4eb86c9.png
Ну и наконец, герой этого блога, проект FLProg.

Поскольку я много лет работаю разработчиком систем АСУТП, я постарался собрать в программе FLProg все, что мне наиболее понравилось в средах от ведущих производителей промышленного оборудования (Tia-Portal, Zelio Soft, Logo Soft Comfort).
Программа позволяет составлять схемы в двух видах: функциональные схемы (FBD) и релейные схемы (LAD).

eec1b0d3add242ecbe41905508e557d3.PNG

FBD (Function Block Diagram) — графический язык программирования стандарта МЭК 61131–3. Программа образуется из списка цепей, выполняемых последовательно сверху вниз. При программировании используются наборы библиотечных блоков. Блок (элемент) — это подпрограмма, функция или функциональный блок (И, ИЛИ, НЕ, триггеры, таймеры, счётчики, блоки обработки аналогового сигнала, математические операции и др.). Каждая отдельная цепь представляет собой выражение, составленное графически из отдельных элементов. К выходу блока подключается следующий блок, образуя цепь. Внутри цепи блоки выполняются строго в порядке их соединения. Результат вычисления цепи записывается во внутреннюю переменную либо подается на выход контроллера.

ad4dcf4b8801473ab15b18728a008df2.PNG

Ladder Diagram (LD, LAD, РКС) — язык релейной (лестничной) логики. Синтаксис языка удобен для замены логических схем, выполненных на релейной технике. Язык ориентирован на специалистов по автоматизации, работающих на промышленных предприятиях. Обеспечивает наглядный интерфейс логики работы контроллера, облегчающий не только задачи собственно программирования и ввода в эксплуатацию, но и быстрый поиск неполадок в подключаемом к контроллеру оборудовании. Программа на языке релейной логики имеет наглядный и интуитивно понятный инженерам-электрикам графический интерфейс, представляющий логические операции, как электрическую цепь с замкнутыми и разомкнутыми контактами. Протекание или отсутствие тока в этой цепи соответствует результату логической операции (истина — если ток течет; ложь — если ток не течет). Основными элементами языка являются контакты, которые можно образно уподобить паре контактов реле или кнопки. Пара контактов отождествляется с логической переменной, а состояние этой пары — со значением переменной. Различаются нормально замкнутые и нормально разомкнутые контактные элементы, которые можно сопоставить с нормально замкнутыми и нормально разомкнутыми кнопками в электрических цепях.

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

Читайте так же:
Можно ли подключить вайбер на компьютер

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

В настоящее время программой поддерживаются следующие версии Arduino: Arduino Diecimila, Arduino Duemilanove, Arduino Leonardo, Arduino Lilypad, Arduino Mega 2560, Arduino Micro, Arduino Mini, Arduino Nano (ATmega168), Arduino Nano (ATmega328), Arduino Pro Mini, Arduino Pro (ATmega168), Arduino Pro (ATmega328), Arduino UNO. Кроме того недавно в списке поддерживаемых контроллеров появилась плата Intel Galileo gen2. В дальнейшем предполагается пополнение и этого списка, и, возможно, добавление плат, основанных на контроллерах STM.

b55ac36399e845368377eed944605612.PNG

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

  • Надпись
  • Изображение
  • [OR]
  • [AND]
  • [Bounce]
  • [XOR]
  • Таблица состояний
  • [SR]
  • [TT]
  • [Rtrig]
  • [RS]
  • [Timer]
  • [Generator]
  • [SpeedCounter]
  • [Counter]
  • [SUM (+)]
  • [MUL (*)]
  • [SUB (-)]
  • [DIV (/)]
  • [COS]
  • [ABS]
  • [MAX]
  • [POW]
  • [SQRT]
  • [TAN]
  • [MIN]
  • [SQ]
  • [RANDOM]
  • [SIN]
  • [Comparator]
  • Отправка в UART
  • Приём из UART
  • Отправка переменной в UART
  • Прием переменной из UART
  • [SWITCH]
  • [MUX]
  • [DMS]
  • ServoMotor
  • StepMotor
  • [Alarm]
  • [GetTime]
  • [SetTime]
  • Дисплей на чипе НD44780
  • Подсветка дисплея на чипе НD44780 I2C
  • Блок декодирования семисегментного индикатора
  • Сложение строк
  • Сравнение строк
  • Длинна строки
  • Поиск подстроки
  • Получение подстроки
  • Получить символ из строки
  • Добавить Char к строке
  • Запись элемента в массив
  • Получение элемента массива
  • Сумма элементов массива
  • Стек
  • Поиск элемента в массиве
  • [DS18×2x]
  • [IR Ressive]
  • [Ultrasonic HC-SR04]
  • [DHT11, DHT21, DHT22]
  • [BMP-085]
  • [BH1750LightMeter]
  • Выгрузка файла с SD карты
  • Запись переменной на SD карту
  • Преобразование Float в Integer
  • Преобразование строк
  • → Byte
  • → Char
  • Расширитель выводов 74HC595
  • Драйвер светодиодов MAX7219
  • Дешифратор
  • Шифратор
  • Чтение бита
  • Запись бита
  • Матричная клавиатура
  • Пьезо динамик
  • Сканирование шины OneWare
  • Запись в EEPROM
  • Чтение из EEPROM
  • RessiveVariableFromCommunication
  • WebServerPage
  • SendVariableFromCommunication
  • WebClient
  • narodmon.ru
  • goplusplatform.com
  • Удалённое управление через RemoteXY
  • Надпись
  • Изображение
  • Контакт
  • Катушка
  • Защита от дребезга
  • Выделение переднего фронта
  • Таблица состояний
  • Двустабильное реле
  • Реле времени
  • Генератор
  • Реле сравнения
  • SIN
  • COS
  • TAN
  • ABS
  • MAX
  • MIN
  • SQ
  • SQRT
  • POW
  • RANDOM
  • Масштабирование
  • Математика
  • Счетчик
  • Аналоговый переключатель
  • Переключатель много к одному
  • Переключатель один ко многим
  • Аналоговый вход контроллера
  • Аналоговый выход контроллера
  • Вход аналогового соеденителя
  • Выход аналогового соеденителя
  • Скоростной счетчик
  • Отправка в UART
  • Приём из UART
  • Отправка переменной в UART
  • Прием переменной из UART
  • Сервомотор
  • Шаговый двигатель
  • Получить данные
  • Будильник
  • Установка времени
  • Дисплей на чипе HD44780
  • Блок управления подсветкой дисплея на чипе HD4480 I2C
  • Блок декодирования семисегментного индикатора
  • Сложение строк
  • Сравнение строк
  • Длинна строки
  • Поиск подстроки
  • Получение подстроки
  • Получить символ из строки
  • Добавить Char к строке
  • Запись элемента в массив
  • Получение элемента массива
  • Сумма элементов массива
  • Стек
  • Поиск элемента в массиве
  • Ульразвуковой дальномер HC-SR04
  • Датчик температуры и влажности DHT11 (DHT21, DHT22)
  • Датчик температуры DS18×2x
  • IR Ressive
  • BMP-085
  • BH1750 Light Meter
  • Запись переменной на SD карту
  • Выгрузка файла с SD карты
  • Конвертация строк
  • Преобразование Float в Integer
  • → Byte
  • → Char
  • Расширитель выводов 74HC595
  • Драйвер светодиодов MAX7219
  • Шифратор
  • Дешифратор
  • Чтение бита
  • Запись бита
  • Матричная клавиатура
  • Пьезо динамик
  • Сканирование шины OneWare
  • Запись в EEPROM
  • Чтение из EEPROM
  • Блок отправки переменной через коммуникации
  • Прием переменной через коммуникации
  • Страница Web сервера
  • Web клиент
  • Передача данных на narodmon.ru
  • Удалённое управление через RemoteXY

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

Матричная клавиатура на arduino. Опрос кнопок

Подумал, что интересно будет не только делать уроки, а сразу делать реальное изделие, которое можно применить в жизни. По основной работе я занимаюсь системами безопасности, и очень часто работаю с системами контроля доступа. Я работал с Болид, z5r, z5r web, и т.д. Какие-то системы невероятно сложные в установке и настройке (Болид привет), каким-то не хватает стабильности и функционала.

Решил попробовать сделать открытую систему прохода, с возможностью настройки и контроля по телефону. Начнём с ардуино, потом возможно перейдём на более мощный кристалл, а затем перенесём всё на свою плату, сделаем дизайн корпусов, напечатаем на 3д принтере. В первых уроках реализуем следующий функционал:

  • Управление замком – нужна поддержка электромагнитного замка и электромеханического
  • Управление временем открытия замка – в случае применения электромагнитного замка, пользователь не успеет выйти за 1 секунду, а где-то нужно и 5 секунд
  • Доступ с внешней стороны по 4-значному коду, изменение кода доступа также производится с клавиатуры
  • С внутренней стороны – выход по кнопке
  • Buzzer – небольшой динамик, который сигнализирует, и понятен на слух, разрешён ли проход или нет
  • Джампер аппаратного сброса
Читайте так же:
Можно ли подключиться к wifi через компьютер

Нарисуем схему в Proteus, на которой будем проверять код, перед тем как собирать в реальном железе.

В первой статье попробуем считывать значения клавиатуры. Конечно, можно подключить каждую кнопку отдельно, но для этого нам понадобится 12 контактов, а можно очень просто сократить их до 7, путём динамического считывания клавиш по горизонтали и вертикали. Такие клавиатуры называются матричными.

Принцип работы похож на динамическую индикацию светодиодных сегментных индикаторов, только делаем всё наоборот – не выводим информацию, а поочерёдно читаем. Рассмотрим схему матричной клавиатуры

У кнопки мгновенного действия минимум два контакта, которые замыкаются при нажатии. Следовательно ряды кнопок объединяем в массив одним контактом, и подписываем каждый ряд, а оставшийся контакт кнопок объединяем в ряды. Например, при нажатии кнопки 3, мы замкнём контакт ряда “A” и контакт столбца “3”

Выберем какие пины мы будем использовать у контроллера и дадим им для удобства осмысленные имена, будем использовать имя row – для строки, и column – для столбца.

Директива #define просто заменяет при трансляции одну последовательность символов на другую, т.е. строка #define row1 12 означает, что везде где в тексте программы встретится имя row1 компилятор заменит его на символы 12.

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

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

Двумерный массив даёт понятное представление данных в нём, визуально это полная копия клавиатуры. Перейдём непосредственно, к самому коду и алгоритму считывания данных, но сначала разберёмся, как мы будем определять нажатую клавишу. На ряды мы будем поочерёдно подавать низкий логический уровень, а во вложенном цикле на столбцах будем пытаться по очереди считать этот низкий уровень. Если в момент опроса увидим низкий уровень, то в алгоритме цикла будет легко понять, какой ряд и столбец мы сейчас опрашиваем. Поэтому не забудем задать режим работы i/o пинов микроконтроллера. Ряды – на выход, столбцы – на вход.

Я не задаю программную Pull-up подтяжку для входных строк, потому-что в данном случае, использую резисторы на самой плате микроконтроллера. Выходы же можно не назначать в логическую 1, потому-что при старте контроллера, в первом цикле for, они и так примут нужные значения. Алгоритм считывания состоит из двух циклов for, один у нас перебирает строки по очереди, а второй цикл for перебирает ряды внутри каждой строки. Рассмотрим цикл for Для перебора строк.

В первом цикле for мы указываем переменную r, которую будем использовать в самом теле цикла. Помним, что выводы контроллера, которые подсоединены к рядам, настроены на выход, причём в логической “1”. Чтобы сделать опрос конкретного ряда, нам нужно понизить логический уровень до “0”, что мы и сделаем командой

В первом цикле, когда r=1, у нас будет keypadOut[0], что равно row1. Так получилось, потому-что 1 – 1 = 0 . Тут нужно не забывать, что ардуино это с++, а значит нумерация массива начинается с 0. Понятнее будет на картинке.

Если мы не будем использовать формулу [r – 1], то дойдя до 4 цикла, значение массива станет keypadOut = 4, что приведёт к ошибке, потому-что это будет уже 5 элемент массива, а размерность его мы задали [4].

Затем нам нужно будет сделать 3 опроса столбцов в следующем цикле, разберём этот кусок кода чуть дальше. После опросов столбцов, чтобы перейти к следующему ряду, нам нужно будет обратно вернуть логическую “1” на ряде, который мы сканировали, командой

Перейдём непосредственно к циклу опроса столбца. Это аналогичный цикл for, только уже для 3 переменных, из-за структуры клавиатуры.

Здесь мы наоборот, ничего не подаём на выход, а считываем значения из массива keypadIn[3], который может принимать значения column1, column2 или column3. Если вдруг в какой-то момент мы замечаем низкий уровень на входе столбца, то в этот момент мы можем определить нажатую кнопку, так как мы знаем в какой итерации циклов FOR мы находимся, и знаем переменные r и c. Определить это можно следующей конструкцией

Помним про свойство массивов, что нумерация начинается с 0, и в итоге считываем нажатую клавишу из этого массива

Например, если сработка произошла при r=3 и c=2, то keyboardValue будет со значением [2][1], т.е. пример значение “8”. Для наглядности работы цикла я сделал небольшое видео, которое точно даст понимание, как действует алгоритм.

Читайте так же:
Интел кор 2 дуо сокет

Попробуем запустить всё это в proteus, и нажмём кнопку 3. Для начала посмотрим на графики осциллографа, и увидим, что наш код выполняется правильно. row1 падает до низкого уровня, затем row2, затем row3. На 4 дорожку я подключил столбец 1, и тут мы замечаем первую проблему – дребезг контактов и длительность нажатия кнопки, приводит к нескольким срабатываниям

Один раз нажав на “1” мы получаем 7-8 сообщений в терминале, значит нужно эту проблему решить. В реальной жизни, мы ещё столкнёмся с диким дребезгом контактов, что можно поймать и 100 сработок в момент нажатия кнопки. В целом, сейчас мы опрашиваем кнопки в цикле Loop, и другого кода у нас нет, следовательно опрос идёт слишком часто. Попробуем добавить самую простую задержку delay, если мы заметили срабатывание кнопки, а затем повторно проверить состояние кнопки

Результат уже намного лучше – но всё равно присутствуют повторные нажатия

В какой-то момент, удаётся поймать однократное нажатие, и легко понять по виртуальному осциллографу почему. Длительности импульса от нажатия хватило, чтобы код сработал, он был более 60ms, оставшийся всплеск составил чуть менее 40ms, и программа не сделала условие if.

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

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

В заключение хотелось бы поговорить об аппаратных проблемах, которые нас могут ждать, если мы используем готовую матрицу клавиатуры. Что, например произойдёт, если одновременно нажать пару кнопок? Рассмотрим плохой вариант, если кнопки попадут на один столбец

В момент опроса, у нас низкий уровень поочередно меняется с первого ряда на 4-ый, но остальные при этом имеют выход 5В. Произойдёт КЗ, что очень плохо для МК. Чтобы этого не произошло нужно добавить диоды, и даже при нажатии двух таких кнопок, отрицательный потенциал не сможет пройти через анод.

Верхние же резисторы используются в качестве pull-up подтяжки, чтобы создать логическую 1 на входе ног, отвечающих за столбцы, но можно конечно задействовать и программную подтяжку.

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

Когда писал об организации меню в МК использовал клавиатуру 2х2 и не описал какой принцип сканирования клавиатуры. Сейчас хочу исправить это упущение.

  1. У нас есть биты порта настроенные на выход (в нашем случае будут биты 0-3 PORTD) и есть биты настроенные на вход (биты 4-7 PORTD).
  2. На выходах единица. На входах включен подтягивающие резисторы.
  3. Устанавливаем один из битов выхода в нуль и проверяем все входы порта на нуль. Если на входе везде единица, тогда устанавливаем следующий бит в нуль и снова проверяем входы на нуль и т.д. до последнего бита выхода, а затем начинаем заново. Если, например, мы установили бит 0 в нуль и при проверке входов на бите 4 обнаружен нуль, тогда мы считаем что была нажата кнопка и функция возвращает код кнопки. С которым мы дальше и работаем в основной программе.

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

Нарисуем схему подключения клавиатуры.

Подключение питания микроконтроллера не показано.

CLM1-CLM4 и есть выходы нашего порта, состояние которых мы будем менять.

ROW1-ROW4 это входы порта, состояние которых будем смотреть.

Приведу здесь код функции сканирования клавиатуры с комментариями. Простой пример использования клавиатуры с проектом в Proteus можно скачать в конце статьи.

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

Главное понять принцип работы, а потом можно обобщить на любое количество кнопок. Например, используя два порта — один на выход, другой на вход, можно подключить 64 кнопки (не знаю, пока, зачем это может понадобиться) и код нажатой кнопки передавать по SPI на другое устройство, которое будет заниматься обработкой.

8 комментариев

«Уважаемый Dmitry, давно хотел задать этот вопрос.

В интернете множество схем кодовых замков на микроконтроллерах, и почти во всех их используется строчно-столбцовая организация клавиатуры. Меня в них пугает следующая ситуация: допустим, человек, не знающий кода или просто хулиган попытается если не подобрать код, то просто поиграть с такой клавиатурой. И будет жать всё подряд. И наступит момент, когда он нажмёт хотя бы две кнопки в одной строке (если по Вашей схеме). Тогда два столбца (то есть выходы, на которых разные состояния) окажутся замкнуты на неопределённый промежуток времени, а это не есть гуд. Возникает вопрос — 1. можно ли конфигурировать DDRD прямо во время основного цикла, находу, чтобы в один момент времени только один вывод был выходом? 2. Или единственный выход из ситуации — использование «»обычной»» организации клавиатуры — то есть сколько кнопок, столько и входов, а все кнопки подключены к массе? Но ведь готовая клавиатура от профессионального номеронабирателя — просто загляденье, поэтому строка/столбец — предпочтительней.

Читайте так же:
Можно ли подключить камеру видеонаблюдения к компьютеру

3. — я не правильно понял и приведённая схема от данного недостатка свободна?»

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

Парсер Хабра

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

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

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

Начнем по порядку.

Программа FLProg позволяет создавать прошивки для плат Arduino с помощью графических языков FBD и LAD, которые являются стандартом в области программирования промышленных контроллеров.

FBD (Function Block Diagram) — графический язык программирования стандарта МЭК 61131-3. Программа образуется из списка цепей, выполняемых последовательно сверху вниз. При программировании используются наборы библиотечных блоков. Блок (элемент) — это подпрограмма, функция или функциональный блок (И, ИЛИ, НЕ, триггеры, таймеры, счётчики, блоки обработки аналогового сигнала, математические операции и др.). Каждая отдельная цепь представляет собой выражение, составленное графически из отдельных элементов. К выходу блока подключается следующий блок, образуя цепь. Внутри цепи блоки выполняются строго в порядке их соединения. Результат вычисления цепи записывается во внутреннюю переменную либо подается на выход контроллера.

Ladder Diagram (LD, LAD, РКС) — язык релейной (лестничной) логики. Синтаксис языка удобен для замены логических схем, выполненных на релейной технике. Язык ориентирован на инженеров по автоматизации, работающих на промышленных предприятиях. Обеспечивает наглядный интерфейс логики работы контроллера, облегчающий не только задачи собственно программирования и ввода в эксплуатацию, но и быстрый поиск неполадок в подключаемом к контроллеру оборудовании. Программа на языке релейной логики имеет наглядный и интуитивно понятный инженерам-электрикам графический интерфейс, представляющий логические операции, как электрическую цепь с замкнутыми и разомкнутыми контактами. Протекание или отсутствие тока в этой цепи соответствует результату логической операции (истина — если ток течет; ложь — если ток не течет). Основными элементами языка являются контакты, которые можно образно уподобить паре контактов реле или кнопки. Пара контактов отождествляется с логической переменной, а состояние этой пары — со значением переменной. Различаются нормально замкнутые и нормально разомкнутые контактные элементы, которые можно сопоставить с нормально замкнутыми и нормально разомкнутыми кнопками в электрических цепях.

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

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

Вид окна программы в режиме языка FBD

Вид окна программы в режиме языка LAD

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

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

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

Для работы с внешними устройствами создано несколько вспомогательных инструментов. Это инструмент инициализации и настройки часов реального времени, инструменты для чтения адресов устройств на шинах OneWire и I2C а так же инструмент для чтения и сохранения кодов кнопок на ИК пульте. Все определённые данные можно сохранить в виде файла и в последующем использовать в программе.

голоса
Рейтинг статьи
Ссылка на основную публикацию
Adblock
detector