9788426724700.jpg

Raspberry Pi® a fondo

para desarrolladores

Raspberry Pi® a fondo

para desarrolladores

Derek Molloy

Dedicado a Sally, Daragh, Eoghan, Aidan y Sarah.

(¡Por orden de edad, que no de predilección!)

Acerca del autor

El Dr. Derek Molloy es profesor titular en la Escuela de Ingeniería electrónica, Facultad de ingeniería y computación, de la Dublin City University, en Irlanda. Da clases de programación orientada a objetos en sistemas empotrados, de electrónica digital y analógica y de IoT (Internet of Things, Internet de las cosas, por sus siglas en inglés) a estudiantes de grado y posgrado. Ha realizado sus contribuciones como investigador sobre todo en campos tales como visión por ordenador, gráficos en 3D y visualización, así como en tecnologías de e-Learning o aprendizaje por ordenador.

Derek produce una popular serie de vídeos en YouTube que ha servido a millones de personas para dar sus primeros pasos en los ámbitos de Linux en sistemas empotrados y de la electrónica digital. En 2013 lanzó un blog o web personal, que recibe miles de visitas diariamente, en la que integra sus vídeos de YouTube con otros materiales de apoyo, código fuente y foros de debate para los usuarios. En 2015 escribió un libro sobre la plataforma BeagleBone, Exploring BeagleBone: Tools and Techniques for Building with Embedded Linux, que fue muy bien recibido.

Derek ha recibido varios premios por su labor educativa. Fue merecedor del premio nacional a la innovación educativa "2012 Irish Learning Technology Association (ILTA) national award for Innovation in Teching and Learning". El galardón reconoce su enfoque de aprendizaje por la práctica en la educación de estudiantes de grado de ingeniería, que combina kits de electrónica y contenidos audiovisuales en línea. En 2012, como resultado de la ferviente nominación de sus estudiantes y colegas, recibió también el premio "Dublin City University President's Award for Excellence in Teaching and Learning" que reconoce nuevamente su excelencia en el ámbito de la educación.

El lector puede consultar más datos sobre Dereck, su trabajo y el resto de sus publicaciones en su página web personal: www.derekmolloy.ie.

Acerca del editor técnico

El Dr. Tom Betka llegó al mundo del desarrollo para sistemas empotrados desde su anterior trabajo en la industria aeronáutica. Así mismo, practicó la medicina durante más de diez años. Durante este tiempo, su amor por los ordenadores y el desarrollo de software lo llevó hasta los sistemas empotrados, y su formación en informática, hasta obtener una segunda titulación. Después de abandonar la práctica clínca, el Dr. Betka comenzó a trabajar en el mundo de la programación y como experto en materias de medicina y sistemas empotrados en diferentes compañías de software. Entre sus trabajos más recientes se incluyen proyectos en el Kennedy Space Center de la NASA y la Sierra Nevada Corporation. El primer amor de Tom fueron los lenguajes de programación de la familia del lenguaje C, que empleó para programar microcontroladores de 8 bits. Como usuario de Linux durante más de una década, también ha trabajado unos años con dispositivos BeableBone, BeagleBone Black y Raspberry Pi. Entre sus aficiones se cuentan las matemáticas avanzadas, la aviación, el modelismo de cohetería de gran potencia y la robótica. Es fácil encontrarlo en su taller casero trabajando en proyectos construcción de prototipos de dispositivos. Además, en otra vida por así decir, Tom fue batería profesional y uno de los primeros en adoptar dispositivos con tecnología de percusión digital en sus actuaciones de músca en vivo.

Agradecimientos

Debo dar las gracias a todo el equipo de Wiley Publising una vez más por su trabajo sobresaliente en este proyecto. A Jim Minatel por su empeño en que llevase adelante este concepto de libro y por su apoyo renovado para la realización de un libro que se centrase en el aprendizaje en profundidad. A Aaron Black y Jody Lefevere, por hacer avanzar el proyecto y por su apoyo y ayuda durante todo su desarrollo. A Jennifer Lynn, por hacerme respetar los plazos y por estar siempre disponible para responder a mis preguntas. A Adaobi Obi Tulton, el editor del proyecto, por llevarlo hasta su finalización de la manera más eficiente posible: ha sido un verdadero placer volver a trabajar con un editor de su categoría. A Keith Cline y Marylouise Wiak, los correctores, por hacer este libro legible en inglés americano. A Barath Kumar Rajasekaran, el editor de producción, y Nancy Bell, la revisora, por dar coherencia al conjunto y crear un producto final bien terminado.

Expreso mi más sincero agracedimiento a Tom Betka, el editor técnico, por la increíble cantidad de tiempo y esfuerzo personal que ha invertido para asegurar que el contenido de este libro se pueda utilizar sin problemas por los lectores. Tras la publicación de mi libro sobre BeagleBone, Tom proporcionó motu proprio comentarios muy valiosos en la página web del libro, que sirvieron para afianzar el título.
Así, pensé de inmediato en Tom cuando acepté este proyecto y estuve encantado de que aceptase el papel de editor técnico. Tom es un académico, un erudito e indiscutiblemente toda una inspiración; además siempre ha estado disponible para analizar conmigo cualquier asunto técnico. Este libro se ha beneficiado enormemente de sus conocimientos técnicos, de su experiencia vital y de sus enormes capacidades. Estoy convencido de que no podría haber encontrado mejor editor técnico para el tema tratado.

