Всем привет! Никак не могу подключить два энкодера к одним контактам (дабы сэкономить пины). Пытаюсь сделать так, как на фото - один энкодер как ни крути только увеличивает показания, другой вообще не реагирует. Подскажите, я только разбираюсь в мире Arduino, как подключить правильно два энкодера, чтобы при этом использовалось два пина Arduino (энкодеры не будут вращаться одновременно, а показания с них будут считываться однообразно, поэтому смысла не вижу подключать их на четыре пина). Вот скетч, который использую для отладки, и который, собственно, прошу посмотреть: Код (C++): unsigned long timer; const int pin_A = 13; const int pin_B = 12; unsigned char encoder_A; unsigned char encoder_B; unsigned char encoder_A_prev=0; int counter=0; void setup() { Serial.begin (9600); } void loop() { if(millis()- timer > 5) { encoder_A = digitalRead(pin_A); encoder_B = digitalRead(pin_B); if((!encoder_A) && (encoder_A_prev)) { if(encoder_B) { counter--; Serial.println (counter); } else { counter++; Serial.println (counter); } } encoder_A_prev = encoder_A; timer=millis(); } }
В код не вчитывался, но пока не пойму принципа. Как задумывается отличать один от другого? Или они должны работать как один какой не крути?
Наверно автор хочет чтобы энкодер увеличивал значения крутя в одну сторону , уменьшал в другую, но не смог сделать и пытается это сделать с помощью двух энкодеров, это только предположение пока автор не скажет что он задумал.А может быть еще что то.
анекдот Чувак сует 2 ноги в одну штанину. Народ смотрит и удивляется. - Зачем? - Я так экономлю штаны. Пол года похожу в одной штанине, а пол года в другой. Вот на год их и хватит. А теперь по делу на энкодерах пины не экономят. Энкодеры это дело не любят.
Ну то есть один энкодер стоит, замыкая общий контакт, при этом автор крутит второй пытаясь считать с него значения? А вообще, если ног мало, купите за 50 руб отдельный МК, например мой возлюбленный тини 2313 и сделайте из него отдельный контроллер для штук 4 - 5 энкодеров, который бы их опрашивал, запоминал положения, а данные передавал бы по UART на базу, используя для этого всего 1 ногу. По моему выгодно!
Смысл такой: крутишь один по часовой, counter увеличивается; крутишь его же против - уменьшается. Крутишь ДРУГОЙ по часовой - тот же counter увеличивается; крутишь ДРУГОЙ против - он же уменьшается.
А то что каждый энкодер требует своего вычислительного потока с повторяемостью 5 миллисекунд наплевать. Это обычная кнопка обходится вычислительным потоком в 200 милисек. Потому что человек не может чаще по ней стучать и ее дребезг. Если хочется повесить энкодер на 1 ногу. то эта нога может быть только аналоговым входом.
Вы бы посмотрели как энкодер устроен изнутри, там нет ничего сложного. Но зато поймете почему два энкодера на одни пины вешать бессмыслено.
Подскажите а как подключить два энкодера к разным входам Ардуино нано? Если прерывания можно использовать только на 2, 3 Пине?
Привет всем. только поболтать.а реально помочь? вот тут обзор китайского конструктора с двумя энкодерами. но как это работает я не знаю. наверно каждый энкодер сидит на одном из двух прерываний по вешнему событию.
Всем привет!! Я читал что прерываний может быть много и различных.В мега8 я знаю 2, int0 b int1, по внешнему событию. Лучше бы рассказал или показал где и как. Нашел еще статейку про этот блок питания https://www.kirich.blog/stati/infor...k-pitaniya-dolzhen-byt-tyazhelym-chast-2.html . В ней и схема есть. Похоже что энкодеры подключены как клавиатура 2 на 3. Такое может быть?
Все есть в даташите или, если по-русски, в книге Евстифеева. Если коротко, то все ноги помеченные как PCINT, умеют прерывания по изменению уровня. Какой уровень на ноге - это уже забота разработчика ПО.
Настраиваете прерывание по таймеру и опрашиваете невзирая на все остальное. А в некоторой глобальной переменной обновляется текущее положение энодера(ов). И очень желательно делать это не через digitalRead, а как то так: Код (C++): ISR(TIMER1_COMPA_vect) { p[0] = p[1]; p[1] = PINB & 0b00000011; if (p[0] & p[1] == 1) stepEnc++; if (p[0] & p[1] == 2) stepEnc--; } Наверное, можно изящнее, даже наверняка, давно писал. Да, и опрашивать надо еще чаще, например каждые две миллисекунды, но это смотря какой энкодер и как его крутить. )