Buch lesen: «Raspberry Pi® a fondo para desarrolladores»
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