Interrupciones pinChange en librería

Hola!

Estoy intentado hacer mi primera librería con interrupciones tipo ISR (PCINT0_vect).

Lo uso para el control de unos motores y lectura de encoders de un robot.

Este es el .h

#ifndef robot_h
#define robot_h
#include "Arduino.h"; 


#define PWMD 9
#define PWMI 10
#define dirD 7
#define dirI 8
#define encoderDB A3
#define Kp 1
#define Ki 5
#define encoderIA 2
#define encoderDA 3
#define encoderIB 11

class robotClass{ 
    public: 
      
    //! Class constructor.
       
    robotClass();
    
    void VelocidadI(int Vi_ref); 
    void VelocidadD(int Vd_ref);
    void InterruptD();
    void InterruptI();
    volatile double encoderDPos ;
	volatile double encoderIPos ;  

    private:
    
   
} ;

extern robotClass robot;
#endif

y este .cpp

#include "Arduino.h"
#include "robot.h"
#include "pins_arduino.h"
#include <PinChangeInt.h>

robotClass::robotClass() {

  pinMode(encoderDA, INPUT);
  pinMode(encoderIA, INPUT);
  pinMode(encoderDB, INPUT);
  pinMode(encoderIB, INPUT);
  pinMode(PWMD, OUTPUT);
  pinMode(PWMI, OUTPUT);
  pinMode(dirI, OUTPUT);
  pinMode(dirD, OUTPUT);

  PCMSK0 |= bit (PCINT3);  // want pin 11
  PCMSK1 |= bit (PCINT11);  //want pin A3
  PCIFR  |= bit (PCIF0);   // clear any outstanding interrupts
  PCIFR  |= bit (PCIF1);
  PCICR  |= bit (PCIE0);   // enable pin change interrupts for D8 to D13
  PCICR  |= bit (PCIE1);   // enable analog pins
  attachInterrupt(digitalPinToInterrupt(encoderDA), InterruptD, CHANGE);
  attachInterrupt(digitalPinToInterrupt(encoderIA), InterruptI, CHANGE);
 
}


void robotClass::VelocidadD(int Vd_ref){
  static double encoderPos_ant = 0;
  static float Ierr_ant = 0;
 
  int Vd = int((encoderDPos-encoderPos_ant)*1.5/(10*0.048));
  encoderPos_ant = encoderDPos;
 
  float error = Vd_ref - Vd;
  float Ierr = Ierr_ant + error;
  int accion = int(Ki*Ierr + Kp*error);
  Ierr_ant = Ierr;

  if (accion > 1023) accion = 1023;
  else if (accion < -1023) accion = -1023;
 
  if (accion > 0) digitalWrite(dirD, LOW);
  else digitalWrite(dirD, HIGH);
  analogWrite(PWMD, abs(accion)); 
}


void robotClass::VelocidadI(int Vi_ref) {
  static double encoderIPos_ant = 0;
  static float Ierr_ant = 0;
 
  int Vi = int((encoderIPos-encoderIPos_ant)*1.5/(10*0.048));
  encoderIPos_ant = encoderIPos;
 
  float error = Vi_ref - Vi;
  float Ierr = Ierr_ant + error;
  int accion = int(Ki*Ierr + Kp*error);
  Ierr_ant = Ierr;

 
  if (accion > 1023) accion = 1023;
  else if (accion < -1023) accion = -1023;
 
  if (accion > 0) digitalWrite(dirI, HIGH);
  else digitalWrite(dirI, LOW);
  analogWrite(PWMI, abs(accion));
 
}

void robotClass::InterruptD() {
  if (digitalRead(encoderDA) == digitalRead(encoderDB)) encoderDPos++;
  else encoderDPos--;
  return;
}

 
void robotClass::InterruptI() {
 if (digitalRead(encoderIA) == digitalRead(encoderIB))encoderIPos--;
 else encoderIPos++;
 return;
}
/*
ISR (PCINT0_vect) //pines d8 a d11
 {
  if (digitalRead(encoderIA) == digitalRead(encoderIB)) encoderIPos++;
  else encoderIPos--;
  return;
}

ISR (PCINT1_vect) //pines analogicos
 {
 if (digitalRead(encoderDA) == digitalRead(encoderDB))encoderDPos--;
 else encoderDPos++;
 return;
 }*/
 
 robotClass robot;

Tengo error de compilación en ambas ISR(PCINTX_vect). encoderXPos no está declarado.
He probado a poner el nombre tal cual en el .h pero no me funciona. Existe alguna manera de hacerlo? Quizá no es adecuado meter las interrupciones en la librería? Tampoco tengo claro sí #define en private es adecuado.

Gracias!

Porque no agregas un pequeño demo para usar tu librería?