Publi

Preparando nuestro entorno para Arduino sin Java

Arduino Emacs

Como comenté en el post anterior, la plataforma Arduino viene con un IDE hecho en Java, no es muy completo, pero nos hace el apaño, aunque, como es mi caso, estoy acostumbrado a Emacs. Aunque esta guía no estará limitada a este editor, ni a Ubuntu (o basados en él).

El objetivo, es usar nuestro IDE o editor preferido para trabajar con estos pequeños bichos programables.

En principio tenemos que instalar las herramientas para compilar los programas para la plataforma (esto es común con todas las instalaciones). Los Arduino utilizan chips Atmel AVR, por lo que usaremos el compilador AVR-GCC para esta plataforma. Como construir el ejecutable es un proceso más o menos costoso (de hacer a mano) utilizaremos la herramienta de construcción scons con la que podremos generar el ejecutable gracias a un script en python.

Ubuntu y derivados (en mi caso Linux Mint)

Lo primero es instalar los programas necesarios:

$ sudo apt-get install gcc-avr avr-libc scons avrdude python-serial

En este caso:

  1. gcc-avr: Es el compilador
  2. avr-libc: Son las librerías para la plataforma
  3. scons: La herramienta de construcción
  4. avrdude: Utilidad para programar chips avr
  5. python-serial: Es un módulo de python para trabajar con el puerto serie (nos servirá para subir los programas al Arduino).

Sabayon Linux / Gentoo también

Ya que recientemente he instalado Sabayon en mi ordenador, quisiera extender esto un poco más:
En este caso, tendremos que instalar, ya sea vía Entropy (forma gráfica) o equo (en consola) los paquetes crossdev, scons y pyserial:

$ equo install crossdev scons avrdude pyserial
$emerge crossdev scons avrdude pyserial # Sólo para Gentoo

Tras ello tenemos que descargar y construir las bibliotecas y el entorno para compilar para AVR:

$ USE=”-openmp” crossdev -t avr -s4 -S –without-headers

(y esto tardará un rato)

Parte común y manual

Tras ello, descargamos la plataforma de aquí [ 64bit , 32bit versión 0022, última a 31 de Julio de 2011 (web de descarga con más opciones) ], por ahora bien podíamos estar instalando la plataforma completa, ya que el archivo que hemos descargado contiene el IDE Arduino. Ahora introduciremos una variación.

Debemos descomprimir el archivo que hemos descargado, yo he creado un directorio en mi home: /home/gaspy/proyectos/Arduino:

$ mkdir -p ~/proyectos/Arduino
$ cd ~/proyectos/Arduino
$ tar xvzf arduino-0022.tgz

Luego, debemos descargar el arma secreta, es un script de construcción para scons y Arduino. Podemos encontrarlo en la página oficial del proyecto arscons. Lo podéis descargar de aquí:

Este archivo tiene que estar en el directorio de cada proyecto. Nuestro primer proyecto será ej1

$ mkdir ej1
$ wget http://arscons.googlecode.com/svn/trunk/SConstruct

Antes de continuar debemos hacer alguna modificación de rutas en el archivo SConstruct, por lo que es una buena idea dejar un archivo SConstruct operativo y copiarlo dentro de nuestros proyectos. Las modificaciones serían para las variables:

  • ARDUINO_HOME_DEFAULT, que debe contener el directorio donde estan instaladas las herramientas de Arduino, lo que acabamos de descomprimir. En mi caso /home/gaspy/proyectos/Arduino/arduino-0022/
  • ARDUINO_BOARD, debe ser el modelo de nuestra placa.
  • ARDUINO_CONF, nos dice dónde está la configuración de las placas Arduino, donde buscará las especificaciones de la nuestra.

Vemos aquí la modificación de las variables en su contexto:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
if platform == 'darwin':
# For MacOS X, pick up the AVR tools from within Arduino.app
ARDUINO_HOME_DEFAULT = '/home/gaspy/proyectos/Arduino/arduino-0022/'
ARDUINO_PORT_DEFAULT = getUsbTty('/dev/tty.usbserial*')
elif platform == 'winnt':
# TODO: add Windows port.
assert(False) # not supported.. yet.
ARDUINO_HOME_DEFAULT = None
ARDUINO_PORT_DEFAULT = None
else:
# For Ubuntu Linux (9.10 or higher)
####################### ESTA ES LA LÍNEA IMPORTANTE
ARDUINO_HOME_DEFAULT = '/home/gaspy/proyectos/Arduino/arduino-0022/'
####################### FIN DE LA LÍNEA IMPORTANTE
ARDUINO_PORT_DEFAULT = getUsbTty('/dev/ttyUSB*')
AVR_BIN_PREFIX = 'avr-'

