El potente Intel® Joule™
Intel no es nuevo en el mercado de los kits de desarrollo: el Edison, del tamaño de una tarjeta SD, es un excelente ejemplo, pero, con el módulo Joule, Intel se dirige de lleno a otro grupo de desarrolladores. La primera pista está en el precio: en la mayoría de los sitios el precio del Intel® Joule™ 570X es unas diez veces superior al del kit de desarrollo favorito de referencia, la Raspberry Pi 3.
Pero, ¿por qué pagar más por el módulo Joule? La respuesta corta es: la potencia de procesamiento compacta. El pequeño sistema en módulo (SOM) solo mide 24 x 48 mm pero incluye unas funciones impresionantes, como la captura y reproducción de vídeo en 4K con compatibilidad para la tecnología Intel® RealSense™. Esto permite al dispositivo captar información sobre la profundidad de campo (DOF), lo que proporciona a la aplicación una conciencia espacial de su entorno y de cualquier objeto en ese entorno. Es fácil imaginar lo útil que sería para:
- los vehículos autónomos, los drones y la robótica
- las aplicaciones de asistencia al conductor para el sector de la automoción
- la realidad virtual y aumentada
- el IoT industrial
…y prácticamente para cualquier otra aplicación donde resulte útil el conocimiento tridimensional del entorno local.
Funciones
¿Y qué más encontramos en un módulo Joule? Bueno, en realidad hay dos versiones para elegir, y la lista de funciones es algo así:
El módulo Intel® Joule™ 570X incluye:
- Procesador de alto rendimiento Intel® Atom™ T5700 de cuatro núcleos, 1,7 GHz y 64 bits con ráfaga de hasta 2,4 GHz
- Memoria RAM LPDDR4 de 4 GB y memoria eMMC de 16 GB
- Gráficos Intel® HD con captura y reproducción de vídeo en 4K
- Wi-Fi 802.11ac con MIMO y Bluetooth 4.1
- USB 3.0, interfaces MPI* CSI y DSI, y múltiples interfaces GPIO, I2C y UART
- Sistema operativo basado en Linux adaptado para IoT y dispositivos inteligentes
- Compatibilidad mejorada para las cámaras y bibliotecas Intel® RealSense
El módulo Intel® Joule™ 550X, más económico, incluye:
- Procesador de alto rendimiento Intel® Atom™ T5500 de cuatro núcleos, 1,5 GHz y 64 bits
- Memoria RAM LPDDR4 de 3 GB y memoria eMMC de 8 GB
- Gráficos Intel® HD con captura y reproducción de vídeo en 4K
- Wi-Fi 802.11ac con MIMO y Bluetooth 4.1
- USB 3.0, interfaces MPI CSI y DSI, y múltiples interfaces GPIO, I2C y UART
- Sistema operativo basado en Linux adaptado para IoT y dispositivos inteligentes
- Compatibilidad para las cámaras y bibliotecas Intel® RealSense
Por tanto, se puede afirmar que el módulo Intel® Joule™ se dirige de lleno al grupo de desarrolladores que quieren crear aplicaciones que requieren algo más de inteligencia autónoma local, en lugar de depender del procesamiento en la nube para todo.
Kit de desarrollo Intel® Joule™ 570X
El kit de desarrollo proporciona un módulo Joule montado en una placa de expansión que ofrece al usuario un acceso rápido a:
- USB 3.0 (1 puerto tipo A y 1 puerto tipo C)
- Micro HDMI
- Micro SD
- 2 conectores de E/S de 40 contactos a 3,3 V
- Puerto integrado de depuración serie sobre USB
- 2 antenas Wi-Fi
- Conector de batería RTC
- Conector de ventilador
…y se suministra con kit de montaje y disipador térmico, una antena para cada una de las antenas Wi-Fi, una tarjeta microSD y un cable USB tipo C a tipo A. Sin embargo, hay otros elementos que tendrás que conseguir antes de poder poner en marcha tu nuevo kit de desarrollo.
Lo que tendrás que conseguir:
- Fuente de alimentación de jack cilíndrico de 3 A (mín.) con salida nominal de 12 V, LPS o clase 2
- Cable micro HDMI a HDMI estándar, macho a macho
- Cable micro USB (tipo B) a USB (tipo A) para comunicación en serie a la placa
- Concentrador USB 3.0 con alimentación para teclado, ratón y memorias USB, ya que hay solo un conector USB tipo A en la placa.
Ninguno de estos elementos está incluido en el kit de desarrollo, por lo que puedes pedir lo que no tengas al mismo tiempo que el kit de desarrollo Joule para evitar lloriqueos y quejas cuando llegue tu placa, te lo dice la voz de la experiencia...
Sistema operativo
Cuando hayas recopilado todos los elementos del kit y estés listo para poner en marcha la placa por primera vez, verás que hay una selección de sistemas operativos para tu módulo Joule.
- Ubuntu 16.04 LTS Desktop o Core
- Windows 10 IoT Core
- Linux de referencia del Proyecto Ostro™ para IoT
El Linux de referencia del Proyecto Ostro™ para IoT, creado utilizando las herramientas del Proyecto Yocto, viene preinstalado en la placa de desarrollo.
En este caso, yo ya había decidido que quería hacer algunas comparaciones directas con mi fiel Raspberry Pi 3, por lo que parecía razonable usar Ubuntu Desktop, ya que hay una imagen de Ubuntu Mate para la Pi.
Lo que esto significaba para mi Intel® Joule™ es que tendría que volver a cargar el BIOS y crear una memoria USB o tarjeta microSD de arranque desde la que instalar Ubuntu 16.04. Tuve algunos problemas con mi tarjeta microSD de arranque, sobre la que no me dediqué a investigar más; el arranque inicial de este dispositivo se cayó a la mitad, así que, para seguir con el proceso, utilicé una memoria USB conectada al concentrador USB con alimentación. Esta segunda configuración se ejecutó como debía y fui capaz de instalar Ubuntu Desktop sin problemas.
Análisis comparativo
Después de unos ajustes para conseguir que el escritorio quedara como quería, pensé que era hora de descubrir las ganancias de rendimiento cuantificables que podemos obtener usando un Joule respecto a una Raspberry Pi 3. Para ello, recurrí a la herramienta de análisis comparativo favorita de Linux, sysbench.
Sysbench es una suite de referencia, creada originalmente por desarrolladores de MySQL para comparar el rendimiento de sistemas de bases de datos, que también nos ofrece un vistazo rápido del rendimiento de nuestros propios sistemas comerciales.
Para instalarlo en ambas placas, podemos abrir un terminal y escribir:
$ sudo apt install sysbench
Aunque hay una serie de pruebas y combinaciones que podríamos analizar, decidí que examinaríamos los principios básicos de rendimiento con una prueba de rendimiento de la CPU y una prueba de transferencia de memoria.
Prueba de CPU
La prueba de CPU de Sysbench calcula los números primos hasta un número establecido (el valor predeterminado es 10.000) realizando una división estándar del número entre todos los números entre 2 y la raíz cuadrada del número. Cualquier número que tenga un resto de 0 (es decir, no sea primo) hace que los cálculos pasen al siguiente número. Esto, por supuesto, hará hincapié en un grupo limitado de funciones de la CPU pero da una idea de cómo maneja el cálculo numérico general.
Como los procesadores Broadcom y los Intel son de núcleo cuádruple, parece razonable ejecutar ambas pruebas usando un único hilo primero y, a continuación, cuatro hilos para ver cómo afecta la distribución de la carga de trabajo al rendimiento general de cada procesador. También ejecuté la prueba con un número máximo de 20.000 para que los procesadores pudieran calentarse un poco y ver qué pasaba.
Prueba 1
Esta era prácticamente la configuración predeterminada: un hilo, hasta 10.000.
$ sysbench –test=cpu run
Resultado de Raspberry Pi
Resultado de Intel® Joule™
En el resumen de ejecución de la prueba, la cifra clave que estamos analizando es la de "tiempo total". Esta parecía suponer una victoria muy convincente para el Joule, que había finalizado en 8,23 segundos, frente a la Pi, en 158,12 segundos.
Prueba 2
Aquí vamos a emplear los 4 núcleos y, para ello, usaremos 4 hilos que resolverán la misma tarea.
$ sysbench --test=cpu --num-threads=4 run
Resultado de Raspberry Pi
Resultado de Intel® Joule™
Como cabía esperar, el rendimiento aumenta alrededor de 4 veces para ambos procesadores, con el Joule en 2,31 segundos y la Pi en 39,50 segundos.
Prueba 3
Aquí subimos el listón aún más ejecutando números primos hasta 20 000, lo que da tiempo para que ambos procesadores se calienten.
Resultado de Raspberry Pi
Resultado de Intel® Joule™
He utilizado un script de lectura de temperatura que hice rápidamente para este experimento para ver cuánto se calentaba la Pi. He incluido el script al final de esta publicación, para aquellos que estén interesados. En este conjunto de pruebas, tuve un disipador térmico de Raspberry Pi sobre el procesador Broadcom para probar y equilibrar un poco la situación térmica de la Pi. Aun así, parece que el rendimiento de la Pi sufre más con respecto al Joule cuando la carga de trabajo es más prolongada y hace que la Pi se caliente más: la Pi ha sido 17 veces más lenta en la prueba más corta, pero se acercaba a unas 20 veces más lenta en la prueba más larga.
Aunque estas pruebas solo están destinadas a ofrecer un vistazo general del rendimiento de cada procesador, la disparidad es tal que parece razonable concluir que, en cuanto a la capacidad de cálculo numérico, el Joule puede justificar sobradamente su elevado precio.
Prueba de memoria
Por supuesto, la capacidad de cálculo numérico no es lo único que afecta al rendimiento general de un procesador. Los datos a procesar deben desplazarse en la mayoría de las aplicaciones, por lo que el ancho de banda de memoria es otro factor limitante para el rendimiento.
La prueba de memoria de Sysbench asigna un búfer y, a continuación, procede a leer y escribir cada ubicación de datos y texto en el búfer hasta que el tamaño de búfer total se haya leído/escrito. Esto se repite hasta que se alcanza el tamaño total de la memoria.
Para proporcionar a nuestros candidatos la misma cantidad a transferir, utilizamos un búfer de 1 MB y un tamaño de memoria total de 2 GB:
$ sysbench –test=memory –memory-block-size=1M –memory-total-size=2G –num-threads=4 run
Resultado de Raspberry Pi
Resultado de Intel® Joule™
La Raspberry Pi consiguió una respetable velocidad de transferencia de 2,5 GB/s, pero, de nuevo, se vio superada por los 11 GB/s del Joule.
Existen otras pruebas que podrían aplicarse, como las velocidades de transferencia de archivos, pero creo que ya puedes hacerte una idea de hacia dónde nos encaminamos. La conclusión es que el Joule realmente no es caro en comparación con la Raspberry Pi: se trata de una bestia diferente y tiene un precio competitivo para la horquilla de rendimiento en la que se encuentra.
Así pues, vamos a hacer que nuestro Joule haga algo útil. Voy a analizar el "superpoder" del Joule (el procesamiento de imágenes) en un próximo artículo donde probaré una cámara RealSense. Para hoy, quiero ver lo fácil que es hacer algo más en la línea de la "informática de uso general", porque es bueno saber que tu kit de desarrollo es versátil.
Estación de transmisión inalámbrica
La próxima vez que quieras enviar correos electrónicos desde esa solana al fondo del jardín, utiliza tu Joule como una estación de transmisión inalámbrica para ampliar el alcance de tu red Wi-Fi doméstica. Puedes configurarlo para que se ejecute siempre que lo necesites con un simple script (después de haber configurado algunos requisitos previos).
Para esta configuración, necesitarás un adaptador Wi-Fi USB para usarlo junto al Wi-Fi integrado en el Joule. Estoy utilizando un módulo Wi-Fi USB Edimax EW-7811Un muy económico que tenía cogiendo polvo en un cajón, pero, si quieres una conexión más rápida, puedes utilizar un adaptador Wi-Fi USB 3.0 compatible con 802.11ac (solo tienes que asegurarte de que dispone de un controlador Linux oficial si no quieres complicarte la vida). También estoy usando un adaptador USB-C a USB-A para poder utilizar el puerto USB-C en la placa de desarrollo. Esto resulta especialmente útil si decides utilizar un adaptador Wi-Fi USB 3.0 para velocidades de datos superiores.
Vamos a utilizar un par de herramientas estándar de Linux para accionar nuestro hardware: hostapd para configurar nuestro adaptador Wi-Fi, como un punto de acceso inalámbrico, y dnsmasq para ejecutar servicios DHCP y DNS para clientes con punto de acceso.
Inicio
Antes de continuar, es probable que sea buena idea asegurarse de que el adaptador Wi-Fi integrado en el Joule es compatible realmente con el tipo de punto de acceso que queremos utilizar. Para averiguarlo, podemos abrir el terminal y usar:
$ iw list
Esto nos dará una lista de los atributos para cada interfaz inalámbrica que puede encontrar iw y (cerca de la parte superior de una larga lista) se parecerá a esto:
Lo que queremos ver bajo la sección de modos de interfaz compatibles es AP, y ahí está. Si miramos más arriba, en los cifrados compatibles, podemos ver TKIP y CCMP, que significa que nuestro punto de acceso podrá utilizar el cifrado WPA2 para evitar que los vecinos se conecten y roben nuestro ancho de banda.
Controladores
El adaptador Wi-Fi USB Edimax está bastante extendido, por lo que no es de extrañar que se incluya un controlador "plug-and-play" en la mayoría de las distribuciones de Linux y parece que funciona bastante bien. Sin embargo, se ha notificado un error que se puede corregir mediante un controlador de código abierto (que tiene la ventaja de que también está recomendado por Edimax) en GitHub. Así que, solo para asegurarnos de que todo funciona correctamente, vamos a instalar el controlador corregido.
En primer lugar, tendremos que instalar git y dkms, ya que no están preinstalados en nuestra distribución:
$ sudo apt install git dkms
Cuando lo tengamos todo instalado, podemos clonar el controlador desde GitHub a nuestra máquina. Yo suelo poner este tipo de cosas en un directorio independiente para mantener un orden:
$ mkdir Projects
$ mkdir Projects/wifi
$ cd Projects/wifi
$ git clone https://github.com/pvaret/rtl8192cu-fixes.git
El DKMS (Dynamic Kernel Module Support [Soporte para módulo de kernel dinámico]) nos permite instalar versiones adicionales de los módulos del kernel. En primer lugar, añadimos las "correcciones" como un módulo dkms:
$ sudo dkms add ./rtl8192cu-fixes
A continuación, creamos e instalamos el módulo de controlador:
$ sudo dkms install 8192cu/1.10
…y actualizamos la lista de módulos:
$ sudo depmod –a
Ahora bloqueamos el módulo de kernel existente…
$ sudo cp ./rtl8192cu-fixes/blacklist-native-rtl8192.conf /etc/modprobe.d/
...desactivamos la gestión de potencia:
$ sudo cp ./rtl8192cu-fixes/8192cu-disable-power-management.conf /etc/modprobe.d/
Y, por último, reiniciamos el sistema para cargar el nuevo controlador:
$ sudo reboot
Si a continuación usamos ifconfig -a, podemos ver que nuestra nueva y flamante interfaz de red está en marcha:
Preparación de nuestra interfaz de red para hacer grandes cosas
Si bien hostapd es fácil de configurar, hay un par de limitaciones que debemos mitigar para que nuestra configuración siga siendo sencilla. Lo primero que tenemos que tener en cuenta es que hostapd requiere que tu controlador de interfaz se cree en el entorno mac80211. Esto le permite utilizar herramientas de espacio de usuario nl80211 que admiten modos inalámbricos más allá del modo estación únicamente: en este caso, queremos utilizar el modo AP. Podemos comprobar qué controladores estamos utilizando con:
$ sudo lshw –c network
Podemos ver que nuestra interfaz Wi-Fi integrada utiliza el controlador iwlwifi. Podemos usar una tabla de controladores para averiguar si nuestro controlador iwlwifi está basado en mac80211, o podemos simplemente comprobar las dependencias de nuestro controlador:
$ lsmod | grep iwlwifi
Esto nos indica que tenemos controladores basados en mac80211:
Nuestra otra consideración es un error que evita que hostapd se inicie cuando la interfaz de red está gestionada por el administrador de red de Ubuntu. La solución alternativa para este error es evitar que el administrador de red gestione la interfaz que queremos utilizar como un AP desde el principio. Por suerte, esto también es muy sencillo de organizar. Las interfaces declaradas en el archivo de interfaces de red serán ignoradas por el administrador de red. Se puede abrir el archivo con:
$ sudo nano /etc/network/interfaces
A continuación, tendrás que añadir algo similar a esto:
En mi caso, he configurado la dirección del punto de acceso (10.15.15.1) para que se distinga fácilmente de la dirección del punto de acceso de mi router. También podemos pedir explícitamente al administrador de redes que ignore nuestro punto de acceso declarando su dirección MAC (que se obtiene mediante el valor WHaddr en el comando ifconfig –a) como no administrada:
$ sudo nano /etc/NetworkManager/NetworkManager.conf
A continuación, añade:
[keyfile]
unmanaged-devices=mac:xx:xx:xx:xx:xx:xx
sustituyendo las x por la dirección MAC de tu dispositivo:
Si reinicias ahora, observarás que la conexión de red al router ahora se realiza mediante el dispositivo USB en lugar del adaptador Wi-Fi integrado:
¡Hurra! Ahora nuestra configuración de red está preparada, podemos proseguir e instalar el software que nos conseguirá la magia inalámbrica.
Instalar hostapd
Para crear nuestro punto de acceso podemos instalar hostapd con:
$ sudo apt install hostapd
Una vez instalado, tenemos que configurar el punto de acceso. En primer lugar, le indicaremos a hostapd qué archivo de configuración queremos que utilice y dónde encontrarlo:
$ sudo nano /etc/default/hostapd
Entre las comillas después de DAEMON_CONF= añadiremos la ubicación: /etc/hostapd/hostapd.conf
Si necesitas depurar tu configuración, también puedes configurar el demonio para que sea más detallado en su salida con DAEMON_OPTS más abajo en el archivo de configuración:
Bien, ahora que hostapd ya sabe dónde encontrarlo, vamos a crear de verdad nuestro archivo de configuración:
$ sudo nano /etc/hostapd/hostapd.conf
Esta es una configuración mínima. Puedes involucrarte bastante en lo que acepta o rechaza el punto de acceso y cómo se configura el cifrado en el archivo de configuración. Este archivo de configuración, completamente anotado, muestra todas las opciones disponibles, por si tienes curiosidad.
Tendrás que ajustar tu "ssid" a como quiera que llames a tu punto de acceso. He ajustado el hardware al modo "g", ya que casi todo lo que tiene Wi-Fi puede utilizar esa configuración. El cifrado está configurado para ser WPA2 y solo WPA2. Tendrás que configurar la "passphrase" (frase de acceso) a lo que quieras que sea tu contraseña para el punto de acceso.
Ten en cuenta que, cuando ejecutamos esto, hostapd se quejará del código de país con algo tipo:
..wlp1s0: interface state UNINITIALIZED->COUNTRY_UPDATE
Esto se debe al CRDA (Central Regulatory Domain Agent [Agente de dominio regulador central]). No afecta al funcionamiento de nuestro AP, por lo que puedes hacer como yo e ignorarlo.
Ese es el punto de acceso, que ya está listo. Ahora tenemos que ser capaces de asignar direcciones IP a los dispositivos que se conecten a nuestro AP. Para ello, necesitamos DHCP y acceso a un servidor DNS.
Configurar dnsmasq
Estamos utilizando dnsmasq como nuestro servidor DNS y DHCP. Para instalarlo:
$ sudo apt install dnsmasq
Una vez instalado, tenemos otro archivo de configuración sencillo que configurar. Normalmente, guardo el archivo existente antes de crear el mío, ya que suele ser mucho más fácil de leer:
$ sudo mv /etc/dnsmasq.conf /etc/dnsmasq.conf.orig
Y, a continuación, creamos nuestra propia configuración:
Esta es otra configuración bastante mínima, pero suficiente para nuestro objetivo. De nuevo, si quieres explorar las otras opciones, consulta las notas en el archivo de configuración original.
En esta configuración:
server: muestra uno (o más) servidores DNS públicos a utilizar para consultas no locales. En este caso, hemos utilizado servidores de Google y OpenDNS.
no-hosts: hace que dnsmasq deje de utilizar el archivo /etc/hosts local para las búsquedas DNS.
dhcp-range: es el rango de direcciones IP que nuestro servidor presentará a nuestros dispositivos de conexión. "8h" indica que un host conectado tendrá un tiempo de arrendamiento de 8 horas en la dirección IP que se le proporciona.
dhcp-option 3: es la dirección de la puerta de enlace para nuestra nueva red local de los dispositivos.
dhcp-option 6: es la dirección del servidor DNS para nuestra red local.
Los registros hacen que sea más fácil comprobar que todo funciona correctamente.
Unión de nuestros hilos
Ahora que tenemos configurado nuestro software, solo tenemos que enrutar el tráfico desde el punto de acceso a internet. Esto se realiza mediante las reglas de firewall iptables. Voy a escribir el script de esta configuración, porque no quiero que Joule se encienda como un repetidor inalámbrico, pero quiero poder activarlo de forma sencilla siempre que quiera:
#!/bin/bash
MONITOR_DEVICE=wlp1s0
OUTPUT_DEVICE=wlx80xxxxxxxxxx
# Pulsa ctrl-c para una salida limpia
trap ctrl_c INT
function ctrl_c(){
echo eliminando procesos AP...
killall dnsmasq
killall hostapd
}
echo mostrando la interfaz del punto de acceso...
ifconfig $MONITOR_DEVICE 10.15.15.1/24 up
# Observa que dnsmasq ya estará en marcha
echo configurando las tablas de enrutamiento
sysctl -w net.ipv4.ip_forward=1
iptables -t nat -A POSTROUTING -o $OUTPUT_DEVICE -j MASQUERADE
iptables -A FORWARD -i $MONITOR_DEVICE -o $OUTPUT_DEVICE -j ACCEPT
echo iniciando el punto de acceso...
hostapd /etc/hostapd/hostapd.conf -B
La opción B para la ejecución de hostapd hace que se ejecute en segundo plano. Si quieres ver lo que está haciendo mientras se ejecuta en la ventana del terminal, no marques esta opción. Tendrás que utilizar [Ctrl] [C] para detener el programa, y lo utilizaremos para eliminar todos los demás procesos limpiamente.
Lo que estamos haciendo aquí es una forma de traducción de direcciones de red (NAT) llamada enmascaramiento IP: enrutar todas las conexiones IP en nuestro punto de acceso al adaptador Wi-Fi integrado en el Joule, de modo que este adaptador sea la única dirección IP conectada a nuestro router y todos los paquetes de datos hacia el router parezcan proceder de esta única fuente. Este enlace contiene una explicación detallada del enmascaramiento, es un texto antiguo pero una buena exposición de lo que está ocurriendo.
Solo resta hacer que nuestro script (que he denominado "ap") sea ejecutable y encender el repetidor:
$ chmod +x ap
$ sudo ./ap
Ahora deberías tener disponible tu propio punto de acceso. Si utilizas una herramienta como Wi-Fi Commander en un portátil con Windows, deberías poder ver nuestro punto de acceso difundiendo su presencia en el espectro:
He filtrado los otros (92) puntos de acceso a mi alrededor para tener una imagen un poco más clara. También podemos probarlo mediante la conexión de nuestros dispositivos, como un iPhone:
¡Sí! Ahora estamos conectados y podemos disfrutar de acceso a internet inalámbrico fuera del alcance normal de nuestro router. Cuando hayas terminado, puedes utilizar el script "rk" para apagarlo todo.
Conclusión
Es divertido jugar con el módulo Intel® Joule™, como ocurre con muchas de las placas de los kits de desarrollo/formación de bajo coste del mercado. También se puede convertir fácilmente en muchos de los mismos tipos de aplicaciones, pero la diferencia reside en que Joule también cuenta con importantes capacidades de procesamiento para aplicaciones del mundo real que necesitan una gran cantidad de procesamiento localizado y donde la conectividad en la nube no está disponible o no se recomienda para la aplicación.
He disfrutado familiarizándome con mi Joule y estoy deseando probar otras cosas con él en el futuro.
Traducción del artículo escrito por Mark Gauntlet, Technical Marketing Applications Engineer de RS Components.