Gobernar un Microcontrolador desde la BeagleBoard-XM

Descripción de la publicación.

SISTEMAS EMBEBIDOS

Biblioman

6/9/201115 min read

En algunas ocasiones necesitamos crear una aplicación de escritorio que haga de interfaz entre un PC y un Microcontrolador para enviarle o recibir datos a través de un canal de comunicaciones. En este artículo vamos a ver como se puede sustituir la Computadora Personal (PC) por una placa de desarrollo embebido como la BeagleBoard-XM, la gran ventaja de este tipo de placas es que son lo suficientemente potentes en cuanto a memoria y velocidad de procesamiento para permitir la instalación de un Sistema Operativo y acceder al control de su hardware a través de él. Veremos las características de esta placa, así como los pasos que hay que seguir para la instalación de diferentes sistemas operativos en ella como Linux, Android o Windows, por último crearemos una aplicación de escritorio que se comunique con el Microcontrolador para enviar o recibir datos desde BeagleBoard .

Comencemos….

Características hardware de la BeagleBoard-XM

  • Procesador DM3730 basado en un núcleo ARM Cortex–A8, frecuencia de trabajo 1GHz. Capacidad de vídeo en HD (Texas Instruments C64x + Procesador DSP).

  • 512 MB de memoria RAM DDR.

  • Puertos de comunicaciones: I2C, I2S, SPI, 4 puertos Host USB y 1 USB 2.0 HS OTG, 1 puerto serie RS-232, 1 JTAG para depuración, 1 Conexión 10/100 Ethernet (a través de USB).

  • Señal de audio estéreo de entrada y salida para altavoces y micrófono.

  • Salida de vídeo: DVI-D y S-vídeo.

  • Conector de expansión para LCD.

  • Conector para cámara digital.

  • Slot para tarjetas de memoria micro-SD.

  • Conector para fuente de alimentación externa a 5V cc con protección ante sobre voltajes.


La BeagleBoard es un proyecto de Hardware libre por lo que desde la página oficial:


https://www.beagleboard.org/boards/beagleboard-xm


Se pueden descargar los esquemas así como el manual de referencia (en inglés).

La BeagleBoard viene tal y como se muestra en la figura de abajo:

Sin cables y con una tarjeta micro SD de 4GB con adaptador para SD, la memoria lleva pre-instalado una versión reducida (sin entorno gráfico y sin sistema de ficheros) del Sistema Operativo Anström, pero que permite establecer un rlogin (login remoto) a través de la interfaz serie RS-232 y un programa como el Hyperterminal o el GtkTerm utilizado en Linux, instalado en un PC que hace de anfitrión y que nos servirá para chequear todo el proceso de arranque de la BeagleBoard. La configuración de la conexión serie en el ordenador que hace de anfitrión debe de ser la siguiente:

  • Baudios: 115.200

  • 8 bits de datos

  • Sin Paridad

  • 1 bit de parada

  • No control de flujo


La conexión se realiza con un cable serie directo (sin cruzar) ya que la BeagleBoard hace de equipo de comunicación de datos (DCE) y el PC de equipo terminal de datos (DTE).

Instalación de diferentes Sistemas Operativos


Una buena opción de empezar a trabajar con la BeagleBoard es instalar y probar diferentes sistemas operativos embebidos.

  • Anström: una vez que hemos chequeado la placa con la versión reducida podemos instalar una versión más completa que incluya entorno gráfico y un sistema de ficheros. Lo primero que tenemos que hacer es preparar la tarjeta de memoria micro SD que albergará el Sistema Operativo. Cuando se utiliza un procesador ARM la geometría física del disco es diferente a la de un PC. Los parámetros que definen la geometría física de un disco son: Nº de cabezas, Nº de sectores y Nº de cilindros. Para ARM esos parámetros deben de ser:

- Head → 255

- Sectores → 63

- Los cilindros hay que calcularlos en función del tamaño en bytes de la tarjeta que usemos por

medio de la siguiente fórmula:

C(cilindros )= Tamaño en Bytes de la Memoria / Nº de Cabezas / Nº de Sectores / byte por sector

La tarjeta que vamos a utilizar es de 4 GB de capacidad y la herramienta que utilizaremos para preparar la tarjeta será fdisk incluida en todas las distribuciones de Linux (yo he utilizado Ubuntu 10.10).
Los pasos a seguir son los siguientes:

1. Nos aseguramos de cuál es la partición de la tarjeta:

sudo fdisk -l

Muy importante este paso para no equivocarnos con las particiones que tenga el disco duro de nuestro ordenador y perder los datos guardados en ella.

2. Utilizaremos el siguiente comando para trabajar con el disco:

sudo fdisk /dev/sdb

Donde sdb es el nombre de dispositivo que mi ordenador le ha dado a la tarjeta micro-SD en tú caso puede ser sdc u otro diferente.

3. Limpiamos la tabla de particiones: (opción o)


Command (m for help): o
Building a new DOS disklabel. Changes will remain in memory only,
until you decide to write them. After that, of course, the previous
content won't be recoverable.

Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)

4. Mostramos la información del dispositivo (opción p)

Command (m for help): p

Disco /dev/sdb: 3965 MB, 3965190144 bytes
122 cabezas, 62 sectores/pista, 1023 cilindros
Unidades = cilindros de 7564 * 512 = 3872768 bytes
Tamaño de sector (lógico / físico): 512 bytes / 512 bytes
Tamaño E/S (mínimo/óptimo): 512 bytes / 512 bytes
Identificador de disco: 0xe50a4022

....
De esta información nos interesa el tamaño en bytes: 3965190144 correspondiente a una tarjeta de 4 GB que es la que vamos a utilizar.

5. Entro en modo experto para establecer la geometría del disco (opcion X)


La geometría de la tarjeta como se ha comentado arriba debe de ser la siguiente:

h (cabezas)= 255
s (sectores)=63

Para el cálculo de los cilindros utilizamos la formula:

c(cilindros)= Tamaño en Bytes de la Memoria / Nº de Cabezas / Nº de Sectores/ bytes por sector = 3965190144 /255/63/512= 482,073576097

Lógicamente hay que redondear a la baja, por tanto: c(cilindros)=482

Ejecutamos las opciones del comando para establecer la geometría anteriormente descrita:

Orden avanzada (m para obtener ayuda): h
Número de cabezas (1-256, valor predeterminado 122): 255
Orden avanzada (m para obtener ayuda): s
Número de sectores (1-63, valor predeterminado 62): 63
Atención: estableciendo desplazamiento de sector para compatibilidad con DOS
Orden avanzada (m para obtener ayuda): c
Número de cilindros (1-1048576, valor predeterminado 1023): 482

6. Volvemos al modo principal para crear las particiones (opción r)


Orden avanzada (m para obtener ayuda): r
Orden (m para obtener ayuda):

7. Creamos la primera partición donde se alojaran los archivos de arranque del sistema operativo.


Orden (m para obtener ayuda): n
Acción de la orden
e Partición extendida
p Partición primaria (1-4)
p
Número de partición (1-4): 1
Primer cilindro (1-482, valor predeterminado 1): 1
Último cilindro, +cilindros o +tamaño{K,M,G} (1-482, valor predeterminado 482): 9

Con 9 cilindros (equivale aproximadamente a 70 MB de espacio) es suficiente para los archivos de arranque.

8. Creamos la segunda partición donde se alojarán los archivos del sistema.


Orden (m para obtener ayuda): n

Acción de la orden
e Partición extendida
p Partición primaria (1-4)
p
Número de partición (1-4): 2
Primer cilindro (10-482, valor predeterminado 10): 10
Último cilindro, +cilindros o +tamaño{K,M,G} (10-482, valor predeterminado 482): 482


9. Hacemos que la partición 1 sea bootable (opción a)


Orden (m para obtener ayuda): a
Número de partición (1-4): 1