ARDUINO_HOME    = ARGUMENTS.get('ARDUINO_HOME', ARDUINO_HOME_DEFAULT)
ARDUINO_PORT    = ARGUMENTS.get('ARDUINO_PORT', ARDUINO_PORT_DEFAULT)
####################### OTRA LÍNEA IMPORTANTE
ARDUINO_BOARD   = ARGUMENTS.get('ARDUINO_BOARD', 'diecimila')
####################### FIN DE OTRA LÍNEA IMPORTANTE
ARDUINO_VER     = ARGUMENTS.get('ARDUINO_VER', 20) # Arduino 0020
RST_TRIGGER     = ARGUMENTS.get('RST_TRIGGER', None) # use built-in pulseDTR() by default
EXTRA_LIB       = ARGUMENTS.get('EXTRA_LIB', None) # handy for adding another arduino-lib dir

ARDUINO_CORE    = pathJoin(ARDUINO_HOME, 'hardware/arduino/cores/arduino')
ARDUINO_SKEL    = pathJoin(ARDUINO_CORE, 'main.cpp')
####################### OTRA LÍNEA IMPORTANTE
ARDUINO_CONF    = pathJoin(ARDUINO_HOME, '/home/gaspy/proyectos/Arduino/arduino-0022/hardware/arduino/boards.txt')
####################### FIN DE OTRA LÍNEA IMPORTANTE

Dentro del directorio ej1 (de nuestro primer proyecto con Arduino) tiene que haber un archivo llamado ej1.pde que contendrá el código fuente del programa que queremos compilar y subir a nuestro Arduino. ¡ A trabajar ! Podemos coger este código de ejemplo para hacer que un led parpadee. Sólo copiar y pegar.

NOTA para Gentoo/Sabayon: Hay algún pequeño bug en esta distribución y al compilar no funcionará porque no existen los ficheros de biblioteca, el caso es que sí existen, pero no los encuentra. Para eso, modificaremos algunas líneas más de SConstruct:

1
2
3
4
5
6
7
8
9
10
11
envArduino.Append(BUILDERS = {'Processing':Builder(action = fnProcessing,
        suffix = '.cpp', src_suffix = '.pde')})
######## IMPORTANTE, LE PONEMOS LA RUTA DONDE TIENE QUE BUSCAR avr5.x
envArduino.Append(BUILDERS={'Elf':Builder(action=AVR_BIN_PREFIX+'gcc '+
        '-Wl,-dT /usr/lib/binutils/avr/2.20.1/ldscripts/avr5.x -mmcu=%s -Os -Wl,--gc-sections -o $TARGET $SOURCES -lm'%MCU)})
######## IMPORTANTE, LE PONEMOS LA RUTA DONDE TIENE QUE BUSCAR avr5.x
envArduino.Append(BUILDERS={'Hex':Builder(action=AVR_BIN_PREFIX+'objcopy '+
        '-O ihex -R .eeprom $SOURCES $TARGET')})

# add arduino core sources
VariantDir('build/core', ARDUINO_CORE)

También falla otra cosa, no se encuentra el archivo crtm168.o (mi placa Diecimila, este es el chip que usa), el archivo está en /usr/avr/lib/avr5/crtm168.o , pero lo busca en /usr/avr/lib/ podemos copiarlo como root, hacer un enlace,

root$ ln -s /usr/avr/lib/avr5/crtm168.o /usr/avr/lib/

o copiarlo como usuario en el directorio del proyecto, total, son 2Kb.

Para compilar el proyecto debemos, en el mismo directorio actual, ejecutar:

$ scons

y él se encarga de todo. Cuando estemos listos para subir al Arduino, lo conectamos y ejecutamos:

$ scons upload

Lo realmente bueno de esto es que podemos utilizar el editor o IDE que queramos, incluso podemos asignar una tecla rápida para compilar+subir

Mejoras para Emacs

Si utilizas Emacs, te interesará introducir lo siguiente en tu ~/.emacs :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
(defun run-scons ()
  "run scons"
  (interactive)
  (shell-command "scons"))

(defun run-scons-upload ()
  "run scons upload"
  (interactive)
  (shell-command "scons upload"))