Debo también agradecer a las miles de personas que se toman la molesta de comentar mis vídeos en YouTube, las entradas de mi blog y los artículos que publico en mi página web. y consejos recibidos, que de verdad me han ayudado en el desarrollo de los temas tratados en mis libros.

La Escuela de ingeniería electrónica de la Dublin City University es un lugar magnífico para trabajar gracias, en gran medida, a su espíritu de grupo y a su compromiso con una educación en ingeniería rigurosa, innovadora y accesible. Agradezco nuevamente a mis colegas de la Escuela por su apoyo, sus ánimos y su tolerancia durante la redacción de este libro. En particular doy las gracias a Noel Murphy y Connor Brenan por compartir la carga de trabajo de la dirección de la Escuela conmigo mientras me encontraba completamente absorto en la escritura del libro. Gracias de nuevo a mi hermano David Molloy por sus expertos consejos de software y por su apoyo. Gracias a Jennifer Bruton por su experta y meticulosa revisión de los circuitos, el software y los contenidos utilizados en este libro. Así mismo, agradezco a Martin Collier, Pascal Landais, Michele Pringle, Robert Sadleir, Ronan Scaife y John Whelan por su continuo apoyo, consejo y asesoramiento experto.

Obviamente, mi mayor agradecimiento es para mi familia. Tardé más de seis meses en escribir este libro; principalmente por las noches y en los fines de semana. Gracias a Sally, mi mujer, y a nuestros hijos Daragah, Eoghan, Aidan y Sarah por aguantarme, una vez más, durante la redacción de este libro. Gracias a mi madre, Catriona, y a mi padre, David, por toda una vida de apoyo, ánimo e inspiración. Por último debo agradecer al resto de mi familia por tolerar, otros seis meses, con buen talante mis ausencias en eventos y fiestas familiares: ya no tengo excusa, ¡a menos que escriba otro libro!

Resumen de contenidos

Introducción

Parte I Aspectos básicos del Raspberry Pi

Capítulo 1 El hardware del Raspberry Pi

Capítulo 2 El software del Raspberry Pi

Capítulo 3 Exploración de sistemas Linux empotrados

Capítulo 4 Interfaz con los componentes electrónicos

Capítulo 5 Programación con Raspberry Pi

Parte II Interfaz, control y comunicaciones

Capítulo 6 Interfaz de entrada/salida en el Raspberry Pi

Capítulo 7 Compilación cruzada y el IDE Eclipse

Capítulo 8 Interfaz con los buses del Raspberry Pi

Capítulo 9 Mejora de las interfaces de entrada/salida en el RPi

Capítulo 10 Cómo interaccionar con el entorno físico

Capítulo 11 Interfaz en tiempo real con el Arduino

Parte III Comunicación e interacción avanzadas

Capítulo 12 IoT (Internet of Things)

Capítulo 13 Control y comunicación inalámbricas

Capítulo 14 Raspberry Pi con una interfaz de usuario enriquecida

Capítulo 15 Imágenes, vídeo y audio

Capítulo 16 Programación del núcleo

Contenidos

Introducción

Estructura del libro

Convenciones utilizadas en este libro

Material necesario

Fe de erratas

Contenido digital y código fuente

Parte I

Aspectos básicos del Raspberry Pi

Capítulo 1

El hardware del Raspberry Pi

Introducción a la plataforma

¿A quién está destinado el RPi?

Cuándo utilizar el RPi

Cuándo no utilizar el RPi

La documentación del RPi

El hardware del RPi

Las versiones del Raspberry Pi

El hardware del Raspberry Pi

Accesorios del Raspberry Pi

Accesorios importantes

Una fuente de alimentación externa de 5 V

Tarjeta micro-SD para iniciar el sistema operativo

Cable Ethernet para conectividad de red

Accesorios recomendados

Cable HDMI para conectar a monitores o televisiones

Cable serie USB a TTL UART 3,3 V para localización de problemas

Accesorios opcionales

Un hub USB para conectar múltiples dispositivos USB

Adaptadores micro-HDMI a VGA para vídeo y sonido

Adaptadores WiFi para conectividad inalámbrica

Dispositivos de almacenamiento USB

Webcam USB para captura de imágenes y streaming de vídeo

Teclado y ratón USB para computación de propósito general

Carcasas para proteger el RPi

Placas de extensión HAT

Cómo destruir su RPi

Resumen

Soporte

Capítulo 2

El software del Raspberry Pi

Linux en el Raspberry Pi

Distribuciones de Linux para el RPi

Cómo crear una imagen Linux en una tarjeta SD para el RPi

Cómo conectarse a una red

Cable Ethernet estándar

Cable Ethernet cruzado

Cómo comunicarse con el RPi

Conexión serie con el cable USB a TTL de 3,3 V

Conexión segura con SSH (Secure Shell)

Conexiones SSH (Secure Shell) mediante PuTTY

Chrome Apps: cliente Secure Shell

Como transferir archivos mediante PuTTY/psftp sobre SSH

Control del Raspberry Pi

Comandos básicos de Linux

Primeros pasos

Comandos básicos del sistema de archivos

Variables de entorno

Edición básica de archivos

¿Qué hora es?

Gestión de paquetes

Configuración del Raspberry Pi

La herramienta de configuración del Raspberry Pi

Actualización del software del RPi

Salida de vídeo

Interacción con los LED de la placa

Apagado y reinicio

Resumen

Capítulo 3

Exploración de sistemas Linux empotrados

Introducción a Linux para sistemas empotrados

Ventajas y desventajas de Linux para sistemas empotrados

¿Es Linux gratuito y de código abierto?

