Arduino 1.6.3 y Teensyduino 1.22 en Raspberry PI

En este post anterior Raspberry Pi y arduino UNO instalaba el entorno arduino 1.0.3 en una Raspberry Pi con Raspbian (2013-02-09).
Actualmente el entorno de programación arduino va por la versión 1.6.3, que soporta muchas mas placas y tiene solucionados muchos errores de las versiones anteriores. Además yo suelo usar las placas Teensy 3.1 que llevan un procesador ARM cortex M4.

Teensy 3.1

En principio existe un paquete arduino para raspberry en el repositorio oficial, pero es la versión 1.0.1, demasiado antigua. Por suerte existe en hithub una distribución de arduino adaptada a la raspberry y no es muy dificil de instalar. Siguiendo las instrucciones de NicoHood Arduino IDE for Raspberry PI:

Yo parto de la distribución raspbian Wheezy 2015-02-16 Raspberry PI downloads en una SDHC de 32Gb y alta velocidad.

Instalar el raspbian y configurarlo según nuestras necesidades, se necesitará una conexión de internet para descargar los paquetes y actualizaciones. Yo trabajo desde el entorno X (startx) y en él un LXTerminal, asi se pueden cortar y pegar las instrucciones de esta página en el terminal.
Todo el proceso lo haremos como root, tenemos que modificar ficheros de sistema, instalar paquetes etc y asi evitamos tener que hacer su en cada comando:
sudo su

Primero actualizar el sistema usando una conexión de internet, tardará bastante:
apt-get update
apt-get upgrade
apt-get dist-upgrade

Con el editor nano abrir el fichero /etc/apt/sources.list
nano /etc/apt/sources.list

Y añadir estas dos líneas al final, para que el instalador apt-get encuentre las releases alternativas (jessie) que se van a usar:
deb http://mirrordirector.raspbian.org/raspbian/ jessie main contrib non-free rpi
deb http://archive.raspbian.org/raspbian jessie main contrib non-free rpi

De la misma forma, en el fichero /etc/apt/preferences:
nano /etc/apt/preferences

Añadir estas líneas al final para indicarle al instalador la prioridad de las distintas releases. Es posible que el fichero no exista, no importa, crearlo nuevo con este contenido:
Package: *
Pin: release n=wheezy
Pin-Priority: 900

Package: *
Pin: release n=jessie
Pin-Priority: 300

Package: *
Pin: release o=Raspbian
Pin-Priority: -10

Instalar el compilador avr-gcc:
apt-get update
apt-get -t jessie install gcc-avr

Instalar los paquetes necesarios para el funcionamiento del IDE (java y librerías). Es una sola línea, por su longitud el navegador puede mostrarla partida:
apt-get -t jessie install avrdude avr-libc libjssc-java libastylej-jni libcommons-exec-java libcommons-httpclient-java libcommons-logging-java libjmdns-java libjna-java libjsch-java

Descargar la release 1.6.3 desde github, tardará bastante:
git clone https://github.com/NicoHood/Arduino-IDE-for-Raspberry.git
cd Arduino-IDE-for-Raspberry

Desisnstalar la distrbución antigua, si estaba instalada:
apt-get remove -y arduino arduino-core

Instalar la nueva:
dpkg -i arduino-core_1.6.3_all.deb arduino_1.6.3_all.deb
cd ..

Esto habrá instalado el entorno Arduino IDE 1.6.3 bajo el directorio /usr/share/arduino y los sketches de ejemplo bajo /usr/share/doc/arduino-core/examples También habrá creado un icono en el menú de inicio menu->probramacion->arduino.

Para probarlo lo arrancamos el arduino IDE desde el menú. Conectamos el arduino, en mi caso un Arduino UNO, a un USB de la raspberry y seleccionamos el puerto nuevo que aparecerá en herramientas->puertos
Seleccionamos la placa en placa->arduino UNO. Cargamos un sketch, por ejemplo ejemplos->Blink y pulsamos la flecha del IDE «subir» que lo compilará y lo enviará a la placa. Si todo es correcto podremos ver parpadear el led de la pata 13 del arduino UNO!!!

Raspberry y Arduino UNO

Peeeeero, parece ser que existe un BUG conocido en esta versión (1.6.3) del IDE para linux. Lo comentan aqui: Arduino IDE Isssue #2892. Esto hace que no se detecten los puertos serie correctamente y que, de forma aleatoria, aparezca sombreado en gris la opción «puerto». Sin embargo el IDE funciona correctamente y es posible cargar los sketches en la placa arduino. Para cambiar el puerto, si que no se puede hacer por el IDE, basta con editar /home/pi/.arduino15/preferences.txt y editar la línea «serial.port=» para que apunte al puerto adecuado, por ejemplo: serial.port=/dev/ttyACM0 que es el puerto que crea un arduino UNO al conectarse.

