Académique Documents
Professionnel Documents
Culture Documents
El mdulo Ethernet lo emplearemos en una etapa posterior, cuando las lecturas de medidas se hayan resuelto por completo. Respecto a las sondas de temperatura y humedad, tenemos el circuto 808H5V5 para la sonda de humedad, y los circuitos MCP9700A y LM35 para las sondas de temperatura. Se van a realizar pruebas con ambos circuitos, para evaluar cual es el ms adecuado para nuestro proyecto. Adems, se buscar la forma de mejorar la precisin de las lecturas. A continuacin vamos a explicar todos estos puntos, junto al diseo inicial de la conexin en la placa de prototipos. Licenciado bajo Creative Commons CC-BY 3.0.
ms adelante, en la parte del cdigo). El clculo concreto se puede obtener en la hoja de caractersticas del dispositivo. El segundo sensor de temperatura, el LM35 de la casa National, tiene un rango entre -55C a 150C, con un error tpico de 0.75C. La alimentacin oscila entre los 4 y los 30 voltios, y entrega 10mV por C, con valores de 0mV (0C) hasta 1500mV (150C). Notar que decimos que mide desde -50C, y sin embargo entrega 0mV a 0C. Esto se debe a que se trata de un sensor de grados centgrados que, sin aadirle ningn componente, entrega valores de mV directamente proporcionales a la temperatura positiva en grados centgrados, por ejemplo 170mV para una temperatura de 17, y 1V para una temperatura de 100C. Esto facilita enormemente la utilizacin en aquellos entornos que no necesitan de lecturas de temperatura negativas (como es nuestro caso). En caso de necesitar valores negativos, es necesario aadir a la salida una resitencia conectada a la tensin de alimentacin en negativo, pero esta aplicacin queda fuera de nuestro proyecto actual. Respecto a la sonda de humedad, modelo 808H5V5 de Sencera, mide entre el 0% y el 100% de humedad relativa, teniendo la mayor precisin entre el 30% y el 80% (medida a 25C de temperatura). El error tpico en la medida es del +-4% durante el primer ao de uso, a partir del cual pierde en torno a 1% adicional por cada ao. La sonda puede operar entre -40C y 85C, y tiene un tiempo de respuesta de 15s como mximo. La alimentacin es exclusivamente a 5V, y los valores de salida son 0,8V para un 0% de humedad relativa, y 3,9V para un 100%.
Para implementarlo, usaremos una resistencia fija para R2, de un valor comercial comn (1k), y para R1 usaremos un potencimetro que nos permita un ajuste preciso. Con los valores que tenemos para los voltajes de entrada y salida, y el valor indicador para R2, el valor de R1 que debemos ajustar con el potencimetro es de 2571,43, por lo tanto usaremos un potencimetro de 4,7k, valor comercial facilmente disponible. Dado que las resistencias comerciales tiene una cierta tolerancia, el valor final real en el potencimetro variar un poco respecto a este clculo. Para el ajuste preciso, alimentaremos el divisor con 5V, y ajustaremos el potencimetro hasta obtener 1,4V exactos. Con esta modificacin, ya podemos emplear los tres sensores de forma simultnea con la referencia de 1,1V.
Si por el contrario vamos a utilizar la referencia de 1,1V, con el divisor de tensin, la conexin ser la que mostramos a continuacin. De nuevo los condensadores son de 1f, la resistencia es de 1k y el potencimetro de 4,7k. Recordar que el potencimetro debe estar correctamente ajustado para permitir una lectura precisa (si lo alimentamos con 5V debemos obtener 1,4V de salida).
La conexin de la patilla central del sensor de humedad va a una de las patillas del potencimetro (aqu se ha representado con el pequeo cable amarillo). Recordar que a pesar de emplear otra referencia, los circuitos se siguen alimentando a 5V.
Siguiendo con el proyecto, vamos a ver el cdigo necesario para leer los datos de los sensores, y mostrarlos por la salida serie.
En esta primera versin no empleamos el mdulo Ethernet, y nos centraremos en realizar las lecturas de las entradas analgicas. Tal y como se vi en el anterior post, podemos utilizar dos referencias para los voltajes de entrada (5V y 1,1V), el cdigo de ambas versiones es prcticamente idntico a excepcin del ajuste de la seal de referenvia (5V 1,1V) y el consiguiente clculo para convertir la seal leda en la entrada al valor en mV. Comenzamos por la versin ms sencilla, la de 5V, y despus indicaremos las modificaciones necesarias para la versin a 1,1V. Veremos las ecucaciones que necesitamos para convertir los datos recibidos de las entradas analgicas en valores de temperatura y humedad relativa, ecuaciones que obtenemos de las hojas de caractersticas de los dispositivos. Dado que disponemos de dos tipos distintos de sensores de temperatura, necesitaremos dos ecuaciones diferentes en funcin del dispositivo utilizado. Licenciado bajo Creative Commons CC-BY 3.0.
la ecuacin:
Para la versin a 1,1V, usamos una ecuacion parecida, teniendo en cuenta la nueva referencia:
Sensores de temperatura
En el caso de las sondas de temperatura MCP9700A, vemos que la seal que entregan a 0C es de 500mV, as pues al valor recibido en mV desde la entrada analgica le restaremos esta cantidad. Adems, el valor que se obtiene habr que dividrlo por 10, dado que cada grado de temperatura supone un incremento de 10mV en la seal de salida. Por lo tanto, la ecuacin es:
En el caso de los sensores LM35, ya estn calibrados para grados centgrados. Por lo tanto, la salida en mV es directamente proporcional a la temperatura, y slo deberemos dividir el valor por 10 (cada grado supone un incremento de 10mV en la salida):
Estas ecuaciones son las mismas tanto para la seal de referencia de 5V como para la seal de 1,1V.
Sensor de humedad
En el caso del sesor de humedad 808H5V5, la ecuacin sufrir modificaciones en funcin de la seal de referencia, dado que en uno de los casos utilizamos un divisor de tensin. En la versin a 5V, comprobando las hojas de caractersticas vemos que el sensor entrega 0,8V para un 0% de HR y 3,9V para el 100%. Por lo tanto, a la seal medida en mV le restamos 800mV, y para obtener el dato en porcentaje, dividimos el resultado entre 31 (3900 - 800=3100):
Si empleamos la referencia de 1,1V, deberemos hacer los clculos para adaptar estos valores. Con el divisor de tensin empleado, las seales de salida normales, 0,8V a 3,9V, se convierten en 0,224V a 1,092V. Esto supone que al valor medido en mV deberemos restarle 224mV, y para convertir el resultado a porcentaje, dividimos por 8,68 (1092-224=868):
Cdigo Arduino
Para descargar los ficheros con los programas, ve al final del post.
Ejecucin y resultados
Mediante el entorno de desarrollo de Arduino, se ha compilado el cdigo y se ha subido a la placa, donde comienza a ejecutarse inmediatamente. Si nos conectamos al monitor serie incluido en el entorno, obtenemos las lecturas de los sensores. Tal y como se comenta en el cdigo, esta primera versin tiene algunos problemas que se observan en el resultado: Baja estabilidad de las medidas: las lecturas de las tensiones en las entradas analgicas varan mucho entre cada ejecucin (esto es especialmente notable en las lecturas del sensor de humedad). Diferencia de temperatura entre los dos sensores: cada sensor entrega una temperatura diferente, debido al error interno que presenta cada componente. Resultados sin calibrar: los valores mostrados difieren del valor real de temperatura y humedad en la habitacin, dado que no se han calibrado los componentes. En la versin a 5V, debido a la prdida de precisin, los saltos entre diferentes medidas son bastante grandes. El primero de estos problemas se puede solucionar de forma sencilla en las siguientes versiones del cdigo. Los dos problemas referidos a la calibracin de los sensores se dejan para una etapa posterior, con el montaje final ya realizado en la placa definitva, dado que es posible que el montaje actual (en una placa de prototipado) introduzca ruido en las seales que afecte a las medidas. Con respecto al problema de precisin, se soluciona empleando la referencia de 1,1V. Un ejemplo de la salida del programa (en concreto, de la versin a 1,1V usando sensores LM35) es el siguiente:
Programa inicial, referencia 1,1V Se puede observar la elevada variabilidad del sensor de humedad, y la precisin en las medidas: la variacin mnima que pueden detectar los sensores de temperatura est en torno a los 0,11C, mientras que el salto mnimo en la versin de 5V est en torno a los 0,51C (como vemos, directamente relacionado con la seal de referencia escogida).
1: La cremallera analgica
La cremallera analgica es diferente a la cremallera digital del captulo anterior. La cremallera digital slo poda estar HIGH o LOW (5V o 0V). sin embargo, la cremallera analgica, puede darte un rango de valores entre 0V y 5V. Para hacer una cremallera analgica necesitas una cremallera normal, algo de hilo conductor y una resistencia de 10k. Comience cosiendo la resistencia en su lugar. Despus cose un cable rojo en uno de los terminales de la resistencia, y un cable azul en el otro terminal. Los colores de los cables son para que recuerdes dnde va cada cable. Desde donde empieza el cable azul, cselo entre cada diente de la cremallera. Cuando llegues al final de un lado de la cremallera, haz lo mismo en el otro lado y baja de nuevo. Asegurate de que el hilo est intacto a lo largo de la cremallera o no funcionar. Una vez hayas llegado al final de la cremallera por el otro lado, une un cable negro y coselo en su lugar. Ahora la cremallera est lista y podemos empezar a escribir nuestro cdigo para leer qu valores nos proporciona la cremallera. Para poder mostrar qu valores nos da la cremallera, necesitamos usar la comunicacin serie, de modo que Arduino pueda conectarse al equipo y mostrarnos los datos en el monitor: int analogPin = 2; /* Aqu declaramos que queremos usar el pin analgico 2, y lo llamaremos analogPin */ int myZipper=0; /* Aqu declaramos un entero que actuar como variable temporal, donde podremos almacenar los valores que nos proporcione la cremallera */ void setup(){ Serial.begin(9600); /* Esto configurar tu comunicacin y la fijar a 9600 baudios (9600 bits por segundo) */ } void loop(){ myZipper = analogRead(analogPin); /* Aqu hacemos una lectura analgica de analogPin y guardamos el valor en la variable myZipper */ Serial.println(myZipper); /* Este comando enviar el valor almacenado en myZipper a travs del puerto serie y despus hace una pausa de 200 milisegundos */ delay(200); //pausa de 200 milisegundos } [Get Code] Lo primero que hacemos en void loop() es una lectura analgica del pin analgico 2. El valor es almacenado en la variable myZipper. Despus imprimimos este valor por el puerto serie y, cualquier aparato conectado a Arduino (por ejemplo, un PC) recibir el valor almacenado en la variable. Lo ultimo que hacemos es aadir una pausa en nuestro programa, ya que, aunque Arduino es pequeo, todava se comunica ms rapidamente que un ordenador normal, as que la pausa permite sincronizarse con Arduino. Ahora podemos subir nuestro cdigo a la placa Arduino. Una vez que el cdigo est subido, conecta el cable rojo en el puerto que indica 5V, el cable negro a uno de los puertos de GND, y el ltimo cable al pin analgico 2. Si declaras tu analogPin en tu programa como cualquiero otro pin que no sea el 2, tendrs que colocar el cable azul en ese pin analgico: Una vez que hayas subido el cdigo y conectado los cables, abre el monitor serie, que es el botn ms a la derecha de tu IDE de Arduino. Ahora aparecern los valores en el monitor y, si abres y
cierras la cremallera, los valores irn cambiando. Si no puedes ver ningn nmero en tu monitor, asegurate que la velocidad de comunicacin fijada en el IDE de Arduino es la misma que en tu programa (9600 en el ejemplo). Cada cremallera te dar unos valores diferentes, puesto que no es algo exacto; pequeas diferencias afectarn en los resultados. Este tipo de sensor analgico casero es lo suficientemente bueno como para ser usado en la mayora de prototipos que necesiten un dispositivo de entrada oculto.
int analogPin = 2; /* el pin analgico que usaremos en Arduino */ int myLDR = 0; /* variable temporal para almacenar el valor de la LDR */ int myDarkNumber = 100; /* el umbral de oscuridad, sustituir por el valor obtenido tapando la LDR con la mano */ int ledPin = 13; void setup(){ Serial.begin(9600); /* configurando la conexin y la velocidad */ pinMode(ledPin,OUTPUT); /* declaramos ledPin como Salida */ } void loop(){ myLDR = analogRead(analogPin); /* leemos el valor de la LDR y lo almacenamos */ if (myLDR <= myDarkNumber){ digitalWrite(ledPin,HIGH); }else{ digitalWrite(ledPin,LOW); } } [Get Code] En este ejemplo la variable "myDarkNumber" es el valor que obtuviste al tapar la LDR con la mano en el ejemplo anterior. En mi caso es 100, pero t debes cambiarlo por tu valor. Este programa leer el valor de la LDR y lo comparar con la variable del umbral (myDarkNumber) y si la LDR es menor o igual al umbral el LED interno de la placa Arduino se ecender, de no ser as permanecer apagado. 3: Usando un sensor de temperatura NTC El cdigo siguiente, para leer un termmetro, es el mismo que para la LDR. Ambos funcionan bien por tratarse de sensores analgicos: int analogPin = 2; /* el pin analgico que usaremos en Arduino */ int myNTC= 0; /* variable temporal para guardar los valores del termmetro */ void setup(){ Serial.begin(9600); /* configurando la comunicacin y la velocidad */ } void loop(){ myNTC = analogRead(analogPin); /* lee el valor del NTC y lo almacena */ Serial.print(myNTC); /* muestra el valor almacenado en myNTC */ delay(200); } [Get Code]
Ahora conecta todo como muestra la siguiente ilustracin y carga el cdigo en tu placa Arduino. Una vez que todo est en su lugar, abre tu monitor serie e intenta calentar tu termmetro con las manos. Debes poder observar variaciones frente al valor original, cuando comenz el programa. Aunque los termistores no sean los mejores sensores para obtener la temperatura exacta, son una manera fcil y barata de diferenciar entre fro y caliente. Si ests usando altas corrientes en tus prendas, o materiales que se calienten como "muscle wires", los termistores son una manera de comprobar si tu prenda est demasiado caliente (antes de que empiece a arder).
analogReference (type)
Descripcin Configura el voltaje de referencia utilizado para la entrada analgica (es decir, el valor utilizado como tope de gama de entrada). Las opciones son: DEFAULT (Por defecto): la referencia por defecto analgica de 5 voltios (5 V en la placa Arduino) o 3,3 voltios (3,3 en la placa Arduino). INTERNOS: un built-in de referencia, igual a 1,1 voltios en el ATmega168 o ATmega328 y 2.56 voltios en el ATmega8 (no disponible en la placa Arduino Mega). INTERNAL1V1: una referencia integrada 1.1V (Mega Arduino solamente). INTERNAL2V56: un built-in de referencia 2.56V (Mega Arduino solamente). EXTERNO: el voltaje aplicado al pin AREF (0 a 5 V slo) se utiliza como referencia. Parmetros Tipo (type): el tipo de referencia (por defecto, INTERNA, INTERNAL1V1, INTERNAL2V56, o externo). Devoluciones Ninguno. nota Despus de cambiar la referencia analgica, las primeras lecturas de algunos analogRead () puede no ser exacta. advertencia No use nada menos que 0 V o ms de 5 V para el voltaje de referencia externo en el pin AREF! Si est utilizando una referencia externa en el pin AREF, debe establecer la referencia analgica a EXTERNAL antes de llamar a analogRead (). De lo contrario, se corta la tensin de referencia, junto activa (generados internamente) y el pin AREF, la posibilidad de daar el microcontrolador en la placa Arduino. Como alternativa, puede conectar la tensin de referencia externa al pin AREF travs de una resistencia de 5 km, lo que le permite cambiar entre las tensiones de referencia externos e internos. Tenga en cuenta que la resistencia va a alterar el voltaje que se usa como referencia porque hay una resistencia interna de 32K en el pin AREF. El segundo acto como un divisor de tensin, por lo que, por ejemplo, 2,5 V aplicada a travs de la resistencia dar 2,5 * 32 / (32 + 5) = ~ 2.2V en el pin AREF.