Plataforma de desarrollo (práctica y barata) para microcontroladores


[exec]remove_filter(‘the_content’, ‘wpautop’);[/exec]

Lo bonito de hacer talleres y demás mandangas (bueno, una de las cosas bonitas) es que conoces gente. Una de las personas a las que hemos conocido últimamente es Ignacio, un joven escultor cuyas obras suelen incluir algún elemento móvil y/o luminoso.

Como es un joven inquieto, Ignacio vino al taller de microcontroladores que montamos en Medialab para averiguar como esos cacharritos podrían ayudarle a dotar sus esculturas de una cierta interactividad. Como es un escultor inquieto (léase ocupado), no tiene la base de conocimientos en electrónica necesarios para acometer ese tipo de proyectos, ni el tiempo necesario para adquirir ese conocimiento (tampoco es que haga falta tanto tiempo, pero ya sabes como son los artistas).

Total, que nos ha pedido que le echemos una mano (remunerada, que somos hippies pero no tanto). Como primer proyecto quiere utilizar un sensor de movimiento PIR para detectar cuando llega alguien a ver la escultura y que las luces se enciendan gradualmente. Cuando la gente se va, las luces deben apagarse. Gradualmente también, claro.

Así pues necesitamos algún tipo de microcontrolador que lea periódicamente (varias veces por segundo) el estado del sensor, lleve la cuenta del tiempo que ha pasado desde la última detección y se encargue de controlar las luces, aumentando y disminuyendo su intensidad poco a poco, según corresponda.

Con esas consideraciones (y alguna otra más), y tras unas semanas de pruebas y más pruebas he llegado a esto:

Como ves cumple perfectamente con las especificaciones, pero es capaz de mucho más. Te cuento qué, cómo y porqué  a continuación.

¿Qué?

Bueno, ¿que tenemos aquí entonces? Como ya he dicho, nuestro aparato no solo sirve para encender y apagar luces. El cerebro de la bestia es, en este caso, un microcontrolador ATMega88, funcionando a 1 MHz, totalmente programable y con acceso a 12 pines de entrada/salida (4 de ellos con conversores analógico/digital para poder leer valores arbitrarios de voltaje). Todo ello por entre 7 y 10 euros en materiales.

Placa desarrollo AVR- frente
No le he puesto nombre aún

El resultado final no es pues una solución para el problema especifico EncenderUnaLuzCuandoAlguienMira, sino una plataforma genérica de prototipado que, espero, permita el desarrollo de proyectos con microcontroladores de una manera rápida, sencilla y barata. Algo parecido a un Arduino, vaya.

¿Por qué esto?

Entonces, ¿por qué no usar un Arduino después de todo? O mejor, ¿por qué diseñar un sistema genérico para resolver un problema tan concreto? ¿No estoy complicando y encareciendo artificialmente el producto? ¿No es esto el equivalente electrónico al tour que les dan a los turistas cuando cogen un taxi en el aeropuerto?

Bueno, supongo que lo sería si uno cobrara dinero con ello. La cosa es que diseñar un circuito electrónico para una aplicación profesional lleva bastante tiempo. Terminas el primer prototipo sólo para descubrir que esta lleno de fallos, inconveniencias y complicaciones innecesarias, así que haces un segundo prototipo, que resuelve la mayoría de esos problemas, pero que plantea algunos nuevos y probablemente mucho más interesantes. Así que haces un tercer prototipo y… bueno, ya sabes por donde voy.

Luego está el software. Alguien tiene que programar ese micro (véase yo) y la depuración del programa no es precisamente trivial (no es fácil saber qué está pasando ahí dentro, después de todo uno no tiene una flamante pantalla que le muestre los mensajes de error que puedan ir apareciendo). Total que entras en un ciclo parecido al del diseño del circuito, sólo que haces muchos más cambios (aunque al menos no tienes que soldar en cada iteración).

O sea, que este tipo de cosas cuestan bastante trabajo. Más teniendo en cuenta que uno no es un profesional del ramo. Y claro, no es plan de currar gratis. Tampoco me parecía bien cobrarle a Ignacio por un trabajo que probablemente no tenga una calidad profesional de esas (que es la primera vez que hago esto), y que probablemente hubiera llevado mucho más tiempo del necesario por culpa de mi ineptitud.

¿Qué hacemos entonces? Bueno, lo primero es liberar el diseño del circuito y el código fuente, para que cualquiera pueda hacer uso (consideralo una pequeña retribución a la comunidad hacker y DIY que hace viable este blog). Lo segundo, publicarlo en Obsoletos. Así me saco un par de posts, que ya me va tocando.

Ignacio ya no tiene que pagarme el diseño, porque ya no es su único beneficiario, así que puedo hacerlo un poco más complejo sin que eso le perjudique. Tarde o temprano yo iba a tener que diseñar algo que me permitiera trabajar con los micros de una manera mínimamente cómoda. Y ya puestos, una plataforma genérica será mucho más útil para quien quiera que esté ahí fuera.

