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.

Mínima Medición =  5000 mV  =  4.9 mV        Ecuación 1
                     1024

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

sábado, 7 de marzo de 2015

USO DEL PROGRAMA PROCESSING PARA GRAFICAR DATOS CAPTURADOS CON UN MICROPROCESADOR ARDUINO

Alberto E. Villalobos Chaves
aewolframio@gmail.com

La captura de información analógica se ha facilitado y abaratado mucho con la aparición de los microprocesadores Arduino que nos permiten por ejemplo leer en tiempo real los valores de voltaje generados por una fotocelda o el cambio de resistencia  eléctrica producido por un sensor de temperatura, por poner solo dos ejemplos.

Una de las ventajas del Arduino es que las conexiones eléctricas no se hacen por soldadura sino por simple insertado de los conectores desde los elementos electrónicos externos (sensores, resitencias, capacitores, etc) hasta los puertos de la placa Arduino lo que permite armar y desarmar con facilidad prototipos del circuito que se quiera desarrollar.

Otra de las características es que se puede programar el procesador del Arduino para que capture y procese la información de la forma en que más nos convenga para nuestros propósitos e incluso interactuar con esta a través de una Interfase Gráfica de Usuario (GUI).

Es precisamente de una GUI que he diseñado para graficar los datos capturados por el Arduino y que he llamado "DatArduino 1.02" de lo que trata esta entrada a mi blog.

Para ejemplificar el uso de DatArduino 1.02 capturaremos y procesaremos los datos de voltaje relacionados con un sensor de temperatura de un radiador automotriz (Figura 1).

Figura 1: Sensor de temperatura de un radiador automotriz

El circuito utilizado en este ejemplo, que se esquematiza en la Figura 2 y se muestra físicamente en la Figura 3, se basa en la propiedad del sensor de temperatura de cambiar su resistencia eléctrica cuando varía la temperatura.


Figura 2: Esquema del circuito divisor de corriente, así como las conexiones al sensor de temperatura y al Arduino

Para poder aprovechar este fenómeno utilizamos un circuito divisor de voltaje en el que el voltaje suministrado por el puerto de poder del Arduino (5V) es dividido por una resistencia (2.2 k ohms) entre el sensor de temperatura y el puerto analógico del Arduino (A0).

A mayor temperatura a la que es sometido el sensor, menor su resistencia lo que afecta la razón de división de voltaje y por tanto la señal de voltaje que es capturada por el puerto analógico del Arduino.

 Figura 3: Fotografía del sistema Sensor-Circuito Divisor de Voltaje-Arduino

Para instruir al Arduino los parámetros de captura y transmisión de los datos a la computadora se escribió un pequeño script ("Abrir Puerto Analógico") utilizando la versión 1.0.3 del IDE de Arduino.

La interfaz GUI diseñada para graficar, interaccionar y salvar la información capturada (DatArduino 1.01) se programó utilizando "Processing" (versión 2.0b8, se ha probado también en versión 2.2.1) y la librería G4P (Builder Tool V2.0.0) de creación de GUI para Processing. (Figura 4).

Figura 4: Interfaz Gráfica de Usuario DatArduino 1.0 utilizada para graficar, manipular y salvar la información capturada por un procesador Arduino

Comandos y Salidas del Programa:

1-
  • El botón "Iniciar" le indica al programa buscar los puertos seriales disponibles en la computadora y seleccionar uno que esté libre para iniciar la graficación de la información digital transmitida por el Arduino.
  • El campo de texto "Nombre del Archivo" es para escribir el nombre que le queremos dar al archivo capturado, mismo que se guardará en formato txt, dat y csv en la carpeta donde esté el archivo pde DatArduino_1_0.pde, si se corrió con Processing o el archivo DatArduino_1_0.exe , si se utilizó la versión exportada a windows que esta en la carpeta "application.windows32". Si no se selecciona nombre el programa por default asignará el nombre "Nemo".
  • El botón "Capturar" inicia la captura reseteando el tiempo a cero.
  • El botón "Salvar" salva los datos capturados con el nombre seleccionado en los formatos txt, dat y csv según se indicó anteriormente.
  • El botón "Salir" termina el programa.
