Новый энкодер и привязка к старому коду.

Тема в разделе "Arduino & Shields", создана пользователем igoreck, 31 дек 2021.

  1. igoreck

    igoreck Нуб

    Раньше с этим кодом, у меня четко работали энкодеры от магнитол, за один щелчек код выдавал 1 такт.

    Сейчас они закончились, и я купил новые, но в этом коде все энкодеры дают 4 такта за один щелчек.

    Что изменить в коде, чтобы новый энкодер, который дает 4 такта за один щелчек, отрабатывался как один такт?
    Код (C++):
    /* This code is without the push button function
        These pins can not be changed 2/3 are special pins -> Interrupt */

        const uint8_t encoderPin1 = 2;
        const uint8_t  encoderPin2 = 3;

        volatile int lastEncoded = 0;
        volatile long encoderValue = 0;
        long lastencoderValue = 0;
        uint8_t lastMSB = 0;
        uint8_t lastLSB = 0;

        void setup() {
          Serial.begin (9600);

          pinMode(encoderPin1, INPUT);
          pinMode(encoderPin2, INPUT);

          digitalWrite(encoderPin1, HIGH); //turn pullup resistor on
          digitalWrite(encoderPin2, HIGH); //turn pullup resistor on
          /* Call updateEncoder() when any high/low changed seen
          on interrupt 0 (pin 2), or interrupt 1 (pin 3)*/

          attachInterrupt(0, updateEncoder, CHANGE);
          attachInterrupt(1, updateEncoder, CHANGE);
        }

        void loop() {
          //Do stuff here
          Serial.println(encoderValue);
          delay(1000); //just here to slow down the output, and show it will work even during a delay
        }

        void updateEncoder() {
          int MSB = digitalRead(encoderPin1); //MSB = most significant bit
          int LSB = digitalRead(encoderPin2); //LSB = least significant bit
          int encoded = (MSB << 1) | LSB; //converting the 2 pin value to single number
          int sum = (lastEncoded << 2) | encoded; //adding it to the previous encoded value
          if (sum == 0b1101 || sum == 0b0100 || sum == 0b0010 || sum == 0b1011) encoderValue ++;
          if (sum == 0b1110 || sum == 0b0111 || sum == 0b0001 || sum == 0b1000) encoderValue --;
          lastEncoded = encoded; //store this value for next time
        }
     
  2. User248

    User248 Гик

    Поставить кратковременную задержку, чтобы она срабатывала после первого такта, пока не пройдут остальные три. Или сделать счётчик тактов с помощью кода триггера.
     
    Последнее редактирование: 4 янв 2022
  3. vvr

    vvr Инженерище

    encoderValue / 4
     
  4. igoreck

    igoreck Нуб

    Спасибо, я тоже так думал и делал, вместо:
    if(sum ==0b1101|| sum ==0b0100|| sum ==0b0010|| sum ==0b1011) encoderValue ++;
    это:
    if(sum ==0b1101|| sum ==0b0100|| sum ==0b0010|| sum ==0b1011) encoderValue /4;
    не работало.
    А сейчас поменял:
    Serial.println(encoderValue/4);
    И заработало!
     
  5. igoreck

    igoreck Нуб

    Второй вопрос!
    Как этом скетче, прерывания, перестроить на физ порты PCINT21, PCINT22.