Подключение двух энкодеров (Arduino)

Тема в разделе "Arduino & Shields", создана пользователем Levpard, 29 авг 2016.

  1. Levpard

    Levpard Нуб

    Всем привет! Никак не могу подключить два энкодера к одним контактам (дабы сэкономить пины). Пытаюсь сделать так, как на фото - один энкодер как ни крути только увеличивает показания, другой вообще не реагирует. Подскажите, я только разбираюсь в мире 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();
      }                      
    }
    IMG_1082.JPG
     
  2. ostrov

    ostrov Гуру

    В код не вчитывался, но пока не пойму принципа. Как задумывается отличать один от другого? Или они должны работать как один какой не крути?
     
  3. 9xA59kK

    9xA59kK Гик

    Наверно автор хочет чтобы энкодер увеличивал значения крутя в одну сторону , уменьшал в другую, но не смог сделать и пытается это сделать с помощью двух энкодеров, это только предположение пока автор не скажет что он задумал.А может быть еще что то.
     
  4. qwone

    qwone Гик

    анекдот
    Чувак сует 2 ноги в одну штанину. Народ смотрит и удивляется.
    - Зачем?
    - Я так экономлю штаны. Пол года похожу в одной штанине, а пол года в другой. Вот на год их и хватит.

    А теперь по делу на энкодерах пины не экономят. Энкодеры это дело не любят.
     
    Последнее редактирование: 29 авг 2016
    parovoZZ и ИгорьК нравится это.
  5. ostrov

    ostrov Гуру

    Ну то есть один энкодер стоит, замыкая общий контакт, при этом автор крутит второй пытаясь считать с него значения? А вообще, если ног мало, купите за 50 руб отдельный МК, например мой возлюбленный тини 2313 и сделайте из него отдельный контроллер для штук 4 - 5 энкодеров, который бы их опрашивал, запоминал положения, а данные передавал бы по UART на базу, используя для этого всего 1 ногу. По моему выгодно!
     
  6. Levpard

    Levpard Нуб

    Смысл такой: крутишь один по часовой, counter увеличивается; крутишь его же против - уменьшается. Крутишь ДРУГОЙ по часовой - тот же counter увеличивается; крутишь ДРУГОЙ против - он же уменьшается.
     
  7. qwone

    qwone Гик

    А то что каждый энкодер требует своего вычислительного потока с повторяемостью 5 миллисекунд наплевать. Это обычная кнопка обходится вычислительным потоком в 200 милисек. Потому что человек не может чаще по ней стучать и ее дребезг.
    Если хочется повесить энкодер на 1 ногу. то эта нога может быть только аналоговым входом.
     
    Последнее редактирование: 29 авг 2016
  8. ostrov

    ostrov Гуру

    Вы бы посмотрели как энкодер устроен изнутри, там нет ничего сложного. Но зато поймете почему два энкодера на одни пины вешать бессмыслено.
     
  9. Levpard

    Levpard Нуб

    Хорошо, понял, не буду пины экономить))) Спасибо!
     
  10. diana221323

    diana221323 Нуб

    Подскажите а как подключить два энкодера к разным входам Ардуино нано? Если прерывания можно использовать только на 2, 3 Пине?
     
  11. ostrov

    ostrov Гуру

    Можно циклически опрашивать любые пины.
     
  12. parovoZZ

    parovoZZ Гуру

    Что за бред? Прерывания дают практически все пины у АВР.
     
  13. Привет всем. только поболтать.а реально помочь?
    вот тут

    обзор китайского конструктора с двумя энкодерами.
    но как это работает я не знаю.
    наверно каждый энкодер сидит на одном из двух прерываний по вешнему событию.
     
  14. ostrov

    ostrov Гуру

    Можно и несколькими способами.
     
  15. b707

    b707 Гуру

    выше уже написали, что реально прерываний не два, а больше.
     
  16. Всем привет!!
    Я читал что прерываний может быть много и различных.В мега8 я знаю 2, int0 b int1, по внешнему событию.
    Лучше бы рассказал или показал где и как.
    Нашел еще статейку про этот блок питания https://www.kirich.blog/stati/infor...k-pitaniya-dolzhen-byt-tyazhelym-chast-2.html . В ней и схема есть. Похоже что энкодеры подключены как клавиатура 2 на 3. Такое может быть?
     
  17. b707

    b707 Гуру

    ну а почему нет7 Энкодеры и опрашивать можно как клавиатуру, и даже вовсе без прерываний
     
    ostrov и DetSimen нравится это.
  18. parovoZZ

    parovoZZ Гуру

    Все есть в даташите или, если по-русски, в книге Евстифеева. Если коротко, то все ноги помеченные как PCINT, умеют прерывания по изменению уровня. Какой уровень на ноге - это уже забота разработчика ПО.
     
  19. DetSimen

    DetSimen Guest

    Я всегда так делаю. Правда, надо это делать часто, примерно раз в 20 мс.
     
    b707 нравится это.
  20. ostrov

    ostrov Гуру

    Настраиваете прерывание по таймеру и опрашиваете невзирая на все остальное. А в некоторой глобальной переменной обновляется текущее положение энодера(ов). И очень желательно делать это не через 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--;
    }
    Наверное, можно изящнее, даже наверняка, давно писал. Да, и опрашивать надо еще чаще, например каждые две миллисекунды, но это смотря какой энкодер и как его крутить. )
     
    Последнее редактирование: 24 авг 2019