jueves, 18 de junio de 2015

Programando un Maple Mini clónico (2)

Siguiendo la serie de artículos sobre la programación de un microcontrolador Maple Mini clónico, en esta entrada vamos a describir como programar estos microcontroladores utilizando el IDE de Arduino y las librerías desarrolladas por la comunidad de software libre.

Como en la entrada anterior, el punto de partida será un ordenador con Linux Debian 8 64bits recién instalado. Además, deberá estar instalado el programa sudo tal y como se describió en la entrada anterior. Los pasos a seguir son los siguientes:

1. Descargamos el IDE de Arduino de su página web http://www.arduino.cc/en/Main/Software. El fichero descargado llamado arduino-1.6.4-linux64.tar.xz, lo descomprimimos en la carpeta donde queramos instalar este software (en este caso, por ejemplo, nuestro home).
cd
tar xvJf arduino-1.6.4-linux64.tar.xz
2. En la siguiente dirección:
Se encuentra la página principal de la biblioteca STM32 que permite desarrollar programas para tarjetas basadas en microcontroladores STM32F103. La mayor parte de este artículo se basa en el proceso de instalación descrito en esta página. Desde ella descargamos la librería STM32. El fichero descargado Arduino_STM32-master.zip se decomprime y obtenemos la carpeta Arduino_STM32-master que debemos copiar dentro de la carpeta Harware que se encuentra dentro de la carpeta con el IDE de Arduino.

3. Ahora es necesario instalar los compiladores cruzados para STM32. Para ello tenemos dos opciones: la primera es instalarlos desde los repositorios de Debian y adaptar la configuración del IDE de Arduino para que utilice estos compiladores; la segunda, y más sencilla, es instalar el soporte para ARM en el IDE y que descargue automáticamente el software necesario. Para ello ejecutamos el IDE de Arduino que acabamos de instalar y buscamos en los menús Herramienta -> Placa -> Boards Manager.


Elegimos Arduino SAM Boards (32-bits ARM Cortes-M3) y pulsamos la opción de instalar. Ahora podemos ver como han aparecido las nuevas placas STM32 en el menú del IDE:

4. Al igual que el IDE de Maple, las aplicaciones que trae son para una arquitectura de 32 bits. Así que hay que habilitar la ejecución de aplicaciones de 32 bits en nuestro Linux. Para ello, ejecutamos los siguientes comandos:
sudo dpkg --add-architecture i386
sudo apt-get update
sudo apt-get install libc6:i386 libstdc++6:i386
5. Vamos a utilizar una interfaz USB a Serie TTY para programar esta placa, por lo que es necesario dar permiso a nuestro usuario para acceder a los puertos serie. Esto se consigue añadiendo nuestro usuario al grupo dialout:
sudo addgroup usuario dialout
Donde usuario es el nombre de nuestro usuario.

6. Para descargar el programa al microcontrolador en este caso utilizaremos un adaptador USB a Serie TTY.

Las conexiones que hay que hacer son:
FTDI   <---->   Maple
GND    <---->     GND
3.3V   <---->     Vcc
RXC    <---->     RX1
TXC    <---->     TX1

Dependiendo del modelo de adaptador es posible que sea necesario cruzar las línea RXC y TXC de la siguiente forma:
RXC    <---->     TX1
TXC    <---->     RX1

Pero tranquilos, que no se va a quemar nada si se conectan al revés. Simplemente no cargará el programa y bastará con cambiar la conexión para que funcione. 
Otra opción es utilizar la salida de 5V del adaptador en lugar de la de 3.3V. En ese caso, en lugar de conectar la salida de 3.3V a Vcc hay que conectar la salida de 5V a VIn. Por alguna razón, algunas veces el microcontrolador se resiste a cargar el programa cuando se utiliza la alimentación a 3.3V y funciona cuando se utiliza la de 5V.

7. Una vez conectado el adaptador, configuramos el IDE de Arduino para la placa y puerto serie. Para ello elegimos la placa Generic STM32F103C en Herramientas -> Placa; Upload method = Serial; Variant = STM32F103CB y el puerto serie /dev/ttyUSB0 (o el que corresponda a nuestro adaptador) como podemos ver en la siguiente imagen:


