domingo, 15 de marzo de 2015

Trabajando con servos (II). Termómetro analógico

Hola de nuevo.

Ya vimos el día anterior como mover un servo en función del valor leído en una resistencia. En otra entrada anterior, también vimos como usar un sensor de temperatura.

Bien, pues hoy vamos a montar un termómetro analógico juntando estos dos proyectos.

Antes de nada , para nuestro sketch necesitaremos definir las dos temperaturas extremas que querremos mostrar, nuestro máximo y mínimo. Aquí no os puedo ayudar, no es lo mismo Burgos que Sevilla. Yo he usado un rango que va de -15ºC a +45ºC, aunque reconozco que nunca he visto nada parecido por estos lares.

El circuito a implementar es muy sencillo. Vamos a utilizar un sensor de temperatura TMP-36, y un servomotor, además de nuestra placa de Arduino compatible.

Los conectaremos siguiendo el siguiente esquema:


Un ejemplo de como quedaría en placa:


El sistema que he utilizado para mostrar la temperatura, es un tanto, sencillo, pero nos servirá para la ocasión. Aún es más sencillo como he fijado el servo a la escala de temperaturas, pero este ejemplo tiene solo fines demostrativos.


Y la fijación:



De acuerdo, después de haber demostrado que las artes plásticas no son lo mío, vamos a explicar el sketch que hará que por lo menos el funcionamiento sea correcto.

Antes de nada, deberíamos conocer cuales son los parámetros de tiempo que llevan nuestro servo a su posición de 0º y de 180º. Una ojeada a esta entrada debería ser suficiente para aclarar las ideas.

De todas maneras podeis cargar este programa e ir sustituyendo los valores, valormin y valormax, hasta encontrar los que se ajusten. Recordad cargar el programa, y anotar los valores correctos.


// Programa para encontrar los valores en ms limites de un servo

#include <Servo.h> // instruccion para incluir la libreria en el sketch
 
Servo myservo;  // creamos el objeto servo, para luego controlarlo
 
int valormin=450;  //valor minimo en ms para conseguir los 0º
int valormax=2100; // valor maximo en ms para llegar a los 180º
int grados;
void setup() 
{ 
  myservo.attach(9,valormin,valormax);  // Pin conectado al servo 
} 
 
void loop() 
{ 
  grados=0; //lo llevamos a minimo y observamos si ratea
  myservo.write(grados);       // esta instrucción envía al servo a la 
                               //posición indicada en grados. 
  delay (200);
  grados=180; // lo llevamos al otro extremo y observamos si ratea  
  delay (200);                             
  
  // variar los valores minimos y maximos hasta encontrar los que 
  // se ajusten. Recordad cargar el programa despues de cada cambio
}


Una vez encontremos estos dos valores, podemos proceder a programar nuestro sketch , que quedaría de la siguiente manera:



/* Lectura de temperatura
Con un TMP-36, y repreentacion analogica a traves de un
servo y arduino
 */

#include <Servo.h> 

// Declaración de constantes
Servo myservo; 
const int sensorPin = A0; // Pin conectado al TMP36
float voltaje; //variable para calcular la tensión 
float temperatura; //variable para almacenar la temperatura;
int temperaturamin=-15; // Temperatura mínima de nuestro termometro
int temperaturamax=45; // Temperatura máxima de nuestro termometro

void setup()
{
  // Empezamos la comunicación con el puerto serie
  // para mostrar los valores en el serial monitor
  Serial.begin(9600); 
  myservo.attach(9,465,2200);//,540,2100);  //pin conectado a nuestro servo 

}


void loop(){
  // Leemos el valor de tensión en el pin
  // donde está conectado el sensor TMP36
  int sensorVal = analogRead(sensorPin);

  // Convertimos el valor de la lectura digital
  // en voltaje
  float voltaje = (sensorVal/1024.0) * 5.0;

  // Mostramos el valor del voltaje en pantalla
  Serial.print(", Volts: ");
  Serial.print(voltaje);
  
  // Convertimos el valor de tensión en temperatura
  // en grados Celsius. Para ello usamos la formula
  // explicada en http://arduinopractico.blospot.com.es
  // restando al voltaje el offset de 0.5V que tiene el sensor
  // e incrementando la temperatura en 1ºC por cada 10 mV
  // T = (V-0.5)*100 , siendo V el voltaje leido
  
  Serial.print(", Temperatura en C: "); 
  float temperatura = (voltaje - .5) * 100;
  Serial.println(temperatura);
  
  // Ahora preparamos el dato para mostrar con nuestro
  //servo de forma analogica primero restringiendo el valor
  // de temperatura a los definidos 
  constrain(temperatura,temperaturamin,temperaturamax);
  //Luego mapeamos los valores para mostralos proporcionalmente
  //en el arco recorrido de 180ºC
  
  temperatura=map(temperatura,temperaturamin,temperaturamax,0,180);
  
  //Ttrasladamos el valor al servo en forma de grados
  
  myservo.write(temperatura);
  
  
   delay(1000);
}


El ejemplo es muy parecido a las entradas anteriores, con las siguientes particularidades.

 myservo.attach(9,465,2200);

En esta línea, le decimos al Arduino cuales son los calores correctos que definen los limites de funcionamiento de nuestro servo.

 constrain(temperatura,temperaturamin,temperaturamax);

La temperatura ya aprendimos como calcularla. Pero en esta línea lo que hacemos con las instrucción constriain, es despreciar cualquier valor por encima o por debajo de los definidos en el inicio.

 temperatura=map(temperatura,temperaturamin,temperaturamax,0,180);

Y con esta instrucción hacemos la salida proporcional para que la representación en nuestro termómetro "ardulógico" tenga cierta precisión.



De acuerdo, que el ejemplo es muy sencillo pero muestra la manera de hacer proporcional el movimiento de un servo entre dos valores conocidos y definidos. En la próxima entrada, veremos como "hackear" un servo para que gire 360º.

Nos vemos

1 comentario:

  1. Interesante el proyecto que has creado, Yo hasta ahora no he utilizado arduino porque no sé cómo usarlo, sin embargo, con el programa que has escrito seguramente podré aventurarme con este artefacto; en verdad, muchas gracias, un artículo tan claro sí que anima. Deseo que tengas un excelente día.

    ResponderEliminar