Mini-ats102.ru

ООО “Мультилайн”
4 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Ввод данных в ардуино с матричной клавиатуры. Подключение матричной клавиатуры к Arduino

Ввод данных в ардуино с матричной клавиатуры. Подключение матричной клавиатуры к Arduino

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

В общем как это все устроено.

Я надеюсь все знают как работает делитель напряжения. Есть 2 резистора подключенных последовательно в цепь питания и от средней точки этих резисторов снимается напряжение, величина которого зависит от падения напряжения на этих самых резисторах. А если совсем просто, то если на входе й нас 5 вольт и 2 резистора по 1кОм, то со средней точки мы будем снимать 2,5 вольт.

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

Есть еще и другой вариант подключения. В этом случае кнопкой подтягивается несколько последовательно соединенных резисторов. Если не одна кнопка не нажата, то 5 вольт через резистор подаются на аналоговый вход, а при нажатии на кнопку подкидываем резистор и втягиваем часть напряжения на массу.

Это даже можно продемонстрировать. Ниже пример, который отправляет значение в serial которое считывает функцией analogread на выходе А0 к которому подключена клавиатура. Когда ничего не нажато в мониторе порта будет 1023, если надавить на кнопку это значение будет отличаться и зависеть от нажатой кнопки.

Осталось только различать эти значения в коде без условия if здесь не обойтись, а лучше вообще это вынести в отдельную функцию. К примеру эта функция будет key() и возвращает она байт

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

Клавиатуры бывают разных форм и размеров. Самые распространенные – это с расположением кнопок 3х4 или 4х4 . В продаже есть также клавиатуры с кнопками не только для цифр, но также для букв и даже слов.

roboforum.ru

Здравствуйте!
Есть необходимость иметь много датчиков контакта(фактически клавиши), но в ардуине их не так уж и много(мне нужно как минимум в 2 раза больше) поэтому возник вопрос: сделать схему типа этойИзображение
идею я увидел тут http://pic-avr.narod.ru/opisanie.htm и немного подкорректировал под себя(4 кнопки это пример).
Вот у меня смутные сомнения по поводу одновременного нажатия нескольких кнопок в этой схеме. помогите пожалуйста, я программист, а не электронщик. Физику конечно учил, и даже в институте была электроника.
При нажатии 1 кнопки понятно: напряжение в точке А0 должно меняться пропорционально R1, R1+R2, R1+R2+R3, R1+R2+R3+R4.
Но при одновременном нажатии 2х: например K2 и К3, то в А0 все равно будет R1+R2(R3 шунтируется), а при замыкании К1 — отследить нажатие остальных нельзя? из закона Ома я понимаю, что ток (Амперы) увеличится, но напряжение в точке А0 останется как при замыкании одной только К1.
вероятней всего можно, я понимаю, что лучший ответ будет учебник по физике(вероятней всего даже школьный класс так 7-8) но лучше вкратце напишите где я ошибся в схеме или в рассуждениях. Зачем тут конденсатор? защита от дребезга контактов?
Спасибо.

Читайте так же:
Малинка компьютер pi 3

Добавлено спустя 7 минут 34 секунды:
так же знаю, что при последовательном соединении резисторов увеличивается (R1+R2), а при параллельном уменьшается (R1+R2)/(R1*R2). в программе я так полагаю нужно будет сравнивать значение с pin’a с вычисленным значением — попробовать виртуально за контачить разные кнопки и какое значение будет ближе, такие кнопки и нажаты. пока я думаю так реализовать определение нажатия кнопки.

Re: Аналогавая клавиатура на 1 pin arduino

HarryStar » 26 май 2011, 14:38

Re: Аналогавая клавиатура на 1 pin arduino

FantasyOR » 26 май 2011, 16:05

Re: Аналогавая клавиатура на 1 pin arduino

dccharacter » 26 май 2011, 16:16

бюджет какой?
на два пина можно повесить PS/2 клавиатуру (MISO MOSI)

Добавлено спустя 1 минуту 12 секунд:
если один пин — можно поставить МК-прокладку за 50 рублей, сделать там матрицу и в путь. На Ардуину передавать по уарту/спи/и2ц/итд

Re: Аналогавая клавиатура на 1 pin arduino

Michael_K » 26 май 2011, 16:40