2-
  • El campo "Tiempo Final de Captura (min):" es el tiempo al que el programa salvará automáticamente los datos con el nombre de archivo seleccionado. Por default está seleccionado 30 minutos pero en cualquier momento que se desee salvar, se puede usar el botón "Salvar" para guardar la captura. 
  • Se indica también en este sector del GUI el voltaje medido en milivoltios, el número de mediciones o datos capturados y el tiempo transcurrido desde que se accesó por primera vez al puerto serial o desde que se oprimió el botón "Capturar", así como la razón de captura en datos por segundo.
3-
  • La perilla de "Escala"  amplifica la señal graficada sin alterar el valor capturado que será el que se salve.
  • La perilla "Zero" cambia la posición vertical de la gráfica sin alterar el valor capturado.

4-
  • El control de deslizamiento "Exp.Horizontal" expande la escala en sentido horizontal sin alterar el valor capturado.
  • El control de deslizamiento "Despla.Horizontal" desplaza horizontalmente el gráfico sin alterar el valor capturado.
  • El botón "Reset" regresa los valores de los controles de deslizamiento a punto inicial.


En el  Video 1 se observa la captura de los datos que genera el sensor de temperatura al tocarlo con la mano y las manipulaciones a la forma de la gráfica al utilizar los comandos mostrados anteriormente. 

Video 1: Graficación de los datos capturados con un microprocesador Arduino de un sensor de temperatura automotríz en el que se observa el uso de los comandos de DatArduino 1.0

La configuración Arduino - GUI expuesta es lo suficientemente funcional como para permitir realizar proyectos de carácter científico en los que se requiera registrar datos generados por sensores de los muchos que ahora hay disponibles para los procesadores Arduino, además es lo suficientemente versátil como para programarle nuevas funcionalidades como podría ser el filtrado de los datos a fin de eliminar ruido, o el análisis de los datos por procedimientos matemáticos.

Referencias
  1. http://arduino.cc/en/pmwiki.php?n=Tutorial/ToComputer
  2. http://arduino.cc/en/pmwiki.php?n=Tutorial/Graph
  3. http://espaciodecesar.com/2013/04/28/cinco-termmetros-a-la-vez-con-arduino/
  4. http://www.crcibernetica.com/sensors/
Descarga del código y la aplicación (Dropbox):

Versión actual: DatArduino 1.03
  1. Abrir Puerto Analógico
  2. Builder Tool V2.0.0
  3. DatArduino 1.03
    • Se adicionó un combo para cambiar la razón de baudios para hacerla coincidir con la seleccionada para el Arduino
Versiones anteriores (Dropbox)
  1. DatArduino 1.02
    • Se adicionó un combo para cambiar la polaridad del gráfico, si bien los valores permancen inalterados.
  2. DatArduino 1.01 
    • Se adicionó un menú combo para seleccionar el puerto serial disponible ([0], [1], [2], [3] , [4] o [5]) en caso de que no corresponda a la opción [0] que está predeterminada por defecto.
  3. DatArduino 1.0

domingo, 19 de agosto de 2012

EJEMPLOS DE IDENTIFICACIÓN DE ESPECTROS DE EMISIÓN DE LLAMA UTILIZANDO EL PROGRAMA RSPEC


Alberto E. Villalobos Chaves 

Anteriormente en este blog, se describieron las capacidades del software Rspec para obtener espectros visibles en tiempo real conectando a la computadora una video cámara a la que se le había colocado en el lente objetivo una rejilla de difracción. Los espectros así obtenidos y posteriormente calibrados, se podían entonces guardar en un simple formato de datos tipo “*.dat” para su posterior estudio.