Cómo iniciar el Raspberry Pi

Los gestores de arranque del Raspberry Pi

Espacio del núcleo y espacio de usuario

El gestor de sistema y servicios systemd

Gestión de sistemas Linux

El superusuario

Administración del sistema

El sistema de archivos de Linux

Enlaces a archivos y directorios

Usuarios y grupos

Permisos del sistema de archivos

El directorio raíz (root) de Linux

Comandos para sistemas de archivos

La fiabilidad de los sistemas de archivos en las tarjetas SD

Comandos de Linux

Redirección de entrada y salida (>, >> y <)

Tuberías (| y tee)

Comandos de filtro (de sort a xargs)

Los comandos echo y cat

diff

tar

md5sum

Procesos de Linux

Cómo controlar los procesos en Linux

Procesos en primer y en segundo plano

Otros temas de Linux

Cómo utilizar Git para el control de versiones

Una introducción práctica

Cómo clonar un repositorio (git clone)

Cómo obtener información de estado (git status)

Cómo añadir archivos al área de preparación (git add)

Cómo hacer commit en el repositorio local (git commit)

Envío al repositorio remoto (git push)

Ramas de desarrollo de Git

Cómo crear una rama de desarrollo (git branch)

Cómo fusionar ramas de desarrollo (git merge)

Cómo borrar una rama de desarrollo (git branch -d)

Comandos habituales de Git

Cómo utilizar escritorios virtuales

El código fuente de este libro

Resumen

Otras lecturas

Bibliografía

Capítulo 4

Interfaz con los componentes electrónicos

Cómo analizar nuestros circuitos

Multímetro digital

Osciloscopios

Principios básicos de los circuitos

Voltaje, intensidad de la corriente, resistencia y la ley de Ohm

División de voltaje

División de corriente

Cómo implementar circuitos del RPi en una placa de pruebas

Multímetros digitales (DMM) y placas de pruebas

Circuito de ejemplo: regulación de voltaje

Componentes discretos

Diodos

Diodos emisores de luz (LED)

Condensadores de filtro o aplanamiento y de desconexión

Transistores

Utilización de transistores como conmutadores

Utilización de transistores de efecto campo (FET) como conmutadores

Optoacopladores/optoaisladores

Interruptores y botones

Histéresis

Puertas lógicas

Entradas flotantes

Resistencias pull-up y pull-down

Salidas de colector abierto y de drenador abierto

Interconexión de puertas lógicas

Conversión analógico-digital

Frecuencia de muestreo

Discretización

Amplificadores operacionales

Amplificadores operacionales ideales

Retroalimentación negativa y seguidor de tensiones

Retroalimentación positiva

Consejos finales

Resumen

Otras lecturas

Capítulo 5

Programación con Raspberry Pi

Introducción

Rendimiento de los lenguajes en el RPi

Establecer la frecuencia de trabajo en la CPU del RPi

Un primer circuito para la computación física

Lenguajes de script

Opciones de lenguajes de script

Bash

Lua

Perl

Python

Lenguajes compilados dinámicamente

Javascript y Node.js en el RPi

Java en el RPi

C y C++ en el RPi

Introducción a C y C++

Compilando y enlazando

Cómo escribir el programa C/C++ más corto del mundo

Compilación estática y dinámica

Variables y operadores en C/C++

Punteros en C/C++

Cadenas de caracteres (strings) de estilo C

Control de LED en C

La "C" de C++

Primer ejemplo y gestión de cadenas en C++

Paso por valor, por puntero y por referencia

Control del LED con C++ (sin emplear objetos)

Introducción a la programación orientada a objetos

Clases y objetos

Encapsulación

Herencia

Control de LED orientado a objetos con C++

Interfaz con el sistema operativo Linux

Glibc y syscall

Cómo mejorar el rendimiento de Python

Cython

Cómo ampliar Python con C/C++

La API Python/C

Boost.Python

Resumen

Otras lecturas

Bibliografía

Parte II

Interfaz, control y comunicaciones

Capítulo 6

Interfaz de entrada/salida en el Raspberry Pi

Introducción

Entrada/salida de propósito general

Salida digital GPIO

Entrada digital GPIO

Resistencias pull-up y pull-down internas

Interfaz con circuitos DC con alimentación

Uso de C++ para el control de la salida GPIO con sysfs

Más sobre programación con C++

Funciones de retrollamada

Hilos de ejecución POSIX

Linux poll (sys/poll.h)

Una clase GPIO mejorada

Uso de la memoria para el control de la salida GPIO

Control de GPIO mediante devmem2

Control de GPIO mediante C y /dev/mem

Cambiar la configuración de las resistencias internas

WiringPi

Cómo instalar wiringPi

El comando gpio

Programación con wiringPi

Cambiar el estado de un LED mediante wiringPi

Pulsación de un botón: respuesta LED

Comunicación con sensores One-Wire

PWM y los relojes de propósito general

Pulse-Width Modulation (PWM)

Aplicación PWM: oscurecimiento de un LED

Aplicación PWM: control de un servomotor

Señales de reloj de propósito general

Las salidas GPIO y los permisos

Cómo escribir reglas udev

Los permisos y wiringPi

Resumen

Capítulo 7

Compilación cruzada y el IDE Eclipse

Cómo configurar una toolchain para compilación cruzada

La cadena de herramientas Linaro Toolchain para Raspbian

Comprobación de la toolchain

Cómo actualizar la variable de entorno PATH

Cadenas de herramientas de compilación cruzada para Debian