10. Introducimos la (opción p) para ver cómo nos quedarían las particiones (hasta que no guardamos no se ejecutan las sentencias).

Orden (m para obtener ayuda): p

Disco /dev/sdb: 3965 MB, 3965190144 bytes
255 cabezas, 63 sectores/pista, 482 cilindros
Unidades = cilindros de 16065 512 = 8225280 bytes
Tamaño de sector (lógico / físico): 512 bytes / 512 bytes
Tamaño E/S (mínimo/óptimo): 512 bytes / 512 bytes
Identificador de disco: 0x8f1b93c7

Disposit. Inicio Comienzo Fin Bloques Id Sistema
/dev/sdb1
1 9 401593+ 83 Linux
/dev/sdb2 10 482 8032+ 83 Linux

El sistema de archivos para cada partición debe de ser la siguiente: para la primera partición que albergará los archivos de arranque del sistema operativo FAT 32 y para la segunda partición donde guardaremos los archivos del sistema ext3

Como vemos arriba la partición 1 esta para un sistema Linux y tiene que ser Fat 32.

11. Para cambiar eso introducimos la (opción t) seguido del número de partición que queremos cambiar en este caso la Nº 1

Orden (m para obtener ayuda): t
Número de partición (1-4): 1
Código hexadecimal (escriba L para ver los códigos): l