Если вы замыкаете:
K1 то напряжение на входе АЦП будет = V*(R5+R4+R3+R2)/(R1+R2+R3+R4+R5) = 4 вольта
K2 — V*(R5+R4+R3)/(R1+R2+R3+R4+R5) = 3 вольта
K3 — V*(R5+R4)/(R1+R2+R3+R4+R5) = 2 вольта
K1 и К2 одновременно — V*(R5+R4+R3)/(R1+R3+R4+R5) = 3.75 вольта
K1 и К3 одновременно — V*(R5+R4)/(R1+R4+R5) = 3.33 вольта (состояние К2 при этом ни на что не влияет)

Но вообще, решение не слишком красивое. Тогда уж смотрите в сторону R2R, например.

Re: Аналогавая клавиатура на 1 pin arduino

RootAdmin » 26 май 2011, 17:59

А где-то проскакивала мысль про "отладка по одному проводу. Если как там, но наоборот?

Добавлено спустя 3 минуты 27 секунд:
В смысле — сдвиговый регистр, длительным низким (высоким) уровнем на ноге его сбраcывать через RC цепочку, короткими низкими (высокими) импульсами тактировать, после такта читать его выход, подключенный через резистор этой же ногой?

Добавлено спустя 45 минут 54 секунды:
Прикинул в симуляторе — на регистр лучше две ноги выделять.

Re: Аналогавая клавиатура на 1 pin arduino

FantasyOR » 27 май 2011, 16:42

интересно,можно ли на его цифровые входы повесить мои контакты: нажали кнопку, пошел ток — на цифровом входе считай 1, контакт замкнулся. или не так?

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

Re: Аналогавая клавиатура на 1 pin arduino

RootAdmin » 27 май 2011, 17:52

Тогда придется тоже считать. Если замкнуты две кнопки — то напряжение будет складываться. то есть, грубо, кнопка 1 дает на выходе АЦП .1 вольт
— 2 — .2 вольт
— 3 — .4 вольт
Одновременное нажатие 1 и 3 даст .5 вольт
Одновременное нажатие 2 и 3 даст .6 вольт

Добавлено спустя 3 минуты 47 секунд:
Но! Проще все кнопки, через разные (в 2 раза) резисторы подключить к питанию, как правильно говорил Michael_K.
То есть
питание — 1ком — кнопка — вход.
питание — 2 ком — кнопка — вход
питание — 4 ком — кнопка — вход
питание — 8 ком — кнопка — вход
Вход на землю через 500 ом. Например.
Тот же самый ЦАП и однозначно определяется несколько нажатых кнопок.

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

Re: Аналогавая клавиатура на 1 pin arduino

FantasyOR » 28 май 2011, 09:34

в 2 раза резисторы повышать. это если вешать 10 контактов на 1 пин, то будет 2^10 = 1024/ не сильно ли большая разница между самым маленьком и самым большим, считайте на 3 порядка. поэтому я и решил использовать заводской ЦАП, там сопротивления подобраны с достаточной точностью.

"Считаем сопротивления нажатых кнопок как параллельный резистор" это сложно, нет конечно я знаю формулу, но для МК много действий: сложения, умножения, деление. А ведь чтоб узнать комбинацию, нужно посчитать все возможные комбинации(их просто куча — сумма С(из n по k ), где n=10, а k=0..10. это 1024 сочетания, многовато правда) и сравнить с входным напряжением. тут более подойдет схема шунтирования сопротивлений, сопротивления изменяются как веса в битовой маске:
Изображение
R1 = 1 kOm
R2 = 2*R1 = 2 kOm
R3 = 2*R2 = 4 kOm
.
R10= 1024 kOm
по этой схеме общее сопротивление должно считаться гораздо проще: только сумма.
хотя остаётся та же проблема с огромной разницей в сопротивлениях. наверное все же нужен заводской ЦАП.

Re: Аналогавая клавиатура на 1 pin arduino

RootAdmin » 28 май 2011, 10:42

ИМХО — извращение. Заводской ЦАП — те же сопротивления, переключаемые электронно.
Тогда уж чем плоха шина 1-wire? Одна нога — и сколько угодно кнопок-реле-светодиодов.
http://www.ibutton.ru/news/8/
Заказать: http://www.terraelectronica.ru/catalog.php?ID=725
Выглядит куда логичней и не надо использовать ненадежные аналоговые сигналы.

Добавлено спустя 56 секунд:
ЗЫ. Поправить бы название темы, а то аналогАвый как-то не звучит.

Добавлено спустя 1 минуту 26 секунд:
И если использовать ЦАП-АЦП на 10 разрядов, то тогда малейшая помеха-пичок — и все, младший разряд неверен.

Добавлено спустя 16 минут 21 секунду:
Сложение и деление в случае с резисторами зачем?
Массив значений напряжений для каждого разряда — храним.
x = измеренное значение
цикл для кнопок b, от старшего разряда к младшему.
If x>(уровень напряжения ТЕКУЩЕГО разряда) then
b(ТЕКУЩИЙ) = 1
x-=(уровень напряжения ТЕКУЩЕГО разряда)
end if
next

Читайте так же:
Запуск компьютера через командную строку

Re: Аналогавая клавиатура на 1 pin arduino

boez » 28 май 2011, 13:58

Re: Аналогавая клавиатура на 1 pin arduino

HarryStar » 28 май 2011, 15:10

Re: Аналогавая клавиатура на 1 pin arduino

FantasyOR » 28 май 2011, 20:42

Да согласен ссылка отличная, большое спасибо, время опроса у меня не критично.

Обзор набора

Все модули описывать я, конечно, не буду. Ссылки на подробные характеристики я дал выше. В качестве микроконтроллера используется плата Arduino Uno R3 на основе ATmega328.

Он имеет 14 цифровых входов/выходов, из которых 6 могут работать как ШИМ и 6 аналоговых входов. Имеется последовательный интерфейс, SPI, TWI. Модуль Ethernet W5100 устанавливается на Arduino Uno R3 плохо за счет очень большого коннектора USB тип B на последнем.

Если будете использовать, то надо откусить выступающие ножки у разъема Ethernet и изолировать их термоскотчем, или ставить данный модуль через удлинительные проставки. Кабели MM и MF Dupont мне не очень понравились. До этого я использовал самодельные провода, в которых в качестве контактов использовались штырьки от гребенки. У Dupont штампованные и у меня пара сразу отломилась.

Так что подключать их надо аккуратно. Для использования некоторых модулей придется припаять к ним гребенки. Для многих модулей они есть в комплекте, причем двух видов: прямые и с поворотом на 90 градусов, как, например, у платы трехосевого гироскопа и акселерометра GY-521.

Для дисплея LCD1602 гребенки нет и ее придется покупать, или припаивать провода прямо к контактным площадкам. В комплекте с модулем считывателя RFID-меток идет брелок и пластиковая карточка.

Внутри карточки находится микросхема Mifare S50 и антенна. На этот модуль гребенку я уже припаял. К модулю GPRS/GSM SIM900 идет в комплекте адаптер nano-SIM в micro-SIM и стандартную SIM и micro-SIM в стандартную SIM.

Основой набора, является книга «Практическая энциклопедия Arduino».

В небольшом вступлении кратко описаны возможности и характеристики Arduino Uno и установка среды программирования Arduino IDE. Впрочем, сложного там ничего и нет. Далее идут 33 проекта, в которых используются датчики и шилды, имеющиеся в наборе. Именно исходя из проектов описанных в книге и комплектовался набор. Для каждого проекта есть необходимые компоненты.

Задания идут от простого к сложному. Большинство проектов не преследует цель создать готовое полноценное устройство, а только показывают принцип работы и подключения того или иного датчика или шилда. При необходимости все скетчи можно скачать с сайта производителя. К сожалению, некоторые скетчи содержат ошибки, которые могут стать серьезной проблемой для начинающих программистов. С другой стороны, повозившись и исправив скетч, вы получите больше знаний. Например, в скетче 28_2, где подключается RFID-считыватель RC522, вместо двойного двоеточия стоит одинарное.

А в подобном примере на сайте помимо этого вдобавок при подключении библиотек забыли написать их название. То есть, вместо #include «SPI.h» #include «MFRC522.h» написали просто #include #include А ведь можно с помощью данного модуля можно не только считывать, но и записывать информацию на карты. Дубликат пропуска или проездного билета в общественном транспорте всегда пригодится. Для многих скетчей придется качать дополнительные библиотеки, впрочем, найти их в интернете не проблема.

Читайте так же:
Можно ли включать ноутбук с клавиатуры

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

Соединяем модули вместе, как показано на схеме выше. В реальности можно свериться с фотографиями ниже.

Подключите клавиатуру с помощью перемычек к вашему Zuino M Uno.

Кнопки LCD Keypad Shield

На плате присутствуют пять управляющих кнопок, работа с которыми ведется через один аналоговый пин A0. В шилде использован достаточно распространенный способ простого кодирования сигнала, при котором каждая кнопка формирует определенное значение напряжения, которое после АЦП преобразуется в соответствующее значение от 0 до 1023. Таким образом, мы можем передавать информацию о нажатии разных кнопок через один пин, считывая его при помощи функции analogRead();

Значения уровня сигнала на пине A0 в зависимости от выбранной кнопки:

Нажатие кнопкиЗначение на аналоговом пине
RIGHT0-100
UP100-200
DOWN200-400
LEFT400-600
SELECT600-800
Клавиша не нажата800-1023

Пример скетча работы с кнопками LCD Keypad Shield:

В выбранном методе кодирования есть два главных недостатка:

  • Нельзя отслеживать одновременное нажатие нескольких кнопок;
  • Возможные искажения сигнала могут привести к ложным срабатываниям.

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

Строковый объект Arduino

Второй тип строки, используемый в программировании Arduino, — это объект String.

Что такое объект?

Объект — это конструкция, которая содержит как данные, так и функции. Объект String можно создать так же, как переменную, и присвоить ему значение или строку. Объект String содержит функции (которые в объектно-ориентированном программировании (ООП) называются «методами»), которые работают со строковыми данными, содержащимися в объекте String.

Следующий скетч и пояснит, что такое объект и как используется объект String:

Создается строковый объект, которому в верхней части скетча присваивается значение (или строка).

Это создает объект String с именем my_str и присваивает ему значение «This is my string.».

Это можно сравнить с созданием переменной и присвоением ей значения, например целого числа:

Читайте так же:
Мейзу м6 ноут ютуб
(1) Печать строки

Строку можно напечатать в окне Монитор порта так же, как строку символьного массива.

(2) Преобразование строки в верхний регистр

Созданный строковый объект my_str имеет ряд функций или методов, которые могут работать с ним. Эти методы вызываются с использованием имени объекта, за которым следует оператор точки (.), а затем имя используемой функции.

Функция toUpperCase () работает со строкой, содержащейся в объекте my_str, который имеет тип String, и преобразует строковые данные (или текст), содержащиеся в объекте, в символы верхнего регистра.

Список функций, которые содержит класс String, можно найти в справочнике Arduino String .

Технически String называется классом и используется для создания объектов String.

(3) Перезаписать строку

Оператор присваивания используется для присвоения новой строки объекту my_str, который заменяет старую строку.

Оператор присваивания не может использоваться для строк символьного массива, но работает только с объектами String.

(4) Замена слова в строке

Функция replace () используется для замены первой переданной ей строки второй переданной ей строкой. replace () — еще одна функция, которая встроена в класс String и поэтому доступна для использования в объекте String my_str.

(5) Получение длины строки

Получить длину строки легко, используя length (). В примере скетча результат, возвращаемый функцией length (), передается непосредственно в Serial.println () без использования промежуточной переменной.

Обмен данными с компьютером

У всех плат Arduino есть возможность обмена информацией с компьютером. Обмен происходит по USB-кабелю — никаких дополнительных «плюшек» не требуется. Нам нужен класс Serial , который содержит все необходимые функции. Перед работой с классом необходимо инициализировать последовательный порт, указав при этом скорость передачи данных (по умолчанию она равна 9600). Для отправки текстовых данных в классе Serial существуют небезызвестные методы print() и println() . Рассмотрим следующий скетч:

В Arduino IDE есть Монитор порта. Запустить его можно через ИнструментыМонитор порта. После его открытия убедитесь, что Монитор работает на той же скорости, которую вы указали при инициализации последовательного порта в скетче. Это можно сделать в нижней панели Монитора. Если всё правильно настроено, то ежесекундно в Мониторе должна появляться новая строка « T for Tproger ». Обмен данными с компьютером можно использовать для отладки вашего устройства.

Информацию на стороне компьютера можно не только получать, но и отправлять. Для этого рассмотрим следующий скетч:

Прошиваем микроконтроллер и возвращаемся в Монитор порта. Вводим в верхнее поле 1 и нажимаем Отправить. После этого на плате должен загореться светодиод. Выключаем светодиод, отправив с Монитора 0 . Если же отправить символ T , в ответ мы должны получить строку « proger ».

Таким способом можно пересылать информацию с компьютера на Arduino и обратно. Подобным образом можно реализовать связь между двумя Arduino.

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