0% encontró este documento útil (0 votos)
443 vistas84 páginas

Especial Hardware

Cargado por

Gloria Mora
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
443 vistas84 páginas

Especial Hardware

Cargado por

Gloria Mora
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd

DVD “LIVE”

■ Herramientas de desarrollo HARDWARE


Manual práctico de hardware libre
■ Código de los artículos
■ Raspbian para Raspberry Pi
Más detalles en pg. 3

HARDWARE
Incluye:
Índice temático
Recursos útiles
Manual practico de iniciación y proyectos Guía de compra

ABRIL 2013
Península
y Baleares 6,95 €
PROYECTOS

8 ARDUINO
COMPLETOS
Canarias 7,05 €

MANERAS DE

5 APROVECHAR TU
RASPBERRY PI

l
Especia
wn
l Bro
Pau

00007

■ Instala sensores en tu coche


Tu Guía Práctica ■ Descubre el Internet de las cosas
Aprende de expertos ■ Comunica tu RPi con tu Arduino
8 413042 594529

profesionales y de sus ■ Iníciate con placas de aprendizaje


ejemplos del mundo real ■ Monitoriza tu casa desde el móvil

WWW.LINUX- MAGAZINE.ES
OpenSUSE 12.2 DVD/EDITORIAL

¡Revolución!
Ya he perdido la cuenta de por qué revolución industrial vamos.
Creo que formalmente la tercera. La primera sería la industriali-
zación británica de finales del XIX, a base de aparatos de
vapor y una industria textil y minera servida por niños.
La segunda, la de las cadenas de montajes, producción
en masa automatizada de Henry Ford et al, en los 70
y 80 llegó la tercera ola con el comienzo de la popu-
larización de los ordenadores, tanto a nivel parti-
cular, como empresarial e institucional.
La cuarta revolución es la que estamos
viviendo ahora y es la que casi completa el
círculo. Del artesanado preindustrial, hemos
pasado a la industrialización. De ahí, evolu-
cionamos hacia la informatización industrial.
Y ahora volvemos al artesanado, esta vez
informático. Gracias a los movimientos del
software y hardware libres, cualquiera, sea
empresa grande, mediana o pequeña, grupo
de desarrollo independiente, o un único indivi-
duo a solas en su sótano, tiene acceso y puede
modificar y explotar herramientas informáticas,
ya sean lógicas o físicas, que antaño sólo eran
accesibles a grandes corporaciones.
El tema del software ya lo tratamos en profundidad
en nuestra revista mensual Linux Magazine, pero si
quieres formar parte del otro brazo de la revolución, el del
hardware libre, el especial que sostienes entre las manos es
un buen sitio para empezar.
Nos vemos en la quinta revolución industrial, que a saber que
aspecto tendrá. ■

OpenSUSE 12.2 – Especial Hardware


A la hora de plantearnos un disco a incluir con este especial, Asimismo, se ha incluido todo el código que aparece en la
decidimos que tenía que ser igual de práctico que el resto de la revista en carpetas debidamente etiquetadas en el directorio
publicación. Por ello, buscamos una distro Linux que contuviera personal del usuario, así como una imagen de la última versión
preinstaladas las herramientas y aplicaciones necesarias para del sistema preferido para el Raspberry Pi, Raspbian, lista para
seguir lo expuesto en cada uno de los artículos. Y nada más. ser copiada a una tarjeta SD.
Aparte de eso, tenía que ser muy estable y que se pudiera ejecu- Para hacer esto, inserta tu tarjeta SD en tu ordenador y consulta
tar desde el mismo disco en modo “Live” para que el usuario dmesg para averiguar qué nombre de dispositivo se le ha asig-
pudiera simplemente insertarlo en cualquier equipo donde estu- nado:
viera e, inmediatamente, tener a su disposición todo lo que le $ dmesg
hiciera falta para empezar a trabajar con Arduino y Raspberry Pi. [...]
Cómo no había ninguna distro que nos ofreciera exactamente lo [25609.840466] sdb: sdb1
que necesitábamos, decidimos construir una desde cero. Con la [25609.843193] sd 6:0:0:0: [sdb] No Caching mode page
ayuda de los ingenieros de OpenSUSE, y a partir de su muy present
[25609.843202] sd 6:0:0:0: [sdb] Assuming drive cache:
estable versión 12.2, quitamos todo lo que considerábamos
write through
innecesario (juegos, LibreOffice, programas de diseño artís- [25609.843208] sd 6:0:0:0: [sdb] Attached SCSI removable
tico… dejamos un navegador para poder consultar cosas en disk
Internet) y le metimos programas como Fritzing, para el diseño La imagen de Rasbpian está en el directorio raíz (/) y puede insta-
de circuitos; el IDE de Arduino que puedes arrancar escribiendo larse en la tarjeta (suponiendo que sea sdb) introduciendo:
$ arduino $ sudo dd if=2013-02-09-wheezy-raspbian.img of=/dev/sdb
en la línea de comandos de una ventana terminal; o la librería Hay más, pero, como lector de este especial, te imaginamos
Serial para Python, que permite enviar señales a y recibir seña- curioso y explorador, por lo que dejaremos que descubras por ti
les de un dispositivo Arduino o similar a través del puerto USB. mismo las aplicaciones de nuestro DVD.

W W W. L I N U X - M A G A Z I N E . E S HARDWARE 3
CONTENIDO Hardware

Plataformas Arduino

06 Contacto FíSico 16 Colibrí 36 Centro de Control


La tarjeta Arduino es ideal para expe- El Hummingbird combina las ideas de Podemos manejar casi cualquier dis-
rimentar con ordenadores físicos. Arduino con los juguetes de construc- positivo eléctrico/electrónico de nues-
Mostramos como ejemplo cómo crear ción para traer el concepto de “cons- tro hogar, sin necesidad de estar allí
un simple temporizador. truye tu propio hardware” al ámbito para activarlo.
educativo.

Arduino
20 Electrónica Diferente
Arduino es una manera sencilla y
divertida de iniciarse en el mundo de
la electrónica y una oportunidad de
llevar tus ideas al mundo real.

10 Deliciosa Baya 24 Controlando El Entorno


El Raspberry Pi, el micro-ordenador Aprendemos a monitorizar e interac- 40 Seguridad en el Hogar
de moda en la comunidad de software tuar sobre el entorno con Arduino. Con sencillos montajes electrónicos,
libre, abre la puerta a una nueva era conseguiremos un sistema de vigilan-
de la informática de entretenimiento, cia para nuestro hogar a un precio
los sistemas embebidos e incluso de la muy asequible.
alta computación de bajo coste.
44 Plantas que Hablan
12 Placa De Aprendizaje Todos tenemos alguna planta en nues-
Para aprender sistemas Linux empo- tra casa y aunque se consideran seres
trados no necesitas ser un genio, vivos casi autosuficientes, necesitan
como demuestra claramente la placa ciertos cuidados por nuestra parte
Gnublin. Si estás interesado en apren- para sobrevivir. Con unos sensores
der a leer sensores, conmutar inte- Arduino y un poco de programación,
rruptores y LEDs en un ARM Linux, se los podemos proporcionar.
esta pequeña máquina es perfecta
para tu investigación. 50 Prevención
Utilizamos Arduino para alertarnos de
30 Hogar en Red peligros de accidentes en el hogar.
Otras Secciones El concepto de “Internet de las Con Arduino podemos saber de
cosas”, a pesar de tener un ligero tono manera inmediata y remota si hay
03 DVD OpenSUSE Esp. Hardware
futurista, está vivo en nuestro entorno escapes de gas, incendios o inundacio-
82 Información de Contacto creciendo cada día más. nes en nuestra casa.

4 HARDWARE W W W. L I N U X - M A G A Z I N E . E S
Hardware CONTENIDO

Arduino Raspeberry Pi

54 Cuida tu Coche 68 Ser-Pi-Dor


No todos tenemos un coche de última Con la ayuda de las aplicaciones des-
generación con el que deleitarnos, critas aquí, el Raspberry Pi puede lle-
pero podemos modernizarnos con la var a cabo una amplia variedad de
ayuda de nuestro Arduino. tareas como servidor.

Raspeberry Pi
59 Pi Perfecto
Os mostramos cómo comenzar a
cacharrear con el asequible Raspberry
Pi y Linux. 74 Combinados
Lo que se puede crear a partir de la
63 Pi2 unión de estas dos placas open hard-
El Raspberry Pi facilita la experimen- ware es algo que se está empezando a
tación en sistemas Linux empotrados. explorar ahora. Explicamos cómo
Mostraremos algunos ejemplos prácti- abrir un canal de comunicación desde
cos de cómo utilizar el Raspberry Pi la Raspberry Pi directamente a un
en un entorno cotidiano. Arduino.

RECURSOS
Descubre lo que hay más
allá de este especial con
nuestra guía.

Tiendas 77
.3
Sitios 78 en pág
n
rmació
Editoriales y Publicaciones 79 info
Ver
Indice Temático 80

W W W. L I N U X - M A G A Z I N E . E S HARDWARE 5
PLATAFORMAS Arduino

Introducción a Arduino

Contacto
Físico
Fantasista - 123RF.com

La tarjeta Arduino es ideal para experimentar con ordenadores físicos. Mostramos como ejemplo cómo crear un simple temporizador.

Por Dimitri Popov

El sitio web del proyecto describe a dor de a bordo para llevar a cabo distin- más que simplemente una herramienta
Arduino como “una plataforma de elec- tas acciones con los actuadores conecta- educativa. Podemos usar la tarjeta para
trónica abierta para la creación de proto- dos a los pines digitales de salida de la crear todo tipo de soluciones inteligen-
tipos basada en software y hardware fle- tarjeta. tes, desde una alarma activada por movi-
xibles y fáciles de usar”, lo cual no suena La parte de programación se lleva a miento, hasta un disparador de fotos
muy excitante. A pesar de ello, esta dimi- cabo en el entorno de desarrollo inte- activado por rayos (de los de “rayos y
nuta y barata plataforma nos permite grado (IDE) de Arduino, el cual usa un truenos”) para nuestra cámara DSLR.
construir todo tipo de proyectos increí- lenguaje de programación basado en Existe la posibilidad de comprar dife-
bles – y sin la necesidad de saber soldar. Processing [2] relativamente fácil de rentes modelos de Arduino, siendo el
Arduino [1] es básicamente una tarjeta aprender. De modo que, aún sin tener más pequeño también el más abarato,
que puede ser programada para contro- ninguna experiencia en programación, con un coste de unos 30 dólares, de
lar diferentes actuadores (motores, luces, podemos aprender rápidamente lo modo que no nos va a costar un ojo de la
etc.) según la entrada que recibe de sen- básico. La sección Referencia del sitio cara iniciarnos en el excitante mundo de
sores conectados a ella. Prácticamente web de Arduino contiene una detallada la computación física. Es probable que
cualquier sensor puede conectarse a la referencia del lenguaje para poder también deseemos añadir a nuestra lista
tarjeta/placa Arduino – una fotoresisten- comenzar, pudiéndose usar la versión de la compra una placa protoboard, un
cia, un sensor de movimiento, un sensor PDF libre del Arduino Programming conjunto de cables puente, un par de
de temperatura o un sensor de presión – Notebook [3] como otra referencia rápida LEDs y resistencias. Usando una proto-
y se puede programar el microcontrola- y práctica. board, podemos crear proyectos basados
Los programas de Arduino reciben el en Arduino sin la soldadura de compo-
El Autor nombre de bocetos y podemos escribir, nentes – una solución perfecta para
Dmitri Popov es licenciado en Lengua depurar y cargarlos a la tarjeta usando el experimentar.
Rusa y en lenguajes de computación. Ha entorno de desarrollo gráfico. Arduino se
estado escribiendo sobre Linux y soft- desarrolló como una solución para intro- Preparativos
ware de código abierto durante años y ducir a la gente en el mundo de la com- Lo primero es instalar el entorno de
sus artículos han aparecido en revistas y putación física (creación de sistemas físi- desarrollo en nuestro sistema para escri-
sitios web daneses, británicos, norteam- cos interactivos que pueden detectar y bir bocetos y subirlos a Arduino. Si esta-
ericanos, alemanes y rusos. responder al mundo analógico), pero es mos ejecutando Ubuntu o alguna de sus

6 HARDWARE W W W. L I N U X - M A G A Z I N E . E S
Arduino PLATAFORMAS

Figura 1: El IDE de Arduino no es una maravilla, pero es utilizable.

derivadas, instalar el software requerido (cualquiera entre Figura 2: Gnoduino proporciona una alternativa muy lograda al IDE
es tan fácil como ejecutar: los 200 y 680 ohms) estándar de Arduino.
y dos cables conec-
sudo apt-get install arduino tores. La resistencia es opcional y se uti- componentes en ella y cableándolos
liza para limitar y prevenir daños al LED. (Figura 3). La colección central de com-
Este comando instala el IDE estándar de ponentes en la paleta Parts incluye los
Arduino escrito en Java (Figura 1). Este Esquemas con Fritzing numerosos componentes esenciales:
IDE sirve, pero no se integra muy bien Antes de colocar los componentes en el desde resistencias e interruptores, hasta
con el escritorio Linux. Afortunada- protoboard y conectarlos, es buena idea LEDs y varios sensores. Fritzing también
mente, el proyecto Gnoduino [4] propor- dibujar un esquema para usarlo como nos permite importar colecciones de
ciona una alternativa muy eficiente y de referencia. Aunque podemos usar lápiz y componentes de terceros al cubo de
peso ligero diseñada específicamente papel, existe una herramienta mejor lla- componentes. Para hacerlo, elegimos
para el entorno de escritorio Gnome mada Fritzing [7]. Este software ofrece File | Parts Bin | Open y seleccionamos la
(Figura 2). un entorno gráfico completo para pro- colección que deseemos. Incluso pode-
Gnoduino ofrece soporte para diálogos yectos Arduino, y podemos usarlo para mos diseñar nuestros propios compo-
nativos y una renderización de fuente diseñar trazados de placa, esquemas y nentes en Fritzing. La página Creating
mejorada, junto con una práctica funcio- tarjetas de circuito impresas (PCBs). Custom Parts [8] del sitio web ofrece
nalidad de numeración de líneas. Gno- Usar Fritzing para este simple proyecto varios recursos para ayudarnos con esto.
duino está escrito en Python, y los usua- puede parecer exagerado, pero cuando Una vez que hayamos situado un com-
rios de Ubuntu pueden instalarlo nuestros diseños Arduino sean más avan- ponente en la placa, podemos modificar
mediante su PPA dedicada [5], usando zados, apreciare-
los siguientes comandos: mos las capacida-
des y herramientas
sudo add-apt-repository U de Fritzing. No
ppa:pmjdebruijn/gnoduino-release requiere instala-
sudo apt-get update ción. Para hacernos
sudo apt-get install goduino con la última ver-
sión, vamos al sitio
A continuación conectamos la tarjeta web del proyecto,
Arduino a nuestra máquina, y ya esta- desempaquetamos
mos listos para comenzar a trabajar en el archivo descar-
nuestro primer proyecto. gado y ejecutamos
Podemos crear todo tipo de artilugios el script Bash Frit-
con Arduino, pero para entender cómo zing.sh en el direc-
funciona todo, lo más sensato es empe- torio resultante
zar por algo simple. De modo que, des- para iniciar la apli-
cribiré cómo crear un temporizador sin cación.
lujos para practicar la técnica Pomodoro La vista placa en
[6] de gestión del tiempo. Fritzing nos per-
Para este proyecto necesitaremos tres mite crear diseños Figura 3: Fritzing ofrece un entorno gráfico para la creación de dise-
componentes: un LED, una resistencia de placa situando ños para Arduino.

W W W. L I N U X - M A G A Z I N E . E S WWW.LINUX- MAGAZINE.ES HARDWARE 7


PLATAFORMAS Arduino

sus propiedades en la paleta Inspector. y cogiendo y arrastrando con el ratón Fritzing para diseñar un PCB para nues-
Por ejemplo, podemos especificar la tole- para doblarlos. tro proyecto. De esta manera, podemos
rancia, resistencia y espaciado de pines Mientras trabajamos en el diseño de la convertir nuestro prototipo en un pro-
para resistencias, y color y tamaño para placa, Fritzing genera en el fondo un ducto de verdad o en una placa Arduino
LEDs. Para conectar los componentes esquema de cableado de nuestro pro- (Figura 5). Mejor aún: el servicio Fritzing
usando cables conectores, pulsamos con yecto, que podemos ver cambiando a la Fab [9] puede fabricar PCBs listos para
el botón derecho del ratón sobre el soc- vista Schematic (Figura 4). Todas las usar basados en nuestro diseño.
ket de la placa deseada, luego arrastra- conexiones entre componentes se consi- Por ahora, sin embargo, nos limitare-
mos el ratón al socket de destino mien- deran provisionales y se muestran como mos a usar Fritzing para crear un diseño
tras mantenemos pulsado el botón dere- finas líneas, siendo necesario usar el de placa para el temporizador similar al
cho del ratón. Después, podemos cam- ratón para cablear los componentes. que aparece en la Figura 3. Luego, pode-
biar el color del cable añadido en la Hacer esto manualmente puede ser un mos usarlo como una guía para cablear
paleta Inspector para hacer que el diseño poco (o muy) arduo, especialmente los componentes en un placa real y
de la placa sea más claro. Por defecto, cuando trabajamos en un diseño com- conectarlos a Arduino para completar el
Fritzing añade cables rectos, lo cual plejo. Afortunadamente, Fritzing propor- proyecto de hardware.
puede ser bastante frustrante cuando se ciona una buena solución: la funcionali-
trabaja con diseños complejos. Podemos dad Autoroute puede cablear componen- Escribir un Boceto
doblar los cables pulsando la tecla [Ctrl] tes automáticamente para nosotros. El paso siguiente es escribir un esquema
Los resultados para el temporizador. Necesitamos pro-
pueden no ser gramar Arduino para poner en marcha
correctos a veces, un LED cada 25 minutos para que nos
pero en la mayo- indique que es hora de descansar. Para
ría de las ocasio- hacer que las cosas sean un poco más
nes, la funcionali- interesantes, podemos hacer que el LED
dad lo hace bien. parpadee cinco veces antes de que se
Además, pode- ponga en marcha para atraer nuestra
mos ajustar y atención. Para comenzar, ponemos en
optimizar el marcha el IDE Arduino o Gnoduino e
cableado gene- introducimos el boceto del Listado 1.
rado automática- ¿Cómo funciona este esquema? Como
mente de forma cualquier programa o script, el primer
manual si fuera asunto es definir variables para usarlas
necesario. Frit- en el programa. En este caso, la declara-
zing también nos ción int var = 0 define la variable var (la
permite exportar cual actuará como un contador) y pone
el esquema de su valor a cero. Adicionalmente, cual-
cableado a distin- quier boceto Arduino ha de contener dos
Figura 4: Fritzing también genera un esquema de cableado basado en el tos formatos. bloques. La función setup() contiene el
diseño de la placa. Podemos guar- código que se ha de ejecutar una vez al
darlo como un principio del programa, mientras que la
fichero de imagen función loop() contiene el programa en
con File | Export | sí, el cual se ejecuta una y otra vez.
As image, que A diferencia de un ordenador regular,
soporta PNG, Arduino no puede ejecutar múltiples
SVG, PDF y otros programas y los programas no pueden
formatos. Tam- cerrarse. Cuando encendemos Arduino,
bién podemos éste ejecuta el código, deteniéndose sola-
usar File | Export mente cuando desenchufamos la tarjeta.
| List of parts (Bill En este caso, la función setup() inicializa
of Materials) para el pin digital número 13 como salida
generar una lista usando la declaración pinMode(13, OUT-
de la compra bien PUT). Esto permite al boceto controlar el
formateada de LED conectado al pin 13.
todos los compo- La función loop() contiene el pro-
nentes usados en grama en sí, el cual se puede dividir en
el proyecto. más o menos dos partes. La primera
Por si esto no parte es el bucle while, que enciende el
fuera suficiente, LED (la instrucción digitalWrite(13,
Figura 5: Usando Fritzing, podemos diseñar trazados para PCB. podemos usar HIGH), espera un segundo (instrucción

8 HARDWARE W W W. L I N U X - M A G A Z I N E . E S
Arduino PLATAFORMAS

Más Allá
Listado 1: Temporizador Aunque el temporizador basado en
01 int var = 0; Arduino mostrado aquí es bastante
02
simple, podemos mejorarlo. Por ejem-
03 void setup() {
04 pinMode(13, OUTPUT);
plo, añadiendo un segundo LED al pin
05 } digital 9 y volviendo a escribir el
06 esquema de modo que haga que el pri-
07 void loop() { mer LED parpadee antes de encender el
08 while(var < 5){ segundo LED (véase el Listado 2). En
09 digitalWrite(13, HIGH); vez de usar un segundo LED, podemos
10 delay(1000); conectar un altavoz y programar
11 digitalWrite(13, LOW);
Arduino para que reproduzca un tono o
12 delay(1000);
una simple melodía. En resumen, tene-
13 var++;
14 } mos muchas opciones para ajustar y
15 digitalWrite(13, HIGH); mejorar este simple temporizador. Y,
16 delay(15000); una vez que hayamos dominado lo
17 var = 0; básico, podemos trabajar en proyectos
18 digitalWrite(13, LOW); basados en Arduino más complejos y
19 delay(1500000); excitantes. ■
20 }

Recursos
delay (1000)), apaga el LED (instrucción
[1] Sitio web oficial de Arduino en espa-
digitalWrite(13, LOW)), espera otro ñol: http://www.arduino.cc/es/
segundo y luego incrementa el contador
[2] Lenguaje de programación de pro-
en 1 (instrucción var++). El bucle se
ceso: http://processing.org
ejecuta hasta que el valor de var es 5 (lo
[3] Notebook de programación de
que significa que el LED parpadea cinco
Arduino:
veces). Una vez que el valor de var
http://www.lulu.com/product/
alcanza 5, entra en acción la segunda file-download/arduino-programming-
parte del programa, enciende el LED, notebook/3524028
espera 15 segundos, apaga el LED y
[4] Gnoduino:
espera durante 25 minutos. http://gnome.eu.org/evo/index.php/
Para comprobar si el boceto contiene Gnoduino
errores, pulsamos el botón Verify en el
[5] PPA Gnoduino:
IDE de Arduino. Si todo ha ido sin pro- http://launchpad.net/~pmjdebruijn/
blemas, deberemos ver Binary scheme +archive/gnoduino-release
size: 1086 bytes (of a 32256 mazimum)
[6] Técnica Pomodoro:
(el tamaño del boceto puede variar) en el http://www.pomodorotechnique.com
panel de la consola. En caso contrario,
[7] Fritzing:
veremos un mensaje de aviso indicando http://fritzing.org
los errores en el boceto. Finalmente,
[8] Partes a medida de Fritzing:
podemos pulsar Upload para cargar el
http://fritzing.org/learning/tutorials/
boceto en Arduino. La tarjeta comenzará creating-custom-parts
a ejecutar el código inmediatamente.
[9] Fritzing Fab:
Felicidades, nuestro primer proyecto
http://fab.fritzing.org/fritzing-fab
Arduino está funcionando.

Listado 2: Boceto de Temporizador Mejorado


01 int var = 0; 12 digitalWrite(13, LOW);
02 13 delay(1000);
03 void setup() { 14 var++;
04 pinMode(9, OUTPUT); 15 }
05 pinMode(13, OUTPUT); 16 digitalWrite(9, HIGH);
06 } 17 delay(15000);
07 18 var = 0;
08 void loop() { 19 digitalWrite(9, LOW);
09 while(var < 5){ 20 delay(1500000);
10 digitalWrite(13, HIGH); 21 }
11 delay(1000);

W W W. L I N U X - M A G A Z I N E . E S HARDWARE 9
PLATAFORMAS Raspberry PI

El micro-ordenador de bajo coste Raspberry Pi

Deliciosa

Alexandr Pakhnyushchyy - 123RF.com


Baya
El Raspberry Pi, el micro-ordenador de moda en la comunidad de software libre, abre la puerta a una nueva era de la informática de entre-

tenimiento, los sistemas embebidos e incluso de la alta computación de bajo coste. Por Paul C. Brown

El aparato vino en un sobre ligeramente Lo acompañaban dos hojas de papel, (teclado, ratón, cable de red y pantalla a
acolchado que el cartero embutió a pre- una que describía el hardware y la través del puerto HDMI – que soporta
sión en nuestro buzón. No conociendo configuración por defecto del usuario sonido por HDMI), se enciende enchu-
las feas costumbres de los funcionarios (pi) y contraseña (raspberry), y la otra fando la alimentación a su puerto
de correos españoles, los remitentes no con la descripción del software. También microUSB. Este puerto es idéntico a los
habían pensado en adornar el sobre con venía con una tarjeta SD que contenía el que se encuentran en muchos móviles y
pegatinas y advertencias sobre la fragili- sistema operativo, una Debian compi- no es el único parecido que comparte el
dad del contenido. lada para ARM del aparato, con el escri- RP con un smartphone, como después
Tampoco es que hubiera servido de torio LXDE y varias aplicaciones para veremos. Para desconectar el RP, se des-
mucho, pero afortunadamente, cuando pruebas. conecta el cable USB del alimentador y
abrimos el envoltorio, el Raspberry Pi [1] listo.
que nos enviaron para su evaluación Zumo de Frambuesa El software suministrado demuestra
estaba entero y aparentemente sin nin- El Raspberry Pi viene pelado, sin caja ni que el RP es extraordinariamente respon-
gún tipo de daño. alimentador de corriente. Por no traer, ni sivo en tareas de procesamiento de vídeo
El dispositivo suministrado por la Fun- siquiera trae un botón de encendido. Una y renderizado 3D. Probamos reproducir
dación Raspberry Pi es el denominado vez conectados todos los periféricos una película en XBMC y jugar a Quake 3,
Modelo B, que cuenta con 2 puertos USB
(frente a 1 del Modelo A) y un puerto Tabla 1: Características Técnicas
RJ45 de red (el Modelo A no cuenta con Procesador (CPU) ARM1176JZF—S a 700 MHz
conector de red). En la Tabla 1 se puede Chip gráfico (GPU) Broadcom VideoCore IV,OpenGL ES 2.0, decodificador de alto perfil
ver un resumen de sus especificaciones 1080p h.264/MPEG—4 AVC
técnicas. RAM 256 MBs (compartido con GPU)
Puertos USB 2.0 2 (hub USB integrado)
Salidas de vídeo RCA Compuesto (PAL y NTSC), HDMI (rev 1.3 y 1.4), y paneles LCD a a
través de DSI, resoluciones HDMI desde 640x350 hasta 1920x1200 más
varios estándares PAL y NTSC
Salidas de audio jack de 3.5 mm, HDMI
Almacenamiento a través de lector tarjetas SD / MMC / SDIO
Conector de red 10/100 Ethernet (RJ45)
Fuente de energía 5 voltios a través de MicroUSB
Tamaño 85.60 x 53.98 mm
Peso 45 g (1.6 oz)
Figura 1: Contenido del “pack” de evaluación Sistemas operativos Debian GNU/Linux (incluido en tarjeta SD de 4Gbs), Fedora, Arch Linux,
de Raspberry Pi remitido a Linux Magazine. RISC OS

10 HARDWARE W W W. L I N U X - M A G A Z I N E . E S
Raspberry PI PLATAFORMAS

Figura 2: El RP utiliza tecnología System on Figura 3: El RP arranca una versión de Figura 4: En primer plano el conector HDMI,
a Chip con CPU, GPU y RAM en un solo chip. Debian compilada para ARM 11. que soporta audio sobre HDMI.

y RP fue capaz de proyectar “Big Buck un NDA (Non Disclosure Agreement – Conclusiones
Bunny” en HD de 1080p (lo que se Acuerdo de Confidencialidad) y explicar Por 35 $ / 27 € el Raspberry Pi es una
conoce como Alta Definición Verdadero, cómo vas a utilizar el hardware y cuán- ganga y el aparato cumple totalmente
es decir, no entrelazado) y de ejecutar el tos miles vas a encargar. Es decir, las con las expectativas que ha creado. Si
juego a un buen número de frames por especificaciones sólo se distribuyen a bien es un poco decepcionante el hecho
segundo sin saltos ni ningún tipo de fallo fabricantes de hardware. de que no todo el hardware estará docu-
[2]. Más adelante se planea publicar un mentado, no hay que perder de vista lo
Es evidente que el RP podrá servir datasheet de lo revelable del chip y que es: una prueba de concepto, un pro-
excelentemente como base de un centro esquemas del resto del dispositivo, pero, totipo para desarrolladores e investigado-
de entretenimiento doméstico y para el aunque el coste y rendimiento del hard- res. El hecho de que venga sin ningún
cometido original para el cual fue conce- ware de Broadcom es el que se necesita tipo de protección así lo indica y, como
bido, es decir, como máquina educativa para el proyecto, su naturaleza cerrada concepto, esperamos que inicie una ten-
en centros escolares. impedirá crear clones de manera inme- dencia en la computación de bolsillo de
diata. muy bajo coste e incluso una nueva área,
No Todo es Color de Mora Otra limitación, esta vez técnica, es la de la alta micro-computación (ya tene-
El RP, de nuevo de manera muy similar que el Raspberry Pi comparte la memo- mos al menos un colaborador de Linux
a mucho móviles, embebe todos los ria entre la RAM convencional (para Magazine deseoso de montar un clúster
componentes esenciales (CPU, GPU y aplicaciones y datos) y RAM para vídeo. con 16 RP en una caja de zapatos). Ade-
RAM) en un sólo chip, una tecnología Ésta es una limitación necesaria en un más creemos que pronto veremos imita-
conocida como SoC o System on a Chip. hardware tan compacto, pero tiene el dores, algunos de los cuales sin duda se
Es una manera muy eficiente de ahorrar inconveniente de que, según la aplica- decantarán por hardware totalmente
espacio, pero tiene la desventaja de que ción que se vaya a utilizar y, depen- abierto.
la mayoría de los chips con estas carac- diendo de si necesita más espacio para el Mientras eso ocurra, el Raspberry Pi es
terísticas son privativos. El chip del RP renderizado de gráficos o para la compu- un excelente y sorprendente aparato,
no es una excepción. El Broadcom tación tradicional, hay que asignar dife- pionero en su formato. ■
BCM2835 de la placa contiene un rentes cantidades de RAM al GPU y al
ARM1176JZFS con soporte para aritmé- CPU. Esto de momento se hace a mano, Recursos
tica de punto flotante nativa; un GPU aunque ya hay scripts que ayudan en
[1] Sitio web de Raspberry Pi:
Videocore 4 capaz de reproducir vídeo esta tarea [3]. http://www.raspberrypi.org
con calidad BluRay y de aceleración grá- Por cuestiones de espacio, no vamos a
[2] Vídeo demostrativo de Raspberry Pi:
fica 3D utilizando librerías OpenGL entrar en este artículo a examinar los
http://youtu.be/LOhCtW5F_Pc
ES2.0 y OpenVG; y 256 Mbs de RAM, detalles de cómo se reparte la RAM, pero
[3] Script facilitador de la asignación de
pero si quieres conocer las especificacio- sí tocaremos el tema en siguientes núme-
RAM: http://sirlagz.net/?p=445
nes exactas del chip, tendrás que firmar ros de Linux Magazine.

Figura 5: Un conector de red (RJ45) a la Figura 6: A la izquierda (negro) conector de Figura 7: A la derecha, el microUSB que sirve
izquierda y dos puertos USB en el centro. audio. El conector amarillo es un RCA vídeo. para la alimentación eléctrica del RP.

W W W. L I N U X - M A G A Z I N E . E S WWW.LINUX- MAGAZINE.ES HARDWARE 11


PLATAFORMAS Gnublin

Presentamos la placa Gnublin

PLACA DE
APRENDIZAJE Tim
ur Arbae
v-1
23R
F.co
m

Para aprender sistemas Linux empotrados no necesitas ser un genio, como demuestra claramente la placa Gnublin. Si estás interesado en

aprender a leer sensores, conmutar interruptores y LEDs en un ARM Linux, esta pequeña máquina es perfecta para tu investigación.

Por Markus Feilner

La placa Gnublin [1] es una plataforma Linux pre-instalado. El conector mini- blin. Si somos lo suficientemente rápi-
de aprendizaje y entrenamiento para sis- USB a la izquierda alimenta al pequeño dos, incluso se pueden ver los últimos
temas Linux empotrados. ordenador y lo conecta con nuestro PC, mensajes de la puesta en marcha del sis-
Ha sido creada por los especialistas en en el que instalamos el programa de con- tema en pantalla. A continuación, un
ARM Embedded Projects [2], en colabo- sola (por ejemplo Picocom) y lo inicia- gestor de arranque APEX [4] en la tarjeta
ración con la Cátedra de Técnicas Infor- mos así: SD carga el kernel Linux, que monta el
máticas de Augsburgo [3]. Todos los sistema de raíz antes de mostrar un men-
datos, planos, programas y especificacio- sudo picocom -b 115200U saje de login y queda a la espera de
nes de la placa están disponibles con /dev/ttyUSB0 nuestra entrada (véase la Figura 3,
licencias libres en Internet. Por unos 50 izquierda):
euros, Gnublin (acrónimo de GNU Board Antes de iniciar
Linux) comprende un kernel 2.6.33 en Picocom y crear la Tabla 1: Especificaciones de Gnublin
una CPU ARM9, con numerosos interfa- interfaz serial vir- Elemento Descripción
ces y programas de ejemplo (véase la tual (/dev/ Nombre Gnublin LPC3131
Tabla 1). La documentación invita a los ttyUSB0), debemos Procesador ARM9 con 180MHz (NXP LPC3131)
usuarios a experimentar y aprender más asegurarnos de Memoria principal 8MB de SDRAM móvil (más swap de 64
acerca de las aplicaciones empotradas. esperar un par de MB)
Las numerosas extensiones añaden valor segundos tras Almacenamiento masivo Tarjetas microSD, ranura para bootloader,
a los usuarios más experimentados y los conectar el cable kernel, sistema de archivos, swap
desarrolladores de Gnublin han acumu- USB para que Interfaces Dispositivo USB o puerto USB host (selec-
lado gradualmente más hardware y arranque el sistema cionable por jumper), 3xGPIO y 4x canales
AD, 1x SPI, 1x I2C, 1x convertidor USB-RS-
herramientas para el dispositivo (véase operativo. 232 como consola para Linux, 1x LED con-
la Figura 1). Dependiendo de tu campo trolable, 1x power LED
de interés, también están disponibles cir- Tiempo de Opciones de arranque Tarjeta SD (test de 1 GB), USB o RS 232
cuitos integrados, LEDs y sensores. Arranque Fuente de alimentación USB o terminal 5V
Comenzar con la placa de 7x7 cm. Si todo sale bien, Sistema operativo Gnublin ELDK, versión 201105202151
(véase la Figura 2) es sencillo. La nuestro PC se con-
Kernel 2.633 armv5tejl
configuración incluye un cable USB a vierte en la consola
Precio 50 euros (aproximado)
juego y una tarjeta de memoria con para la placa Gnu-

12 HARDWARE W W W. L I N U X - M A G A Z I N E . E S
Gnublin PLATAFORMAS

Figura 2: La placa Gnublin tiene muchos


conectores en un espacio de menos de 50
cm2.

ELDK
Después de completar con éxito el ini-
Figura 1: (1) placa Gnublin-LPC3131, (2) tarjeta Micro SD (1 a 4 GB), (3) Adaptador de Mini USB cio de sesión, tenemos acceso a un sis-
a USB macho para conectar dispositivos USB al host USB On-the-Go (OTG), (4) adaptador de tema Linux con muchas herramientas
USB a Ethernet con chip Pegasus, (5) pilas/baterías recargables, (6) adaptador USB Blueto- que ocupan unos 600 MB, incluyendo
oth D-Link DBT-120, (7) adaptador USB a puerto serie con chip FTDI FT2232, (8) adaptador programas que tienen poca probabili-
USB a puerto serie con SILabs CP2102, (9) unidad USB Flash, (10) adaptador de audio USB dad de funcionar en este tipo de hard-
Speedlink VIGO (ALSA y Ogg Vorbis-), (11) y (12) concentradores USB, (13) display DOG con ware (por ejemplo, X Window o herra-
conector SPI, (14) lector de tarjetas USB para MicroSD, (15) adaptador USB A a USB B, (16) mientas como el compilador de C). La
destornillador. distribución que se utiliza aquí,
Embedded Linux Development Kit
EDLK (Built by Poky 5.0) U el sistema. Cuando hayamos terminado, (ELDK) versión 5.0 [6], está basada en
5.0 armv5te ttyS0 pulsamos Ctrl+A, Ctrl+X para inte- el exhaustivo kit empotrado Yocto [7],
armv5te login: rrumpir la conexión. Si queremos hacer que a su vez se basa en la plataforma
esto en Windows, es necesario cargar el de compilador Poky [8] con el entorno
Al igual que en un shell remoto, ahora controlador USB RS-232 [5] y una cone- de trabajo OpenEmbedded, para siste-
podemos acceder al sistema como root xión de terminal adecuada antes de mas empotrados Linux [9] como
(sin contraseña) y empezar a trabajar en conectar la placa. núcleo.

Figura 3: La consola Picocom (izquierda) en la placa Gnublin con los últimos mensajes de arranque de ELDK Linux. En la parte derecha, abajo,
está el control de configuración de red del PC, y arriba a la derecha, la ventana del navegador muestra el acceso con éxito al servidor web
Lighttpd que se ejecuta en la placa Gnublin.

W W W. L I N U X - M A G A Z I N E . E S WWW.LINUX- MAGAZINE.ES HARDWARE 13


PLATAFORMAS Gnublin

Si te gusta Python, pronto te sentirás al LED rojo de la placa a través de echo in > direction
como en casa: el lenguaje de scripting GPIO3. En /sys/class/gpio, el comando cat value
aporta herramientas como Bitbake [10]
para el proceso de compilación de echo 3 > export Después de esto, encontraremos bien
paquetes. El comando un 1 o un 0 en el archivo value. 1
habilita el subdirectorio gpio3, donde corresponde a un voltaje de 3.3V en la
alien -t encontraremos los archivos direction y entrada. Para más detalles de las entra-
value. El comando das, podemos echar un vistazo a las
convierte paquetes Debian ARM a .tgz, Notas de Aplicación [13]. Con el hard-
que tenemos que descomprimir en el sis- cat out > direction ware incorporado, también se pueden
tema de archivos raíz. hacer trucos mucho más complejos,
El profesor Hubert Högl de la Universi- especifica GPIO3 como la salida, mien- como la modulación por ancho de pulso
dad Técnica de Augsburgo usa este tras que (PWM), [14], que nos ayuda a crear
método para conseguir que RRDtool, tensiones analógicas o accionar servo-
Gnuplot, Alsa, Ogg Vorbis y otros se eje- echo 1 > value motores.
cuten sin ningún problema en la placa.
En lugar de ELDK en realidad se podría enciende el LED. echo 0 lo vuelve a apagar. Pseudo Red a través de USB
utilizar Debian como base y ejecutar Los scripts sencillos que controlan el Si queremos, podemos crear un pseudo-
apt-get para instalar algún paquete que parpadeo del LED están disponibles red a través de USB en la placa Gnublin
falte. Högl señala que existen variantes como ejemplos en el directorio de inicio sin necesidad de utilizar un cable USB a
ARM para casi todas las distribuciones. del administrador. El Listado 1 muestra Ethernet. Para ello, en primer lugar aisla-
un programa Bash y el Listado 2 es su mos la placa de la fuente de alimenta-
Sensores y Entradas contraparte Lua. Existen más programas ción y configuramos los jumpers USB
Una ventaja de la placa Gnublin, en y ejemplos disponibles en la página web OTG PWR y USB OTG ID a Device (Dev,
comparación con otras plataformas, es la de Gnublin [12]. véase la Figura 4). Las placas de genera-
selección de interfaces a las que se ciones anteriores 1.2 no tienen jumper
puede acceder con sencillez en Linux a GPIO11 como Entrada Conmutador USB OTG ID para forzar al puerto USB
través del sistema de archivos. Dispone GPIO11 es una opción útil si estamos que asuma el rol de host (ID 0) en el
de varios pins GPIO (General Purpose interesados en un test similar de una arranque. A partir de la versión 1.3 se
Input/Output, [11]) y están bien docu- entrada: pueden utilizar cables adaptadores USB
mentados. Por ejemplo, es fácil acceder que no cambian el pin ID gracias a este
echo 11 > export jumper. De hecho, la mayoría de los
Listado 1: Bash blink.sh cd gpio11 cables tienen esta función, que se puede
01 #!/bin/sh
02 Listado 2: Lua blink.lua
03 # Parpadea el LED incorporado 01 -- blink.lua
04 # http://blog.makezine.com/archive/2009/02/ 02 GPIO = 3
blinking- leds-with-the-beagle-board.html
03
05
04 function wait(n)
06 GPIO=3
05 os.execute(“sleep “ .. tonumber(n))
07
06 end
08 cleanup() { # Libera el puerto GPIO
07
09 echo $GPIO > /sys/class/gpio/unexport
08 function cmd(c)
10 exit
09 print(c)
11 }
10 os.execute(c)
12
11 end
13 # Abre el puerto GPIO
12
14 #
13 cmd(“echo “ .. GPIO .. “ > /sys/class/gpio/export”)
15 echo $GPIO > /sys/class/gpio/export
14 cmd(“echo out > /sys/class/gpio/gpio” .. GPIO ..
16 echo “high” > /sys/class/gpio/gpio$GPIO/direction “/direction”)
17 15 n = 0
18 trap cleanup SIGINT # llama al cleanup con Ctrl-C 16 while n < 2 do
19 # Parpadeo continuo 17 cmd(“echo 1 > /sys/class/gpio/gpio” .. GPIO ..
20 while [ “1” = “1” ]; do “/value”)
21 echo 1 > /sys/class/gpio/gpio$GPIO/value 18 wait(1)
22 sleep 1 19 cmd(“echo 0 > /sys/class/gpio/gpio” .. GPIO ..
23 echo 0 > /sys/class/gpio/gpio$GPIO/value “/value”)
24 sleep 1 20 wait(1)
25 done 21 n = n + 1
26 22 end
27 cleanup # llama a la rutina cleanup 23 cmd(“echo “.. GPIO ..” > /sys/class/gpio/unexport”)