Ahora bien, esto implica que también se está la posibilidad de abrir espectros capturados por otros medios, incluso equipo especializado de laboratorio, y utilizar las facilidades de Rspec para analizarlos.

Lo anterior se probó con espectros obtenidos utilizando un espectrofotómetro de emisión de llama al que se le adaptó un multímetro digital como medio de digitalización de los datos espectroscópicos generados por el mismo. 

Los espectros que se mostrarán a continuación fueron realizados utilizando este equipo y las disoluciones se prepararon disolviendo las muestras en ácido nítrico, diluyendolas luego con agua destilada en concentraciones que fueron del 0.1 al 0.4% p/p aproximadamente. 

A manera de ejemplo podemos ver en la Figura 1 el espectro de emisión de llama (aire-acetileno) de una solución acuosa de nitrato de hierro puro cuyos datos, en formato “*.dat”, fueron graficados utilizando Rspec.

 Figura 1: Espectro de emisión de llama (Armstrong) de una disolución acuosa de nitrato de hierro puro

Ahora bien, Rspec no solamente permite graficar estos espectros, sino que dispone de una biblioteca de líneas espectrales de emisión atómica de referencia que da la opción de superponer tales líneas al espectro que se está estudiando de forma tal de poder realizar una identificación positiva de la especie en estudio. 

Esta biblioteca, que incluye también espectros de estrellas, nebulosas y hasta cometas, puede ser ampliada por el usuario y como contribución a la misma he creado espectros de referencia para todos los elementos de la Tabla Periódica, mismos que están a disposición para descargarse en formato "*.dat" (Figura 2). Así mismo se he incluido un archivo que comprende las llamadas líneas persistentes de todos los elementos. Estas líneas son las mas intensas y por tanto las que sería de esperar ver si se tiene la sustancia en una concentración relativamente alta. Este archivo es muy útil cuando se tiene mezclas de elementos y también se pone a disposición para su descarga.


 Figura 2: Biblioteca de espectros atómicos de referencia a la que ha sido adicionada los espectros de todos los elementos de la Tabla Periódica en formato "*.dat".
 
En la Figura 3 se muestra la superposición del espectro de referencia del hierro (azul) sobre el espectro de la muestra en estudio, obteniéndose como puede verse una coincidencia bastante buena tanto en posición de las líneas de emisión así como en la intensidad relativa de las mismas.


Figura 3: Espectro de emisión de llama (Armstrong) de una disolución acuosa de nitrato de hierro puro (rojo) sobre el que se superpone las líneas de emisión atómica de una referencia de hierro (azul).
(dar click en la imagen para ver video)

No obstante se debe hacer la salvedad de que no necesariamente se deben encontrar todas las líneas de emisión de la referencia en la muestra, ni mantenerse las intensidades relativas para que una identificación se considere positiva, pues esto depende de la fuente de excitación que se haya utilizado y del medio en el que se realizó el experimento. 

De esta forma en el caso de la Figura 3, la referencia fue obtenida utilizando como fuente de excitación un arco eléctrico en el vacio, mientras que la muestra fue ionizada con una llama de aire-acetileno, que es un medio mucho menos energético con una temperatura máxima de alrededor de 2200 °C y en el que se pueden dar reacciones químicas que forman especies moleculares (óxidos, carburos, nitruros, etc) que tendran características de emisión y absorción de la luz distintas a las especies atómicas libres y que por tanto podrían dar origen a señales adicionales a las que aparecen en la referencia.

Además de lo anterior se debe considerar también las señales adicionales que va aportar, en nuestro caso, la llama , misma que después de todo tiene color debido a la emisión luminosa de las especies moleculares que se forman durante la combustión (CH, C2, CN,OH, entre otras). Algunas de estas señales se pueden observar en los espectros que se están utilizando como ejemplo en este trabajo (Figura 4). A manera de referencia se muestra en la Figura 5 el espectro de la llama de aire-acetileno medido con el espectrofotómetro de llama en el rango visible del espectro.