Emulación de la arquitectura armhf

Compilación cruzada con librerías de terceras partes (multiarch)

Compilación cruzada a través de Eclipse

Cómo instalar Eclipse en Linux

Configuración de Eclipse para compilación cruzada

El explorador de sistemas remotos

Cómo integrar GitHub en Eclipse

Depuración en remoto

Documentación automática en Doxygen

Cómo añadir soporte Doxygen a Eclipse

Compilación de Linux

Cómo descargar el código fuente del núcleo

Compilación del núcleo de Linux

Cómo instalar el núcleo de Linux

Cómo crear una distribución de Linux (avanzado)

Resumen

Otras lecturas

Capítulo 8

Interfaz con los buses del Raspberry Pi

Introducción a las comunicaciones por bus

I2C

Hardware I2C

El bus I2C en el RPi

Cómo habilitar el bus I2C en el RPi

Cómo habilitar un segundo bus I2C

Un circuito de prueba I2C

Un reloj de tiempo real

El acelerómetro ADXL345

Cableado del circuito de pruebas

Utilización de las herramientas I2C-tools de Linux

i2cdetect

i2cdump

i2cget

i2cset

Comunicaciones en C por el bus I2C

Encapsulación de dispositivos I2C en clases C++

SPI

Hardware SPI

SPI en el RPi

Pruebas en el bus SPI

Una primera aplicación SPI (74HC595)

Cableado del circuito de pruebas 74HC595

Comunicaciones SPI utilizando lenguaje C

Comunicación bidireccional SPI en C/C++

La interfaz ADXL345 SPI

Conexión del ADXL345 al RPi

Encapsulación de dispositivos SPI en clases C++

Comunicación SPI de tres hilos

Múltiples dispositivos esclavos SPI en el RPi

UART

El UART del RPi

Ejemplos de UART en C

Cliente serie RPi

Servidor serie LED RPi

Aplicaciones UART: GPS

Traducción de nivel lógico

Resumen

Otras lecturas

Capítulo 9

Mejora de las interfaces de entrada/salida en el RPi

Introducción

Conversión analógico-digital

Conversores analógico-digitales (ADC) SPI

El ADC SPI MCP3208

Cómo cablear el MCP3208 al RPi

Cómo comunicarse con el MCP3208

Una aplicación ADC: fotómetro analógico

Cómo comprobar el rendimiento del ADC SPI

La librería C para el BCM2835 (avanzado)

Conversión digital-analógica

Un conversor digital-analógico de bus I2C

Un conversor digital-analógico SPI

Cómo añadir salidas PWM al RPi

Cómo ampliar las salidas GPIO del RPi

El MCP23017 y el bus I2C

Cómo controlar el circuito LED GPIO

Cómo leer el estado del pulsador GPIO

Un ejemplo de configuración de interrupciones (avanzado)

El MCP23S17 y el bus SPI

Una clase C++ para dispositivos MCP23x17

Cómo añadir UART al RPi

Resumen

Capítulo 10

Cómo interaccionar con el entorno físico

Interfaces con los actuadores

Motores de corriente continua (DC)

Propulsión de motores DC pequeños (hasta 1,5 A)

Propulsión de motores DC mayores (más de 1,5 A)

Motores paso a paso

El controlador de motor paso a paso EasyDriver

Un circuito de control para un motor paso a paso en el RPi

Cómo controlar un motor paso a paso usando C++

Relés

Interfaz con sensores analógicos

Sensores analógicos lineales

Sensores analógicos no lineales

Acondicionamiento de la señal en un sensor analógico

Escalado de la señal mediante división de voltaje

Escalado y voltaje de desequilibrio o desplazamiento (offset) de la señal

Interfaz con un acelerómetro analógico

Interfaz con pantallas locales

Módulos de pantalla MAX7219

Módulos LCD de caracteres

Pantallas OLED

Compilación de librerías C/C++

Makefiles

CMake

Un ejemplo "Hello World"

Compilación de librerías C/C++

Usando una librería compartida (.so) o estática (.a)

Resumen

Capítulo 11

Interfaz en tiempo real con el Arduino

El Arduino

Un dispositivo esclavo serie Arduino

Ejemplo: una prueba de eco UART

Eco de la información de minicom (con parpadeo de LED)

Ejemplos de eco UART en C

Control de comandos UART en un Arduino

Un dispositivo esclavo Arduino I2C

Un circuito de prueba I2C

Ejemplo de eco de registro I2C

Ejemplo de sensor de temperatura I2C

Sensor de temperatura I2C con LED de advertencia

Comunicación en modo esclavo del Arduino usando C/C++

Ejemplo de sensor ultrasónico I2C

Un dispositivo esclavo SPI Arduino

Programación del Arduino en línea de comandos del RPi

Resumen

Parte III

Comunicación e interacción avanzadas

Capítulo 12

IoT (Internet of Things)

IoT (Internet of Things)

El RPi como sensor IoT

El RPi como sensor de servidor web

Nginx

Cómo configurar el servidor web Nginx

Cómo crear scripts y páginas web

PHP en el RPi

Aplicaciones GNU Cgicc (avanzado)

Un cliente web C/C++

Introducción a las comunicaciones en red

Un cliente web C/C++

Comunicaciones seguras mediante OpenSSL

El RPi como "Thing"

ThingSpeak

El programador de tareas Cron de Linux

El sistema crontab

User crontab

Cómo enviar correo electrónico desde el RPi

"Si esto, entonces aquello" (If This Then That, IFTTT)

Frameworks IoT a gran escala

