viernes, 5 de diciembre de 2014

Robot Velocista de competencia - Parte III : Algoritmo Pid - Programacion Robot velocista

Algoritmo Pid - Programacion Robot velocista


->PID

El PID (control proporcional, integral y derivativo) es un mecanismo de control por realimentacion que calcula la desviacion o error entre un valor medido y el valor que se quiere obtener (set point, target position  o punto de consigna), para aplicar una acción correctora que ajuste el proceso.

En el caso del robot velocista, el controlador PID ,(que es una rutina basada matematicamente), procesara los datos del sensor, y lo utiliza para controlar la dirección (velocidad de cada motor), para de esta forma  mantenerlo  en curso.






- Error - Llamamos a la diferencia entre la posición objetivo y la posición medida del error. (que tan lejos del punto de consigna se encuentra el sensor, en nuestro caso el objetivo es tener  los sensores centrados)




-Set point o Target Position - Cuando el error es  0 (cero). En el caso del robot velocista es 3500, la idea es siempre mantenerlo en la la linea, o lo que es el caso de los sensores,  mantenerlo centrado y asi no  se llegue a salir de la linea.
->PARAMETROS:

-Proporcional: Es la respuesta  al error que se tiene que entregar de manera inmediata, es decir, si nos encontramos en el centro de la linea, los motores , tendran en respuesta una velocidad de igual  valor, si nos alejamos del centro, uno de los motores reducira su velocidad y el otro aumentara.
                                       Proporcional=(posición) -punto_consigna 

-Integral: La integral es la sumatoria de los errores acumulados, tiene como propósito el disminuir y eliminar el error en estado estacionario provocado por el modo proporcional, en otras palabras, si el robot velocista se encuentra mucho tiempo alejado del centro (ocurre muchas veces cuando se encuentra en curvas), la accion integral se ira acumulando e ira disminuyendo el error hasta llegar al punto de consigna,
                                     Integral=Integral + proporcional_pasado

-Derivativo: Es la derivada del error, su funcion es mantener el error al minimo, corrigiendolo proporcionalmente con la mismo velocidad que se produce, de esta manera evita que el error se incremente, en otra palabra, anticipara la accion evitando asi las oscilaciones excesivas.
                                    Derivativo=proporcional-proporcional_pasado

->CONSTANTES: 

Factor (Kp) - Es un valor constante utilizado para aumentar o reducir el impacto de Proporcional. Si el valor es excesivo, el robot tendera responder inestablemente, oscilando  excesivamente. Si el valor es muy pequeño, el robot respondera muy lentamente,  tendiendo a salirse de las curvas

Factor (Ki) - Es un valor constante utilizado para aumentar o reducir el impacto de la Integral, El valor excesivo de este provocara oscilaciones excesivas, Un valor demasiado bajo no causara impacto alguno.

Factor (Kd) - Es un valor constante utilizado para aumentar o reducir el impacto de la Derivada. Un valor excesivo provocara  una sobre amortiguacion.  provocando inestabilidad.

                     Salida_pwm = ( proporcional * Kp ) + ( derivativo * Kd ) + (integral*Ki);


->SINTONIZACION PID

