sábado, 31 de diciembre de 2016

Encoders calculos mátematicos

Seguidor de línea

Parte 2

En la primera parte, se conceptualizo acerca de los encoders, en esta segunda parte, se dará a conocer los calculos matemáticos, necesarios para el uso adecuado de los encoders, cabe resaltar, que el principal objetivo es la de memorizar la pista, para llevar esto acabo se aplican formulas trignometricas y operaciones de básicas, dichas formulas fueron calculadas y despejadas previamente, por ende, este documento no explica como obtener cada ecuación final, Sin embargo, si desea profundizar más y saber acerca del despeje matematico al final de la pagina habrá un link de un pdf en el cual esta toda la información que tomé como referencia.


Arco de circunferencia:
Se define como parte de una curva o una parte del borde del circulo(Ver Figura 1).
image
Figura 1. Definición de Arco
Sector Circular:
Se denomina sector circular a la porción del plano delimitada por un arco de circunferencia y dos de sus radios. [1] (Ver Figura 2)
https://upload.wikimedia.org/wikipedia/commons/thumb/d/da/Circle_arc.svg/220px-Circle_arc.svg.png
Figura 2.Sector Circular
A continuación, se da un ejemplo:
Figura 3.Formación de arcos en una curva
Como se observa en la Figura 3, en una curva de la pista está el ejemplo claro de la formación del sector circular, y en realidad se definen varios arcos debido a que el robot lo que hará es calcular su posición cada cierto tiempo.


Cálculos matemáticos:

Objetivos:
  1. Radio de la sección de pista (r2)
  2. Cambio en el ángulo de rumbo (theta)
  3. Longitud de la pista y velocidad promedio
  4. Desplazamiento horizontal y vertical (X,Y)


Suposiciones:


Recorrido a lo largo de una trayectoria uniforme en forma de arco
- Sin deslizamiento de ruedas (Derrape)
- Condición de giro a la izquierda (L<R)
- Distancia constante entre las ruedas


Las fórmulas que se utilizaran fueron despejadas tendrán en cuenta la gráfica de la Figura 4; Observar muy bien la gráfica y comparar las variables con su respectiva función que se encuentran en la Tabla 1.
Tabla 1. Variables
Figura 4.Formación de arcos
Variable
Función
L
# de pulsos del encoder izquierdo
R
# de pulsos del encoder derecho
A
Distancia entre las ruedas
C
Longitud de la pista o tramo.
𝜃
Angulo de Curvatura
O
Origen del arco
r1, r3
Radios de los arcos de la rueda
r2
Radio de la sección de pista



  1. Radio de el centro de la línea
El radio de la línea central es el promedio de los valores o número de pulsos del encoder izquierdo y derecho multiplicados por la relación entre la distancia entre ruedas y el valor absoluto de la diferencia de lecturas de los encoders.
if (L ≠ R){

}
Esta fórmula posee la condición L ≠ R, si dicha condición no se cumple el resultado sería un radio infinito, que en otras palabras quiere decir que el robot está posicionado en línea recta.

  1. Angulo de curvatura
A continuación, se calcula el ángulo de curvatura dicho resultado esta expresado en radianes.

  1. Longitud de la pista y velocidad promedio
Para calcular la longitud de la pista ( C ), se tienen las siguientes formulas.
Sin embargo, hay que tener en cuenta que los valores de R y L se está reiniciando constantemente cada cierto tiempo; por lo tanto, la longitud de pista se crea una segunda variable, que es igual a la sumatoria de los valores de C y donde X representa el número de muestras obtenidas.
Además, teniendo la longitud de pista podemos calcular la velocidad promedio, que nos servirá para saber si en realidad el robot está realizando el mapeo de la pista.
Hay que tener en cuenta que para poder calcular la distancia se tiene en cuenta la resolución de los encoders, el cual es de 12 pulsos por vuelta y también saber el tamaño de las ruedas (M); a continuación, se da un ejemplo con un valor para de M = 3 cm

Y por último como se puede observar se tiene la variable t, dicha variable es el tiempo(s) que tardo en completar las X muestras obtenidas. Por lo tanto, se puede calcular la velocidad en cualquier tramo de la pista o hasta que el robot termine la pista.

  1. Desplazamiento horizontal y vertical


Hasta el momento no se había utilizado funciones trigonométricas, y son algo pesadas para un microcontrolador RISC de 8 bits, pero en la siguiente parte, enseñare como reducir la computación de las funciones seno y coseno, si desea implementar en un seguidor con ATmega328P.

Ejemplo de Mapeo:

La idea consiste en poder obtener los siguientes resultados, cada color podría asignarse un perfil de velocidad al robot. Aunque hay que tener en cuenta otros factores como la frecuencia de muestreo y el derrape.
Mapeo por colores
Para culminar, se puede indagar acerca del tema y como se despejan las respectivas formulas, también cabe resaltar que es dichas ecuaciones son utilizadas en robots micromouse, y algunos incorporan un módulo IMU para mejorar la precisión del mapeo, en fin, es cuestión de investigar y probar.


En la siguiente y última parte se proporciona la librería optimizada realizada en C++ para una posible implementación en un seguidor de línea.

"El conocimiento no es nada si no se comparte"

Bibliografía



[1]
https://es.wikipedia.org/wiki/Sector_circular.

viernes, 30 de diciembre de 2016