8. Una vez escrito el programa, para subirlo hay que poner el microcontrolador en modo programación. Esto se realiza dejando pulsado el botón But32 mientras pulsamos y soltamos el botón de Reset. La placa quedará en modo programación y no se encenderá ni parpadeará ningún led. A continuación, solo hay que pulsar el botón de carga del programa del IDE de Arduino y el programa se enviará al microcontrolador.

Este proceso cargará el programa en nuestro microcontrolador, pero eliminará el Bootloader. Si solo vamos a utilizar este método para cargar el programa no es un problema y el bootloader realmente no es necesario. Pero si, por alguna razón, queremos volver a tener instalado el bootloader en nuestro microcontrolador, podemos instalarlo siguiendo un proceso muy sencillo. Para ello se utiliza el adaptador USB a Serie TTY. En la siguiente página hay instrucciones sobre como cargar el bootloader en un Maple Mini http://leaflabs.com/docs/bootloader.html

También es posible utilizar este IDE para programar el microcontrolador utilizando el puerto USB. Para ello es necesario que el microcontrolador tenga cargado el Bootloader que viene con el IDE. Podemos encontrar este bootloader en la carpeta 

arduino-1.6.4/hardware/Arduino_STM32-master/usb_bootloader/STM32F1/binaries

El fichero se llama maple_mini_boot20.bin. Y para cargarlo podemos seguir el proceso descrito en la web http://leaflabs.com/docs/bootloader.html

No es posible cargar los programas utilizando este método si el microcontrolador tiene instalado alguno de los bootloaders originales de Maple.

Los pasos para configurar el sistema para poder conectar el Maple clónico a nuestro sistema Linus son:

1. Configuramos el dispositivos USB.
cd $HOME/arduino-1.6.4/hardware/Arduino_STM32-master/tools/linux
./install-udev-rules.sh
Después de este paso es necesario reiniciar el equipo para que se activen las reglas.

2. Instalamos la utilidad dfu-util
sudo apt-get install dfu-util
Y ya podemos cargar programas a nuestro microcontrolador siguiendo los pasos descritos en la entrega anterior de esta serie: pulsando el botón de reset y, antes de que el led termine de parpadear rápido, pulsar y mantener el botón 1 de la placa pulsado hasta que el led comienza a parpadear lentamente. En este momento podemos pulsar el botón de carga del programa que hay en el IDE y el proceso de carga comenzará. Al finalizar el proceso de carga es necesario pulsar de nuevo el botón de reset del microcontrolador.

domingo, 31 de mayo de 2015

Programando un Maple Mini clónico (1)

Recientemente he conseguido dos módulos de desarrollo Maple Mini. Estos módulos constituyen una alternativa interesante a los clásicos Arduino. De hecho, vienen preparados para programarlos y utilizarlos de una forma muy similar a los modelos de Arduino. En mi opinión, su principal ventaja consiste en la mayor cantidad de memoria tanto flash como RAM que permite realizar aplicaciones más complejas, así como su funcionamiento a 3.3V que facilita su alimentación con baterías LiPO y la conexión directa con dispositivos como tarjetas SD que trabajan a esta misma tensión.

Por otro lado, el mayor inconveniente que veo a estos módulos es la falta de documentación. Son relativamente recientes y la compañía LeafLab que los desarrolló parece haber abandonado su mantenimiento. Sin embargo, al ser un diseño abierto, han aparecido numerosos clónicos en el mercado chino que permiten adquirir microcontroladores con una potencia superior a los Atmel de Arduino a un precio hasta cuatro veces inferior a estos.

Los módulos que he probado son, en primer lugar, un Maple Mini basado en el microcontrolador STM32F103C8T6 ARM. Podemos ver este módulo en la primera figura. Aunque la publicidad indica que funciona con un reloj a 72MHz la realidad es que viene con un cristal a 8MHz. Siendo la anterior la velocidad máxima que puede alcanzar este microcontrolador.

El otro módulo es también un Maple Mini pero esta vez basado en el hermano mayor de la familia: el  STM32F103CBT6. Con nada menos que 128Kb de memoria. Al igual que el otro con un reloj a 8MHz. 

Vamos a describir como programar estos microcontroladores utilizando Linux Debian 8 64bits. Empezando en primer lugar por la instalación y configuración del IDE y el compilador para programarlos.