0 Vacía 24 NEC DOS 81 Minix / old Lin bf Solaris
1 FAT12 39 Plan 9 82 Linux swap / So c1 DRDOS/sec (FAT-
2 XENIX root 3c PartitionMagic 83 Linux c4 DRDOS/sec (FAT-
3 XENIX usr 40 Venix 80286 84 Unidad C: ocult c6 DRDOS/sec (FAT-
4 FAT16 <32M 41 PPC PReP Boot 85 Linux extendida c7 Syrinx
5 Extendida 42 SFS 86 Conjunto de vol da Datos sin SF
6 FAT16 4d QNX4.x 87 Conjunto de vol db CP/M / CTOS / .
7 HPFS/NTFS 4e QNX4.x segunda 88 Linux plaintext de Utilidad Dell
8 AIX 4f QNX4.x tercera 8e Linux LVM df BootIt
9 AIX bootable 50 OnTrack DM 93 Amoeba e1 DOS access
a OS/2 Boot Manag 51 OnTrack DM6 Aux 94 Amoeba BBT e3 DOS R/O
b W95 FAT32 52 CP/M 9f BSD/OS e4 SpeedStor
c W95 FAT32 (LBA) 53 OnTrack DM6 Aux a0 Hibernación de eb BeOS fs
e W95 FAT16 (LBA) 54 OnTrackDM6 a5 FreeBSD ee GPT
f W95 Ext'd (LBA) 55 EZ-Drive a6 OpenBSD ef EFI (FAT-12/16/
10 OPUS 56 Golden Bow a7 NeXTSTEP f0 inicio Linux/PA
11 FAT12 oculta 5c Priam Edisk a8 UFS de Darwin f1 SpeedStor
12 Compaq diagnost 61 SpeedStor a9 NetBSD f4 SpeedStor
14 FAT16 oculta <3 63 GNU HURD o SysV ab arranque de Dar f2 DOS secondary
16 FAT16 oculta 64 Novell Netware af HFS / HFS+ fb VMware VMFS
17 HPFS/NTFS ocult 65 Novell Netware b7 BSDI fs fc VMware VMKCORE
18 SmartSleep de A 70 DiskSecure Mult b8 BSDI swap fd Linux raid auto
1b Hidden W95 FAT3 75 PC/IX bb Boot Wizard hid fe LANstep
1c Hidden W95 FAT3 80 Old Minix be arranque de Sol ff BBT
1e Hidden W95 FAT1

Como se ve arriba si pulsamos l nos salen las opciones disponibles, tenemos que seleccionar la c

12. Seleccionamos otra vez la (opción p) para comprobar que todo este correcto antes de guardar los cambios:

Orden (m para obtener ayuda): p
Disco /dev/sdb: 3965 MB, 3965190144 bytes
255 cabezas, 63 sectores/pista, 482 cilindros
Unidades = cilindros de 16065 512 = 8225280 bytes
Tamaño de sector (lógico / físico): 512 bytes / 512 bytes
Tamaño E/S (mínimo/óptimo): 512 bytes / 512 bytes
Identificador de disco: 0x8f1b93c7
Disposit. Inicio Comienzo Fin Bloques Id Sistema
/dev/sdb1
1 9 401593+ c W95 FAT32 (LBA)
/dev/sdb2 10 482 8032+ 83 Linux

13. Guardamos los cambios con la opción w
14. Ahora nos queda formatear las particiones: antes comprobamos que no se ha montado ninguna partición automáticamente.

Para desmontar las particiones se utiliza el comando umount y gráficamente también lo podemos hacer desde Gparted:

sudo umount /dev/sdb1
sudo umount /dev/sdb2

Los comandos que tenemos que utilizar para formatear las particiones son los siguientes:

sudo mkfs.vfat -F 32 /dev/sdb1
sudo mkfs.ext3 /dev/sdb2

Como hemos comentado ya la primera partición en FAT32 y la segunda en el sistema de ficheros de Linux ext3.

15. Ahora creamos dos carpetas (Angstrom y boot) en el directorio /media

Que será donde montemos las dos particiones de la tarjeta para poder acceder a ella y guardar los archivos pertinentes:

sudo mkdir –p /media/boot

sudo mkdir /media/Angstrom

16. Ahora montamos las particiones en ambas carpetas para poder acceder a ellas ( si es que no lo ha hecho el sistema ya automáticamente):

sudo mount /dev/sdb1 /media/boot
sudo mount /dev/sdb2 /media/Angstrom

En el escritorio nos deben de aparecen las dos particiones ya montadas:

17. Nos descargamos los siguientes archivos de la página:

https://www.beagleboard.org/distros


El md5sums es la suma de verificación para comprobar que los archivos se han descargado correctamente.
Se comprueban de la siguiente forma:

md5sum MLO

El sistema mostrará esto:

biblioman@biblioman-desktop:~/Distribucion Angstrom$ md5sum MLO
571d5b229f7995aba3752004f6119118 MLO

Que cotejaremos con el archivo md5sums.txt.

18. Copiamos los archivos del sistema a la partición sdb2

sudo tar -xjv -C /media/Angstrom -f /home/biblioman/Distribucion_Angstrom/Angstrom-Beagleboard-demo-image-glibc-ipk-2011.1-beagleboard.rootfs.tar.bz2

Cuando todos los archivos se hayan copiado sincronizamos los archivos y desmontamos la partición:

sync
sudo umount /dev/sdb2


19. Ahora copiamos los archivos en boot para el arranque en este orden: para ello abrimos una terminal donde están los archivos a copiar y escribimos lo siguiente:

sudo cp MLO /media/boot
sudo cp u-boot.bin /media/boot
sudo cp uImage /media/boot


Al igual que antes una vez copiados los archivos sincronizamos y desmontamos la partición:

sync
sudo umount /dev/sdb1


Con estos pasos ya tenemos nuestra tarjeta preparada, ahora solo queda conectarla a la Beagleboard.
La conexión del monitor viene por defecto para HDMI a través de un cable convertidor de DVI-D (BeagleBoard) a HDMI (Monitor).

Nota: conectar el cable primero antes de dar alimentación a la tarjeta.

Luego solo queda conectar el cable Ethernet al conector RJ-45, y el teclado y el ratón a los puertos USB, si dejamos conectado el cable serie podremos monitorizar el arranque desde otro ordenador con el hyperterminal u otro programa similar.

Un pequeño vídeo de Angstrom corriendo sobre la BeagleBoard-XM:

  • Ubuntu: El siguiente operativo que vamos a instalar es Ubuntu 10.10 Maverick en su versión para ARM. Su instalación es muy sencilla ya que viene pre instalado en una imagen a la que podemos acceder para su descarga desde la wiki de Ubuntu: https://wiki.ubuntu.com/ARM/OMAPMaverickInstall


Nos descargamos la versión Maverick -> release-> Texas Instruments OMAP3 preinstalled netbook image

Para restaurar la imagen sobre la tarjeta micro-SD simplemente seguimos los siguientes pasos:

1. Conectamos la tarjeta al PC


2. Comprobamos que la tarjeta de memoria no se monte (utilizar el comando umount para desmontarla si es necesario).


3. Identificar correctamente el dispositivo antes de seguir adelante (en mi caso /dev/sdb).Ejecutamos el siguiente comando en la terminal:


sudo sh -c 'zcat ./ubuntu-netbook-10.10-preinstalled-netbook-armel+<omap image>.img.gz >/dev/<device name>'

Y listo!!. Ya podemos conectar la tarjeta a la BeagleBoard-XM y probarlo.

  • Windows Embedded Compact 7:
    Para poder desarrollar y crear tus propias aplicaciones sobre esta plataforma se necesitan las siguientes herramientas de Microsoft:

  • Visual Studio 2008 Professional, no vale la versión express aunque la versión trial dura 90 días.

  • Microsoft Expression Blend 3 + SketchFlow, para poder crear componentes gráficos para nuestras aplicaciones como botones.

  • Windows Embedded


Los enlaces y los pasos para instalar los diferentes componentes están aquí:

http://www.microsoft.com/windowsembedded/en-us/downloads/download-windows-embedded-compact-ce.aspx

Varias
empresas facilitan imágenes demo para probar gratuitamente, yo he utilizado la que nos facilita la empresa Adeneo

Te tienes que registrar y te envían por e-mail la dirección de un servidor FTP desde donde se puede descargar la imagen así como la documentación necesaria para restaurar la imagen sobre la tarjeta micro-SD.

  • Android: Un Sistema Operativo que se utiliza mucho en dispositivos móviles es sin duda Android basado en Linux y que también hay varios proyectos que lo han portado a dispositivos embebidos basados en ARM como rowbot


La instalación también es sencilla:

1) Nos bajamos la imagen del sistema operativo desde la página de Texas Instruments. Concretamente la imagen precompilada para la BeagleBoard-XM

2) Como en los casos anteriores conectamos la micro-SD al PC y averiguamos el nombre que el sistema operativo le ha dado al dispositivo utilizando el comando

sudo fdisk -l

3) Descomprimimos el archivo con la imagen descargada que incluye un script que al ejecutarse crea tres particiones en la tarjeta llamadas: boot, rootfs y data. El script también se encarga de copiar los archivos necesarios en cada una de las particiones creadas.

