[SOLUCIONADO] Creación de objetos

Hola amigos, aprovecho este problemilla que me surge para presentarme. Llevo un par de meses trasteando con el arduino y he aprendiendo mucho leyéndoos aquí en el foro. Acabo de terminar la carrera de ingeniera técnica industrial y es curioso que casi he aprendido más trasteando en casa que en todos los años de universidad.

Ahora estoy subiendo el nivel de complejidad de mis proyectos y estoy empezando a usar programación orientada a objetos.

He programado una librería y cuando solo creo un objeto de esa clase todo funciona de maravilla. El problema es cuando creo mas de uno, que entonces los dos se comportan exactamente igual aunque les pase parámetros distintos.

Me gustaría pegaros el código que imagino que será de ayuda, pero no soy capaz de darle ese formato tan chulo que he visto en algunos hilos.

Un saludo y gracias por adelantado ;)

Tengo una clase Motor de la que creo dos objetos. Les digo que se muevan una cantidad distinta, pero siempre se mueven los dos igual.

Os copio el código:

Arduino:

#include <Motor.h>

Motor mL(6,A5);//primer parámetro: salida PWM; segundo parámetro: entrada del encoder óptico
Motor mR(9,A0);

void setup(){
mR.giraPasos(24);
mL.giraPasos(48);
}
void loop(){
mR.actualiza();
mL.actualiza();
}

Motor.h :

#include <Arduino.h>
class Motor{
private**:**
int pinMotor;
int pinSensor;
int pasosEncoder;
int diametroRuedas;
unsigned int distanciaActual,distanciaObjetivo;
public**:**
Motor(int pinM ,int pinS); //primer parámetro: salida PWM, segundo parámetro: entrada del encoder óptico
void actualiza();
void giraPasos(int p);
void viaja(int distancia);
void setSpeed(int pasosSegundo);
int getPasosObjetivo();
int getPasosEncoder();
boolean flanco(boolean senal);
};

Motor.cpp :

#include <Arduino.h>
#include “pins_arduino.h”
#include <Motor.h>

#define P 15 //Constantes del regulador PID
#define D 0
#define I 0

int pinMotor;
int pinSensor;
int pasosEncoder;
int diametroRueda;//milimetros
int velocidadDeseada;
int pwm;
unsigned int pasosActual,pasosObjetivo;

//Constructor
Motor::Motor(int pinM,int pinS){ //primer parámetro: salida PWM a la etapa potencia, segundo parámetro: entrada del encoder óptico
pinMotor=pinM;
pinSensor=pinS;
pasosEncoder=24; //24 divisiones
diametroRueda=65;//diámetro de la rueda en mm
pasosActual=0;//cantidad total de pasos(divisiones del encoder) dadas por las ruedas
pasosObjetivo=0;// cantidad objetivo de pasos
pinMode(pinMotor, OUTPUT);
}

void Motor::actualiza(){
//control PID para alcanzar los pasos que faltan desde pasos actual a pasos objetivo
unsigned long tiempoAnt=0;
static float integral=0;
int error=0;
static int errorAnt=0;

pasosActual = pasosActual + flanco(digitalRead(pinSensor)); //la cantidad de pasos se incrementa con cada nuevo flanco del sensor
error= pasosObjetivo - pasosActual; //error para el regulador PID
integral += error * ((millis()-tiempoAnt)); //Área encerrada bajo la curva
pwm = error * P + D*((error - errorAnt)/((float)(millis()-tiempoAnt)))+I*integral; //pwm= control PID

if (pwm>255) pwm=255;
if (pwm<0) pwm=0;

if (error<=0){
pwm=0;
integral=0;
}

analogWrite(pinMotor,pwm);
tiempoAnt=millis();
errorAnt=error;
}

//establece el objetivo de pasos
void Motor::giraPasos(int p){
pasosObjetivo=pasosActual + p;
}
//La rueda gira la cantidad de milimetros proporcionada por el parámetro
void Motor::viaja(int distancia){
pasosObjetivo = pasosActual + (distancia * pasosEncoder)/(diametroRueda * 3.14f) ;

}

void Motor::setSpeed(int v){
velocidadDeseada=v;
}

int Motor::getPasosObjetivo(){
return pasosObjetivo;
}

int Motor::getPasosEncoder(){
return pasosEncoder;
}

//DETECCIÓN FLANCO Y ANTIREBOTE, devuelve HIGH si detecta un flanco
boolean Motor::flanco( boolean senal) {
static int anterior=0;
static long tiempoAnt=0;
boolean retorno = LOW;

if ( senal==HIGH && anterior==LOW && (millis() - tiempoAnt)>6){
retorno = HIGH;
tiempoAnt=millis();
}
else if ( senal==LOW && anterior==HIGH && (millis() - tiempoAnt)>6){
retorno = HIGH;
tiempoAnt=millis();
}
anterior = senal;
return retorno;
}

Prueba a ver si así te funciona

#ifndef Motor_h
#define Motor_h

#include <Arduino.h>

class MotorClass{
private: 
   int pinMotor;
   int pinSensor;
   int pasosEncoder;
   int diametroRuedas;
   unsigned int distanciaActual,distanciaObjetivo;
public:
   Motor(int pinM ,int pinS); //primer parámetro: salida PWM, segundo parámetro: entrada del encoder óptico
     void  actualiza();
   void  giraPasos(int p);
   void  viaja(int distancia);
   void  setSpeed(int pasosSegundo);
   int  getPasosObjetivo();
   int  getPasosEncoder();
   boolean flanco(boolean  senal);
};

extern MotorClass Motor;

#endif

Todo técnico e ingeniero va a llegar a la misma conclusión que tu. Una cosa es la teoría y otra la práctica. El mundo real tiene muchos trucos que se estudian claro está pero hay que sufrirlos para que enriquezcan nuestra experiencia y desarrollemos la habilidad para superarlos. Cuentanos si la solución propuesta por @JohnnyDeauville funcionó?

Gracias a los dos. Ya me funciona. El problema era que había vuelto a declarar las variables en el .cpp cuando ya se habían declarado en el .h Una vez corregido funcionó a la primera.

Saludos ;)