Control de led RGB con arduino
El modelo de led RGB utilizado teóricamente soporta hasta 5W y proporciona 70 lúmenes, sin embargo, en el circuito implementado, se controlará a una potencia mucho menor con una corriente máxima aproximada por color de 60ma. Aún así, esa corriente es demasiada para los puertos del arduino, por lo que se hace necesario intercalar un circuito controlador que soporte corrientes de esa magnitud.
El circuito controlador elegido es el chip ULN2003AN que utilizamos a modo de relé para encender y apagar cada led.
El led tiene cuatro puertos, un ánodo común y un cátodo para cada uno de los colores: rojo, verde y azul. Al combinarse estos colores en distintas proporciones podemos crear la sensación de estar viendo casi cualquier color.
El esquema de circuito se muestra en la siguiente figura:
El sketch Arduino le programa para recibir mensajes de cambio de color del led vía el puerto serie en un formato ‘COLOR R G B’. Una vez recibido el mensaje utiliza la función analogWrite para controlar la corriente que circulara cada led vía modulación de anchura de pulso (PWM).
Posteriormente se realizo un programa en .NET que permite especificar el color del led de una forma amigable. El siguiente video muestra el resultado:
Se adjunta un archivo con el código del sketch arduino y el programa de .NET.
Control de servomotores con Arduino y WPF
Los servomotores son motores que integran una circuitería de control que permiten posicionar su eje dentro de un rango. Típicamente los servomotores permiten posicionar el eje con precisión dentro de un rango angular de 0 a 180 grados aproximadamente.
Constan de tres señales de entrada: alimentación, referencia, y señal de control. Utilizando la señal de control se puede posicionar el motor dentro del rango. El control se realiza a través de pulsos de duración determinada de la señal de control. Por ejemplo, para posicionar un servomotor controlado con pulsos de 1msg a 2msg de rango 0-180 grados a 90 grados necesitaríamos suministrar a la señal de control un pulso de 1.5msg de duración.
Se conecta el control del servomotor a la salida digital número 9 del Arduino que programaremos para recibir mensajes de posicionamiento a través del puerto serie, interpretarles y posicionar el servomotor. Para ello utilizaremos las librerías de control de servos (Servo) y de delimitación de mensajes del puerto serie (Messenger).
La inicialización del programa del Arduino se muestra en la siguiente figura donde simplemente indicamos a la librería de control de servos que se utilizará el pin 9 para el control, inicializamos el puerto serie a 115200 baudios e inicializamos la librería de procesado de mensajes.
Dentro del bucle principal simplemente se leerá el puerto serie esperando mensajes de la forma ‘SERVO n’ donde n es un número de 0 a 178 que indica el ángulo en grados donde se desea posicionar el motor. Una vez interpretado el mensaje satisfactoriamente se posicionara el servomotor y se añadirá un pequeño retraso de 15msg que permita al servomotor posicionarse antes de recibir otra orden.
Para la aplicación WPF diseñaremos una clase con una única propiedad que permita establecer la posición del servo. Haremos que dicha propiedad sea ‘Bindable’ para poderla enlazar de forma natural con los controles de interface gráfico.
La parte principal de dicha clase se muestra en la figura siguiente:
y se creará un interface gráfico para el control en XAML enlazando a dicha propiedad de la siguiente manera:
El resultado se puede ver en el siguiente video. El código fuente de ambos programas se adjunta en el artículo:
Termómetro con Arduino
Utilizando un Arduino y el chip sensor de temperatura TMP36 se construye un sencillo termómetro tal y como se propone en el circuito diez de la guía de experimentación de adafruit.
El circuito es extremadamente sencillo, basta conectar los pins de alimentación y referencia del sensor para alimentarle, y que de esta forma nos proporcione en su otro pin un voltaje proporcional a la temperatura, el cual leeremos a través de la entrada analógica número 0 del Arduino, cuyo ADC nos proporciona una resolución de 10 bits.
El programa cargado en el Arduino es simplemente un bucle que cada segundo lee el voltaje de la entrada analógica y le convierte en un valor de temperatura utilizando las indicaciones de la hoja de características del sensor, enviando posteriormente este valor por el puerto serie.
El programa de PC leerá de forma continua los valores de temperatura que le vayan llegando por el puerto serie virtual (USB) y representándoles en pantalla. Su código principal es el siguiente (Aplicacion WPF en C#):
Con lo cual podremos leer en la pantalla del PC el valor de temperatura procedente del sensor, el cual se actualizará cada segundo.
Sincronización en la escala pentatónica
En el siguiente extracto de la conferencia ‘Notes & Neurons: a la busqueda de un coro común’ Bobby McFerring demuestra la capacidad de la gente del auditorio de sincronizarse en la escala pentatónica a través de una metáfora espacial.
World Science Festival 2009: Bobby McFerrin Demonstrates the Power of the Pentatonic Scale from World Science Festival on Vimeo.
JavaScript Intellisense con Visual Studio 2010
Parece que la próxima versión de Visual Studio va a traer importantes mejoras en el Intellisense para JavaScript.
En la imagen anterior se aprecia como es capaz de reconocer la introducción de 5 variables de forma dinámica a pesar de los alerts y las excepciones lanzadas.
let yourself feel
Excelente producción donde la música se fusiona a un efecto de partículas, Realizado con Particular y Adobe After Effects.
let yourself feel. por Esteban Diácono en Vimeo.
Visto en Graphics Runner
Publicado el código fuente del programa del Apolo 11
Se ha publicado parte del código fuente del programa que utilizó el Apolo 11 en la primera misión espacial tripulada a la luna.
El programa se puede ejecutar utilizando el emulador del ordenador de a bordo del Apolo 11 proporcionado por el proyecto Virtual AGC y AGS.

Transiciones con efecto disolver en Silverlight 3
El efecto de transición entre imágenes disolver o ‘dissolve’ consiste en una interpolación desde la imagen inicial hasta la imagen final en un periodo de tiempo determinado.
Para ello se definirá un parámetro t, que representa el progreso de la transición y cuyo rango es de 0 a 1. Un valor de cero significa que la transición aún no ha comenzado, es decir, aún se muestra completamente la imagen de origen, mientras que un valor de 1 significa que se ha completado el 100% de la transición, es decir, se mostrará la imagen de destino. Un valor de 0.5 significaría que la transición está al 50% por lo que se mostraría una mezcla a partes iguales de la imagen de origen y la imagen de destino.
Para su implementación se utilizará un WriteableBitmap. Los pixeles de un WriteableBitmap en Silverlight se representan como valores pargb lo que implica que el canal alpha, encargado de representar el nivel de opacidad, debe ir premultiplicado por lo que para representar un color rojo 50% transparente el pixel debería contener los valores [0.5,0.5,0,0]. De todas formas, para el caso que nos ocupa simplemente realizaremos la interpolación entre cada uno de los componentes de cada pixel de la imagen.
Si representamos cada pixel como un vector de cuatro componentes, siendo tr el vector que representa a un pixel de la transición, o a uno de la imagen de origen y d a uno de la imagen de destino el calculo de cada uno de los pixeles de la transición para un t dado se realiza mediante la siguiente expresión:
![]()
siendo x,y las coordenadas del pixel.
El siguiente programa en Silverlight muestra el efecto de transición con dos imagenes predefinidas.
El código fuente del programa se encuentra adjunto al artículo.
Mapas de bits dinámicos en Silverlight
Una de las novedades introducidas en la versión 3 de Silverlight es la clase WriteableBitmap que nos permite la generación dinámica de mapas de bits o bitmaps.
Su funcionamiento es muy sencillo, basta con pasar en el constructor el número de pixels de ancho y de alto que queremos que tenga la imagen para generarla y una vez generada podemos acceder a su contenido a través de la propiedad Pixels.
En el siguiente fragmento de código se construye un bitmap de 320x200 pixels y se establece el pixel en la posición (x, y) al color (r,g,b). Una vez modificado el bitmap se debe llamar a la función Invalidate para actualizar su contenido.
1: var bitmap = new WriteableBitmap(320,200);
2: var pixelColor = BitConverter.ToInt32(new byte[] { (byte)b, (byte)g, (byte)r, 255 }, 0)
3: bitmap.Pixels[x + y * bitmap.PixelWidth] = pixelColor; 4: bitmap.Invalidate();Por supuesto es necesario asignar el bitmap a la propiedad Source de un control Image para representarle en pantalla.
Una funcionalidad interesante añadida es el método Render que permite representar en el bitmap un control gráfico descendiente de UIElement después de aplicarle una transformación (rotación,escala,posición) lo que abre la puerta a la generación de interesantes efectos.
La siguiente ilustración muestra la generación dinámica de bitmaps. Si posa el cursor sobre la imagen podrá ver una representación de metaballs construida sobre un WriteableBitmap.
Los juramentos aumentan la tolerancia al dolor
De acuerdo a un estudio que saldrá publicado próximamente los juramentos que típicamente las personas emiten ante determinados hechos, como cuando se lastiman, tienen un efecto analgésico bajo ciertas circunstancias, incrementando la tolerancia al dolor.
Es posible que los juramentos activen una respuesta fisiológica conocida como ‘respuesta de lucha o vuelo’ (fight-or-flight response) que acelera el ritmo cardiaco y reduce la sensibilidad al dolor.