Encoders Seguidor de Línea
Parte 1


El uso de encoders en un robot seguidor de línea sirve para grabar la pista y así poder acelerar más del 50% de la velocidad del robot en líneas rectas. Asimismo, detectar y grabar la pista; En esta sección se pretende explicar y conceptualizar en el funcionamiento del encoder de cuadratura y en la parte 2 se daran a conocer los cálculos matemáticos necesarios para su posterior programación.  
En los seguidores de línea se suele usar motoreductores de Pololu, pues bien, dicha empresa también vende los encoder’s ya sean de tipo magnético o óptico, se recomienda el magnético ya que no le afecta la luz ambiente como el óptico. Bueno, para no extender mucho esto, se puede definir un encoder como un dispositivo o sensor que genera señales en respuesta al movimiento, y existen básicamente 2 tipos:  incremental y absoluto. Y su vez, cada tipo puede ser rotativo o lineal.
Para el caso de los encoders absolutos (encoders pololu), la salida posee información acerca de la velocidad angular, la dirección, y la posición.
A B
https://a.pololu-files.com/picture/0J5832.600x480.jpg?1a7afd1aeb0cd22d610efcf66847279c  https://a.pololu-files.com/picture/0J4767.600x480.jpg?4b1b4a352a5b65138785021302b907b2
Figura 1. A. Encoder de cuadratura magnético y B. Óptico – Pololu
Los encoder’s magnéticos trabajan desde 2.7 a 18V, ya que es el voltaje de alimentación de los sensores de efecto Hall. Además, tiene dos salidas (A y B), una para cada sensor de efecto Hall. Los sensores están separados 90 grados. Esto significa que las salidas de onda cuadrada de los sensores son de 90 grados fuera de fase. Esto se llama una salida en cuadratura. Por consiguiente, dichas salidas sirven para determinar el sentido de giro (Horario o anti-Horario). La imagen siguiente (tomado de la página web de Pololu) muestra la salida típica de un encoder.


https://a.pololu-files.com/picture/0J5831.600x480.jpg?b37c879d2899289012b77d9281c4dc51
Figura 2. Salida de encoder’s de cuadratura.


Cabe destacar que los encoder’s tiene una resolución de 12 pulsos por vuelta y trabajaran a una frecuencia de 1 a 2KHz dependiendo de la velocidad de que girara el motor (1000 RPM a 3000 RPM), pues bien, esto quiere decir que el microcontrolador no podrá estar leyendo el estado de la salida A y B en el bucle infinito, si no que se hará uso de interrupciones, que se ejecutaran cada 1 o 2 milisegundos. A continuación, se añade un código de prueba que utiliza las interrupciones INT0 y INT1 de Arduino UNO y luego imprime cada 500 ms el valor o el número de pulsos de dos encoder’s conectados al Arduino.

Código de prueba de encoders:



/*
* Encoder example sketch
*
* Modificado por Michael Vargas @ BeatBlog
* Creditos:
* by Andrew Kramer
*
* Records encoder ticks for each wheel
* and prints the number of ticks for
* each encoder every 500ms
*
*  1/1/2017
*/
//Pines de conexion de los encoders
#define RH_ENCODER_A 3 //INT1
#define RH_ENCODER_B 5
#define LH_ENCODER_A 2 //INT0
#define LH_ENCODER_B 4
#define RESOLUTION  12 //Numero de pulsos por Vuelta


// Variabes que almacenan el numero de pulsos
volatile unsigned long leftCount = 0;
volatile unsigned long rightCount = 0;
void setup() {
 pinMode(LH_ENCODER_A, INPUT);
 pinMode(LH_ENCODER_B, INPUT);
 pinMode(RH_ENCODER_A, INPUT);
 pinMode(RH_ENCODER_B, INPUT);
 
 // initialize hardware interrupts
 attachInterrupt(0, leftEncoderEvent, CHANGE);
 attachInterrupt(1, rightEncoderEvent, CHANGE);
 
 Serial.begin(9600);
}
void loop() {
 Serial.print("Right Count: ");
 Serial.println(rightCount);
 Serial.print("Left Count: ");
 Serial.println(leftCount);
 Serial.println();
 Serial.print("#Rev Right ");
 Serial.println(rightCount/RESOLUTION);
 Serial.print("#Rev Left");
 Serial.println(leftCount/RESOLUTION);
 Serial.println();
 delay(500);
}
// encoder event for the interrupt call
void leftEncoderEvent() {
 if (digitalRead(LH_ENCODER_A) == HIGH) {
   if (digitalRead(LH_ENCODER_B) == LOW) {
     leftCount++;
   } else {
     leftCount--;
   }
 } else {
   if (digitalRead(LH_ENCODER_B) == LOW) {
     leftCount--;
   } else {
     leftCount++;
   }
 }
}
// encoder event for the interrupt call
void rightEncoderEvent() {
 if (digitalRead(RH_ENCODER_A) == HIGH) {
   if (digitalRead(RH_ENCODER_B) == LOW) {
     rightCount++;
   } else {
     rightCount--;
   }
 } else {
   if (digitalRead(RH_ENCODER_B) == LOW) {
     rightCount--;
   } else {
     rightCount++;
   }
 }
}

Descargar Código Actualizado:
EncodersPololu.ino


Continuar 2da Parte...

Encoders calculos mátematicos


"El conocimiento no es nada si no se comparte "