Работа с инкрементальными энкодерами.
- Код для ардуино с двумя подключёнными к ней энкодерами (используются только каналы А и В)
#define encoder1PinA 2 // А пин 2 прерывание #define encoder1PinB 4 // B пин 4 #define encoder2PinA 3 // А пин 3 преравание #define encoder2PinB 5 // B пин 5 volatile long encoder1Pos = 0; // переменная по подсчету импульсов volatile long encoder2Pos = 0; // переменная по подсчету импульсов void setup() { pinMode(encoder1PinA, INPUT); pinMode(encoder1PinB, INPUT); pinMode(encoder2PinA, INPUT); pinMode(encoder2PinB, INPUT); attachInterrupt(0, Encoder1, RISING); // прерывание вызывается только при смене значения на порту с LOW на HIGH attachInterrupt(1, Encoder2, RISING); // прерывание вызывается только при смене значения на порту с LOW на HIGH Serial.begin (9600); } void Encoder1() { if (digitalRead(encoder1PinA) == HIGH) { if (digitalRead(encoder1PinB) == LOW) { encoder1Pos = encoder1Pos + 1; // по часовой стрелке } else { encoder1Pos = encoder1Pos - 1; // против часовой стрелки } } } void Encoder2() { if (digitalRead(encoder2PinA) == HIGH) { if (digitalRead(encoder2PinB) == LOW) { encoder2Pos = encoder2Pos + 1; // по часовой стрелке } else { encoder2Pos = encoder2Pos - 1; // против часовой стрелки } } } void loop () { Serial.print(encoder1Pos); Serial.print(" "); Serial.print(encoder2Pos); Serial.println(""); }