MQ Telemetry Transport (MQTT)

IBM Bluemix Internet of Things

Ejemplo de publicación con IBM IoT MQTT usando Node.js

Ejemplo de publicación con IBM IoT MQTT usando C++

Visualización de datos con IBM Quickstart

Cliente/servidor con C++

Gestión de dispositivos IoT

Monitorización remota del RPi

Temporizadores RPi Watchdog

Direcciones IP estáticas

Alimentación por Ethernet (PoE, Power over Ethernet)

Módulos de extración PoE (PEM) (avanzado)

Resumen

Capítulo 13

Control y comunicación inalámbricas

Introducción a las comunicaciones inalámbricas

Comunicaciones Bluetooth

Cómo instalar un adaptador Bluetooth

Comprobación del módulo LKM

Cómo configurar un adaptador Bluetooth

Cómo hacer que el RPi sea "descubrible"

Desarrollo de aplicaciones Android con Bluetooth

Comunicaciones por WiFi

Cómo instalar un adaptador WiFi

El procesador esclavo WiFi NodeMCU

El firmware más reciente

Cómo conectar NodeMCU a WiFi

Cómo programar el NodeMCU

La interfaz del servidor web NodeMCU

JSON

Comunicación con mensajes JSON

El NodeMCU y el protocolo MQTT

Comunicaciones ZigBee

Introducción a los dispositivos XBee

Modo AT frente a modo API

Configuración XBee

XCTU

Cómo configurar una red XBee usando XCTU

Un ejemplo de XBee en modo AT

Configuración del dispositivo Arduino XBee (XBeeA)

Configuración del dispositivo RPi XBee (XBeePi)

Un ejemplo de XBee en modo API

Configuración del dispositivo RPi XBee (XBee1)

Configuración del dispositivo independiente XBee (XBee2)

El modo XBee API y Node.js

XBee y C/C++

Comunicación de campo cercano (NFC)

Resumen

Capítulo 14

Raspberry Pi con una interfaz de usuario enriquecida

Arquitecturas de interfaz de usuario enriquecida para RPi

El RPi como ordenador de propósito general

Cómo conectar un periférico de entrada Bluetooth

El RPi con una pantalla táctil LCD

Computación virtual en red (VNC)

VNC con el visor VNC Viewer

VNC con Xming y PuTTY

VNC en un PC con Linux

Aplicaciones fat-client o de cliente pesado

Desarrollo de interfaces gráficas de usuario enriquecidas

Introducción a GTK+ en el RPi

Una aplicación "Hello World" GTK+

Modelo de programación orientado a eventos

Aplicación de humedad y temperatura con GTK+

Introducción a Qt en el RPi

Cómo instalar las herramientas de desarrollo Qt en el RPi

La aplicación "Hello World" Qt

Introducción a Qt

Elementos de Qt

La clase QObject

Señales y slots

Herramientas de desarrollo para Qt

Primer ejemplo con Qt Creator

Una aplicación Qt con UI para un sensor meteorológico

Desarrollo de interfaces gráficas remotas

Aplicación GUI Qt para cliente pesado

Aplicaciones servidor con procesamiento multihilo

El servidor meteorológico multihilo

Análisis y representación de la corriente de datos

Resumen

Otras lecturas

Capítulo 15

Imágenes, vídeo y audio

Captura de imágenes y vídeo

La cámara del RPi

Cómo capturar imágenes fijas

Cómo grabar vídeo

Cómo usar la cámara del RPi en el espacio de usuario de Linux

Webcams USB

Video4Linux2 (V4L2)

Utilidad de captura de imágenes

Utilidades Video4Linux2

Desarrollo de programas Video4Linux2

Vídeo en streaming

Procesamiento de imágenes y visión por ordenador

Procesamiento de imágenes con OpenCV

Visión artificial con OpenCV

Boost

Audio en el Raspberry Pi

Principales herramientas software de audio

Dispositivos de audio para el RPi

Dispositivos de reproducción de audio USB y HDMI

Cómo reproducir emisoras de radio por Internet

Grabación de audio

Streaming de audio por la red

Audio Bluetooth A2DP

Lectura automatizada (Text-to-Speech)

Resumen

Otras lecturas

Capítulo 16

Programación del núcleo

Introducción

¿Por qué escribir módulos para el núcleo?

Introducción a los módulos cargables del núcleo (LKM)

Primer ejemplo de un LKM

El LKM Makefile

Cómo compilar un LKM en un ordenador con Linux

Cómo compilar un LKM en el RPi

Nuestro primer ejemplo de LKM a prueba

Comprobación del parámetro LKM

Ejemplo de un LKM empotrado

Rutinas de servicio de interrupción (ISR)

Rendimiento

Controlador GPIO LKM de botón mejorado

La interfaz kobject

Controlador GPIO LKM de LED mejorado

Hilos de ejecución del núcleo

Conclusiones

Resumen

Introducción

La idea básica del proyecto Raspberry Pi (RPi) es la de desarrollar una plataforma de computación pequeña y asequible que sirviera para estimular el interés de los niños por aprender los aspectos fundamentales de las tecnologías de la información y las comunicaciones. La rápida evolución de los dispositivos SoC (System-on a -Chip) de bajo coste para aplicaciones móviles posibilitó una amplísima distribución de la plataforma asequible RPi a principios de 2012. Su impacto fue inmediato: en febrero de 2015 ya se habían vendido más de cinco millones de placas Raspberry Pi. La proliferación de smartphones nos ha permitido dar por sentado que podemos tener ordenadores capaces de llevar a cabo miles de millones de operaciones por segundo en la palma de la mano. No obstante, el hecho de que podamos modificar el hardware y el software de unos dispositivos tan pequeños como potentes y adaptarlos a nuestras necesidades, así como desarrollar nuestras propias creaciones, no deja de resultar asombroso. Mejor aún: ahora es posible adquirir un Raspberry Pi Zero por menos de cinco euros, casi lo mismo que un desayuno.