Figura 4: Espectro de emisión de llama (Armstrong) de una disolución nítrica de hierro (rojo) sobre el que se superpone las líneas de emisión molecular propias de la llama aire-acetileno utilizada como fuente de excitación (azul).

Figura 5: Espectro de emisión molecular (Armstrong)  propio de la llama aire-acetileno utilizada como fuente de excitación.

Podemos pasar ahora a un ejemplo un poco mas complicado. Supongamos que en lugar de tener una disolución de hierro puro tenemos un acero inoxidable. Si bien el acero inoxidable es a base de hierro, tiene como elementos de aleación cromo y níquel en proporciones relativamente altas por lo que podríamos esperar encontrar picos de emisión atómica adicionales a los observados en el hierro puro y es exactamente lo que se puede observar en la Figura 6.


Figura 6: Espectro de emisión de llama (Armstrong) de una disolución nítrica de acero inoxidable (rojo) sobre el que se superpone las líneas de emisión atómica de una referencia de hierro (azul) y que muestra líneas de emisión no presentes en la referencia.

Puesto que sabemos que la muestra se trata de acero inoxidable es lógico por tanto buscar señales de cromo utilizando las referencias correspondientes de forma individual para no complicar la identificación. De esta forma la presencia de cromo y níquel resulta confirmada al superponer los espectros atómicos de estos elementos al espectro de la muestra de acero inoxidable (Figuras 7 y 8). 

En este punto se debe anotar que una confirmación positiva de identidad no debe basarse en la coincidencia de un solo pico sino que debe ser el resultado de la correspondencia de varias señales, y mientras mas coincidan será mas confiable la identificación.

 Figura 7: Espectro de emisión de llama (Armstrong) de una disolución nítrica de acero inoxidable (rojo) sobre el que se superpone las líneas de emisión atómica de una referencia de cromo (azul).

 Figura 8: Espectro de emisión de llama (Armstrong) de una disolución nítrica de acero inoxidable (rojo) sobre el que se superpone las líneas de emisión atómica de una referencia de níquel (azul).

Analicemos ahora una disolución nítrica de aleación de aluminio 5052 con la siguiente composición:

Chemistry Data
Aluminum
Balance
Chromium
0.15 - 0.35
Copper
0.1 max
Magnesium
2.2 - 2.8
Manganese
0.1 max
Remainder Each
0.05 max
Remainder Total
0.15 max
Silicon + Iron
0.45 max
Zinc
0.1 max

Según esta información los elementos mas probables de observar en principio (aunque no necesariamente como veremos mas adelante) serían los que estan en mayor concentración, o sea el aluminio y el magnesio, seguidos de lejos por el cromo.

Despues de haber analizado el espectro del acero aleado de la Figura 7, salta a la vista la presencia de cromo en esta muestra como se observa en la Figura 9, lo que se confirma al superponer al espectro la referencia de cromo (Figura 10).

Figura 9: Espectro de emisión de llama (Armstrong) de una disolución nítrica de aleación de aluminio 5052 (se eliminó la zona de fuerte emisión de la llama).

Figura 10: Espectro de emisión de llama (Armstrong) de una disolución nítrica de aleación de aluminio 5052 (rojo) comparada contra referencia de cromo (azul) 
(se eliminó la zona de fuerte emisión de la llama).

De igual forma es posible detectar la presencia de magnesio, en este caso por la intensa línea de emisión a 2852.1 Å y por las bandas de emisión molecular en forma de dos amplias montañas  centradas en 3700 y 3820 Å (Figura 11). En este punto se debe hacer la anotación que normalmente las líneas de emisión atómica son muy angostas y finas mientras que las moleculares tienden a ser muy anchas y menos definidas lo que permite diferenciarlas a priori.