Aqui viene el reto, la sintonizacion pid, es aqui donde se tendra que buscar las constantes que correspondan a las caracteristicas fisicas del robot, la forma mas facil de hacerlo es por ensayo y error, hasta obtener el valor deseado. Aqui hay unos pasos que ayudaran mucho a buscar esas constantes:
  1. Comience con Kp, Ki y Kd igualando 0 y trabajar con Kp primero. Pruebe  establecer Kp a un valor de 1 y observar el robot. El objetivo es conseguir que el robot siga la línea, incluso si es muy inestable. Si el robot llega más allá y pierde la línea, reducir el valor de Kp. Si el robot no puede navegar por una vez, o parece lenta, aumente el valor Kp.
  2. Una vez que el robot es capaz de seguir un poco la línea, asignar un valor de 1 a Kd .Intente aumentar este valor hasta que vea menos oscilaciones.
  3. Una vez que el robot es bastante estable en la línea siguiente, asigne un valor de 0,5 a 1,0 a Ki. Si el valor de Ki es demasiado alta, el robot se sacudirá izquierda y derecha rápidamente. Si es demasiado baja, no se vera ninguna diferencia perceptible. El Integral es acumulativo por lo tanto  el valor Ki tiene un impacto significativo.  puede terminar  ajustando por 0,01 incrementos.
  4. Una vez que el robot está siguiendo la línea con una buena precisión, se puede aumentar la velocidad y ver si todavía es capaz de seguir la línea. La velocidad afecta el controlador PID y requerirá resintonizar como los cambios de velocidad.
->ALGORITMO EN ARDUINO


#include <QTRSensors.h>
/////////////////////////////////////////////////////////////////////////////////////
//*************  Programa realizado por MARCO A. CABALLERO MORENO***************   //
// Solo para fines educativos   
// robot velocista mini FK BOT  V 2.0                                            //
// micro motores pololu MP 10:1, sensores qtr 8rc, driver drv8833, arduino nano    //
//                                     05/12/2014                  
// ACTUALIZADO 29/3/2015            
/////////////////////////////////////////////////////////////////////////////////////

#define NUM_SENSORS   8     //numero de sensores usados
#define TIMEOUT       2000  // tiempo de espera para dar resultado en uS
#define EMITTER_PIN   6     //pin led on
///////////////pines arduino a utilizar/////////////////////
#define led1          13 
#define led2          4  
#define mot_i         7
#define mot_d         8
#define sensores      6
#define boton_1       2  //pin para boton
#define pin_pwm_i     9
#define pin_pwm_d     10

QTRSensorsRC qtrrc((unsigned char[]) {19, 18, 17, 16,15,14,11,12}
,NUM_SENSORS, TIMEOUT, EMITTER_PIN);

//variables para almacenar valores de sensores y posicion
unsigned int sensorValues[NUM_SENSORS];
unsigned int position=0;

/// variables para el pid
int  derivativo=0, proporcional=0, integral=0; //parametros
int  salida_pwm=0, proporcional_pasado=0;

///////////////AQUI CAMBIEREMOS LOS PARAMETROS DE NUESTRO ROBOT!!!!!!!!!!!!!!!
int velocidad=120;              //variable para la velocidad, el maximo es 255
float Kp=0.18, Kd=4, Ki=0.001;  //constantes
//variable para escoger el tipo de linea
int linea=0;                    //  0 para lineas negra, 1 para lineas blancas

void setup()
{
 delay(800);
 pinMode(mot_i, OUTPUT);//pin de direccion motor izquierdo
 pinMode(mot_d, OUTPUT);//pin de direccion motor derecho
 pinMode(led1, OUTPUT); //led1
 pinMode(led2, OUTPUT); //led2
 pinMode(boton_1, INPUT); //boton 1 como pull up
        
 for (int i = 0; i <40; i++)  //calibracion durante 2.5 segundos,
 {                                 //para calibrar es necesario colocar los sensores sobre la superficie negra y luego 
  digitalWrite(led1, HIGH);  //la blanca
  delay(20);
  qtrrc.calibrate();    //funcion para calibrar sensores   
  digitalWrite(led1, LOW);  
  delay(20);
 }
digitalWrite(led1, LOW); //apagar sensores para indicar fin de calibracion 
delay(400); 
digitalWrite(led2,HIGH); //encender led 2 para indicar la
while(true)
{
    int x=digitalRead(boton_1); //leemos y guardamos el valor
                                      // del boton en variable x
    delay(100);
    if(x==0) //si se presiona boton 
    {
        digitalWrite(led2,LOW); //indicamos que se presiono boton
        digitalWrite(led1,HIGH); //encendiendo led 1
        delay(100);
        break; //saltamos hacia el bucle principal
    }
}
}       