4) Ejecutamos el script para ello tenemos tres formas de hacerlo (mirar el archivo Readme.txt que se incluye en la documentación), una de ellas es ejecutar en la terminal el siguiente comando:

sudo ./mkmmc-android.sh <device>

Ejemplo:

sudo ./mkmmc-android.sh /dev/sdb

5) Nos aseguramos que las particiones creadas están desmontadas.
6) Insertamos la tarjeta en la BeagleBoard y probamos..

Las posibilidades de desarrollo que nos ofrece la BeagleBoard-XM son muy amplias y limitada en la mayoría de los casos solo por la imaginación del que la usa. Mi idea principal era utilizarla junto a los microcontroladores como herramienta de desarrollo. De los diferentes sistemas operativos probados me he decidido por Ubuntu (cuestión de gustos, los demás son igualmente válidos).

La siguiente cuestión a determinar es elegir el lenguaje y entorno de programación en el que desarrollaremos la aplicación que una vez cargada en la BeagleBoard se pueda comunicar con el microcontrolador a través de alguna interfaz como por ejemplo el puerto serie RS-232. El ejecutable creado desde un PC con arquitectura x86 no funciona en la BeagleBoard con arquitectura ARM, para solucionar este problema tenemos dos opciones la primera es utilizar un compilador cruzado.