Existen dos opciones para programar estos controladores. La primera es utilizar el IDE de LeafLab y la segunda una adaptación para el IDE de Arduino. La primera de ella la podemos descargar del página de LeafLab en la siguiente dirección:
Los pasos para hacerla funcionar son:
1. Descomprimir el fichero descargado maple-ide-0.0.12-linux64.tgz
tar xvzf  maple-ide-0.0.12-linux64.tgz
2. Instalamos sudo ya que será necesario para la configuración (nos pedirá la contraseña de administrador)
su
apt-get install sudo
y a continuación permitimos privilegios de superusuario a nuestro usuario siguiendo las instrucciones que encontrareis aquí http://www.esdebian.org/wiki/habilitar-sudo-debian-7. Con esto ya se tendrán los permisos necesarios para configurar el sistema e instalar el IDE.

3. Aunque se supone que el IDE es para 64 bits, los compiladores que trae instalador son para 32, por lo que tenemos que habilitar la ejecución de aplicaciones de 32 bits en nuestro linux. Para ello, ejecutamos los siguientes comandos:
sudo dpkg --add-architecture i386
sudo apt-get update
sudo apt-get install libc6:i386 libstdc++6:i386
4.  En estos momentos ya podríamos probar a compilar un programa utilizando el IDE. Sin embargo, aún no podríamos cargarlo al microcontrador. Para ello tenemos que configurar el dispostivo USB. Esto se realiza ejecutanto el siguiente script que trae el IDE de Maple

cd maple-ide-v0.0.12
sudo install-udev-rules.sh
sudo /etc/init.d/udev restart
A estas alturas ya es posible ver como se reconoce el dispositivo al enchufarlo por USB. Si ponemos el Maple en BootLoader Perpetuo deberíamos ver un dispositivo con ID 1eaf:0004 al ejecutar lsusb. Además debería aparecer el dispositivo /dev/maple.

Pero aún queda un problema por resolver para poder cargar un programa al microcontrolador. La versión de dfu-util que trae el IDE de LeafLab no es compatible con Linux Debian 8. La solución consiste en instalar este programa de los repositorios Debian y utilizar un script para ejecutarlo desde el IDE. Para ello seguimos los siguientes pasos:
1. Instalar el programa dfu-util
sudo apt-get install dfu-util
2. En la carpeta maple-ide-v0.0.12/hardware/tools/arm/bin borrar el fichero llamado dfu-util
cd maple-ide-v0.0.12/hardware/tools/arm/bin
rm dfu-util
3. Crear un fichero de texto llamado dfu-util en esta carpeta y escribir el siguiente contenido en el mismo:
#!/bin/bash
if [[ $1 == -l ]]; then
   salida=$(dfu-util -l)
   echo "${salida}" | sed -r 's/DFU: \[/DFU: \[0x/'
   #echo "Found DFU: [0x1eaf:0003"
else
        dfu-util $@
fi
4. Establecer permiso de ejecución para este script:
chmod +x dfu-util
Y con esto ya tenemos nuestro entorno configurado. Ya solo queda ejecutar el IDE:
cd maple-ide-v0.0.12
./maple-ide
Seleccionamos como Board a Leaf Lab Maple Mini Rev 2 to Flash y ya podemos escribir y subir nuestro primer programa.

Para cargar un programa hay que poner el microcontrolador en modo Bootloader Perpetuo. Esto se realiza pulsando el botón de reset y, antes de que el led termine de parpadear rápido, pulsar y mantener el botón 1 de la placa pulsado hasta que el led comienza a parpadear lentamente. En este momento podemos pulsar el botón de carga del programa que hay en el IDE y el proceso de carga comenzará. Al finalizar el proceso de carga es necesario pulsar de nuevo el botón de reset del microcontrolador. Según LeafLab esto se realiza automáticamente. Sin embargo, no he conseguido que esto ocurra y es necesario un reset manual.

Desgraciadamente este IDE parece estar abandonado por LeafLab. Siendo la última versión de marzo de 2013. Y solo parece compatible con el módulo basado en el microcontrolador STM32F103CBT6. En una próxima entrada describiré como instalar y configurar un IDE de Arduino junto con un conjunto de bibliotecas para programar módulos Maple.