void loop()
{

 //pid(0, 120, 0.18, 0.001, 4 );
  pid(linea,velocidad,Kp,Ki,Kd); //funcion para algoritmo pid 
                                 //primer parametro: 0 para lineas negras, tipo 1 para lineas blancas
                                 //segundo parametro: velocidad pwm de 0 a 255
                                 //tercer parametro: constante para accion proporcional
                                 //cuarto parametro: constante para accion integral
                                 //quinto parametro: constante para accion derivativa
  //frenos_contorno(0,700);
  frenos_contorno(linea,700); //funcion para frenado en curvas tipo 
                              //primer parametro :0 para lineas negras, tipo 1 para lineas blancas
                              //segundo parametro:flanco de comparación va desde 0 hasta 1000 , esto para ver 
}

////////funciones para el control del robot////
 void pid(int linea, int velocidad, float Kp, float Ki, float Kd)
{
  position = qtrrc.readLine(sensorValues, QTR_EMITTERS_ON, linea); //0 para linea negra, 1 para linea blanca
  proporcional = (position) - 3500; // set point es 3500, asi obtenemos el error
  integral=integral + proporcional_pasado; //obteniendo integral
  derivativo = (proporcional - proporcional_pasado); //obteniedo el derivativo
  if (integral>1000) integral=1000; //limitamos la integral para no causar problemas
  if (integral<-1000) integral=-1000;
  salida_pwm =( proporcional * Kp ) + ( derivativo * Kd )+(integral*Ki);
  
  if (  salida_pwm > velocidad )  salida_pwm = velocidad; //limitamos la salida de pwm
  if ( salida_pwm < -velocidad )  salida_pwm = -velocidad;
  
  if (salida_pwm < 0)
 {
  motores(velocidad+salida_pwm, velocidad);
 }
 if (salida_pwm >0)
 {
  motores(velocidad, velocidad-salida_pwm);
 }

 proporcional_pasado = proporcional;  
}

//funcion para control de motores
void motores(int motor_izq, int motor_der)
{
  if ( motor_izq >= 0 )  //motor izquierdo
 {
  digitalWrite(mot_i,HIGH); // con high avanza
  analogWrite(pin_pwm_i,255-motor_izq); //se controla de manera
                                        //inversa para mayor control
 }
 else
 {
  digitalWrite(mot_i,LOW); //con low retrocede
  motor_izq = motor_izq*(-1); //cambio de signo
  analogWrite(pin_pwm_i,motor_izq); 
 }

  if ( motor_der >= 0 ) //motor derecho
 {
  digitalWrite(mot_d,HIGH);
  analogWrite(pin_pwm_d,255-motor_der);
 }
 else
 {
  digitalWrite(mot_d,LOW);
  motor_der= motor_der*(-1);
  analogWrite(pin_pwm_d,motor_der);
 }

  
}

void frenos_contorno(int tipo,int flanco_comparacion)
{
  
if(tipo==0)
{
  if(position<=50) //si se salio por la parte derecha de la linea
 {
  motores(-80,90); //debido a la inercia, el motor 
                                  //tendera a seguri girando
                                  //por eso le damos para atras , para que frene
                                 // lo mas rapido posible 
  while(true)  
  {
   qtrrc.read(sensorValues); //lectura en bruto de sensor   
   if( sensorValues[0]>flanco_comparacion || sensorValues[1]>flanco_comparacion ) 
   //asegurar que esta en linea
   {
    break;
   } 
  }
 }

 if (position>=6550) //si se salio por la parte izquierda de la linea
 { 
  motores(90,-80);
  while(true)
  {
   qtrrc.read(sensorValues);
   if(sensorValues[7]>flanco_comparacion || sensorValues[6]>flanco_comparacion )
   {
    break;
   }  
  }
 }
}

if(tipo==1) //para linea blanca con fondo negro
{
 if(position<=50) //si se salio por la parte derecha de la linea
 {
  motores(-80,90); //debido a la inercia el motor 
                   //tendera a seguri girando
                   //por eso le damos para atras  
                   //para que frene lo mas rapido posible 
  while(true)  
  {
   qtrrc.read(sensorValues); //lectura en bruto de sensor
   if(sensorValues[0]<flanco_comparacion || sensorValues[1]<flanco_comparacion )   //asegurar que esta en linea
   {
    break;
   }
  }
 }

 if(position>=6550) //si se salio por la parte izquierda de la linea
 { 
  motores(90,-80);
  while(true)
  {
   qtrrc.read(sensorValues);
   if(sensorValues[7]<flanco_comparacion || sensorValues[6]<flanco_comparacion)
   {
    break;
   }  
  }
 }
}
}