Las placas Raspberry Pi propiamente dichas resultan demasiado complejas para que las utilice el público general. Es, sin embargo, su capacidad de ejecutar una versión empotrada (embedded) de Linux lo que las convierte en plataformas accesibles, adaptables y potentes. En conjunto, Linux y los sistemas empotrados hacen posible un desarrollo sencillo para este tipo de dispositivos, destinados realizar funciones en edificios inteligentes, dispositivos IoT (Internet of Things, literalmente "Internet de las cosas"), robótica, energía inteligente, ciudades inteligentes, interacción hombre-ordenador (HCI o Human-Computer Interaction por sus siglas en inglés), sistemas ciberfísicos, impresión en 3D, sistemas avanzados para vehículos y muchas más aplicaciones.

La integración del software Linux de alto nivel con unos componentes electrónicos de bajo nivel representa un cambio de paradigma en el ámbito del desarrollo para sistemas empotrados. Poder construir un circuito con componentes electrónicos de bajo nivel e instalar un servidor web Linux, que permitirá su control desde Internet, con solo unos pocos comandos solo se puede definir como revolucionario. Es fácil utilizar el Raspberry Pi como ordenador Linux de propósito general, pero es muchísimo más interesante, y todo un desafío, remangarse y manipular directamente los componentes electrónicos en los circuitos de nuestro propio diseño. ¡Para eso está este libro!

Este libro debería resultar muy atractivo para inventores, manitas, estudiantes, emprendedores, hackers, artistas y soñadores, es decir, para todo el mundo que desee llevar la potencia de Linux empotrado a sus productos, invenciones, creaciones o proyectos y comprender verdaderamente la plataforma RPi con todo detalle. No es este, sin embargo, un libro de recetas. Con escasas excepciones todo lo mostrado aquí se explica a un nivel que permitirá al lector diseñar, construir y depurar sus propias ampliaciones a los conceptos presentados. Tampoco se incluye en el libro ningún gran proyecto de diseño para el que se deba comprar un conjunto predeterminado de componentes y periféricos con los que alcanzar un resultado muy concreto. Más bien, este libro trata de proporcionar al lector el conocimiento básico suficiente, así como los detalles técnicos, que le permita explorar por su cuenta y, además, lo motive a hacerlo.

Creo firmemente en el aprendizaje con la práctica, así, presento ejemplos con hardware de muy bajo coste y muy fácil de encontrar de modo que el lector pueda seguir adelante. Mediante estos ejemplos prácticos, se describe con todo detalle el significado de los pasos a seguir. De este modo, cuando el lector sustituya sus propios componentes, módulos y periféricos hardware, será capaz de adaptar el contenido de este libro a sus propias necesidades. Y respecto a ese "gran proyecto de diseño", lo dejamos a la imaginación del lector.

En 2014 escribí un libro muy bien recibido sobre la plataforma BeagleBone, titulado: Exploring BeagleBone: Tools and Techniques for Building with Embedded Linux. Como este libro se centra en Linux empotrado (embedded Linux) y pone todo el énfasis en presentar los principios fundamentales, existen ciertas similitudes entre el contenido introductorio de aquel libro y el de éste. Sin embargo, este libro se ha escrito desde el principio directamente para la plataforma RPi y en él se analizan sus puntos fuertes y se abordan varias de sus debilidades. Asimismo, he aprovechado la oportunidad de ampliar el material para tratar temas como el desarrollo para el núcleo (kernel) de Linux, el Arduino como procesador de servicios, nodos sensores WiFi, comunicación XBee, mensajería MQTT, dispositivos IoT, el concepto "plataforma como servicio" (Platform as a Service, PaaS por sus siglas en inglés) y mucho más. Si tiene una copia de Exploring BeagleBone, debería visitar el sitio web del libro (www.exploringrpi.com) a fin de comparar el contenido de ambos antes de decidir cuál comprar.

Al escribir este libro me propuse cumplir los objetivos siguientes:

Explicar el funcionamiento de Linux en sistemas empotrados y su interacción con los circuitos electrónicos, y guiar para ello al lector por los distintos aspectos y desafíos que presenta la popular plataforma RPi.

Proporcionar información detallada y formación en profundidad acerca de Linux, electrónica y programación. Todo ello resulta necesario para dominar una variedad amplia y exhaustiva de temas en este ámbito.

Crear una colección práctica de ejemplos tipo "¡Hola, mundo!", tanto en hardware como en software, de todos los temas tratados en el libro, por ejemplo: interfaces a bajo nivel, entrada/salida de propósito general (General Purpose Input/Output, GPIO), buses, conversores analógico-digital (Analog-to-Digital Converter, ADC) conectados a bus, así como transmisores/receptores asíncronos universales (Universal Asynchronous Receiver/Transmitter, UART). Igualmente, se analizan librerías para programación de alto nivel como OpenCV y el Framework Qt. Por último, en el libro se cubren también temas más avanzados como la manipulación de registros a bajo nivel y el desarrollo de módulos cargables del núcleo (Loadable Kernel Module, LKM) de Linux.

