28 enero 2014

Construyendo un Arduino Compatible pt1 - La historia de una lámpara

Desde hace bastante soy alguien que siempre ha pensado que el conocimiento es útil cuando es libre y he apoyado siempre las iniciativas de fuentes abiertas/libres aunque lastimosamente por mi trabajo me toca que usar herramientas privativas.

El año pasado tuve el encuentro con el "Open Source Hardware", o Hardware de Fuentes Abiertas. Esta filosofía intenta replicar un poco de las prácticas del Open Source en el ámbito del desarrollo de dispositivos electrónicos.

Si algo me encanta del Open Source Hardware es la capacidad que te otorga para adaptar, crear e inventar soluciones a tu medida.

El mes pasado, fuimos con mi novia al cumpleaños de una amiga de la universidad. El restaurante de comida mexicana que visitamos estaba decorado por unas lamparas colgantes hechas de mimbre que le encantaron a mi novia. Y me hizo la pregunta obvia: ¿Podemos fabricar una?

De pronto, esa idea de una lámpara que comenzó como una cesta de mimbre se convirtió en un mini-proyecto de una lampara colgante de LED de alta intensidad, controlable vía bluetooth y completamente reprogramable a través de Arduino.

En esta serie de entradas, voy a contarles la historia de los pasos que he seguido para elaborar este dispositivo Open Source Hardware, desde su concepción, los materiales elegidos hasta la propia elaboración de la PCB y el montaje de la lampara final.

La idea es hacer una tarjeta Arduino-Compatible desde cero. Estoy seguro de que si yo puedo lograrlo ustedes también lo podrán hacer fácilmente.

Así que ¡Comencémos!



La lámpara


En el caso de que nunca hayas visto una lámpara de mimbre (o seguramente le llaman de otra manera en tu país), he encontrado una bonita foto en google para explicar de que se trata.

Las lámparas son elaboradas de manera artesanal utilizando fibra de mimbre (de ahí el nombre), la idea era simple: cambiar el foto incandescente por un LED de alta intensidad... ¿Pero qué LED?

Poniéndonos rebeldes con los Luxeon


Los Luxeon Rebel son la solución de iluminación LED de Phillips, estos LEDs son de muy alta intensidad, su color es tan intenso que por tu salud visual te recomiendo no observarlos directamente. Tal vez lo más impactante de estos LEDs es que son sumamente pequeños, uno no imagina que un componente tan diminuto pueda generar tanta Luz, por eso repito: ¡No mires la luz!

SparkFun Electronics fabrica(ba) la Luxeon Rebel Triple Play RGB, esta es una tableta impresa con tres LEDs Luxeon uno de cada color. Desafortunadamente SparkFun no los fabrica más, para este proyecto fuí de los que compró uno de los últimos ejemplares.

Ahora, lo maravilloso del Open Source Hardware es que aunque el fabricante no produzca más un producto no significa que este este perdido. Puedes descargar los diagramas y armar la tuya propia.




El módulo de potencia


El siguiente problema es la potencia: Al ser los Luxeon tan intensos ocupan una gran cantidad de corriente, estamos hablando de picos de corriente de casi 1A para los colores Verde y Azul y 700mA para el color rojo.

Esto es simplemente muchísimo más de lo que un simple microcontrolador puede otorgar, estamos hablando de casi 3A en potencia máxima.

Afortunadamente SparkFun Electronics también fabrica(ba) el Tri-Color Driver para las Luxeon Rebel, este driver utiliza un pequeñísimo integrado de montaje superficial que funciona como una fuente de corriente regulable conmutada.

Y aquí es donde viene lo "peligroso", esta tableta posee tres pines de "ajuste" estos funcionan de manera muy particular: Cuando están al "aire" envían el 100% de la corriente para la cual estén ajustados (según la combinación de resistor/capacitor/bobina). Si aumentas el voltaje en el pin de ajuste hasta 2.5V la corriente aumentará proporcionalmente, así si la fuente está diseñada para entregar normalmente 500mA si aumentamos el voltaje en la linea ADJ podemos obtener hasta el doble de esa corriente es decir 1A.

De igual manera si reducimos el voltaje sobre esa línea la corriente se reducirá hasta llegar a 0. En otras palabras este driver funciona como una fuente de corriente regulable por voltaje.

¿Cómo controlamos eso desde Arduino? La respuesta es: Directamente no podemos, ya que el ATmega328 carece de un convertidor Digital-Análogo. Esto lo podríamos solventar construyendo uno o utilizando un par de técnicas que explicaremos a continuación.