ESQUEMA ROBOT VELOCISTA:





Esquemáticos PCB Mini FK-BOT 1.0:

Ya que me estuvieron pidiendo esquemáticos por mucho tiempo, pues aqui las libero.
He pasado muy buenos días diseñando este robot (la primera versión Mini FK-BOT 1.0), que fue considerado en su momento como el más rápido y que con el he ganado los concursos mas importantes del pais, ya ha pasado los años y cumplio su mision ...

La mejor forma de agradecerme es que le des clic a los anuncios de la parte superior del blog (cosa que no te costara nada hacerlo) , asi me ayudaras mucho! Saludos amigos robotero!!!  😊😎🙌



Clave Cifrado: !ErZkc0Pn38XY4eUiP7X7Dw









Video por ADKITS-PERU





Siguiente Post>> MODIFICACION LIBRERIA "QTR SENSORS" PARA MEJOR SENSADO - I Parte

Anterior post<< Robot Velocista de competencia: Utilizando la libreria QTR SENSORS



88 comentarios:

Este comentario ha sido eliminado por el autor.

es funcional para lineas blancas como para negras , pero si quieres obtener mejores resultado, hice una modificacion aqui: http://aprendiendofacilelectronica.blogspot.com/2015/04/modificacion-libreria-qtr-sensors-para_18.html

buena noche
amigo muy interesante tu tema, me podrias hacer un favor y enseñarme la conexion del circuito como tal y sino utilizas puente h para los motores, el tema de los encoders es que estoy trabajando en este tema.
gracias.

Buenos días.

Quería preguntar como se debe realizar el proceso de calibración?? No se si debo poner todos los sensores sobre la línea negra y luego sobre la parte blanca O si debo pasarlos en modo de abanico? Es que hay algo que no me esta funcionando y no me siento seguro de estar realizando bien el proceso de calibración.


Gracias y buen día.

puedes hacer de las dos maneras que mencionas , pero segun la experiencia que he tenido con esos sensores, se obtiene una mejor calibracion poniendo los sensores en el negro y luego en el blanco , mientras dure el proceso de calibracion que generalmete el led indica durante una intermitencia.

CAMILO ANDRES GOMEZ VIZCAYA, no entendi muy bien tu pregunta, si piensa usar encoder, te recomiendo que lo uses por los pines de interrupcion que trae el arduino que son 2(d2yd3), de esa manera puede hacer conteos de giros cada ves que cambie de estado.

Disculpa, como varia si en lugar de usar el driver TB6612FNG en lugar del DRV8833

no varia mucho en realidad solo cambia la dispocion de pines

una pregunta , de casualidad como conseguiste la libreria para utilisar QTRS?

¿Que batería sería recomendable usar en este proyecto?

Buen proyecto amigo, se puede utilizar otros sensores que no sean nesesariamente esos ?

Excelente!
solo tengo una duda, ¿puedo sustituir el driver que usas por un L293D?