Figura 11: Espectro de emisión de llama (Armstrong) de una disolución nítrica de aleación de aluminio 5052 (rojo) comparada contra referencia de magnesio (azul)
(se eliminó la zona de fuerte emisión de la llama).

Hasta aquí hemos identificado dos de los tres elementos principales de la aleación de aluminio, el cromo y el magnesio, sin embargo como se ve en la Figura 12, las señales del aluminio, elemento que está presente en mas del 96% son sumamente pequeñas, casi inexistentes. Este resultado aparentemente contradictorio se explica por el hecho de que el aluminio se oxida con facilidad en el ambiente oxidante de la llama y el óxido así formado es muy refractario por lo que no se calienta lo suficiente, a la temperatura de la llama, como para emitir apreciablemente en la región visible como si sucede con el magnesio que tambien forma un óxido mas fácilmente excitable. 

La energía de ionización juega también un papel preponderante en la intensidad de la señal que es de esperar observar y es lo que explica que el cromo, que tiene una energía del primer potencial ionización inferior al magnesio, de una señal mas intensa que este último a pesar de estar en una concentración mucho menor. Es por esta misma razón que es posible observar las señales del manganeso en esta muestra a pesar de su baja concentración (Figura 13).

 Figura 12: Espectro de emisión de llama (Armstrong) de una disolución nítrica de aleación de aluminio 5052 (rojo) comparada contra referencia de aluminio (azul).

Figura 13: Espectro de emisión de llama (Armstrong) de una disolución nítrica de aleación de aluminio 5052 (rojo) comparada contra referencia de manganeso (azul)
(se eliminó la zona de fuerte emisión de la llama).

Para hacer un análisis mas detallado y tratar de identificar mas elementos, se puede hacer uso del archivo de señales persistentes que contiene, en un solo file, las principales líneas de emisión de todos los elementos de la Tabla Periódica. Este análisis se detalla en el video que se muestra a continuación:


Creo que con estos casos se ha ejemplificado un poco el uso que se le puede dar al software Rspec en la identificación de espectros de emisión que han sido capturados con equipos de laboratorio, si bien no hay que olvidar que el programa permite hacer sus propias capturas por medio de una video cámara o de una cámara digital, y que la resolución de los espectros obtenidos dependerá de la rejilla de difracción o equipo dispersor que se le acople.

A manera de ejercicio les dejo 4 espectros con su respectivo archivo "*.dat" para que intenten identificar las líneas de los elementos que se sabe están presentes en cada ejemplo.

 Ejercicio 1: Agua potable mineral. Presencia de señales atómicas de potasio, litio, sodio y calcio, también hay señales moleculares de óxido de calcio.

Ejercicio 2: Llave de cañería (grifo). Presencia de señales atómicas de calcio, plomo, manganeso, hierro y cobre.

Ejercicio 3: Lámpara fluorescente de 6500 K. Presencia de señales atómicas de mercurio y hierro.

Ejercicio 4: Aleación metálica de una batería NiMH. Presencia de señales atómicas de potasio, manganeso, níquel, cobalto y lantano, también hay presencia de señales moleculares de óxido de lantano.

REFERENCIAS

  1. CRC__“Handbook of Chemistry and Physics”, ,VI/16,(Line Spectra of The Elements (Reader J., Corliss Ch.H.)),1980-1981;NSRDS-NBS 68.
  2. Handbook of Basic Atomic Spectroscopic Data
  3. Atomic Emission Spectroscopy with Spark- or Arc Excitation.
  4. Pearse,R.W.B.;Gaydon,A.G.;"Identification of Molecular Spectra";Chapman And Hall:London,1975.
  5. Parsons,M.L.;McElfresh,P.M.;"Flame Spectroscopy:Atlas of Spectral Lines";IFI/PLENUM:New York,1971.
  6. Spectroscopic Atlas for Amateur Astronomers.
  7. Analysis and Interpretation of Astronomical Spectra.