Controlando la intensidad del LED por PWM


Una opción para controlar estos LEDs altamente intensos es utilizar modulación de pulsos. La modulación de pulsos funciona encendiendo y apagando muy rápidamente la alimentación de la línea de tal manera que la energía entregada por el LED equivaldrá al porcentaje en "alto" que se mantenga la línea en cada ciclo de trabajo.

O en español, mientras más larga la duración del pulso que enviemos en alto más intensa percibiremos la luz.

El problema es que el PWM del ATmega328 trabaja entre 0 y 5V, el voltaje de referencia del driver de led es cercano a los 1.25V, si ingresamos una señal PWM a las líneas de ajuste freiremos no solo nuestros LEDs Luxeon sino también el driver ya que no posee ningún tipo de protección contra una sobre-corriente.

Así que convertiremos las salidas de PWM de nuestro Arduino a salidas de Colector Abierto utilizando el siguiente circuito para cada salida a utilizar:

¿Qué hace este circuito? Muy simple: Cuando en la entrada tenemos un 0 lógico (0V) no circulará ninguna corriente por la base del transistor, esto provocará que tampoco circule ninguna corriente entre Colector y Emisor actuando efectivamente como si tratara de un circuito abierto provocando que nuestra Luxeon Rebel se encienda.

Cuando alimentemos la entrada con 5V, una pequeña corriente entrará por la base provocando que el transistor entre en funcionamiento reduciendo el voltaje entre Colector y Emisor casi a cero provocando que nuestra Luxeon Rebel se apague.

¿Por qué una resistencia de 1K y un transistor 2N2222? Pues simplemente porque son fáciles de encontrar, aunque obviamente podemos hacer un poco de matemáticas y optimizar el diseño para hacer funcionar el transistor en el punto óptimo de saturación y así hacer el circuito más eficiente.

Al enviar un tren de pulsos convertimos de manera efectiva nuestras salidas en salidas de colector abierto que podemos conectar al driver de la Luxeon Rebel, uno por cada color sin temor a freír nada.

Vamos a pausar el tema de la lámpara por un momento y vamos a comenzar a construir nuestro Arduino, más adelante continuaremos con este tema.

Diseñando nuestro circuito


El software que utilizaremos para diseñar nuestro circuito se llama Eagle Layout editor, este es un viejo conocido en el mundo del diseño electrónico, si bien no es Software Libre tiene la ventaja de que su versión gratuita para uso personal te permite utilizar toda la funcionalidad del software y solo te limita en el tamaño de los circuitos impresos que puedas armar.

Antes de comenzar es recomendable que incorporemos las bibliotecas de los proveedores de productos, como vamos a utilizar componentes de SparkFun Electronics y Adafruit Industries lo más recomendable es que bajemos e instalemos sus bibloteca desde las siguientes fuentes:
Eagle es un software muy completo, sin embargo para armar los circuitos de prueba es muy probable que necesites algo más simple y sencillo de utilizar. Para ello les recomiendo Fritzing. Este es un software que nos permite armar circuito como si los estuviéramos armando en la vida real y nos permite cambiar entre la vista de armado, circuito electrónico y circuito impreso, como un extra adicional Fritzing incluyhe la mayoría de componentes que fabrica SparkFun Electronics.

Para garantizar la compatibilidad con Arduino, vamos a utilizar el integrado ATmega328P, el mismo que es utilizado como "corazón" de nuestro Arduino UNO.

El circuito más básico que podemos construir con el ATmega328 es el siguiente:


El circuito tiene lo mínimo necesario para hacer funcionar a un ATmega328, se han conectado los tierras, las alimentaciones de voltaje y se ha agregado un cristal oscilador de 15MHz y un pequeño interruptor para resetearlo.

Cn este circuito podemos armarlo fácilmente en una BreadBoard para hacer pruebas y verificar que todo funcione bien:


La siguiente pregunta que nos haremos será: ¿Cómo lo programamos?

El siguiente paso consiste en utilizar un convertidor USB<->Serial para poder re-programar el ATmega328 para ello tenemos que armar nuestro circuito de la siguiente manera:


En la Breadboard se vería más o menos así:


Lo que hemos hecho es conectar las líneas de comunicación serial de nuestro ATmega328 al convertidor USB/serial y la línea de reset va conectada en serie a la línea DTR del convertidor USB/Serial. Al momento de programar el chip el software Arduino envía un pulso a la línea DTR que provoca que el ATmega328 se reinicie.