Esta opción es perfectamente válida, pero se requiere un PC para crear y compilar el código, mi idea era prescindir por completo del PC y hacerlo todo desde la BeagleBoard, por tanto no queda otra que compilar el código desde la propia placa, entre los compiladores disponibles para esta plataforma he decidido utilizar C++ bajo el IDE QtCreator

La ventaja que le veo es que ya lo he utilizado anteriormente en un PC y al ser multiplataforma puedo reutilizar el código, además está incluido en los repositorios de Ubuntu para Netbook por lo que su instalación es sencilla:

sudo apt-get install qtcreator

Nota:
En Linux cada aplicación que se instala se integra y utiliza librerías y componentes ya instalados y que utilizan otras aplicaciones (el equivalente a las dll en Windows) la ventaja que tiene esto es que los programas no tienen un tamaño excesivamente grande ya que muchas de las librería que necesita el programa ya están instaladas y por tanto no se vuelven a instalar, como desventaja tenemos los problemas de dependencias, es decir, puede que instalemos qtcreator y alguna librería necesaria para su funcionamiento no esté instalada esto se agrava más en los sistemas operativos embebidos donde todo se intenta reducir a la mínima expresión para que el total ocupe poco espacio. Si tenéis problemas al compilar comprobar la ventana de mensajes de salida del compilador, si hay algún error de dependencias nos aparecerá allí, en ese caso deberemos buscar la librería que falta e instalarla. Hace tiempo el problema de las dependencias era una autentica pesadilla pero hoy en día los gestores de paquetes suelen resolver bastante bien este problema, por lo que cualquier instalación que esté incluida en los repositorios oficiales se instala completamente y de forma transparente para el usuario.

Como ejemplo de aplicación utilizaremos un programa que se comunique con el PIC (16F628) a través del puerto serie.

Un par de fotos del circuito montado:

Consideraciones:

  • El puerto serie en la BeagleBoard utiliza la USART Nº3 por tanto en la aplicación de escritorio habrá que conectarse al puero ttyS2.

  • Para adaptar los niveles de tensión a TTL requeridos por el PIC se utiliza el clásico MAX232

  • Importante: anteriormente se ha comentado que para conectar la BeagleBoard al PC a través del puerto serie hay que utilizar un cable directo ya que la BeagleBoard hacía de equipo de comunicación de datos (DCE) y el PC de equipo terminal de datos (DTE). En este caso estamos conectando la BeagleBoard al convertidor de niveles que hace de equipo de comunicación de datos (DCE) también por lo que el cable tiene que ser un cable cruzado (Null módem)


¡Ojo! Si nos equivocamos y ponemos un cable directo nos podemos «freír» el convertidor de niveles.

Un vídeo del ejemplo funcionando:

Este es un primer ejemplo de comunicación entre la BeagleBoard-XM y un Microcontrolador PIC a través del puerto serie, mi intención es crear otras aplicaciones que se comuniquen con el PIC a través de las otras interfaces de las que dispone la placa, como USB, I2C, SPI, etc.


Fuentes de Información

https://www.beagleboard.org/boards/beagleboard-xm
http://groups.google.com/group/beagleboard
http://processors.wiki.ti.com/index.php/MMC_Boot_Format
http://www.angstrom-distribution.org/node?page=1
https://wiki.ubuntu.com/ARM/OMAPMaverickInstall
http://www.adeneo-embedded.com/en/Products/Board-Support-Packages/BeagleBoard
+ Los enlaces a los que se hace referencia a lo largo del artículo.

Marcas registradas

Las marcas citadas en este artículo así como las imágenes procedentes de capturas de pantallas pertenecen a sus respectivos propietarios su utilización en este artículo es con fines divulgativos y sin ánimo de lucro.

Puedes descargarte este artículo en formato .pdf desde aquí

Con un poco de retraso debido al trabajo, he terminado este artículo con las primeras experiencias que he tenido con la BeagleBoard-XM. Espero que el artículo sea de interés y como siempre podéis dejar vuestros comentarios en el foro.

Un saludo