BeagleBone

BeagleBone Black

Esta placa de desarrollo basada en un procesador ARM de 32 bits posee unas caracteristicas muy interesantes para el desarrollador electrónico y es el siguiente paso tras verse limitado en muchos aspectos con el uso de microcontroladores de 8 bits como los habitualmente utilizados en el entorno Arduino.

 

Uno de los aspectos que intentaré desarrollar es el procesamiento de video en tiempo real, con la idea de implementar sistemas robóticos que aprovechen las posibilidades que aporta la visión artificial a la hora de interactuar con el entorno.

Descripción del Hardware

 

 

Procesador

 

La placa incorpora un procesador de 32 bits ARM Cortex-A8 desarrollado por Texas Instruments, concretamente el Sitara AM3358BZCZ100 a 1GHz cuyas especificaciones pueden consultarse aquí.

 

Se trata de un chip muy completo que incorpora entre otras características:

 

- Coprocesador de punto flotante NEON.

- Hardware de aceleración grafica 3D SGX530.

- 2 PRUs (Programable real-time units) de 32 bits a 200MHz (microcontroladores independientes).

- Controlador LCD / Pantalla táctil de 24 bits.

- Interface de memoria DDR, DDR2, DDR3.

- Puertos serie: 6x UART, 2x SPI, 3x I2C, 2x CAN, 2x USB 2.0, 2x Ethernet 10/100/1000 Mbps

- Puertos de audio: 2x McASP (multi-channel audio serial ports).

- 8 entradas analógicas de 12 bits.

- puertos paralelo: MMC y SD

- 3 modulos PWM de alta resolución

- 3 entradas capture de 32 bits configurables opcionalmente como salidas PWM adicionales.

- multitud de entradas/salidas de proposito general.

 

Existen versiones en encapsulados PBGA de 298 y 324 pines.

 

 

 

Almacenamiento

 

Por un lado tenemos la RAM al igual que en los PCs, donde se almacenan temporalmente datos y código ejecutable, siendo la velocidad de acceso uno de los parámetros mas importantes. La Beaglebone Black incorpora 512MB de memoria DDR3 a 800MHz.

 

Por otro lado, analogamente al disco duro de los PCs, disponemos de 4GB de almacenamiento permanente en forma de memoria flash bajo el standard MMC (multimedia card), lo que se conoce como eMMC o MMC embebida. Dicho de otra forma, tenemos un "disco duro de estado sólido" de 4GB.

 

Además, como según para que cosas 4GB pueden no ser suficientes, la placa incorpora lector de tarjetas microSD, pudiendo utilizar tarjetas de mayor capacidad, siendo recomendables las de alta velocidad. Yo utilizo una de 32GB de clase 10.

 

 

 

Conectividad

 

La comunicación con el exterior se lleva a cabo mediante:

 

- Un puerto USB 2.0 Host similar a los de los PCs. Para conectar teclado, ratón, webcam..., siendo necesario el uso de un Hub o concentrador para disponer de mas de un puerto.

 

- Un puerto USB 2.0 Cliente. Para conectarse a un PC como unidad de almacenamiento, teniendo acceso al contenido del sistema de archivos, pero también es posible establecer una conexión IP a traves de USB para tener acceso via html o, mejor aun ssh.

 

- Un conector Ethernet RJ-45 para conectar la Beaglebone a nuestra red doméstica y así poder acceder via ssh, ftp, etc.

 

- Un conector microHDMI que gracias al HDMI framer instalado en la placa permite utilizar cualquier monitor LCD o plasma.

 

- 2 conectores de expansión de 46 pines (2x23), con acceso a todas las funciones de la placa. Existen en el mercado diferentes placas de expansión o "capes" (por su parecido con una capa) que se insertan en estos conectores. Utilizaremos esta via para conectar sensores y actuadores u otros sistemas de hardware.

Entorno de Software

 

A diferencia de los clásicos Arduino, donde se ejecuta un unico programa en C / C++ en ausencia de sistema operátivo (si bien el Bootloader que permite la programación via USB, y que se ejecuta al arranque, tambíen es código ejecutable a tener en cuenta...), la Beagleone es perfectamente capaz de correr un SO completo, por ejemplo Linux (Debian, Ubuntu...) bajo el que se ejecutarán aplicaciones compiladas para ese sistema concreto, siendo los lenguajes de programación más utilizados los tradicionales C / C++, asociados al entorno UNIX desde tiempos remotos (informáticamente hablando), así como el más actual y simplificado Python.

 

La placa viene de fábrica con una distribución de linux ya instalada en la memoria flash embebida (eMMC). Dependiendo de la revisión de ésta (actualmente la revision C) la distro de Linux será Angstrom o Debian en las unidades mas nuevas. La mia traía Debian 7 (Wheezy), aunque ya está disponible Debian 8.2 (Jessie).

 