Mejorar y ampliar las capacidades de interfaz que ofrece la plataforma RPi mediante el desarrollo de frameworks para conectarla a circuitos, por ejemplo ADC basados en SPI, a procesadores de servicio, como Arduino y NodeMCU, y a plataformas y servicios IoT basados en la nube.

Asegurar que todos y cada uno de los circuitos y fragmentos de código fuente tengan un amplio alcance pedagógico y que estén diseñados específicamente para funcionar en el Raspberry Pi. Todos y cada uno de los circuitos y ejemplos de código fuente de este libro se compiló y probó en la plataforma RPi; la mayoría, en múltiples versiones de la placa.

Utilizar ejemplos "¡Hola, mundo!" para construir una librería de código que el lector pueda emplear y adaptar después a sus propios proyectos con Raspberry Pi.

Publicar todo el código fuente en GitHub de forma que resulte fácil de utilizar.

Apoyar este libro con un sólido contenido digital, como los vídeos en el canal DerekMolloyDCU de YouTube y el sitio web, www.exploringrpi.com, desarrollado específicamente para este libro.

Asegurar que, al finalizar el libro, el lector contará con todo lo necesario para imaginar, crear y construir proyectos avanzados para el Raspberry Pi.

Estructura del libro

No cabe duda de que algunos de los temas tratados en este libro son muy complejos. Después de todo, los Raspberry Pi son dispositivos complejos. Sin embargo, este libro contiene todo lo necesario para dominar dichos temas y lo presenta dividido en tres partes principales:

Parte I: Aspectos básicos de Raspberry Pi

Parte II: Interfaz, control y comunicaciones

Parte III: Comunicación e interacción avanzadas

La primera parte del libro presenta el hardware y el software de las plataformas RPi en los capítulos 1 y 2 y, luego, proporciona tres capítulos introductorios:

Capítulo 3, “Exploración de sistemas Linux empotrados”

Capítulo 4, “Interfaz con los componentes electrónicos”

Capítulo 5, “Programación con Raspberry Pi”

Los lectores expertos en Linux, electrónica o software pueden obviar estas introducciones sin mayores problemas. Sin embargo, para todo el resto, se incluye un conjunto de materiales conciso pero detallado para asegurar que adquieren todos los conocimientos necesarios para trabajar con el Raspberry Pi de manera segura y eficaz. El resto hacen a menudo referencia a estos capítulos introductorios.

La segunda parte del libro, del capítulo 6 al 11, proporciona información detallada sobre las interfaces GPIO de Raspberry Pi, los buses (I2C, SPI), dispositivos UART y periféricos USB. Aprenderemos a configurar un entorno de compilación cruzada para abordar el desarrollo de aplicaciones de software a gran escala para el Raspberry Pi. La parte II describe también cómo combinar el hardware y el software para dotar al Raspberry Pi de la capacidad de interaccionar de forma eficaz con su entorno físico. Además, el capítulo 11 “Interfaz en tiempo real utilizando Arduino”, nos muestra cómo utilizar el Arduino como procesador esclavo con el Raspberry Pi. Esto sirve para superar algunas de las limitaciones de tiempo real que surgen al trabajar con Linux empotrado.

La tercera y última parte del libro, de los capítulos 12 al 16, describen cómo utilizar el Raspberry Pi para aplicaciones avanzadas de interfaz y comunicación, por ejemplo con dispositivos IoT, control y comunicaciones inalámbricas, interfaces gráficas de usuario enriquecidas, imágenes, audio y vídeo, así como la programación del núcleo de Linux. Por el camino nos encontraremos con múltiples tecnologías, como TCP/IP, ThingSpeak, IBM Bluemix, MQTT, Cgicc, alimentación por Ethernet (Power over Ethernet, PoE), WiFi, NodeMCUs, Bluetooth, NFC/RFID, ZigBee, XBee, cron, Nginx, PHP, correo electrónico, IFTTT, GPS, VNC, GTK+, Qt, XML, JSON, multihilo, programación cliente/servidor, V4L2, streaming de vídeo, OpenCV, Boost, audio USB, Bluetooth A2DP, lectura automatizada, LKM y kthreads.

Convenciones utilizadas en este libro

Este libro esta lleno de ejemplos de código fuente, así como de fragmentos completos que el lector podrá usar para construir sus propias aplicaciones. El código fuente y los comandos aparecen así en el libro:

This is what source code looks like.

Cuando se presenta el trabajo desarrollado en un terminal de Linux, suele ser necesario mostrar tanto la entrada como la salida en un solo ejemplo. La tipografía en negrita sirve para distinguir la entrada del usuario de la salida resultante. Por ejemplo:

pi@erpi ~ $ ping www.raspberrypi.org

PING lb.raspberrypi.org (93.93.128.211) 56(84) bytes of data.

64 bytes from 93.93.128.211: icmp_seq=1 ttl=53 time=23.1 ms

64 bytes from 93.93.128.211: icmp_seq=2 ttl=53 time=22.6 ms

...

El símbolo del sistema (prompt) $ indica que un usuario estándar de Linux ejecuta un comando, mientras que el símbolo del sistema # indica que quien ejecuta el comando tiene privilegios de superusuario. Una elipsis, simbolizada por (...), aparece siempre que ni el código fuente ni la salida eliminadas resulten imprescindibles para comprender una materia concreta. Editar de este modo la salida nos permite centrarnos sólo en la información más útil. Asimismo, un símbolo en forma de punta de flecha en una línea nos indica que el comando ocupa varias líneas en el libro, pero que debemos introducirlo en una sola línea. Por ejemplo:

