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.
Tabla de contenidos
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:
- gcc-avr: Es el compilador
- avr-libc: Son las librerías para la plataforma
- scons: La herramienta de construcción
- avrdude: Utilidad para programar chips avr
- 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í:
- Sitio oficial
- SConstruct (8Kb)
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).
Pingback: Bitacoras.com /
Pingback: Poesía binaria » Creando bibliotecas o librerías para Arduino /
Pingback: Poesía binaria » Utilizar float con sprintf() y derivados en Arduino /
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!
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
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?
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á.
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.
@Jonathan Lopez
Gracias, podrías poner el archivo en pastebin o algún sitio para echarle un ojo ¿?
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.
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.