Работа с инкрементальными энкодерами.
#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("");
}