Juan A. Castro

Desde el campo hasta las estrellas

Etiqueta: Electrónica

Arduino: Cómo usar varios pines digitales en una sola instrucción

Para quien no lo sepa, y por ser el primer post sobre Arduino en el blog, Arduino es una plataforma de electrónica abierta para la creación de prototipos basada en software y hardware flexibles y fáciles de usar. Se creó para artistas, diseñadores, aficionados y cualquiera interesado en crear entornos u objetos interactivos [1]. Es decir, “hardware libre”, por utilizar una similitud con el “software libre”.

Hay mucha información en Internet de cómo aprender a manejar el dispositivo, con muchos ejemplos explicados casi paso a paso, además de video-tutoriales. Sin embargo, no todo está fácilmente accesible, o simplemente no está puesto de una forma suficientemente clara para alguien que está iniciándose, como por ejemplo, cómo se hace para enviar más de un bit a la vez a los puertos de salida digital, que es de lo que me ocuparé en esta entrada.

Para averiguarlo, tuve que mirar el esquemático de mi antiguo Duemilanove™ [2] y las palabras reservadas del lenguaje [34]. El resultado es que, efectivamente, se pueden manejar los puertos directamente, y la forma, para manejar como salida la expondré aquí:

0.- ¿Qué puertos podemos utilizar?

Para los ATmega8 y los ATmega168, tenemos los siguientes puertos:

  • B: pertenece a los pines digitales 8 a 13. Como tiene realmente 6 pines, los dos bits más significativos no se usan.
  • C: pertenece a los pines de las entradas analógicas. En éste post no lo trataré.
  • D:  pertenece a los pines digitales 0 a 7.

1.- Configurar los pines digitales deseados como entrada/salida.

Para ello podemos hacerlo de uno a uno con la tradicional instrucción pinMode(pin, OUTPUT) con cada uno de ellos o modificar el registro DDR asociado al puerto completo. En el siguiente ejemplo se muestra cómo hacerlo usando el puerto D:

Sin embargo, también hay una forma de cambiar la configuración del puerto de forma segura, cuando vas a usar un subconjunto, sin afectar al resto de pines: Usando máscaras y operaciones lógicas, la operación OR para modificar como salida digital, y la AND para modificar como entrada digital, de la siguiente manera:

Si tenéis dudas en el uso de los operadores a nivel de bit, podéis consultar [5].

2.- Lectura y escritura usando los puertos directamente.

Tanto la lectura como la escritura de un puerto digital se hace de forma análoga al registro DDR, y al igual que con ese registro, recomiendo el uso de máscaras. Obviamente se puede usar tanto binario, decimal como hexadecimal en las operaciones, aunque para el ejemplo esté usando únicamente hexadecimal.

Las máscaras en el caso anterior son 0xF0 y 0x0F.

También cabe recordar que el negador a nivel de bit en Arduino es “~”, y que, en nuestro caso de ejemplo, podríamos usar de la siguiente manera obteniendo idéntico resultado:

Bibliografía

[1] http://arduino.cc/en/
[2] http://arduino.cc/en/uploads/Main/arduino-duemilanove-schematic.pdf
[3] http://www.arduino.cc/en/Reference/PortManipulation
[4] http://chip-yang.myweb.hinet.net/Keywords.html
[5] http://playground.arduino.cc/Code/BitMath

 

Hardware Libre: ¿Qué es? ¿Qué hay?

En esta primera entrada, pretendo introducir qué se conoce como hardware libre. Hay muchas definiciones sobre qué es el hardware libre, pero si se entiende qué es el software libre, y la diferencia que hay entre libre y gratuito, ya habrás entendido qué es simplemente por similitud.

De todas formas, la definición que más me gusta de todas es la que aparece en OSHWA [1] (Open Source Hardware Association):

[…] es aquel hardware cuyo diseño se hace disponible públicamente para que cualquier persona lo pueda estudiar, modificar, distribuir, materializar y vender, tanto el original como otros objetos basados en ese diseño.[…]

Obviamente, al igual que pasa con el software libre, cada cuál quiere darle un tipo diferente de protección a sus creaciones, y por ello hay variantes que ceden unos u otros derechos.

Pese a que, en principio me centraré casi con toda seguridad en placas Arduino [2] (UNO rev3 y Leonardo) e Intel Galileo [3] (aunque ésta no es HW libre, pero usa SW libre), aquí expondré una especie de estudio del estado del arte sobre otros proyectos que se están desarrollando o se han desarrollado con hardware libre.

Logo de OSHWA

Logo de OSHWA

Además de los ya archiconocidos Arduino [2] y Raspberry Pi [4], con todos sus clones y versiones, hay otros proyectos muy, muy interesantes.

RepRap Project [5], una impresora 3D “capaz” de replicarse, pudiéndose usar para imprimir una gran parte de sus componentes. Este proyecto fue iniciado por Adrian Bowyer y algunos de sus compañeros de la Universidad de Bath (Reino Unido).

Tenemos también Project Ara [6], iniciativa de Phonebloks [7], que hizo un llamamiento para hacer un smartphone modular y construido por piezas para que cada usuario pueda adaptarlo a sus necesidades. A Google le ha gustado la idea, y ha montado una plataforma para los desarrolladores.

Por otro lado está Novena [8], todo un portátil que sigue esta filosofía, obviamente no puedes esperar que los detalles estén tan bien depurados como los ultrabooks, pero la idea de que tengas acceso tanto al software como al hardware y que tenga integrado una FPGA [9], es más que interesante.

Por último, no podía cerrar este apartado sin hablar de otro proyecto que entra dentro de mi ámbito de estudio, OpenEEG [10]. Este proyecto busca crear un dispositivo para la lectura de electroencefalograma (EEG) [11] con software también abierto.

Obviamente hay muchos más proyectos, pero sólo cité los que me parecieron más interesantes y que pueden despertar la curiosidad por la temática. Además de proyectos completos, también se comparten componentes específicos. En OpenCores [12] podéis encontrar una gran gama de diseños.

Bibliografía

[1] http://www.oshwa.org/definition/spanish/
[2] https://www.arduino.cc/
[3] http://www.intel.es/content/www/es/es/do-it-yourself/galileo-maker-quark-board.html
[4] https://www.raspberrypi.org/
[5] http://reprap.org/wiki/RepRap
[6] http://www.projectara.com/
[7] https://phonebloks.com/
[8] http://www.kosagi.com/w/index.php?title=Novena_Main_Page
[9] https://es.wikipedia.org/wiki/Field_Programmable_Gate_Array
[10] http://openeeg.sourceforge.net/
[11] https://es.wikipedia.org/wiki/Electroencefalograf%C3%ADa
[12] http://opencores.org/

Creado con WordPress & Tema de Anders Norén