miércoles, 4 de junio de 2025

REVOLUCIÓN CIENTÍFICA EN CASA: EXPERIMENTOS CON ARDUINO Y APPS NO-CODE

 Alberto E. Villalobos Chaves
aewolframio@gmail.com


En la era de la información y la tecnología, la democratización de la ciencia se ha convertido en una realidad gracias al fácil acceso a los microprocesadores y a gran variedad de sensores y dispositivos de Internet de las Cosas (IoT).

La accesibilidad a la información, potenciada por la inteligencia artificial, ha abierto un mundo de oportunidades para fomentar el interés por las carreras STEM (Ciencia, Tecnología, Ingeniería y Matemáticas).

Los microprocesadores Arduino, en particular, han jugado un papel crucial en esta revolución, permitiendo a entusiastas y aficionados crear sus propios equipos de medición caseros y realizar experimentos con rigor científico y recursos mínimos.


¿Qué son los microprocesadores Arduino?


Los microprocesadores Arduino son plataformas de hardware libre basadas en una placa con un microcontrolador y un entorno de desarrollo integrado (IDE) que facilita la programación. Estos dispositivos son económicos, versátiles y fáciles de usar, lo que los convierte en una herramienta ideal para la educación y la experimentación a nivel aficionado e incluso profesional.

A continuación, se presentan cuatro ejemplos de proyectos que ilustran cómo estos dispositivos pueden utilizarse para realizar mediciones físicas que clarifiquen conceptos científicos, así como para acercarnos a temas relacionados al manejo de la incertidumbre de las mediciones, el diseño de experimentos o la programación no-code utilizada como una herramienta para coadyuvar a la captura de datos (MIT App Inventor 2Phyphox por ejemplo).


Medición de la velocidad del sonido en gases


Utilizando un sensor de ultrasonido y un microprocesador Arduino, se puede medir la velocidad del sonido en diferentes gases, lo que permite su identificación. Este proyecto es detallado en la publicación Measuring the Speed of Sound in Gases as a Means of Identifying Them.


Principio físico y técnica de medición


La velocidad del sonido en un gas ideal está relacionada con dos características de la sustancia gaseosa, su masa molecular en kg/mol y su constante adiabática (razón de capacidad calorífica), o sus valores promedio en caso de ser una mezcla de gases. Es por esta razón que la medición de la velocidad del sonido puede utilizarse como una forma preliminar de identificar un gas puro o caracterizar una mezcla de sustancias gaseosas.

La medición puede realizarse utilizando un sensor de proximidad ultrasónico, para medir el tiempo de ida y vuelta de un pulso sónico en un tubo cerrado de longitud conocida (x) (método del eco), lleno con el gas en estudio (v = 2x/t). Dado que la velocidad del sonido también depende de la temperatura absoluta (K), esta también debe medirse utilizando un sensor de temperatura.

Los valores medidos por los sensores son capturados y procesados por un microcontrolador Arduino que los transmite vía bluetooth a una aplicación móvil, diseñada con MIT App Inventor 2, que permitirá calibrar la longitud del tubo utilizando un gas de referencia cuya velocidad del sonido es conocida. 

La aplicación utilizará esta información para calcular la velocidad del sonido de una muestra desconocida de gas (Ec.1) y realizar una identificación preliminar (SoundSpeed_2024.aia).

Ec.1: Cálculo de la velocidad del sonido para un gas ideal

Materiales y equipo utilizado


Para llevar a cabo este proyecto, se utilizaron los siguientes componentes clave (ver lista completa y procedimiento general en la referencia citada 1 ):

  • Arduino Nano V3.0 CH340
  • Sensor de temperatura digital DS18B20 1-Wire
  • Sensor ultrasónico HC-SR04
  • Módulo Bluetooth HC-06
  • Impresora 3D (Ender-3 Pro)
  • Arduino IDE 1.8.19
  • Aplicación MIT App Inventor 2
  • Teléfono celular


Resultados

El proyecto demostró que es posible medir la velocidad del sonido en diferentes gases utilizando un dispositivo portátil basado en Arduino.

Se muestran algunos resultados de medición de gases refrigerantes (R134a y R404A) donde se puede observar que el porcentaje de error determinado fue el más bajo para los candidatos tabulados posibles (0.23224%, 0.01424% respectivamente), en relación con el valor teórico calculado, lo que puede interpretarse como una identificación positiva.

A pesar de los buenos resultados mostrados anteriormente, cabe señalar que también se dieron identificaciones erróneas en las que, siguiendo el criterio de la tasa de error más baja, la sustancia identificada no correspondía al gas que se introdujo en la celda de medición.

En este sentido, debe considerarse que este es un proyecto aficionado diseñado para realizar mediciones aproximadas de la velocidad del sonido en gases. Para realizar mediciones más precisas y una identificación más exacta, se deben tener gases de referencia de pureza certificada, calibrar el termómetro y realizar mediciones a diferentes temperaturas para obtener un valor de desviación de las mediciones. Además de lo anterior, una identificación positiva de una sustancia debe basarse en varias pruebas físicas o químicas, no solo en una.

