Hola:
Soy un asiduo usuario de Arduino, tengo 3 años de utilizar Arduino para hacer pequeños proyectos caseros cuando tengo tiempo, todo lo que se, lo aprendi viendo video tutoriales de Arduino en U-tube y leyendo las paginas y comentarios de gigantes en esta materia, hace mas de 8 meses que vengo informandome acerca de : Como controlar un Motor DC utilizando:
Modulo ide Arduino UNO, un servo motor DC con encoder incremental optico (MITSUMI PART # L24515 M28N-1 R-147319) y un L293D H Bridge.
logrado leer los pulsos del encoder del channel A y B, pero no he podido hacerlo funcionar para lograr controlar un motor de DC hasta que me di cuenta que la libreria que tengo que utilizar para este es una libreria PID. Hoy logre encontrar un sketch en internet lo escribi en Arduino UNO y cuando lo compilo me da una serie de errores, alguien me podria ayudar por favor:
El primer error es:
Encoder0PinA was not declared in this scope y me imagino que habra mas errores.
#include <PID_v1.h>
//Define Variables we'll be connecting to
volatile unsigned long lasTime;
volatile unsigned long duration, CapTime, LastCapTime;
volatile double errSum, lastErr, lastErr_2;
volatile double lastOutput;
volatile double dT;
volatile int count = 0;
double PV, Output;
double kp, ki, kd;
double ref;
void setup()
{
pinMode(encoder0PinA, INPUT);
pinMode(encoder0PinB, INPUT);
digitalWrite(encoder0PinA, HIGH); //turn on pull up resistor
digitalWrite(encoder0PinB, HIGH); //turn on pull up resistor
pinMode(MotorIN_1, OUTPUT);
pinMode(MotorIN_2, OUTPUT);
pinMode(MotorPWM, OUTPUT);
attachInterrupt(0, doEncoder, RISING);
capTime = 0;
LastCapTime = 0;
//Controller Parameter
kp = 0.01; ki = 0.00; kd = 0.00;
Output = 0;
Serial.begin (9600);
//Interrupt subroutine function
void doEncoder(){
LastCapTime =CapTime;
CapTime = millis();
}
void loop()
{
unsigned long now;
double Freq;
now = millis();
dT (double)(now - lasTime) / 1000; //Our Sampling Time
if(dT>=0.01){ //Do control loop every 10mS
duration = CapTime - LastCapTime; //get the period in mS
LastCapTime = CapTime;
if(duration==0){
Freq = 0;
}
else{
Freq = 1000/(double)duration; //in Hz unit
}
PV = Freq*60/2; //rpm unit
compute(ref, PV); //Find controller output
sendCommand(Output); //send command to DC motor
lastTime = now;
}
//receive command
byte val;
if(Serial.available()){
val = Serial.read();
switch (val){
case 'A': ref = 0; break;
case 'W': ref += 100; break;
case 'S': ref -= 100; break;
case 'O': kp += 0.01; Serial.println(kp); break;
case 'L': kp -= 0,01; Serial.println(kp); break;
case 'I': ki += 0.01; Serial.println(ki); break;
case 'K': ki -= 0.01; Serial.println(ki); break;
case 'U': kd += 0.001; Serial.println(kd); break;
case 'J': kd -= 0.001; Serial.println(kd); break;
}
}
//display setpoint and measured value
if(count>50){
Serial.print(ref);
Serial.print(' ');
Serial.print(PV);
Serial.print(' ');
Serial.print(Output);
Serial.println(' ');
count = 0;
}else{count++;}
//the "sendCommand" function
void sendCommand(int cmd){
if(cmd>0) {
analogWrite(MotorPWM, cmd);
digitalWrite(MotorIN_1, LOW);
digitalWrite(MotorIN_2, HIGH);
}
else if(cmd<0){
analogWrite(MotorPWM, -cmd);
digitalWrite(MotorIN_1,HIGH);
digitalWrite(MotorIN_2,LOW);
}
else{
analogWrite(MotorPWM, 0);
digitalWrite(MotorIN_1,LOW);
digitalWrite(MotorIN_2,LOW);
}
}
//The PID controller algorithm (Velocity PID Algorithm)
void compute(double Setpoint, double Measured)
{
double error = Setpoint - Measured;
/*Compute PID Output*/
Output = kp*(error - lastErr) + ki*error*dT + kd*(error -2*lastErr + lastErr-2) / dT
+ lastOutput;
/*Max 255, Min -255*/
if(Output >255){Output =255;}
else if(Output <-255){Output = 255;}
else{}
/*Remember some variables for next time*/
lastOutput = Output;
lastErr_2 = lastErr;
lastErr = error;
}
Muchas gracias de Antemano
Dherreiros