Total, que Ignacio y cualquiera que lea esto es libre de usar todo el material de este post como más le convenga, pero si te parece demasiado complicado y quieres que te lo suelde yo, te cobro la mano de obra. Fair enough 🙂

Pues muy bien, muy bonito todo, ¿pero que tiene de malo el Arduino? Es lo bastante genérico, ya viene montado y trae un entorno de desarrollo relativamente cómodo y sencillo. Bueno, no me malinterpretes, Arduino es una gran plataforma de iniciación, y simplifica mucho las primeras etapas de un proyecto, pero tiene sus pegas.

Arduinodiecimila400
Arduino Diecimila

Para empezar está la programación, efectivamente el lenguaje que usa es sencillo y puedes encontrar montones de librerías de funciones ya hechas que te facilitan aún más la vida, pero esa sencillez precisamente hace que sea terriblemente ineficaz. Cambiar el estado de un pin es 50 veces más lento si lo programas con el lenguaje de Arduino que si lo programas en C. Además, quieras que no soy yo el que va a escribir el código y después de media vida usándolo me siento mucho más cómodo con C.

Por otro lado Arduino no funciona bien en un objeto acabado. Los conectores están bien para meterles un cablecico y llevarlo hasta una protoboard donde tienes montado el resto del circuito, pero los cables se salen con facilidad cuando los mueves, solo hay un par de puntos donde acceder a la alimentación o a la tierra del Arduino, y para colmo la separación entre el pin 7 y el 8 no es estándar así que no puedes simplemente hacer tu circuito en una placa perforada estándar y pincharlo encima. Tienes que comprar un shield especifico o imprimir tus propias placas de circuitos. Ambas cosas bastante caras.

Y luego está el precio, claro. La última vez que miré, un Arduino costaba 40 pavos. No está mal si vas a tener uno para practicar, pero si vas a meter uno en cada objeto que produzcas la cosa cambia. En mi diseño he tratado de emplear el mínimo número de partes posible (9 en total), que todas sean fáciles de conseguir y que el conjunto sea fácil de montar. El resultado es que cualquiera puede conseguir los materiales al por menor por unos de 8 leuros y que se puede montar en algo menos de hora y media con lo que puedo vender el chisme montado y preparado por 20 (incluyendo el coste del material).

¿Por qué así?

Así que basicamente tenemos un ATMega88 rodeado por un puñado de conectores. Veamos para que sirven:

  1. El puerto de programación: Nos permite conectar la placa al ordenador, a través del puerto paralelo, para programarlo e intercambiar datos.

    Puerto de programación
    Puerto de programación
  2. El conector de alimentación: Se trata de un conector hembra estándar de 2’5 mm. Es un conector muy común entre los transformadores domésticos (nosotros hemos encontrado muchos en las fuentes de alimentación de los modems y routers) y como la placa lleva su propio 7805 nos permite usar casi cualquier fuente de tensión de entre 7 y 18 V.

    Conector alimentación
    Conector de alimentación
  3. Puerto de sensores: Porque todo robot asesino que se precie necesita una buena batería de sensores para localizar a sus víctimas. Este puerto ofrece conexiones a los pines 0 a 3 del puerto C del microcontrolador (los que tienen el conversor analógico/digital) para poder medir el estado de sensores tanto analógicos como digitales. Como además los sensores suelen estar separados entre sí y suelen necesitar alimentación cada columna del puerto incluye, además del pin de entrada, un contacto a tierra y otro a 5 V. De este modo, con un único cable (con 3 conductores) entre la placa y el sensor podemos transmitir tanto la energía necesaria para que funcione el sensor como los datos proporcionados por éste.

    ATMega puerto de Sensores
    Puerto de sensores
  4. Puertos de entrada y salida digital: Así que necesitas comunicarte con algún periférico. Para que tu controlador pueda hablar con un chip de memoria o un display LCD necesitarás usar varios pines a la vez. Estos dos puertos están hechos con 2 filas de 5 pines colocados de tal manera que puedes enchufar un conector de cable plano de 10 hilos en cada uno o un conector de 26 hilos en los dos a la vez. Entre los dos dan acceso a los pines del puerto D (uno a los pines 0 a 3, el otro a los pines 4 a 7). Así puedes acceder a todo el puerto D a la vez con un conector y un cable de 26 hilos (aunque se «desperdician» algunos cables) o conectar dos perifericos independientes que solo necesiten 4 pines. Cada uno de estos puertos ofrece además dos pines conectados a tierra, dos pines conectados directamente a la fuente de tensión (para poder alimentar directamente un motor o una luz, por ejemplo) y otro pin conectado a la tensión regulada de 5 V (que es el voltaje de alimentación típico de la mayoría de los componentes electrónicos).

    Puerto I/O digital
    Puerto I/O digital

Por lo demás todos los puertos tienen algún pin cortado u ocluido para que sus respectivos conectores sólo encajen de una manera (la correcta).

Cómo