No resulta complicado descargar de internet e instalar una distribución Linux en la microSD externa a partir de imagenes "preconstruidas" (pre-built images) y puede llevarse a cabo desde un PC o Mac o, mejor aún, desde la propia Beaglebone. No todos los "sabores" de Linux estan disponibles para la arquitectura ARM aunque si lo está, por ejemplo, el popular Ubuntu (actualmente Ubuntu 14.04).

 

Si la imagen que hemos instalado no dispone de interface gráfico o "Desktop", lo que es habitual, podemos instalar (via apt-get) uno de bajo peso como el lxde y tendremos una máquina corriendo Linux mejor que algunos PCs.

 

 

 

Librería Adafruit BBIO

 

 

Existen diferentes maneras de controlar y acceder a las distintas lineas de entrada/salida disponibles en los conectores de expansión. Tenemos E/S de proposito general o GPIOs y una serie de pines asignados a dispositivos como puertos i2c, spi, uart, salidas PWM y entradas analógicas, así como las lineas del interface hdmi para controlar un LCD.

 

Una de las dificultades que se presenta, como puede observarse en la documentación disponible en elinux.org, es que se usan los mismos pines para diferentes propositos, ya que, de otra manera, los conectores de expansión deberían tener un número enorme de lineas. Esto de conoce como multiplexado de lineas E/S y es mediante software como se determina la función que va a tener un pin concreto. Podemos escribir y compilar un overlay que actualice en tiempo de ejecución el arbol de dispositivos o Device Tree Overlay, utilizando dtc para generar un archivo .dtbo que exportaremos con capemgr creando un nuevo slot..., si, suena algo complicado, si bien no lo es tanto.

 

Con el uso de la librería AdafruitBBIO para python no tenemos que preocuparnos en absoluto de lo anterior, eso sí, para que funcione correctamente debemos tener un kernel que soporte cape manager, ya que la librería hace uso de esta característica para asignar los pines que deseemos utilizar.

 

El proceso de instalación está bastante bien documentado en el sitio web de Adafruit. Una vez instalada nos permite acceder desde python a los diferentes dispositivos de E/S como uart, i2c, spi, pwm, adc, así como a los diferentes pines configurados como GPIOs.

 

 

 

OpenCV y Python

 

 

Las librerías OpenCV son un compendio de funciones escritas para permitir la manipulación de imágenes y videos en tiempo real de una manera sencilla. Existe una versión antigua "cv" y una mas actual "cv2" con versiones tanto para C/C++ como para Python, un lenguaje de programación tan potente como los anteriores pero con una síntaxis muchísimo más amable para el desarrollador.

 

Podemos instalar estas librerías utilizando "sudo apt-get install" para los siguientes paquetes:

 

build-essential libavformat-dev ffmpeg libcv2.3 libcvaux2.3 libhighgui2.3 python-opencv opencv-doc libcv-dev libcvaux-dev libhighgui-dev python-numpy

 

Un buen tutorial de opencv - python puede encontrarse en la documentación oficial de OpenCV. Basandome en él he escrito varios ejemplos que se encuentran accessibles en https://github.com/amalzaga/python-opencv, algunos de los cuales comentaré a continuación:

 

 

rgb-hsv.py: Aunque la manera mas habitual de guardar una imagen en color en formato digital es en el formato RGB, donde cada pixel queda codificado en 3 bytes que guardan la cantidad de cada color primario (rojo, verde y azul) cuantificada en un valor comprendido entre cero (nada) y 255 (máximo), lo que se conoce como espacio de color RGB, es complicado detectar un determinado color trabajando de esta manera, ya que, por ejemplo, un valor alto de verde no implica necesariamente que el color sea verde, sino que depende ene gran medida de las cantidades de azul y rojo (si ambas son muy pequeñas será verde).

 

Por ello para detectar objetos por su color es mucho más práctico trabajar en el espacio de color HSV (Hue, Saturation, Volume). El valor de Hue o tono es el que determina el color (tan solo conociendo este valor sabemos de que tonalidad se trata), saturation nos da la intensidad del color y volume su luminosidad.

 

El programa rgb-hsv.py nos permite elegir un color moviendo las barras RGB y automaticamente veremos que posición de las barras HSV le corresponde. ambién podemmos modificar los valores HSV y veremos el efecto en el espacio RGB.

 

Este programa ha sido una de las primeras cosas que he escrito en python con opencv y me parece muy practico para ayudar a entender la relación entre los dos espacios de color.

Copyright © All Rights Reserved