La segunda parte consiste en instalar el addon «tensyduino 1.22» el entorno arduino. Desgraciadamente tampoco hay paquete oficial para esto y el código fuente es propietario. Por suerte el autor del programa (Paul Stoffregen) ha ido liberando compilaciones para raspberry pi de algunas de las herramientas necesarias para ponerlo en funcionamiento:

La primera herramienta es el cargador de sketches para teensy: Teensy loader Raspberry Pi
Primero se descarga el .tar.gz con wget y luego se descomprime en el directorio /usr/share/arduino/hardware/tools de la raspberry:
wget http://www.pjrc.com/teensy/teensy_raspberrypi.tar.gz
tar -C /usr/share/arduino/hardware/tools -xzvf teensy_raspberrypi.tar.gz

La segunda es la toolchain ncesaria para compilar los sketches para ARM: Raspberry PI Gcc Arm Toolchain
De forma parecida se descarga el .tar.bz2 con wget y luego se descomprime en el directorio /usr/share/arduino/hardware/tools de la raspberry:
wget http://www.pjrc.com/teensy/beta/arm_toolchain_raspberrypi.tar.bz2
tar -C /usr/share/arduino/hardware/tools -xjvf arm_toolchain_raspberrypi.tar.bz2

Para que el sistema operativo reconozca correctamente la placa Teensy hay que añadir a /etc/udev/rules.d el fichero con los descriptores del USB: Teensy.Rules
wget http://www.pjrc.com/teensy/49-teensy.rules
cp 49-teensy.rules /etc/udev/rules.d

Por último son necesarios las librerías y los ejemplos específicos para teensy, pero las distribuciones de estos ficheros solo estan disponibles en forma de ejecutable autoinstalable para sistemas operativos basados en Intel. Como la Raspberry PI usa un procesador ARM no podemos ejecutar ninguno de esos ficheros, aunque esten compilados para Linux. Una solución es instalarlo en una plataforma intel con linux y luego copiar los archivos que ha añadido el instalador a nuestra Raspberry. Al tratarse de ficheros .c, -h, .ino etc no importa que se hayan obtenido de otra plataforma porque ninguno es ejecutable.
He preparado tres tar.gz conteniendo los ficheros que instala teensyduino 1.22 obtenidos de una isntalación bajo Suse Linux.
Primero instalaremos los ejemplos adicionales que incorpora Teensyduino 1.22: examples.tar.gz. Los archivos se colocarán en /usr/share/doc/arduino-core/examples y existe un enlace simbólico a este directorio desde /usr/share/arduino/examples
Los comandos son:
wget https://heli.xbot.es/wp-content/uploads/2015/04/examples.tar.gz
tar -C /usr/share/doc/arduino-core/ -xzvf examples.tar.gz

A continuación las librerías adicionales para las placas teensy, muy interesantes. Aqui incluyo también dos librerías «libarm_cortexM4l_math.a» y «libarm_cortexM0l_math.a» que faltan en la compilación arm_toolchain_raspberrypi.tar.bz2. Aunque estan sacadas de la instalación de linux pueden usarse en la raspberry pi ya que son librerías del tarjet (teensy) no del host (raspberry): hardware.tar.gz
wget https://heli.xbot.es/wp-content/uploads/2015/04/hardware.tar.gz
tar -C /usr/share/arduino/ -xzvf hardware.tar.gz

Por último las modificacines en el core del IDE arduino para incluir las nuevas placas: lib.tar.gz
wget https://heli.xbot.es/wp-content/uploads/2015/04/lib.tar.gz
tar -C /usr/share/arduino/ -xzvf lib.tar.gz

Puede ser necesario borrar el fichero de preferencias en ~/.arduino15/preferences.txt si el IDE arduino comienza a cargar y se cierra de forma inesperada:
rm .arduino15/preferences.txt

Todo listo, si conectamos la placa teensy 3.1 al USB de la raspberry aparecerá el correspondiente puerto serie en herramientas->puertos. Si no es asi podría ser algún problema con /etc/udev/rules.d
Seleccionamos la placa en placa->teensy 3.1, cargamos el sketch de prueba desde Archivo->ejemplos->Blink y lo compilamos de la misma forma que antes. Ahora deberá abrirse el downloader «teensy». En la ventana de estado se mostrarán algunos errores de compilación pero no hay que preocuparse: posiblemente no sean errores de compilación sino errores que genera el downloader «teensy» al abrirse. Despues de revisarlos y asegurarse de que no hay problemas en la compilación el programa se cargará en la placa teensy 3.1 pulsando el botón download y luego reset.

Raspberry y Teensy 3.1

También pueden usarse las dos placas a la vez….

Raspberry PI, Arduino UNO y Teensy 3.1