Bueno, para llegar a contruir uno de éstos tú mismo necesitaras los siguientes materiales:

  1. Un trozo de placa perforada (perfboard).
  2. Un ATMega88 (Los ATMega48 y ATmega168 también valen y sólo se diferencian en la cantidad de memoria de que disponen).
  3. Un zócalo de 2×14 patas (para sujetar el microcontrolador).
  4. Un 7805 (proporciona la tensión regulada de 5V.
  5. Dos condensadores de 10 nF (uno es para «suavizar» un poco la tensión de alimentación y efiltrar otro para filtrar ruidos en las entradas de los conversores analógico/digitales).
  6. Un conector de alimentación de 2.5mm.
  7. Una pareja de tiras de pines dobles (macho y hembra).
  8. Una tira de pines acodados hembra.
  9. Algunos trozos de cable rígido.

Aparte de soldador y estaño necesitarás un taladro o una Dremel con una broca fina, porque las patas del conector de alimentación son demasiado gruesas para los agujeros de la placa perforada.

Por lo demás, ningún material en esa lista es muy caro y ninguno es especialmente difícil de encontrar. En algunas tiendas de electrónica igual no tienen los ATMegas pero puedes encargarlos y te los traen en un par de días (cuestan entre 2 y 3 euros cada uno).

Ahora que tienes todos los materiales necesitas el esquema del circuito. Aquí lo tienes, en toda su gloria electrónica:

Esquema eléctrico
Esquema eléctrico

No hay mucho que decir, simplemente se trata de conectar cada pin del micro al pitorro que le corresponda. A la hora de pasar esto a la placa perforada puede que te ayude echarle un vistazo antes a mi placa, así que aquí tienes una foto de la parte de abajo.

Placa desarrollo AVR- frente
Cara A
Placa desarrollo AVR - trasera
Cara B

Antes de ponerte a soldar recuerda que tienes que agrandar los agujeros para el conector de alimentación. Mejor ahora que no puedes dañar nada en el proceso. Empieza a soldar por los componentes que menos sobresalgan sobre la placa. Los cables, luego el zócalo y el puerto de programación, el resto de los puertos, los condensadores, el 7805 y, por último, el conector de alimentación.

No conectes todo entre sí hasta que todos los componentes estén sujetos. Luego puedes crear las pistas directamente con estaño sobre la placa. Cuando termines (antes de poner el micro en el zócalo) usa un polímetro para comprobar que no haya cortocircuitos.

Si todo esta bien puedes pasar a conectar cualquier transformador de esos que usa el router o el cargador de pilas. Sólo necesitas que suministre un voltaje de entre 7 y 18 Voltios.

El cable

Para programar a este pequeñín necesitaras un cablecico que lo conecte con tu ordenador. Por suerte es muy fácil construir uno. Éste es el programador más barato que hay y sirve para todo tipo de microcontroladores de AVR. Necesitaras:

  • Un trocito de placa perforada.
  • Un conector de puerto paralelo macho (DB-25).
  • 5 resistencias (entre 100 Ω y 1KΩ).
  • Cable plano de 5 conductores (yo uso el cable de los discos duros IDE y de las disqueteras, partiéndolo en tiras de la anchura que me interesa).
  • Una tira de pines acodados macho.

5 de los pines del puerto paralelo se van a usar para la comunicación entre el ordenador y el microcontrolador. La siguiente tabla muestra las equivalencias:

Puerto paralelo Señal en el programador
Pin 7 RESET
Pin 8 SCK
Pin 9 MOSI
Pin 10 MISO
Pin 18 Ground

Tomando el cable plano, tenemos que soldar cada conductor de uno de sus extremos a uno de esos pines del conector DB-25. El otro extremo del cable lo soldamos a la plaquita preforada, y en serie con las resistencias y la tira de pines como en la siguiente foto:

Programador AVR Pinout

El cable terminado encaja en el conector de programación de nuestra placa así:

Programador AVR conectado

Bueno, con esto ya puedes montar y programar tu propia plataforma de desarrollo para microcontroladores. En cuanto a la parte del ordenador, en este post puedes encontrar los paquetes necesarios para compilar y un par de programas de ejemplo.

Disclamer

Tras un par de meses de pruebas el chisme funciona bien y es bastante fiable, pero ten en cuenta que yo acabo de empezar en esto, como quien dice, y que probablemente el diseño aún tenga mucho margen para mejorar. Sugerencias y consejos son bienvenidos. De momento, necesitamos un nombre para el producto.

Ah, bueno, al final no he contado cómo hacer el detector de presencia del video. En fin, ya tenemos bastante información por hoy. En el proximo post te doy todos los detalles. Y para compensar por la espera, te comentaré un par de proyectos sencillos más. Mientras tanto, puedes ir calentando el soldador.


2 respuestas a “Plataforma de desarrollo (práctica y barata) para microcontroladores”

  1. «De momento, necesitamos un nombre para el producto»: ¿Openbot? ¿Tobnepo? ¿Cogolius? ¿Cogobot? ¿Antonio? ¿Yunegimeyumo(YouNeverGiveMeYourMoney)?