Tomadas en cuenta las anteriores consideraciones se concluye que, implementando las mejoras ya mencionadas, esta metodología puede ser utilizada para identificar la composición de gases, lo cual tiene aplicaciones potenciales en diversas áreas, como por ejemplo la detección de gases controlados por razones ambientales.


Medición de la masa molecular de un soluto

Midiendo la disminución del punto de congelación de soluciones acuosas, se puede determinar la masa molecular del soluto. Este proyecto se describe en Measuring Freezing Point Decrease of Water Solutions.


Principio físico y técnica de medición


Es un hecho bien conocido que la temperatura de congelación del agua disminuye si tiene sustancias disueltas, razón por la que al agregar sal a la nieve ésta se licua.

Esto se debe a que la aproximación de las moléculas de agua para formar el cristal de hielo se ve obstaculizada por la presencia de moléculas distintas al agua, lo que provoca que se requiera una temperatura más baja para solidificar.

Esta disminución del punto de congelación de un líquido debido a que otra sustancia (soluto) está disuelta es parte de las llamadas propiedades coligativas y, en el caso de soluciones diluidas, que pueden considerarse una solución ideal, no depende de la naturaleza del soluto sino solo del número de partículas del mismo.

Para soluciones diluidas, esta disminución del punto de congelación se describe mediante la ley de Blagden (Ec.2):

ΔTF = KF · b · i   (Ec.2)

donde:


ΔTF, la depresión del punto de congelación se define como TF1 (punto de congelación del solvente puro) − TF2 (punto de congelación de la solución).

KF, la constante crioscópica, que depende de las propiedades del solvente, no del soluto. Para el agua, KF = 1.853 K·kg/mol).

b es la molalidad (moles de soluto por kilogramo de solvente).

i es el factor de van 't Hoff (número de partículas de iones por unidad de fórmula del soluto, por ejemplo, i = 1 para la glucosa, i = 2 para NaCl e i = 3 para BaCl2).

Si consideramos que la masa molecular (M) se define como el peso en gramos de un mol de moléculas, podemos expresar la ecuación anterior en términos de masa molecular como se muestra a continuación:


M = (KF · WSoluto·i ) / (ΔTF ·WSolvente)  (Ec.3)

donde:


WSoluto es el peso del soluto en gramos

WSolvente es el peso del solvente en kilogramos


El objetivo de este proyecto fue aplicar la Ecuación 3 para medir la masa molar de sustancias solubles en agua utilizando sensores de temperatura controlados por un microprocesador Arduino. 

Para tal efecto se diseñó una celda de medición impresa en 3D (crioscópio) que permitió al menos tres determinaciones simultáneas (repeticiones) del punto de congelación de soluciones acuosas en condiciones lo más controladas posible. 

El crioscópio, contenido en un refrigerador doméstico, transmite los datos medidos vía bluetooth a una aplicación móvil, diseñada utilizando la aplicación PhyPhox, que permita capturar los datos de temperatura medidos, graficarlos, exportarlos a Excel y a partir de estos datos calcular el peso molecular de la sustancia en estudio (Cryoscopy 3TS.phyphox).


Materiales y equipo utilizado


Para llevar a cabo este proyecto, se utilizaron los siguientes componentes clave (ver lista completa y procedimiento general en la referencia citada 2 ):

  • Arduino Nano V3.0 CH340
  • Sensores de temperatura a impermeables DS18B20
  • Bluetooth BLE CC2541 Bluetooth 4.0 UART
  • Arduino IDE 1.8.19
  • Aplicación PhyPhox (Google Play o AppStore)
  • Impresora 3D (Ender-3 Pro)
  • Ceda de medición impresa en 3D
  • Balanza digital portátil (200 g/0.01g)
  • Congelador doméstico
  • Teléfono celular


Resultados


El dispositivo de medición del punto de congelación diseñado (crioscópio) ha permitido capturar los datos de temperatura de tres muestras simultáneamente (triplicado), transmitiendo exitosamente la información de forma remota vía bluetooth a través de las paredes del congelador, en el cual se encuentra contenido, a la estación de análisis de datos (teléfono móvil) ubicada aproximadamente a 3 m.

La aplicación para Phyphox diseñada ha permitido graficar las curvas de congelación de las muestras analizadas en tiempo real y exportar estos datos a formato Excel para analizar la información posteriormente.

Los resultados de la aplicación de la Ecuación 3, derivada de la ley de Blagden, a los datos generados por varios experimentos se observan en la tabla adjunta.

Estos experimentos utilizaron como solutos glutamato monosódico monohidratado (potenciador de sabor utilizado en la cocina), cloruro de sodio y sacarosa.








De estas tres sustancias, las determinaciones de masa molecular que más se aproximaron al valor teórico fueron las de glutamato monosódico (desviación de 0.04%, Teórica 187,260 vs. Experimental 188,01 g/mol) y cloruro de sodio (desviación de 1.58%, Teórica 58,443 vs. Experimental 59,37 g/mol) en soluciones acuosas con concentraciones entre 6,6 y 4,3% m/m respectivamente.