14 HARDWARE W W W. L I N U X - M A G A Z I N E . E S
Gnublin PLATAFORMAS

una dirección IP a
Listado 3: Salida de modprobe g_ether la interfaz usb0
Listado 4: lighttpd-init.sh
root@desktop-pc:~# picocom -b 115200 /dev/ttyUSB0 con ifconfig. 01 #!/bin/sh
root@armv5te:~# modprobe g_ether Ya podemos 02 if [ ! -d /var/log/lighttpd ] ;
then
g_ether gadget: using random self ethernet address cambiar a nuestro 03 mkdir /var/log/lighttpd
g_ether gadget: using random host ethernet address escritorio para ver 04 chmod 777 /var/log/lighttpd/
usb0: MAC 2e:dd:9a:ed:d2:48 si se ha encontrado 05 touch
usb0: HOST MAC 56:e5:4d:4b:18:84 /var/log/lighttpd/error.log
el nuevo disposi-
g_ether gadget: Ethernet Gadget, version: Memorial Day 06 fi
2008 tivo de red (en el
segundo cable 07 chmod 666
g_ether gadget: g_ether ready /var/log/lighttpd/error.log
fsl-usb2-udc: bind to driver g_ether USB) y se pueden
08 /etc/init.d/lighttpd start
g_ether gadget: high speed config #1: CDC Ethernet (ECM) usar comandos
como
así puede actuar como servidor SSH o
identificar por el color blanco del interior ifconfig usb0 local_ip servidor web gracias a Dropbear o
del conector. Lighttpd. Todo lo que necesitamos para
Después de conectar la fuente de ali- y Lighttpd es el script de ejemplo lighttpd-
mentación, conectamos los dos puertos init.sh del Listado 4. La pantalla de nave-
USB de la placa al PC, iniciamos la ping Gnublin_board_address gador de la Figura 3 demuestra que ha
sesión en la consola y tecleamos funcionado. La placa necesita hardware
para configurarlo de red USB para acceder a la LAN. ■
modprobe g_ether
Lighttpd Recursos
para cargar el módulo Ethernet (véase el El pequeño equipo ARM puede no ser un
[1] Proyecto Gnublin:
Listado 3). A continuación, asignamos monstruo de alto rendimiento, pero aún http://www.gnublin.org
[2] Embedded Projects GmbH:
http://www.embedded-projects.net
[3] Augsburg Technical University, Cáte-
dra de Técnicas Informáticas, Profesor
Högl:
http://www.hs-augsburg.de/~hhoegl
[4] Gestor de arranque APEX:
http://elinux.org/APEX_Bootloader
[5] Controladores Windows:
http://www.silabs.com/products/mcu/
Pages/USBtoUARTBridgeVCPDrivers.
aspx
[6] ELDK Linux:
http://www.denx.de/wiki/DULG/ELDK
[7] Proyecto Yocto:
http://www.yoctoproject.org
[8] Poky: http://www.pokylinux.org
[9] Open Embedded:
http://www.openembedded.org
[10] Bitbake:
http://bitbake.berlios.de
[11] GPIO:
http://en.wikipedia.org/wiki/
General_Purpose_Input/Output
[12] Programas y scripts:
http://www.gnublin.org/index.
php?title=ApplicationNotes
[13] Entradas ADC de Gnublin:
http://www.gnublin.org/index.
php?title=AppNote-AP0018
[14] Modulación PWM con Gnublin:
Figura 4: Para usar una pseudo-red necesitamos configurar al menos el jumper USB OTG PWR http://www.gnublin.org/index.
y si existe, el jumper USB OTG ID a “Dev”. php?title=AppNote-AP0019

W W W. L I N U X - M A G A Z I N E . E S HARDWARE 15
PLATAFORMAS Hummingbird

Un “Arduino” orientado a la educación

Colibrí
El Hummingbird combina las ideas de Arduino con los juguetes de

construcción para traer el concepto de “construye tu propio hard-

ware” al ámbito educativo. Por Paul C. Brown

m
RF.co
- 123
sign
ktde

Técnicamente Hummingbird [1] no es un creadores reco-


Arduino, pero tampoco pretende serlo. En miendan dos entornos:
algunos aspectos es algo más: viene con un el Programador Virtual y
completo abanico de complementos modifica- Snap! para Hummingbird.
dos a medida y la claridad de su diseño hace
mucho menos empinada la curva de aprendizaje. Programador Visual
Pero en otros aspectos, algo menos: el ecosistema El programador visual (PV) es la manera
Arduino es indudablemente mucho más rico en original que concibieron los desarrollado-
expansiones y la variedad de los dispositivos en los res del kit para interactuar con él. Para
que se puede integrar es también mucho mayor. arrancar el PV la primera vez, lo reco-
Pero las comparaciones son odiosas, sobre todo para mendable es [2] y pulsar en el botón
dos sistemas orientados a públicos diferentes. Mientras que “Launch”… y esperar.
Arduino sirve para el aficionado adulto o, incluso para aplicacio- El programa en sí es un fichero
nes profesionales, el Hummingbird está claramente dirigido al JNLP, es decir un archivo Java Net-
sector de la educación, concretamente a los niños de primaria y work Launching Protocol. Este
de los primeros años de secundaria. tipo de archivo contiene aplica-
De hecho, el kit Hummingbird, que se puede adquirir completo ciones que, si bien pueden enla-
en [1] por 199 dólares, viene con todo lo necesario para empezar, zarse desde el navegador, han de
incluyendo LEDs, motores, servos y sensores. En el kit con el que ejecutarse en el Java Web Start.
nos hicimos nosotros, incluso tuvieron el detalle de incorporar En Firefox, puede que la pri-
una fuente de alimentación adaptada a los enchufes españoles. mera vez que nos encontremos con
También se puede comprar por piezas e ir adquiriendo más com- un fichero de estas características, tenga-
ponentes gradualmente a medida que se vayan necesitando, tal y mos que escoger Abrir con del diálogo y buscar nuestro ejecutable
como muestra la Tabla 1. de javaws (normalmente en /usr/bin/javaws, pero si no estamos
seguros, utilizamos which javaws desde la línea de comandos
Coser y Cantar para descubrir su localización). Es buena idea marcar la casilla de
Conectar componentes al Hummingbird es realmente sencillo. La verificación Hacer esto automáticamente para que javaws arran-
placa tiene en los bordes varios bloques de terminal de color que cada vez que deseamos utilizar el programador.
verde claramente etiquetados para cada uno de los tipos de com-
ponentes que se pueden conectar (Figura 1). Tabla 1: Componentes
Cada bloque terminal cuenta con una serie de agujeros en los Kit Contenido Precio
cuales puedes insertar los extremos de los cables pelados del Tarjeta Hummingbird, cable USB, adapta-
componente (Figura 2). Un poco más arriba de cada agujero hay Controller $89
dor de corriente y destornillador.
una pestaña con una hendidura. Para conectar un componente, 4 servos HS-311, 4 cables para servos y 2
se pulsa la pestaña hacia abajo utilizando el destornillador pro- Motores $59
motores DC.
porcionado en el kit básico y se inserta el cable en el agujero. Sol-
8 LEDs de un sólo color, 2 LEDs RGB y 3
tamos la pestaña y el cable queda firmemente conectado a la LEDs $29
motores de vibración.
placa. Para desconectar el componente, se vuelve a pulsar la pes-
Sensor de luz, temperatura, distancia y
taña y se extrae el cable.
Sensores sonido, un dial rotatorio, dos cables y un $49
Una vez hemos conectado los componentes de hardware, toca resistor.
programarlos. Para ello, y siguiendo en su línea educativa, los

16 HARDWARE W W W. L I N U X - M A G A Z I N E . E S
Hummingbird PLATAFORMAS

Figura 1: Los bloques terminal están etiquetados para indicar qué componente se puede Figura 2: Los bloques terminal facilitan la
conectar dónde. conexión de componentes.

También podemos descargar el fichero Una vez hayamos logrado arrancar el podemos hacer con motores, servos y
jnlp del PV desde [3] y ejecutarlo simple- entorno, veremos un ventana similar a la LEDs monocromos.
mente abriéndolo en un navegador. Esto nos que se ve en la Figura 3. Éste es el Cons- Esto en sí ya es bastante divertido y
permitirá usar el entorno sin tener que visi- tructor de Expresiones. En el panel de la puede proporcionar a un niño horas de
tar el sitio de Hummingbird. Sin embargo, izquierda, tenemos un diagrama de la diversión, pero lo mejor es que, juguete-
seguiremos necesitando conexión a Internet, placa. Cada uno de los grupos de bloques ando con el Constructor de Expresiones,
ya que el programador enlaza a varios terminal vienen etiquetados igual que en estamos iniciándonos en la creación de los
módulos que descarga en el arranque. la placa física y cada bloque terminal tiene bloques para la programación de la placa
Y aquí nos topamos con el primer pro- al lado una casilla de verificación. Mar- y sus componentes.
blema de este entorno: la primera vez que cando la casilla, se activa el bloque y se Me explico. La programación con PV
arranca es muy lento, precisamente por nos permite establecer valores para consta de dos partes: la creación de expre-
tener que descargar tantos módulos. Hay interactuar con los componentes. siones, que se realiza en el Constructor de
que indicar que los arranques subsiguien- Por ejemplo, si tenemos conectado un Expresiones que hemos visto, y lo que es
tes son algo más veloces, pero no mucho, LED RGB al bloque 1 del grupo de los Tri- la programación propiamente de scripts
por tanto: paciencia. Color LEDs y marcamos la casilla corres- (denominados “Secuencias”), cosa que se
En el caso de que el PV no identifique la pondiente en el programador, aparece un realiza en el Constructor de Secuencias
placa durante el arranque, comprobare- panel con deslizadores para cada uno de encadenando las expresiones.
mos que ésta está conectada a la corriente los colores que el LED puede mostrar. Para ilustrar cómo se hace, vamos a
con el cargador y al ordenador a través del Moviendo los deslizadores (o escribiendo crear un script que haga parpadear tres
cable USB. Igualmente tenemos que com- un valor entre 0 y 255 en la casilla a la veces el componente verde de un LED
probar el estado de los permisos del bus derecha de cada deslizador) podemos RGB con una cadencia de un segundo, es
USB al cual se conecta la placa (véase el establecer la intensidad de la luz roja, decir, se ilumina el componente verde
cuadro Permisos, permisos, permisos). verde y azul que emite el LED. Lo mismo durante un segundo, luego se apaga

Figura 3: Estado inicial del Programador Visual. Figura 4: Secuencia que hace parpadear el componente verde del LED.

W W W. L I N U X - M A G A Z I N E . E S WWW.LINUX- MAGAZINE.ES HARDWARE 17


PLATAFORMAS Hummingbird

durante un segundo y así hasta tres derecho, escogeremos un Counter y lo Snap [4], una implementación de Scratch
veces. colocaremos en el espacio de trabajo (un [5] para web. Para quien no esté familiari-
El primer paso, como hemos mencio- counter hace las veces de bucle). Una vez zado con este tipo de interfaces (ver
nado, consiste en crear las expresiones. colocado, pulsamos en el candado y podre- Figura 5), ayudan a iniciarse en la progra-
Conectamos un LED RGB al bloque 1 del mos desbloquear el número de iteraciones mación proporcionando una serie de blo-
grupo Tri-Color LEDs y marcamos la casi- del bucle. Cambiamos el uno por tres. ques similares a la de los juegos de cons-
lla correspondiente en el Constructor de Ahora arrastramos las expresiones trucción que pueden interconectarse entre
Expresiones. Con todos los deslizadores “Verde” y “Apagado” al interior del bucle sí.
en cero, pulsamos en el botón Save en el para que quede como en la Figura 4. Por ejemplo, para realizar un script que
ángulo superior del panel. Le damos un Para probar nuestro programa, pulsa- hiciese lo que vimos en el apartado ante-
nombre a nuestra expresión (por ejemplo, mos en botón Play en la parte superior rior, es decir, hacer parpadear el elemento
“Apagado”) y aparecerá la expresión en la derecha del panel principal. verde de un LED RGB tres veces con una
lista a la derecha del panel principal. Así que parece Navidad. Enhorabuena. cadencia de un segundo, conectaríamos
Ahora pulsamos en el botón New, con- Naturalmente, podemos guardar nues- bloques de la siguiente manera:
firmamos que queremos crear una nueva tro trabajo utilizando el botón Save y
expresión y la representación de la placa empezar otro proyecto con el botón New.
vuelve a su estado original. De nuevo pul- A pesar de sus buenas ideas, el Progra-
samos en la casilla de nuestro LED y mador Visual se queda bastante corto. El
movemos el deslizador del color verde al tener que arrancarlo estando conectado a
máximo. Pulsamos en Save y guardamos Internet y su lentísima carga son otras dos
la expresión con el nombre “Verde”. desventajas de este entorno. Está bien
Ahora pulsamos en la pestaña Sequence para experimentar y comprobar que todo Como se puede ver, el resultado es bas-
Builder para empezar a construir nuestro funciona, pero poco más. tante más compacto y legible que con el
programa. Veremos que también en esta Ahora bien, Snap para Hummingbird es Programador Visual, además de que Snap
pestaña disponemos de nuestras expresio- otra historia… proporciona muchas más herramientas y
nes, que podemos arrastrar hasta el espa- es más responsivo.
cio de trabajo para crear una “secuencia”. Snap Sin embargo, para poder utilizar esta
Para lo que nosotros queremos hacer, Además del programador visual, Hum- interfaz, hay que hacer unas cuantas
del cajetín Structures del ángulo inferior mingbird puede programarse utilizando cosas antes.

Permisos, permisos, permisos


Un problema típico al intentar interactuar con Hummingbird es Para solucionar el problema, podemos cambiar los permisos a
que el IDE, sea el Programador Visual, Snap o cualquier otro, no mano con chmod…
“vea” la placa o, lo que es más común, no pueda “escribir” en
ella (es decir, no pueda pasarle datos), impidiendo que se ejecu- sudo chmod a+w /dev/bus/usb/002/006
ten los programas que creamos.
Para determinar si éste es el caso, primero hemos de saber qué … o, si queremos que los permisos se establezcan correcta-
bus USB se ha asignado al Hummingbird. Para ello podemos uti- mente cada vez que enchufamos la placa al ordenador, podemos
lizar lsusb: escribir una regla udev para que lo haga por nosotros.
Para ello, creamos el fichero /etc/udev/rules.d/55-
$ lsusb hummingbird.rules e introducimos la siguiente regla:
Bus 001 Device 002: ID 8087:0020 Intel Corp. Integrated
Rate Matching Hub SUBSYSTEM==”usb”, ATTR{idVendor}==”2354”,
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 ATTR{idProduct}==”2222”, MODE=”0660”,
root hub GROUP=”nombre_grupo”
Bus 001 Device 003: ID 046d:c517 Logitech, Inc. LX710
Cordless Desktop Laser Los atributos idVendor e idProduct son los que nos da la instruc-
Bus 001 Device 004: ID 0461:4d0f Primax Electronics, Ltd ción lsusb que hemos visto más arriba. Mode establece los per-
Bus 002 Device 006: ID 2354:2222 misos, en este caso, lectura + escritura para el propietario y el
Bus 002 Device 005: ID 5986:0143 Acer, Inc grupo que se especifica en GROUP, que puede ser el personal –
en mi caso paul, o uno que se cree – por ejemplo hummingbird,
El candidato más probable en este caso es el bus 002 del disposi- para todos aquellos que vayan a trabajar con la placa.
tivo 006. De hecho, cuando desenchufo el Hummingbird, este Para probar el script udev, desenchufamos la placa y volvemos a
dispositivo desaparece. enchufarla y comprobamos los permisos del bus USB. Si el dis-
Para ver si los permisos son correctos (recordemos que nos tie- positivo es el 009 del bus 002, si se examina con ls -l,
nen que permitir leer y escribir al bus), escribiremos
$ ls -l /dev/bus/usb/002/009
$ ls -l /dev/bus/usb/002/006 crw-rw---- 1 root nombre_grupo 189, 136 sep 20 19:30
crw-rw-r-- 1 root root 189, 133 sep 20 18:20 /dev/bus/usb/002/009
/dev/bus/usb/002/006
vemos que tanto (root) y el grupo designado tienen permisos de
Como vemos, pertenece a root y sólo root puede escribir al dis- escritura.
positivo, ya que al tercer terceto de permisos, el de other (otros) Para más información sobre Udev y cómo configurar hardware
usuarios, le falta el permiso de write (escritura). que se enchufa “en caliente”, consulta [8].

18 HARDWARE W W W. L I N U X - M A G A Z I N E . E S
Hummingbird PLATAFORMAS

El primer paso es descargarse el servi- porciona una


dor de [6] y descomprimir el archivo en el completa caja de
directorio donde lo vayamos a alojar. Para herramientas
esto no hacen falta permisos especiales y para realizar
se puede crear colgando del directorio per- todo tipo de
sonal. experimentos
Nos introducimos en el directorio que con el kit.
se crea en descompresión y copiamos el Snap es una
fichero libhidapi32.so a /usr/lib/ (en el excelente solu-
caso de que nuestro sistema sea de 32 ción para Hum-
bits) o el fichero libhidapi64.so a /usr/ mingbird: es
lib64/ (en el caso de que de sea de 64). atractivo, flexi-
Alternativamente, podemos crear un ble, muy escala- Figura 5: Snap para Hummingbird es un entorno mucho más flexible y
enlace simbólico en el directorio apro- ble (el proyecto agradable que el Programador Virtual.
piado. original invita a
A continuación podemos arrancar el los desarrolladores a expandir el lenguaje, cubre un sector de la población que otras
servidor ejecutando el script LaunchS- integrando bloques que sean relevantes propuestas no toca: el de los escolares de
nap.sh y, una vez hecho esto, podemos para sus propios proyectos) y, lo mejor de primaria y, apurando, de los primeros
dirigir nuestro navegador a la dirección todo, es familiar: ya existen múltiples años de secundaria.
http://127.0.0.1:3000 y veremos la inter- interfaces similares por ahí y un estu- Su sencillez y la claridad de su diseño
faz. diante que haya tenido contacto con uno, son sus mejores bazas, haciéndolo ideal
Las diferentes piezas que podemos utili- inmediatamente se encontrará a gusto. para iniciar a niños a partir de los 7 años
zar en nuestros programas (incluyendo los en la construcción de robots y otros dispo-
que viene por defecto con Snap) se Processing y Java sitivos electrónicos. ■
encuentran en el panel de la izquierda y Hummingbird también contempla la pro-
podemos acceder a diferentes piezas pul- gramación hardcore, con código escrito a Recursos
sando en los botones del ángulo superior mano en un editor de textos. Para ello se
[1] La placa Hummingbird:
izquierdo. utiliza o Java o Processing (un lenguaje http://www.hummingbirdkit.com
Las diferentes categorías son: del cuál ya hablamos en [7]), pero la com-
[2] Programador visual:
• Motion contiene, entre las piezas prede- plejidad de estas dos soluciones sobrepasa
http://www.hummingbirdkit.com/
terminadas para el control de la “tor- los objetivos de este artículo. ?q=content/visual-programmer
tuga” de Snap, bloques que controlan Además, de alguna manera su uso da al
[3] Fichero JNLP del Programador Visual:
motores, servos y los motores de vibra- traste con las intenciones didácticas del http://artsandbots.com/
ción. Hummingbird, al empinar excesivamente visualprogrammer/
• Looks contiene piezas que controlan los la curva de aprendizaje. visualprogrammer.jnlp
LEDs. [4] Snap:
• Sound y Pen sólo contienen piezas pre- Conclusiones http://byob.eecs.berkeley.edu/
determinadas para interactuar con el A pesar de no contar con la versatilidad de #snap4.0
entorno de Snap. Arduino, referencia obligatoria para este [5] Scratch – Una herramienta lúdica de
• Control contiene piezas de control de tipo de cosas, y de tener algunos proble- iniciación a la programación de
flujo (bucles, condicionales, etc.). mas con las interfaces visuales que están Máximo Prudenci, Linux Magazine 28,
• Sensing contiene piezas que pueden aún un poco inmaduras, Hummingbird pag. 79:
leer datos de los http://www.linux-magazine.es/issue/
sensores del Hum- 28/078-082_ScratchLM28.crop.pdf
mingbird. [6] Snap para Hummingbird:
• Operators contiene https://dl.dropbox.com/u/9303915/
piezas para la eje- SnapHummingbirdLinux.zip
cución de opera- [7] Figuras Animadas – Creación de ani-
ciones aritméticas, maciones gráficas con Processing de
lógicas, etc. Kristian Kissling, Linux Magazine 48,
• Y Variables con- pag. 54:
tiene piezas que http://www.linux-magazine.es/issue/
48/054-057_ProcessingLM48.pdf
permiten asignar
valores a varia- [8] Fácil Acceso – Gestión dinámica de
bles, crear listas, dispositivos con Udev, HAL y D-Bus
de Eric Amberg, Linux Magazine 46,
leer su longitud,
pag. 35:
etc.
http://www.linux-magazine.es/issue/
Con todo, Snap para Figura 6: Nuestros pequeño experimento funciona perfectamente: el
46/035-038DetHardLM46.pdf
Hummingbird pro- LED tricolor parpadea verde tres veces.

W W W. L I N U X - M A G A Z I N E . E S HARDWARE 19
ARDUINO E/S Digitales

Konstantine Milenin, 123RF.com


Arduino: E/S digitales

Electrónica Diferente
Arduino es una manera sencilla y divertida de iniciarse en el mundo de la electrónica y una oportunidad de llevar tus ideas al mundo real.

Por Luis Martín

Arduino es una plataforma de hardware primera toma de contacto con la progra- necesitar una serie de componentes elec-
libre basada en una placa con microcon- mación, por lo que una vez ya realizado trónicos aparte del Arduino [2]: un pul-
trolador y un entorno de desarrollo, dise- el “Hola Mundo” de Arduino, el cual sador, una resistencia de 10K y una pro-
ñada para facilitar el uso de la electró- consiste en hacer parpadear un LED, nos toboard para el montaje. Todos estos
nica en proyectos multidisciplinares. centraremos en el estudio y prueba de componentes (y algunos más) los encon-
Arduino también es una oportunidad. las distintas entradas/salidas digitales traremos en el Arduino Starter Kit de
Una oportunidad para llevar a cabo que nos ofrece Arduino. Cooking Hacks [3] (Figura 2 y Tabla 1).
todas esas ideas que os rondan por la Para realizar un primer diseño del cir-
cabeza. A quién no se le ha ocurrido la Preparación y Puesta a Punto cuito, como en el anterior artículo [1],
típica idea de: ¿Y si pudiera encender la Para comenzar a trabajar es necesario nos serviremos de la herramienta Frit-
luz de mi cuarto dando una palmada? descargar desde la página oficial de zing [4]. Fritzing contiene numerosos
¿Podría encender la calefacción de mi Arduino [2] el software necesario para circuitos de ejemplo ya diseñados,
casa con el móvil?… pues con Arduino crear los programas y transferirlos a pudiéndonos servir de base para otros
todo esto y mucho más es posible. Puede nuestro Arduino (Figura 1). Para ello proyectos, pero en este caso lo utilizare-
que suene a anuncio de teletienda, pero seguiremos los pasos y consejos del artí- mos únicamente para realizar unos dia-
lo cierto es que este dispositivo abre las culo Introducción al Arduino: Contacto gramas sencillos de conexionado, aun-
puertas a un mundo de aplicaciones y físico [1] de Dmitri Popov. que tiene otras muchas funciones
posibilidades, en el que puedes realizar Una vez que hemos instalado correcta- (Figura 3).
distintos proyectos sin tener que ser un mente el IDE y conocemos los conceptos Conectaremos el LED al pin digital 13,
experto electrónico o programador. básicos para utilizarlo y programar en él, el cual ya tiene incorporada una resis-
Utilizando programas sencillos pode- podemos comenzar a realizar el diseño tencia limitadora de corriente (impide
mos dar instrucciones al microcontrola- del hardware. Una vez que tengamos el que el diodo se queme por un exceso de
dor para que trabaje como cerebro de hardware y el programa listos, sólo tene- corriente). Lo mas complicado del hard-
nuestro sistema, recibiendo datos por mos que conectar el Arduino al ordena- ware será el circuito del pulsador. Los
medio de sus numerosas entradas (ana- dor, cargarle el código y observar el pulsadores conectan dos puntos de un
lógicas y digitales), las cuales le permi- resultado de nuestro proyecto. circuito al ser pulsados. Como se puede
ten leer parámetros del entorno, y observar (Figura 4), los pulsadores elec-
enviando datos al medio para poder Diseño del Hardware trónicos parecen llevar cuatro patillas,
actuar sobre él gracias a una serie de En este proyecto, vamos a leer una pero en realidad sólo son dos muy largas
salidas (digitales). entrada digital por medio del Arduino y que salen por los laterales del pulsador
Como ya se vio en el artículo anterior en función de esa entrada, actuaremos para facilitar las conexiones, de manera
[1], es necesario comenzar con ejemplos sobre otro pin digital como salida, donde que si lo colocamos y el LED se
muy básicos con el fin de familiarizarnos estará conectado un diodo LED. Para rea- enciende continuamente, es muy posi-
con el entorno de trabajo y como una lizar este pequeño proyecto vamos a ble que lo hayamos conectado mal; si

20 HARDWARE W W W. L I N U X - M A G A Z I N E . E S
E/S Digitales ARDUINO

Para solucionar este


problema se utilizan
resistencias con el fin
de que fijen un valor de
tensión estable cuando
no aplicamos una ten-
sión sobre la entrada
digital. Estas resisten-
cias reciben el nombre
de Pull Down y Pull Up
en función de la ten-
sión que fijen en el pin
digital. Las resistencias
Figura 1: Arduino Starter Kit de Cooking Hacks. Pull Up son resistencias
que se sitúan entre el
tenéis un polímetro, colocadlo en modo pin digital y un valor de tensión (por
continuidad y aseguraos de la posición ejemplo 5 voltios) positivo, de manera
correcta. que cuando no aplicamos tensión en el Figura 2: Esquema de conexionado del cir-
A menudo cuando se trabaja con pin fijan ese valor de tensión positivo, y cuito del pulsador.
entradas digitales, nos surge el problema si aplicamos un valor diferente de ten-
de conocer qué valor de tensión real hay sión en el pin (por ejemplo 0 voltios apli- no conectamos la resistencia de Pull
en dicho pin. Cuando nosotros ponemos cados al activar un interruptor), no afec- Down y de esta manera comprobaremos
una tensión fija en esa entrada, es tan a ese valor. (Figura 5) cómo el valor de tensión que medimos
directo el conocer el valor de la tensión En nuestro circuito colocaremos una varía de forma errática.
(por ejemplo, si colocamos 5 voltios resistencia de 10K de Pull Down. Esta Una vez montado el circuito sobre el
sabemos que hay 5 voltios), pero cuando resistencia se coloca entre el pin digital breadboard, podemos comenzar la pro-
no fijamos una tensión en ese punto, y masa (0 voltios), de manera que gramación de los distintos ejemplos que
¿que tensión hay en esa patilla?. Podría cuando no se aplique ninguna tensión vamos a realizar.
parecer que la que aparece es de 0 vol- sobre dicha entrada, se mantenga un
tios, puesto que no aplicamos ningún valor constante de 0 voltios, evitando Programación
voltaje, pero eso no es cierto, ya que ese que aparezca ruido producido por el El último paso antes de probar nuestro
pin al no estar conectado a nada, trabaja entorno. diseño es escribir el código necesario
como una antena recibiendo ruido y En nuestro circuito (Figura 6), cuando para que funcione. Todas las instruccio-
señales del entorno que le rodea, y por el pulsador esté abierto (sin pulsar) no nes podemos encontrarlas en la web ofi-
ello puede presentar un valor de tensión hay conexión entre las dos patillas del cial de Arduino, las cuales están basa-
muy variable. pulsador, por lo que actúa la resistencia das en el lenguaje de programación C/
En este proyecto queremos leer el de Pull Down, fijando un valor de 0 en C++, por lo que cualquier prontuario
estado de un pulsador. Para ello debe- nuestra entrada, lo que para nosotros de instrucciones nos puede servir a la
mos conocer qué valor de tensión hay en significa que el pulsador no está presio- hora de programar. Sólo un par de
el pin que lo monitoriza. Las entradas nado. Sin embargo, cuando pulsamos se cosas: nótese que es necesario colocar
digitales de Arduino pueden detectar 2 cierra la conexión, y por lo tanto conec- un punto y coma (;) detrás de cada una
valores de tensión: 0 (0 voltios) como tamos 5V a nuestra entrada digital, de las instrucciones, ya que es lo que
valor bajo o 1 (5 voltios) como valor fijando un valor de 1. Podemos observar utiliza Arduino para separar unas de
alto. el ruido que hay en una entrada digital si otras.

Listado 1: Lectura Estado Pulsador pinMode(led, OUTPUT);


Serial.begin(9600);
01 // Variables estáticas 13
02 int pulsador = 2; // Declaramos 14 void loop(){
la variable pin del pulsador 15 // Lee el valor del pin del
03 pulsador y lo almacena
04 // Variables dinámicas 16 // en la variable estadoPulsador
05 int estadoPulsador = 0; // 17 estadoPulsador =
Variable para estado del pulsador digitalRead(pulsador);
06 18 // Imprime por el monitor serie
07 void setup() { el estado del pulsador:
08 // Inicializa el pin del 19
pulsador como entrada: Serial.println(estadoPulsador);
09 pinMode(pulsador, INPUT); 20 // Pequeño retardo de tiempo:
10 // Inicializa el puerto serie: 21 delay(1000);
11 Serial.begin(9600); 22 } Figura 3: Interconexión de un pulsador de 4
12 }
patillas.

W W W. L I N U X - M A G A Z I N E . E S WWW.LINUX- MAGAZINE.ES HARDWARE 21


ARDUINO E/S Digitales

En el primer programa de
ejemplo, sólo queremos leer
el estado del pulsador y mos-
trarlo por el monitor serie del
que dispone el IDE de
Arduino. Para ello, en el
bucle setup configuraremos el
pin al que hemos conectado
el pulsador como una
Figura 4: Resistencias pull-up y pull-down. entrada, para así poder leer
su estado, e inicializaremos
Asimismo, podemos utilizar dos barras la comunicación serie entre el
(//) al inicio de una línea para realizar Arduino y el ordenador a una
anotaciones o comentarios para facilitar velocidad de 9600 (existen Figura 5: Fritzing nos permite plasmar nuestro diseño en
la comprensión de nuestro programa. varias velocidades, pero en una imagen.
nuestro caso elegimos una
//Esto es un comentario de una estándar). En el bucle loop realizamos anterior. Primero tomamos el valor del
línea tres instrucciones: primero almacenamos pulsador y lo almacenamos en una varia-
el valor de la entrada en la que se ble que previamente hemos definido. A
De cara a la utilización del circuito que encuentra conectado el pulsador (si es partir de aquí debemos utilizar una
hemos montado, vamos a realizar dos un 1 o un 0), después imprimimos este nueva estructura de código, el bucle
ejemplos: en el primero monitorizare- valor en el monitor serie, y por último if/else, la cual cumple una función con-
mos el estado del pulsador. En el esperamos 1 segundo para evitar tomar dicional básica, indicando que, si se
segundo, en función de ese estado, una nueva medida hasta que hayamos cumple una condición, se realiza la pri-
encenderemos o no un LED. leído la actual. Una vez que escribamos mera parte del bucle, y si no se cumple
En ambos programas, en primer lugar, el código, es necesario cargarlo en el la segunda. En nuestro caso, si el pulsa-
debemos declarar las variables globales Arduino, y una vez cargado, pulsar el dor está presionado, enciende el LED, y
que vayamos a utilizar antes del setup. botón de Serial Monitor para poder ver si no lo está, hace lo contrario.
Estas variables las organizaremos como las lecturas del estado del pulsador Una vez acabados de teclear los pro-
estáticas (las que no van a cambiar de (Figura 7). gramas, podemos comprobar si existe
valor a lo largo del programa) y dinámi- En el segundo programa, la única dife- algún error antes de cargarlo en Arduino.
cas (en las que vamos a almacenar un rencia es que en vez de mostrar el estado El programa os avisará por medio de la
valor que puede ir cambiando a lo largo del pulsador, lo utilizamos, y, en función consola inferior si hay errores de progra-
del programa). En nuestro caso, definire- de dicho estado, encendemos o apaga- mación o sintaxis. Una vez que nos avise
mos un tipo de variable int (que alma- mos un LED. La parte de definición de que compila correctamente, podemos
cena números enteros entre -32768 y variables y el setup se realizará de cargarlo en Arduino sin mayor preocupa-
32767), aunque existen otros muchos manera semejante al anterior ejemplo. ción.
tipos que iremos conociendo en función Sólo tendremos que definir todos los Ambos códigos se encuentran comen-
de las necesidades de cada momento. A parámetros necesarios para trabajar con tados con el fin de facilitar su compren-
partir de aquí, siempre que utilicemos el LED que se encuentra integrado en el sión, y poder entender paso a paso lo
una de estas variables, únicamente ten- pin 13 digital. La parte del loop es un que va ocurriendo en el programa.
dremos que llamarla por el nombre que poco más compleja, pero podemos Para la realización de más ejemplos
le hemos asignado. basarnos nuevamente en el ejemplo básicos, podéis echar un vistazo a la web

Listado 2: Control de LED con Pulsador


01 // Variables estáticas 15 void loop(){
02 int pulsador = 2; // Declaramos la variable pin del 16 // Lee el valor del pin del pulsador y lo almacena
pulsador 17 // en la variable estadoPulsador
03 int led = 13; // Declaramos la variable pin del LED 18 estadoPulsador = digitalRead(pulsador);
04 19
05 // Variables dinámicas 20 // Chequea si el pulsador está pulsado:
06 int estadoPulsador = 0; // Variable para estado del 21 if (estadoPulsador == HIGH) {
pulsador 22 // Si es así, enciende el LED:
07 23 digitalWrite(led, HIGH);
08 void setup() { 24 }
09 // Inicializa el pin del LED como salida: 25
10 pinMode(led, OUTPUT); 26 else {
11 // Inicializa el pin del pulsador como entrada: 27 // Si no, lo mantiene apagado:
12 pinMode(pulsador, INPUT); 28 digitalWrite(led, LOW);
13 } 29 }
14 30 }

