Abordamos en esta entrada la realización del Reto 3 del Mooc Cultura Maker. Para llevarlo a cabo vamos a trabajar con otro de los elementos asociados a todo buen Maker: un kit de Arduino.
La idea que he querido llevar a cabo es la de construir un sensor de temperatura, utilizando para ello un sensor LM35 (en el kit real, ya que en el simulador uso un TMP36), un display LCD 16×2, un potenciometro y, como no, la placa controladora Arduino compatible (del fabricante GEEKCREIT).
Inicialmente, he trabajado el desarrollo en el simulador que ofrece la aplicación web de AutoDesk y que también usamos para la gestión de los objetos 3d a imprimir en el reto anterior: Tinkercad. AutoDesk ha decidido migrar parte de su antiguo simulador 123d.circuits.io a su aplicación de diseño Tinkercad. En concreto, se ha migrado la parte de Arduino y compatibles.
El diseño en el simulador es el siguiente:
Este diseño, además de la simple medición de temperatura a través del sensor TMP36, incorpora una modificación: dispone de un interruptor que permite cambiar la escala de medición, pasando de grados Celsius a Farenheit y viceversa simplemente pulsando dicho interruptor.
El código del programa es el siguiente:
#include <LiquidCrystal.h> // Llamada a la libreria del Display LCD #define sensor A0 // Pin conectado al sensor de temperatura TMP (A0) #define switch A1 // Pin conectado al conmutador de conversión (A1) int Vin; // Lee el valor a través del pin del Arduino int Vin1; // Lee el valor del interruptor float Temperature; // Recibe el voltaje con el valor convertido a temperatura float TF; // Valor en º F LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // Pins conectados del panel LCD void setup() { lcd.begin(16, 2); // Inicializamos el display LCD a 16x2 lcd.print("Temperatura: "); // Enviamos el texto al LCD } void loop() { // Leemos el pin A0 y almacenamos el valor en Vin Vin = analogRead (sensor); Vin1= analogRead (switch); // Convertimos el voltaje en temperatura ºC Temperature = (500 * Vin) / 1023; // Comprobamos el estado del interruptor (0- Celsius, 1- Farenheit) if (Vin1==0){ TF=Temperature;} // Temperatura en Celsius else{ // Conversión de Celsius a Farenheit TF = ((9 * Temperature) / 5) + 32; // Conversión de °C a °F } lcd.setCursor(0, 1); // Movemos el cursor del LCD a la siguiente línea lcd.print(TF); // Mostramos la temperatura por el LCD if (Vin1==0){ lcd.print (" C "); // Escala Celsius } else{ lcd.print (" F "); // Escala Fahrenheit } delay(1000); // Esperamos un segundo para volver a capturar la lectura del sensor }
La posibilidad de probar el simulador a través de este enlace:
Hasta este punto, prácticamente no hubo ningún problema. La odisea empieza en el momento de pasar el diseño al circuito real.
Mi compañero Alejandro me presta su kit de Arduino todavía por estrenar para que pueda llevar a cabo este pequeño experimento.
Invierto la mañana y la tarde de un domingo para preparar y montar el sencillo diseño. Dada mi ignorancia previa, realizo varios intentos de montaje con los componentes originales del kit, sin realizar modificación alguna. Por ello, utilizo la pantalla LCD, que no dispone de pines conectados, realizando la conexión de la misma mediante el juego de pines «sueltos» y sin soldar para engarzarla a la «breadboard». Evidentemente (como averigüé a posteriori) aquello no funcionaba.
Varias consultas a Google me llevaron a la conclusión que debía realizar la soldadura de los pines a la pantalla LCD si quería que aquello tomara cuerpo y se pusiera en marcha.
Otro largo rato de escaso pulso y soldaduras regulares consiguieron llevarme a una pantalla LCD con sus 16 patas soldadas.
Me quedaba todavía algo de tarde dominical y me dispuse a intentar finiquitar el tema. Pero… nada. Montaba y desmontaba el circuito y lo único que lograba era iluminar la LCD sin mayor actividad. Aquello no funcionaba: ¿podría haber estropeado la pantalla al realizar las soldaduras? (Posiblemente, pensaba para mí)
Después de intentarlo unas cuantas veces más, y viendo como se me acababa el domingo, decidí aparcarlo. El lunes lo consultaría con uno de mis alumnos: Eddie, experto y gran aficionado al mundo Arduino. Es más, me dije, le pasaría la LCD para que la probase y despejar la incógnita de su funcionamiento.
Ese lunes comentamos el problema. Eddie no sólo se llevó la pantalla sino que, para más garantías, me solicitó llevarse el kit completo. Se lo pasé encantado. Si alguien podía dar con ello, ese era él.
El martes llego la solución: la pantalla funcionaba perfectamente (¡menos mal!¡no he perdido del todo la habilidad con el soldador!). El problema venía de un componente insospechado: la «breadboard».
Después de probar varias cosas, Eddie pudo notar que había algo que no terminaba de funcionar como debía. Tras utilizar un polímetro para testear varios componentes, se puso a comprobar la «breadboard». Para su sorpresa, y la mía después, las dos líneas de continuidad que se usan para voltaje y tierra estaban «cortadas» en la mitad de la placa. Necesitaban puentearse para obtener esa continuidad. Ese era el problema real.
Descubierto esto, he podido llevar a cabo el diseño real y, realizando una leve modificación al mismo (no dispongo de interruptor y, por tanto, solo presento la temperatura en grados Celsius), he conseguido ejecutarlo.
Este es un pequeño video del diseño real y dejo a continuación el código utilizado:
#include <LiquidCrystal.h> // Llamada a la libreria del Display LCD #define sensor A0 // Pin conectado al sensor de temperatura TMP (A5) int Vin; // Lee el valor a través del pin del Arduino float Temperature; // Recibe el voltaje con el valor convertido a temperatura float TF; // Valor en º F LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // Pins conectados del panel LCD void setup() { lcd.begin(16, 2); // Inicializamos el display LCD a 16x2 lcd.print("Temperatura: "); // Enviamos el texto al LCD } void loop() { // Leemos el pin A5 y almacenamos el valor en Vin Vin = analogRead (sensor); // Convertimos el voltaje en temperatura ºC Temperature = (500 * Vin) / 1023; lcd.setCursor(0, 1); // Movemos el cursor del LCD a la siguiente línea TF=Temperature; lcd.print(TF); // Mostramos la temperatura por el LCD lcd.print (" C "); delay(1000); // Esperamos un segundo para volver a capturar la lectura del sensor }
Ha resultado un reto apasionante, a pesar de los tropiezos. Confío en poder realizar algún proyecto más y, a ser posible, compartirlo y ejecutarlo con los alumnos.