Colorear regiones de un mapa con Perl

Por razones laborales tenía la necesidad de tomar un mapa de España y colorear las regiones según ciertos parámetros. Hay multitud de herramientas para hacer eso pero no con las propiedades que necesitaba, así que me vi en la necesidad de hacer algo concreto
  • Los datos vienen dados por prefijo telefónico.
  • Tiene que funcionar en un servidor Linux.
  • Además, como se lanza desde un cron, tiene que poder usarse por linea de comandos
  • Como se actualiza varias veces al día y el servidor va un poco justo, tiene que ser lo más ligera posible.
  • ...y por supuesto, el plazo es para ya mismo.
No puedo publicar la herramienta completa, pero bastará con la idea y un módulo de Perl de ejemplo.

La mejor forma de colorear un mapa es partir de una imagen vectorial, donde cada región es un objeto y se le asigna el color de fondo que corresponda. Pero no encontré ningún mapa vectorial de España por provincias que pudiera reutilizar fácilmente. Varias aplicaciones en java y javascript y en flash. Pero adaptar eso y encontrar la forma de cambiar el color y renderizarlo desde linea de comandos me iba a llevar tiempo. Más tarde encontré un buen mapa en formato SVG -fácil de manipular-, pero ya tenía programada la herramienta.


Plantilla