22 HARDWARE W W W. L I N U X - M A G A Z I N E . E S
E/S Digitales ARDUINO

como base para con-


trolar cualquier sis-
tema que se valga de
las entradas y salidas
digitales.
En este caso ha sido
un pulsador, pero
podemos realizar pro-
yectos semejantes con
relés, bombillas y
otros muchos senso-
res o actuadores digi-
tales. Como ejercicio a
Figura 6: Carga y apertura del monitor serie de Arduino. realizar, para aquellos
que tengan ganas de
practicar algo más complejo, os
dejo un ejemplo al que llamare-
mos Knight Rider, en el que al
estilo de la serie de los 80 en la
que podíamos ver al famoso
David Hasselhoff junto a su
magnífico Pontiac inmersos en
emocionantes aventuras, utiliza-
remos usa serie de LEDs para
obtener el llamativo efecto de la
parte frontal del coche fantás-
tico. Os aconsejo poner única-
Figura 7: Diseño hardware del ejemplo del coche fan- mente 6 LEDs y realizar el
tástico. encendido y apagado de cada
uno de ellos en una secuencia
de Arduteka [5], ya que es un lugar muy de ida y vuelta. Podéis observar en la
interesante y con bastante información Figura 8 un ejemplo del hardware nece-
que os puede servir de ayuda para sario. Espero que os haya servido este
aprender más sobre Arduino. pequeño proyecto como una de vuestras
primeras tomas de contacto con Arduino
Resultado y Mejoras y os animo a intentar realizar este
Una vez cargado el código, podemos último ejemplo. ■
comprobar cómo el Arduino está funcio-
nando correctamente y, aunque parez- Recursos
can unos sencillos ejemplos, nos sirven
[1] Artículo Introducción a Arduino: Con-
tacto físico, ver página 6 de este Espe-
Tabla 1: Contenido Starter Kit cial.
Componente Cantidad [2] Sitio web oficial de Arduino en espa-
Arduino UNO Rev.3 x1 ñol:
Cables para Arduino x1 http://www.arduino.cc/es/
Breadboard x1 [3] Cooking Hacks:
Cable USB x1 http://www.cooking-hacks.com/
Resistencias 470 ohm x10 [4] Arduino Starter Kit:
Resistencias 1 K x10 http://www.cooking-hacks.com/index.
Resistencias 10K x10 php/shop/arduino/starter-kits/
Potenciómetro 1K x2
arduino-starter-kit.html

Potenciómetro 100 K x2 [5] Fritzing:


Pulsador x5 http://fritzing.org
Sensor LDR x1 [6] Arduteka:
Sensor de temperatura x1 http://www.arduteka.com/
LED rojo x10 [7] Descargas del código de este artículo:
LED verde x10 http://www.linux-magazine.es/
Magazine/Downloads/83/Arduino
Porta-baterías 6AA x1

W W W. L I N U X - M A G A Z I N E . E S HARDWARE 23
ARDUINO E/S Analógicas

Arduino: Entrada analógica y salida PWM

Controlando el Entorno
Aprendemos a monitorizar e interactuar sobre el entorno con Arduino. Por Luis Martín

Desde tiempos remotos, el ser humano tenemos que ir tan lejos en el tiempo Naturalmente, ambas cosas son con-
siempre ha buscado la manera de con- para encontrar este tipo de necesidades trolables por Arduino. Y el sistema de
trolar todo lo que le rodea. Ejemplos de humanas. En la actualidad, el fuego se hardware libre nos lo permite de
esto son el control del fuego y el agua ha cambiado por la calefacción de nues- manera autónoma, tomando informa-
pretendido por las civilizaciones anti- tra casa y el agua, por el riego automá- ción del entorno a través de sus pines
guas. Sin embargo, nosotros no nos tico de las plantas. de entrada para multitud de sensores.
Con la información extraída, puede
Listado 1: Lectura Entrada Analógica afectar sobre aquello que le rodea, con-
trolando luces, motores y otros actuado-
01 // Variables estáticas potenciometro y lo almacena
res. También puede trabajar como un
02 int potenciometro = A0; // 14 // en la variable valorPoten-
“puente” entre un dispositivo electró-
Entrada para el potenciómetro ciometro
nico y el mundo real, haciendo que un
03 15 valorPotenciometro = analo-
ordenador pueda sentir y controlar el
04 // Variables dinámicas gRead(potenciometro);
mundo físico.
05 int valorPotenciometro = 0; // 16 // Imprime por el monitor serie
Variable para el valor del sensor el valor
06 17 // de la señal del potenciometro
07 void setup() { 18 Serial.print(“Valor sensor = “
08 // Inicializa el puerto serie: );
09 Serial.begin(9600); 19 Serial.println(valorPoten-
10 } ciometro);
11 20 // Pequeño retardo de tiempo:
12 void loop() { 21 delay(1000);
13 // Lee el valor del pin del 22 }
Figura 1: Entradas analógicas de Arduino.

24 HARDWARE W W W. L I N U X - M A G A Z I N E . E S
E/S Analógicas ARDUINO

electrónico las pueda


utilizar. Esto permite a
los dispositivos que las
utilizan trabajar con
señales de tipo analó-
gico (que no poseen un
valor fijo, sino que
pueden variar) como la
temperatura, la hume-
dad…
Figura 2: Ejemplos de valor medio obtenido por modulación de Para realizar la con- Figura 3: Salidas digitales con función PWM
ancho de pulso. versión de ese valor de de Arduino.
tensión analógico a un
Una vez vistos los conceptos básicos valor con el que el dispositivo pueda 1023 (cuando la señal analógica sea de
de entradas/salidas digitales en los dos trabajar, se usan los conversores A/D 5 voltios).
anteriores artículos [1] [2], trabajare- (Analógico > Digital). Podríamos hacer El segundo concepto que tenemos
mos con las entradas analógicas de un símil con los idiomas, ya que al igual que conocer es el de PWM (Modulación
Arduino y las salidas digitales que nos que una persona no entiende otros idio- por ancho de pulso). Al igual que ocurre
permiten realizar una modulación del mas que no ha estudiado y utiliza tra- con las señales que queremos medir, en
ancho de un pulso (PWM), cerrando así ductores para poder entenderlos, un sis- ocasiones necesitamos una señal de
una primera etapa de aprendizaje y tema electrónico sólo puede entender salida distinta a un valor digital bajo o
toma de contacto con Arduino, iniciada señales digitales por sí solo, por lo que alto, con el fin, por ejemplo, de variar
por Dmitri Popov y continuada por el se sirve de un conversor A/D para la velocidad de un motor o la intensi-
equipo de Cooking Hacks [3]. entender y tratar señales analógicas. dad con la que brilla un LED. Para reali-
Ese módulo se encarga de convertir la zar este tipo de tareas podemos utilizar
Conceptos Básicos magnitud analógica en un numero pro- el PWM, que tratará de emular una
Antes de meternos directamente con el porcional que se puede almacenar en señal analógica a partir de una señal
diseño hardware o la programación, una variable. Esta conversión se realiza digital.
vamos a intentar dejar claros dos con- con una precisión o resolución determi- La modulación por ancho de pulso
ceptos clave con los que vamos a traba- nada (determinada por el número de (del inglés Pulse Width Modulation),
jar a lo largo de este artículo. bits) y cada cierto intervalo de tiempo trabaja enviando una serie de pulsos
El primero de ellos es el de entrada (periodo de muestreo). periódicos (todos ellos de 5 voltios) en
analógica. Una entrada analógica es un En Arduino las entradas analógicas vez de un valor constante de tensión
pin en el que recibimos directamente vienen identificadas desde A0 hasta A5 digital, a una frecuencia determinada,
valor de tensión relacionado directa- (Figura 1). Arduino realiza una conver- de manera que la tensión media que
mente con una señal física, sin que sea sión analógico-digital para señales que llega al dispositivo varía en función del
un valor de “1” ó “0” del sistema bina- varíen entre 0 y 5 voltios, con una reso- ancho de esos pulsos. De este modo,
rio (como ocurre en las señales digita- lución de 10 bits, lo que significa que cuanto más largos sean los pulsos, más
les), aunque deben ser codificadas/ nos devolverá un valor entre 0 (cuando se acercará el valor medio de tensión a
decodificadas para que nuestro sistema la señal analógica sea de 0 voltios) y 5 voltios, ya que estarán más juntos, y a

Listado 2: Señal Analógica Listado 3: Efecto fading


Valor sensor = 1023 01 // Variables estáticas 12
Valor sensor = 1023 02 int potenciometro = A0; 13 void loop() {
Valor sensor = 1023 // Entrada para el potenciómetro 14 // Lee el valor del pin del
Valor sensor = 1023 03 int led = 9; // Declaramos la potenciometro y lo almacena
Valor sensor = 1023 variable pin del LED 15 // en la variable valorPoten-
Valor sensor = 919 04 ciometro (entre 0 y 1023)
Valor sensor = 801 05 // Variables dinámicas 16 valorPotenciometro =
Valor sensor = 737 06 int valorPotenciometro = 0; analogRead(potenciometro);
Valor sensor = 685 // Variable para el valor del 17 // Establecemos el valor
Valor sensor = 635 sensor analógico para la salida PWM
Valor sensor = 559 07 18 analogWrite(led,
Valor sensor = 508 08 void setup() { valorPotenciometro / 4);
Valor sensor = 261 09 // Inicializa el pin del LED 19 // Pequeño retardo de tiempo
Valor sensor = 17 como salida: (30 milisegundos)
Valor sensor = 0 10 pinMode(led, OUTPUT); 20 delay(30);
Valor sensor = 0 11 } 21 }

W W W. L I N U X - M A G A Z I N E . E S WWW.LINUX- MAGAZINE.ES HARDWARE 25


ARDUINO E/S Analógicas

Figura 5: Circuito conexión del potenciómetro.

Figura 4: Arduino Lab Kit de Cooking Hacks.

medida que los acortamos, más nos Si no estáis demasiado familiarizados


acercaremos a 0 voltios. El PWM nos con estos conceptos, podéis echar un
permite obtener cualquier valor de ten- vistazo a distintos tutoriales de esta
sión entre 0 ó 5 voltios únicamente por temática que podéis encontrar en la
medio de dos señales digitales. página oficial de Arduino [4].
En la Figura 2 podemos observar
ejemplos de PWM: en el primer caso se Diseño del Hardware Figura 6: Potenciómetro como divisor de
aprecia que el ancho de pulso es del Los conceptos aprendidos van a ser la tensión.
50% del periodo de la onda, por lo que base de los ejemplos que vamos a reali-
la señal en verde (tensión media o ten- zar, en uno de ellos trabajaremos con potenciómetro, servomotor, resisten-
sión continua equivalente) dará un las entradas analógicas utilizando un cias, cables, protoboard… (Figura 4 y
valor de la mitad del valor en alto (en el potenciómetro como señal física, y en Tabla 1). Para el primer ejemplo única-
caso de Arduino, dará 2,5 voltios, ya otros dos, aunaremos las entradas ana- mente necesitaremos conectar un
que el valor superior es de 5); en la lógicas con diferentes aplicaciones del potenciómetro, pero de cara al segundo
segunda gráfica observamos el mismo PWM. ejemplo montaremos un LED con su
proceso pero con valor de ancho de Para realizar estos ejemplos se pue- resistencia de 470 ohmios a masa (limi-
pulso del 75%. den utilizar los elementos que encontra- tadora de corriente por el diodo) (Figura
En Arduino las salidas digitales que remos en el Arduino Lab Kit de Cooking 5).
permiten PWM son los número 3, 5, 6, Hacks [5], que contiene los componen- Vamos a utilizar un potenciómetro
9, 10 y 11 (Figura 3). tes electrónicos que vamos a usar: como esa señal analógica a tratar por el

Listado 4: Control Servomotor


01 //Añadimos la librería servo.h 16 servo1.attach(pinServo);
02 #include <Servo.h> 17 }
03 18
04 //Creamos un objeto Servo 19 void loop() {
05 Servo servo1; 20 // Lee el valor del pin del potenciometro y lo
06 almacena
07 // Variables estáticas 21 // en la variable valorPotenciometro (entre 0 y
08 int potenciometro = A0; // Entrada para el 1023)
potenciómetro 22 valorPotenciometro = analogRead(potenciometro);
09 int pinServo = 9; // Declaramos la variable pin 23 // Escalamos este valor para poder usarlo para el
del servo servo (entre 0 y 180 grados)
10 24 valorPotenciometro = map(valorPotenciometro, 0,
11 // Variables dinámicas 1023, 0, 179);
12 int valorPotenciometro = 0; // Variable para el 25 // Mandamos la posicion escalada al servomotor
valor del sensor 26 servo1.write(valorPotenciometro);
13 27 // Esperamos que el servo se posicione
14 void setup() { 28 delay(15);
15 // Asignamos el pin 9 al objeto Servo 29 }

26 HARDWARE W W W. L I N U X - M A G A Z I N E . E S
E/S Analógicas ARDUINO

quiera de los dos extre-


mos será variable en la
medida que modifique-
mos la posición central.
Esto es así porque los
dos extremos se encuen-
tran conectados a los
extremos de una pista
resistiva conductora y el
central se encuentra
sobre ésta, de manera
que si modificamos la
posición de la conexión,
obtendremos un nuevo
valor de resistencia en
Figura 7: Conexionado del potenciómetro. función de la posición. Figura 8: Circuito conexión del servomotor.
El aumento de resisten-
Arduino. Un pontenciómetro es una cia entre la patilla de un extremo y la rando una onda cuadrada, como hemos
resistencia de tipo variable, con 3 pati- central es proporcional a la disminución explicado antes, manteniendo un deter-
llas al exterior. Entre los extremos siem- entre el otro extremo y la central. minado periodo para indicarle la posi-
pre podemos encontrar un valor de Vamos a utilizar nuestro potencióme- ción a la que se debe mover (Figura 9).
resistencia fijo, que será el valor tro como un divisor de tensión (Figura Cada servo tiene sus márgenes de
máximo, mientras que la resistencia que 6), para lo que uno de los extremos lo operación que se corresponden con el
veremos entre el pin central y cual- conectaremos a 5 voltios y el otro a 0 ancho del pulso máximo y mínimo que
voltios (fijando esa tensión en la resis- el servo entiende. Los valores más gene-
Tabla 1: Lab Kit – Arduino kit tencia fija entre extremos). rales se corresponden con pulsos de
Componente Cantidad Al realizar este montaje, obtendremos entre 1 ms y 2 ms de anchura, que deja-
Arduino UNO Rev.3? x1 en la patilla central una tensión regula- rían al motor en ambos extremos (0º y
Cables para Arduino x1 ble en función de la posición del poten- 180º). Si se sobrepasan los límites de
Breadboard x1 ciómetro, ya que como la resistencia movimiento del servo, éste comenzará
Cable USB x1 variará al mover el cursor del potenció- a emitir un zumbido, indicando que se
Resistencias 100 ohm x20 metro, la tensión que caerá en ella tam- debe cambiar la longitud del pulso. Para
Resistencias 470 ohm x20 bién se verá alterada proporcionalmente el período se suelen emplear valores de
Resistencias 1 K x20 entre los extremos de 0-5 voltios. Esta ~ 20 ms (Figura 10). Es importante des-
Resistencias 2K2 x20 tensión de salida la conectaremos a la tacar que para que un servo se man-
Resistencias 10K x20
entrada analógica A0 del Arduino para tenga en la misma posición durante un
Resistencias 100K x20
poder medirla (Figura 7). cierto tiempo, es necesario enviarle
Resistencias 1M x20
Potenciómetro 1K x2 El LED lo conectaremos de manera continuamente el pulso correspon-
Potenciómetro 100 K x2 similar al artículo anterior [2], aunque diente.
Pulsador x5 en el pin digital 12, por lo que es nece- Los servomotores tienen tres cables:
Sensor LDR x1 sario la colocación de una resistencia alimentación, tierra y señal. El cable de
Sensor de temperatura NTC x1 limitadora. alimentación es normalmente rojo y lo
LED rojo x10 En el último ejemplo realizaremos conectaremos a 5 voltios, el cable de tie-
LED verde x10 una modificación en el circuito anterior. rra lo conectaremos a la masa de
Porta-baterías 6AA x1
Eliminaremos el circuito del LED y Arduino y el pin de señal, que suele ser
Diodo 1N4001 x2
conectaremos un servomotor con la amarillo/naranja, lo conectaremos al
Sensor de temperatura MCP x1
intención de controlar la posición del pin digital 9 que tiene la función PWM.
Registro de desplazamiento x3
Octoacoplador x3
servomotor por medio de una señal ana-
Zumbador x1 lógica que será dada por el potencióme- Programación
Servo HiTEc o Large x1 tro (Figura 8). Comenzaremos la programación con un
Bleadboard mini x1 Un servomotor es un motor con un ejemplo de lectura de una entrada ana-
Protoshield x1 eje de rendimiento controlado, eso sig- lógica, para lo que realizaremos un
LCD 16*2 x1 nifica que podemos girarlo a una posi- código muy similar al que utilizábamos
Matriz de led x1 ción determinada (dentro de su rango para monitorizar el estado de un pulsa-
Relé x1 accesible que suele ser de 0º a 180º) en dor en el artículo anterior [2] (Listado
Sensores de movimiento x1
vez de hacerlo rotar continuamente. 1).
Transistor PNP x2
Uno de los sistemas más empleados Pero para leer una entrada analógica
Transistor NPN x2
para el control de los servos es el PWM es necesario definir una variable en la
Transistor ULN2003 x1
a una frecuencia determinada y gene- que almacenaremos el valor de la señal

W W W. L I N U X - M A G A Z I N E . E S HARDWARE 27
ARDUINO E/S Analógicas

Podéis intentar realizar la conversión


por medio de esa función map(value,
fromLow, fromHigh, toLow, toHigh).
Para acabar utilizaremos el circuito
del servomotor. Para ello explotaremos
una ventaja que nos brinda Arduino: las
librerías. Para controlar un servo, tene-
mos una librería específica Servo.h, que
nos simplifica en gran medida nuestra
labor, ya que no nos tenemos que preo-
Figura 9: Servomotor junto a accesorios. cupar de nada relacionado con el PWM Figura 10: Posición relativa del servomotor
(frecuencia, ancho de pulso, etc.), sino en función del ancho de pulso.
proveniente del potenciómetro. Para la que directamente introducimos los gra-
lectura de esa entrada, a diferencia de dos en los que queremos que se posi- Proyecto “Casa domótica”
las digitales, no hace falta configurarla cione, y la librería se encarga de todo Una vez aprendidos y probados todos
como salida, ya que sólo hay entradas (Listado 4). los conceptos hasta este punto, en los
analógicas en Arduino. Utilizaremos Para incluir una librería, es necesario siguientes artículos vamos a dejar un
como novedad la instrucción analo- utilizar poco de lado la teoría, que seguro que a
gRead(), la cual nos permite leer cual- más de uno de vosotros os parece un
quier señal analógica que esté conec- #include <Servo.h> poco aburrida, y vamos a ponernos
tada a un pin analógico (en nuestro manos a la obra. Esto no significa que
caso A0). Por defecto, nuestro Arduino al inicio de nuestro programa. Tras esto, todo vaya a ser ya realizar montajes
realizará una conversión analógico-digi- es necesario definir un objeto para cada impresionantes y que todo salga a la pri-
tal de la señal de entre 0 y 5 voltios, a uno de los servomotores que vayamos a mera sin tener que explicar nada, pero
un valor de 0 a 1023. Una vez cargado el utilizar, que es como darles un nombre. ya tenemos una base sobre la que traba-
código, podremos abrir el monitor serie Una vez que tenemos definidos nuestros jar, por lo que la asimilación de concep-
para poder visualizar las lecturas analó- objetos, debemos asociarles el pin digi- tos sera más rápida y sencilla. Os animo
gicas, las cuales cambiarán en función tal en el que van a estar colocados, por a que tengáis bien trabajado todo lo
de la posición de potenciómetro (Lis- medio de la instrucción visto en esta primera serie de artículos.
tado 2). El proyecto que se va a llegar a cabo de
Partiendo de este ejemplo, vamos a servo1.attach(pin) aquí en adelante es el de tener nuestra
utilizar esta señal analógica para cam- propia casa domótica basada en Arduino.
biar la intensidad de un diodo LED con- en la que servo1 será el nombre del Comenzaremos a trabajar en pequeños
trolando por medio de una señal PWM objeto de nuestro servo y pin el pin proyectos independientes, pero obte-
el valor medio de tensión que le llegue PWM en el que queremos que se genere niendo unos resultados finales bastante
(Listado 3). la onda de control. Por último, única- atractivos en conjunto: control de luces,
En este caso mantendremos toda la mente nos queda elegir el grado al que riego, seguridad, etc. Se trata de un pro-
parte del código del ejemplo anterior, queremos que se dirija y mantenga el yecto muy entretenido, y que nos facilitará
pero introduciremos una nueva instruc- servo, por medio de la instrucción muchas de las tareas de nuestro hogar. ■
ción que es analogWrite(pin,valor).
Esta instrucción nos permitirá emular servo1.write(grados) Recursos
una señal analógica en un pin digital
[1] Artículo “Introducción al Arduino:
gracias a los conceptos de PWM previa- donde grados es el número de grados Contacto físico”, de Dmitri Popov, ver
mente explicados. Para poder utilizar que queremos que gire el servomotor página 6 de este Especial.
esta función es necesario conocer el pin (de 0º a 180º). Para adaptar el valor de
[2] Artículo “Hardware Diferente”, de
en el que se quiere generar la señal 0 a 1023 del potenciómetro a un valor Luis Martín, ver página 20 de este
PWM y el ancho del pulso de la señal de 0 a 179 grados, nos servimos en este Especial.
(de 0 a 255 de máximo). caso de la instrucción map().
[3] Cooking Hacks:
En nuestro ejemplo queremos asignar Gracias a estas sencillas instrucciones http://www.cooking-hacks.com/
ese valor del ancho de pulso a la lectura podemos controlar un servomotor por
[4] Sitio web oficial de Arduino en espa-
del potenciómetro, pero como hemos medio de un potenciómetro práctica-
ñol:
visto antes, los niveles que nos aporta la mente sin ninguna dificultad. http://www.arduino.cc/es/
lectura analógica van desde 0 hasta Además de potenciómetros, podemos
[5] Arduino Lab Kit:
1023, por lo que es necesario adaptar trabajar con cualquier sensor que nos http://www.cooking-hacks.com/index.
los valores. Existe una función en devuelva un valor de tensión, cosa que php/arduino-lab-kit.html
Arduino para adaptar niveles, pero en hacen una gran variedad de sensores, y
[6] Servo Large:
nuestro caso dividimos el valor del podemos servirnos de las salidas PWM http://www.cooking-hacks.com/index.
potenciómetro en cuatro partes, para controlar numerosos tipos de php/servo-large.html
dejando así el valor en un rango 0-255. actuadores.

28 HARDWARE W W W. L I N U X - M A G A Z I N E . E S
E/S Analógicas ARDUINO

W W W. L I N U X - M A G A Z I N E . E S HARDWARE 29
ARDUINO Domótica (I)

Conectando nuestra casa a Internet con Arduino

Hogar en Red
El concepto de “Internet de las cosas”, a pesar de tener un ligero tono futurista, está vivo en nuestro entorno creciendo cada día más…

Por Luis Martín


Los humanos utilizamos Internet a diario mundo totalmente interconectado lo que, el módulo de los mismos conectores, ten-
pero, lo que es más interesante, es que el en mi humilde opinión, es imposible), dremos accesibles todas las entradas/sali-
uso que hacemos no es más que una frac- vamos a comenzar un proyecto que le per- das y señales que teníamos antes de
ción de todo lo que hay “conectado” en mita a nuestro hogar conectarse de manera conectarlo, a excepción de los pines digita-
nuestro planeta (Figura 1). independiente a Internet, como ya presen- les 10, 11, 12 y 13 que son los que utiliza el
A lo largo y ancho del globo se ha cons- tamos en el anterior artículo. Con la ayuda Arduino para comunicarse con el módulo.
truido un sistema nervioso que intercomu- de Arduino, crearemos una red interna que La placa dispone de un conector estándar
nica todos los lugares y trabaja con enor- interconectará numerosos sensores y RJ45 para conectarse a la red de manera
mes cantidades de información. Para poder actuadores con el fin de controlar y otorgar rápida y simple. También dispone de
comprender en cierta medida esta idea, es a nuestra casa una serie de funcionalida- varios LEDs que dan distinta información
necesario presentar el concepto del Internet des, que nos hagan la vida diaria mucho y un botón de reset.
de las Cosas, The Internet of Things. mas sencilla. En otras palabras, domotizar Gracias a la librería Ethernet, que viene
El Internet de las Cosas plantea un nuestro hogar. por defecto en el IDE de Arduino, podemos
mundo altamente interconectado, un con- ponernos a trabajar de manera fácil con el
cepto fácil de entender pero difícil de apli- Arduino Ethernet Shield módulo, por medio de una serie de funcio-
car. Si la mayoría de los objetos de la vida Las aplicaciones que Arduino ofrece son nes muy similares a las básicas de
cotidiana, como un cajón, un bolígrafo o múltiples y dependerán de nuestra imagi- Arduino, clasificadas según el modo en el
un libro, estuvieran identificados y conec- nación. Para ayudarnos, nos presenta que quieras trabajar (ver Tabla 1).
tados de manera inteligente, independien- numerosas placas o módulos que se conec- Las principales características de este
temente de si esto es deseable o no, supon- tan a él extendiendo sus capacidades, módulo son que podremos hacer uso de
dría , facilitarnos la vida y crear sociedades siguiendo la misma filosofía que Arduino:
mucho más eficientes (Figura 2). baratos y sencillos de utilizar gracias a las
Se trata de una revolución que repre- librerías implementadas para casi cada
senta el futuro tecnológico y aunque uno de ellos. En este artículo vamos a tra-
parezca que es algo lejano, existen ciertos bajar con uno de estos módulos, el
datos que nos animan a seguir creyendo en Arduino Ethernet Shield. (Figura 3)
su relativamente pronta consecución. Por Esta placa permite a un Arduino conec-
ejemplo, en 2008 el número de “cosas” tarse a Internet. Se trata de una placa que
conectadas a Internet superó al número de dispone de los mismos conectores que
personas de la Tierra. Arduino, por lo que podemos “pincharla”
De cara a aportar nuestro pequeño gra- directamente sobre el Arduino como si
nito de arena a esta utopía (el lograr un fuera un sandwich (Figura 4). Al disponer Figura 1: Internet de las cosas.

30 HARDWARE W W W. L I N U X - M A G A Z I N E . E S
Domótica (I) ARDUINO

Internet y nuestra casa, con el fin de moni-


torizar nuestro hogar y controlarlo por
medio de un dispositivo conectado a la red
(móvil/PC). Gracias a esto podremos dis-
poner de todos los datos que se están tra-
tando en nuestra casa y realizar acciones
sobre el sistema desde una página web.

Diseño del Hardware


Figura 2: Ejemplo de conexión a Internet en Aunque trabajaremos con un nuevo Figura 3: Arduino Ethernet Shield.
la actualidad. módulo, el Arduino Ethernet Shield [1] , el
diseño del hardware es tan simple, que En el caso del segundo ejemplo, también
diferentes protocolos de comunicación sólo hay que conectarlo al Arduino y por vamos a hacer referencia al artículo
usados en Internet y puede utilizarse como medio de un cable estándar de Ethernet a Arduino: Entrada analógica y salida PWM
un servidor web para cargar páginas en la red de vuestra casa. Para comenzar a [4], ya que en él tratamos el concepto de
HTML u otras funciones, permitiendo tra- comprender la placa vamos a realizar una entrada analógica y todo lo referente a ella.
bajar con las peticiones de distintos clien- serie de ejemplos con distintos sensores y En este caso, en vez de trabajar con un
tes. Esto nos permitirá visualizar los datos actuadores que nos permitirán enviar los potenciómetro, vamos a utilizar una LDR
que podamos obtener desde nuestro datos del entorno vía Internet y trabajar (Light Dependent Resistor o resistencia
Arduino, o afectar sobre él en función de con ellos. Para ello, necesitaremos un pul- dependiente de la luz). Este sensor tiene
las acciones realizadas en la web. sador, una resistencia de 10K, una resisten- un valor de resistencia que varía (al igual
También permite utilizarse como cliente cia de 1K y una LDR. que un potenciómetro) en función de la
web, tratando páginas web como si fuera Para el primer ejemplo nos basaremos luz que incide sobre él: a más luz incidente
un navegador. Nos permite leer informa- en el ejemplo del pulsador realizado en el sobre la LDR, menor será su resistencia. Se
ción de las webs (por ejemplo, Twitter) o artículo Arduino:E/S digitales. Electrónica trata de un sensor simple pero con mucha
realizar solicitudes. diferente [3], ya que será la misma cone- utilidad en el tema de control de luces e
Para nuestro proyecto nos serviremos de xión y conceptos básicos, únicamente iluminación del hogar.
un Arduino Ethernet Shield para establecer conectando el módulo Ethernet sobre el Para trabajar con la LDR y obtener una
una conexión, un punto de enlace entre Arduino (Figura 5). señal de tensión variable, que es lo que a

Listado 1: Servidor Web: Estado pulsador


01 //Añadimos la librerías que Ethernet y el servidor 47 client.println();
vayamos a utilizar 25 Ethernet.begin(mac, ip); 48
02 #include <SPI.h> 26 server.begin(); 49 // La página web del
03 #include <Ethernet.h> 27 } servidor cambia en función del
04 28 estado del pulsador
05 // Definimos la MAC y la IP del 29 void loop() 50 if (estadoPulsador == 1) {
servidor 30 { 51 client.println
06 // Identificador del módulo 31 estadoPulsador = (“PULSADO”);
Ethernet: digitalRead(pulsador); 52 }
07 byte mac[] = { 0x90, 0xA2, 0xDA, 32 53 else if
0x0D, 0x20, 0x71 }; 33 // Escuchamos los posibles (estadoPulsador == 0){
08 // Dirección IP asignada al clientes entrantes 54 client.println(“NO
Arduino Ethernet Shield: 34 EthernetClient client = PULSADO”);
09 IPAddress ip(192,168,1,203); server.available(); 55 }
10 35 if (client) { 56 break;
11 // Inicializa el modo de trabajo 36 //Una petición HTTP termina 57 }
y el puerto a usar con una línea en blanco 58 if (c == ‘\n’) {
12 EthernetServer server(80); 37 boolean currentLineIsBlank = 59 // Comienzo nueva linea
13 true; 60 currentLineIsBlank = true;
14 // Variables estáticas 38 while (client.connected()) { 61 }
15 int pulsador = 2; // Declaramos 39 if (client.available()) { 62 else if (c != ‘\r’) {
la variable pin del pulsador 40 char c = client.read(); 63 // Obtener carácter
16 41 64 currentLineIsBlank =
17 // Variables dinámicas 42 // Comprobar si ha false;
18 int estadoPulsador = 0; // finalizado la solicitud HTTP 65 }
Variable para estado del 43 if (c == ‘\n’ && 66 }
pulsador currentLineIsBlank) { 67 }
19 44 // Mandar cabezera estandar 68 // Damos un tiempo al servidor
20 void setup() HTTP web para recibir los datos
21 { 45 client.println(“HTTP/1.1 69 delay(1);
22 // Inicializa el pin del 200 OK”); 70 // Cerramos la conexión
pulsador como entrada: 46 71 client.stop();
23 pinMode(pulsador, INPUT); client.println(“Content-Type: 72 }
24 // Iniciamos la conexión text/html”); 73 }

W W W. L I N U X - M A G A Z I N E . E S WWW.LINUX- MAGAZINE.ES HARDWARE 31


ARDUINO Domótica (I)

inversamente
proporcional. Si
colocamos la
resistencia a
masa y utiliza-
mos la LDR
como resistencia
superior, obten-
dremos la ten-
sión máxima
cuando la lumi-
Figura 4: Arduino Ethernet Shield conec- nosidad sea
tado. máxima (será
directamente
nosotros nos interesa para poder conec- proporcional).
tarla a una entrada analógica de Arduino, En nuestro caso,
es necesario utilizar el divisor de tensión, lo vamos a colo- Figura 5: Circuito conexión del pulsador.
con el que ya hemos trabajado con anterio- car al revés, por
ridad (Figura 6). lo que será necesario por medio de código de una resistencia limitadora. Esto se reali-
La tensión que apliquemos sobre las dos adaptar los valores analógicos, al igual zará así debido a que el Arduino Ethernet
resistencias (tomando la LDR como una que en el artículo anterior adaptamos los Shield se sirve de los pines 10, 11, 12 y 13
resistencia) se verá repartida entre ambas, valores de lectura analógica para el poten- para comunicación con el Arduino vía SPI.
de manera que, si varía la resistencia de la ciómetro (Figura 7). Para trabajar en mayor profundidad
LDR debido a un cambio de luminosidad, Tras trabajar con dos sensores (analó- estos ejemplos, podéis acceder a la página
variará en consecuencia de manera pro- gico y digital), para el tercer ejemplo, mon- web oficial de Arduino [5] y conviene que
porcional la tensión sobre ella. taremos un circuito simple con un LED, tengáis la documentación sobre la librería
Podemos conectar la LDR en dos posi- con el fin de controlar su estado. El LED lo Ethernet donde se detalla el funciona-
ciones y, en función de donde la coloque- conectaremos de manera similar a los miento de las funciones usadas.
mos, obtendremos una tensión directa- anteriores ejemplos aunque en el pin digi- Ya que para el último de los ejemplos no
mente proporcional a la luminosidad o tal 2, por lo que es necesario la colocación es necesario ningún tipo de montaje, sola-

Listado 2: Servidor Web: Sensor analógico LDR


01 //Añadimos la librerías que 24 server.begin(); client.println (“Content-Type:
vayamos a utilizar 25 } text/html”);
02 #include <SPI.h> 26 46 client.println();
03 #include <Ethernet.h> 27 void loop() 47
04 28 { 48 //Imprimir valor entrada
05 // Definimos la MAC y la IP del 29 // Tomamos el valor del sensor y analógica LDR
servidor lo adaptamos a % 49 client.print
06 // Identificador del módulo 30 valorLDR = analogRead(LDR); (“Luminosidad”);
Ethernet: 31 valorLDR = map(valorLDR, 0, 50 client.print(“ = “);
07 byte mac[] = { 0x90, 0xA2, 0xDA, 1023, 100, 0); 51 client.print(valorLDR);
0x0D, 0x20, 0x71 }; 32 52 client.print(“ % “);
08 // Dirección IP asignada al 33 // Escuchamos los posibles 53 break;
Arduino Ethernet Shield: clientes entrantes 54 }
09 IPAddress ip(192,168,1,203); 34 EthernetClient client = 55 if (c == ‘\n’) {
10 server.available(); 56 // Comienzo nueva linea
11 // Inicializa el modo de trabajo 35 if (client) { 57 currentLineIsBlank = true;
y el puerto a usar 36 //Una petición HTTP termina con 58 }
12 EthernetServer server(80); una línea en blanco 59 else if (c != ‘\r’) {
13 37 boolean currentLineIsBlank = 60 // Obtener caracter
14 // Variables estáticas true; 61 currentLineIsBlank =
15 int LDR = A0; // Entrada para el 38 while (client.connected()) { false;
sensor 39 if (client.available()) { 62 }
16 40 char c = client.read(); 63 }
17 // Variables dinámicas 41 // Comprobar si ha 64 }
18 int valorLDR = 0; // Variable finalizado la solicitud HTTP 65 // Damos un tiempo al servidor
para el valor del sensor 42 if (c == ‘\n’ && current- web para recibir los datos
19 LineIsBlank) { 66 delay(1);
20 void setup() 43 // Mandar cabezera estándar 67 // Cerramos la conexión
21 { HTTP 68 client.stop();
22 // Iniciamos la conexión 44 client.println(“HTTP/1.1 69 }
Ethernet y el servidor 200 OK”); 70 }
23 Ethernet.begin(mac, ip); 45

32 HARDWARE W W W. L I N U X - M A G A Z I N E . E S
Domótica (I) ARDUINO

Figura 6: Divisor de tensión con una LDR.

mente utilizaremos el módulo Ethernet,


nos pondremos manos a la obra y comen-
zaremos con la parte “divertida”: el
código.

Programación Figura 7: Circuito conexión de la LDR.


Para el paso final, para acabar con esta pri-
mera toma de contacto con el módulo mos darle una dirección MAC y una direc- nuestra red local. Si se quiere trabajar
Ethernet, realizaremos 4 ejemplos de las ción ID al módulo. Para darle una direc- directamente en Internet, hay que tener
distintas posibles aplicaciones que tiene. ción MAC, únicamente tenemos que darle habilitados los puertos necesarios. Pero,
Existen una serie de partes del código la vuelta al módulo y utilizar el código que para todo este artículo, trabajaremos con la
estándar. Estas partes las exlicaremos en encontramos en una pegatina. dirección “192.168.1.203”.
primer lugar, ya que son básicas para la
configuración del módulo y son comparti- // Identificador del // Dirección IP asignada al
das por todos los ejemplos. // módulo Ethernet: // Arduino Ethernet Shield:
Lo primero es importar las librerías con byte mac[] = { 0x90, 0xA2, U IPAddress ip(192,168,1,203);
las que vamos a trabajar: SPI, que es el 0xDA, 0x0D, 0x20, 0x71 };
protocolo con el que se comunica el Tras esta primera configuración, hay que
módulo con Arduino y la librería Ethernet, En cuanto a la IP, por simplicidad, vamos a decirle al módulo en qué modo queremos
propia del módulo. Seguidamente debe- darle una local libre para poder trabajar en que trabaje. Si está trabajando como un

Listado 3: Control vía web estado LED


01 //Añadimos la librerías que Ethernet y el servidor 50 Serial.println(c);
vayamos a utilizar 25 Ethernet.begin(mac, ip); 51
02 #include <SPI.h> 26 server.begin(); 52 if(c == ‘1’){
03 #include <Ethernet.h> 27 Serial.begin(9600); 53 Serial.println
04 28 } (“Encendido”);
05 boolean incoming = 0; 29 54 digitalWrite(2, HIGH);
06 30 void loop() 55 }
07 // Definimos la MAC y la IP del 31 { 56 if(c == ‘2’){
servidor 32 // Escuchamos los posibles 57 Serial.println
08 // Identificador del módulo clientes entrantes (“Apagado”);
Ethernet: 33 EthernetClient client = 58 digitalWrite(2, LOW);
09 byte mac[] = { 0x90, 0xA2, 0xDA, server.available(); 59 }
0x0D, 0x20, 0x71 }; 34 if (client) { 60 }
10 // Dirección IP asignada al 35 //Una petición HTTP termina 61 if (c == ‘\n’) {
Arduino Ethernet Shield: con una línea en blanco 62 // Comienzo nueva linea
11 IPAddress ip(192,168,1,203); 36 boolean currentLineIsBlank = 63 currentLineIsBlank = true;
12 true; 64 }
13 // Inicializa el modo de trabajo 37 while (client.connected()) { 65 else if (c != ‘\r’) {
y el puerto a usar 38 if (client.available()) { 66 /// Obtener carácter
14 EthernetServer server(80); 39 char c = client.read(); 67 currentLineIsBlank =
15 40 false;
16 // Variables estáticas 41 //Leer la cadena del URL 68 }
17 int led = 2; // Declaramos la desde donde encontramos $ 69 }
variable pin del LED 42 if(incoming && c == ‘ ‘){ 70 }
18 43 incoming = 0; 71 // Damos un tiempo al servidor
19 void setup() 44 } web para recibir los datos
20 { 45 if(c == ‘$’){ 72 delay(1);
21 // Inicializa el pin del LED 46 incoming = 1; 73 // Cerramos la conexión
como salida: 47 } 74 client.stop();
22 pinMode(led, OUTPUT); 48 //Comprobar si hay en el URL 75 }
23 $1 o $2 76 }
24 // Iniciamos la conexión 49 if(incoming == 1){

