Kitabı oku: «Raspberry Pi® a fondo para desarrolladores», sayfa 2
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.