En el caso de la sacarosa, la desviación del valor teórico de la masa molecular fue la mayor de las tres sustancias estudiadas. En este caso, para soluciones de concentración entre 8.2 y 16.6% m/m, las desviaciones correspondieron a 11% (Teórica 342,298 vs. Experimental 304,67 g/mol) y 13.8% (Teórica 342,298 vs. Experimental 295,16 g/mol) respectivamente.

En este punto, es conveniente aclarar que lo que se pretende en este proyecto es diseñar un experimento que sirva como muestra de conceptos sobre el tema de la crioscopia y las propiedades coligativas, con el potencial de escalar a un instrumento funcional optimizando ciertos parámetros.

Habiendo hecho esta salvedad, cabe señalar las siguientes posibles fuentes de error: la pureza de las sustancias químicas utilizadas (agua y solutos), la precisión y exactitud de los equipos de medición utilizados (balanza, termómetros) el aislamiento térmico de la celda de medición (aislamiento externo y distribución interna del calor) entre otros.

No obstante lo anterior se considera demostrado que es posible medir la masa molar de sustancias solubles en agua utilizando un dispositivo basado en Arduino y una aplicación móvil con resultados satisfactorios a efectos de ejemplificar la técnica.


Análisis térmico diferencial

Con sensores de temperatura y la aplicación PhyPhox, se puede realizar un análisis térmico diferencial, como se explica en Differential Thermal Analysis Using Arduino and PhyPhox.


Principio físico y técnica de medición


Cuando una sustancia sólida se calienta, el aumento de energía se manifiesta en forma de aumento de temperatura.

Si la tasa de calentamiento es constante, el aumento de temperatura también es constante siempre que no haya cambios en la estructura de la sustancia.

En el momento en que se inicia algún tipo de transición en la sustancia, por ejemplo, fusión, cambio de estructura cristalina u otro, la temperatura no aumentará a la misma velocidad porque parte de la energía de calentamiento se utilizará en ese cambio de estado.

Si comparamos la temperatura de la sustancia que está experimentando el cambio de estado (Muestra) con la que experimenta otra sustancia que permanece estable (Referencia) durante el calentamiento en condiciones idénticas y restamos un valor de temperatura de otro (Muestra - Referencia), estaremos realizando lo que se conoce como Análisis Térmico Diferencial (DTA).