W W W. L I N U X - M A G A Z I N E . E S HARDWARE 33
ARDUINO Domótica (I)

// Inicializa el modo
// de trabajo
EthernetClient client;
Figura 8: Lecturas web del estado del pul-
sador. Una vez que tenemos esta configuración Figura 9: Lecturas web del estado de lumi-
básica para todos los ejemplos, podemos nosidad.
servidor web, necesitaremos configurar el entrar más en profundidad en cada uno de
puerto asignado para el protocolo a utili- ellos. Los programas son más complejos módulo Ethernet Ethernet.begin(mac, ip) e
zar, en nuestro caso el puerto 80, ya que es que los que hemos visto en anteriores artí- iniciamos la conexión del servidor web por
el puerto para trabajar con el protocolo culo, pero no hay que asustarse, ya que no medio de la función server.begin(), que es
HTTP. Podemos definir en esta parte todas es necesario entender cada línea y función muy similar a la que se usa para iniciar el
las variables que vayamos a utilizar en el del código. Sólo tenemos que entender la puerto serie de Arduino. Una vez acabado
código. estructura general del ejemplo y lo que este bucle y habiendo configurado en él
debemos cambiar para trabajar con ellos. todo lo que se va a trabajar en nuestros
// Inicializa el modo de Además, las funciones se encuentran expli- programas, pasaremos al bucle loop(), en
//trabajo y el puerto a usar cadas en la página web oficial de Arduino el que primero colocaremos una variable
EthernetServer server(80); [5]. cliente que se encargará de escuchar si hay
En los tres primeros ejemplos trabajare- algún cliente conectado al servidor Ether-
Asimismo, en el caso de trabajar con el mos con el módulo como servidor web y la netClient client = server.available(). Una
módulo como cliente, lo configuraremos estructura del código va a ser bastante vez que sabemos si hay alguien conectado,
de la siguiente forma: similar. En el bucle setup() inicializamos el por medio de un bucle if entramos en la

Listado 4: Cliente Web: Lectura Twitter


001 //Añadimos la librerías que 036 070 if (inChar != ‘<’) {
vayamos a utilizar 037 // Conexión DHCP: 071 tweet += inChar;
002 #include <SPI.h> 038 Serial.println(“Obteniendo 072 }
003 #include <Ethernet.h> dirección IP mediante DHCP”); 073 else {
004 039 if (!Ethernet.begin(mac)) { 074 // Comprobar la aparición
005 // Definimos la MAC y la IP del 040 // Si falla la conexión: de “<” como final de tweet
servidor 041 Serial.println(“Fallo al 075 readingTweet = false;
006 // Identificador del módulo obtener dirección IP mediante 076 Serial.println(tweet);
Ethernet: DHCP, intentando de manera 077 // Cerrar la conexión
007 byte mac[] = { 0x90, 0xA2, 0xDA, manual”); 078 client.stop();
0x0D, 0x20, 0x71 }; 042 Ethernet.begin(mac, ip); 079 }
008 // Dirección IP asignada al 043 } 080 }
Arduino Ethernet Shield: 044 Serial.print(“My address:”); 081 }
009 IPAddress ip(192,168,1,203); 045 Serial.println 082 }
010 (Ethernet.localIP()); 083 else if (millis() - lastAt-
011 // Inicializa el modo de trabajo 046 // Conexión a Twitter: temptTime > requestInterval) {
012 EthernetClient client; 047 connectToServer(); 084 // Si han pasado dos minutos
013 048 } desde la ultima conexión,
014 // Delay entre peticiones 049 reconectar
015 const unsigned long request 050 void loop() 085 connectToServer();
Interval = 60000; 051 { 086 }
016 052 if (client.connected()) { 087 }
017 // Twitter URL 053 if (client.available()) { 088
018 char serverName[] = 054 // Lectura de los datos 089 void connectToServer() {
“api.twitter.com”; recibidos 090 // Conexión al servidor
019 055 char inChar = client.read(); 091 Serial.println(“Conectando al
020 boolean requested; 056 currentLine += inChar; servidor...”);
021 unsigned long lastAttempt 057 092 if (client.connect
Time = 0; 058 // Comprobar si recibimos (serverName, 80)) {
022 una nueva linea 093 Serial.println(“Haciendo
023 //Cadenas para almacenar texto 059 if (inChar == ‘\n’) { solicitud HTTP...”);
024 String currentLine = “”; 060 currentLine = “”; 094 // Solicitud HTTP GET a
025 String tweet = “”; 061 } Twitter
026 062 // Comprobar la aparición de 095 client.println(“GET /1/
027 boolean readingTweet = false; “<text>” como inicio de tweet statuses/user_timeline.xml?sc
028 063 if ( currentLine.endsWith reen_name=LuisMartinNuez&coun
029 void setup() { (“<text>”)) { t=1 HTTP/1.1”);
030 // Reservar espacio para las 064 // Limpiar cadena de tweet, 096 client.println(“HOST:
cadenas ya que comienza api.twitter.com”);
031 currentLine.reserve(256); 065 readingTweet = true; 097 client.println();
032 tweet.reserve(150); 066 tweet = “”; 098 }
033 067 } 099 lastAttemptTime = millis();
034 // Inicializa el puerto serie: 068 // Recepción del tweet: 100 }
035 Serial.begin(9600); 069 if (readingTweet) {

34 HARDWARE W W W. L I N U X - M A G A Z I N E . E S
Domótica (I) ARDUINO

del valor que nos suministre un valor


directamente proporcional de luz al valor
presente, por lo que utilizaremos una fun-
Figura 10: Tweet realizado con cuenta pri- ción ya conocida para adaptar niveles de 0
vada. a 100% la luminosidad:
Figura 11: Lectura serie del tweet realizado.
estructura encargada de recibir la petición valorLDR = map(valorLDR, U
del cliente y, en función de ella, realizare- 0, 1023, 100, 0) screen_name=LuisMartinNuezU
mos las acciones pertinentes sobre el &count=1 HTTP/1.1”);
Arduino o al revés. También hay definidas Ver Figura 9.
variables que nos permiten tramitar la peti- Para el tercer ejemplo de trabajo con un En mi caso, utilicé el código con mi cuenta
ción del cliente y un bucle while para tra- servidor web, vamos a realizar la acción personal @LuisMartinNuez (ver Figura
bajar únicamente cuando haya un cliente opuesta. Es decir, modificar una salida del 10) y el resultado se puede ver en la Figura
conectado. Arduino en función de lo que esté pasando 11.
Aunque a partir de esta configuración en la página web, según las acciones del
general, para trabajar como servidor, lo cliente. Para ello trabajaremos con directo- Casa domótica: siguientes pasos
que realmente nos interesa es la parte que rios en nuestra página web, utilizando la IP Gracias al módulo Ethernet hemos conse-
viene despúes. del Arduino seguida de un parámetro que guido “conectar” nuestra casa a Internet,
En el primero de los ejemplos, queremos indique en cual de ellos estamos en el sentido de conectar la conexión de
subir a nuestra página web el estado de un (http://192.168.1.203/$X donde X será el Internet, que posiblemente todos tenga-
pulsador conectado a Arduino, algo muy numero de directorio al que queramos mos ya en nuestro hogar, a un dispositivo
similar a encender un LED al actuar el pul- acceder) . Trabajaremos al igual que con que pueda recibir y enviar datos al mundo
sador. Para ello a partir de que comenza- las lecturas, únicamente realizando un físico. Sin embargo, no tenemos una
mos a tramitar la solicitud HTTP, debemos bucle que compruebe en que directorio se cobertura total en nuestro hogar, ya que
utilizar la lectura del pulsador para impri- encuentra y en función de esto, encendere- sólo podremos con este único dispositivo
mirlo de manera idéntica al puerto serie de mos o apagaremos el LED. llegar a controlar una sola habitación a lo
Arduino, pero en este caso para imprimirla Para encender el LED sólo es necesario más, a no ser que nos queramos poner a
en nuestra página web usamos acceder a la IP de nuestra pagina web tirar cable por toda nuestra casa, algo que
seguido del directorio al que queremos seguramente no haría mucha gracia a
client.println(“PULSADO”) conectarnos: vuestra madre o pareja.
Para evitarnos problemas de este tipo
Para finalizar los programas de servidor, http://IP_DEL_ARDUINO/$1 (el cobre va muy caro últimamente),
cerramos la estructura del loop compro- vamos a crear en el siguiente artículo una
bando cuando ha finalizado la solicitud del Para apagarlo hay que realizar la misma red de distintos nodos repartidos en las
cliente y cerramos la conexión. Podemos acción pero con el otro directorio: diferentes habitaciones, todos ellos inter-
observar los resultados, en nuestro caso comunicados por medio de wireless.
trabajando en local, accediendo con el http://IP_DEL_ARDUINO/$2 Nuestro Arduino, conectado al Arduino
navegador a la dirección IP asignada Ethernet Shield, será nuestro nodo princi-
(Figura 8). En el último de los ejemplos que tenemos pal, que recibirá los datos de todos los
De manera similar, en el segundo ejem- en este artículo, vamos a realizar una lec- demás (que no tendrán conexión a Inter-
plo, en vez de una lectura digital, realizare- tura del último tweet realizado por una net) y los subirá a nuestro servidor web,
mos una lectura analógica del valor de cuenta de Twitter, para mostrar cómo tra- para poder tenerlos disponibles en todo
luminosidad proporcionado por una LDR baja el módulo como cliente web. No momento. ■
(muy parecida al caso del potenciómetro). vamos a entrar demasiado en detalle, ya
Como comentamos en el apartado de que no es la aplicación que a nosotros Recursos
hardware, hay que realizar la conversión mas nos interesa de cara a domotizar [1] Arduino Ethernet Shield:
nuestra casa, pero se trata de un ejemplo http://www.cooking-hacks.com/index.
Tabla 1: Clases según el modo muy interesante y con resultados gratifi- php/arduino-ethernet-shield-2474.
Cliente Servidor cantes. html
Client() Server() Mantiene una estructura semejante a la [2] Cooking Hacks:
connected() begin() del módulo trabajando como servidor, http://www.cooking-hacks.com/
connect() available() pero lo que a nosotros realmente nos inte- [3] Artículo “Arduino:E/S digitales. Elec-
write() write() resa es la función que realiza la solicitud a trónica diferente”. Ver pág. 20.
print() print() la página de Twitter, ya que en ella debéis
[4] Artículo “Arduino: Entrada analógica
println() println cambiar mi dirección por aquella de la que y salida PWM”. Ver pág. 24.
available() queráis leer el último tweet.
[5] Sitio web oficial de Arduino en espa-
read()
ñol:
flush() client.println(“GET U
stop() http://www.arduino.cc/es/
/1/statuses/user_timeline.xml?U

W W W. L I N U X - M A G A Z I N E . E S HARDWARE 35
ARDUINO Domótica (II)

Krishnakumar Sivaraman - 123RF.com


Encendiendo las luces de nuestra casa

Centro de Control
Podemos manejar casi cualquier dispositivo eléctrico/electró-

nico de nuestro hogar, sin necesidad de estar allí para activarlo.

Por Luis Martín

Así que vamos a comenzar a domotizar similares (del que queramos controlar su Podemos encontrar numerosos tipos de
nuestra casa en serio, pero de la manera encendido y apagado): control de la cale- relés o módulos que trabajan con ellos y
más sencilla y a la vez más vistosa que facción o aire acondicionado, control son compatibles con Arduino en la página
podamos implementar. Como seres huma- paterno de la televisión/ordenador, etc. web de Cooking Hacks. Pero para este pro-
nos, somos vagos por naturaleza y lo que yecto únicamente presentaremos dos de
buscamos es siempre llegar a una meta El relé ellos por su sencillez y utilidad.
con el menor esfuerzo posible. Es algo Para poder controlar las luces de nuestra El módulo con el que principalmente
innato y más en los que nos dedicamos a casa, debemos saber que este tipo de apa- vamos a trabajar es el Relay Module
estas ramas de la electrónica e informá- ratos eléctricos están conectados y se ali- (Arduino Compatible) (Figura 1) [1]: una
tica. mentan por medio de la red eléctrica (el pequeña placa que nos permite controlar
Sólo hay que ver por ejemplo, ese gran típico enchufe de nuestro hogar). Igual un equipo eléctrico actuando sobre su
invento que ha revolucionado la manera esto ya lo sabéis y os parece un comenta- línea de alimentación. Al ser modular, se
de ver y sentir en esta sociedad, el mando rio innecesario, pero con 230 voltios de conecta de manera sencilla a Arduino y se
a distancia. Quién no recuerda, el como a corriente alterna nunca está de más: puede controlar con una simple salida
la orden de tu padre, te sentías orgulloso nunca manipuléis ningún dispositivo digital.
de ser el “elegido” de levantarte a cambiar conectado a la corriente, trabajar siem- Si tuviéramos que controlar numerosos
el canal de la televisión y suerte si no te pre y cercioraros de que está desconec- dispositivos podríamos recurrir al Relay
tocaba sintonizar la imagen con la tado. Shield (Figura 2) [2]. Se trata de un
ruleta… Para poder trabajar con la red, y en vista módulo, muy similar al anterior, que
Pero ahora esto ha cambiado, cuanto de que tiene unas características distintas incluye cuatro relés para aplicaciones de
menos te cueste en dinero y en esfuerzo, a los típicos circuitos de 5 voltios que utili-
mejor. Y por ello vamos a aprender en este zamos con Arduino, debemos presentar
artículo cómo controlar los dispositivos un nuevo componente electrónico: el relé.
eléctricos de nuestro hogar, ya sea vía El relé es un dispositivo electromecá-
Internet o bien, utilizando comunicación nico. Esto quiere decir que es como un
inalámbrica Xbee, ambas formas utiliza- interruptor típico de nuestra casa pero
das ya en anteriores artículos. controlado de manera eléctrica, gracias a
Nos centraremos únicamente en el con- la ayuda de un electroimán. Es un disposi-
trol de las luces, ya que es el caso más tivo muy útil, ya que nos permite con una
conocido, pero se puede aplicar a cual- tensión baja (5 voltios), controlar tensio-
quier tipo de dispositivo de características nes y potencias mucho mayores. Figura 1: Relay module (Arduino Compatible).

36 HARDWARE W W W. L I N U X - M A G A Z I N E . E S
Domótica (II) ARDUINO

tensión como un
simple interruptor,
de manera que si lo
colocamos en un
cable, cuando no
apliquemos tensión,
el cable estará cor-
tado, pero si aplica-
mos tensión en el
Figura 2: Relay Shield. relé, el cable condu-
cirá la electricidad.
control en baja y alta tensión. Especial- (Figura 3)
mente diseñado para aplicaciones de En el módulo con
robótica, control industrial o domótica. el relé podemos Figura 3: Esquema conexión relé.
Podéis encontrar también un tutorial en encontrar dos
Arduteka [3], con un ejemplo en el que se conectores, uno de ellos blanco con un recibe señal de encendido, está el inte-
utiliza el relé con otras tensiones de ali- conector especial que servirá para enviar rruptor abierto, por lo tanto no hay
mentación, desconectando un Arduino en la señal de control del relé y otro verde conexión eléctrica y la lámpara está
función de la temperatura. atornillable, que es el que vamos a utilizar apagada.
para trabajar con la corriente alterna. Para el caso general, como podemos ver
Diseño del Hardware En el conector verde encontraremos en la Figura 3, utilizaremos COM con la
Como nos hemos decidido a trabajar úni- cuatro posibles conexiones con distintos señal que viene de la red y NO al disposi-
camente para estos ejemplos con un sólo nombres: tivo eléctrico (de manera que si no aplica-
relé, vamos a explicar cómo debemos 1. COM: la entrada positiva del cable. mos señal de control, la lampara estará
conectarlos tanto en el lado de baja ten- 2. N/A: no conectado / no se utiliza. apagada).
sión, como en el de la red. De manera 3. NC: Normalmente Cerrado, lo que sig- Por otro lado está el conector blanco, en
similar podemos conectar varios relés en nifica que cuando el relé no recibe señal el que encontramos la señal de control, la
el Relay Shield. de encendido, está el interruptor alimentación (5voltios) y la masa (GND).
Comenzaremos explicando la parte cerrado, por lo tanto hay conexión eléc- Conectaremos entonces alimentación y
común para cualquiera de los ejemplos, trica y la lámpara está encendida. masa en sus respectivos pines de Arduino
que es la conexión del dispositivo eléctrico 4. NO: Normalmente Abierto (Open), lo y la señal de control en una salida digital
a la red. Debemos tratar la parte de alta que significa que cuando el relé no libre (ver Figura 4).

Listado 1: Control de luces vía Twitter


001 //Añadimos la librerías que 023 // Twitter URL 047
vayamos a utilizar 024 char serverName[] = 048 // Conexión DHCP:
002 #include <SPI.h> “api.twitter.com”; 049 Serial.println(“Obteniendo
003 #include <Ethernet.h> 025 dirección IP mediante DHCP”);
004 026 boolean requested; 050 if (!Ethernet.begin(mac)) {
005 // Variables estáticas 027 unsigned long lastAttemptTime = 051 // Si falla la conexión:
006 int rele = 7; // Declaramos la 0; 052 Serial.println(“Fallo al
variable pin del relé 028 obtener dirección IP mediante
007 029 //Cadenas para almacenar texto DHCP, intentando de manera
008 // Variables dinámicas 030 String currentLine = “”; manual”);
009 int estadoLuz = 0; // Variable 031 String tweet = “”; 053 Ethernet.begin(mac, ip);
para estado del relé 032 String encenderLuz = “>ENCENDER 054 }
010 LUZ by LuisMartin”; 055 Serial.print(“My address:”);
011 // Definimos la MAC y la IP del 033 String apagarLuz = “>APAGAR LUZ 056 Serial.println
servidor by LuisMartin”; (Ethernet.localIP());
012 // Identificador del módulo 034 057 // Conexión a Twitter:
Ethernet: 035 boolean readingTweet = false; 058 connectToServer();
013 byte mac[] = { 0x90, 0xA2, 0xDA, 036 059 }
0x0D, 0x20, 0x71 }; 037 void setup() { 060
014 // Dirección IP asignada al 038 // Reservar espacio para las 061 void loop()
Arduino Ethernet Shield: cadenas 062 {
015 IPAddress ip(192,168,1,203); 039 currentLine.reserve(256); 063 if (client.connected()) {
016 040 tweet.reserve(150); 064 if (client.available()) {
017 // Inicializa el modo de trabajo 041 065 // Lectura de los datos
018 EthernetClient client; 042 // Inicializa el pin del relé recibidos
019 como salida: 066 char inChar = client.read();
020 // Delay entre peticiones 043 pinMode(rele, OUTPUT); 067 currentLine += inChar;
021 const unsigned long 044 068
requestInterval = 10000; 045 // Inicializa el puerto serie: 069 // Comprobar si recibimos una
022 046 Serial.begin(9600); nueva línea

W W W. L I N U X - M A G A Z I N E . E S WWW.LINUX- MAGAZINE.ES HARDWARE 37


ARDUINO Domótica (II)

Para el
segundo ejem-
plo, necesitare-
mos modificar
de manera simi-
lar el circuito del
ejemplo que
vimos en el artí-
culo citado en el
párrafo anterior
en el que inter-
actuábamos con
Twitter. (Figura
6).
Vistos estos
Figura 4: Conexión relé. dos sencillos Figura 5: Circuito control de luces
ejemplos, pasa- inalámbrico .
Los ejemplos que vamos a trabajar son remos a la parte del código, que tampoco
muy similares a otros que ya hemos visto es complicada. tweet realizado por una cuenta de Twitter
en anteriores artículos, la única diferen- [5]. En este caso, en función del mensaje
cia es que en esos casos actuábamos Programación twitteado, realizaremos la acción de
sobre un LED y en este caso, sobre el Es tan sencilla en este caso la parte de pro- encender las luces o apagarlas.
relé. gramación que, para el primer ejemplo de Para empezar aumentaremos el retardo
Debemos utilizar pines I/O de Arduino control de la luz vía inalámbrica, única- que existe entre cada vez que enviamos
que no estén ocupados por los otros mente debemos utilizar el mismo código una petición de lectura a Twitter, para así
módulos que vamos a utilizar. que utilizamos para controlar el LED, tener un control casi inmediato de las
El primer ejemplo es prácticamente cambiando si es necesario la salida digital luces.
idéntico al de control de un LED por asignada al LED por la nueva del relé.
medio de un pulsador de manera inalám- De esta manera tan sencilla podemos // Delay entre peticiones
brica que vimos en el artículo “Hogar en activar distintos dispositivos de nuestra const unsigned long U
Red” [4], con la única diferencia de que, casa, sin tener que movernos del sitio, requestInterval = 10000;
en este caso, lo que controlaremos será el pulsando un botón.
estado de la luz de nuestro hogar, desde El segundo ejemplo, sí que supone un Para saber si el tweet realizado se corres-
otra habitación y sin tener que levantar- poco más de trabajo. Partiremos del ejem- ponde con la orden que enciende o apaga
nos (ver Figura 5), plo que ya hicimos, en el que leíamos un las luces, almacenaremos las “palabras

Listado 1: Control de luces vía Twitter ( Continuación)


070 if (inChar == ‘\n’) { 090 110 // Si han pasado dos minutos
071 currentLine = “”; 091 // Comparo el tweet con la desde la última conexión,
072 } variable de encendido reconectar
073 // Comprobar la aparición de 092 if (tweet == encenderLuz) { 111 connectToServer();
“<text>” como inicio de tweet 093 estadoLuz = HIGH ; 112 }
074 if ( 094 digitalWrite 113 }
currentLine.endsWith(“<text>”) (rele,estadoLuz) ; 114
){ 095 } 115 void connectToServer() {
075 // Limpiar cadena de tweet, 096 // Comparo el tweet con la 116 // Conexión al servidor
ya que comienza variable de apagado 117 Serial.println(“Conectando al
076 readingTweet = true; 097 if (tweet == apagarLuz) { servidor...”);
077 tweet = “”; 098 estadoLuz = LOW ; 118 if (client.connect(serverName,
078 } 099 digitalWrite 80)) {
079 // Recepción del tweet: (rele,estadoLuz) ; 119 Serial.println(“Haciendo
080 if (readingTweet) { 100 } solicitud HTTP...”);
081 if (inChar != ‘<’) { 101 120 // Solicitud HTTP GET a Twitter
082 tweet += inChar; 102 // Cerrar la conexión 121 client.println(“GET /
083 } 103 client.stop(); 1/statuses/user_timeline.xml?s
084 else { 104 creen_name=LuisMartinNuez&
085 // Comprobar la aparición 105 } count=1 HTTP/1.1”);
de “<” como final de tweet 106 } 122 client.println(“HOST:
086 readingTweet = false; 107 } api.twitter.com”);
087 108 } 123 client.println();
088 Serial.println 109 else if (millis() - 124 }
(“---------------“); lastAttemptTime > 125 lastAttemptTime = millis();
089 Serial.println(tweet); requestInterval) { 126 }

38 HARDWARE W W W. L I N U X - M A G A Z I N E . E S
Domótica (II) ARDUINO

Figura 7: Lectura Twitter monitor serie.

07 // Comparo el tweet con la


