LXF162:Arduino
Olkol (обсуждение | вклад) (→Строки и столбцы) |
Olkol (обсуждение | вклад) (→Объединяем все вместе) |
||
(не показана 1 промежуточная версия 1 участника) | |||
Строка 115: | Строка 115: | ||
После этого нужно лишь воспользоваться функцией shiftin() стандартной библиотеки Arduino для фиксации значения этого байта. Если сдвиговый регистр не один, то входы «защелки» объединяются вместе, и понадобится еще один вызов shiftin() для чтения дополнительного байта данных. | После этого нужно лишь воспользоваться функцией shiftin() стандартной библиотеки Arduino для фиксации значения этого байта. Если сдвиговый регистр не один, то входы «защелки» объединяются вместе, и понадобится еще один вызов shiftin() для чтения дополнительного байта данных. | ||
− | Борьба с дребезгом контактов | + | ===Борьба с дребезгом контактов=== |
Одна из проблем с физическими переключателями, будь то мембранные клавиатуры, тактильные кнопки или переключатели с самовозвратом любых типов, заключается в том, что сигнал может «дрожать». Это термин, используемый для описания эффекта физической природы самих контактов, которые включены и выключены не четко. Такое бывает из-за физической вибрации контакта, поэтому, например, при отпускании клавиши контакты могут дрогнуть и снова замкнуть цепь, пусть и ненадолго. | Одна из проблем с физическими переключателями, будь то мембранные клавиатуры, тактильные кнопки или переключатели с самовозвратом любых типов, заключается в том, что сигнал может «дрожать». Это термин, используемый для описания эффекта физической природы самих контактов, которые включены и выключены не четко. Такое бывает из-за физической вибрации контакта, поэтому, например, при отпускании клавиши контакты могут дрогнуть и снова замкнуть цепь, пусть и ненадолго. | ||
Строка 125: | Строка 125: | ||
Время между сканированием двух наборов данных (если вы не сканируете быстро – в этом случае может использоваться несколько буферов) должно быть достаточным для того, чтобы состояние клавиш установилось. Конечно, оно должно быть и достаточно коротким, чтобы избежать ситуации, когда быстро нажатая клавиша не распознается. По общей рекомендации, время между операциями сканирования должно быть менее 200 мс. | Время между сканированием двух наборов данных (если вы не сканируете быстро – в этом случае может использоваться несколько буферов) должно быть достаточным для того, чтобы состояние клавиш установилось. Конечно, оно должно быть и достаточно коротким, чтобы избежать ситуации, когда быстро нажатая клавиша не распознается. По общей рекомендации, время между операциями сканирования должно быть менее 200 мс. | ||
− | Объединяем все вместе | + | ===Объединяем все вместе=== |
На практике функция чтения клавиатуры скорее всего реализуется как сервис прерываний. В этом случае нужно правильно задать таймер (см. LXF155), чтобы прерывание выдавалось достаточно регулярно для перехвата нажатий клавиш, но не слишком часто, чтобы не съедать все процессорное время. Оно зависит от размера матрицы и метода сканирования – помните, что с ростом размера матрицы время на ее сканирование увеличивается по квадратичной функции. В примере кода на DVD есть процедура прерывания для матрицы 4 × 4 с использованием сдвиговых регистров для управления строками и столбцами. | На практике функция чтения клавиатуры скорее всего реализуется как сервис прерываний. В этом случае нужно правильно задать таймер (см. LXF155), чтобы прерывание выдавалось достаточно регулярно для перехвата нажатий клавиш, но не слишком часто, чтобы не съедать все процессорное время. Оно зависит от размера матрицы и метода сканирования – помните, что с ростом размера матрицы время на ее сканирование увеличивается по квадратичной функции. В примере кода на DVD есть процедура прерывания для матрицы 4 × 4 с использованием сдвиговых регистров для управления строками и столбцами. | ||
Строка 147: | Строка 147: | ||
matrix | matrix | ||
− | Макет – не самое замечательное в мире место для сборки матричной клавиатуры: уж слишком много на нем соединений. Проще будет взять монтажную плату и разместить клавиши на ней (в тех местах, где это необходимо, дорожки надо будет перерезать). | | + | Макет – не самое замечательное в мире место для сборки матричной клавиатуры: уж слишком много на нем соединений. Проще будет взять монтажную плату и разместить клавиши на ней (в тех местах, где это необходимо, дорожки надо будет перерезать). |
+ | ====Маленькие матрицы==== | ||
+ | |||
+ | В ПО Arduino есть библиотека матрицы клавиатуры, которая сканирует матрицу клавиш, не вызывает блокировки и обладает зачаточной обработкой событий. Она работает с различными клавиатурами и использует простой режим сканирования, исключающий эффект ложного срабатывания на клавиатурах без диодов. | ||
+ | |||
+ | Почему мы не воспользовались ею? Единственная проблема в том, что для нее нужно по контакту на каждую строку и столбец, т. е. для матрицы 4 × 4 нужно восемь контактов – заметная часть выводов Arduino. Использование сдвиговых регистров (в основном коде) позволяет снизить их количество до шести, а при объединении нескольких сдвиговых регистров можно работать с гораздо большими матрицами. | |
Текущая версия на 15:14, 12 октября 2018
|
|
|
Электроника. Аппаратные проекты с открытым кодом, расширяющие ваш кругозор.
Содержание |
[править] Arduino: Плюс клавиатура
Нужны устройства ввода? Ник Вейч знакомит нас со сканируемой матрицей и рассказывает о вариантах подключения кнопок к Arduino.
На этом уроке мы поговорим о матрице. Нет, не той, что c красными и синими пилюльками, а о клавиатуре. Раньше мы уже кратко о ней упоминали, а сегодня детально познакомимся с вариантами и стратегией работы с ними. Начнем с более простого.
- Метамодернизм в позднем творчестве В.Г. Сорокина
- ЛитРПГ - последняя отрыжка постмодерна
- "Ричард III и семиотика"
- 3D-визуализация обложки Ridero создаем обложку книги при работе над самиздатом.
- Архитектура метамодерна - говоря о современном искусстве, невозможно не поговорить об архитектуре. В данной статье будет отмечено несколько интересных принципов, характерных для построек "новой волны", столь притягательных и скандальных.
- Литература
- Метамодерн
- Рокер-Прометей против изначального зла в «Песне про советскую милицию» Вени Дркина, Автор: Нина Ищенко, к.ф.н, член Союза Писателей ЛНР - перепубликация из журнала "Топос".
- Как избавиться от комаров? Лучшие типы ловушек.
- Что делать если роблокс вылетает на windows
- Что делать, если ребенок смотрит порно?
- Почему собака прыгает на людей при встрече?
- Какое масло лить в Задний дифференциал (мост) Visco diff 38434AA050
- О чем может рассказать хвост вашей кошки?
- Верветки
- Отчетность бюджетных учреждений при закупках по Закону № 223-ФЗ
- Срок исковой давности как правильно рассчитать
- Дмитрий Патрушев минсельхоз будет ли преемником Путина
- Кто такой Владислав Поздняков? Что такое "Мужское Государство" и почему его признали экстремистским в России?
- Как правильно выбрать машинное масло в Димитровграде?
- Как стать богатым и знаменитым в России?
- Почему фильм "Пипец" (Kick-Ass) стал популярен по всему миру?
- Как стать мудрецом?
- Как правильно установить FreeBSD
- Как стать таким как Путин?
- Где лучше жить - в Димитровграде или в Ульяновске?
- Почему город Димитровград так называется?
- Что такое метамодерн?
- ВАЖНО! Временное ограничение движения автотранспортных средств в Димитровграде
- Тарифы на электроэнергию для майнеров предложено повысить
Как всегда, способов подключения кнопок к Arduino несколько. В самом простом случае одна кнопка назначается на один контакт. Если кнопок не больше четырех, это и вообще лучший вариант: тут вы все равно мало что сэкономите. Если кнопок больше, придется подумать о матрице, или о некотором уплотнении данных.
[править] Методы уплотнения
Простое уплотнение можно реализовать с помощью различных устройств – например, есть специальные микросхемы, сворачивающие восемь линий данных в одну, используя 3 бита как адрес. Самый популярный мультиплексор/демультиплексор – микросхема 4051 и ее варианты; все они работают по описанному выше принципу. Поскольку это всего лишь переключатель, он может работать в обоих направлениях для цифровых и аналоговых входов и выходов, но подходит и для создания клавиатуры.
Схема будет довольно простой (см. Схему 1). При восьми переключателях довольно легко перебрать значения на выводах адреса и считать выходное значение. Единственная сложность по части кода – это задание значений на адресных выводах. К счастью, есть удобная функция bitread(x,y), которая возвращает значение бита для заданного целого числа x. Для перебора значений нам понадобится нечто вроде
int data;
for (int count=0; count<=7; count++) {
digitalWrite(4, bitRead(count,0));
digitalWrite(5, bitRead(count,1));
digitalWrite(6, bitRead(count,2));
bitWrite(data, count, digitalRead(7));
}
Функция bitWrite() собирает отдельные биты в одно целое значение, а каждый вход соответствует одному биту результирующего значения. Здесь предполагается, что 4, 5 и 6 – адресные биты, а 7 – входной контакт.
Этого способа вполне достаточно, чтобы читать данные с простой клавишной панели, не прибегая к реализации полной матрицы. Ограничения этого подхода проявляются при большем количестве клавиш. Можно, конечно, воспользоваться мультиплексорами с большим количеством входов, но если их действительно много, схема может стать довольно неуклюжей и медленной. В этих случаях нам понадобится матрица...
[править] Строки и столбцы
В матрице клавиши организованы по строкам и столбцам. Как и в схеме с мультиплексором, кнопки нужно периодически сканировать, чтобы проверить, нажаты они или нет, но в случае с матрицей это обычно делается группами. По сигнальному проводнику на каждый столбец поступает ток, затем любые нажатые клавиши передают этот ток в проводники соответствующих строк, значения которых можно считать по отдельности или все сразу.
Как получить этот сигнал? Вариантов опять-таки несколько, в том числе – просто запитать линии напрямую с выходов (см. врезку о маленьких матрицах). Мы воспользуемся сдвиговым регистром, который легко настроить для этой цели (см. Схему 2).
Функциями сдвигового регистра, который формирует ток для столбцов, нужно управлять на более низком уровне – сдвиговые регистры в Arduino перемещают по байту данных за цикл, но мы воспользуемся регистром на уровне битов – загрузим бит в регистр и затем с помощью импульсов будем сдвигать его на одну позицию за раз. Глобальная переменная glob_COLUMN содержит номер текущего столбца.
- Метамодернизм в позднем творчестве В.Г. Сорокина
- ЛитРПГ - последняя отрыжка постмодерна
- "Ричард III и семиотика"
- 3D-визуализация обложки Ridero создаем обложку книги при работе над самиздатом.
- Архитектура метамодерна - говоря о современном искусстве, невозможно не поговорить об архитектуре. В данной статье будет отмечено несколько интересных принципов, характерных для построек "новой волны", столь притягательных и скандальных.
- Литература
- Метамодерн
- Рокер-Прометей против изначального зла в «Песне про советскую милицию» Вени Дркина, Автор: Нина Ищенко, к.ф.н, член Союза Писателей ЛНР - перепубликация из журнала "Топос".
- Как избавиться от комаров? Лучшие типы ловушек.
- Что делать если роблокс вылетает на windows
- Что делать, если ребенок смотрит порно?
- Почему собака прыгает на людей при встрече?
- Какое масло лить в Задний дифференциал (мост) Visco diff 38434AA050
- О чем может рассказать хвост вашей кошки?
- Верветки
- Отчетность бюджетных учреждений при закупках по Закону № 223-ФЗ
- Срок исковой давности как правильно рассчитать
- Дмитрий Патрушев минсельхоз будет ли преемником Путина
- Кто такой Владислав Поздняков? Что такое "Мужское Государство" и почему его признали экстремистским в России?
- Как правильно выбрать машинное масло в Димитровграде?
- Как стать богатым и знаменитым в России?
- Почему фильм "Пипец" (Kick-Ass) стал популярен по всему миру?
- Как стать мудрецом?
- Как правильно установить FreeBSD
- Как стать таким как Путин?
- Где лучше жить - в Димитровграде или в Ульяновске?
- Почему город Димитровград так называется?
- Что такое метамодерн?
- ВАЖНО! Временное ограничение движения автотранспортных средств в Димитровграде
- Тарифы на электроэнергию для майнеров предложено повысить
glob_COLUMN++;
digitalWrite(SR_LATCH, LOW);
if (glob_COLUMN>NUMBER_OF_COLUMNS) {
glob_COLUMN=0;
digitalWrite(SR_DATA, HIGH); //заново загружаем 1 на вывод
digitalWrite(SR_CLOCK, HIGH); //сдвигаем
digitalWrite(SR_CLOCK, LOW);
digitalWrite(SR_DATA, LOW); // загружаем 0 на вывод
}else{
digitalWrite(SR_CLOCK, HIGH);
digitalWrite(SR_CLOCK, LOW);
}
digitalWrite(SR_LATCH, HIGH);
Переменные SR_ соответствуют контактам Arduino, используемым для подключения к этим сигналам на сдвиговом регистре. Никаких соглашений на этот счет нет – можно использовать любые контакты, но лучше объявить их в начале кода, чтобы при необходимости легко менять в зависимости от того, какие контакты используются/свободны.
Пока счетчик столбцов не достиг количества столбцов в нашей матрице, код лишь устанавливает импульс в «единицу», а затем снова в «ноль». Частотная характеристика стандартного сдвигового регистра 59581 с запасом покрывает последовательные вызовы digitalWrite(), но если вы будете пользоваться другими компонентами или если в цепи большой шум, может потребоваться небольшая задержка между вызовами. В большинстве случаев будет достаточно такой:
delayMicroseconds(5);
Когда мы достигаем количества столбцов, срабатывает условие if. Оно сбрасывает счетчик столбцов и выдает еще одну «единицу» на выходной контакт, затем сдвигает его, и цикл начинается снова. Так, для трех столбцов последовательность будет такой: 100100100... а для четырех – такой: 100010001... Разумеется, можно объединить несколько регистров сдвига в цепочку и использовать большие значения счетчиков для матрицы.
При подаче сигнала на каждый из столбцов нужно просканировать строки. Сделать это можно по-разному – с помощью мультиплексора (как мы сделали это ранее), расширителя входа/выхода или сдвигового регистра другого типа.
Расширитель входа/выхода (например, MCP28S17) хорошо использовать в том случае, если матрица большая. Эта микросхема использует последовательный интерфейс (SPI), для которого нужно 4 контакта, но зато он очень быстр – помните, что с разрастанием матрицы время на ее сканирование увеличивается, поэтому если нужно и обрабатывать данные, и считывать значения с клавиатуры, сканирование должно быть быстрым.
Впрочем, в качестве расширителя проще всего использовать еще один сдвиговый регистр. Ранее в этой серии мы применяли сдвиговые регистры SIPO (с последовательным входом и параллельным выходом), на которые подается последовательность битов, выводимых на выходные контакты. Есть регистры и с параллельными входами и последовательным выходом (PISO), такие как 74165 и CD4021. В таких схемах значения восьми входов снимаются и выдаются в виде последовательности на один выход под управлением сигнала внешнего генератора – по сути, их действие противоположно регистрам SIPO. Как и другие сдвиговые регистры, их тоже можно соединять в цепочку, и мы сможем получить данные в строках с числом элементов больше 8. Для их работы нужно всего три контакта.
- Метамодернизм в позднем творчестве В.Г. Сорокина
- ЛитРПГ - последняя отрыжка постмодерна
- "Ричард III и семиотика"
- 3D-визуализация обложки Ridero создаем обложку книги при работе над самиздатом.
- Архитектура метамодерна - говоря о современном искусстве, невозможно не поговорить об архитектуре. В данной статье будет отмечено несколько интересных принципов, характерных для построек "новой волны", столь притягательных и скандальных.
- Литература
- Метамодерн
- Рокер-Прометей против изначального зла в «Песне про советскую милицию» Вени Дркина, Автор: Нина Ищенко, к.ф.н, член Союза Писателей ЛНР - перепубликация из журнала "Топос".
- Как избавиться от комаров? Лучшие типы ловушек.
- Что делать если роблокс вылетает на windows
- Что делать, если ребенок смотрит порно?
- Почему собака прыгает на людей при встрече?
- Какое масло лить в Задний дифференциал (мост) Visco diff 38434AA050
- О чем может рассказать хвост вашей кошки?
- Верветки
- Отчетность бюджетных учреждений при закупках по Закону № 223-ФЗ
- Срок исковой давности как правильно рассчитать
- Дмитрий Патрушев минсельхоз будет ли преемником Путина
- Кто такой Владислав Поздняков? Что такое "Мужское Государство" и почему его признали экстремистским в России?
- Как правильно выбрать машинное масло в Димитровграде?
- Как стать богатым и знаменитым в России?
- Почему фильм "Пипец" (Kick-Ass) стал популярен по всему миру?
- Как стать мудрецом?
- Как правильно установить FreeBSD
- Как стать таким как Путин?
- Где лучше жить - в Димитровграде или в Ульяновске?
- Почему город Димитровград так называется?
- Что такое метамодерн?
- ВАЖНО! Временное ограничение движения автотранспортных средств в Димитровграде
- Тарифы на электроэнергию для майнеров предложено повысить
- Метамодернизм в позднем творчестве В.Г. Сорокина
- ЛитРПГ - последняя отрыжка постмодерна
- "Ричард III и семиотика"
- 3D-визуализация обложки Ridero создаем обложку книги при работе над самиздатом.
- Архитектура метамодерна - говоря о современном искусстве, невозможно не поговорить об архитектуре. В данной статье будет отмечено несколько интересных принципов, характерных для построек "новой волны", столь притягательных и скандальных.
- Литература
- Метамодерн
- Рокер-Прометей против изначального зла в «Песне про советскую милицию» Вени Дркина, Автор: Нина Ищенко, к.ф.н, член Союза Писателей ЛНР - перепубликация из журнала "Топос".
- Как избавиться от комаров? Лучшие типы ловушек.
- Что делать если роблокс вылетает на windows
- Что делать, если ребенок смотрит порно?
- Почему собака прыгает на людей при встрече?
- Какое масло лить в Задний дифференциал (мост) Visco diff 38434AA050
- О чем может рассказать хвост вашей кошки?
- Верветки
- Отчетность бюджетных учреждений при закупках по Закону № 223-ФЗ
- Срок исковой давности как правильно рассчитать
- Дмитрий Патрушев минсельхоз будет ли преемником Путина
- Кто такой Владислав Поздняков? Что такое "Мужское Государство" и почему его признали экстремистским в России?
- Как правильно выбрать машинное масло в Димитровграде?
- Как стать богатым и знаменитым в России?
- Почему фильм "Пипец" (Kick-Ass) стал популярен по всему миру?
- Как стать мудрецом?
- Как правильно установить FreeBSD
- Как стать таким как Путин?
- Где лучше жить - в Димитровграде или в Ульяновске?
- Почему город Димитровград так называется?
- Что такое метамодерн?
- ВАЖНО! Временное ограничение движения автотранспортных средств в Димитровграде
- Тарифы на электроэнергию для майнеров предложено повысить
Вот каким образом сканируется строка:
digitalWrite(SRIN_LATCH, HIGH);
delayMicroseconds(25);
digitalWrite(SRIN_LATCH, LOW);
data = shiftIn(SRIN_DATA, SRIN_CLOCK);
Перевод контакта-«защелки» в «единицу» функцией digitalWrite() «загрузит» вход «защелки». Небольшая задержка поможет значениям установиться, прежде чем мы снова переведем «защелку» в ноль для «заморозки» входа.
После этого нужно лишь воспользоваться функцией shiftin() стандартной библиотеки Arduino для фиксации значения этого байта. Если сдвиговый регистр не один, то входы «защелки» объединяются вместе, и понадобится еще один вызов shiftin() для чтения дополнительного байта данных.
[править] Борьба с дребезгом контактов
Одна из проблем с физическими переключателями, будь то мембранные клавиатуры, тактильные кнопки или переключатели с самовозвратом любых типов, заключается в том, что сигнал может «дрожать». Это термин, используемый для описания эффекта физической природы самих контактов, которые включены и выключены не четко. Такое бывает из-за физической вибрации контакта, поэтому, например, при отпускании клавиши контакты могут дрогнуть и снова замкнуть цепь, пусть и ненадолго.
Если вы хотите отфильтровать подобные нежелательные события, в принципе это делается на уровне электроники, но тут могут быть проблемы, так что позаботимся об этом на уровне программы. Довольно простой и ясный способ – просто объединить входящие данные с последним набором данных, полученных из матрицы, по схеме И.
data &= shiftIn(SRIN_DATA, SRIN_CLOCK);
Время между сканированием двух наборов данных (если вы не сканируете быстро – в этом случае может использоваться несколько буферов) должно быть достаточным для того, чтобы состояние клавиш установилось. Конечно, оно должно быть и достаточно коротким, чтобы избежать ситуации, когда быстро нажатая клавиша не распознается. По общей рекомендации, время между операциями сканирования должно быть менее 200 мс.
[править] Объединяем все вместе
На практике функция чтения клавиатуры скорее всего реализуется как сервис прерываний. В этом случае нужно правильно задать таймер (см. LXF155), чтобы прерывание выдавалось достаточно регулярно для перехвата нажатий клавиш, но не слишком часто, чтобы не съедать все процессорное время. Оно зависит от размера матрицы и метода сканирования – помните, что с ростом размера матрицы время на ее сканирование увеличивается по квадратичной функции. В примере кода на DVD есть процедура прерывания для матрицы 4 × 4 с использованием сдвиговых регистров для управления строками и столбцами.
В зависимости от нажатия клавиш вам также нужно выполнять соответствующие действия и, конечно, помещать данные туда, где главная программа их найдет. Назначение клавиш зависит от вашего приложения, но для хранения нажатий клавиш удобно пользоваться буфером buffer и счетчиком count. В основной программе можно проверять счетчик, чтобы узнать, были ли нажаты клавиши.
if (data > 0){
if (buffercount < BUFFER_LIMIT){
buffercount++;
buffer[buffercount] - data;
}
}
Тщательно подобрав соответствующие компоненты, легко просканировать матрицу 16 × 16 без особых затрат процессорного времени.
matrix
Макет – не самое замечательное в мире место для сборки матричной клавиатуры: уж слишком много на нем соединений. Проще будет взять монтажную плату и разместить клавиши на ней (в тех местах, где это необходимо, дорожки надо будет перерезать).
[править] Маленькие матрицы
В ПО Arduino есть библиотека матрицы клавиатуры, которая сканирует матрицу клавиш, не вызывает блокировки и обладает зачаточной обработкой событий. Она работает с различными клавиатурами и использует простой режим сканирования, исключающий эффект ложного срабатывания на клавиатурах без диодов.
Почему мы не воспользовались ею? Единственная проблема в том, что для нее нужно по контакту на каждую строку и столбец, т. е. для матрицы 4 × 4 нужно восемь контактов – заметная часть выводов Arduino. Использование сдвиговых регистров (в основном коде) позволяет снизить их количество до шести, а при объединении нескольких сдвиговых регистров можно работать с гораздо большими матрицами. |