8amigo estoy en proces8o de armado de un parecido pero con la placa baby orangutan y con sensores qtr8a se muy poco de programacion y me a tocado leer mucho para al menos entender un poco los codigos eh visto muchos codigos para arduino aqui en la net y trato de entenderlos para utilizar alguno solo que tengo una duda como se obtiene el set point ( proporcional = (position) - 3500; // set point es 3500, asi obtenemos el error) es que eh visto que en algunos codigos muy parecidos hay set point con valores de 2000, 2500, y el tuyo tiene 3500 como se obtiene ese valor??

hola Alejandro, veraz yo también desconozco mucho pero supongo que esos valores son los del sensor, que van de 0 a 7000 dependiendo de la luz que detecten, es decir la luz que da el mismo sensor aunada a la del ambiente, es por eso que es necesaria una calibración previa, saludos.

Luis Fernando Torres tengo una duda ya tengo armado y programdo mi seguidor de linea con un codigo un poco parecido ya lo eh estado probando y funciona solo que tengo unos problemillas, mi seguidor lleva unos motores pololu 10:1 hp la placa baby orangutan un elevador de voltaje XL6009 un regulador de voltaje 7805 smd una bateria li-ion 3.7v 4.51Whr y los sensores qtr8a el elevador de voltaje lo tengo ajustado a 7.5v, cuando en el codigo pongo los motores a 80 y calibro el PID funciona bien pero el problema es cuando lo llevo mas alla de 90 al momento de ponerlo en pista y que inician los motores solo se escucha donde intentan iniciar los motores pero el codigo se reinicia, ya puse unos capacitores ceramicos 104 (ya que los de tantalio no los manejan) en paralelo con la alimentacion de los motores y otro mas en la alimentacion de la baby orangutan y hace lo mismo no puedo llevarlo mas alla de 80 :( algun consejo

que tal, me gusto mucho el proyecto, muy bien explicado, pero tengo una pregunta, que debo cambiar en el codigo para que el robot funcione en una pista con fondo blanco y linea negra??

gracias por la pronta respuesta

Alejandro, veras los microcontroladores tienden a reiniciarse en voltajes pico y os motores son los causantes, los capacitores le ayudaran a los motores al acenso pero no solo a los motores a tu microcontrolador ponle un capacitor electrolitico de 1000 uF con un voltaje superior a los 7.5 V te recomiendo uno de 10V, eso a la entrada de alimentación del microontrolador en paralelo y uno mas a la salida del microcontrolador al baby orangutan, ten cuidado con la polaridad puede explotar y dar un buen susto, espero te ayude, en cualquier cosa que pueda ayudarte mi correo es fernyluy@hotmail.com

hola anónimo veras para que funcione en pista con linea blanca, solo es un simple cambio aquí unsigned int position=0; cambiando de 0 a 1 donde 0 linea negra y 1 linea blanca espero te sirva, todos los creditos a Marko Caballero

Hola amigo, excelente post! Es necesario que haya una distancia minima entre el suelo y los sensores? Que bateria usaste o cual me recomendarias?

Veras Sergio la distancia adecuada por mi experiencia es de aproximadamente 3mm alejado del suelo, se puede usar una batería lipo de 11v de unos 300 mA pero te recomiendo una de mayor capacidad, para alimentación independiente de los motores y arduino.
Saludos

Veras Sergio la distancia adecuada por mi experiencia es de aproximadamente 3mm alejado del suelo, se puede usar una batería lipo de 11v de unos 300 mA pero te recomiendo una de mayor capacidad, para alimentación independiente de los motores y arduino.
Saludos

Oye estoy haciendo este mismo proyecto para mi escuela, lo que pasa esque no se mucho de programacion en arduino pues casi no lo vi y no me intereso tanto por "la profesionalidad" del microcontrolador, pero por proyectos que tenemos a la vuelta de la esquina por asi decirlo nos recomendaron arduino por su facilidad quisiera saber si me pudieses ayudar tengo los sensores ya mencionados, micromotores hp 10:1 y varios componentes mas lo que quisiera saber es si me pudiesen ayudar con la programacion que me marca demasiados errores utilizare arduino uno se que es pesado pero es lo que tenemos a la mano quisiera que me contactaras para llevar esto cn mas tranquilidad puesto que estoy desesperado por terminarlo y nadamas me falta la programacion te dejo mi correo seria de mucha ayuda! rrf360@gmail.com estoy siempre activo en el y estare esperando tu correo gracias por leerme.

Amigo, podrias pasarme el link del post anterior, no puedo ingresar desde el link que pusiste arriba. Gracias

Igual yo intete pero me salio algo de qe no tenia permisos me urge que tengo 10 dias para entregarlo :s

Dudas fernyluy@hotmail.com
http://aprendiendofacilelectronica.blogspot.mx/2015/04/modificacion-libreria-qtr-sensors-para_18.html?m=1

Dudas fernyluy@hotmail.com
http://aprendiendofacilelectronica.blogspot.mx/2015/04/modificacion-libreria-qtr-sensors-para_18.html?m=1

te mande un correo bro espero respuesta

Igual yo amigo, te mande un correo

Amigo, en esta parte
(en la parte de la libreria mejorada)
position = qtrrc.readLine(sensorValues, QTR_EMITTERS_ON, linea,flanco_color, en_linea, ruido ) , no deberia ir un 1 o 0, dependiendo de la linea a seguir??
ASI : position = qtrrc.readLine(sensorValues, QTR_EMITTERS_ON, 1 ,linea,flanco_color, en_linea, ruido )

En caso de utilizar los sensores qtr-8a en vez de qtr-8rc afecta en algo?

hola, tu blog es muy bueno te felicito!, queria preguntarte algo, el pid que utilizas se puede adaptar a un robot balancin?, si es así, que le cambiarias?

buenas tengo una duda.... si se detecta por ejemplo en los sensores 1 y 2, la suma de estos dos daria 3000, pero no sería un problema? ya que sería como si realmente estuviera leyendo del sensor 3

Este comentario ha sido eliminado por el autor.

Hola "El_Xed" , muy buena tu pregunta. Hace unos cuantos meses diseñe un robot balancin y lo presente en intercon Huancayo 2015, y justamente use este codigo, especificamente la funcion del PID y una modificacion a la funcion de control de motores, las primeras veces era muy inestable(temblaba mucho), pero me di cuenta que no era tanto por el codigo, si no por el ruido de sensado que produce el acelerometro, asi que investigue un poco acerca del filtro kalman, y cogi un codigo que encontre por la web hecho en arduino utilizando un MPU6050, la estabilidad del balancin aumento drasticamente, llegando al punto de casi no oscilar. ya que estare de vacaciones en unas semanas, subire mas post y uno de estos sera el del robot balancin. Saludos!!

Hola "Fabricio Kevin Merida Gonzales", el calculo que se hace no es una suma, sino un promedio ponderado de los sensores.

Hola podriamos preguntar dudas respecto al velocista?

no me funciona el codigo lo monte lo probe y no funciona los motores se mueven muy poquito

HOLA AMIGO TENGO QUE INSTALAR LA LIBRERIA DEL CONTROL pid DE AURDUINO EN LA LIBRERIAS O EL CODIGO YA FUNCIONA TAL COMO ESTA

hola amigo!! tu proyecto me pareció muy bueno. solo una duda no usaste elevador de voltaje? y solo se recomienda usar motores de 10:1? agradeceria tu respuesta..

Hola amigo muy bueno tu proyecto tengo un problema con el esquema y es que lo monto tal cual está en la imagen y no me funciona los motores no andan, la verdad soy nuevo en esto y quiero aprender ya la libreria me funciona y todo pero tengo problema es quien la parte del circuito hay alguna coneccion que está pendiente en la imagen?? Gracias por tu aporte

buenos dias quiero saber como seria la conexion de un l293d y si lo puedo cambiar el drv8833

buenas tardes quisiera saber el circuito de PCBs

el diagrama que aparece en esta pagina es el indicado para el programa, porque ya lo conecte y no hace nada

hola buen dia, una duda , porque el setpoint esta en 3500? asi debe ser ? o porque el valor ?

hola buenos dias donde puedo comprar las piezas para armarlo porfavor

Este comentario ha sido eliminado por el autor.

hola muy buen aporte aunque queria pedirte por favor si me mandas las conecciones del circuito al correo javier_alva.05@hotmail.com por favor me seria de mucha ayuda

Hola, como andas? Quería saber si el arduino nano 3.0 es igual al 3.1 o funcional

camara perro tu chingadera no jala no mams

como conecto el led amigo estoy empezando en esto de los seguidore

hola amigo que tal no entiendo muy bn como calibrar los sensores me podrias ayudar indicando por fa

por favor alguien que me ayude a calibrar los sensores qtr8rc, porque el código que subió el autor no me funciona

Excelente amigo, definitivamente sos el puto amo xD
En serio EXCELENTE TRABAJO

amigo se podria hacer este mismo proyecto pero que funcione en linea negra y blanca con solo accionar un interruptor sin necesidad de mover el codigo desde la computadora ???

Hola, buen día...tengo una duda, en caso tal en el que yo quisiera que el seguidor pre al dar tres vuelta como sería la programación, ya que estoy en una competencia donde nos exigen eso, y ps tenía pensado poner una contador que vaya acumulando cada vez que todos los sensores se pongan en cero, es decir, cada vez que lean una linea negra horizontal que indica la meta. agradezco cualquier ayuda. muchas gracias

amigo muy buen post pero tengo una duda que tendria que cambiar del programa si en ves de los motores 10:1 tengo unos de 5:1

hola bro qtal el ciercuito de arriba esel completo o es solo una parte de el robot seguidor de linea sera que me puedes facilitar con el armado de todo el circuito porfa es que lo que pasa es que quiero entrar a un concurso de robots seguidores de linea en mi facu y me intereso bastante su proyecto es el que buscaba mis conocimientos en electronica son intermedios te mande un correo espero tu respuesta saludos atte william yucra

Excelente trabajo-- Puedes pasar los diagramas de la PCB.. eccil@hotmail.com
Gracias..

EN MI CASO MI ROBOT LO HICE CON EL USO DE PUENTE H ESTA PROGRAMACION DE PID ME SERIA UTIL O NO

BUEN TUTORIAL ...YO ESTOY ENPESANDO UNO PERO CON UN QTR-8A Y NO SE COMO QUE INTRODUCIRLE AL CODIGO PARA QUE ME SIRVA

Iluminado, he perdido un dia entero con tu código, luego vino mi compañero y puso esto :

// DECLARAMOS LAS LIBRERIAS QUE VAMOS A UTILIZAR EN EL PROGRAMA

#include
#include
#include
#include


#define NUM_SENSORS 6 // number of sensors used
#define TIMEOUT 2500 // waits for 2500 microseconds for sensor outputs to go low
// INICIAMOS LOS MODULOS QUE VAMOS A UTILIZAR
ZumoBuzzer buzzer;
ZumoMotors motors;
Pushbutton button(ZUMO_BUTTON);
QTRSensorsRC qtrrc((unsigned char[]) {19,5, 4, 11, 2,15},NUM_SENSORS, TIMEOUT, QTR_NO_EMITTER_PIN);
// ESPACIO PARA DEFINIR VARIABLES
unsigned int sensorValues[NUM_SENSORS];
int lastError = 0;
const int MAX_SPEED = 400;


// BUCLE DE INICIALIZACION, SOLO SE EJECUTA LA PRIMERA VEZ
void setup()
{

motors.flipLeftMotor(true);
motors.flipRightMotor(true);
// Play a little welcome song
buzzer.play(">g32>>c32");

// Wait for the user button to be pressed and released
button.waitForButton();

// Wait 1 second and then begin automatic sensor calibration
// by rotating in place to sweep the sensors over the line
delay(1000);
int i;
for(i = 0; i < 80; i++)
{
if ((i > 10 && i <= 30) || (i > 50 && i <= 70))
motors.setSpeeds(-200, 200);
else
motors.setSpeeds(200, -200);
qtrrc.calibrate();
delay(20);
}
motors.setSpeeds(0,0);
buzzer.play(">g32>>c32");
button.waitForButton();
buzzer.play("L16 cdegreg4");
while(buzzer.isPlaying());
}
void loop()
{
int position = qtrrc.readLine(sensorValues);
int error = position - 2500;
int speedDifference = error / 4 + 6 * (error - lastError);
lastError = error;

int m1Speed = MAX_SPEED + speedDifference;
int m2Speed = MAX_SPEED - speedDifference;
if (m1Speed < 0)
m1Speed = 0;
if (m2Speed < 0)
m2Speed = 0;
if (m1Speed > MAX_SPEED)
m1Speed = MAX_SPEED;
if (m2Speed > MAX_SPEED)
m2Speed = MAX_SPEED;

motors.setSpeeds(m1Speed, m2Speed);
}

VA AL PUTO TOQUE

sin acritud
beso

no me compila da un error llamado 302

Este comentario ha sido eliminado por el autor.

Disculpa es posible que el seguidor trabaje con una velocidad pwm a 255?

¡Funciona de muy bien! A mí me dio problema la compilación pero fue porque aún tenía la biblioteca original instalada… El robot funciona de manera excelente en las curvas, sin embargo, en las rectas me parece lento. ¿Cómo podría hacer para que acelere cuando está en una línea recta?

Hola, puedo cambiar la placa de los sensores, los qtr-8a por sensores tcrt5000 con su circuiteria basica? porqué usas una libreria para los sensores, gracias

Hermano una pregunta, ya esta todo hecho, solo se deberia soldar tal y como esta en tu diagrama ?

Este comentario ha sido eliminado por el autor.

como modifico el programa para que varíe la velocidad de los motores si solo dispongo de transistores en la salida y no puente H?

Se puede aumentar la velocidad?

Puedes decirme el nombre del software para la pcb

Hola, me gustaria saber sí hay forma de cambiar el driver por un TB6612FNG, tengo ese driver y me gustaria saber si puedo utilizarlo.

Buenas compañero, yo utilice tu código, de antemano gracias por compartirlo, solo quería saber que modificar para que detecte línea negra y el fondo sea blanco

gracias por explicar en detalle sobre pid, pero cuales son los otros archivos en el mega enlace que has dado puedo identificar el archivo proteus y el archivo pdf

QUE PASA CUANDO EL CARRO DERRAPA MUCHO?

Oye amigo yo kiero saber cómo hisiste la programación y en ves de colocar el Arduino,colocar un baby orangután

Buen dia! Alguien ya le quedo el velocista, que hizo el autor?

ma gustan las galletas de arroz





















buenas noches

Puedes actualizar el codigo de arduino a las actualizaciones que tuvieron las librerias QRT recientemente

Hola, estoy realizando un seguidor , pero no cuento con los recursos para comprar los de polulo, y pues el robot no es para participar en competencia, asì que quisiera saber si con motores de 600 rpm a tensión nominal( mucho más económicos), podría hacer un robot que no sea una tortuga, pero que por lo menos demore menos de 3 minutos en recorrer una pista de 25 m ( con curvas y todo).. gracias de antemano

como varia si en lugar de usar el driver TB6612FNG en lugar del DRV8833 puedes especificar como cambia los pines y en el codigo porfavor?

donde puedo buscar el esquematico para la placa

Buenas noches disculpen, alguien de casualidad sabe de algún software o página para poder sintonizar y graficar los parámetros del pid?

Publicar un comentario