08 // variable de apagado
09 if (tweet == apagarLuz) {
10 estadoLuz = LOW ;
11 digitalWrite
(rele,estadoLuz);
Figura 6: Circuito control de luces Ethernet.
De esta manera, podremos elegir desde
clave” que indican estas acciones. Debe- internet cuándo encender las luces. Por
mos definir al principio del código tam- ejemplo, de nuestro salón, para hacer
bién las variables nuevas con las que creer a los vecinos que estamos en casa
vamos a trabajar (ver Figura 7). sin realmente estar.

01 // Variables estáticas Casa domótica: siguientes pasos


02 int rele = 7; Podéis usar distintos sensores para contro-
// Declaramos la variable lar dispositivos eléctricos, sin que tengan
03 // pin del relé que estar activados por nosotros. Por
04 ejemplo, por medio de un sensor de luz,
05 // Variables dinámicas como con el que ya hemos trabajado
06 int estadoLuz = 0; (LDR), podemos activar las luces de tu
// Variable para cuarto cuando esté anocheciendo.
07 // estado del relé En el siguiente artículo, nos centrare-
08 mos en otra parte de la casa, el jardín. Si
09 // Palabras clave queréis controlar el buen estado de las
10 String encenderLuz = plantas de vuestra terraza o balcón, no os
“>ENCENDER LUZ by LuisMartin”; lo podéis perder. ■
11 String apagarLuz =
“>APAGAR LUZ by LuisMartin”; Recursos
[1] Relay Module (Arduino Compatible):
Y cuando en el código hemos leído el
http://www.cooking-hacks.com/index.
mensaje, introducimos una comparación php/relay-module-arduino- compati-
entre el tweet y las “palabras clave” para ble.html
saber si coinciden, y si es así, realizar las
[2] Relay Shield:
acciones pertinentes, en este caso encen- http://www.cooking-hacks.com/index.
der o apagar la luz (ver Figura 8). php/relay-shield.html
[3] Arduteka Tutorial:
01 // Comparo el tweet con la http://www.arduteka.com/2011/12/
02 //variable de encendido tutorial-arduino-0007-desconexion-po
03 if (tweet == encenderLuz) { r-temperatura-con-display-mcp9700/
04 estadoLuz = HIGH ; [4] Hogar en Red, de Luis Martín, ver
05 digitalWrite página 30.
(rele,estadoLuz);
[5] Twitter de control:
06 } https://twitter.com/LuisMartinNuez

El Autor
Luis Martín, Ingeniero Industrial en el
departamento de I+D de Cooking Hacks
en Libelium.
Figura 8: “Tweets” de control de las luces.

W W W. L I N U X - M A G A Z I N E . E S HARDWARE 39
ARDUINO Domótica (III)

Hay que estar preparado para lo inesperado

Seguridad

Jakub Krechowicz, 123RF.com


en el Hogar
Con sencillos montajes electrónicos, conseguiremos un sistema de vigilancia para nuestro hogar a un precio muy asequible.

Por Luis Martín

No es difícil ni caro proteger nuestro mente, como novedad, presentaremos vuestra madre o pareja, reciba una lla-
hogar de intrusos y robos. Si bien en un módulo extra que nos permita crear mada perdida en su móvil de unos
algunos casos no podemos evitarlos, hay sistemas de alimentación independiente, segundos. Esto evitaría que pudiera
formas para tratar de minimizar el no vaya a ocurrir que los ladrones corten seguir cotilleando y tuviera que contes-
riesgo. Precisamente, el tema principal el suministro eléctrico antes del robo. tar el teléfono. Posiblemente, cono-
de este artículo es la seguridad. Común- ciendo a mi madre, se quedaría en un
mente, nos referimos a seguridad como Haz de Arduino un móvil: bucle infinito de intento de intrusión en
a la ausencia de riesgo o también a la módulo GPRS mi cuarto y contestar al teléfono…
confianza en algo o alguien. Sin Vamos a comenzar presentando un Antes de utilizar el módulo debemos
embargo, el término puede tomar diver- nuevo módulo con el que trabajar junto conocer que es necesario alimentar el
sos sentidos según el área o campo a la a Arduino. Como en artículos anteriores, Arduino con una fuente de alimentación
que haga referencia. En nuestro caso, lo podemos encontrar junto a todos los externa (el USB no da la corriente sufi-
vamos a enfocarla a la protección y vigi- componentes utilizados en los ejemplos, ciente), por ejemplo una de 12v/2A y
lancia de nuestra casa y nuestros ense- en la página de Cooking Hacks [1]. En colocar el jumper de alimentación en la
res personales, porque como dice el este caso, se trata del módulo GPRS/ posición correcta (si alimentas el
refrán: en lo material, la seguridad es GSM Quadband para Arduino, SIM900 Arduino con la fuente de alimentación,
primordial. [2], el cual se muestra en la Figura 1. en posición Arduino 5V position, y si ali-
Rara es la familia que invierte dema- El módulo GPRS dispone de múltiples mentas directamente el módulo GPRS,
siado dinero en sistemas de seguridad funcionalidades: envío/recepción de en Vext position).
para el hogar. Por esto, vamos a ofrecer mensajes, llamadas perdidas, conexiones Trabajar con este módulo es muy sen-
en este tutorial dos montajes: un senci- TCP y UDP… Gracias a él vamos a poder cillo y parecido a como hemos trabajado
llo y barato sistema de detección de pre- enviar un mensaje de aviso de robo, o
sencia y otro sistema para la alerta ante realizar una llamada perdida cuando
apertura de puertas o ventanas. alguien entre en nuestra habitación.
Ejemplos muy recurridos que pueden Estas acciones por si solas no llevan a
utilizarse desde como sistema de seguri- cabo ninguna tarea de vigilancia, por lo
dad básico para tu casa ante ladrones, que necesitaremos unirlas con otros sen-
hasta como dispositivo detector de sores y actuadores para conformar un
incursiones de tu madre/padre en tu sistema de seguridad. En el apartado de
cuarto. hardware conoceremos los que vamos a
Los ejemplos que vamos a ver en este utilizar para nuestros ejemplos.
artículo pueden combinarse con los Pensar lo divertido que puede resultar
módulos y ejemplos realizados en artícu- el conseguir que cada vez que alguien Figura 1: Módulo GPRS/GSM Quadband para
los anteriores: XBee y Ethernet. Única- entre a tu cuarto, pongamos por ejemplo Arduino (SIM900).

40 HARDWARE W W W. L I N U X - M A G A Z I N E . E S
Domótica (III) ARDUINO

Figura 2: PIR: sensor de presencia para Figura 3: Fundamentos básicos del fun- Figura 4: Esquema del los principales ele-
detección de ladrones. cionamiento del PIR. mentos del PIR.

con otros módulos anteriormente [3], tenemos que pulsar durante unos segun- breve esquema del principio de funcio-
por lo que nos saltaremos la explicación dos. En la Tabla 1 podéis ver una serie namiento del sensor.
de utilizar el módulo en modo gateway, de comandos básicos de ejemplo. En cuanto al hardware del sensor, gra-
modo en el que podéis enviar comandos No os olvidéis de utilizar una tarjeta cias al esquema de la Figura 4, hay que
directamente al módulo vía monitor SIM para poder enviar mensajes o lla- observar que tiene accesibles tres pines
serie. Para trabajar en cualquiera de los madas. Y es que el módulo no tiene (alimentación, masa y la señal digital) y
modos de funcionamiento del módulo, conectividad a una operadora por sí un jumper con dos posiciones que indi-
normal o USB gateway, recordar que es solo. can los distintos modos de trigger:
necesario colocar los jumpers en la posi- • L: la señal envía pulsos, variaciones
ción correcta. Diseño del Hardware entre estado alto y bajo, cuando
Para enviar peticiones o realizar tareas El primer ejemplo que vamos a realizar, detecta presencia y un valor bajo
con el módulo, es necesario enviar dis- sin necesidad de utilizar el módulo cuando no detecta.
tintos comandos llamados comandos GPRS, es el de un sistema que nos per- • H: la señal digital se mantiene en
AT. Son una serie de palabras clave que mita detectar la presencia de un intruso valor alto cuando detecta presencia y
el dispositivo reconoce y realiza accio- en un lugar. Es un montaje muy econó- en valor bajo cuando no.
nes preestablecidas con cada una de mico, pero con unos resultados franca- Para este ejemplo lo dejaremos en modo
ellas. Es necesario enviar el comando en mente interesantes. Resumiendo, L, pero dependiendo de nuestras necesi-
mayúsculas y con un retorno de carro y cuando alguien entre a nuestro cuarto, dades, podemos elegir una u otra
fin de línea tras él (CR y NL). empezará a sonar un pitido. opción.
Por lo que para utilizarlo junto a Para ello necesitamos presentar el Conectaremos la señal digital del sen-
Arduino sólo es necesario configurar la sensor de presencia o PIR [4], similar al sor al pin 2, por lo que trabajaremos con
comunicación serie a la velocidad de tra- que se ve en la Figura 2. Se trata de un ella como si fuera el estado de un pulsa-
bajo del módulo a 115200 bps y enviar el sensor que cuando detecta presencia en dor. Para la señal acústica, que nos avi-
comando que queramos. Para encender su rango de alcance, una vez alimentado sará de la presencia de alguien, utiliza-
el módulo, tenemos un pulsador aso- a 5 voltios con el Arduino, activa una remos un zumbador [5], parecido al de
ciado a la salida digital 2 para poder señal en uno de sus pines. En el dia- la Figura 5, en el pin 12, que emite un
encenderlo por software también, que grama de la Figura 3 podemos ver un sonido bastante repelente cuando le

Listado 1: Sensor de presencia y zumbador


01 // Variables estáticas 11 Serial.begin(9600); 23 estadoPIR =
02 int sensorPIR = 2; // Declaramos 12 // Inicializa el pin del zumbador digitalRead(sensorPIR);
la variable pin del sensor de como salida: 24 // Pequeño retardo de tiempo:
presencia 13 pinMode(zumbador, OUTPUT); 25 delay(200);
03 int zumbador = 12; // Declaramos 14 // Inicializa el pin del LED como 26 // En funcin del estado del
la variable pin del zumbador salida: sersor:
04 int led = 13; // Declaramos la 15 pinMode(led, OUTPUT); 27 if (estadoPIR == HIGH) {
variable pin del LED 16 // Inicializa el pin del sensor 28 digitalWrite(zumbador, HIGH);
05 de presencia como entrada: 29 digitalWrite(led, HIGH);
06 // Variables dinámicas 17 pinMode(sensorPIR, INPUT); 30 Serial.println(“Intruso”);
07 int estadoPIR = 0; // Variable 18 } 31 }
para estado del sensor de 19 32 else {
presencia 20 void loop(){ 33 digitalWrite(zumbador, LOW);
08 21 // Lee el valor del pin del sensor 34 digitalWrite(led, LOW);
09 void setup() { y lo almacena 35 }
10 // Inicializa el puerto serie: 22 // en la variable estadoPIR 36 }

W W W. L I N U X - M A G A Z I N E . E S WWW.LINUX- MAGAZINE.ES HARDWARE 41


ARDUINO Domótica (III)

Figura 5: Zumbador utilizado en el montaje Figura 6: Esquema ejemplo “Sensor de pres- Figura 7: Sensor magnético de puerta uti-
“low-cost”. encia y zumbador”. lizado para monitorizar estado del cajón.

aplicamos tensión. Por si el zumbador esto cuando ocurra. El sensor que utili- pulsadores en artículos anteriores. La
falla, colocaremos en el pin 13 un LED zaremos es uno de efecto Hall [6], aun- señal de apertura o no del cajón la colo-
que indique visualmente lo mismo. En que implementado para su utilización caremos en el pin 8, ya que el módulo
la Figura 6 disponemos de una imagen en puerta y ventanas como muestra la GPRS utiliza los pines digitales 0 y 1
del montaje completo. Figura 7. Se trata de un sencillo disposi- para comunicarse vía serie, y el pin 2
En el segundo ejemplo que vamos a tivo que trabaja como un pulsador, aun- para encendido. La figura 8 muestra el
realizar sí que utilizaremos el módulo que en vez de pulsarlo con el dedo, se montaje de este segundo ejemplo.
GPRS. Queremos enviar un mensaje de activará con un imán, que cuando lo
texto a nuestro móvil cuando alguien acercamos se pulsa y cuando lo aleja- Programación
entre a nuestra habitación o abra nues- mos, ya no. La programación del primer ejemplo es
tro cajón secreto, por lo que necesitare- Es necesario utilizar una resistencia muy sencilla, ya que se trata de un
mos utilizar un sensor que nos avise de de 10k, al igual que en ejemplos con ejemplo muy similar al de la monitoriza-

Listado 2: Sensor magnético y GPRS


01 // Variables estáticas (UART baudrate) a la velocidad de 41 Serial.println
02 int sensorMagnetico = 8; // comunicación con el GPRS (estadoSensorMagnetico);
Declaramos la variable pin del 19 Serial.begin(115200); 42 // Pequeño retardo de tiempo:
sensor 20 // Pequeño retardo de tiempo: 43 delay(100);
03 21 delay(2000); 44
04 // Variables dinámicas 22 // Inicializa el pin de encendido 45 if (estadoSensorMagnetico == 0){
05 int estadoSensorMagnetico = 0; // del módulo como salida: 46 // Pequeño retardo de tiempo:
Variable para estado del sensor 23 pinMode(pinModuloOn, OUTPUT); 47 delay(1500);
06 int pinModuloOn = 2; // 24 // Enciendo el módulo GPRS 48 // Envío el numero del
Declaramos la variable pin para 25 encenderModulo(); destinatario
encender el modulo GPRS 26 // Espero un tiempo hasta que el 49 Serial.print(“AT+CMGS=\”“);
07 char módulo se encienda 50
numero_telefono[]=”*********”; 27 for (int i=0;i < 5;i++){ Serial.print(número_teléfono);
// ********* es el número al que se 28 delay(5000); 51 Serial.println(“\”“);
envía el mensaje 29 } 52 // Tras recibir un “>” envío el
08 30 // Configuro el modo mensaje de texto del mensaje
09 void encenderModulo(){ // texto 53 while(Serial.read()!=’>’);
Función encargada de encender el 31 Serial.println(“AT+CMGF=1”); 54 Serial.print(“Hola
modulo GPRS 32 // Pequeño retardo de tiempo: Linux_Magazine --> HAY UN
10 33 delay(100); INTRUSO!!! Han abierto tu
digitalWrite(pinModuloOn,HIGH); 34 } cajón”);
11 delay(2000); 35 55 // Pequeño retardo de tiempo:
12 digitalWrite(pinModuloOn,LOW); 36 void loop(){ 56 delay(1000);
13 } 37 // Lee el valor del pin del sensor 57 // Aviso del fin de mensaje
14 y lo almacena 58 Serial.write(0x1A);
15 void setup() { 38 // en la variable 59 Serial.write(0x0D);
16 // Inicializa el pin del sensor estadoSensorMagnetico 60 Serial.write(0x0A);
como entrada: 39 estadoSensorMagnetico = 61 // Pequeño retardo de tiempo:
17 pinMode(sensorMagnetico, digitalRead(sensorMagnetico); 62 delay(5000);
INPUT); 40 // Imprime por el monitor serie 63 }
18 // Inicializa el puerto serie el estado del sensor: 64 }

42 HARDWARE W W W. L I N U X - M A G A Z I N E . E S
Domótica (III) ARDUINO

Figura 9: Montaje “Sensor de presencia y Figura 10: Montaje “Sensor magnético y


zumbador”. GPRS”.

Figura 8: Esquema ejemplo “Sensor mag- void encenderModulo(){ que hemos presentado en este artículo,
nético y GPRS”. digitalWrite(pinModuloOn,HIGH); por ejemplo, realizando una fotografía
delay(2000); al ladrón, gracias a la posibilidad de
ción del estado de un pulsador. Es nece- digitalWrite(pinModuloOn, LOW); conectar la cámara que incorpora este
sario declarar e inicializar todos los } módulo y subirla en tiempo real a Inter-
pines y variables a utilizar al principio, net.
leer el pin donde está conectado el sen- El resto del código únicamente establece Pero no os asustéis, ya que gracias a
sor de presencia y en función de su el envío de los comandos necesarios Arduteka, tenemos un magnífico tutorial
estado, controlar el zumbador y el LED. para mandar el mensaje cuando detecte- [9] y ejemplo de uso a disposición de
En la Figura 9 vemos un ejemplo de este mos que el cajón está abierto. Esto ocu- todos los usuarios. ■
montaje funcionando. rrirá cuando la lectura del sensor mag-
Este sistema, que así presentado nético dé un 0, ya que será cuando el Recursos
parece muy sencillo, se puede combinar imán se separe del sensor y éste deje de
[1] Cooking Hacks:
con los ejemplos de módulos de comu- estar pulsado. En la Figura 10 podéis
http://www.cooking-hacks.com
nicación inalámbrica XBee, para poder verme, con el móvil en la mano, reci-
[2] Módulo GPRS/GSM Quadband para
colocar la señal acústica y el sensor en biendo el mensaje tras la apertura de mi
Arduino (SIM900):
partes distintas de la casa. cajón de Arduino.
El segundo ejemplo puede resultar un En este caso, hemos utilizado el http://www.cooking-hacks.com/index.
poco más difícil de entender, pero tam- módulo GPRS con el fin de presentar un php/shop/arduino/exclusive-products/
bién es bastante simple. Es necesario sistema, que pudiera seguir funcio- gprs-quadband-module-sim900-for-ar
definir el número de teléfono al que vais nando por medio de baterías, frente a duino.html
a enviar el mensaje, cambiando los un corte del suministro eléctrico. Este [3] Artículo “Centro de Control”, de Luis
“ *” por el número real. mismo ejemplo se podría implementar Martín, ver página 36 de este Especial.
con el módulo Ethernet, que ya conoce- [4] Sensor de presencia PIR:
// Variables dinámicas mos, enviando un aviso vía Internet http://www.cooking-hacks.com/index.
char numero_telefono[]=U [7]. php/pir-sensor.html
“*********”;
[5] Zumbador:
Haz de Arduino un “Smartphone”: http://www.cooking-hacks.com/index.
El código está implementado para una Módulo 3G/GPS php/buzzer-pc-mount-12mm-2-
tarjeta SIM sin código pin, por lo que si Si os habéis quedado con ganas de 048khz.html
utilizáramos una con el código pin habi- más, os propongo un nuevo módulo
[6] Sensor magnético de puerta:
litado, deberíamos utilizar el comando con muchas más prestaciones que el
http://www.cooking-hacks.com/index.
AT+CPIN=” ”. GPRS. Se trata del módulo 3G/GPS [8]
php/shop/sensors/magnetic-door-
Para evitar tener que presionar el pul- que nos permite hacer con nuestro
switch.html
sador cada vez que encendamos el Arduino casi cualquier tarea que reali-
módulo, podemos encontrar en el zaríamos con nuestro móvil de última [7] Artículo “Hogar en red”, de Luis Mar-
código una función que se encarga de generación. tín, ver página 30 de este Especial.
esto. Con llamarla en el setup, nos olvi- Con este módulo podéis mejorar nota- [8] Shield 3G/GPRS para Arduino:
daremos de tener que pulsarlo. blemente las aplicaciones de seguridad http://www.cooking-hacks.com/index.
php/3g-gprs-shield-for-arduino-3g-
Tabla 1: Comandos básicos de configuración gps.html
Comando Respuesta Descripción [9] Tutorial Arduteka :
AT OK Hay conexión con el módulo http://www.arduteka.com/2012/05/
AT+CPIN=” ” OK Desbloquear la SIM (es el pin) tutorial-arduino-0010-modulo-3g-ultra
AT+COPS? OK Información del operador sonidos-teclado-matricial-led-rgb

W W W. L I N U X - M A G A Z I N E . E S HARDWARE 43
ARDUINO Domótica (IV)

Cuidando del jardín con Arduino

Plantas que Hablan

Charchrist Dararuang 123RF.com


Todos tenemos alguna planta en nuestra casa y aunque se consideran seres vivos autosuficientes, necesitan ciertos cuidados por nuestra

parte para sobrevivir. Con unos sensores Arduino y un poco de programación, se los podemos proporcionar. Por Luis Martín

En la ciudad, mucha gente buscamos un la vez que hacemos de la jardinería una un DeLorean, pero vamos a poder con-
pequeño rincón de paz y tranquilidad labor más sencilla. trolar qué día y a qué hora queremos rea-
que nos recuerde al campo, o simple- lizar una determinada acción. Esto nos
mente utilizamos una planta para dar un Controlando el
matiz más alegre a una habitación. Sin tiempo: RTC
embargo, al sacar las plantas de su En anteriores artí-
ambiente natural, éstas necesitan de culos hemos traba-
cierta ayuda para poder sobrevivir y jado con numero-
mantenerse sanas: riego, iluminación, sos juguetes para
nutrientes, etc. Arduino, desde
Con el fin de evitar que nuestra planta sencillos sensores
muera por falta de cuidados o simple- hasta actuadores
mente porque nos olvidemos de regarla, sobre la red eléc-
vamos a centrar este artículo en diseñar trica. Pero ahora
sistemas que permitan dotar a nuestras toca ponernos con
plantas de lo que les hemos privado al algo más serio: el
sacarlas de su entorno: autosuficiencia. control del tiempo.
Usando la tecnología, podemos entender No vamos a lograr
mejor lo que nuestras plantas sienten, a viajar al pasado en Figura 1: Módulo RTC utilizado para conocer la fecha y la hora.

44 HARDWARE W W W. L I N U X - M A G A Z I N E . E S
Domótica (IV) ARDUINO

Vigilando la
temperatura
Para un segundo ejem-
plo en este artículo,
vamos a necesitar el
uso de sensores que
nos proporcionen datos
sobre el estado de
nuestras plantas. Sin
embargo, no podemos
recurrir a los sensores
de temperatura o
Figura 2: Sonda para medir la temperatura humedad clásicos, con
de la tierra por medio del protocolo 1-Wire. los que ya hemos tra-
bajado en otros artícu- Figura 4: Montaje del ejemplo de riego a una determinada hora.
servirá para poder establecer un determi- los.
nado horario para regar nuestro jardín. Debemos tener en cuenta que vamos a protocolo es que nos permite utilizar
Para ello vamos a recurrir a un disposi- trabajar en unas condiciones especiales, múltiples sensores conectados a la vez
tivo que permita a nuestro Arduino ya que mediremos estos parámetros en en un único pin digital.
conocer el día en que está y la hora a la el interior de la maceta o bajo tierra. Para Nosotros vamos a usar únicamente
que está haciendo funcionar un código. ello vamos a utilizar la sonda que podéis un sensor, el cual tiene 3 pines: alimen-
Su nombre es RTC [2], Real Time Clock, ver en la Figura 2, una sonda de tempe- tación, señal y masa. En cuanto al
un reloj en tiempo real que se comunica ratura digital [2] especialmente diseñada hardware lo conectaremos como si se
con nuestro Arduino por medio de un para trabajar en estas condiciones adver- tratara de un sensor digital más, ali-
protocolo hasta ahora no utilizado en sas. mentándolo a 5 voltios y con la señal
este proyecto. Gracias a una pequeña La única pega de este sensor es que no conectada a un pin digital de Arduino.
pila de botón y por unos pocos euros, funciona como un sensor digital normal La única diferencia es que va a ser
tenemos a nuestro Arduino en hora aún sino que utiliza un protocolo llamado 1- necesario colocar una resistencia de
cuando no lo tengamos alimentado. Wire. Para no ser demasiado pesimistas, pull-up, entre 5 voltios y señal, de 4k7
Como podemos ver en la Figura 1, úni- podemos verlo como algo nuevo que para alimentar correctamente el dispo-
camente necesita 4 cables para conec- vamos a aprender. Lo interesante de este sitivo.
tarlo a Arduino. I2C es un protocolo de
comunicaciones de bus serie, accesible Listado 1: Medir temperatura con protocolo 1-Wire
en Arduino en los pines 4 y 5 analógicos,
01 // Incluimos la librería para 16 Serial.begin(9600);
correspondientes con los pines SCL,
establecer comunicación 17 // Mensaje de inicio
linea de reloj, y SDA, linea de datos. Los
mediante el protocolo 1-Wire 18 Serial.println(“Ejemplo
otros dos pines del dispositivo son ali-
02 #include <OneWire.h> solicitud temperatura”);
mentación y masa.
03 // Incluimos la librería para 19
Gracias a la librería Wire de Arduino,
comunicarnos con los sensores de 20 // Inicializa el protocolo
no nos va a resultar difícil trabajar con el
manera sencilla 1-Wire y el sensor
protocolo I2C. No necesitamos compren-
04 #include <DallasTemperature.h> 21 sensores.begin();
der en profundidad este protocolo, ya
05 // Definimos el pin de Arduino 22 }
que se trata de un sencillo bus serie
que se usará con el protocolo 23
basado en la estructura maestro/esclavo,
1-Wire 24 void loop() {
pero cuando empecemos con la progra-
06 #define ONE_WIRE_BUS 8 25 // Solicitamos la temperatura
mación veremos en mayor profundidad
07 al dispositivo
su funcionamiento.
08 // Creamos una clase “oneWire” 26 Serial.print(“Solicitando
para trabajar en el pin elegido Temperatura...”);
09 OneWire oneWire(ONE_WIRE_BUS); 27 sensores.
10 requestTemperatures();
11 // Pasamos los datos del 28 Serial.println(“”);
protocolo 1-Wire a la libreria 29 // Imprimimos el valor de la
de Dallas en una nueva clase temperatura
12 DallasTemperature 30 Serial.print(“La temperatura
sensores(&oneWire); de la planta es: “);
13 31 Serial.println
14 void setup() { (sensores.getTempCByIndex(0));
Figura 3: Bomba sumergida para el sistema
15 // Inicializa el puerto serie 32 }
de riego.

W W W. L I N U X - M A G A Z I N E . E S WWW.LINUX- MAGAZINE.ES HARDWARE 45


ARDUINO Domótica (IV)

renombrarlas con los nombres que aca-


bamos de comentar. Una vez listas, las
copiamos en la carpeta libraries que
encontramos dentro del IDE de Arduino.
Una vez que hemos realizado este pro-
ceso, al abrir el IDE, veremos como se
han añadido las dos nuevas librerías.
En el Listado 1 podemos observar
como de manera sencilla solicitamos la
Figura 5: Sensor de humedad de tierra uti- temperatura a la sonda e imprimimos el Figura 6: Sensor de humedad de tierra real-
lizado en el segundo montaje. resultado por el monitor serie. Sólo es izando una medida.
necesario crear una clase para trabajar
Sin embargo, en cuanto a software la con ella en el código, como si de un tamaño, como podemos observar en la
cosa cambia. Necesitamos comunicarnos servo se tratara, y recurrir a funciones ya Figura 3, controlable desde un pin digi-
con el sensor de una manera especifica y definidas en la librería que sirven para tal. Sin embargo, si queremos utilizar
para ello vamos a recurrir a utilizar una solicitar el dato al sensor. otra bomba o incluso una que ya tene-
combinación de librerías para Arduino, mos instalada en nuestra casa, no hay
que te permiten comunicarte con dispo- Diseño del Hardware ningún problema. Necesitaremos única-
sitivos por medio del protocolo 1-Wire. Estos dos conceptos de control de tiempo mente saber cuál es su tensión de fun-
Necesitamos descargar 2 librerías: una y temperatura, bajo nuevos protocolos cionamiento, y recordar los conceptos
primera llamada OneWire [3], que per- de comunicaciones, van a ser la base de que aprendimos sobre el control de un
mite a Arduino establecer comunicación los dos ejemplos que vamos a realizar en relé en el artículo de control del hogar
con dispositivos diseñados para funcio- este artículo. [6].
nar con el protocolo 1-Wire y otra llama- El primero de ellos se basa en el riego Conectaremos el sistema de la misma
da DallasTemperature[4], utilizada para controlado en tiempo real, para lo que manera que se ve en la Figura 4: la
que el intercambio de información entre además de utilizar el RTC, vamos a nece- bomba, en nuestro caso, al pin digital 13
dispositivos por medio del protocolo 1- sitar un sistema de riego que podamos y a masa, y el RTC a 5V, GND, pin analó-
Wire sea sencillo y amigable. Para traba- activar a una determinada hora. gico 4 (SDL) y 5 (SDA).
jar con ellas lo único que tenemos que Podemos recurrir a una sencilla Para el segundo ejemplo, utilizaremos
hacer es descargarlas, descomprimirlas y bomba sumergible [5] de pequeño el sensor de humedad de tierra [7] de la

Listado 2: Control en tiempo real del riego


001 //Incluimos la librera Wire números de 0-9 (BCD) a número 037 Wire.write(decBcd(minuto));
para trabajar con I2C normal decimal 038 Wire.write(decBcd(hora));
002 #include “Wire.h” 018 byte bcdDec(byte val) { 039 Wire.write
003 // Dirección de trabajo del I2C 019 return ( (val/16*10) + (decBcd(diaSemana));
004 #define DS1307_I2C_ADDRESS (val%16) ); 040 Wire.write(decBcd(diaMes));
0x68 020 } 041 Wire.write(decBcd(mes));
005 021 042 Wire.write(decBcd(anyo));
006 // Variables estáticas 022 // Función para poner en hora el 043 Wire.endTransmission();
007 byte segundo, minuto, hora, sistema 044 }
diaSemana, diaMes, mes, anyo; 023 void configurarTiempo() { 045
008 024 // 1) Configuro los valores de 046 // Función para pedir la hora al
009 // Declaramos variables de fecha y hora sistema
tiempo 025 segundo = 00; 047 void solicitarTiempo()
010 int sistemaRiego = 13; 026 minuto = 25; 048 {
// Declaramos la variable pin 027 hora = 13; 049 // Reseteamos el puntero de
del LED 028 diaSemana = 1; registro
011 029 diaMes = 29; 050 Wire.beginTransmission
012 // Función para convertir de 030 mes = 10; (DS1307_I2C_ADDRESS);
número normal decimal a números 031 anyo= 12; 051 Wire.write(0x00);
de 0-9 (BCD) 032 052 Wire.endTransmission ();
013 byte decBcd(byte val) { 033 // 2) Comandos para poner en 053
014 return ( (val/10*16) + marcha el reloj 054 // Solicitamos la hora y fecha
(val%10) ); 034 Wire.beginTransmission 055 Wire.requestFrom
015 } (DS1307_I2C_ADDRESS); (DS1307_I2C_ADDRESS, 7);
016 035 Wire.write(0x00); 056 segundo = bcdDec(Wire.read()
017 // Función para convertir de 036 Wire.write(decBcd(segundo)); & 0x7f);

46 HARDWARE W W W. L I N U X - M A G A Z I N E . E S
Domótica (IV) ARDUINO

El montaje con todo


conectado queda como el de
la Figura 8.

Programación
La parte de programación
para estos ejemplos va a ser
bastante breve, debido a la
utilización de librerías prede-
Figura 7: Esquema del ejemplo de control del finidas ya que los códigos se
estado de nuestra planta. encuentran densamente
comentados. Sin embargo
Figura 5, además del de temperatura. caben desatacar y aclarar Figura 8: Montaje del ejemplo de control del estado de
Este sensor trabaja como un sensor ana- algunas funciones y concep- nuestra planta.
lógico resistivo. En función de la hume- tos del código.
dad nos proporciona un valor de 0 a En el primer ejemplo hemos definido riego. El resultado de este primer mon-
1023, con valores de: 500 con tierra dos funciones para comunicarnos con el taje se puede ver en la Figura 9.
húmeda, 100 con tierra seca o 1000 en RTC. La primera para poner en hora el El segundo ejemplo no necesita nin-
agua. dispositivo y la segunda para solicitar la guna aclaración, ya que únicamente
Para colocar estos sensores en nuestro hora. Como es de esperar, sólo es nece- medimos el valor de los dos sensores y
jardín no vamos a encontrar mucho pro- sario poner en hora una vez nuestro realizamos una llamada cuando se van
blema, ya que el de temperatura viene reloj, ya que sino, cada vez que se eje- de un rango determinado.
en formato sonda y lo único que debe- cute el código reiniciaríamos la hora. Obtenemos como resultado, algo bas-
mos hacer es enterrarlo en la tierra, y el Para ello una vez que ejecutemos el pro- tante peculiar: a nuestras plantas hacién-
de humedad viene en forma de V para grama por primera vez, es necesario car- donos una perdida al móvil para avisar-
clavarse en la zona superficial de la tie- garle el código de nuevo con la función nos que necesitan ser regadas.
rra cercana a la planta, como se puede de puesta en hora comentada.
ver en la Figura 6. Siguientes pasos
Para avisar cuando llega a ser peli- // configurarTiempo(); Para este último ejemplo hemos utilizado
groso el valor de esos parámetros, vamos el aviso mediante llamada perdida, que
a utilizar el módulo GPRS, aprovechando El resto del código únicamente sirve para nos permite realizar el módulo GPRS,
que ha sido el último módulo de comu- solicitar la hora y comparar con una hora para que sea un sistema sin coste alguno.
nicaciones con el que hemos trabajado establecida en el programa, para que Sin embargo, utilizando como base el
[8] (ver Figura 7). cuando coincida, se active el sistema de código, podemos utilizar cualquier otro

Listado 2: Control en tiempo real del riego (Continuación)


057 minuto = 073 Serial.print(mes, DEC); 090
bcdDec(Wire.read()); 074 Serial.print(“/”); 091 void loop() {
058 hora = bcdDec(Wire.read() & 075 Serial.print(anyo, DEC); 092 // Pequeño retardo de tiempo:
0x3f); 076 Serial.print(“ “); 093 delay(2000);
059 diaSemana = 077 } 094 // Leemos la hora y la fecha
bcdDec(Wire.read()); 078 void setup() { cada 2 segundos
060 diaMes = 079 // Inicializa el I2C 095 solicitarTiempo();
bcdDec(Wire.read()); 080 Wire.begin(); 096 Serial.println(“ “);
061 mes = bcdDec(Wire.read()); 081 // Inicializa el puerto serie 097
062 anyo = 082 Serial.begin(57600); 098 // En función de la hora exacta
bcdDec(Wire.read()); 083 // Inicializa el pin del LED 099 if (hora == 13) {
063 como salida 100 if (minuto == 40) {
064 // Imprimimos por el monitor 084 pinMode(sistemaRiego, 101 // Encendemos el sistema de
serie la fecha y la hora OUTPUT); riego de nuestras plantas
065 Serial.print(hora, DEC); 085 digitalWrite(sistemaRiego, 102 Serial.println(“13:40 -->
066 Serial.print(“:”); LOW); Hora de regar las plantas”);
067 Serial.print(minuto, DEC); 086 103 digitalWrite(sistemaRiego,
068 Serial.print(“:”); 087 // Configuramos la HORA ¡¡SÓLO HIGH);
069 Serial.print(segundo, DEC); EN LA PRIMERA VEZ QUE CARGUEMOS 104 }
070 Serial.print(“ “); EL CODIGO!! 105 }
071 Serial.print(diaMes, DEC); 088 configurarTiempo(); 106
072 Serial.print(“/”); 089 } 107 }

W W W. L I N U X - M A G A Z I N E . E S HARDWARE 47
ARDUINO Domótica (IV)

parte del código en la que utilizamos el hemos utilizado en los ejemplos del artí-
GPRS, por la del módulo Ethernet que culo “Hogar en red” [9]. ■

Recursos
[1] RTC: http://www.cooking-hacks.com/index.php/twig-grove-rtc.html
[2] Sonda de temperatura:
http://www.cooking-hacks.com/index.php/temperature-sensor-waterproof-ds18b20.
html
[3] Librería 1-Wire: http://www.pjrc.com/teensy/arduino_libraries/OneWire.zip
Figura 9: Impresiones en el monitor serie de
la fecha/hora hasta que se activa el sistema [4] Librería DallasTemperature:
http://download.milesburton.com/Arduino/MaximTemperature/
de riego.
DallasTemperature_372Beta.zip

sistema de comunicaciones para avisar [5] Bomba de agua:


http://www.cooking-hacks.com/index.php/immersible-pump-water-tube.html
del estado de nuestras plantas.
Si recurrimos a módulos que ya hemos [6] Artículo “Centro de control”, de Luis Martín, ver página 36 de este Especial.
utilizado en el proceso de domotización [7] Sensor de humedad:
de nuestro hogar, podríamos utilizar el http://www.cooking-hacks.com/index.php/grove-moisture-sensor.html
Arduino Ethernet Shield para subir los [8] Artículo “Seguridad en el hogar”, de Luis Martín, ver página 40.
datos o avisarnos vía internet. Para ello [9] Artículo “Hogar en red”, de Luis Martín, ver página 30.
únicamente es necesario cambiar la

Listado 3: Alarma y control de nuestras plantas


01 // Incluimos la librería para 19 1-Wire y el sensor
establecer comunicación 20 // Variables dinámicas 44 sensores.begin();
mediante el protocolo 1-Wire 21 int valorHumedad = 0; // 45 }
02 #include <OneWire.h> Variable para el valor de humedad 46
03 // Incluimos la librería para 22 float valorTemperatura = 0; // 47 void loop() {
comunicarnos con los sensores de Variable para el valor de tempe- 48 // Solicitamos la temperatura
manera sencilla ratura al dispositivo
04 #include <DallasTemperature.h> 23 49 sensores.
05 24 void encenderModulo(){ // requestTemperatures();
06 // Definimos el pin de Arduino Función encargada de encender el 50 // Almacenamos el valor de
que se usará con el protocolo modulo GPRS temperatura
1-Wire 25 digitalWrite 51 valorTemperatura =
07 #define ONE_WIRE_BUS 8 (pinModuloOn,HIGH); sensores.getTempCByIndex(0);
08 26 delay(2000); 52 // Leemos el valor analógico del
09 // Creamos una clase “oneWire” 27 digitalWrite sensor y lo almacenanos
para trabajar en el pin elegido (pinModuloOn,LOW); 53 valorHumedad =
10 OneWire oneWire(ONE_WIRE_BUS); 28 } analogRead(sensorHumedad);
11 29 54 //Compruebo si las medidas con
12 // Pasamos los datos del 30 void setup() { correctas
protocolo 1-Wire a la librería de 31 // Inicializa el puerto serie 55 if ( (valorHumedad<400) ||
Dallas 32 Serial.begin(115200); (valorTemperatura<24)) {
13 DallasTemperature 33 // Pequeño retardo de tiempo:34 56 // Realizo la llamada perdida
sensores(&oneWire); delay(2000); cuando las medidas son
14 35 // Inicializa el pin de peligrosas para nuestras plantas
15 // Variables estáticas encendido del módulo como 57 Serial.print(“ATD”);
16 int sensorHumedad = A0; // salida: 58
Declaramos la variable pin del 36 pinMode(pinModuloOn, OUTPUT); Serial.print(numero_telefono);
sensor de humedad 37 // Enciendo el modulo GPRS 59 Serial.println(“;”);
17 int pinModuloOn = 2; // 38 encenderModulo(); 60 // Llamada perdida
Declaramos la variable pin para 39 // Espero un tiempo hasta que el 61 delay(20000);
encender el modulo GPRS módulo encienda 62 // Finalizo la llamada perdida
18 char 40 for (int i=0;i < 5;i++){ 63 Serial.println(“ATH”);
numero_telefono[]=”*********”; 41 delay(20000); 64 delay(10000);
// ********* es el número al que 42 } 65 }
se envía el mensaje 43 // Inicializa el protocolo 66 }

48 HARDWARE W W W. L I N U X - M A G A Z I N E . E S
ARDUINO Domótica (V)

Control de daños en el hogar

Prevención
Utilizamos Arduino para alertarnos de peligros de accidentes en el hogar. Con Arduino podemos saber de manera inmediata y remota si hay

escapes de gas, incendios o inundaciones en nuestra casa. Por Luis Martín

Una vez más partimos de una situa- fuego. Acto seguido, debido a mi inex- El fuego es uno de los peligros más
ción o posible problema en nuestro periencia en la cocina, intente apagarlo importantes que necesitamos medir y
hogar que queremos solucionar. En con agua metiéndolo debajo del grifo… para ello vamos a recurrir a una gama
este caso, nace de mi propia experien- pero esa es otra historia. de dispositivos muy variada y con un
cia personal durante mi infancia, ya Lo que a nosotros nos importa, es evi- pequeño tamaño: los sensores de gases.
que por un despiste dejé la sartén con tar ese tipo de situaciones si a alguno de Para un primer ejemplo, en el que
el fuego encendido gracias a esos vosotros todavía no os han pasado. Para fabricaremos una alarma casera de
maravillosos mandos táctiles de las ello nos centraremos en monitorizar detección de incendios, hemos elegido
cocinas vitrocerámicas modernas. Al nuestra cocina, tanto en cuanto a gases un sensor de humos [1]. Se trata de un
internar bajar a 0 el valor de uno de los presentes como a otros posibles peli- dispositivo muy pequeño, como pode-
fogones, ya fuese por azar, por el des- gros. Fundamentalmente intentaremos mos observar en la figura 2, con 6 pati-
tino o porque soy un poco torpe, se imitar las alarmas de incendios comer- llas que nos permite medir la presencia
puso al valor máximo y yo, despreocu- ciales, que podemos encontrar en algu- de varios tipos de gases, pero básica-
pado, me fui a ver la televisión. Cual nos edificios, aunque de manera casera mente nos indica la presencia de humo
fue mi sorpresa al ver que tras unos (Figura 1). También podemos medir debido a la combustión.
pocos minutos mi salón se estaba lle- multitud de parámetros peligrosos con Su funcionamiento es bastante senci-
nando de una ligera neblina, como si el fin de evitar fugas. llo y similar al de otros muchos sensores
de un concierto se tratara, y peor aún, Este artículo tiene especial importan- de gases. En la figura 3 podemos ver un
el aceite de la sartén se había prendido cia, ya que con una pequeña inversión esquema de la asignación de pines y el
podemos evitar grandes riesgos. Porque
como todo el mundo sabe, más vale pre-
venir que curar.

Monitorización de posibles peligros


En todos nuestro artículos recurrimos a
distintos tipos de sensores: de distan-
cia, de humedad, de luminosidad….
Pero en este caso nos interesan los que
Figura 1: Alarma de incendios convencional midan potenciales peligros para nues- Figura 2: Sensor de humo utilizado para la
comercializada para profesional. tro hogar. alarma de incendios DIY.

50 HARDWARE W W W. L I N U X - M A G A Z I N E . E S
Domótica (V) ARDUINO

pequeños talleres, y su
configuración es idéntica
a la del sensor de humo.
Podemos utilizar otros
muchos sensores de
gases de similares carac-
terísticas. En las hojas de
características de cada
uno [3] podemos obser-
var los circuitos básicos Figura 4: Sensor de CO2 como ejemplo de los
Figura 3: Esquema básico de conexión y patillaje del sensor de de cada uno de ellos, por muchos tipos de sensores de gases exis-
humo que vamos a utilizar en los distintos montajes para la lo que no nos resultará tentes.
medida de gases. difícil. Como podemos
ver en el sensor de CO2 manera casera. Todo dependerá de las
montaje básico para funcionar. Única- de la figura 4, todos ellos tienen tamaño exigencias de nuestro diseño.
mente tenemos que alimentar con 5 vol- y encapsulado similar por lo que pode-
tios entre las patillas H (5V y GND) y en mos desarrollar un sistema muy modular. Activando la alarma: el transistor
A poner 5 voltios también, obteniendo Otro de los principales peligros en En nuestro primer ejemplo vamos a
la señal analógica proporcional a la can- nuestra casa, son las posibles fugas o necesitar un dispositivo de indicación
tidad de humo en B. Como adaptación roturas en las cañerías. Para detectarlo que nos avise cuando estamos en posi-
sólo necesitamos colocar una resistencia vamos a utilizar un sistema que nos ble peligro. En el montaje, utilizaremos
RL de entre 3K y 30K, entre la señal en B permita saber si hay fluidos cerca o si por simplicidad, un zumbador como con
y masa. En nuestro montaje hemos utili- hemos sufrido una inundación. El el que ya hemos trabajado anterior-
zado una de 4K7. fluido que nos importa en este caso es mente, pero de cara a un sistema real
En un segundo montaje en este artí- el agua, por lo que recurriremos a este vamos a explicar cómo se implementa-
culo, vamos a utilizar un sensor de dispositivo digital que detecta la presen- ría el control de una sirena de 12v.
metano [2], para detectar posibles fugas cia del agua [4], gracias la propiedad de Seguro que con esa alarma no se me
en nuestra cocina. Nos permite detectar ésta de conducir la electricidad. En la habría quemado la sartén.
fuego o escapes de este gas para casas o parte superior, como podemos observar Vamos a utilizar un dispositivo que ya
en la figura 5, hay una serie de tiras hemos utilizado en el control del relé del
conductoras que ante la presencia de artículo “Centro de control” [5], pero del
agua lo activan, poniendo su señal de cuál no habíamos explicado su funciona-
salida a 1. Por esto mismo y como vere- miento, el transistor [6]. Cuando contro-
mos en el código, tomaremos el valor 0 lábamos el relé por medio de una señal
como que no hay fuga de agua.
Puede ser utilizado también
como sensor analógico, para
medir la cantidad de agua que
hay en contacto con él, aunque a
nosotros no nos interesa esa
Figura 5: Sensor digital encargado de la forma de medida.
detección de presencia basado simplemente Como estos sensores, podemos
en el hecho de que el agua conduce la electri- encontrar muchos otros, o Figura 6: Transistor NPN que podemos utilizar para
cidad. incluso fabricarlos nosotros de activar una sirena de 12v: conexionado y patillaje.

Listado 1: Alarma de incendios básica DIY


01 // Variables estáticas 09 void setup() { (valorHumo,0,1023,0,100);
02 10 // Inicializa el pin del zum- 18 // Pequeño retardo de tiempo:
03 int sensorHumo = A0; // bador como salida: 19 delay(50);
Declaramos la variable pin del 11 pinMode(zumbador, OUTPUT); 20 // Si se dispara el nivel de humo
sensor humo 12 } activamos la alarma:
04 int zumbador = 13; // Declar- 13 21 if (valorHumo > 60) {
amos la variable pin del zumbador 14 void loop() { 22 digitalWrite(zumbador, HIGH);
05 15 // Leemos el valor analógico del 23 }
06 // Variables dinámicas sensor y lo almacenanos en % 24 else {
07 int valorHumo = 0; // Variable 16 valorHumo = analogRead(sen- 25 digitalWrite(zumbador, LOW);
para el valor del sensor de humo sorHumo); 26 }
08 17 valorHumo = map 27 }

W W W. L I N U X - M A G A Z I N E . E S WWW.LINUX- MAGAZINE.ES HARDWARE 51


ARDUINO Domótica (V)

digital, estábamos utilizando un transis- Está compuesto por tres zonas llama- Al estar trabajando con 12 voltios, no
tor integrado en el módulo similar al de das Colector, Base y Emisor. Y depen- es necesario en principio trabajar con el
la figura 6 para activarlo o desactivarlo. diendo de cómo se sitúen cada una de relé, ya que éste lo utilizaremos para
Un transistor es un dispositivo electró- ellas tenemos 2 tipos de transistores. tensiones más elevadas. Por ello, pode-
nico semiconductor que puede cumplir Nosotros utilizaremos un transistor mos utilizar el transistor como se indica
funciones de amplificador, oscilador, NPN, ya que su emisor va a ir conec- en la figura 7, para conmutar la tensión
conmutador o rectificador dependiendo tado a tierra. Para mas información y activar la sirena, utilizando sólo una
de su configuración, pero lo que a noso- acerca del funcionamiento del transistor resistencia para limitar la corriente por
tros nos interesa es la de conmutar una podéis recurrir al tutorial sobre este la base del transistor. Nuestro transistor
tensión sobre un dispositivo, en nuestro componente que nos facilita Arduteka funcionará como un interruptor. Si acti-
caso una sirena. [7]. vamos la señal digital del pin 13, acti-

Listado 2: Monitorización de dos posibles peligros de la cocina vía web


01 //Añadimos la librerías que 28 } sensor de presencia de liquido
vayamos a utilizar 29 57 client.print(“[Presencia
02 #include <SPI.h> 30 void loop() { de liquido”);
03 #include <Ethernet.h> 31 // Leemos el valor digital de 58 client.print(“ = “);
04 presencia de liquido 59 //Modificamos el dato en
05 // Definimos la MAC y la IP del 32 estadoLiquido = funcion de si existe liquido
servidor digitalRead(deteccionLiquido); 60 if (estadoLiquido == 0){
06 // Identificador del módulo 33 // Leemos el valor analogico del 61 client.print(“No”);
Ethernet: sensor y lo almacenanos en % 62 } else {
07 byte mac[] = { 0x90, 0xA2, 0xDA, 34 valorCO2 = analogRead(sen- 63 client.print(“Si”);
0x00, 0xFE, 0x70 }; sorCO2); 64 }
08 // Dirección IP asignada al 35 valorCO2 = map 65 client.print(“]”);
Arduino Ethernet Shield: (valorCO2,0,1023,0,100); 66
09 IPAddress ip(192,168,1,191); 36 67 //Imprimir valor de la
10 37 // Escuchamos los posibles medida de CO2
11 // Inicializa el modo de trabajo clientes entrantes 68 client.print(“ ; [Medida
y el puerto a usar 38 EthernetClient client = C02”);
12 EthernetServer server(80); server.available(); 69 client.print(“ = “);
13 39 if (client) { 70 //Imprimimos el valor de
14 // Variables estáticas 40 //Una petición HTTP termina CO2 en %
15 int deteccionLiquido= 2; // con una línea en blanco 71 client.print(valorCO2);
Declaramos la variable pin del 41 boolean currentLineIsBlank = 72 client.print(“ %] “);
sensor de presencia de liquido true; 73
16 int sensorCO2 = A0; // 42 while (client.connected()) { 74 break;
Declaramos la variable pin del 43 if (client.available()) { 75 }
sensor gas CO2 44 char c = client.read(); 76 if (c == ‘\n’) {
17 45 77 // Comienzo nueva linea
18 // Variables dinámicas 46 // Comprobar si ha 78 currentLineIsBlank = true;
19 int estadoLiquido = 0; finalizado la solicitud HTTP 79 }
// Variable para estado del sen- 47 if (c == ‘\n’ && current- 80 else if (c != ‘\r’) {
sor de presencia de liquido LineIsBlank) { 81 // Obtener carácter
20 int valorCO2 = 0; 48 // Mandar cabezera estandar 82 currentLineIsBlank =
// Variable para el valor del HTTP false;
sensor de CO2 49 client.println(“HTTP/1.1 83 }
21 200 OK”); 84 }
22 void setup() { 50 85 }
23 // Inicializa el pin del sensor client.println(“Content-Type: 86 // Damos un tiempo al servidor
de presencia de liquido como text/html”); web para recibir los datos
entrada: 51 client.println(); 87 delay(1);
24 pinMode(deteccionLiquido, 52 88 // Cerramos la conexión
INPUT); 53 client.print 89 client.stop();
25 // Iniciamos la conexión (“MONITORIZACION COCINA”); 90 }
Ethernet y el servidor 54 client.print(“ => “); 91 }
26 Ethernet.begin(mac, ip); 55
27 server.begin(); 56 //Imprimir el valor del

