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;
}