Leer un encoder rotatorio y mandar la señal de vuelta por una salida.

Hola a todos, necesitaría un poco de ayuda para mi primer proyecto Arduino.

Estoy tratando de ralentizar el movimiento de avance y retroceso del papel de una impresora.

Mi primer intento fue poner una resistencia a los 48V del motor, pero obtenía "Error fatal" y la impresora no funcionaba.

En mi segundo intento estoy tratando de leer la señal del encoder, hacer lo que tenga que hacer y una vez hecho mandarle la señal de vuelta a la impresora a través de un i2c bidirectional level shifter, para convertir la señal a 3.3V. Pero nuevamente obtengo "Error fatal" la impresora no funciona.

Mi código es el siguiente:

#define Y_ENCODER_PIN_A 2
#define Y_ENCODER_PIN_B 3
#define FAKE_Y_ENCODER_PIN_A 4
#define FAKE_Y_ENCODER_PIN_B 5

void setup() {
  pinMode(Y_ENCODER_PIN_A, INPUT);
  pinMode(Y_ENCODER_PIN_B, INPUT);

  digitalWrite(Y_ENCODER_PIN_A, HIGH);
  digitalWrite(Y_ENCODER_PIN_B, HIGH);

  attachInterrupt(0, updateEncoderA, CHANGE); 
  attachInterrupt(1, updateEncoderB, CHANGE);

}

void loop() { 
}

void updateEncoderA() {
  int durationLpinA = pulseIn(Y_ENCODER_PIN_A, LOW);
  int durationHpinA = pulseIn(Y_ENCODER_PIN_A, HIGH);
  int pinA = ((durationLpinA)/(durationLpinA + durationHpinA));

  analogWrite(FAKE_Y_ENCODER_PIN_A, pinA);
}

void updateEncoderB() {
  int durationLpinB = pulseIn(Y_ENCODER_PIN_B, LOW);
  int durationHpinB = pulseIn(Y_ENCODER_PIN_B, HIGH);
  int pinB = ((durationLpinB)/(durationLpinB + durationHpinB));

  analogWrite(FAKE_Y_ENCODER_PIN_B, pinB);
}

Muchas gracias a todos por vuestra ayuda.
Un saludo

Finalmente lo he solucionado con este otro código:

#define Y_ENCODER_PIN_A 2
#define Y_ENCODER_PIN_B 3
#define FAKE_Y_ENCODER_PIN_A 4
#define FAKE_Y_ENCODER_PIN_B 5

volatile int lastYEncoded = 0;
volatile long encoderYValue = 0;

long lastencoderYValue = 0;

int lastYMSB = 0;
int lastYLSB = 0;

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

  pinMode(Y_ENCODER_PIN_A, INPUT);
  pinMode(Y_ENCODER_PIN_B, INPUT);
  pinMode(FAKE_Y_ENCODER_PIN_A, OUTPUT);
  pinMode(FAKE_Y_ENCODER_PIN_B, OUTPUT);

  digitalWrite(Y_ENCODER_PIN_A, HIGH); //turn pullup resistor on
  digitalWrite(Y_ENCODER_PIN_B, 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, updateYEncoder, CHANGE);
  attachInterrupt(1, updateYEncoder, CHANGE);
}

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


void updateYEncoder() {
  int MSB = digitalRead(Y_ENCODER_PIN_A); //MSB = most significant bit
  int LSB = digitalRead(Y_ENCODER_PIN_B); //LSB = least significant bit

  int encoded = (MSB << 1) | LSB; //converting the 2 pin value to single number
  int sum  = (lastYEncoded << 2) | encoded; //adding it to the previous encoded value

  if(sum == 0b1110 || sum == 0b0111 || sum == 0b0001 || sum == 0b1000) {
    encoderYValue ++;
  }
  if(sum == 0b1101 || sum == 0b0100 || sum == 0b0010 || sum == 0b1011) {
    encoderYValue --;
  }

  digitalWrite(FAKE_Y_ENCODER_PIN_A, MSB);
  digitalWrite(FAKE_Y_ENCODER_PIN_B, LSB);

  lastYEncoded = encoded; //store this value for next time
}