52 HARDWARE W W W. L I N U X - M A G A Z I N E . E S
Domótica (V) ARDUINO

Figura 7: Esquema de cómo montar el sis- Figura 9: Montaje de la alarma de incendios


tema para activar una sirena por medio de un casera funcionando.
transistor NPN.
casero DIY, que podemos ver en funcio-
namiento en la figura 9.
Para el segundo ejemplo que podemos
ver en la figura 10, también de explica-
ción sencilla, conectaremos el sensor de Figura 10: Esquema del conexionado del sis-
presencia de líquido como un disposi- tema de monitorización.
tivo digital, y el sensor de metano como
el de humo del primer montaje. La dife- tras necesidades, o utilizar otro de los
rencia es que lo montaremos encima del sistemas de comunicaciones que ya
módulo de ethernet para poder subir conocemos (GPRS, XBee…).
estos datos a la web. El montaje y la uti- Si en vez de monitorizar la cocina nos
lización del módulo Ethernet Shield está planteamos hacerlo en otra habitación
disponible en el artículo “Hogar en red” de nuestra casa, por ejemplo el trastero/
[8]. El resultado lo podemos observar en garaje, debemos estudiar cuáles son los
la figura 11. peligros más relevantes y la manera de
cuantificarlos. Una vez tengamos eso
Programación decidido, seguro que encontramos un
En este artículo no explicaremos dema- dispositivo que lo mida. ■
siado el código, ya que está formado por
pequeños recortes de código de todos Recursos
Figura 8: Esquema del conexionado de la los anteriores artículos.
En el primero de los códigos observa- [1] Sensor detección de humos:
alarma de incendios.
mos la forma de medir la presencia de http://www.cooking hacks.com/index.
vará la sirena, y si no, la apagará cortán- humo, y cuando la medida excede de un php/shop/sensors/gas/smoke-sensor-
dole la tensión. valor definido como normal, activamos mq2.html
la alarma poniendo en alto el pin asig- [2] Sensor de gas metano:
Diseño del Hardware nado. http://www.cooking-hacks.com/index.
En el primero de los ejemplos, el mon- En el segundo, medimos los valores php/shop/sensors/gas/mq4-ch4.html
taje que veis en la figura 8 ya es cono- analógicos y digitales de los sensores y [3] Diversos sensores de gases:
cido para nosotros, ya que conectaremos subimos estos valores a nuestra web. http://www.cooking-hacks.com/index.
el zumbador o la base del transistor que Los datos se muestran de manera senci- php/shop/sensors/gas.html
controla la sirena al pin 13 por medio de lla, en la IP asignada a nuestro servidor
[4] Sensor de presencia de líquidos:
una resistencia de 1K, y el sensor de web, como podemos observar en la
http://www.cooking-hacks.com/index.
humo en la configuración anteriormente figura 12.
php/shop/sensors/humidity/
comentada como un sensor analógico
twig-water-sensor.html
genérico. El resultado es un detector Casa domótica: siguientes pasos
[5] Artículo “Centro de control”, de Luis
Como en todos los artículos que hemos
Martín, ver página 36 de este Especial.
ido viendo, los ejemplos que hemos rea-
lizado son unos montajes y aplicaciones [6] Transistor BC547 NPN:
muy básicos. Podemos ampliar el http://www.cooking-hacks.com/index.
número de sensores en función de nues- php/bjt-transistors-npn-bc547.html
[7] Tutorial básico del transistor:
www.arduteka.com/2012/01/
componentes-el-transistor/
[8] Artículo “Hogar en red”, de Luis Mar-
Figura 11: Montaje del sistema de monitoriza- Figura 12: Lecturas web de los valores moni- tín, ver página 30 de este Especial.
ción de posibles peligros en la cocina. torizados en nuestra cocina.

W W W. L I N U X - M A G A Z I N E . E S HARDWARE 53
ARDUINO Automóvil

Electrónica en el automóvil

Cuida tu

com
23RF.
zov- 1
coche

Chere
Kirill
No todos tenemos un coche de última generación con el que deleitarnos, pero podemos modernizarnos con la ayuda de nuestro Arduino.

Por Luis Martín

Con una casa más que monitorizada y este artículo, en el que vamos a dotar a darle un toque mas moderno y futurista?
controlada gracias a los montajes que nuestras antiguallas de sensores y pres- Eso mismo vamos a conseguir hoy.
hemos ido viendo a lo largo de esta serie taciones inimaginables en la época en la Realizaremos dos pequeños ejemplos
de artículos sobre domótica, vamos a que se fabricaron, para ser la envidia para solucionar dos de los problemas
centrarnos ahora en el control de nuestro entre todos los vehículos con más de 10 más frecuentes cuando se utiliza un
coche. años de nuestro barrio. coche.
Desde que empecé la carrera, obtuve Buscaremos la realización de ejemplos El primero de ellos consistirá en un
el privilegio y el regalo de un magnífico sencillos y asequibles, con los que facili- sistema de aparcamiento asistido, al
bólido de carreras heredado de mi her- tar la conducción o la localización de estilo de los pitidos que emiten los nue-
mana que a su vez lo heredó de mi nuestro vehículo, centrándonos en los vos vehículos a medida que se aproxi-
padre, un Ford Orion. Una preciosa principales problemas que aparecen man a obstáculos, pero enfocado única-
máquina con motor de color rojo pasión cuando utilizamos un coche: el aparca- mente a la parte trasera de nuestro
que recorre las calles de Zaragoza con miento y el robo. coche, ya que es la que más problemas
paso lento pero seguro…o como otros lo causa. Se basará en un sensor de aproxi-
verán, un tastarro. Vehículos modernos mación, en nuestro caso un sensor de
Lo confieso, siempre he tenido envi- En esta época de crisis es difícil embar- ultrasonidos básico, muy similar al sen-
dia de esos coches recién salidos de carse en la compra de un coche, incluso sor de la Figura 1 que tenemos disponi-
fábrica con todos los extras, y que pre- es algo impensable para mucha gente. ble en la página web de Cooking Hacks
sumen de características como “me Pero, ¿y si tuviéramos la posibilidad de [1]. El uso de un tipo de sensor u otro,
aparco solo”. Y por ello he planteado añadir unos extras a nuestro coche para únicamente nos influirá en cómo tratar

Figura 1: Sensor de ultrasonidos utilizado Figura 2: Módulo GPS utilizado para obtener Figura 3: Esquema básico de conexión y
para medir la distancia a los obstáculos. la posición del vehículo. patillaje del módulo GPS.

54 HARDWARE W W W. L I N U X - M A G A Z I N E . E S
Automóvil ARDUINO

Figura 4: Esquema del conexionado del ejem- Figura 5: Esquema del conexionado del ejem-
plo de aparcamiento asistido – Sensor ultra- plo de aparcamiento asistido – Indicación Figura 6: Esquema de los dos nodos XBee
sonidos. visual de LEDs. para aparcamiento asistido.

los datos de la medida, pero como ya plo únicamente es la de un sistema de de los módulos más sencillos de entre
hemos trabajado con muchos tipos de posicionamiento de nuestro vehículo, y todos con los que hemos trabajado, ya
sensores, esto no nos supondrá ningún la funcionalidad final la tendremos que que sólo es necesario conectarlo, y el
problema. elegir nosotros como usuarios. Para el modulo ya comienza a mandarnos su
Para nuestro coche, en vez de utilizar artículo, lo que haremos será enviar la posición.
una señal acústica, que en ocasiones posición del vehículo a nuestro teléfono El módulo GPS es un pequeño circuito
puede resultar molesta, utilizaremos una móvil, ya que es algo que todo el mundo electrónico que se puede conectar a la
indicación visual basada en varios LEDs tiene a mano en la actualidad. placa Arduino y obtener los datos exac-
que nos indicarán la proximidad de los Al igual que estos dos ejemplos, exis- tos de posición y altitud, además de
obstáculos encendiéndose progresiva- ten otras muchas posibles aplicaciones velocidad, fecha y hora UTC. Necesita
mente. para nuestro coche, así que como siem- una antena, estar colocado en el exterior
Para un segundo diseño, nos plantea- pre lo único que tenemos que hacer es y un poco de tiempo para obtener señal
remos una solución a la pérdida de nues- buscar un problema que solucionar. de los satélites y comenzar a dar la posi-
tro vehículo, pudiendo ser por un robo o ción. El módulo GPS es el complemento
porque simplemente no sabemos dónde ¿Dónde está mi coche? perfecto para el desarrollo de aplicacio-
hemos aparcado. La misión de este ejem- El principal punto sobre el que debemos nes de geolocalización.
aprender algo nuevo en este artículo es
el de cómo saber donde hemos dejado
aparcado el coche. O como se diría en
términos más técnicos, cuáles son sus
datos de posicionamiento (altitud, lati-
tud…) GPS.
Para obtener estas medidas vamos a
Figura 7: Montaje del sensor de ultrasonidos servirnos del módulo GPS [2] que pode- Figura 8: Montaje de la indicación visual
en la parte trasera del vehículo. mos ver en la Figura 2. Se trata de uno como ayuda al aparcamiento.

Listado 1: Ejemplo del sistema de aparcamiento asistido – Sensor de ultrasonidos


