sábado, 7 de enero de 2017

Uso de Controlador de Velocidad Electrónico
(ESC)


Mediante este post se da a conocer el ESC (Electronic Speed Controller) se trata de un controlador de velocidad para motores BLDC, dichos motores poseen unas características especiales, como:
  • Puede Alcanzar altas velocidades (Según su factor Kv)
  • Posee 3 fases
  • Para poder accionar un motor BLDC se requiere de un control, ya sea trapezoidal o SVPWM.
Resultado de imagen para motor BLDC
Figura 1. Control de motor BLDC
Debido a que su control no es muy sencillo de implementar, tal cual como se observa en la Figura 1; y requiere q sea bastante eficiente, ya que requiere de algún tipo de retroalimentación de la velocidad del motor ya sea mediante la EMF generado por las bobinas o haciendo uso de encoders. Además, el costo de un ESC es bastante accesible para todo lo que puede realizar.
Se puede decir que la gran mayoría de ESC poseen el protocolo que se utiliza en un motor servo, el cual es una señal PWM de 50 Hz, que lo único que varía es el duty, el cual puede oscilar entre 1ms y 2ms.
Resultado de imagen para control servo
Figura 2. Control Servo (50 Hz)
En este tutorial se desea hacer enfasis en el uso de la turbina EDF27 de HobbyKing, el cual posee un motor BLDC y el cual posee un factor Kv de 11000Kv, lo que quiere decir que alcanza 11000 RPM por voltio aplicado, esto quiere decir que si alimentamos esta turbina con una bateria de 2 celdas tendriamos una velocidad maxima de 8.4V*110000Kv = 92400RPM, además se recomienda usar un ESC que soporte de 6 – 10A o más.
Las conexiones a realizar son sencillas, com ose observa en Figura 3. Recordar que las bobinas del motor no poseen polaridad, solo que si deseamos cambiar el sentido de giro, podemos intercalar o cambiar dos fases y asi girará en sentido contrario.
Resultado de imagen para ESC
Figura 3. Conexión ESC
A continuación, se da un código de ejemplo, con la turbina EDF27, el cual desarrolle la librería ESC Library para el uso de UN solo ESC, y así optimizar memoria y poderlo implementar de la mejor forma, dicho código es compatible con Arduino UNO, Nano, Leonardo y con la Baby Orangutan de Pololu. Les dejaré el enlace de la librería al final.


http://www.kamami.pl/dl/edf2710000kv-2.jpg
Figura 4. Turbina EDF27, implementada en seguidores de línea


Código Arduino:
/*
* Libreria desarrollada por Michael Vargas
* Ejemplo sencillo para el control de turbina 11000Kv EDF27
* ESC_Test.ino
*
* 07/01/2017
*/
#include <ESC.h>


#define PIN_ESC 10


ESC EDF27(PIN_ESC);
                              //Min - Max
//Change Speed in microseconds: 1000 - 2000


void setup() {
 EDF27.init();//Inicializa el timer1
 delay(150); //Pequeño tiempo de espera
}


void loop() {
 EDF27.setSpeed(2000);//Enciende el motor al máximo
 delay(2000);
 EDF27.setSpeed(1500);//Apaga el motor
 delay(2000);
}

Descargar Librería: ESC_Library-master.zip

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 "