; Ejecuta scons y scons upload con C-x SPC y C-x C-SPC
(global-set-key (kbd "C-x SPC") 'run-scons)
(global-set-key (kbd "C-x C-SPC") 'run-scons-upload)

; Asigna la extensión .pde al modo c++-mode
(setq auto-mode-alist (cons '("\\.pde$" . c++-mode) auto-mode-alist))

Aunque hay formas más elegantes de hacerlo, esta es la forma más rápida de asignar una tecla a scons; puede que utilicemos make para otras y no queramos modificar nuestro constructor. Otra cosa, las teclas elegidas no son las mejores, tengo que perfeccionar esto.

Por otra parte, es importante que los archivos .pde se abran directamente con el modo c++ y así podemos aprovechar sus ventajas.

Otros editores

Si usáis kate, podéis mirar este artículo para coger inspiración.
Si usáis gedit, podéis leer esto. (fuera de Poesía Binaria).

También podría interesarte...

There are 11 comments left Ir a comentario

  1. Pingback: Bitacoras.com /

  2. Pingback: Poesía binaria » Creando bibliotecas o librerías para Arduino /

  3. Pingback: Poesía binaria » Utilizar float con sprintf() y derivados en Arduino /

  4. Suizo /
    Usando Mozilla Firefox Mozilla Firefox 11.0 en Ubuntu Linux Ubuntu Linux

    Hola, he intentado utilizar scons con emacs y al subir un programa sencillo como el “blink” todo bien.
    Pero el problema viene cuando tengo funciones. Me da error en ellas(estan bien escritas ya que con el IDE arduino compila).

    Estoy utilizando arduino UNO y Ubuntu 10.04, el scons lo instale de los repositorios. Es posible que la version de scons este desactualizada o no admita funciones?

    Saludos!

    1. Gaspar Fernández / Post Author
      Usando Mozilla Firefox Mozilla Firefox 11.0 en Ubuntu Linux Ubuntu Linux

      La verdad es que es bastante raro, ya que el compilador que utiliza la IDE de Arduino y el script de scons es el mismo (gcc-avr), puedes poner los errores por aquí y les echo un ojo ¿?

      Gracias

  5. Jonathan Lopez /
    Usando Mozilla Firefox Mozilla Firefox 17.0 en Ubuntu Linux Ubuntu Linux

    Hola, estoy intentando implementar el entorno de desarrollo con Emacs en Ubuntu 12. Tengo todo instalado y parece que todo funciona bien. El IDE de Arduino 1.0.2 está instalado desde los repositorios, al igual que “scons” y el script Sconstruct está descargado de los los enlaces que pones en este mismo artículo.
    He configurado SConstruct adaptando las rutas a las que tengo en mi ordenador. He probado la compilación con el scons de un código de ejemplo que compila perfectamente en el IDE de Arduino y da el siguiente error:

    scons: Reading SConscript files …
    maximum size for hex file: 258048 bytes
    scons: done reading SConscript files.
    scons: Building targets …
    scons: building associated VariantDir targets: build
    avr-g++ -o build/core/CDC.o -c -ffunction-sections -fdata-sections -fno-exceptions -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Os -mmcu=atmega2560 -DARDUINO=1.0 -DF_CPU=16000000L -Ibuild/core build/core/CDC.cpp
    In file included from build/core/Platform.h:15:0,
    from build/core/CDC.cpp:19:
    build/core/Arduino.h:212:26: fatal error: pins_arduino.h: No such file or directory
    compilation terminated.
    scons: *** [build/core/CDC.o] Error 1
    scons: building terminated because of errors.

    ¿Me puedes echar una mano?

    1. admin / Post Author
      Usando Mozilla Firefox Mozilla Firefox 17.0 en Ubuntu Linux Ubuntu Linux

      Yo creo que tiene que ser cosa de las rutas. El IDE de Arduino las pone de una forma y el script de scons las busca en otro sitio. Mira el archivo pins_arduino.h a ver dónde está.

  6. Jonathan Lopez /
    Usando Mozilla Firefox Mozilla Firefox 17.0 en Ubuntu Linux Ubuntu Linux

    Estar está el archivo pins_arduino.h y las rutas están bien. Lo que he echo para solucionarlo es actualizar el archivo SConstruct de un conocido que lo tenia funcionando (pura casualidad que me haya encontrado con él y hayamos hablado de esto). Es muy parecido pero cambian algunas cosas.

    Muchas gracias por tu artículo. Ha resultado muy útil.

  7. admin / Post Author
    Usando Mozilla Firefox Mozilla Firefox 17.0 en Ubuntu Linux Ubuntu Linux

    @Jonathan Lopez
    Gracias, podrías poner el archivo en pastebin o algún sitio para echarle un ojo ¿?

  8. Jonathan Lopez /
    Usando Mozilla Firefox Mozilla Firefox 17.0 en Ubuntu Linux Ubuntu Linux

    Perdona el retraso. El archivo que me ha funcionado es este: https://dl.dropbox.com/u/73042682/SConstruct Cambia muy poco respecto al antiguo pero funciona con el IDE de Arduino 1.0, el anterior no.

    Espero que te resulte útil.

  9. Meta /
    Usando Mozilla Firefox Mozilla Firefox 43.0 en Windows Windows 7

    Interfaz Java y Arduino.

    Tutorial diseño de interfaz con Java bajo NetBeans para controlar Arduino desde el puerto serie / USB, odrás encender y apagar un Led, recibir mensajes de textos o comandos desde Arduino.

    Ver tutorial.
    http://www.slideshare.net/Metaconta2/interfaz-java-y-arduino

    Saludos.

Leave a Reply