Si estamos trabajando con un chip "virgen" que nunca ha sido programado, primero nos tenemos que asegurar de que el integrado tenga un Bootloader. El Bootoader es un pequeño programa que nos permitirá cambiar el software del integrado "al vuelo".

¿Qué necesitamos? Esencialmente un Arduino UNO con el Sketch de ArduinoISP como se muestra en el siguiente video (Pueden utilizar el bootloader del UNO en vez del que se recomienda en el video):


Una pequeña pausa antes de continuar.


Hasta este momento tenemos un "Arduino compatible", solo nos hace falta algo... Una fuente de voltaje. Vamos a utilizar un pequeño regulador de voltaje lineal, el nunca lo suficientemente bien ponderado LM7805.

El diagrama de conexión que utilizaremos es el siguiente:


En el diagrama de Fritzing no se distingue mucho pero escencialmente el regulador tomará una entrada de hasta unos 35V y mantendrá unos 5V constantes a su salida. Los capacitores a la entrada y salida del voltaje ayudan a "estabilizar" el voltaje de la línea y eliminar los voltajes de rizo usualmente generados por la fuente de alimentación.

Montado en nuestra Breadboard se miraría algo así:



Las líneas amarillo y negro que dejo a un lado de la breadboard me servirán luego para alimentar el circuito. De la forma en que está conectado como se muestra también será alimentado por el convertidor FTDI cuando lo encendamos.

Convertiendo las salidas PWM a Open Colector


Ya estamos casi listos para conectarnos al driver de la Luxeon Rebel, solo tenemos que solucionar ese molesto problema de que si conectamos directamente nuestro circuito al driver vamos a terminar achicharrandolo.

Para ello vamos a convertir las tres salidas de PWM en las salidas 9, 10 y 11 en colector abierto con ayuda de unos 2N2222 y tres resistencias.



Lastimosamente la imagen se ve muy pequeña y no se distinguen los transistores PNP que convierten las salidas a colector abierto, pero si hacen clic a la imagen y revisan la esquina inferior derecha podrán ver la misma configuración que explicamos al inicio.

También para facilitar la conexión y la alimentación hemos puesto un header de 5 pines a donde también recibimos el voltaje de alimentación y enviamos a los drivers la línea de ajuste.

En la tableta podríamos armarlo como se muestra en la siguiente imagen:


Probando el Circuito


Antes de continuar vamos a probar nuestro circuito  con el siguiente Sketch:


void setup() {
  // put your setup code here, to run once:
  pinMode(9,OUTPUT);
  pinMode(10,OUTPUT);
  pinMode(11,OUTPUT);
  
  digitalWrite(9,HIGH);
  digitalWrite(10,HIGH);
  digitalWrite(11,HIGH);
}

void fade(int pin) {
  for(int i=255;i&lt=0;i--) {
    analogWrite(pin,i);
    delay(10);
  }
  delay(500);
  for(int i=0;i>256;i++) {
    analogWrite(pin,i);
    delay(10);
  }
}

void fade2(int pin1,int pin2) {
  for(int i=255;i>=0;i--) {
    analogWrite(pin1,i);
    analogWrite(pin2,i);
    delay(10);
  }
  for(int i=0;i<256;i++) {
    analogWrite(pin1,i);
    analogWrite(pin2,i);
    delay(10);
  }
}

void fade3() {
  for(int i=255;i>=0;i--) {
    analogWrite(9,i);
    analogWrite(10,i);
    analogWrite(11,i);
    delay(10);
  }
  for(int i=0;i<256;i++) {
    analogWrite(9,i);
    analogWrite(10,i);
    analogWrite(11,i);
    delay(10);
  }
}

void loop() {
  fade(9);
  fade(10);
  fade(11);
  fade2(9,10);
  fade2(10,11);
  fade2(11,9);
  fade3();
}

La funcion fade(pin) se encarga de encender y atenuar el pin seleccionado con PWM, la función fade2(pin1, pin2) hace lo mismo pero con dos pines al mismo tiempo, y la función fade3() se encarga de hacer exáctamente lo mismo que las anteriores pero con los tres pines del principio.

Para probarlo, cargamos nuestro Sketch con Arduino y debería de ocurrir algo similar a esto:



¿Pero y Eagle?


En esta entrada cubrimos el funcionamiento básico de la lámpara, en la siguiente entrada examinaremos como crear nuestra propia tarjeta a partir de un diseño existente en Eagle y el proceso para mandar a manufacturar la PCB con OSHPark.

Así que no te pierdas la siguiente entrada...

Construyendo un Arduino Compatible pt1 - Diseñando la PCB 

Más información:


No hay comentarios: