Матричная клавиатура и прерывания в arduino due
- Войдите на сайт для отправки комментариев
Пнд, 15/08/2016 - 16:51
Добрый день, возникла проблема подключения матричной клавиатуры к arduino due с использованием прерываний (точнее, адекватного снятия состояния кнопок)
Клавиатура использовалась вот такая: http://i.ebayimg.com/images/g/oMEAAOSwstxVE6y6/s-l300.jpg
Программа писалась по вот этой вот статье, только соответсвенно диоды\резисторы не напаивались, т.к. прерывания на дью можно снимать с любого пина, что и делалось.
http://robots4life.ru/matrichnaya-klaviatura-preryvani
Суть в том, что программа компилируется но по нажатию клавиш в монитор серийного вывода ничего не приходит.
В чем может быть ошибка?
Для подключения матричной клавиатуры 4х4 выделяю порт МК. Вся схема это сама клава и 4 транзистора.
Достаточно раз в 10-50 мс опрашивать порт.
key = PINx;
Для клавы 4х5 нужен ещё один пин другого порта.
А без транзисторов никак? Может посмотрите ссылки, что я прикрепил
Выкладывайте скетч и подключение клавиатуры. У Вас 4х5, а в примере 4х4.
Тот скетч, что работает? Или тот, что нет?)
Саму схему, я так понимаю, вам сфоткать надо
Если скетч работает, какие могут быть вопросы?
А схему, чтоб всем было понятно куда что подключено.
Вот схема подключения:
https://cloud.mail.ru/public/MLAC/pPGn7KmuG
А вот нерабочий скетч:
У Вас прерывание должно при смене 1->0, а не наоборот.
Вместо RISING нужно FALLING.
attachInterrupt(xx, matrix, FALLING);
У Вас прерывание должно при смене 1->0, а не наоборот.
Вместо RISING нужно FALLING.
attachInterrupt(xx, matrix, FALLING);
Не работает, пробовали и FALLING и CHANGE и RISING
А без прерываний пробовали?
А без прерываний пробовали?
Без прерываний пробовали. Работает. Но нам это не подходит.
P.S
Может быть на due особенности какие-то в работе прерываний, вроде у людей на uno работает все
Строка 16
Строка 16
Что там? Без инициализации функции в начале, не работает скетч. Пишет что вне зоны видимости эта функция
p/s
Хотя не, на моем ide компилируется без 16-й строки, но результат все тот же - не работает программа
Пины выходные в "1" нужно выставить.
И на вход и на выход 1? а платку не спалим?
И кто так скетчи пишет...
Пробуйте так
Не, тоже не правильно...
Не, все равно в монитор ничего по нажатиям не выводит с вашим кодом
Никогда так не опрашивал матричную клаву. Такая возня....
Пробуйте...
Кажись с переменными немного напутал...
Скетч с исправлениями.
Эм. Трудно описать что происходит. Иногда сразу после загрузки скетч в мк и запуска монитора, в него вываливается несколько произвольных символов. Потом нажимаю на кнопку - проходит прерывание, правда кнопки не соответствуют, ну это ладно. В лупе при этом крутится наше значение и оно отображается в мониторе столько раз, сколько прокрутилось. Потом нажимаю на другие кнопки, и в монитор уже выводится цикл из того что было нажато, допустим жму "5" - понеслась "5 5 5 5 5 5 5 ...", жму затем 2 понеслась "5 2 5 2 5"
и так далее
UPD вот так уже лучше, сейчас попробую разобраться только со строками и столбцами)
Так, отчитываюсь.
Скетч работает, в мониторе печатаются введенные с клавиатуры символы единожды, но после примерно 5 раз печататся в монитор перестают. После этого я жму на МК кнопку reset, снова ввожу с клавиатуры несколько символов, и снова приходится жать ресет чтобы что-то ввести.
Еще иногда построчно символы путаются (то бишь нажатый символ может отобразится некоторым иным с данной строки)
Скетч проверить не могу - Due у меня нет.
Почему Вам именно через прерывания нужно опрашивать?
Могу посоветовать отказаться от такого способа опроса.
Клавиатура будет прилажена к другой Due, уже рабочему прибору с LCD экраном, который постоянно снимает показания с датчиков вибрации и других. Соответсвенно там в loop крутятся измерения, и вот была идея прикрутить к ней клавиатуру, реализуемую через прерывания.
Так ЛУП то крутится, а не стоит. И что страшного если он на 10 мкс дольше будет крутится?
Ну там вроде как громоздкие измерения идут. Я сразу предложил 1-й рабочий вариант. Но начальник сказал, что нужно делать через прерывания.
Ооо дааа НАЧАЛЬНИК СКАЗАЛ. Ваш начальник если специалист, пусть сам делает, а если Вы специалист то пошлите его рекомендации и сделайте ПРАВИЛЬНО!
Можно подумать, что прерывания громоздким вычислениям не помеха :)))) при уходе в прерывание главный цикл вооюще стоит, пока прерывание не кончится.
Сделайте горячую кнопку ухода в меню и опрашивайте только ее, а при нажатии соответственно все тормозите и обрабатываете меню. Это аналогично прерыванию, но без переподвывертов.
А если основной цикл тормозить нельзя .... Делайте отдельный контроллер клавиатуры и дружите его с вычислителем по ... Например i2c.
Чуть допилил... Пробуйте.
Теперь кнопки путает) Но зато можно ввести 6 раз вместо 5 без reseta
Вот так должно работать )
По этому коду выводит первое значениие в строке, то есть *,U,D,E,N
(наименования символов поправил согласно нашей клавиатуре)
Проблема может быть в том, что когда мы возвращаем стобцы в 0 процедуре прерывания, кнопка все еще остается нажатой и прерывание снова срабатывает? Или не срабатывает, т.е. флаг прерывания повторно не взводится?)
то есть строки нормально, а столбец всегда первый?
а как все остальное? reset жать не надо?
По этому коду выводит первое значениие в строке, то есть *,U,D,E,N
(наименования символов поправил согласно нашей клавиатуре)
Там надо HIGH, а не LOW в 36 строке. Т.е. переключам столбцы в 1 и проверяем на каком столбце в нашей строке появится 1.
33
34
35
36
37
38
39
40
41
Да,насчет HIGH уже заметил. Но все равно определяет нажатую кнопку неверно
ресет жать не надо
p/s
Может,подключить библиотеку от дребезга контактов?
проблема-то не в дребезге. А что значит - неверно? После замены Low на High поменнялось что-нибудь?
ps в 35 строке тоже надо
digitalWrite(
PinOut[i]
, HIGH);То есть переключаем выход в 1.
Ну не ту кнопку выводит в монитор, хоть и с той строки
А почему не в дребзге? Мы же по FALLING ловим, а в дребзге одного нажатия одной кнопки этих самых FALLING по идее будет несколько...
то есть строки определяет правильно, а столцы нет? Но хоть разные столбцы или все время первый?
зы. Столбцы-то неправильно определяет не из-за дребезга.
Столбцы разные. Насчет дребзга появилась идея, т.к во время нажатия успевал вывести в монитор несколько значений (2-3) и все неправильные)
Добились более-менее рабочего кода (в монитор идут символы, пока кнопка нажата), если не выставлять значения delay в loop`е
Смысл в том, что пока кнопка нажата и не отпущена - символы в монитор порта не идут. Только когда кнопка отпускается Serial.println что-то пишет, ( но неправильно). Это означает, что пока кнопка нажата - непрерывно генерится прерывание и мы постоянно крутимся в обработчике. Видимо потому, что в конце обработчика стоит
// for (i = 0; i < 4; i++) {
51
52
и установка выхода в 0 при нажатой кнопке воспринимается как FALLING и снова генерится прерывание. Если бы можно было сконфигурить сброс флага прерывания при выходе из процедуры-обработчика или запретить установку флана прерывания, пока находишься в обработчике, то все работало бы.
В нашем случае
digitalWrite(PinOut[i], LOW);;//выходы снова на выход в "0"
было вынесено в loop(). При нажатой кнопке прерывание конечно генерится снова, когда в loop() доходит до этой строчки, но уже можно обработать события нажатие клавиши.
Можно кстати опрашивать клавиатуру через прерывание по таймеру. Тогда можно выбрать приемлемую задержку реакции на нажатия кнопки. https://avrlab.com/node/85
Добрый вечер, заказал для проекта клавиатуру 1 строка 6 столбцов. На прошлой неделе пришла, вна фото(в нее также встроен светодиод, но его не пользовал). На просторах интернета нашел код без библиотек, для моей клавитуры как раз. Смысл такой: по нажатию клавиши в монитор порта выводится символ этой клавиши. Переписал через регистровое представление пинов ардуино ( у меня uno), лично мне так читабельнее. Все работает, но мешает развитию delay.
"Можно кстати опрашивать клавиатуру через прерывание по таймеру" - Я так и решил действовать. На сайте http://www.instructables.com/id/Arduino-Timer-Interrupts/ вполне понятно объяснено о работе таймеров, конкетно о прерывание по таймеру. Вот код взятый оттуда blink на таймере 1 каждую секунду
Применительно к клаве от сериал соединения отказался сразу поскольку уже где то сталкивался, что в прерывании могут потеряться байты по UART. На основе предыдущего написал код, который задейтвует 5 клавиш клавиатуры, шестую заменил светодиод. Смысл в вызове функции обработчика каждые 50 мс для устранения дребезга, но код не фурычит. А кода - по нажатию любой клавиши должен загореться диод. Подскажите в чем ошибся?
Мне как новичку не совсем понятно, как правильно организовать обработку клавиатуры за пределами loop
обработку клавиатуры за пределами loop
это где? - на сеновале? О_О
А зачем отсылать байты в прерывании? В прерывании выставляется флаг\записывается значние переменной, а в loop проверяется состояние флага и выполняются нужные операции.
Для проверки можно установить опрос в 500 мс и в прерывании зажигать и гасить светодиод. Тогда будет видно, проходит ли прерывание вообще. А дальше добавить в прерывании проверку нажатия клавиши и зажигать светодиод в зависимости от состояния клавиши.
Спасибо, как освобожусь буду пробывать