pi@erpi /tmp $ echo "este es un comando largo que ocupa dos líneas en el

libro pero que debe ser escrito en una sola línea de código" >> test.txt

Animamos al lector a que repita los pasos indicados en el libro por su cuenta, en todos aquellos lugares en los que aparezca la salida completa. Además, existe un repositorio en GitHub con los códigos fuente completos de todo el libro.

Asimismo, el lector encontrará otros estilos de texto en el libro. Por ejemplo:

Los nuevos términos y las palabras importantes se escriben entrecomilladas o destacas en su tipografía cuando aparecen por vez primera.

Las combinaciones de teclas se muestran así: Ctrl+C.

Todas las URL en el libro se refieren a direcciones HTTP o HTTPS y aparecen de este modo: www.exploringrpi.com.

Se utiliza, asimismo, un servicio de abreviación para crear alias de las URL más largas que aparecen en el libro. Dichos alias presentan la forma de tiny.cc/erpi102 (por ejemplo el segundo enlace en el capítulo 1). Si la dirección del enlace cambiase una vez publicado el libro, se actualizaría el alias.

Diversas características del libro indican que el contenido reviste especial importancia, o bien cuándo hay disponible información adicional:

ADVERTENCIAContiene información importante que nos permitirá evitar producir daños a la placa Raspberry Pi.

NOTAPresenta información adicional útil, como enlaces a recursos digitales y consejos útiles que pueden facilitar la comprensión de la tarea de que se trate.

Material necesario

Lo ideal sería que el lector contase con una placa Raspberry Pi antes de comenzar con el libro. De este modo podría seguir los numerosos ejemplos que se incluyen. Si todavía no la ha adquirido, le recomiendo que opte por la Raspberry Pi 3 Model B. Aunque se trata de la placa más cara (algo más de 30 euros), es también la más potente. Dicha placa contiene un procesador de 64 bits con cuatro núcleos, un adaptador de red, un adaptador inalámbrico Ethernet y Bluetooth. Es decir, cuenta con todas las características necesarias para ejecutar cualquier ejemplo contenido en este libro. Raspberry Pi en tiendas en línea como Adafruit Industries, Digi-Key, SparkFun y Jameco Electronics si vive en los Estados Unidos. También están disponibles internacionalmente desde tiendas como Farnell, Radionics o Watterott.

En el capítulo 1 se ofrece una lista completa de todos los accesorios recomendados y opcionales para el Raspberry Pi. Si aún no tiene un Raspberry Pi, debería leer ese capítulo antes de comprarlo. Asimismo, la primera página de cada capítulo contiene una lista de los componentes electrónicos con los módulos requeridos para seguirlo. El sitio web del libro (www.exploringrpi.com) proporciona detalles sobre cómo adquirir dichos componentes.

Los ejemplos de este libro utilizan a propósito los componentes, placas para pines (breakout boards) y módulos de más bajo coste y más amplia disponibilidad que nos ha sido posible encontrar, y que cumplen los requisitos de los ejemplos. De este modo, el lector podrá trabajar con muchos de los ejemplos en lugar de centrar su presupuesto en solo unos pocos. Por todo el libro se indican unos precios orientativos de los componentes para que el lector pueda hacerse una idea del dinero que puede necesitar antes de iniciar un proyecto. Se trata de precios de compra reales (generalmente en dólares) encontrados en webs como ebay.com, amazon.com o aliexpress.com.

NOTANingún producto aparece en este libro como resultado de haber establecido acuerdo alguno con vendedores ni fabricantes. El autor ha seleccionado y adquirido todos los productos personalmente basándose sólo en su precio, funcionalidad y disponibilidad comercial. Los precios solo se ofrecen como referencia y pueden estar sujetos a variación. El lector debe indagar personalmente antes de adquirir cualquier elemento listado en este libro con el fin de asegurarse de que se ajusta a sus necesidades.

Fe de erratas

Se ha trabajado muy duro para garantizar que este libro esté libre de errores. Sin embargo, siempre cabe la posibilidad de que se haya deslizado alguno inadvertidamente. La web del libro (en inglés) contiene un listado con los errores detectados en cada capítulo (www.exploringrpi.com). Si el lector encuentra algún error en el texto o en los ejemplos de código fuente, le agradecería muy sinceramente que utilizara la web del libro para enviarlo y que podamos actualizar tanto la fe de erratas como los ejemplos de código fuente en el repositorio.

Contenido digital y código fuente

El sitio web principal asociado a este libro es www.exploringrpi.com. El propio autor se encarga del mantenimiento del sitio web, que contiene vídeos, ejemplos de código fuente y enlaces para ampliar los datos con nuevas lecturas. Cada capítulo tiene su propia página web. En el caso improbable de que el sitio web no se encuentre disponible, el lector puede encontrar el código fuente en www.wiley.com/go/exploringrpi.

Todo el código fuente se encuentra en un repositorio de GitHub, lo que permitirá al lector descargarlo en su Raspberry Pi con un solo comando. También puede acceder al código fuente en línea con facilidad en la dirección tiny.cc/erpi001. Para descargar el código fuente en su Raspberry Pi solo tiene que introducir el comando siguiente en el símbolo de sistema de su shell de Linux:

pi@erpi ~ $ git clone https://github.com/derekmolloy/exploringrpi.git

Si nunca antes ha utilizado GitHub, no se preocupe, lo explicamos con todo detalle en el capítulo 3.

Bien, es hora de empezar.