El objetivo de este proyecto fue mostrar los conceptos básicos del DTA utilizando un microprocesador Arduino, un calentador construido con materiales caseros y una aplicación (DTA Arduino.phyphoxdiseñada en Phyphox que nos permitirá obtener en nuestros teléfonos móviles curvas de Temperatura de la Muestra frente a la Diferencia (Temperatura de la Muestra - Temperatura de la Referencia) conocidas como termogramas.


Materiales y equipo utilizado


Para llevar a cabo este proyecto, se utilizaron los siguientes componentes clave (ver lista completa y procedimiento general en la referencia citada 3):

  • Arduino Nano V3.0 CH340
  • Bluetooth Low Energy BLE CC2541 Bluetooth 4.0 UART
  • Sensores de temperatura impermeables DS18B20
  • Aplicacion Phyphox
  • Teléfono móvil (Android o iOS)


Resultados (ver video)


La curva que traza la temperatura de la muestra frente a la diferencia de temperatura entre la muestra y la referencia (Muestra - Referencia) se llama termograma mismos que se analizan a continuación.

En estos termogramas, la temperatura de la muestra (escala del "x") aumenta de izquierda a derecha, comenzando a temperatura ambiente, alcanzando algún punto después de la temperatura de fusión y disminuyendo nuevamente a un valor cercano a la temperatura ambiente inicial.

En la escala del "y", los valores de diferencia de temperatura (Muestra - Referencia) aumentan o disminuyen alrededor del valor de 0°C.

Al iniciar el calentamiento, la temperatura tanto de la muestra como de la referencia (parafina líquida) comienza a aumentar. Cuando la muestra experimenta algún cambio, principalmente su fusión, la velocidad de aumento de la temperatura se ralentiza en relación con la referencia, esto porque parte del calor que se está aplicando a la muestra se está utilizando ahora para dar a las moléculas una mayor movilidad cada vez más típica de un líquido que de un sólido.

Esto provoca un cambio repentino en la pendiente de la curva que empieza a moverse hacia los valores negativos del termograma, en este momento se dice que la muestra está experimentando un proceso endotérmico.

Como muestras de análisis se utilizaron tres materiales de estructura cérea, a saber, alcohol cetílico, cera de abejas y cera de parafina. En los tres casos los termogramas mostraron un punto mínimo correspondiente a las temperaturas en que se dio la completa fusión del material (49.9°C, 50.4°C y 59.10°C respectivamente) observándose además, inflexiones y picos adicionales en la estructura del termograma que se pueden relacionar con la solidificación de las ceras (proceso exotérmico) así como algún proceso intermedio relacionado con cambios de fase adicionales (cambio de estructura cristalina por ejemplo).

De esta forma, el proyecto demostró que es posible medir las curvas de análisis térmico diferencial de algunas ceras utilizando un dispositivo basado en Arduino y una aplicación móvil, siendo posible medir constantes físicas como su punto de fusión y solidificación así como otros cambios físicos intermedios.

Medición del punto de ebullición de gases licuados

Arduino y PhyPhox también se pueden utilizar para medir el punto de ebullición de gases licuados, como se detalla en Measuring the Boiling Point of Liquefied Gases Using Arduino and PhyPhox.


Principio físico y técnica de medición


La presión de vapor de un líquido depende de la temperatura, y el punto de ebullición se alcanza cuando la presión de vapor iguala la presión atmosférica. En el caso de los gases licuados contenidos en recipientes a presión, como los gases utilizados para limpiar polvo, gas licuado de petróleo (GLP) o gases refrigerantes, la presión en el recipiente permite que una fracción del gas esté en estado líquido. Al liberar este líquido y someterlo a presión atmosférica, comenzará a evaporarse, tomando energía del entorno y disminuyendo la temperatura alrededor. Bajo estas condiciones, la presión de vapor del líquido iguala la presión atmosférica y el líquido alcanza su punto de ebullición.

El objetivo de este proyecto es medir el punto de ebullición de gases licuados, utilizando un microprocesador Arduino y un sensor de temperatura impermeable DS18B20 capaz de medir temperaturas hasta -55°C. 

Los datos medidos por el microprocesador se transmitirán vía bluetooth a un teléfono móvil provisto de una aplicación diseñada en PhyPhox (Boiling Point.phyphox)  para tal efecto y que no solo nos permitirá graficar y analizar los datos, sino también tener acceso a los sensores del teléfono móvil, en este caso el medidor de presión barométrica, lo que nos permitirá programar la aplicación para corregir el valor del punto de ebullición medido a su valor estándar refiriéndose a la presión atmosférica a nivel del mar o 1 atmósfera.


 Materiales y equipo utilizado


Para llevar a cabo este proyecto, se utilizaron los siguientes componentes clave (ver lista completa y procedimiento general en la referencia citada 4):

  • Arduino Nano V3.0 CH340
  • Sensor de temperatura impermeable DS18B20
  • Bluetooth BLE CC2541 Bluetooth 4.0 UART
  • Teléfono móvil (Android o iOS) con sensor de presión barométrica
  • Aplicación PhyPhox
  • Bomba de gotero de plástico de 40 ml (marca Good Cook)


Resultados (ver video)


Como se observa en el cuadro de resultados mostrado mas abajo, la diferencia entre el punto de ebullición medido y el reportado en la literatura para los gases que se utilizaron como muestra de análisis, estuvo en el orden de entre 0.08°C y 0.36°C, con un promedio de 0.2°C, lo cual puede considerarse un valor mas que aceptable dada la simplicidad del equipo utilizado.

Dentro de las posibles causas de las desviaciones encontradas podrían mencionarse la exactitud tanto del sensor de temperatura como del  barómetro instalado en el teléfono celular, la pureza de los gases utilizados, entre otros.

No obstante lo anterior, el proyecto demostró que es posible medir el punto de ebullición de gases licuados utilizando un dispositivo basado en Arduino y una aplicación para celular, que permitió graficar y analizar los datos, así como acceder a los sensores del teléfono, como el medidor de presión barométrica. 

Esta medición del punto de ebullición, junto con otras pruebas físicas, como lo es la velocidad del sonido, comentada anteriormente, puede utilizarse para la identificación preliminar de sustancias gaseosas.


Conclusión


La democratización de la ciencia ha sido impulsada por el acceso a microprocesadores Arduino, dispositivos IoT y las aplicaciones no-code, permitiendo a entusiastas y aficionados realizar experimentos científicos en casa con recursos mínimos.

Los proyectos revisados en este trabajo demuestran cómo la tecnología puede facilitar la comprensión de conceptos científicos complejos. La accesibilidad y versatilidad de Arduino y microprocesadores similares fomentan el interés por las carreras STEM, promoviendo una sociedad más informada y curiosa.

En resumen, la revolución científica en casa es una realidad gracias a Arduino y a las app no-code, abriendo un mundo de oportunidades para la educación y la experimentación científica.

Confiamos en que el futuro traerá aún más oportunidades para la democratización de la ciencia y la tecnología, y que cada vez más personas podrán beneficiarse de estas herramientas para explorar el mundo que les rodea.


Referencias


1-Measuring the Speed of Sound in Gases as a Means of Identifying Them | Arduino Project Hub

2-Measuring Freezing Point Decrease of Water Solutions As a Way to Determine the Molecular Mass of the Solute : 5 Steps (with Pictures) - Instructables

3-Differential Thermal Analysis Using Arduino and PhyPhox : 5 Steps (with Pictures) - Instructables

4-Measuring the Boiling Point of Liquefied Gases Using Arduino and PhyPhox : 4 Steps (with Pictures) - Instructables


viernes, 1 de abril de 2016

ANÁLISIS TÉRMICO DIFERENCIAL UTILIZANDO UN PROCESADOR ARDUINO

Alberto E. Villalobos Chaves
aewolframio@gmail.com


Introducción:

Cuando una sustancia sólida, se somete a calentamiento por el concurso de una fuente externa de calor, la temperatura de la misma empieza a aumentar a una velocidad determinada por la fuente de calentamiento. 

A mayor calentamiento mayor temperatura, pero cuando nos acercamos al punto en el cual se pasa de sólido a líquido, esto es el punto de fusión, la temperatura de la sustancia no se incrementa ya a la misma velocidad con que lo hace la fuente externa de calentamiento, esto es debido a que la energía de calentamiento es utilizada en separar las moléculas del sólido para pasarlas a un estado de mayor movilidad, o sea al estado líquido, esto se llama cambio de fase.

Cuando el sólido se ha fundido completamente de nuevo su temperatura aumenta a la misma velocidad con que lo hace la fuente de calentamiento.

Si graficamos el aumento de temperatura de la sustancia en estudio, digamos una sustancia cérea, vs el tiempo de calentamiento obtendremos algo similar a lo mostrado en la Figura 1 en donde se aprecia un aumento casi lineal de la temperatura de la muestra (calentamiento constante) con un ligero desvío hacia abajo en la región entre los 48 y 54ºC aproximadamente debido a que en esa zona la sustancia fundió.
 Figura 1: Curva de aumento de la temperatura de una sustancia cérea al ser calentada a una velocidad de calentamiento constante.

Como se ve, la variación de temperatura debida a la fusión no es muy notable, no obstante si a la vez que calentamos la muestra calentamos también una sustancia que ya se encuentre en estado líquido y que no sufra ningún cambio en la zona de temperaturas en las que se va a estudiar la muestra (sustancia de referencia) y procedemos a restar a la temperatura medida a la muestra la temperatura medida a la referencia el panorama cambia completamente, como vemos en la Figura 2 para la misma sustancia cérea mencionada anteriormente.
Figura 2: Curva de aumento de la temperatura de una sustancia cérea respecto a una sustancia de referencia inerte (parafìna líquida) al ser calentada a una velocidad de calentamiento constante.

Este tipo de análisis físico es conocido como Análisis Térmico Diferencial y las curvas mostradas fueron realizadas utilizando dos sensores de temperatura, un Arduino y un poco de programación con Processing, procedimiento que se explicará a continuación (ver actualización de este procedimiento utilizando aplicación celular PhyPhox).

Materiales:

1- Arduino Uno
2- Protoboard con puentes de conexión
3- Sensores de Temperatura DS18B20 (2 unidades)
4- Resistencia 4K7 ohm (1 unidad)
5- Muestras de productos céreos o grasos
6- Parafìna líquida

Programas y Librerías:

2- Dallas DS18b20 (librería para Arduino)
3- OneWire (librería para Arduino)
3- G4P V3.5.2 (librería para Processing)
4- G4PTool v2.5 (herramienta para Processing)

Procedimiento:

En este trabajo se deben medir temperaturas con la mayor resolución y precisión posibles por lo que se utilizaron sensores de temperatura DS18B20 (Figura 3) cuya resolución es ajustable entre 9 y 12 bytes con una presición de 0.5ºC de -10 a 85ºC y con un rango de temperaturas de -55ºC a 125ºC.

Figura 3: Sensor de Temperatura DS18B20

Estos sensores de temperatura funcionan con tecnología OneWire lo que significa que se puede conectar varios sensores a un mismo puerto digital ya que cada sensor tiene un código de fábrica (p.e. 0x28 0x8A 0xB1 0x40 0x04 0x00 0x00 0xC7) que le permite al Arduino reconocer la lectura que hace cada sensor independientemente. 

Lo anterior es muy ventajoso pues permite ahorrar puertos digitales, sobre todo cuando el proyecto requiere múltiples sensores. 

Para averiguar el nombre de cada sensor de temperatura se montó la configuración que se muestra en la Figura 4.


Figura 4: Montaje del sensor de temperatura DS18B20 (N), circuito divisor de corriente (resistencia 4K7 ohm) y conexión al puerto digital 13 del Arduino Uno utilizado para averiguar el nombre del sensor

Se procedió luego a cargar y correr el siguiente código en el Arduino:

Averiguar_Nombre_del_Sensor_DS18B20_2.ino


//Incluimos las librerias que hemos decargado previamente
#include <OneWire.h>
#include <DallasTemperature.h>

//El ejemplo se realiza con Arduino Uno, conectando el pin de datos digital 13
#define ONE_WIRE_BUS 13
OneWire oneWire(ONE_WIRE_BUS);  // Creamos el objeto oneWire indicando el pin utilizado para comunicar con cualquier dispositivo OneWire
DallasTemperature sensores(&oneWire); // Asociamos nuestra referencia oneWire a un sensor de Dallas
DeviceAddress Sensor;  // Array donde almacenamos la direccion del sensor DS18B20

void setup(void)
{
  Serial.begin(9600);  //Iniciamos la comunicacion serie
  Serial.println("Direccion Sensor DS18B20:");
  sensores.begin();  //Iniciamos los sensores
  //Obtenemos la direccion del sensor de temperatura
  if (!sensores.getAddress(Sensor, 0))
  //Si no es posible determinar la direccion nos da un mensaje de error
    Serial.println("Imposible encontrar direccion del sensor.");
}

//Creamos la funciona Mostrar_Direccion
void Mostrar_Direccion(DeviceAddress direccion)
{
  //Definimos la amplitud de la direccion del sensor: 8 bits.
  //El sensor envia dos tipos de datos, una lectura de hasta 12 bits y una direccion de 8 bits relevantes
  for (uint8_t i = 0; i < 8; i++)
  {
    //Le indicamos que añada "0x" antes de cada grupo de digitos que forman la direccion.
    //Si no usamos esta instruccion luego habrá que añadir "0x" a mano para usarla en el siguiente sketch.
    Serial.print("0x");
     if (direccion[i] < 16) Serial.print("0");
    Serial.print(direccion[i], HEX);//Usamos formato Hexadecimal
  }
}

void loop(void)
{
  //Muestra la direccion del sensor
  Serial.print("Direccion del sensor: ");
  Mostrar_Direccion(Sensor);
  Serial.println();
  delay(5000);
}


Conociendo los nombre de los sensores se montó la configuración que se muestra en la Figura 5 y se cargó y corrió en el Arduino el siguiente código:

Leer2SensoresUnSoloPuerto3.ino







/*
 *************************************************************************************
 * Leer2SensoresUnSoloPuerto3.ino                                                    *
 * Leer 2 sensores de temperatura DS18B20 desde un mismo puerto analógico            *
 * @Alberto Villalobos                                                        *
 * http://hombrosdegigantes.blogspot.com                                             *
 * Creado 15/2/2016                                                                  *
 * Versión de Arduino 1.0.1                                                          *
 * Adaptado del "Tutorial Arduino IV: Sensor de Temperatura DS18B20"                 *
 * del blog Cetronic - Componentes Eléctricos                                        *
 * http://cetroniconline.blogspot.com/2014/07/tutorial-arduino-iv-sensor-de.html?m=1 *
 *************************************************************************************
 =====================================================================================
 Utiliza las librerías OneWire.h y DallasTemperature.h para el control del sensor de
 temperatura  DS18B20
 =====================================================================================
*/
#include <OneWire.h>
#include <DallasTemperature.h>

#define ONE_WIRE_BUS 13
                        
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensores(&oneWire);

// ***** Indicamos las direcciones de los sensores *****

DeviceAddress S1 = {0x28,0xFF,0x2E,0x90,0x64,0x15,0x02,0x67};  //Sensor Izquierdo (mas cerca del puerto usb)
DeviceAddress S2 = {0x28,0xFF,0x68,0xDD,0x64,0x15,0x02,0x6F};  //Sensor Derecho (mas alejado del puerto usb)


void setup(void)
{
  Serial.begin(115200);  //Abrimos la comunicación por serial

  sensores.begin();  //Iniciamos los sensores
}

void loop(void)
{
  sensores.requestTemperatures();  //Enviamos el comando para obtener los datos de los sensores

  float TempSensor1 = sensores.getTempC(S1);
  float TempSensor2 = sensores.getTempC(S2);

  // ***** Establecemos la resolucion para cada sensor *****

  //Resolucion a 9 bits 0.50 ºC
  //Resolucion a 10 bits 0.25 ºC
  //Resolucion a 11 bits 0.125 ºC
  //Resolucion a 12 bits 0.0625 ºC

  sensores.setResolution(S1,12);  //Resolucion a 9 bits 0.50 ºC
  sensores.setResolution(S2,12);  //Resolucion a 10 bits 0.25 ºC

  Serial.print(TempSensor1);Serial.print(",");Serial.print(TempSensor2);Serial.print(",");Serial.println(TempSensor2-TempSensor1);

  delay(152);
}

Figura 5: Montaje de los dos sensores de temperatura DS18B20 (N), circuito divisor de corriente (resistencia 4K7 ohm) y conexión al puero digital 13 del Arduino Uno (uso de un solo puerto para conectar dos sensores utilizando tecnología Onewire)

Una vez cargado este código se conectó el Arduino a la computadora y se corrió una interfaz gráfica de usuario (GUI) Programada con Processing y G4P a la cual se le dio el nombre ATDuino 1.0 que está disponible para su descarga y contiene los códigos mencionados anteriormente.


Figura 6: Interfaz gráfica de usuario (GUI) del programa ATDuino 1.0 creada utilizando Processing 2.0.8b y las librerías 

El equipo completo es como se muestra en las Figura 7 y 8 en donde se ve como la muestra a analizar y la sustancia de referencia (parafína líquida) están contenidas en tubos de ensayo, estos están colocados en un bloque de aluminio que es calentado por una plantilla calentadora (equipo concebido para otro fin). Los sensores, que están sumergidos en muestra y sustancia de referencia, se conectan al Arduino y este a la computadora que está corriendo el GUI ATDuino 1.0.


Figura 7: Montaje del calentador de la muestra y referencia, Arduino y computadora


Figura 8: Detalle del dispositivo calentador así como de la disposición de la muestra y la referencia

La interfaz ATDuino 1.0 nos muestra los valores puntuales de las temperaturas medidas por los sensores en la muestra y la referencia. Nos permite además graficar estas temperaturas así como la diferencia de estos dos valores.

Los gráficos pueden ser manipulados en tiempo real y los resultados, una vez terminada la medición son salvados en formato xls. 

Conclusión:

Se ha construido un aparato de bajo costo que permite hacer Análisis Térmico Diferencial utilizando un microprocesador Arduino y sensores de temperatura sumergibles de bajo costo capaces de medir en el rango de -55ºC hasta 125ºC lo que abre un gran número de posibilidades al estudio simplificado del comportamiento térmico de muchas sustancias. 

Referencias:



Versiones del GUI ATDuino 1.0:

1-ATDuino 1.0_Versión ejecutable.
2-ATDuino 1.0_Código.

Proyecto presentado en el Genuino Day 2016 - Costa Rica (ver video a partir del minuto 12:04)





viernes, 27 de marzo de 2015

AUMENTO VIRTUAL DE LA RESOLUCIÓN DE UN ARDUINO UTILIZANDO SOBREMUESTREO

Alberto E. Villalobos Chaves

Una de las limitantes de los microprocesadores Arduino, que tiene efecto sobre la calidad de la señal leída por sus puertos analógicos y que afecta la relación señal/ruido, es su baja resolución, que en el Arduino UNO y Arduino 2560 es de apenas 10 bit.
 
Esto significa que solo hay 1024 campos de memoria (2^10) para almacenar valores diferentes del voltaje medido, o sea que si utilizamos el voltaje referencia de 5 voltios, que es el que se asigna por defecto el Arduino, el mínimo voltaje al que sería sensible dicho microprocesador sería el indicado por la Ecuación 1.



Este valor es insuficiente si se quieren hacer mediciones precisas en ámbitos de valores amplios con señales de entrada pequeñas que es el caso que nos ocupa en este blog pues lo que se ha querido medir es el espectro luminoso producido por un espectrofotómetro de emisión atómica como el mostrado en la Figura 1 en el que se ve que hay señales muy intensas acompañadas de otras muy pequeñas lo que ocasiona que al querer examinar las señales pequeñas para su estudio estarán muy afectadas por el ruido electrónico ya que están en el límite de la mínima señal medida por el Arduino.


Figura 1: Espectro de emisión atómica de una disolución de cloruro de hierro

Para solventar esta limitante, se ha propuesto utilizar una técnica de filtrado matemático de señales conocida como sobremuestreo o oversampling que permite incrementar de forma virtual la resolución y por tanto aumentar la relación señal/ruido y que es consiste en capturar un número mayor de datos de los que son necesarios para recrear la señal medida (límite de Nyquist) y promediar estos datos utilizando la media escalada en lugar de la media aritmética como se muestra en las Ecuaciónes 2 y 3:

Número de capturas = 4^n                             Ecuación 2
 donde n es el número de bits adicionales en los que se quiere aumentar la resolución.

                 Ecuación 3

Siendo el datoi el valor i-ésimo de voltaje medido en el tiempo i-ésimo.

De esta forma si se quiere aumentar virtualmente la resolución del Arduino de 10 a 11, el valor de n es igual a 1 y el número de muestras a tomar debe ser 4, si el incremento deseado de resolución es a 12 el número de muestras será de 16 y así para otros valores de incremento de resolución de acuerdo a lo indicado en ElectricRCAircraftGuy.com (Cuadro1).

Cuadro 1: Monto en que se debe variar la cantidad de muestra capturada para incrementar la resolución utilizando sobremuestreo

Para programar al Arduino con este algoritmo se utilizó una librería adicional a la IDE de Arduino creada por Gabriel Staples llamada “AnalogReadXXbit” modificándose uno de los ejemplos que la acompañaban para adaptarlo a las necesidades de este proyecto.

El efecto que tiene aplicar esta librería se ejemplifica en las Figuras 2 y 3 en la que se puede ver como hay un incremento tanto en el tamaño del pico como en la forma del mismo (aumento relación señal/ruido) cuando se pasa de la resolución de 10 bits, original del Arduino, a un valor de 12 bits, desmejorándose la forma al pasar a 13 bits razón por la cual se seleccionó 12 bits y 16 muestras por segundo como valor a utilizar.

Figura 2: Efecto de aplicar la librería de sobremuestreo AnalogReadXXbit a la captura de la información espectral generada por un espectrofotómetro de emisión atómica aplicando un incremento de 0, 1, 2 y 3 al valor original del Arduino


Figura 3: Detalle del efecto de incremento en la resolución por sobremuestreo para el valor inicial sin uso del algoritmo AnalogReadXXbit y utilizándolo con un valor de incremento de resolución de 2 que se consideró óptimo

Como se desprende del análisis de las Figuras 2 y 3 anteriores, la mejora en la calidad de la señal fue sustancial y sin necesidad de utilizar amplificación electrónica de la señal sino simplemente por medios matemáticos.

Para la captura de la información se conectó el Arduino al espectrofotómetro utilizando una salida analógica prevista en dicho instrumento (Figura 4).


  Figura 5: Salida analógica del espectrofotómetro de emisión atómica utilizada para conectarse al Arduino

Como software de captura se diseñó una aplicación en Processing llamada DatArduino que permite la captura en tiempo real, su manipulación y posterior salvado de la información en formato ".txt", ".dat" o ".csv".

Los datos capturados fueron analizados utilizando una aplicación específica para el análisis de información espectral astronómica llamado Rspec.

ACLARACIÓN AL CONCEPTO DE SOBREMUESTREO EN RELACIÓN A CONSULTAS RECIBIDAS:


El método expuesto no aumenta el tamaño de la señal. Para eso se requeriría amplificación electrónica.

En realidad todas las gráficas en la Figura 2 y 3 deberían tener el mismo tamaño pues el rango de votaje es el mismo y todas las mediciones son realizadas bajo las mismas condiciones

10-bit res., --> 5V
11-bit res., --> 5V
12-bit res., --> 5V
13-bit res., --> 5V

La diferencia de tamaño observada se debe a que no se utiliza la media aritmética para obtener el "promedio" de la mediciones, esto es sumar "x" votajes de un punto y dividir entre "x".

En vez de eso se suman los 4^n voltajes de un punto y se dividen entre 2^n (media escalada), donde n está determinado por el incremento virtual de resolución que se quiere obtener sobre los 10 bits originales del Arduino.

10-bit originales del Arduino,    --> n=0
11-bit Arduino + 1,                  --> n=1
12-bit Arduino + 2,                  --> n=2
13-bit Arduino + 3,                  --> n=3

El efecto de este "truco matemático" es que al incrementar el valor de n se aumenta el valor de la media escalada y por tanto pareciera que se amplifica el voltaje. En realidad el voltaje no se amplifica pero si se reduce el ruido que es lo que se quiere al final. Para que este procedimiento de sobremuestreo funcione correctamente se debe tener exceso de mediciones de forma tal que se supere el límite de Nyquist (http://en.wikipedia.org/wiki/Oversampling).

Estos conceptos son mas del campo de procesamiento de señales de audio y se refieren a que si tiene una señal cualquiera, por ejemplo una onda sinosoidal perfecta y se captura pocos datos cuando se quiere reconstruir la onda con los datos capturados esta se mostrará distorcionada. Mientras mas datos se capture se verá cada vez mejor la reconstrucción de la onda, hasta que se llega a un punto (el límite de Nyquist) por arriba del cual, por mas datos que se capture ya no mejorará la forma (calidad) de la señal.

El sobremuestreo, que es esa forma especial de promediar, funciona cuando se está por encima del límite de Nyquist. Lo que hice en este proyecto fue aplicar algo que se utiliza en análisis de audio a datos espectroscópicos, y aparentemente ha funcionado pues la forma de los picos mejoró sensiblemente además de que se obtuvo una amplificación matemática de los mismos.

Descarga de código (Dropbox):

1. AumentarResolucion por sobremuestreo adaptado del código original de Gabriel Staples (V1.0 alpha).
2. AumentarResolucion para Version 2.1 por sobremuestreo adaptado del código original de Gabriel Staples (V2.1 alpha).
3. DatArduino 1.02


Referencias 
  1. http://es.wikipedia.org/wiki/Arduino
  2. http://en.wikipedia.org/wiki/Oversampling
  3. http://www.electricrcaircraftguy.com
Adendum

La librería de sobremuestreo utilizada en este trabajo fue la AnalogReadXXbit V1.0 alpha. Una nueva versión ha sido puesta a disposición, llamada AnalogReadXXbit V2.1 alpha que elimina algunas pulgas en el programa y permite realizar la captura de datos de una forma mas rápida. 

A efectos de comparar ambas librerías se muestran mediciones realizadas con ambas versiones a diferentes valores de resolución y muestreo de datos (Figuras 6 y 7) utilizando los siguientes parámetros:

Antigua Librería (AnalogReadXXbit V1.0 alpha)

int bits_of_precision = X; con X------>10,11,12,13 y 14
int num_samples = X; con X------>1,4,16,64 y 256

Nueva Librería (AnalogReadXXbit V2.1 alpha)

byte bitsOfResolution = X; con X------>10,11,12,13 y 14
unsigned long numSamplesToAvg = X; con X------>1,4,16,64 y 256
ADC_prescaler_t ADCSpeed = ADC_FAST;

A fin de responder a una consulta en el sentido de cual sería el desempeño de la librería de sobremuestreo (versión AnalogReadXXbit V1.0 alpha) contra utilizar el módulo ADS1115 de Adafruit, que tiene una resolución de 16 bits, se muestra en la Figura 8 el resultado de este experimento.

 Figura 6: Detalle del efecto de incremento en la resolución por sobremuestreo utilizando la anterior biblioteca AnalogReadXXbit V1.0 alpha utilizada originalmente en este post

Figura 7: Detalle del efecto de incremento en la resolución por sobremuestreo utilizando la nueva biblioteca AnalogReadXXbit V2.1 alpha

Figura 8: Detalle del efecto de incremento en la resolución por sobremuestreo utilizando la biblioteca AnalogReadXXbit V1.0 alpha, en comparación con usar el módulo ADS1115 de Adafruit conectado al Arduino