domingo, 28 de octubre de 2018

Veleta con Potenciometros FCP22E

Hola, a día de hoy(1/1/2018) acabo de sacar del horno un nuevo programa, en esta ocasión se trata de una veleta (la mas sofisticada que he parido) los sensores con los que vamos a trabajar son dos potenciómetros un tanto especiales. El FCP22E
Los potenciómetros son resistencias variables y son muy fiables para convertirlos en sensores de posición, ya que arrojan un valor fijo para una misma posición.
Tiene dos inconvenientes: una limitación mecánica (unos 300º) y su desgaste debido al contacto físico de su patilla interna con la espiral interna (la propia resistencia).
El potenciómetro FCP22E elimina el primer inconveniente ya que permite girar 360º (no tiene limitación física) y respecto al desgaste queda por demostrar cuanto puede durar.
Por la característica de rotación continua podemos confundirlo con un encoder, pero no lo es, un encoder además de poseer una resolución bajísima (los económicos) tienen el inconveniente de ponerse a cero al dejarlo sin suministro eléctrico. Además de esto su posición debe estar controlada continuamente por un programa, si el programa se cierra, la posición del encoder se inicia a cero.
Mi veleta actual funciona con un encoder, y como ya podeís imaginar, había que mejorar el sistema.
Aunque no todo lo que reluce es oro!, los potenciómetros de giro continuo tienen una franja de unos 30º-40º (según el modelo) en los que no lee nada, y ojalá esto fuera así, cuando el FCP22E se encuentra en esa zona muerta arroja valores aleatorios que nada tienen que ver con la realidad. Si bien cabe señalar que este problema se origine en la misma Arduino. Y para comprobar esto podemos hacer una simple prueba, que trataría de cargar un programa que lea un potenciómetro conectado por ejemplo al puerto A0 y no le conectamos nada al mismo, si imprimimos por el monitor Serial veremos que imprime valores aleatorios que cambian a cada momento, lo mismo que sucede cuando el potenciómetro se encuentra en su zona muerta.

Bueno entrando en materia... para poder tener una posición sea cual sea en torno a los 360º grados con estos potenciómetros, mi solución pasa por conectar dos de ellos, el primero leerá de 0º a 180º y el segundo de 180º a 360º.
La configuración física es un tanto entretenida, yo he puesto 3 poleas a 120º una para cada potenciómetro y otra para la veleta. El sistema de poleas simplifica la configuracion ya que al girar la polea de la veleta las otras dos giran solidariamente y en el mismo sentido, si se emplearan engranajes el segundo giraría en sentido contrario al primero y el tercero en sentido contrario al segundo. Lo mas entrenido es posicionar cada potenciómetro en su lugar correcto respecto a la polea de la veleta. (los gráficos ayudan a visualizar esto) Por su parte el programa no esta exento de complicaciones, aunque al final lo he resuelto con tres sencillas condicionales IF, de manera que se ha quedado bastante escueto.
Os dejo unas imágenes del proyecto, y el programa comentado hasta los ojos.
Por cierto las poleas y correa son de maquinas 3D, son económicas y fáciles de encontrar, aunque sería mejor emplear poleas no dentadas como una correa en V por ejemplo, las poleas dentadas me han entretenido bastante a la hora de posicionar los potenciómetros ya que el sistema dentado te obliga a que todas sus poleas coincidan en posición, esto lo he resuelto liberando las poleas de los ejes de los potenciómetros, para después situar el potenciómetro el lugar correcto y entonces fijar las poleas.
Acto seguido dejo un gráfico con cuatro posiciones críticas. La figura 1 muestra la configuración inicial; El potenciómetro CERO debe estar en su posición cero ó inicial y ésta debe coincidir con la veleta apuntando al Norte, el pot UNO debe tener su posición invertida, es decir su posición cero o de inicio debe comenzar cuando el pot CERO se encuentre a 180º. La segunda figura muestra el momento en que el pot UNO entra en su zona muerta, este momento debe estar gestionado en el programa, y en concreto se encuentra en las lineas 18,19 y 20 del mismo. En la figura 3 el pot UNO entra en funcionamiento, mientras que pot CERO deja de estarlo al superar los 180º. Y en la figura 3 se muestra el momento en que el pot UNO entra en su zona muerta, solo que en este caso al estar éste desactivado no es necesaria gestión alguna.




En la siguiente imagen os dejo la conexión eléctrica. es de lo mas sencillito, la patilla izquierda de los pots van a 5v. la derecha a GND y la central a su respectivo puerto analógico. A0 y A1 según el programa. Si invertimos las patillas de positivo a negativo lo que conseguimos es una lectura inversa, es decir al girar su perilla hacia la izquierda su resistencia se incrementará. Así que podemos conectarlas según nos convenga al instalar el grupo de sensores en la veleta.









Por cierto, estos diagramas los hago con Fritzing: http://fritzing.org/home/



Aquí abajo os dejo un foto-montaje para que tengáis una referencia real de como ha quedado. en la cuarta imagen se ve un circulo negro con una chapa dorada, que es el asiento del cojinete, para que la veleta gire lo mas cómoda posible. 



y más abajo el montaje definitivo...



A continuación os adjunto la última versión del sketch, fuertemente comentada:

/*    Central A0 (señal), Izquierdo 5V (+), Derecho 0V (-)   */
void setup() {
  Serial.begin(9600); // Inicia Serial
} // cierra setup

void loop() { // el programa cuenta con una unica instruccion
  Serial.println(calculaGrados()); // Imprime el resultado de la funcion calculaGrados()
} // cierra loop

// La siguiente funcion devuelve un valor de tipo entero a quien la llame, en este caso Serial.println linea 8
int calculaGrados (){ // funcion denominada calculaGrados(), esta funcion determina que potenciometro debe emplear y devuelve su valor.
  int vp0 = analogRead(A0); // introduce en la variable "vp0" el valor de la lectura del pin A0
  int vp1 = analogRead(A1);// introduce en la variable "vp1" el valor de la lectura del pin A1
 // La lectura del potenciometro nos arroja valores comprendidos entre 0 y 1023
 // y a nosotros nos interesan convertirlos de 0 a 360  
  vp0 = map(vp0, 0, 578, 1, 180); // pot CERO arroja el valor 578 en la mitad de su recorrido 
  vp1 = map(vp1, 453, 1000, 180, 360); // pot UNO, tiene su posicion invertida respecto a pot CERO
  // Es necesario leer los valores que arrojan nuestros potenciometros, y colocarlos y en la posicion idonea
  // para indicarle a la funcion Map los limites.    
  if (vp0 >= 1 && vp0 <= 180) { // si los valores leidos del pot CERO se encuentran entre
    return vp0; // el rango 1 y 180, se imprimiran los valores de pot CERO
  }  else {return vp1;} // en caso contrario, nos interesa imprimir los valores de pot UNO 
} // Cierra funcion 
He de confesar que tras unos días de trabajar con él he detectado que se cometían algunos errores en la lectura de los potenciómetros...posiblemente el Sketch está poco currado. Los errores se dan en dos pequeñas franjas justo antes de entrar en las zonas críticas correspondientes de cada potenciómetro. En cualquier caso este proyecto no es el mas indicado para una veleta, como he comentado con anterioridad. La Veleta definitiva a día de hoy esta funcionando con dos sensores de efecto Hall, pero esto es otra historia, que publicaré mas adelante.


No hay comentarios:

Publicar un comentario

Gracias por tu comentario, en breve lo revisaremos.