01 // Variables del sensor cuando recibimos una 35)) Serial.print(1);
02 int sensorUltrasonidos = 0; “s” 30 if((valor <=35) && (valor >
03 int valor = 0; 17 valorInicio = Serial.read(); 31)) Serial.print(2);
04 int valorInicio = 0; 18 if (valorInicio ==’s’){ 31 if((valor <=31) && (valor >
05 int inicioAparcamiento = 0; 19 inicioAparcamiento = 1; 27)) Serial.print(3);
06 20 } 32 if((valor <=27) && (valor >
07 void setup(){ 21 if (valorInicio == ‘q’){ 23)) Serial.print(4);
08 // Inicializamos el puerto serie 22 inicioAparcamiento = 0; 33 if((valor <=23) && (valor >
(UART baudrate) a la velocidad de 23 } 19)) Serial.print(5);
comunicacion de los XBee 24 // Enviamos la medida del sensor 34 if((valor <=19) && (valor >
09 Serial.begin(9600); adaptada a un valor de 0 a 7 en 15)) Serial.print(6);
10 } función de cercanía 35 if((valor <=15) && (valor >
11 25 if (inicioAparcamiento == 1){ 13)) Serial.print(7);
12 void loop(){ 26 valor = analogRead(sensorUl- 36 if((valor <=13))
13 // Esperamos a recibir un dato trasonidos); Serial.print(8);
por comunicación serie con el 27 if ((valor <=140) && (valor >= 37 }
XBee 10)){ 38 // Pequeño retardo de tiempo
14 while(Serial.available()<0){ 28 if((valor > 43)) 39 delay(1000);
15 } Serial.print(0); 40 }
16 // Comenzamos a enviar medidas 29 if((valor <=39) && (valor > 41 }

W W W. L I N U X - M A G A Z I N E . E S WWW.LINUX- MAGAZINE.ES HARDWARE 55


ARDUINO Automóvil

Como podemos ver en el esquema de Arduino, que nos permite crear una [4]. Una sección dedicada a la comuni-
la Figura 3, el módulo utiliza los dos UART virtual en dos pines digitales cual- dad en la que cualquier usuario puede
pines de comunicaciones Rx y Tx, junto quiera. Lo veremos más en profundidad presentar sus proyectos.
a la alimentación. Y al ver esto y pensar en los apartados de hardware y software.
que queremos utilizar este módulo junto Para cualquier duda o problema con Diseño del Hardware
al GPRS, se nos plantea el problema de este módulo, podemos recurrir al En el caso del montaje para estos ejem-
que Arduino sólo dispone de una UART siguiente tutorial de Cooking Hacks plos, observamos que el del dispositivo
y tenemos dos dispositivos que la necesi- sobre GPS[3]. de aparcamiento asistido tiene una nota-
tan. Para solucionar esto utilizaremos la Estos ejemplos han sido sacados de la ble mayor dificultad, ya que el de posi-
librería SoftwareSerial disponible en sección de Cooking Hacks “Let’s Cook!” cionamiento de su vehículo supone

Listado 2: Ejemplo del sistema de aparcamiento asistido – Indicación visual con LEDs
001 // Variables 043 digitalWrite(LED2,LOW); 091 digitalWrite(LED3,LOW);
002 int LED0 = 12; 044 digitalWrite(LED3,LOW); 092 digitalWrite(LED4,LOW);
003 int LED1 = 11; 045 digitalWrite(LED4,LOW); 093 digitalWrite(LED5,LOW);
004 int LED2 = 10; 046 digitalWrite(LED5,LOW); 094 digitalWrite(LED6,LOW);
005 int LED3 = 9; 047 digitalWrite(LED6,LOW); 095 estadoLED = 0;
006 int LED4 = 8; 048 delay(500); 096 break;
007 int LED5 = 7; 049 } 097 case 4:
008 int LED6 = 6; 050 // Pequeño retardo de tiempo 098 digitalWrite(LED0,HIGH);
009 051 delay(5000); 099 digitalWrite(LED1,HIGH);
010 int estadoLED = 0; 052 } 100 digitalWrite(LED2,HIGH);
011 int valorAparcamiento = 0; 053 101 digitalWrite(LED3,HIGH);
012 054 // Función encargada de encen- 102 digitalWrite(LED4,LOW);
013 void setup(){ der los LEDs en función de la 103 digitalWrite(LED5,LOW);
014 // Inicializamos el puerto medida del sensor 104 digitalWrite(LED6,LOW);
serie (UART baudrate) a la 055 void nivelLED(int valor){ 105 estadoLED = 0;
velocidad de comunicación de 056 switch (valor){ 106 break;
los XBee 057 case 0: 107 case 5:
015 Serial.begin(9600); 058 digitalWrite(LED0,LOW); 108 digitalWrite(LED0,HIGH);
016 // Configuramos los pines de 059 digitalWrite(LED1,LOW); 109 digitalWrite(LED1,HIGH);
los LEDs como salidas digitales 060 digitalWrite(LED2,LOW); 110 digitalWrite(LED2,HIGH);
017 pinMode(LED0,OUTPUT); 061 digitalWrite(LED3,LOW); 111 digitalWrite(LED3,HIGH);
018 pinMode(LED1,OUTPUT); 062 digitalWrite(LED4,LOW); 112 digitalWrite(LED4,HIGH);
019 pinMode(LED2,OUTPUT); 063 digitalWrite(LED5,LOW); 113 digitalWrite(LED5,LOW);
020 pinMode(LED3,OUTPUT); 064 digitalWrite(LED6,LOW); 114 digitalWrite(LED6,LOW);
021 pinMode(LED4,OUTPUT); 065 estadoLED = 0; 115 estadoLED = 0;
022 pinMode(LED5,OUTPUT); 066 break; 116 break;
023 pinMode(LED6,OUTPUT); 067 case 1: 117 case 6:
024 // Avisamos al sensor de ultra- 068 digitalWrite(LED0,HIGH); 118 digitalWrite(LED0,HIGH);
sonidos de que empezamos a 069 digitalWrite(LED1,LOW); 119 digitalWrite(LED1,HIGH);
aparcar 070 digitalWrite(LED2,LOW); 120 digitalWrite(LED2,HIGH);
025 delay(2000); 071 digitalWrite(LED3,LOW); 121 digitalWrite(LED3,HIGH);
026 Serial.print(“s”); 072 digitalWrite(LED4,LOW); 122 digitalWrite(LED4,HIGH);
027 } 073 digitalWrite(LED5,LOW); 123 digitalWrite(LED5,HIGH);
028 074 digitalWrite(LED6,LOW); 124 digitalWrite(LED6,LOW);
029 void loop(){ 075 estadoLED = 0; 125 estadoLED = 0;
030 valorAparcamiento = 076 break; 126 break;
Serial.read(); 077 case 2: 127 case 7:
031 nivelLED(valo- 078 digitalWrite(LED0,HIGH); 128 digitalWrite(LED0,HIGH);
rAparcamiento-48); 079 digitalWrite(LED1,HIGH); 129 digitalWrite(LED1,HIGH);
032 if (estadoLED == 1){ 080 digitalWrite(LED2,LOW); 130 digitalWrite(LED2,HIGH);
033 digitalWrite(LED0,HIGH); 081 digitalWrite(LED3,LOW); 131 digitalWrite(LED3,HIGH);
034 digitalWrite(LED1,HIGH); 082 digitalWrite(LED4,LOW); 132 digitalWrite(LED4,HIGH);
035 digitalWrite(LED2,HIGH); 083 digitalWrite(LED5,LOW); 133 digitalWrite(LED5,HIGH);
036 digitalWrite(LED3,HIGH); 084 digitalWrite(LED6,LOW); 134 digitalWrite(LED6,HIGH);
037 digitalWrite(LED4,HIGH); 085 estadoLED = 0; 135 estadoLED = 0;
038 digitalWrite(LED5,HIGH); 086 break; 136 break;
039 digitalWrite(LED6,HIGH); 087 case 3: 137 case 8:
040 delay(500); 088 digitalWrite(LED0,HIGH); 138 estadoLED = 1;
041 digitalWrite(LED0,LOW); 089 digitalWrite(LED1,HIGH); 139 }
042 digitalWrite(LED1,LOW); 090 digitalWrite(LED2,HIGH); 140 }

56 HARDWARE W W W. L I N U X - M A G A Z I N E . E S
Automóvil ARDUINO

Listado 3: Ejemplo de sistema de posicionamiento del vehículo


001 // Incluimos la librería Soft- 045 105 }
wareSerial para la conexión del 046 } 106 i++;
GPS 047 107 while(GPS_GGA[i]!=’,’){
002 #include <SoftwareSerial.h> 048 void loop(){ 108 i++;
003 049 109 }
004 // Definimos y configuramos los 050 // Leemos las secuencias GGA 110 i++;
pines para la conexión del GPS que nos da el GPS con los valores 111 // Obtenemos la altitud
por software de posición 112 aux = 0;
005 SoftwareSerial gps(9, 8); 051 byteGPS = gps.read(); 113 while(GPS_GGA[i]!=’,’){
006 052 while(byteGPS != ‘G’){ 114 altitude[aux]=GPS_GGA[i];
007 // Variables 053 byteGPS = gps.read(); 115 i++;
008 byte byteGPS = 0; 054 } 116 aux++;
009 int i = 0; 055 byteGPS = gps.read(); 117 }
010 int h = 0; 056 if (byteGPS == ‘G’){ 118 }
011 int aux = 0; 057 GPS_GGA[0]=’$’; 119
012 058 GPS_GGA[1]=’G’; 120 // Si fix = 1 (satelites
013 char GPS_GGA[100]=”“; 059 GPS_GGA[2]=’P’; conectados) enviamos el mensaje
014 060 GPS_GGA[3]=’G’; 121 if (fix == 1){
015 char longitude[12]=”“; 061 GPS_GGA[4]=’G’; 122 // Pequeño retardo de tiempo:
016 char latitude[12]=”“; 062 i = 5; 123 delay(1500);
017 char altitude[12]=”“; 063 while(byteGPS != 10){ 124 // Envio el numero del desti-
018 int fix = 0; 064 byteGPS = gps.read(); natario
019 // Declaramos la variable pin 065 GPS_GGA[i]=byteGPS; 125 Serial.print(“AT+CMGS=\”“);
para encender el modulo GPRS 066 i++; 126 Serial.print
020 int pinModuloOn = 2; 067 } (numero_telefono);
021 // ********* es el número al que 068 i = 0; 127 Serial.println(“\”“);
se envia el mensaje 069 while(GPS_GGA[i]!=’,’){ 128 // Tras recibir un “>” envío
022 char numero_tele- 070 latitude[i]=GPS_GGA[i]; los datos en el mensaje
fono[]=”*********”; 071 i++; 129 while(Serial.read()!=’>’);
023 // Función encargada de encen- 072 } 130 Serial.print(“My coordinates
der el módulo GPRS 073 i++; are: “);
024 void encenderModulo(){ 074 while(GPS_GGA[i]!=’,’){ 131 Serial.print(“Latitude: “);
025 075 i++; 132 i = 0;
digitalWrite(pinModuloOn,HIGH 076 } 133 while(latitude[i]!=0){
); 077 i++; 134 Serial.print(latitude[i]);
026 delay(2000); 078 // Obtenemos la latitud 135 i++;
027 079 aux = 0; 136 }
digitalWrite(pinModuloOn,LOW) 080 while(GPS_GGA[i]!=’,’){ 137 Serial.print(“ | Longitude:
; 081 latitude[aux]=GPS_GGA[i]; “);
028 } 082 i++; 138 i = 0;
029 083 aux++; 139 while(longitude[i]!=0){
030 void setup(){ 084 } 140 Serial.print(longitude[i]);
031 // Inicializamos el puerto 085 i++; 141 i++;
serie (UART baudrate) a la 086 latitude[aux]=GPS_GGA[i]; 142 }
velocidad de comunicación con 087 i++; 143 Serial.print(“ | Altitude: “);
el GPRS 088 i++; 144 i = 0;
032 Serial.begin(115200); 089 // Obtenemos la longitud 145 while(altitude[i]!=0){
033 // Inicializamos el puerto 090 aux = 0; 146 Serial.print(altitude[i]);
serie por software 091 while(GPS_GGA[i]!=’,’){ 147 i++;
034 gps.begin(4800); 092 longitude[aux]=GPS_GGA[i]; 148 }
035 // Encendemos el módulo GPRS 093 i++; 149 // Pequeño retardo de tiempo:
036 encenderModulo(); 094 aux++; 150 delay(1000);
037 // Esperamos un tiempo hasta 095 } 151 // Aviso del fin de mensaje
que el módulo se encienda 096 i++; 152 Serial.write(0x1A);
038 for (int i=0;i < 5;i++){ 097 longitude[aux]=GPS_GGA[i]; 153 Serial.write(0x0D);
039 delay(5000); 098 i++; 154 Serial.write(0x0A);
040 } 099 i++; 155 // Mandamos el mensaje cada 2
041 // Configuramos el modo mensaje 100 fix = GPS_GGA[i]-48; minutos
de texto 101 i++; 156 delay(120000);
042 Serial.println(“AT+CMGF=1”); 102 i++; 157 }
043 // Pequeño retardo de tiempo: 103 while(GPS_GGA[i]!=’,’){ 158 }
044 delay(100); 104 i++;

W W W. L I N U X - M A G A Z I N E . E S HARDWARE 57
ARDUINO Automóvil

colocarse en la parte trasera del vehículo


como en la Figura 7 y el de recepción en
la zona del conducto de manera visible
como en la Figura 8.
Para aprender a trabajar con los módu-
los XBee o recordar cómo funcionaban
sólo tenemos que recurrir al artículo de Figura 11: Lectura en monitor serie de la
“Centro de control”. [5] posición de nuestro vehículo.
En nuestro segundo ejemplo, trabaja-
remos con un montaje y consistirá en la datos a nuestro móvil: latitud, longitud y
conexión a un Arduino de un módulo altitud. Para trabajar con estos dos
GPRS y otro GPS. El módulo GPRS lo módulos a la vez, podemos recurrir al
Figura 9: Proceso de conexión de las placas conectamos como aprendimos ya en tutorial Mobile Pack for Arduino de Coo-
GPS y GPRS para el segundo ejemplo. anteriores artículos [6]. Una vez conec- king Hacks [7].
tado, debemos conectar el módulo GPS Una vez recibida la información de los
montar módulos sobre Arduino como si en los pines restantes, pero alimentán- satélites (Figura 11), la cual puede tardar
de un Lego se tratara. dolo por medio de dos cables, ya que en varios minutos, se envía un mensaje con
En el ejemplo del aparcamiento asis- esos pines no se dispone de alimenta- dicha información al destinatario, como
tido, el montaje viene separado en dos ción. Podemos observar el proceso de se observa en la Figura 12.
nodos. Un nodo emisor de los datos de montaje en las Figuras 9 y 10.
proximidad de los obstáculos, basado en Una vez ensamblado, lo situaremos en Casa domótica: siguientes pasos
la conexión de un sensor de aproxima- algún lugar del salpicadero para que Nos encontramos ya cerca del final del
ción analógico conectado a alimenta- reciba buena señal de los satélites y con camino, con casi la totalidad de nuestra
ción, masa y una entrada analógica, y en la antena en posición horizontal. casa domotizada, únicamente nos queda
un módulo de comunicaciones XBee cerrar algunos punto específicos y ejem-
para enviar el dato al nodo receptor, Programación plos especiales y ya podremos decir
como podemos observar en la Figura 4. Cuando nos pongamos a programar el finalmente que nuestra casa es domó-
El nodo receptor, aparte de tener un primero de los ejemplos, observaremos tica.
módulo XBee conectado para recibir los que se trata de una programación muy Enfrente, encontramos un mundo
datos como se observa en la Figura 5, sencilla, por lo que vamos a implemen- todavía lleno de posibilidades y aplica-
dispone de una serie de 7 LEDs conecta- tar unos códigos un poco más elabora- ciones que implementar en nuestro
dos en las I/O digitales 6-12. Ambos dos. En el nodo encargado de la adquisi- hogar, y con tan sólo nuestra experien-
nodos se envían la información por ción de datos de proximidad sólo sería cia, conocimientos e imaginación pode-
medio de los módulos de comunicación necesario la toma de datos de una señal mos plantearnos prácticamente cual-
XBee (Figura 6). En cuanto a su coloca- analógica y su posterior envío vía comu- quier sistema electrónico. ■
ción en el vehículo, el nodo emisor debe nicación serie al módulo XBee, sin
embargo hemos establecido una serie de
rangos de medida que se clasifican en
ocho casos distintos. Una vez que le
mandamos este caso al nodo encargado
de realizar la indicación visual, lo tra-
mita por medio de un case .
Para nuestro segundo ejemplo, no
tenemos que asustarnos, ya que se trata
de un código largo debido a que tramita-
mos todos los datos que nos envía el
Figura 10: Montaje del ejemplo de posi- GPS. Realmente sólo utilizamos las par- Figura 12: Montaje del ejemplo de posi-
cionamiento de nuestro coche. tes comentadas, ya que enviamos 3 cionamiento de nuestro coche funcionando.

Recursos
[1] Sensor de ultrasonidos: http://www.cooking-hacks.com/index.php/shop/sensors/proximity/ultra-sonic-range-module.html
[2] Módulo GPS: http://www.cooking-hacks.com/index.php/shop/arduino/exclusive-products/gps-module-for-arduino.html
[3] Tutorial módulo GPS: http://www.cooking-hacks.com/index.php/documentation/tutorials/arduino-gps
[4] Let’s Cook!: http://www.cooking-hacks.com/index.php/let-s-cook.html
[5] Artículo “Centro de control”, de Luis Martín, ver página 36 de este especial.
[6] Artículo “Seguridad en el hogar”, de Luis Martín, ver página 40 de este especial.
[7] Tutorial Mobile Navigator Pack: http://www.cooking-hacks.com/index.php/blog/tutorial_arduino_quadband_mobile_navigator_pack

58 HARDWARE W W W. L I N U X - M A G A Z I N E . E S
Primeros Pasos RASPBERRY PI

Empezando con Raspberry Pi

Pi Perfecto

©Liliya Drifan, 123rf.com

Os mostramos cómo comenzar a cocinar con el asequible Raspberry Pi y Linux. Por otro lado, podemos obtener una
carcasa para nuestro Raspberry Pi.
Por Dimitri Popov ModMyPi [3] ofrece carcasas para Ras-
pberry Pi baratas, robustas y en varios
Después de una larga e insoportable adaptadores Edimax WiFi EW-7811UN, colores (Figura 1). Si no queremos gastar
espera, hemos recibido nuestro nuevo y Belkin F7D1102, Netgear WNA1000M, D- dinero en una carcasa, podemos cons-
brillante Raspberry Pi [1]. Hay muchas Link DWA-121 y TRENDnet TEW- truir la nuestra propia de cartón, utili-
cosas que podemos hacer con este ARM 648UBM. zando la plantilla en PDF de Punnet [4].
GNU/Linux pero, ¿por dónde empezar?. Estos adaptadores son perfectos para
En este artículo, proporcionaremos algu- utilizarlos con Raspberry Pi, no sólo por Preparar, Iniciar, Configurar
nos consejos para ayudarte a configurar su tamaño, sino también debido a que A continuación, necesitaremos preparar
este excelente dispositivo basado en pueden obtener energía directamente una tarjeta SD que pueda arrancar el sis-
Linux y de paso, darle algún uso prác- desde el puerto USB de Raspberry Pi. tema. En primer lugar, descargaremos
tico. Otros dispositivos de USB puede que una de las distribuciones oficiales de
requieran un USB con energía para poder Linux desde el sitio web de Raspberry Pi.
Complementando funcionar. Más importante aún, un script Aunque existen varias distribuciones
Raspberry Pi viene sin accesorios, por lo por consola puede ayudarnos a activar y para elegir, la distribución Raspbian,
que necesitamos obtener ciertos objetos configurar un adaptador inalámbrico basada en Debian, es la mejor elección.
para empezar a trabajar. En primer lugar, basado en RTL8188CUS con el mínimo Para continuar, hay que desempaquetar
necesitamos un adaptador de corriente. esfuerzo. el archivo descargado, insertarlo en la
Las buenas noticias son que Raspberry Para el método de entrada, podemos tarjeta SD, ejecutar el comando mount y
Pi puede usar cualquier adaptador de utilizar cualquier combinación de tecla- anotar el nombre la tarjeta SD activada
corriente de 5V con un conector dos con cable o inalámbricos y un ratón, (p.ej., sdb1, sdc2, etc.). Después, hay
microUSB. Hay que tener presente, que aunque para ciertos escenarios, habría que ejecutar el siguiente comando como
si estamos utilizando un Modelo B de que considerar invertir en algo como el root, reemplazando raspian.img y sdb
RBi, necesitaremos un adaptador de teclado inalámbrico Rii Mini [2] o un con el nombre del fichero de la imagen y
corriente que pueda proporcionar modelo similar. Este mini teclado tiene el dispositivo a utilizar:
700mA. un touchpad integrado, una batería
El Modelo B trae un conector de Ether- recargable incorporada e incluso un pun- dd bs=1M if=~/raspbian.img U
net, aunque para conseguir red por wifi tero láser. Además, la iluminación de of=/dev/sdb
necesitaremos añadir un adaptador USB fondo hace que este teclado sea perfecto
inalámbrico. Con algún esfuerzo, pode- para su uso en condiciones con poca luz. Para completar el proceso, ejecutaremos
mos hacer funcionar prácticamente cual- El teclado no está libre de fallos, pero si el comando sync como root, con lo que
quier dispositivo USB inalámbrico con planeamos utilizar Raspberry Pi como nuestra tarjeta SD estará casi preparada
Raspberry Pi. Sin embargo, lo ideal sería un servidor para transmitir elementos para comenzar. Si nuestra idea es utilizar
seleccionar un adaptador que utilice el multimedia, el teclado inalámbrico Rii un adaptador inalámbrico basado en el
chipset Realtek RTL8188CUS, como los Mini puede ser muy útil. chipset de Realtek RTL8188CUS, debería-

W W W. L I N U X - M A G A Z I N E . E S WWW.LINUX- MAGAZINE.ES HARDWARE 59


RASPBERRY PI Primeros Pasos

mente por DHCP, algo de lo desde una máquina remota? Podemos


que normalmente se suele hacerlo instalando Raspcontrol [6] y uti-
ocupar un router en la red. lizando su aplicación, basada en PHP,
Por lo tanto, antes de que para monitorizar aspectos claves de Ras-
podamos conectar nuestra pberry Pi – tiempo activo, carga del pro-
Raspberry por SSH, necesita- cesador, utilización de RAM, actividad
mos conocer cuál es su en la red, etc. – desde la comodidad de
dirección IP. El programa nuestro navegador. Para comenzar, hay
para descubrir servicios que instalar los paquetes:
Avahi, nos proporciona una
solución fácil y elegante para sudo apt-get install U
Figura 1: Raspberry Pi con una carcasa ModMyPi, equipada hacerlo. Ejecutaremos el apache2 php5 git
con un adaptador Edimax EW-7811UN Wi-Fi USB y un comando sudo apt-get install
teclado inalámbrico Rii Mini. avahi-daemon para instalar Después, hay que obtener el último
el demonio Avahi en nuestra código fuente desde el repositorio del
mos copiar los ficheros necesarios al Raspberry Pi, con lo que podremos proyecto en GitHub y mover los ficheros
directorio boot en la tarjeta SD. Cogere- conectarnos por SSH utilizando el descargados al directorio /var/www/ras-
mos el script de instalación, además de comando ssh [email protected] com- pcontrol:
los drivers y el firmware, desde el hilo de mand, sin importar la dirección IP que
discusión de la configuración de Edimax sea asignada a Raspberry Pi. git clone git://github.com/U
Wifi EW-7811UN [5], o desde [12] y los Otra herramienta muy útil es Bioshox/Raspcontrol.git
copiaremos a la partición FAT16 más usbmount, que automáticamente monta y sudo mv Raspcontrol/ U
pequeña (~56MB) en la tarjeta SD. Inser- desmonta dispositivos de almacenamien- /var/www/raspcontrol
taremos la tarjeta SD preparada en Ras- tos externos por USB en una Raspberry Pi
pberry Pi y encenderemos la máquina. activa sin entorno gráfico. Podemos insta- Ejecutar el comando sudo visudo y aña-
En el primer arranque, Raspbian lanza lar usbmount con el comando sudo apt- dir la siguiente línea al fichero sudoers:
una herramienta gráfica bastante simple get install usbmount. Así, nuestra Ras-
que nos permite configurar varias opcio- pberry Pi detectará y activará automática- www-data ALL=(ALL) U
nes, como el idioma, la disposición del mente cualquier dispositivo de almacena- NOPASSWD: ALL
teclado y la zona horaria. Si estamos uti- miento conectado al USB.
lizando una pantalla LCD conectada al Si queremos incluir la posibilidad de Guardar el fichero y poner en nuestro
puerto HDMI de Raspberry Pi, debería- controlar remotamente el entorno gráfico navegador http://raspberrypi.local/
mos desactivar la opción overscan para de Raspberry Pi, podemos instalar el ser- raspcontrol/setup.php. Introducir las cre-
librarnos del borde negro alrededor de la vidor TighVNC con el comando sudo denciales de cuenta deseadas y listo.
pantalla. apt-get install tightvncserver. Después de Navegaremos a http://raspberrypi.local/
La herramienta de configuración instalar la herramienta, hay que iniciar el raspcontrol/setup.php, nos autentificare-
(Figura 2) nos permite, además, activar servidor con el comando: mos con el nombre de usuario y contra-
el servidor de SSH, con lo que podríamos seña especificados y ya podremos ver el
acceder y administrar nuestra Raspberry vncserver :1 -geometry U Raspcontrol en todo su esplendor (Figura
Pi remotamente. Si guardamos la imagen 1024x600 3).
Raspian en una tarjeta SD mayor de 2GB, -depth 16 U
podremos ejecutar el comando expand- -pixelformat rgb565 Controla una Cámara Digital con
rootfs para expandir la partición raíz. Raspberry Pi
Una vez hemos configurado las opciones Puede que necesites ajustar los valores Podemos construir un NAS o un servidor
disponibles, presionaremos Finish y rei- de -geometry del ejemplo. En la máquina multimedia basado en Raspberry Pi,
niciaremos nuestra Raspberry Pi. Final- que vayamos a utilizar para
mente, para configurar el adaptador controlar Raspberry Pi, hay
inalámbrico, ejecutaremos el comando que instalar tightVNC viewer
sudo /boot/install-rtl8188cus-latest.sh y y conectarlo al servidor
seguiremos las instrucciones. tighVNC que se ejecuta en
Aunque Raspberry Pi viene con un Raspberry Pi:
entorno de escritorio gráfico LXDE y una
colección de aplicaciones, quizás nos sudo apt-get install U
interese instalar algunas herramientas xtightvncviewer
útiles adicionales, especialmente si vncviewer U
vamos a utilizar Raspberry Pi como una raspberrypi.local:5901
máquina sin pantalla en nuestra red
local. En la mayoría de redes locales, la ¿Necesitamos echar un vis- Figura 2: Utiliza la herramienta raspi-config para configu-
dirección IP suele asignarse dinámica- tazo a nuestra Raspberry Pi rar Raspberry Pi.

60 HARDWARE W W W. L I N U X - M A G A Z I N E . E S
Primeros Pasos RASPBERRY PI

tura hasta la compensa- gphoto2 --capture-image U


ción de exposición de --interval 3 U
flash. Es interesante saber --frames 5
que controlar estas opcio-
nes utilizando gPhoto es Utilizando esta funcionalidad, podemos
bastante fácil. convertir nuestra Raspberry Pi en un
Para empezar, utilizare- intervalómetro flexible para DSLR.
mos el comando gphoto -- Finalmente, el parámetro --hook-script
get-config option para obte- puede ser utilizado para adjuntar un
ner los posibles valores de script al comando gphoto2. Por ejemplo,
una opción en concreto. podemos crear un simple script para rea-
Por ejemplo, si queremos lizar copias de seguridad de las fotogra-
obtener los valores de la fías en el directorio ~/PHOTOS con la
opción f-number, ejecuta- herramienta rsync y luego adjuntar el
remos el comando gphoto2 script al comando gphoto2 --get-all-files:
--get-config f-number, que
Figura 3: Raspcontrol puede ser utilizado para monitorizar mostrará un listado como gphoto2 --get-all-files U
Raspberry Pi. éste: --hook-script U
/path/to/rsyncbackup.sh
pero hay que mencionar que RBi tiene Label: F-Number
más usos prácticos. Por ejemplo, pode- Type: RADIO Por supuesto, podemos combinar varios
mos construir una solución basada en Current: f/5 comandos gPhoto en los scripts por con-
Raspberry Pi para controlar y activar una Choice: 0 f/1.8 sola, permitiendo convertir nuestra Ras-
cámara digital de forma remota (Figura Choice: 1 f/2 pberry en una poderosa herramienta
4). Al instalar el software necesario y Choice: 2 f/2.2 para controlar nuestra cámara.
conectar Raspberry Pi a nuestra cámara, Choice: 3 f/2.5
podemos controlarla desde cualquier ... Desplegando Pygmyfoto en
máquina en la red local o desde internet. Raspberry Pi
Podemos incluso utilizar Raspberry Pi Para especificar la opción deseada, utili- Raspberry Pi puede ser utilizado no sólo
para descargar fotografías desde la zaremos el comando gphoto2 --set-config para controlar cámaras digitales sino
cámara automáticamente a un directorio option=value. El siguiente comando también para publicar fotografías en la
compartido, poniéndolas a disposición establece la apertura a f/1.8: web. Una aplicación simple y ligera para
en la red local. La clave para este pro- publicar fotografías como Pygmyfoto [8],
yecto es la herramienta gPhoto [7], que gphoto2 --set-config U es ideal para ejecutarse en Raspberry Pi.
está disponible en los repositorios oficia- f-number=0 Desplegar Pygmyfoto requiere algo de
les de Debian. trabajo manual, pero podemos hacerlo
Para instalar gPhoto en Raspberry Pi, gPhoto tiene, además, funciones para sin tener conocimientos avanzados en
ejecutaremos el comando sudo apt-get activar el disparo de cámara y la des- Linux.
install gphoto2. A continuación, conec- carga de fotografías desde la cámara: Necesitaremos preparar una tarjeta SD
taremos nuestra máquina a Raspberry Pi para utilizarla con Raspberry Pi. Para
y ejecutaremos el comando gphoto2 -- gphoto2 --capture-image este proyecto, es mejor utilizar la imagen
auto-detect para asegurarnos de que cd ~/PHOTOS mínima Debian Wheezy Raspberry Pi
gPhoto puede detectar y utilizar la gphoto2 --get-all-files U que la imagen oficial de Debian, ya que
cámara. Esto debería mostrar el modelo --new la estructura de la distribución es signifi-
de cámara, el modo de transferencia y el cativamente más pequeña que Raspbian.
puerto al que está conectada la cámara. Los comandos anteriores activan el dis- Hay que obtener la imagen Debian
Por ejemplo: paro de cámara y descargan las fotogra- Wheezy Raspberry Pi, desempaquetar el
fías al directorio ~/PHOTOS. archivo descargado y escribir el fichero
Nikon DSC D90 U Adicionalmente, utilizando
(PTP mode) usb:002,007 los parámetros --interval y --
frames, se nos permite espe-
Al ejecutar el comando gphoto2 -list- cificar cuántos disparos de
config, se mostrará un listado con todas cámara deberían realizarse y
las opciones de configuración disponi- el intervalo de tiempo entre
bles para el modelo de cámara utili- ellos. Por ejemplo, los
zado. Si tenemos una cámara con siguientes comandos toman
soporte DSLR, podemos controlar prác- cinco fotografías con un
ticamente cualquier opción con gPhoto intervalo de tres segundos Figura 4: Una solución basada en Raspberry para contro-
– desde la velocidad de disparo y aper- entre cada una: lar remotamente una cámara digital.

W W W. L I N U X - M A G A Z I N E . E S HARDWARE 61
RASPBERRY PI Primeros Pasos

de la imagen a la tarjeta SD. Iniciaremos Combinando Pygmyfoto con un script


Raspberry Pi desde la tarjeta SD y nos de consola, conteniendo algunos coman-
autentificaremos como root con la con- dos de gPhoto y añadiendo un paquete
traseña raspberry. Para asegurar nuestra de baterías, ya dispondríamos de una
Raspberry Pi, deberíamos cambiar la solución autónoma para controlar remo-
contraseña por defecto con el comando tamente un DSLR, tomando fotografías y
passwd. Para establecer la zona horaria, publicándolas en la web.
ejecutaremos:
Diversión con GPIO
dpkg-reconfigure U Una visión en conjunto de las capacidades
tzdata de Raspberry Pi no estaría completa sin
una breve mención al puerto GPIO. Este
Después, instalaremos los componentes puerto puede utilizarse para conectar una
necesarios con el comando: amplia gama de periféricos y dispositivos
de hardware a Raspberry Pi, pudiendo
apt-get install U controlarlos mediante programación. Gra- Figura 5: Conectar un LED y un limitador de
apache2 php5 sqlite3 U cias a la librería Python GPI [11], podemos resistencia al puerto GPIO.
php5-sqlite python U escribir scripts de Python para trabajar
python-imaging U con dispositivos conectados al puerto dad de usos prácticos y proyectos intere-
python-pyexiv2 GPIO. Para ver cómo funciona esto en la santes. Hemos cubierto en el artículo
práctica, podemos construir en poco sólo una pequeña parte de esas capaci-
Para asegurarnos de que el servidor Apa- tiempo un proyecto simple de parpadeo dades, así que podemos tomarlo como
che está activo y funcionando correcta- LED. En primer lugar, hay que descargar e punto de partida para explorar en pro-
mente, pondremos en nuestro navegador instalar la última versión de la librería fundidad esta gran plataforma. ■
la dirección IP de nuestra Raspberry Pi. Python GPIO con el siguiente comando:
Con todas las piezas necesitadas en su Recursos
sitio, podemos proceder a instalar http://raspberry-gpio-python.U
[1] Raspberry Pi:
Pygmyfoto. googlecode.com/files/pythonU
http://www.raspberrypi.org/
Para comenzar, obtendremos la última -rpi.gpio_0.3.U
versión de la aplicación, desempaqueta- 1a-1_armhf.deb [2] Teclado inalámbrico Rii Mini en Ama-
zon.com:
remos el archivo descargado y movere- sudo dpkg -i U
http://amzn.to/PobOaj
mos el directorio resultante pygmyfoto al python-rpi.gpio_0.3.U
directorio /var/www en Raspberry Pi. 1a-1_armhf.deb [3] ModMyPi:
https://www.modmypi.com/
Abriremos el fichero phpliteadmin.php
con un editor de texto y reemplazaremos Utilizaremos el editor de texto nano para [4] Carcasa de cartón Punnet:
la contraseña por defecto editando la escribir un simple script en Python: http://bit.ly/Olz4BN
línea $password = “admin”;. Después, [5] Hilo de discusión sobre la
podemos añadir fotografías al directorio #!/usr/bin/env python configuración de Edimax Wifi
EW-7811UN:
pygmyfoto/photos y ejecutar el comando import RPi.GPIO as GPIO
http://bit.ly/RksGSX
./pygmyfoto-publish.py photos/[foo.jpg] import time
en el terminal – reemplazando foo.jpg GPIO.setup(11, GPIO.OUT) [6] Raspcontrol:
https://github.com/Bioshox/
con el nombre actual del fichero de la while True:
Raspcontrol
foto que queramos publicar – comple- GPIO.output(11, True)
tando así el proceso. time.sleep(5) [7] gPhoto:
http://gphoto.org/
Utilizando el script auto-pygmyfoto.py, GPIO.output(11, False)
Pygmyfoto es capaz de procesar y publi- time.sleep(5) [8] Pygmyfoto:
car fotografías automáticamente. Ade- https://github.com/dmpop/pygmyfoto
más, se podría crear una tarea de cron Guardaremos el script como gpio.py y le [9] Imagen mínima de Debian Wheezy:
para ejecutar el script en un intervalo daremos permisos de ejecución con el http://bit.ly/LkFJwk
específico. comando chmod +x gpio.py. Conectare- [10] Liberar RAM en tu Raspberry Pi:
mos un LED y un limitador de resistencia http://bit.ly/N6xt2S
RAM en Raspberry Pi (640m o mayor) a los pins 6 y 11 (Figura [11] Librería Python Raspberry Pi GPIO:
Aquí hay un truco publicado en el blog 5) y ejecutaremos el script. http://raspberry-gpio-python.
Fusion Strike [10]. Ejecuta este comando googlecode.com/
para liberar RAM y permitir a tu Rasp- Conclusiones [12] Sitio para descargar el script de insta-
berry ejecutarse un poco más rápido: A pesar de sus especificaciones relativa- lación para adaptación de la tarjeta
sync mente modestas, Raspberry Pi es una SD para Raspberry Pi:
echo 3 > /proc/sys/U plataforma basada en Linux, capaz y https://www.box.com/s/797a62d2c97
vm/drop_caches 976a13307
versátil, disponible para una gran varie-

62 HARDWARE W W W. L I N U X - M A G A Z I N E . E S
Proyectos RASPBERRY PI

tema Raspberry Pi a través de tres pro-


yectos reales:
• un sistema multimedia de reproduc-
ción de vídeo,
• un punto de acceso inalámbrico y
• una unidad empotrada para controlar
la temperatura.
El primer proyecto es un ejemplo de
como el sistema de Raspberry Pi sirve
para sustituir un ordenador de sobremesa
estándar. Los dos últimos ejemplos
muestran a Raspberry Pi como sistema
Evgeniya Uvarova, 123RF.com

empotrado, lo que requerirá uns míni-


mos conocimientos de programación,
pero, también, nos da una idea de la ver-
satilidad de este pequeño y poderoso
mini-ordenador. Tal vez los tres ejemplos
nos ayuden a imaginar otros proyectos
DIY que se pueden crear con nuestro pro-
pio Raspberry Pi.

Explorando el Raspberry Pi a través de proyectos reales La lista de la compra


En un principio, los diseñadores habían
previsto dos modelos A y B, que se dife-
rencian principalmente en el número de

Pi 2
El ordenador Raspberry Pi, formado por una única placa del tamaño de una tarjeta de crédito,
puertos USB (uno o dos), la disponibili-
dad de un puerto Ethernet y, por
supuesto, el precio (25/35 $). En este
momento, sólo está disponible el modelo
B. Podéis consultar la Tabla 1 para ver un
resumen de los componentes del Rasp-
berry Pi.
facilita la experimentación en sistemas Linux empotrados. Mostraremos algunos ejemplos Para poner en marcha el Raspberry Pi
(o Raspi para abreviar), es necesario
prácticos de cómo utilizar el Raspberry Pi en un entorno cotidiano. Por Werner Hein
hacer una lista de los componentes bási-
cos. En Internet hay más consejos sobre
El ingeniero británico Eben Upton y su mente 10.000 dispositivos y la situación operaciones avanzadas [2] [3]. En la
equipo de hackers de hardware iniciaron actual, en la que se acerca al 1.000.000 actualidad, sólo dos distribuidores globa-
el proyecto Raspberry Pi como un medio dispositivos adquiridos: ¿qué hace que les tienen la tarjeta en su catálogo [4] [5].
para poner tecnología informática al este proyecto sea tan exitoso? ¿Qué Lo habitual es que ahora sólo tengas que
alcance de jóvenes interesados en estos capacidades ofrece a través de su hard- esperar un par de semanas, aunque en la
temas [1]. El objetivo era desarrollar y ware? ¿Qué es posible y qué no es (toda- primavera de 2012 no era extraño un
comercializar un ordenador de una sola vía) posible? Este artículo explora el sis- plazo de entrega de unos meses.
placa del tamaño de una tarjeta de cré-
dito y compatible con el, a menudo Historia
escaso, presupuesto del grupo objetivo
En 2006, Eben Upton y su equipo desa- beta de 25 tarjetas, que ya se basaban
(véase el cuadro “Historia”). rrollaron los primeros conceptos para el en el diseño de producción. Los desa-
Si te ves a ti mismo recordando los pri- Raspberry Pi basado en el ATmega de rrolladores eliminaron los defectos
meros equipos caseros de los 80, puede Atmel. La idea de conseguir que los anteriores. En enero de 2012 se vendie-
que formes parte del público al que va jóvenes se interesaran por el mini-orde- ron en una subasta en línea 10 tarjetas
dirigido. El objetivo explícito de los fun- nador ya formaba parte del programa. de esta serie beta por un importe de
dadores era volver a colonizar los sóta- En 2009, los miembros establecieron ofi- 16.336 £.
nos, garajes y aulas con el espíritu de la cialmente la Raspberry Pi Foundation. El 29 de febrero de 2012, a las 7:00 am,
generación que creció con el Atari 400/ En agosto de 2011, salió de producción CET, los servidores web de la fundación
800, ZX80/81 o VIC20/C64. la serie alfa, alrededor de 50 tarjetas. Sir- y de las dos distribuidoras se bloquea-
Casi un año después de que apare- vieron principalmente como plataforma ron en pocos minutos por el aluvión de
ciese Raspberry Pi, podemos echar la para los desarrolladores, para la depura- solicitudes. Muchos clientes esperaron
ción y para fines demostrativos. En durante horas para realizar una pre-
vista atrás para repasar lo que ha pasado
diciembre de 2011, le siguieron la serie orden.
entre la primera serie de aproximada-

W W W. L I N U X - M A G A Z I N E . E S WWW.LINUX- MAGAZINE.ES HARDWARE 63


RASPBERRY PI Proyectos

Además de la propia placa, se necesi- neas escuchar música o ver vídeos, tam- actualizar el sistema a la típica manera
tan los siguientes componentes: bién necesitarás auriculares o altavoces. de Debian:
• Una fuente de alimentación USB de al El tercer proyecto (un controlador de
menos 700 mA. Si deseas añadir hard- temperatura empotrado) utiliza una tar- $ sudo apt-get update
ware adicional a través de USB, se debe jeta de expansión que requiere algún $ sudo apt-get upgrade
planear por lo menos 1 amp. hardware adicional [6].
• Una tarjeta SD (HC) con al menos 2 GB Podemos iniciar la herramienta de
de capacidad, sin embargo, sería mejor Comenzando configuración en cualquier momento
4GB. Dependiendo de lo que pienses Existe una distribución Linux basada en usando sudo raspi-config.
hacer, todavía podría ser insuficiente. Debian conocida como Raspbian que está
Debido a que el sistema también se diseñada para Raspberry Pi para dar ser- Proyecto 1: Reproducción de vídeo
encuentra en la tarjeta SD, es aconseja- vicio como sistema operativo de a bordo. Al teclear startx aparecerá el escritorio
ble elegir una tarjeta con una velocidad La fundación Raspberry Pi recomienda la gráfico LXDE, que está optimizado para
de lectura y escritura alta. versión Raspbian “Wheezy” [7], que es los sistemas ligeros. Reproducir un vídeo
• Para el acceso inalámbrico sería prác- la utilizada en este taller. de alta definición es sin duda la prueba
tico un adaptador WLAN en forma de Vamos a comenzar por descargar el definitiva para el hardware. Los repro-
stick USB. Pero en la práctica, un adap- archivo de imagen Raspbian “Wheezy”, ductores de vídeo habituales, sin
tador WLAN USB es a menudo un fac- que es una imagen del sistema completo embargo, no son de ayuda, porque la
tor significativo en el consumo de ener- que consta de una partición de arranque GPU de la tarjeta está optimizada para
gía. Si estás considerando el uso de un de 60 MB y un sistema de archivos raíz decodificar datos de audio y vídeo. En
adaptador USB, asegúrate de que el de alrededor de 2 GB. Descomprimimos consecuencia, se necesita un reproductor
controlador es compatible y elige un el archivo y lo movemos a una tarjeta SD que utilice la propia biblioteca de progra-
diseño delgado que no bloquee el con el siguiente comando: mas de Broadcom (que se encuentra en
segundo puerto USB. /opt/vc). En la actualidad, el único que
• Teniendo en cuenta el bajo número de $ sudo dd bs = 1M U hace eso es el programa pre-instalado de
puertos USB, un teclado y un ratón if=2012-08-16-U línea de comandos omxplayer [8].
inalámbricos son una inversión que wheezy-raspbian.img U Si es posible, basta con montar el direc-
merece la pena y que también ahorra- of=SD_card_device_U torio que contiene los archivos a través
ría una carga innecesaria sobre los filename de la red. NFS ofrece un acceso más
limitados recursos del adaptador de rápido a su colección de vídeo, pero
corriente USB. Ahora, conectamos la tarjeta SD, el SSHFS es menos complicado. Los paque-
Además de estos elementos, también se teclado, el ratón y el monitor al sistema tes apropiados, se instalan como se
necesitan diferentes cables en función del Raspberry Pi y lo iniciamos, conectando muestra en el Listado 1. A continuación,
uso previsto, tales como HDMI o Ether- la fuente de alimentación USB. Aparece iniciamos la reproducción con la orden
net. En cuanto al cable HDMI, el mejor es entonces el menú de configuración y si omxplayer .
el más corto. Tienes la opción de aumen- no estás usando un teclado estándar Tras una breve sacudida de la imagen y
tar la salida del driver, pero también inglés, lo mejor es cambiar primero las el sonido, el software reproduce el vídeo
aumentará el consumo de energía. Si pla- valores del menú configure-key-board y de prueba de alta definición en formato
change_locale para el 720p con una pista de audio Dolby Digi-
Tabla 1: Datos Técnicos de Raspberry Pi teclado y el idioma que pre- tal 5.1 –, mezclado a dos canales, por
Componente Tipo fieras, ya que, de lo contra- supuesto – sin sobresaltos. Y eso es todo
SoC Broadcom BCM2835 (sistema en un chip) rio, surgirán problemas tan sobre el espartano Omxplayer. El pro-
CPU ARM1176JZF-S, 700 MHz pronto como se solicite el grama demuestra tener unas capacidades
GPU Broadcom VideoCore IV (OpenGL ES 2.0, inicio de sesión. El nombre impresionantes para decodificar audio y
OpenVG, 1080p30, H.264 codificado/ de usuario por defecto es vídeo, pero nada más. También hay dos
decodificador perfil alto) pi, la contraseña es rasp- inconvenientes más: la biblioteca de
RAM 256 MByte SDRAM berry. vídeo mencionada anteriormente no es
Puertos Otros elementos útiles software libre y se deben comprar licen-
USB 2 x USB 2.0
del menú son change_time- cias para los formatos MPEG-2 y VC-1.
Ethernet 1 x 10/100 Mbit/s
zone, para establecer la Por otro lado, el consumo de energía,
SD/MMC 1 x slot
zona horaria correcta; ssh es sorprendentemente bajo: la carga
Audio 1 x salida estereo analógica
para permitir el acceso media, mientras se renderizaba el vídeo
Vídeo 1 x salida compuesta, 1 x salida HDMI
seguro a la terminal a tra- HD, fue de sólo 3,8 vatios, a pesar de la
vés de la red y difícil tarea de transmitir a través de la
Listado 1: Configurar el Reproductor de Vídeo expand_rootfs, para cam- red. Los programas Omxplayer, SSH y
$ sudo apt-get sshfs biar el tamaño del sistema SSHFS representan la mayor carga para la
$ sudo adduser pi fuse de archivos raíz de 2GB por CPU y la memoria, mientras que el repro-
$ mkdir myVideos el tamaño real de la tarjeta ductor por si solo acapara el mayor con-
$ sshfs username@host_name:/directory_name myVideos SD. Por último, debemos sumo. Sin embargo, si deseamos repro-

64 HARDWARE W W W. L I N U X - M A G A Z I N E . E S
Proyectos RASPBERRY PI

cant. Para ver si el stick WLAN está


Habilitación de la interfaz serie activo, conectamos el hardware y busca-
Para equipar al Raspberry Pi con una comando minicom-s, podemos realizar mos la correspondiente reacción del ker-
interfaz serie, es necesario primero reali- los mínimos cambios necesarios en la
nel en el syslog.
zar unos cuantos retoques. Las señales configuración. Por ejemplo, el puerto
Ahora lo único que queda por hacer es
TXD y RXD del UART del SoC se envían a serie puede ser representado por cual-
configurar wpa_supplicant para punto de
los pines 8 y 10 de la P1 del conector de quiera de los archivos de dispositivo
dos filas entre la salida de TV y la ranura /dev/ttySnumber o /dev/tty-USBnumber. acceso. En una red con un servidor
para tarjeta SD (Figura 1). Sin embargo, DHCP en el router, encontraremos los
La velocidad de datos (115200 bps) y el
las señales se encuentran todavía con un datos esenciales en el informe proporcio-
formato de datos (8N1) están predefini-
nivel de E/S de la SoC a 3,3 voltios. Con dos. Asegúrate de que el software no use nado por los escaneos con iwlist. A conti-
un cambiador de nivel, se puede modifi- el control de flujo de hardware ni control nuación, modificamos el archivo de
car al estándar serie RS232. Para ello, de flujo de software. El comando mini- configuración /etc/wpa_supplicant/ wpa_
podemos utilizar, por ejemplo, el IC com-o impide que el programa de ejecu- supplicant.conf, como se muestra en el
MAX3232CP. ción presente las secuencias de inicializa- Listado 2, y /etc/network/interfaces,
Como programa de terminal se puede ción en el arranque y se conecta directa- como se muestra en el Listado 3. Final-
utilizar Minicom en el PC. Con el mente a la consola. mente, iniciamos la conexión con sudo
ifup wlan0.
ducir vídeo HD con 1080i o 1080p, es
importante conectar la unidad de red a Proyecto 2: Punto de acceso
través de NFS. Raspberry Pi también puede servir como
un punto de acceso por si mismo (figura
Los sistemas empotrados 2). En ese caso, simplemente enviamos
El segundo y tercer proyecto emplean todo lo que reciba el stick WLAN directa-
Raspberry Pi como un sistema empotrado mente al puerto LAN, como una especie
conectado a una red local, sin teclado, de puente. Es por eso que esta
ratón o monitor, pero con acceso a través configuración se denomina “modo
de LAN/WLAN. En tales sistemas, se puente.” De esta manera, podemos
pueden leer los mensajes de inicio a tra- aumentar el alcance de una red inalám-
vés de una terminal conectada al puerto brica existente.
serie. Si se produce un error en la La configuración se realiza en dos
configuración de red, no se podrá acce- pasos. En el primer paso, se configura el
der al sistema a través de SSH, así que acceso directo WLAN con el demonio
conectarse directamente a través de un hostapd. Sin embargo, hay que tener en
monitor y un teclado es la única manera cuenta que hostapd no es totalmente
de iniciar sesión en el sistema y corregir compatible con todos los sticks WLAN.
el error. Por tanto, haríamos bien en acti- Habrá que consultar los recursos en línea
var la interfaz serie (véase el cuadro titu- [9] para obtener una lista del hardware
Figura 1: Entre la salida de TV y la ranura lado “ Habilitación de la interfaz serie “). compatible. A continuación, en el
para la tarjeta SD, se encuentra el conector El acceso a través de la red con SSH debe segundo paso, debemos configurar el
por el que la placa envía las señales TXD y ser siempre la primera elección, ya que el reenvío de paquetes entre las dos interfa-
RXD por una interfaz serie. acceso a través de la interfaz serie sólo se ces. Para instalar los paquetes, es necesa-
debe utilizar como rio teclear:
una puerta trasera
para emergencias. $ sudo apt-get installU
El siguiente paso en hostapd bridge-utils
la construcción del sis-
tema empotrado es la Configuramos el punto de acceso
creación de una cone- WLAN en tres pasos: primero, inserta-
xión de red, en este mos la siguiente línea en
ejemplo, voy a conec- /etc/default/hostap:
tar a través de WLAN.
La instalación prede- DAEMON_CONF=U
terminada de Rasp- /etc/hostapd/hostapd.conf
bian ya contiene los
paquetes de firmware A continuación, añadimos el contenido
de los stick WLAN del listado 4 en el archivo
más populares, así /etc/hostapd/hostapd.conf, si es necesa-
Figura 2: El Raspberry Pi funcionando como punto de acceso, con como el programa rio, modificándolo para que se ajuste al
un consumo de tan sólo 3,5 vatios. cliente wpa_suppli- entorno local. Un ejemplo de

W W W. L I N U X - M A G A Z I N E . E S HARDWARE 65
RASPBERRY PI Proyectos

configuración para el archivo /etc/net- LED. A temperaturas


work/interfaces se encuentra en el Lis- superiores de 25 gra-
tado 5. El Listado 6 muestra cómo iniciar dos centígrados, el
el punto de acceso y el puente de red. controlador enciende
El consumo de energía operando la el LED rojo, a menos
LAN es menor. Dependiendo de la distan- de 22 grados centígra-
cia entre los puntos de acceso WLAN y el dos, se enciende el
volumen de datos transferido, el con- LED verde. Ambas
sumo de energía para un cliente WLAN o luces se encienden si
punto de acceso fluctúa entre 3,3 y 3,8 el valor está entre las
vatios, mientras que en la operación dos (Figura 3). Por
LAN, el consumo fue de alrededor de 2,9 supuesto, este pro-
vatios. Si ambas interfaces estaban acti- yecto solamente pre-
vas, el valor fue de entre 3,5 y 4 vatios. tende ser un experi-
mento como prueba
Proyecto 3: Controlador de de concepto. En una
temperatura verdadera aplicación Figura 3: El Raspberry Pi con una tarjeta de expansión como con-
Además de servir como un punto de del mundo real, el trol de temperatura. La luz verde de la tarjeta de expansión con-
acceso flexible, Raspberry Pi también es controlador podría firma que la temperatura está por debajo de 22 grados centígra-
excelente para el control de procesos sen- realizar alguna otra dos. El IC LM75 sobresale de la placa del sensor de cuatro cables.
cillos. En el siguiente ejemplo se toman acción más, como El chip de 16-pines es el transceptor serie RS232 MAX-3232CPE.
mediciones cíclicas de la temperatura encender la calefac-
ambiente y, en función del valor, se ción o cerrar las cortinas, en vez de tencia en serie de 22Ω y un transistor
señala el resultado visualmente con dos encender solamente un LED. NPN (por ejemplo, el BC237) como con-
La unidad de control de trolador, así como dos resistencias en
Listado 2: Modificar el archivo de Configuración temperatura requiere algo pull-up de 10k para el bus I2C. Otros
ctrl_interface=/var/run/wpa_supplicant de hardware adicional, materiales, como por ejemplo una placa,
eapol_version=1 que ocupa una tarjeta de regleta de alimentación, cable de cinta
ap_scan=1 expansión aparte. Necesi- plana y los condensadores de desacopla-
network={ taremos los siguientes miento, son elementos básicos.
ssid=”(E)SSID”
componentes: el IC LM75 El popular módulo LM75 sirve como
scan_ssid=1
como sensor de tempera- sensor de temperatura y está conectado
proto=WPA (or RSN for WPA2)
key_mgmt=WPA-PSK tura y el IC MAX- al bus I2C. La máquina controla los dos
pairwise=TKIP (or CCMP) 3232CPE, además de cua- LED a través de dos pines GPIO y una
group=TKIP (or CCMP) tro condensadores electro- etapa de transistor. El cableado es simple
psk=”key” líticos de 0.47mF, como un y puede obtener una plantilla de referen-
}
transmisor-receptor para cia en la Web.
la interfaz serie (UART), En realidad, el SOC tiene dos interfaces
Listado 3: Modificar /etc/network/interfaces junto con un conector master en el bus I2C, cuya salida se
auto wlan0 sub-D de nueve pines o un encuentra también en el syslog, pero sólo
iface wlan0 inet dhcp zócalo para montaje en uno de los dos está disponible en el
wpa-conf/etc/wpa_supplicant/wpa_supplicant.conf PCB y un cable de inter- conector de doble hilera (P1-03 y P1-05),
faz. Además, se necesitan el único con el bus-ID 0. Puede habilitar
Listado 4: Añadir a hostapd.conf dos LEDs, rojo y verde, el bus I2C mediante la instalación de los
ctrl_interface=/var/run/hostapd cada uno con una resis- dos controladores i2c-bcm2708 y i2c-dev.
ctrl_interface_group=0 Para ello, elimina-
driver=nl80211 # according to driver support Listado 5: Interfaces de red mos el controlador
macaddr_acl=0
auto wlan0 i2c-bcm2708 de la
auth_algs=3 iface wlan0 inet static lista de controladores
ignore_broadcast_ssid=0 address 192.168.128.1 que no se deben car-
wpa=2 # for WPA2 with PSK netmask 255.255.255.0 gar en /etc/mod-
wpa_key_mgmt=WPA-PSK broadcast 192.168.128.255
probe.d/raspi-blac-
rsn_preauth=1
rsn_preauth_interfaces=wlan0
klist.conf. Especifica-
rsn_pairwise=CCMP Listado 6: Iniciar el Punto de Acceso mos el controlador
wpa_passphrase=password $ sudo service hostapd start i2c-dev, que crea la
interface=wlan0 $ sudo brctl addbr myBridge interfaz de disposi-
hw_mode=g $ sudo brctl addif myBridge eth0 tivo en el directorio
channel=11 # a free or weak channel $ sudo brctl addif myBridge wlan0 /dev/etc/modules. El
ssid=(E)SSID $ sudo ifconfig myBridge up
bus se activa una vez

66 HARDWARE W W W. L I N U X - M A G A Z I N E . E S
Proyectos RASPBERRY PI

que el sistema se ha reiniciado. Para acti- valor del sensor (línea 15) en
var el bus sin necesidad de reiniciar, eje- un ciclo de cinco segundos y
Listado 7: Paquetes y Librerías Python
$ sudo apt-get install
cutamos la orden modprobe i2c-bcm2708 convierte la lectura del sen-
git python3 python-pip python-virtualenv
I2C-dev. sor en el valor de la tempera- $ git clone
Para poder realizar transacciones en el tura (línea 16). Entonces, en https://github.com/quick2wire/quick2wire-gpio-admin.git
bus I2C como un usuario normal, pri- concordancia, el programa $ git clone
mero tendremos que instalar las herra- enciende o apaga cada uno https://github.com/quick2wire/quick2wire-python-api.git
$ cd quick2wire-gpio-admin
mientas correspondientes y establecer de los dos LED.
$ make
permisos de grupo: Las denominaciones para $ sudo make install
los diferentes pines GPIO $ sudo adduser pi gpio
$ sudo apt-get install i2c-tools son algo confusas. Los LED $ virtualenv TEMPCONTROL
$ sudo addgroup pi i2c rojo y verde son GPIO23/ $ source TEMPCONTROL/bin/activate
$ cd quick2wire-python-api
GPIO24, de acuerdo con el
$ sudo python3 setup.py install
Las direcciones en las que se encuentran conector, pero también están
los módulos están indicadas por los valo- conectados a P1-16/P1-18.
res encontrados en la salida devuelta por La primera designación corresponde a la que juntes características adicionales
documentación de BCM2835 y los valo- para adaptarse a tus propias necesidades.
i2cdetect -y 0 res del núcleo. Sin embargo, las bibliote- Una distribución especializada de Linux
cas de Python siguen la segunda nomen- ayudará a los principiantes a que sus pri-
Dependiendo de cómo hayamos conec- clatura. Tendremos que proporcionar la meros pasos sean más fáciles. Los desa-
tado los tres pines de direccionamiento secuencia de comandos con los permisos rrolladores han logrado su objetivo origi-
del LM75, la salida contendrá exacta- necesarios para su ejecución. Después nal de hacer tangible la tecnología infor-
mente un valor en el rango hexadecimal del arranque, la salida dará continua- mática para la personas interesadas y en
de 0x48 a 0x4f. Después leemos la pala- mente por consola los valores medidos especial, para los jóvenes. ■
bra de 2 bytes con la temperatura del con cada actualización de los LEDs.
LM75 en el registro direccionando 0 con Recursos
el comando: Conclusiones
[1] Raspberry Pi:
Evidentemente Raspberry Pi no es un
http://www.raspberrypi.org/
$ I2cget -y 0 I2C bus_address U equipo de sobremesa. Si utilizar la termi-
register_address w nal te parece demasiado extraño y enig- [2] Guía de compras de Hardware:
http://elinux.org/RPi_Hardware_
mático, debes comenzar con el escritorio
Basic_Setup#Typical_Hardware_You_
La hoja de datos del módulo será de gran para pasar gradualmente a la línea de
Will_Need
ayuda para convertir el críptico valor comandos. Desde su concepción, el Raspi
[3] Más ayuda eligiendo hardware:
devuelto (por ejemplo: 0x8015) a la tem- fue concebido como un PC de bajo con-
http://elinux.org/RPi_Verified Periphe-
peratura correspondiente. sumo para aplicaciones multimedia y
rals
Python es un entorno de software ade- está claramente destinado a ser utilizado
[4] Farnell element14 (Europa)/Newark
cuado para el controlador, ya que existen como un sistema empotrado. El hardware
element14 (Norteamérica):
bibliotecas de clases para la Raspberry Pi es ideal para su uso como servidor u
http://uk.farnell.com/
para acceder al bus I2C y los pines GPIO. ordenador de control de procesos, o para http://www.newark.com/
Este ejemplo utiliza dos bibliotecas [10] el control de las tareas en proyectos que
[5] RS Components (R.U.)/Allied Electro-
[11]. El Listado 7 muestra la instalación no exijan demasiada potencia. La
nics (Norteamérica):
de los paquetes y bibliotecas. El programa configuración permite conectar los perifé- http://uk.rs-online.com/
en sí es muy simple (Listado 8): se lee el ricos necesarios y el conector casi suplica http://www.alliedelec.com/
[6] Para respuestas a preguntas, visita:
Listado 8: Programa Controlador http://elinux.org/RaspberryPiBoard
01 #!/usr/bin/env python3 i2c.reading(busaddress, 2))[0]
[7] Raspbian “Wheezy”:
02 import quick2wire.i2c as i2c 16 temp = (temp_hib << 1 | temp_lob >> 7) / 2.
http://www.raspbian.org/
03 import time 17 if temp > 25:
04 from quick2wire.gpio import Pin, exported 18 redLED.value = 1 [8] Reproductor de audio/vídeo Omxpla-
05 19 greenLED.value = 0 yer:
06 busaddr = 0x48 20 elif temp < 22: https://github.com/huceke/omxplayer
07 regaddr = 0x00 21 redLED.value = 0
[9] Hostapd:
08 redLED = Pin(16, Pin.Out) 22 greenLED.value = 1
http://hostap.epitest.fi/hostapd
09 greenLED = Pin(18, Pin.Out) 23 else:
10 24 redLED.value = 1 [10] API Python Quick2Wire:
11 with exported(Pin(16, Pin.Out)) as redLED, \ 25 greenLED.value = 1 https://github.com/quick2wire/
12 exported(Pin(18, Pin.Out)) as greenLED, \ 26 print (“%02.01f” % temp) quick2wire-python-api
13 i2c.I2CMaster() as bus: 27 redLED.value = 0
[11] GPIO Admin:
14 while True: 28 greenLED.value = 0
https://github.com/quick2wire/
15 temp_hib, temp_lob = bus.transaction( 29 time.sleep(5)
quick2wire-gpio-admin
i2c.writing_bytes(busaddr, regaddr),

W W W. L I N U X - M A G A Z I N E . E S HARDWARE 67
RASPBERRY Pi Server

Andrei Kovalev -123Rf.com


Herramientas y aplicaciones de servidor para el Pi

Ser-Pi-dor
Con la ayuda de las aplicaciones descritas aquí, el Raspberry Pi puede llevar a cabo una amplia variedad de tareas como servidor.

Por Dmitri Popov

Al ser pequeño, silencioso y barato, el distribución Raspbian basada en Si quieres administrar el servidor RP
Raspberry Pi (RP) es un perfecto can- Debian, puedes instalar los paquetes por SSH, es buena idea también insta-
didato para desarrollar tareas de servi- necesarios utilizando las siguientes lar la herramienta Deny Hosts con
dor. A pesar de que se pueden instalar instrucciones:
aplicaciones pesadas como WordPress sudo apt-get install U
o Gallery en un RP, puede que eso no sudo apt-get update denyhosts
sea lo más sensato dadas las modestas sudo apt-get install apache2 U
prestaciones de su hardware. En vez php5 Esta herramienta protege al servidor
de ello, puede que quieras optar por de ataques SSH de fuerza bruta al
alternativas ligeras. De hecho, hay Las aplicaciones que abordamos en meter en una lista negra las direccio-
unas cuantas aplicaciones servidor este artículo no requieren un servidor nes IP atacantes después de un
que son ideales para esta pequeña de bases de datos, pero si planeas número determinado de intentos de
máquina. implementar software que utiliza acceso fallidos. Para modificar la
MySQL o SQLite, tendrás que instalar configuración predeterminada de Dny
Preparando al RP estos motores de bases de datos en tu Hosts, abre el fichero de configuración
Lo primero que tenemos que hacer es RP: en un editor de textos, por ejemplo
transformar el RP en un servidor insta- nano:
lándole los componentes necesarios, y sudo apt-get install U
eso incluye el servidor Apache y PHP. mysql-server mysql-client U sudo nano U
Suponiendo que estás utilizando la php5-mysql sqlite3 php5-sqlite /etc/denyhosts.conf

68 HARDWARE W W W. L I N U X - M A G A Z I N E . E S
Pi Server RASPBERRY

Luego localiza el parámetro PURGE_ Si el script es


DENY y especifica el valor que quie- demasiado básico
ras. Esto te permitirá purgar direccio- para tus necesidades,
nes IP en la lista negra que sean más puedes usar
antiguas que una fecha especificada. PhpSysInfo [1]. Esta
También puedes ajustar los valores de solución altamente
los parámetros DENY_THRESHOLD_ personalizable es
INVALID y DENY_THRESHOLD_ capaz de generar un
VALID y guardar los cambios. Puedes completo informe a
rearrancar Deny hosts, ejecutando la partir de los datos
instrucción del sistema (Figura
2). La instalación de
sudo /etc/init.d/denyhosts U PhpSysInfo es tan
restart sencilla como insta-
lar el script Ras-
Para purgar direcciones IP en la lista pberry Pi Sysinfo. Se
negra, usa lo siguiente: descarga y de -
sempaqueta la ver-
sudo /etc/init.d/denyhosts U sión más reciente del
stop software y se mueve
sudo denyhosts --purge al directorio /var/
sudo /etc/init.d/denyhosts U www del servidor. A
start continuación, se
renombra el fichero Figura 1: El script Raspberry Pi Sysinfo te permite ver información
Para monitorizar las estadísticas vita- config.php. new a básica del sistema.
les de tu servidor RPi, también es con- config.php y listo.
veniente implementar un sistema de Para personalizar PhpSysInfo, se desde un dispositivo Android utili-
monitorización. Tal vez la herramienta abre el fichero config.php en un editor zando la app PSIAndroid [3], que
más sencilla para esta tarea sea el de textos y se modifican los paráme- resulta útil si necesitas monitorizar tu
script Py Sysinfo [1], consistente en un tros. De manera predeterminada servidor mientras estás fuera (Figura
único script PHP y unos ficheros de PhpSysInfo está configurado para utili- 3).
imágenes. zar compresión con código JavaScript.
Para instalar el script, coge la última Esta funcionalidad no funciona bien Administración de Tareas
versión, desempaqueta el archivo des- con procesadores lentos, así que, para TaskPaper.Web [4] no es el servidor de
cargado y mueve el fichero sysinfo acelerar la ejecución de PhpSysInfo en aplicaciones más sofisticado para la
resultante al directorio /var/ www en Raspberry, deshabilita la compresión, administración de tareas y listas de
tu servidor RPi. Luego apunta tu nave- modificando el parámetro PSI_JS_ quehaceres, pero contiene unas cuan-
gador a http://127.0.0.1/sysinfo (susti- COMPRESSION de la siguiente manera: tas funcionalidades útiles metidas en
tuye 127.0.0.1 por la dirección IP que una interfaz ligera y elegante. Aunque
tenga tu RPi en la red), y deberías ver defineU el proyecto ha estado parado durante
el resumen generado por el script. Esta (‘PSI_JS_COMPRESSION’, false); algún tiempo, esta aplicación sigue
solución sin florituras te permite ver funcionando a las mil maravillas en el
información básica, incluyendo la PhpSysInfo viene con varios plugins, stack Apache/PHP.
carga de la CPU y su temperatura, el pero vienen deshabilitados de manera TasKPaper.Web (TPw) no requiere
tiempo que lleva en marcha (uptime) y predeterminada. Para activarlos tienes una base de datos y la aplicación
el uso de la memoria (Figura 1). que modificar el parámetro PSI_PLU- guarda los datos en ficheros de texto
GINS. Por ejemplo, plano. Para instalar TPw, descarga y
Listado 1: Edición del Fichero Predeterminado habilita el plugin PS desempaqueta el archivo más
si quieres que reciente, renombra el directorio cre-
01 DocumentRoot /var/www
02 <Directory />
PhpSysInfo muestre ado a taskpaperweb y muévelo al
03 Options FollowSymLinks todos los procesos en directorio /var/ www de tu servidor
04 AllowOverride All ejecución: Raspberry Pi. Luego, cambia al pro-
05 </Directory> pietario del directorio taskpaperweb y
06 <Directory /var/www/> define haz que sea de escritura con los
07 Options Indexes FollowSymLinks MultiViews (‘PSI_PLUGINS’, U siguientes comandos:
08 AllowOverride All ‘PS’);
09 Order allow,deny sudo chown www-data U
10 allow from all
También puedes taskpaperweb
11 </Directory>
acceder a PhpSysInfo sudo chmod -R 755 taskpaperweb

W W W. L I N U X - M A G A Z I N E . E S WWW.LINUX- MAGAZINE.ES HARDWARE 69


RASPBERRY Pi Server

fecha límite para las tareas utilizando


diferentes formatos:

@due(17 Nov 1971)


@due(1971 11 17)

El desplegable Seleccionar Proyecto te


permite mostrar tareas pertenecientes
a una lista específica (Figura 4). Para
marcar un elemento de tarea como
completada, marca la casilla a su lado
o añade una etiqueta @done.
TPw carece de una funcionalidad de
control de acceso, lo que significa que
cualquiera puede administrar, editar y
eliminar tareas. Esto puede no ser un
problema si el RPi está ejecutándose
en una red local, pero puede conver-
tirse en una seria brecha de seguridad
si es accesible desde Internet. Una
manera de resolver este problema es
proteger la instalación de TPw con un
fichero .htaccess. Para hacer esto,
necesitas habilitar el módulo
mode_rewrite en Apache utilizando las
siguientes instrucciones:

sudo a2enmod rewrite


sudo /etc/init.d/apache2 U
restart
Figura 2: PhpSysInfor te da un resumen completo de la información del sistema.
luego puedes usar
A continuación, apunta tu navegador a
http:// 127. 0. 0. 1/ taskpaperweb y listo. sudo nano /etc/apache2/U
La administración de elementos de sites-available/default
tareas en TPw se hace editando entra-
das en el fichero de texto. La aplica- para abrir el fichero default para su
ción te permite organizar tareas en lis- edición y reemplazar ambas instancias
tas (por ejemplo, Hoy:, Mañana:, de AllowOverride Nonce con AllowOve-
Varios:, etc.). Para crear una tarea, rride All (ver Listado 1).
añade un nuevo elemento precedido Ahora puedes rearrancar Apache
por un guión (-): utilizando el comando /etc/init.d/
apache2 restart. Luego has de crear un
- Acabar artículo sobre fichero .password y generar una con-
“Creación de panoramas con traseña por usuario (reemplaza NOM-
digiKam” BREUSUARIO con el verdadero nom-
bre del usuario, por ejemplo, tpwu-
TaskPaper.Web te permite añadir eti- ser):
quetas a cada quehacer, por ejemplo:
sudo mkdir /etc/.passwords
- Acabar artículo sobre sudo htpasswd -c /etc/U
“Creación de panoramas con .password/.htpasswd U
digiKam” @escribir @digikam NOMBREUSUARIO

Para localizar todas las tareas que con- Finalmente, crea un fichero .htaccess
tengan una etiqueta específica, haz en el directorio taskpaperweb:
Figura 3: Puedes monitorizar tu servidor RPi clic en la etiqueta deseada. TPw tam-
desde un dispositivo Android con la app bién soporta etiquetas especiales cd /var/www/taskpaperweb
PSIAndroid. @due, que permite especificar una sudo nano .htaccess

70 HARDWARE W W W. L I N U X - M A G A Z I N E . E S
Pi Server RASPBERRY

y añade la siguiente configuración al (“USERNAME”, “”); y define(“PASS- y rearranca Apache con la instrucción
fichero WORD”, “”);. Para habilitar inicio de
sesión persistente, establece el valor sudo /etc/init.d/apache2 U
AuthType Basic de $ft[“settings”][“REMEMBERME”]; restart
AuthName “Password Required” como TRUE. Guarda el fichero y
AusUserFile /etc/.passwords/U apunta tu navegador a http:// 127. 0. 0. File Thingie también puede ser utili-
htpasswd 1/ filethingie/ ft2. php e inicia sesión zado como una aplicación multiusua-
Require user NOMBREUSUARIO con los credenciales preestablecidos. rio. Puedes añadir tantos usuarios nece-
Gracias a su espartana interfaz, File sites y organizarlos por grupos con dife-
Finalmente, abre TPw en tu navegador Thingie es veloz como un rayo y muy rentes privilegios. Para añadir un nuevo
y usa el nombre de usuario y contra- sencillo de utilizar. La configuración usuario, abre el fichero config.php y
seña para iniciar sesión. PHP predeterminada limita el tamaño edita y descomenta el siguiente frag-
de los ficheros subidos a 2MBs, lo que mento, eliminando las cadenas /* y */:
Administrar Ficheros puede ser problemático si piensas usar
Si instalas File Thingie [5] en tu RPi, ficheros grandes. Para incrementar el /*
puedes utilizar el servidor como un límite, abre el fichero php.ini en un $ft[‘users’]U
sencillo Dropbox web para ficheros editor: [‘REPLACE_WITH_USERNAME’] = U
(Figura 5). File Thingie está escrito en array(
PHP y es bastante sencillo de instalar: sudo nano /etc/php5/U ‘password’ => U
se descarga y desempaqueta la ver- apache2/php.ini ‘REPLACE_WITH_PASSWORD’,
sión más reciente y se mueve el direc- ‘group’ => U
torio filethingie resultante a /var/ Y ajusta los parámetros upload_max_ ‘REPLACE_WITH_GROUPNAME’
www. filsesize y post_max_size a tus necesi- );
Renombra el fichero config.sample. dades, por ejemplo: */
php a config.php y ábrelo con un edi-
tor de textos. Especifica el nombre de upload_max_filesize = 10M Y se sustituyen los comodines por
usuario y contraseña en las líneas post_max_size = 10M valores verdaderos, por ejemplo:
RASPBERRY Pi Server

Ya podemos hacer que Poole haga


algo práctico. Crea un directorio para
tu sitio y cámbiate a él:

mkdir sitio_poole
cd sitio_poole

Ejecuta las siguientes instrucciones


para inicializar el directorio, generar
un sitio web de ejemplo y arrancar el
servidor web integrado de Poole:

poole.py --init
poole.py --build
poole.py --serve

A continuación, apunta tu navegador a


http:// 127. 0. 0. 1:8080/ y tendrías que
ver el sitio web de ejemplo, que pue-
Figura 4: TaskPaper.Web es un administrador web de tareas sin florituras. des utilizar como punto de comienzo
de tu propio sitio. Si quieres incluir
$ft[‘users’][‘ftuser’] = array( software y desempaquétalo en el una página en el menú de navegación
‘password’ => ‘hkpfw9njt’, directorio /home/ pi. A continuación, del sitio, añade la siguiente cabecera a
‘group’ => ‘users’ instala el paquete python-markdown la parte superior del fichero de texto
); con la instrucción (reemplaza <Título de página> por
el nombre verdadero de la página y
Puedes añadir más usuarios copiando sudo apt-get install U especifica la posición deseada en el
y editando el fragmento de más arriba. python-markdown menú modificando el valor menu-posi-
A continuación, descomenta el frag- tion):
mento que define los grupos y especi- A continuación, abre el fichero ~/
fica su configuración: .bashrc en un editor y añade la línea title: <Título de página>
menu-position: 0
$ft[‘groups’][‘users’] = array ( export PATH=$PATH:/ruta/a/poole ---
‘DIR’ => ‘uploads’,
‘UPLOAD’ => TRUE, donde /ruta/a/poole es el directorio Guarda el fichero con la extensión
‘FILEACTIONS’ => FALSE que contiene el ejecutable poole.py. .md. Poole utiliza una sencilla planti-
);

Este ejemplo define un grupo llamado


users. Los miembros de este grupo
pueden subir ficheros al directorio
uploads, pero no pueden ejecutar
acciones sobre los ficheros. Para más
información sobre cómo configurar y
utilizar File Thingie, véase la docu-
mentación de la aplicación [6].

Servir Contenido
Si buscas una manera rápida de servir
contenido desde tu RPi, Poole [7] es
un candidato ideal para esa tarea
(Figura 6). Esta herramienta basada en
Python puede convertir ficheros de
texto en páginas web estáticas. Lo que
es más, Poole tiene integrado su pro-
pio servidor, por lo que no tiene pro-
blema para servirte los sitios web. Para
hacer funcionar Poole en el servidor
RPi, hazte con la última versión del Figura 5: Con File Thingie puedes utilizar el RPi como un dropbox para tus ficheros.

72 HARDWARE W W W. L I N U X - M A G A Z I N E . E S
Pi Server RASPBERRY

lla para generar páginas, por lo que


puedes modificar el aspecto de tu sitio
web simplemente modificando la plan-
tilla y la hoja de estilo poole.css en el
directorio input. Una vez has termi-
nado, reconstruye el sitio web ejecu-
tando la instrucción

poole.py --build

A pesar de su simplicidad, Poole es


una herramienta flexible y poderosa,
por lo que puede que quieras echarle
un vistazo a su documentación para
sacarle el máximo partido.
Nibbleblog [8] es una aplicación
web ligera para la publicación de con-
tenidos un poco más tradicional y que
se administra desde una interfaz web. Figura 6: Poole te permite generar y servir páginas estáticas de manera sencilla.
El motor para blogs contiene todas las
herramientas esenciales para alojar un
blog en el RPi de manera sencilla
(Figura 7). Nibbleblog no necesita una
base de datos, ya que almacena los
datos en fichero XML, lo que simpli-
fica significativamente su instalación y
mantenimiento diario. La instalación
de Nibbleblog sigue el procedimiento
habitual: descargar la última versión,
desempaquetar el archivo descargado,
y mover la carpeta nibbleblog al direc-
torio /var/ www. A continuación,
apunta tu navegador a http:// 127. 0. 0.
1/ nibbleblog, suministra la informa-
ción requerida, pulsa en el botón Ins-
tall y listo.
Una vez has iniciado sesión, se te
presenta el panel de control inmedia- Figura 7: Nibbleblog es una herramienta ligera perfecta para mantener un blog.
tamente, dándote acceso a todas las
funcionalidades esenciales. Desde Google Analytics, Twitter y Patrocina- nes ligeras que se ejecutarán perfecta-
aquí puedes crear nuevas entradas y dores. mente en la máquina. Utilizando las
editar las existentes, administrar cate- aplicaciones descritas, puedes hacer
gorías, cambiar las configuraciones del Conclusión que un servidor RPi desempeñe una
blog y administrar plugins. A pesar de sus modestas especificacio- gran número de trabajos prácticos,
Nibbleblog viene con un editor nes, el RPi puede llevara cabo un desde servir como un sencillo sustituto
WYSIWYG, por lo que puedes acceder amplio abanico de tareas de servidor y de dropbox, hasta ser una completa
a todas las opciones de formateado existen una gran cantidad de aplicacio- solución de alojamiento de blogs. ■
desde la barra de herramientas sumi-
nistrada. El administrador de ficheros Recursos
integrado, basado en elFinde, ofrece
[1] Raspberry Pi Sysinfo script: http://derkev.in/rpisysinfoscript/
una manera conveniente para trabajar
[2] PhpSysInfo: http://phpsysinfo.sourceforge.net/
con ficheros e imágenes. Además de
entradas de blog convencionales, Nib- [3] PSIAndroid: http://jacky672.github.com/psiandroid/
bleblog también te permite publicar [4] TaskPaper.Web: http://code.google.com/p/taskpaper- web/
vídeos. Las funcionalidades predeter- [5] File Thingie: http://www.solitude.dk/filethingie/
minadas de Nibbleblog se pueden [6] Documentación File Thingie: http://www.solitude.dk/filethingie/documentation
extender con el uso de plugins y la [7] Poole: https://bitbucket.org/obensonne/poole
aplicación viene de serie con unos
[8] Nibbleblog: http://www.nibbleblog.com/
cuantos módulos útiles, tales como

W W W. L I N U X - M A G A Z I N E . E S HARDWARE 73
RASPBERRY PI Raspberry Pi + Arduino

necesitamos es una librería


para Python llamada
python-serial. Podríamos des-
cargar su código fuente desde
[4], pero como estamos traba-
jando con Raspbian podemos
simplemente realizar la descarga
desde la consola usando apt-get install
python-serial, ya que python-serial está
en los repositorios oficiales de la distro.
Una vez instalada la librería podremos
empezar a jugar casi inmediatamente,
pero, antes de seguir, recomiendo leer el
artículo [3], ya que necesitaremos escribir
Integrando Raspberry Pi con Arduino código en nuestro Arduino mediante su
IDE.

Combinados
Lo que se puede crear a partir de la unión de estas dos placas open hardware es algo que se
Arduino Serial
Abrimos el IDE de Arduino en nuestro orde-
nador habitual y escribimos el código del
Listado 1. Este sketch lee una entrada serial
(a través del conector USB) y realiza una de
tres acciones, según lo que recibe: hacer
está empezando a explorar ahora. Por ello, en las siguientes líneas explicaremos cómo abrir parpadear un LED 2, 5 ó 7 veces. Para ello,
utilizamos una estructura switch ... case .
un canal de comunicación desde la Raspberry Pi directamente a un Arduino. Una vez que escribamos el código para
nuestra placa Arduino, es hora de reunir
Por Hiram Zuñiga Romero los componentes electrónicos, ya que en el
siguiente paso armaremos el circuito.
En artículos anteriores de este especial es bastante más poderosa que la suma de
[1][2] hemos visto cómo funcionan los dos sus partes. Por ello, vamos a enseñar cómo Circuito
dispositivos por separado, así que ninguno conectar ambas plataformas a nivel de El circuito que necesitamos es muy básico
de los dos necesita una especial introduc- hardware, de la manera más sencilla posi- (ver Figura 3) y ya debes tener todo el
ción. Pero si conectamos un Arduino, que ble y cómo podemos hacer para que se material a mano. Como se puede observar,
es prácticamente un microcontrolador plug comuniquen. obtenemos por el pin 8 de la placa Arduino
& play, al Raspberry Pi, ese ordenador casi un valor alto (HIGH), el cual va conectado
tan pequeño como el Arduino y desde el Piezas directamente a un extremo de la resisten-
cual podemos desarrollar todos nuestros Para realizar la comunicación entre el cia de 220 ohms. El otro extremo de la
proyectos, obtenemos una plataforma que Arduino y un Raspberry Pi y probar la resistencia va conectada al ánodo (pata
conexión utilizaremos los
siguientes componentes
hardware (Véase Figura
1):
• Raspberry Pi modelo B
• Memoria SD con Rasp-
bian instalado
• Arduino Uno R3
• LED 3.5mm de color
rojo
• Resistencia de 220
ohms
• Cable de red (para el
Raspberry Pi)
• Cable USB (Arduino)
Figura 1: Componentes necesarios: Raspberry Pi modelo B, • Tres cables para reali-
Memoria SD con Raspbian instalado, Arduino Uno R3, LED 3.5 zar las conexiones.
mm color rojo, resistencia de 220 ohms, cable de red (para el En lo que se refiere al soft- Figura 2: IDE Arduino mostrando parte del
Rapeberry Pi), cable USB (Arduino), tres cables para realizar las ware que necesita el Ras- código que necesitaremos para la comunica-
conexiones. pberry Pi, lo primero que ción Raspberry – Arduino.

74 HARDWARE W W W. L I N U X - M A G A Z I N E . E S
Raspberry Pi + Arduino RASPBERRY PI

Figura 4: Aplicación para manipular el


número de pulsos que se envían al Arduino.

primera parte del programa detecta qué


puerto se le ha asignado al Arduino y
guarda el número en la variable com. La
segunda construye una mínima interfaz
gráfica Tk con tres botones que numeran
Figura 3: Diagrama del circuito necesario un número de parpadeos. Pulsando en
creado con Fritzing. uno de los botones, mandamos al Arduino
por el puerto serial el número de pulsos
positiva) del LED. El cátodo (pata nega- que queremos que se transformen en par-
tiva) va conectada directamente a tierra, es padeos del LED del circuito, que hemos
decir, al pin GND de la placa Arduino. montado con anterioridad. Es decir, si todo
ha salido bien, al presionar el botón 2 par-
A Prueba padeos, el LED que tenemos conectado al
Ahora ya tenemos casi todo listo, sólo nos pin 8 de nuestro Arduino parpadeará 2
falta unir los dos dispositivos. Conectare- veces. Si se presiona el botón 5 parpadeos,
mos la placa Arduino por medio del cable el LED parpadeará 5 veces; y si se presiona
USB a un puerto disponible en nuestra el botón 7 parpadeos, el LED parpadeará 7
Raspberry Pi, abriremos una terminal y veces.
ejecutaremos el código del Listado 2 escri-
biendo Errores
Es posible que el LED conectado al
python arduPi Arduino no parpadee y esto puede ser oca-
sionado por varios motivos. Lo primero es
La utilización de este pequeño ejemplo no repasar el circuito y comprobar que todo
podría ser más simple (véase Figura 4). La está conectado y en su sitio. Otro de los

Listado 1: RaspberryPi-Arduino.ino
01 const int ledPin = 8; 24 break;
02 25 case 5:
03 void setup() 26 for (int i = 0; i < 5; i++)
04 { 27 {
05 pinMode(ledPin, OUTPUT); 28 digitalWrite(ledPin, HIGH);
06 Serial.begin(9600); 29 delay(300);
07 } 30 digitalWrite(ledPin, LOW);
08 31 delay(300);
09 void loop() 32 }
10 { 33 break;
11 if (Serial.available()) 34 case 7:
12 { 35 for (int i = 0; i < 7; i++)
13 int num = Serial.read() - ‘0’; 36 {
14 switch(num) 37 digitalWrite(ledPin, HIGH);
15 { 38 delay(300);
16 case 2: 39 digitalWrite(ledPin, LOW);
17 for (int i = 0; i < 2; i++) 40 delay(300);
18 { 41 }
19 digitalWrite(ledPin, HIGH); 42 break;
20 delay(300); 43 }
21 digitalWrite(ledPin, LOW); 44 }
22 delay(300); 45 delay(1000);
23 } 46 }

W W W. L I N U X - M A G A Z I N E . E S WWW.LINUX- MAGAZINE.ES HARDWARE 75


RASPBERRY PI Raspberry Pi + Arduino

Listado 2: arduPi.py
01 #!/usr/bin/python 20 from Tkinter import * 39 return
02 # -*- coding: iso-8859-15 -*- 21 import time 40
03 22 41 root.title(“Probando Arduino”)
04 #################### 23 DEVICE = ‘/dev/ttyACM’+str(com) 42 Label(text=”Linux Magazine: Especial
05 # Detección de puerto 24 BAUD = 9600 Hardware”, fg=”#0A116B”).pack()

06 import serial 25 ser = serial.Serial(DEVICE, BAUD) 43 Label(text=”Raspberry Pi dice: ¡Hola Mundo,


Arduino!”,fg=”#0A116B”).pack()
07 26
44 Button(text=’2 parpadeos’, command=dos,
08 for com in range(0,4): 27 root = Tk() background=”#33D63B”, fg=”#FFFFFF”).pack()
09 try: 28 45 Button(text=’5 parpadeos’, command=cinco,
10 PORT = ‘/dev/ttyACM’+str(com) 29 def cinco() : background=”#1DE4F2”, fg=”#FFFFFF”).pack()
11 BAUD = 9600 30 ser.write(‘5’) 46 Button(text=’7 parpadeos’, command=siete,
background=”#DC0F16”, fg=”#FFFFFF”).pack()
12 board = serial.Serial(PORT,BAUD) 31 return
47
13 board.close() 32
48 root.mainloop()
14 break 33 def dos() :
15 except: 34 ser.write(‘2’)
16 pass 35 return
17 36
18 ########### 37 def siete() :
19 # Parpadeos 38 ser.write(‘7’)

Listado 3: dondeEsta.py
01 #!/usr/bin/python
02
03 import serial
04
Figura 5: Mensaje al ejecutar dondeEsta.py, el cual nos indica si está conectado el hardware 05 for com in range(0,4):

en el puerto que se esté probando. Justo después de conectar el Arduino, el sistema no 06 try:

detecta la tarjeta. Pero al cabo de unos segundos, el Arduino aparece en /dev/ttyACM0. 07 PORT = ‘/dev/ttyACM’+str(com)
08 BAUD = 9600
09 board = serial.Serial(PORT,BAUD)
problemas más habituales es que, al des- 2, para que te informe sobre el puerto que
10 print ‘Tarjeta detectado en
enchufar y enchufar el Arduino, la ruta a la puede utilizarse para la comunicación con /dev/ttyACM’+str(com)
conexión del mismo haya cambiado, el Arduino. Cabe mencionar que, durante 11 print ‘Hardware: %s’ % board.__str__()
pasando de, por ejemplo, /dev/ttyACM0 a mis pruebas, intercambié el Arduino en los 12 board.close()

/dev/ttyACM1. dos puertos disponibles del Raspberry y en 13 break

Por ello, cada vez que se desenchufa y los dos casos me funcionó en el puerto 14 except:
15 print ‘Ninguna tarjeta detectada en
se vuelve a enchufar el Arduino a la Rasp- /dev/ttyACM0. /dev/ttyACM’+str(com)
berry Pi, hay que parar el programa
arduPi.py, esperar unos segundos a que el Conclusiones
kernel de Linux de la RP detecte correcta- ¡Listo! Los dos dispositivos ya se comuni- Sin embargo, si te interesa utilizar una
mente al Arduino y luego, volver a ejecutar can. Las posibilidades para nuevos proyec- solución de hardware, échale un vistazo al
el programa. tos son inmensas, ya que tenemos todo el shield Raspberry Pi to Arduino [5] de Coo-
Para otros proyectos, puedes utilizar el poder que nos brinda Arduino unido con king Hacks, que hace que todo el ecosis-
código del Listado 3, adaptado del Listado todas las posibilidades que nos ofrece este tema de shields, entornos y sketches de
nanoPC de moda. De Arduino funcionen con el Rapsberry Pi de
ahora en adelante sólo manera directa. ■
estarás limitado por tu
imaginación. Recursos
Hoy en día el Raspberry
[1] Hardware Diferente: Ver página 20.
Pi no es 100% compatible
[2] Deliciosa Baya: Ver página 10.
con Arduino, existiendo
diferentes shields y otras [3] Artículo Introducción a Arduino: Ver
página 6.
soluciones de hardware
para compensar esta falta [4] Pyserial:
de compatibilidad. Pero http://pypi.python.org/pypi/pyserial
gracias a la librería [5] Raspberry Pi to Arduino Shield:
python-serial, podremos http://www.cooking-hacks.com/index.
desarrollar nuestros pro- php/raspberry-pi-to-arduino-shield-
connection-bridge.html
yectos sin necesidad de
Figura 6: Vista del montaje del circuito. En la imagen se obser- añadir más cacharros a la [6] Fritzing:
http://fritzing.org/
van las conexiones necesarias para probar la comunicación. mezcla.

76 HARDWARE W W W. L I N U X - M A G A Z I N E . E S
Tiendas, Sitios y Publicaciones RECURSOS

Recursos
Tiendas

BricoGeek
Distribuidor oficial para SparkFun, Pololu, Makerbe-
Beam, Arduino, Adafruit y Parallax, que ofrece un
impresionante abanico de dispositivos y complemen-
tos. Especialistas en gadgets y electrónica recreativa, es
el mejor sitio para el aficionado a los quadcopters,
robots y demás cachivaches, que vuelan, reptan o zum-
ban. http://bricogeek.com

Cooking Hacks
Tienda que, junto a un amplio abanico de hardware
estándar, ofrece su propia línea de dispositivos y com-
ponentes, diseñada y creada por sus propios ingenie-
ros. A este respecto destacan su shield puente entre
Raspberry Pi y Arduino y su completo kit de sensores
sanitarios (electrocardiogramas, temperatura corporal,
flujo de aire, etc.). También comercializan unos comple-
http://cooking-hacks.com
tos kits con todo lo que necesitas para iniciarte en el
desarrollo con hardware libre.

I Ray
El factor diferencial de I Ray es que, aparte de comercia-
lizar todos los dispositivos Arduino estándar, te convier-
ten tu proyecto, una vez prototipado, en un sólo
módulo, listo para producción. Así, si tienes un proyecto
con múltiples shields y placas enganchados, puedes
encargar un módulo de I Ray mucho más compacto y
resistente. http://tienda.ray-ie.com/

OpenDomo
OpenDomo se especializa en la investigación y comer-
cialización de productos y servicios de control inteli-
gente, basados en tecnología libre. Es decir: domótica.
Si estás buscando módulos especializados para un pro-
yecto de control de corriente, entorno y electrodomésti-
cos para tu hogar o centro de trabajo, éste es el lugar
donde encontrarás lo que necesitas y cuidadosamente http://opendomo.com
paquetizado.

Picaxe
Picaxe es el proyecto de comercio de un grupo de inge-
nieros apasionados de la robótica. En su tienda puedes
encontrar productos Arduino, Pololu y complementos
especializados para Lego Mindstorms. Pero lo más inte-
resante tal vez sea su línea de productos propia, que
complementa y expande lo disponible por ahí. La línea
Picaxe incluye placas, sensores, kits de robótica comple- http://picaxe.es
tos y mucho más.

W W W. L I N U X - M A G A Z I N E . E S HARDWARE 77
RECURSOS Tiendas, Sitios y Publicaciones

RaspiPC
Tienda dedicada exclusivamente a la comercialización
de Raspberry Pis y sus complementos. Entre sus pro-
ductos estrella destaca su completo kit de iniciación de
Raspberry Pi, que incluye en la caja todo lo necesario
para empezar (caja protectora, alimentador de corriente,
SD con Raspbian, etc.). Pero tienen mucho más y vale la
pena examinar su tienda en busca de complementos http://raspipc.es
para tu RPi.

RS Components
Uno de los mayores distribuidores de componentes
electrónicos al por menor del mundo, con sedes y servi-
cios en decenas de países. Si son componentes, herra-
mientas, máquinas e instrumentos lo que necesitas,
sería raro que no los encontrases aquí. Tienen desde
tuberías y canalizaciones para el montaje de infraestruc-
turas, hasta el Raspberry Pi (siendo RS uno de los distri- http://es.rs-online.com
buidores oficiales de este popular nano-ordenador).

Sitios

Arduino
La primera parada ¡cómo no! No sólo es el cuartel gene-
ral en Internet de la fundación tras la creación de
Arduino, sino que contiene una gran cantidad de recur-
sos, en la forma de tutoriales, referencias de hardware,
lugares donde adquirir dispositivos y shields, software
(tanto IDEs para el desarrollo, como librerías y ejem-
plos) y un largo etcétera. Parada obligatoria. http://arduino.cc

Clone Wars
No directamente relacionado con Arduino o Raspberry
Pi, este proyecto hispano si es muy apto para su men-
ción por su fuerte cariz “maker”. La comunidad Clone
Wars construye y ayuda a construir impresoras 3D
domésticas de bajo precio. Los miembros ofrecen abun-
dante documentación y te imprimen las piezas que te
hacen falta, aunque esperan que tú hagas lo mismo una http://reprap.org/wiki/
vez tengas tu impresora en marcha. Proyecto_Clone_Wars

Design Spark
El sitio para el diseño profesional de proyectos. Reúne
un amplio abanico de herramientas y recursos útiles
para ingenieros, incluyendo diseños ya realizados, soft-
ware de diseño, foros, blogs y noticias. El sitio es parte
de la red RS, uno de los distribuidores oficiales del RPi y,
por tanto, hay una importante cantidad de recursos
dedicada al nano-ordenador de moda. http://designspark.com

78 HARDWARE W W W. L I N U X - M A G A Z I N E . E S
Tiendas, Sitios y Publicaciones RECURSOS

Hack A Day
Trae exactamente lo que dice en el paquete: un hack,
habitualmente de hardware, al día. Aunque puedes
encontrar cómo hacer un separador de Oreos (ya sabes,
para separar el relleno de la galleta), una útil lista des-
plegable de categorías te permite filtrar y encontrar las
abundantes y muy interesantes hacks hechas con
Arduino, RPis y impresión 3D. Combustible para tu ima- http://hackaday.com/
ginación.

Raspberry Pi
Otra parada obligatoria, esta vez en la sede oficial en
Internet del nano-ordenador educativo. En el sitio de la
fundación RPi podemos encontrar sobre todo referen-
cias a desarrollos y proyectos creados por otros que sir-
ven como ejemplos de casos de éxito de lo que puede
hacerse con Pi. Pero también encontraremos tutoriales
básicos, foros y FAQs que ayudarán a iniciarse en el http://raspberrypi.org/
desarrollo de proyectos en esta plataforma.

Shield List
Aunque no están todos los que son, si son todos los que
están. Shield List es, como su nombre indica, una
impresionante lista de shields compatibles con Arduino,
con detalles como el fabricante, la licencia bajo el que se
comercializa (sobre todo si se trata de hardware libre o
no) y los pins del Arduino que utiliza, todo ello en una
web sencilla, que raya en lo espartano y con una buena http://shieldlist.org/
función de búsqueda.

Editoriales y Publicaciones

The MagPi
Revista con hincapié en el uso del Raspberry Pi como
herramienta educativa. No muy orientado al movi-
miento maker, centrándose sobre todo en el software
didáctico (Scratch y Python) y orientado a profesores,
aunque también toca proyectos didácticos de hardware.
Un buen recurso para empezar a aprender sobre las
posibilidades del RPi. http://themagpi.com/

Make
Tal vez la revista pionera del movimiento maker, puedes
encontrar entre la portada y contraportada desde cómo
crear un globo estratosférico (con un smartphone como
ordenador de abordo), hasta la manera de construir una
guitarra eléctrica a partir de una caja de puros. Pero,
entre todo ello, puedes encontrar excelentes proyectos
basados en Arduino y esta publicación también ha http://makezine.com/
generado muchos volúmenes monográficos muy útiles
para el aficionado a estas cosas.

W W W. L I N U X - M A G A Z I N E . E S HARDWARE 79
ÍNDICE Temas

Índice Temático
A L
Arduino 06, 24, 27, 30, 36, 40, 44, 50, 74 LDR 31, 32, 38
Ethernet Shield 30 LED 06, 15, 18, 26, 28, 30, 32, 54, 62, 67, 74
IDE 06 lighthttp 13, 15
módulo GPRS/GSM 40, 47 lsusb 18
módulo GPS 54
módulo Relay 36 M
módulo RTC 44
Relay Shield 37 motor 15, 19
sketch 09 de vibración 19
servo 15, 19, 26, 27, 28
C
P
conversor A/D 25
Placas Circuitos Impresos, PCBs 06
D potenciómetro 26, 27
Processing 19
domótica 30, 36, 40, 44, 50 protoboard 26
PWM, Pulse Width Modulation 25, 27, 28
E Python 14, 62, 74

ELDK, Embedded Linux Development Kit 13 R


Entrada/Salida 25
Analógica 25 Raspberry Pi 10, 11, 59, 63
Digital 20 Características Técnicas 10, 63
contraseña 10
F Historia 63
Modelo A 10, 63
Fritzing 06 Modelo B 10, 63
usuario 10
G Raspbian 03, 64, 74
relé 36
Gnublin 12, 13, 14, 15 resistencia 26, 27, 31, 42, 66
Características Técnicas 12
Componentes Kit 13 S
GPIO 62, 66
GND, tierra 27 sensor 19, 32
agua 51
H CO2 51
humedad 45
Hummingbird 16 humo 50
Componentes Kit 16 metano 51
Programador Visual 16 temperatura 45, 66
Snap 18 ultrasonidos 54
HDMI 10 SoC, System on a Chip 11, 66

I T

Interfaz/Puerto Serial Virtual 12 The Internet of Things 30


/dev/ttyUSBX 12, 74 transistor NPN 51, 66

J U
Java 19 udev 18

80 HARDWARE W W W. L I N U X - M A G A Z I N E . E S
SERVICIO Autores / Contacto

Autores Datos de Contacto


Dimitri Popov 6, 59, 63 Director
Hiram Zuñiga Romero 74 Paul C. Brown
Luis Martín 20, 24, 30, 36, 40, 44, 50, 54 Coolaboradores
Markus Feilner 12 Paul C. Brown, Alina Caravaca

Paul C. Brown 3, 10, 16 Traductores


Paqui Martín Vergara, Víctor Tienda, Paqui
Wener Hein 63 Martín, Guillermo Cerezo
Maquetación
Miguel Gómez Molina
Diseño de Portada
Paul C. Brown
Colaboradores Solidarios Publicidad
www.linux-magazine.es/pub/
Acento Web Para España
Alberto Planas Marketing y Comunicaciones
Alejandro Gil Cal [email protected]
Tel.: (+ 34) 952 020 242
Alfonso Serrano Fax.: (+ 34) 951 235 905
Alina Caravaca Para el Resto del Mundo
David Peña Pardo Petra Jaser
[email protected]
Francisco Antonio Tapias Bravo Tel.: (+49) 8999 34 11 23
Franciso García Micó Fax.: (+49) 8999 34 11 99
ITIC Informática Director Editorial
Javier Cantos Cañete Paul C. Brown
Lluis Toyos Jefe de Producción
Manuel Rincón Romero Miguel Gómez Molina
Subscripciones:
Marcos Sánchez Provencio www.linux-magazine.es/magazine/subs
María Hoskins Precios Subscripción
Pedro A. Revenga Toro España: 54,90 €
Europa: 64,90 €
Rafael González Núnez Resto del Mundo - Euros: 84,90 €
Rodrigo Díaz [email protected]
Tel.: (+34) 952 020 242
Fax.: (+34) 951 235 905

Linux Magazine
Linux New Media Spain, S.L.
Edfco. Hevimar, Planta 2, Ofic. 16
C/Graham Bell nº 6
29590 - Málaga
ESPAÑA
[email protected]
Tel.: (+34) 952 020 242
(+34) 951 235 904
Fax.: (+34) 951 235 905

www.linux-magazine.es - España
www.linux-magazine.com - Mundo
www.linux-magazine.co.uk - Reino Unido
www.linux-magazine.com.br - Brasil
www.linux-magazine.pl - Polonia
Si bien se toman todas las medidas posibles para
garantizar la precisión del contenido de los artículos
publicados en Linux Magazine, la editorial no se
hace responsable de imprecisiones aparecidas en la
revista. Asimismo, Linux Magazine no comparte
necesariamente las opiniones vertidas por sus
colaboradores en sus artículos. El riesgo derivado
del uso del DVD y el material que contiene corren
por cuenta del lector. El DVD es estudiado escrupu-
losamente para confirmar que está libre de virus y
errores.
Copyright y Marcas Registradas © 2013 Linux New
Media Spain, S.L. Linux New Media Spain S.L.
prohíbe la reproducción total o parcial de los con-
tenidos de Linux Magazine sin su permiso previo y
por escrito. Linux es una Marca Registrada de Linus
Torvalds.

82 HARDWARE W W W. L I N U X - M A G A Z I N E . E S
DESIGNSPARK

NUEVOS Y EXCELENTES
RECURSOS PARA DISEÑOS
MÁS RÁPIDOS
NUEVO Y GRATUITO.
DESIGNSPARK PCB VERSION 4
NUEVAS LIBRERÍAS AHORA MÁS EXTENSAS,
CON UNA SELECCIÓN DE COMPONENTES MÁS FÁCIL
Y POSIBILIDAD DE SOLICITAR PRESUPUESTOS.

NUEVO Y GRATUITO.
MODEL SOURCE
MÁS DE 80.000 ESQUEMAS
Y SÍMBOLOS DE PCB GRATUITOS EN MÁS DE 20 FORMATOS,
INCLUYENDO PADS, ORCAD, ALTIUM Y CADSTAR.

Descúbralo ahora en
www.designspark.com UNIQUE RESOURCES BY

También podría gustarte