Opté por una solución no tan perfecta, pero igualmente válida y muy ligera. Lo primero tomé un mapa mudo de España, grandecito y completo, por ejemplo este. La idea es sencilla: primero voy a colorear cada región de un color distinto que la identifique. Y luego, usando convert (de ImageMagick, reemplazaré ese color por el que tenga que tener tal región según los datos.

Por simplificar, ya que los datos que tengo van agrupados por prefijo telefónico, he coloreado Madrid con el color #000091, Barcelona con el #000093, La Coruña con #000981 o Valencia y Alicante ambos con el #000096, etc. La numeración telefónica oficial de España la podéis consultar en este enlace de la CMT: APÉNDICE. Listado de atribuciones y adjudicaciones vigentes del plan nacional de numeración telefónica.

Una vez coloreado el mapa que nos servirá de plantilla, queda así:



Gradientes

Sobre esta plantilla, he pegado el gradiente con la escala de color que voy a utilizar. En el código fuente se puede elegir usar un gradiente u otro. En esta página http://local.wasp.uwa.edu.au/~pbourke/texture_colour/colourramp/ hay varios ejemplos de gradientes que se pueden usar para visualizar datos. Yo me he quedado con el gradiente 1: azul-(cielo)-verde-(amarillo)-rojo, que creo que es el que mejor representa gráficamente los valores que voy a visualizar.



Los gradientes de tres colores son apropiados cuando la mayoría de los datos están agrupados en torno a una media central (verde) y se quiere ver cuales son las provincias que se desvían por encima (rojo) o por debajo (azul). En este se han añadido dos colores más en los puntos de unión para que no se pierda luminancia. Comparar con cómo sería un gradiente azul-verde-rojo gradual:



Cuando lo normal es un valor límite, ya sea bajo o alto, y se quiere resaltar la desviación hacia el otro extremo se usan gradientes de dos colores, como el clásico verde-rojo (para los indicadores), o azul-marrón (altura de los planos). Aunque por estética o legibilidad a veces se incorpora un tercer valor ya sea en el medio, amarillo por ejemplo para dar verde-amarillo-rojo como en un semáforo; o en un extremo, blanco en la altura máxima azul-marrón-blanco, recordando al nivel del mar para la altura cero, y a las nieves perpetuas en las cimas más altas.

Cuando los valores son centrales y no importa hacia qué lado se produce la desviación, se emplea un gradiente simétrico como este por ejemplo:


En ocasiones, cuando tenemos valores muy distintos en la misma imagen se emplean gradientes de 6 o más colores. Ejemplos típicos son las escalas de calor que evolucionan desde negro a blanco pasando por azul, verde, amarillo y rojo. Hay multitud de modelos.

En la página antes dicha hay varios gradientes con sus archivos .dat, para transformar ese formato a un array de Perl se usa el script grad2perl.pl que os incluyo. Luego este gradiente hay que cargarlo en el módulo ColorUtils.pm (ver enlace de CPAN). Este no lo incluyo porque es un sólo archivo pm que se puede descargar fácilmente de CPAN .


Uso

Al final del módulo hay un texto POD muy breve explicando cómo se usa. En el código fuente se ha incluido una matriz con los prefijos de España y la población (por si se necesita ponderar los datos).

Para usarlo sólo hay que rellenar un hash con el prefijo telefónico como clave y el dato como valor, además de proporcionar otros datos como el color de fondo, o una etiqueta. El módulo se encarga de llamar a convert, con las instrucciones opaque necesarias para sustituir el color de cada provincia por el calculado según el gradiente.

use mapacolor;

my %valores;
  $valores{prefijo1} = ...
  $valores{prefijo2} = ...

mapacolor::prefs_fill_map_with_gradient(
  \%valores,          # hash de valores
  $outfile,           # archivo salida
  'blue_green_red',   # nombre del gradiente
  0.0,                # límite inferior del gradiente
  1,                  # límite superior del gradiente
  undef,              # mapa origen
  '0a0d0f',           # color de fondo
  $anotacion);        # texto de titulo


Después la imagen se guarda en un archivo con formato PNG y se inserta el título (si es preciso) en la esquina superior derecha. El resultado es un mapa como este:



Os dejo el programita aquí listo para descargar.
Artículo completo >>

Termostato para estufa de incubación casera

Este sencillo proyecto es ideal para quienes quieran ver con un ejemplo el funcionamiento básico de un comparador, de un sensor de temperatura y de un triac. Se trata de un termostato muy preciso capaz de regular una temperatura de entre 27 y 40 grados centígrados. Apto para regular una estufa de cultivo casera.

Un inciso rápido para los profanos: para observar colonias de bacterias, estas se depositan en una placa con gelatina y se cultivan cuales plantas. Para que crezcan se necesita una temperatura estable entre 35 y 38 grados más o menos; si baja crecen muy lentamente, y si sube se asan. El objetivo es obtener 37ºC estabilizados.

Hay varias formas de hacer una estufa casera, yo opté por lo fácil: coger una yogurtera vieja y aplicarle un termostato que la encienda y la apague cuando sea necesario. Hay quien lo hace con una caja aislante (de corcho o madera) y un lámpara incandescente, es un buen método, pero a menudo las colonias crecen mejor a oscuras. He visto proyectos hasta con un secador, es muy buena idea, una fuente de calor con un ventilador que lo distribuye.

Aunque como digo me quedo con la yogurtera. Otra opción es aprovechar la resistencia de nicrom de un brasero que no se use. La fuente de calor va al gusto del experimentador, yo aporto el termostato.


Análisis del circuito


El componente principal es un sensor del tipo LM35. La salida de este integrado es proporcional a la temperatura (exactamente 10mV por cada grado centígrado). De forma que a 20ºC su salida es de 200mV, a 25ºC es 250mV y a 30ºC da 300mV. No se ve en el esquema de arriba. Va conectado al conector SL1 siendo sus pines 1, 2 y 3 el terminal positivo, el de salida y el negativo respectivamente. El zener que veis marcado como VR1 es un LM431 y tal como está proporciona una tensión constante de 2.5V, es mejor que uséis un zener normal, yo era lo que tenía a mano en ese momento.

La resistencias R2A, R2B, R3 y R4 forman un divisor de tensión. Normalmente el valor resultante a la salida del R3 dependería de la tensión de alimentación, pero R1 y VR1 nos aseguran que el divisor siempre va a estar a 2.5V, independientemente de que alimentemos el circuito con una pila o un transformador. El separar R2 en 2 es por aproximar mejor el valor necesario.

Cuando la temperatura (tensión en la entrada -) es mayor de la seleccionada (tensión en la entrada +) la salida del comparador cae a 0V. Desactivando el optotriac y cortando la corriente de la estufa. Cuando la temperatura vuelve a estar por debajo el comparador conmuta su salida, activa el LED indicador y el LED del optotriac. Este a su vez dispara el triac que proporciona corriente a la fuente de calor.

No hemos usado ningún tipo de histéresis en el comparador, ya que lo que pretendemos no es tener un rango sino una temperatura fija. Además el optotriac que hemos usado incorpora detección de cruce por cero, y sólo se disparará en la parte baja del ciclo de alterna.

Debido a que no hemos amplificado la salida del LM35 trabajamos con tensiones del orden de mV. No es del todo recomendable trabajar con tensiones tan bajas, pues una mínima interferencia puede activar o desactivar momentáneamente el termostato, pero en este caso prima la sencillez del circuito.



Cálculo de los componentes

Lo más importante es calcular R2, R3 y R4 pues de su valor depende el rango de temperaturas de trabajo. Yo lo he calculado para darle un rango entre 27 y 40ºC. En esta hoja tenéis los cálculos. Los valores en negrita son introducidos manualmente, los que están en letra normal son calculados.

Calculamos R1 a partir de la tensión de alimentación para que por el zener circulen como mínimo 5mA. Despreciamos la corriente que absorbe el sensor. Tened cuidado con la tensión del zener que uséis, que esté dentro del margen de alimentación del LM35. Necesitaríamos 1530 ohm, como el valor no es crítico usaremos 1k. Con ese valor nos da 7.65mA, es aceptable.

Lo primero es medir R3. Es un potenciómetro de 10k, que una vez medido resulta ser de 10400ohm. R2 y R4 se calculan atendiendo a la tensión zener y al rango que se pida. Después se ajustan a los valores estándar de mercado más próximos y se recalcula el rango de temperaturas. Más tarde conviene medir con un téster la tensión en la patilla 3 de IC1 porque debido a la tolerancia de las resistencias se va a desviar de los cálculos. Tendréis que jugar un poco con R2B hasta ajustar el rango deseado.

Tras los cálculos los valores quedan:
  • R1 1kΩ
  • R2A+R2B 153kΩ
  • R3 10400Ω
  • R4 18000Ω
  • R6 470Ω
  • R7 1kΩ
  • R8 220Ω

El triac BT137 soporta hasta 8A, que a 220V son 1700W. Es más que suficiente, pero si vuestra estufa es más potente usad otro.


Montaje

Aunque más abajo os dejo los archivos de Eagle del diseño y un PDF esta sería una imagen del circuito con y sin los componentes:




No he previsto fuente de alimentación. Podéis usar una pila de 9V como dice el esquema, pero no os lo recomiendo porque se supone que se va a usar durante varias horas o días seguidos. Así que lo mejor es utilizar un transformador viejo, por ejemplo de un móvil que ya no uséis. Otra opción es diseñar una fuente de alimentación externa. Si quitáis el led y sustituís el optotriac por un modelo tipo MOC3043 (que necesita sólo 5mA para dispararse en lugar de los 15mA que necesita el 3041) el circuito consume tan poquito que se puede alimentar con una fuente sin transformador.

Este montaje se intercala en serie con el cable de alimentación de la estufa.

Os adjunto una carátula de ejemplo para montarlo en una caja de registro cuadrada. Está en formato png y en formato vectorial eps.


Como siempre, os dejo los archivos aquí.
Artículo completo >>

Espectroscopía casera con DVD



En otra entrada anterior habíamos explicado que un DVD o un CDROM se comportan como una red de difracción. También habíamos calculado el número de líneas y los ángulos para hacer la observación. En esta segunda parte lo aplicaremos para observar los espectros de una luz de sodio a alta presión (HPS o High Pressure Sodium) y una lámpara fluorescente de bajo consumo de mercurio.

Hay algunas condiciones que debemos cumplir para que las observaciones salgan mejor:
  • Lo primero de todo, las observaciones salen mejor cuando se trata de una fuente puntual. Un foco extenso sólo producirá borrones en lugar de líneas.
  • Los rayos deben llegar paralelos. Para minimizar los artefactos de la y las lineas espurias de la difracción. En el laboratorio utilizaríamos un colimador, en casa conseguimos lo mismo al observar una fuente muy lejana, como por ejemplo una farola.
  • Limitar la entrada. En la línea de lo anterior, es muy conveniente tener una ranura por donde entran los rayos de luz. Mientras más fina más definido el espectro, pero también menos intenso. Si es muy fina podría darse dispersión y empeorar la condición anterior. Los rayos ya no serían paralelos y el espectro se vuelve borroso. Por lo tanto hay un límite en cómo de estrechas podemos hacer las líneas.
  • La fuente debe ser única. Parece que no hace falta decirlo. Si tenemos otras luches a la entrada o alrededor veremos los espectros solapados y nada nítidos. Por extraño que parezca, en casa esto es de lo más complicado de conseguir, por los reflejos en los cristales o las paredes que meten ruido en la observación. Incluso con una farola hay reflejos en edificios cercanos. Por eso lo mejor es limitar la entrada con una ranura.

Ver las líneas espectrales de una luz valiéndose de un CD es muy fácil y no tiene ningún misterio. Conseguir fotografiarlo ya es más complicado y se necesita bastante paciencia. Hay mucha gente que ha echo experimentos y los ha subido, esta es una buena página: http://ioannis.virtualcomposer2000.com/spectroscope/toyspectroscope.html


Análisis por ordenador

Hemos obtenido la foto de un espectro interesante, por ejemplo este


Ni que decir tiene que los colores de la imagen son aproximados ya que tanto la cámara como el monitor trabajan con valores de Rojo-Verde-Azul y algunas frecuencias (colores) quedan fuera de su alcance y no se pueden reproducir.

Ahora lo que me gustaría es tenerlo en un gráfico, de Intensidad frente a longitud de onda. Lamentablemente nunca podremos hacer eso con un montaje precario, porque para saber la intensidad necesitamos medir y compensar la respuesta del CCD de la cámara. Y puesto que es la del móvil, no tenemos tales datos. Para la longitud de onda necesitaríamos medir los ángulos de una manera precisa, y tampoco tenemos esa información en la imagen. Si supiéramos el ángulo exacto no tendríamos más que aplicar la transformación que hay en este gráfico:


Obtenido con esta hoja de datos. Así que de momento a lo máximo que podemos optar es a un gráfico Intensidad - Píxel y eso haremos.

Suponiendo que tenemos un espectro como el de antes, queremos una sección transversal de la imagen, o sea coger la linea central por ejemplo, y obtener su intensidad luminosa en cada píxel. Eso nos lo hace http://rsb.info.nih.gov/ij/, que es una herramienta en java para manipulación de imágenes online. Muy útil. Lo que ocurre es que yo quería más cosas.

Yo quiero procesar varias líneas de cada imagen (no sólo la línea central. Hay espectros que por el centro están sobreexpuestos y se ven mejor en los bordes. Quiero hacerlo con varias imágenes y dejar el resultado en un fichero. Finalmente me gustaría que el gráfico estuviera superpuesto al espectro, en parte porque queda bonito, y en parte porque al carecer de la longitud de onda me tengo que guiar por el color. Por cierto que esto de dejarse guiar por el color no es del todo buena idea porque las cámaras digitales suelen alterarlos (por una cosa que se llama balance de blancos), así que si en la vuestra se puede desactivar mucho mejor.

Para todo eso he programado un breve programa en C que:
  • Usando la librería libjpeg extrae la linea que se le diga (por defecto la línea media).
  • Extrae las N líneas adyacentes que se pidan y calcula la media. Por ejemplo puede servir para suavizar el gráfico. Además este efecto se acentúa al ser concéntricas las líneas espectrales. Sirve para eliminar ruido del CCD en las zonas oscuras, como contrapunto ensancha las líneas y vuelve borroso el espectro.
  • Con los tonos de color obtenidos genera una imagen en formato AVS para graficarla con Gnuplot. El formato AVS de imágenes es de los más sencillos que hay. Documentado aquí en dos párrafos: http://local.wasp.uwa.edu.au/~pbourke/dataformats/avs_x/
  • Si la imagen es en color calcula la intensidad total usando una media cuadrática. Hay multitud de maneras de convertir una imagen a escala de grises, esta es la que mejor resultado me ha dado para las imágenes que tengo. Lo malo es que no incorpora ningún tipo de ponderación de colores.
  • Escribe un archivo con la intensidad luminosa calculada por cada píxel.
  • Escribe un archivo con los comandos de Gnuplot necesarios para hacer el gráfico.
  • Y finalmente ejecuta Gnuplot para generar una imagen PNG con todos los elementos. Con una versión antigua de Gnuplot las líneas quedan muy ásperas porque libgd no soporta antialias. Así que he usado el terminal tipo pngcairo que incorpora Gnuplot 4.4.

El resultado me encanta. Aquí abajo tenéis por ejemplo el gráfico de un tubo fluorescente de espectro ensanchado. A decir verdad no sé interpretar casi ninguna línea. Pero podéis ver el doblete amarillo del mercurio por ejemplo.




¿Sodio o mercurio?
 
Teniendo la longitud de onda de una linea dada podríamos ir a la base de datos del NIST a mirar de qué elemento podría ser. Pero como esa información no la tenemos no podemos analizar nada, y nos limitaremos a interpretar lo que vemos en base a espectro que conocemos. Como por ejemplo el del mercurio.

He aquí la luz que proporciona una lámpara de bajo consumo (varía según marca y modelo).


Fijaos en el doblete amarillo que se distingue fácilmente. Es del mercurio y está formado por dos líneas en 576.9nm y 579nm. Además de este se ven varias líneas más que también parecen compuestas.

Cuando vemos un doblete en el amarillo es tentador pensar que estamos resolviendo el doblete de la línea D del sodio. Pero no es el caso, primero porque estamos observando una lámpara de mercurio, no de sodio, y aunque podría contener trazas no darían unas líneas tan intensas. Sin embargo hay otra forma de verlo, mirad la imagen original:


El espectro anterior está calculado en la línea media, así que vamos a suponer que el ancho total es de 320 pixeles (que es el ancho de la imagen). Habíamos dicho en la primera parte que la anchura en grados del segundo orden de difracción es de 60. Tenemos 320 pixeles para reproducir 60º de espectro. Mirad la posición y separación de las lineas del doblete del mercurio y del sodio:


Por una simple regla de tres al mirar el doblete del sodio, que está separado 0.14º, la separación entre los máximos de las líneas sería de

\[\Delta = \frac{320 \times 0.14}{60} = 0.75\]

es decir, los máximos están separados por menos de un píxel. Así que los veremos como uno sólo. La resolución que tenemos no es suficiente. Sin embargo la separación de las líneas del doblete amarillo del mercurio es de 0.40º, y su intensidad es mucho más débil (no se presenta el problema de la sobreexposición que ensancharía las líneas y las solaparía). La separación en las imágenes es de

\[\Delta = \frac{320 \times 0.40}{60} = 2.13\]

algo más de 2 pixeles. Ese sí que podríamos verlo y de hecho es el que vemos en la imagen.

Ahora mirad este otro espectro, de una luz de sodio a alta presión. La banda negra que veis en la zona naranja es una banda de absorción del sodio -con la alta presión se da un fenómeno de auto absorción, y la línea D en lugar de radiarse se retiene-. El caso es que no es una absorción limpia con un mínimo en el centro, sino que en el centro tiene un pequeño máximo. ¡Ahí tenemos el doblete D del sodio! Estamos viendo que la absorción no es de una única línea sino que se compone de dos separadas. Hemos tenido que recurrir a verlo en absorción porque los medios que tenemos no son suficientes para verlo en emisión. Con un ancho de la imagen original de 480px, la separación sería de 1.12 pixeles, algo más si tenemos en cuenta que lo que se ve en esa imagen no es el espectro visible completo de 60º, sino sólo una parte.


En esta otra imagen de la lámpara de mercurio he quitado el zoom y se ve el comienzo del tercer orden de difracción. Fijaos como las dos líneas violetas están más separadas a la derecha de la imagen que a la izquierda.



Y hasta aquí podemos llegar sin recurrir a apoyos ópticos como un ocular o un colimador. Y sin un montaje fijo que nos permita medir ángulos con precisión y situar la cámara en el punto adecuado. Hay muchos más tipos de lámparas, la próxima vez que la grabadora os estropee un DVD ya sabéis algo que probar. Tenéis más información así como espectros comentados en http://ioannis.virtualcomposer2000.com/spectroscope/ o en http://www.astrosurf.com/~buil/us/spe2/hresol4.htm.

 Como siempre, os dejo las imágenes, los espectros así como el código fuente del programa en esta dirección. El programa en C está bastante liado, no es un buen ejemplo de programación, aún así tal vez os resulte útil para vuestras pruebas.
Artículo completo >>

Difraccion en un DVD

Todos sabemos que un DVD o un CD presentan iridiscencia cuando se miran bajo un foco de luz. La información de un DVD se guarda en un surco de anchura micrométrica que recorre el disco en espiral. En un milímetro a lo largo del eje central puede haber más de 1000 surcos. Eso le da al DVD las propiedades de una red de difracción. No explicaré cómo funciona una red o sus propiedades, hay información de sobra por ahí. Básicamente, debido a interferencias múltiples, cada longitud de onda de las que componen la luz blanca se refleja con un ángulo distinto, así que la luz incidente se descompone en colores. Eso se puede aprovechar para hacer un espectroscopio casero con un DVD o con un CD.

El parámetro más importante de una red de difracción es su densidad de líneas, expresada en líneas por milímetro. O también nos puede servir la separación entre cada surco. Vamos a medir este parámetro en un DVD para usarlo más adelante como elemento difractor en un espectroscopio casero básico.

Para medir cuántas líneas por milímetro tiene un DVD hacemos un sencillo montaje. Este es un experimento que hice la semana pasada, en lo que tardaba en beberme una cervecita con la música de Saratoga o Tierra Santa.


Medir el número de líneas

El método consiste hacer el montaje en el suelo o en una mesa baja y señalar los rayos. Después sacar una foto y medir los ángulos en el PC.

Lo primero que necesitamos es un trozo de DVD. Así que cortamos un trapecio circular para que sea más cómodo. Quitaremos el aluminio que recubre la superficie y nos quedaremos sólo con el plástico semitransparente. Para levantar el aluminio usad cinta aislante, pero tened cuidado de no rallarlo. Ahora tenemos una red de difracción de transmisión y de reflexión. Dibujad con cuidado varios radios desde el centro, nos servirán para orientar mejor la placa.

Si apuntamos un puntero láser contra este trozo de plástico se refleja en varios puntos por la pared. Nos interesa anotar esas reflexiones. Para eso vamos a utilizar un método muy de andar por casa pero que da muy buenos resultados si se hace con cuidado.

En primer lugar sujetamos el trozo de DVD de forma perpendicular al suelo, con el radio paralelo al suelo. La plastilina es muy útil, pero si no tenéis usad cinta aislante o -en mi caso- una pinza de la ropa. Da igual, se trata de que no se mueva. Por facilidad, uno de los radios que habéis dibujado antes debe quedar horizontal. Después explico por qué.

Tomad un puntero láser y apuntadlo a la misma altura que el radio que está horizontal. Yo en esta ocasión he usado un mazo de cartas que es una base fácilmente regulable en altura. El motivo de hacer esto es que las reflexiones y refracciones van a suceder siguiendo el plano de este radio (primera ley de la reflexión). Si no es horizontal el plano se inclina y algunos rayos se proyectarán hacia el suelo y otros en las paredes. Al asegurarnos un plano horizontal todos los rayos tienen la misma altura. Si en vez de circular tuviéramos una red de difracción recta, la cosa sería más fácil.

Para hacer los testigos, o banderas, o soldaditos si tenéis plastilina pues adelante con ella. Si no tomad unos trozos finos de papel y doblados por la base para que se tengan de pie.

Ahora con el láser apuntando a la placa, localizad el rayo reflejado y colocad todo para que el reflejo impacte de nuevo contra el puntero. Con eso nos aseguramos que el ángulo de incidencia es 0. Sin mover el láser ni la placa id colocando los testigos de forma que todos los rayos reflejados y difractados impacten contra ellos. Será la forma de señalar las posiciones para cuando apaguemos el láser y hagamos la foto.

Una vez situados los soldaditos le sacaremos una foto desde arriba. Importante que sea lo más vertical posible y centrada en la placa de DVD. Así los ángulos no se deforman con la perspectiva ni con la óptica de la cámara por mala que sea. El resultado es una foto así, fijaos que el trozo de DVD no se ve porque está completamente de canto:



La luz incide por la derecha (centro). A la izquierda está el rayo transmitido. El rayo reflejado no se ve porque hemos hecho que coincida con el incidente. A ambos lados del rayo principal veis los difractados. Estos provienen del primer oden de difracción tanto transmitida (izquierda) como reflejada (derecha). Con este ángulo de incidencia el segundo orden no aparece. Para que se vea más claro he hecho un esquema de la imagen:



Medir ángulos sobre la imagen es fácil. Sólo tenéis que unir los puntos dos a dos para obtener el centro. Y a partir de ahí cualquier programa de dibujo como GIMP os permite medir ángulos. Yo lo he hecho con el Xfig, que es prehistórico pero hace muy buenos apaños y me encanta.

Según Xfig el ángulo del primer máximo de difracción es de 62.4º. Hay una ecuación que nos da la posición de los máximos de interferencia, ya la habíamos usado antes en esta otra entrada:

\[d \left( \sin{\theta_m} - \sin{\theta_i} \right) = m \lambda\]
  • d es la separación entre las líneas (pistas del DVD)
  • θi es el ángulo incidente
  • θm es el ángulo en el que aparece el máximo de orden m
  • m es el orden de la difracción, puede valer 0, ±1 ,±2 ...
  • λ es la longitud de onda de la luz incidente

Sabemos que θi es cero, porque para eso hicimos coincidir el rayo reflejado con el incidente. En el esquema de antes m sería el -1.El ángulo θ-1 también lo conocemos, es lo que hemos medido 62.4º. Y la longitud de onda de un láser rojo es 650nm. Así que despejando d:

\[d = \frac{1 \times 650}{\sin 62.4} = 0.734 \mu m\]

Dice el estándar DVD en este documento (página 12) que:

10.6.2 Track geometry
In the Information Zone tracks are constituted by a 360° turn of a spiral.
The track pitch shall be 0,74 µm ± 0,03 µm.
The track pitch averaged over the Data Zone shall be 0,74 µm ± 0,01 µm.

Nosotros hemos obtenido 0.734 lo que nos da un error menor del 1% (fijaos que es del orden de los 10nm). Y eso con un montaje rudimentario, midiendo solamente un ángulo y sin tener en cuenta el cálculo de errores (propagación). Realmente es una pasada la precisión que se puede alcanzar con un láser.

La conclusión es que un DVD se comporta como una red de difracción de 1360 líneas por milímetro. No está mal. Para un CD es alrededor de 600.


Los órdenes superiores

He preparado una hoja de cálculo para este apartado. Está en este enlace. Ahora uso el dato de 0.74µm. Con el ángulo incidente 0, totalmente perpendicular tenemos este caso.



Además del láser hay dos columnas más. Una corresponde a la longitud de onda del rojo y la otra la del violeta. ¿Para qué? Pues para cubrir todo el espectro visible. La captura anterior nos dice que, con el ángulo de incidencia 0, la difracción en primer orden del espectro visible cubre un ángulo que va desde 77º a los 33º, por tanto tiene una anchura angular de 44º. Los ángulos se cuentan desde la perpendicular, como en el esquema de antes. No os dejéis despistar por los signos, solamente indican si se cuentan hacia la izquierda o hacia la derecha.

Con 1300 líneas/mm la difracción en primer orden es muy brillante, pero las líneas están poco separadas; la resolución es muy pobre. Para ver algo mejor el espectro recurriremos al segundo o tercer orden. Habrá que variar el ángulo de incidencia. Este es un esquema de lo que obtenemos si situamos el láser donde estaría el R1.



Aparecen máximos de segundo orden. Pero esto es para una longitud de onda de 650nm. Como lo que nos interesa es el espectro visible aún tenemos que decidir qué ángulo es el que más nos conviene.

Veamos esta otra tabla en la que aparece el principio y el final de los dos primeros órdenes en un DVD según variemos el ángulo de incidencia. He tenido que recortar la zona del rojo de los 750nm a los 700, para que el segundo orden apareciera completo. La difracción en segundo orden de 750nm no aparece por ser una longitud de onda tan larga, necesitaríamos un ángulo de incidencia mayor de 90º, y eso es imposible.


El segundo orden comienza a verse a los 5º, pero sólo las ondas cortas como el violeta. Para ver el espectro hasta el rojo habrá que esperar hasta los 65º. Con un ángulo incidente de 65º ya veríamos el espectro completo en segundo orden. A 80º veríamos el rojo y a 10º el violeta. Pero hay un problema, que a 65º, más o menos a la mitad, tenemos el propio rayo reflejado y nos lo jode. Así que no nos vale. Con 85º o 90º ya no pasa esto, el problema es ahora que los rayos llegan demasiado oblicuos y el espectro se ve muy débil.

El ángulo óptimo parece que es 80º.


Sin embargo vemos como el violeta de tercer orden se superpone ya a los 40º. El tercer orden empieza a superponerse a partir de los 460nm. En general no supone un problema pues además de ser mucho más débil, es fácil distinguir por el color las líneas que son producto de la superposición. Nos interesa este segundo orden porque el ancho (60º) es mayor que el primero (sólo 24º). Nota: el orden 0 no se dispersa. La cámaras de fotos de los móviles tienen una apertura angular de unos 60º precisamente (es fácil medirlo: dibujad dos puntos en un papel y separad la cámara hasta que los puntos coincidan con los extremos de la pantalla, sabiendo la separación entre los puntos y la distancia del papel a la cámara lo demás es trigonometría).

Para que os hagáis una idea, cuando observamos el espectro de una luz con un DVD realmente estamos haciendo esto (no he dibujado el tercer orden):



Con un CD

Como un CD tiene menos líneas por milímetro los números cambian, pero la ley es la misma. Así que con las mismas hojas de cálculo que antes obtenemos la posición de los máximos. Por ejemplo cuando el ángulo incidente es 0:


Poniendo el rayo incidente donde antes estaba el rojo. Vemos hasta el tercer orden completo. Sin bien todos los espectros están superpuestos entre sí.


Y lo que es más importante, es que para obtener la anchura de 60º que teníamos antes con un DVD en segundo orden, con un CD tenemos que recurrir al tercer orden, y será mucho más débil.

En la imagen de abajo veis los rayos que produce un CD. Si os fijáis bien en el mazo de cartas se ve el rayo difractado de tercer orden que debería coincidir con el transmitido (puntero). Aquí lo he desviado un poco para que se vea. Digamos que en lugar de estar a 54º le láser está a 50º respecto a la normal del CD.


Los ángulos no los he medido, son sólo un ejemplo de lo que sale en la hoja de cálculo si suponemos que el láser está a 50º. Observad siempre el criterio de signos.




Más adelante estos cálculos nos servirán para hacer un espectroscopio casero.
Artículo completo >>