Usando Arduino desde línea de comandos

 

Una de las cosas que no me acababa de convencer de Arduino es su entorno de desarrollo. Principalmente porque siempre me he sentido más cómodo en la línea de comandos que con un IDE gráfico.

Desde hace mucho tiempo quería tener la posibilidad de programar Arduino con herramientas estándar de Unix: vi, gcc, make... pero la forma de hacerlo era bastante tediosa, así que siempre acababa volviendo al famoso IDE. Afortunadamente hace unos días descubrí un proyecto que permite programar el Arduino y cargar el sketch en la placa desde la línea de comandos, sin necesidad del entorno Java.

La solución con la que he reemplazado el IDE de Arduino es básicamente vim + scons + arscons y lo que viene a continuación es la receta para instalarlo y usarlo en Debian/Ubuntu.

Primero la instalación de paquetes:

$ sudo apt-get install scons python-serial vim

Esto instalará scons, un sustituto de make, python-serial que nos permitirá mandar el reset automático del Arduino en el momento del upload del código y vim, el editor que usaremos para programar. Para permitir que el vim sea un poco más amigable para la programación y que entienda y coloree la sintaxis propia de Arduino, haremos los siguientes pasos:

$ mkdir -p ~/.vim/syntax

$ wget http://www.vim.org/scripts/download_script.php?src_id=14412 -O ~/.vim/syntax/arduino.vim

$ wget http://sindormir.net/~syvic/arduino/.vimrc -O ~/.vimrc

¡Ojo!, la tercera línea machacará tu fichero de configuración del vim, si es que tenías alguno...

Una vez que tenemos los paquetes instalados nos crearemos nuestra estructura de directorios para el proyecto de ejemplo:

$ mkdir -p ~/Arduino/projects/ejemplo1

A continuación, descargamos el fichero del proyecto arscons al directorio que acabamos de crear:

$ wget http://sindormir.net/~syvic/arduino/SConstruct -O ~/Arduino/projects/ejemplo1/SConstruct

El fichero SConstruct hay que configurarlo para que cuadre con nuestra configuración, así que lo editamos y cambiamos las siguientes variables:

  • En la línea 67 hay que modificar la variable ARDUINO_HOME_DEFAULT para que apunte al directorio en el que tengamos instalado el arduino. (Generalmente /home/usuario/arduino-00XX)
  • En la línea 73 hay que modificar la variable ARDUINO_BOARD para que corresponda con la placa arduino que usamos. Habrá que elegir entre alguna de las siguientes: pro328 mini pro5v328 mega atmega328 bt328 atmega8 atmega168 pro diecimila lilypad pro5v lilypad328 uno bt fio y mega2560

Bien, ahora estamos listos para crear nuestro primer proyecto de Arduino desde la línea de comandos:

$ wget http://sindormir.net/~syvic/arduino/ejemplo1.pde -O ~/Arduino/projects/ejemplo1/ejemplo1.pde

$ cd ~/Arduino/projects/ejemplo1/

$ vim ejemplo1.pde

Nos aparecerá una pantalla como esta:

Si ahora pulsamos la tecla F5 se lanzará el proceso de compilación. Una vez terminado, y tras pulsar Intro ya tendremos nuestro código hexadecimal listo para ser cargado en el uC. Si queremos subir el código en la placa, con pulsar la tecla F6 bastará.

Para aquellos que prefieran usar el comando en lugar de los bindings, los comandos son los siguientes:

$ scons

Esto compilará el proyecto, y

$ scons upload

lo cargará en la placa. Estos dos comandos siempre deberán ejecutarse en el mismo directorio en el que tenemos el fichero .pde. Tened en cuenta que para los siguientes proyectos, en el directorio en el que vayamos a crear el fichero .pde (que, aprovecho para recordar, se debe llamar exactamente igual que el directorio en el que se encuentra), habrá que copiar también el fichero SConstruct.

Notas adicionales:

  • El proyecto arscons está originalmente hospedado en code.google y lo lleva Homin Lee, pero la versión que ofrece en sus repositorios no tiene varias mejoras que se han hecho en los últimos días (tres parches), así que temporalmente alojo la versión corregida en mi servidor a la espera de que Mr Homin aplique los parches en su repositorio. En cuanto esto suceda cambiaré el link al sitio oficial.
  • Como dos de los parches aplicados los he hecho yo, y sinceramente, no estoy muy puesto en python, hay un pequeño detalle que hay que tener en cuenta a la hora de escribir nuestro código Edito: Al parecer no lo he roto yo: Con el fichero original del svn también pasa este problema. Es imprescindible que la función loop() esté más abajo que todas las demás. En caso contrario el proyecto no compilará, indicando que no encuentra aquellas funciones que sean llamadas antes de ser definidas. Otra solución es declarar el prototipo de cada función al comienzo del fichero, al estilo C. Actualizado 27/01/11: Tras la ayuda de Diego Kuperman con las expresiones regulares he conseguido que el script autogenere los prototipos para todas las funciones, con lo que ya no es necesario nada de lo indicado en este punto. Está mandado el parche a su desarrollador original pero la versión corregida se puede obtener de aquí hasta que esté actualizado el proyecto oficial.
  • Evidentemente nos quedaremos sin la ventanita para manejar el puerto serie, pero aprovecho para recomendar el programa cutecom. Un maravilloso software de comunicaciones serie con un montón de características muy útiles. Está disponible como paquete en Debian/Ubuntu.

 

Espero que os sea tan útil como a mí. ¡Qué felicidad volver a programar con vim!, la verdad :)

:wq

7 Enero 23, 2011
  • Anonymous on Mié, 02/02/2011 - 22:02

    Solo comentarte que puedes evitar el paso de machacar el .vimrc... puedes tener un algo como un vimrc por cada tipo de archivo (diferentes tabulaciones, o colores...) yo tengo activado el filetype plugin on filetype indent on en mi .vimrc y puse el tuyo en ~/.vim/ftplugin/arduino.vim Para aclarar tengo los archivos ~/.vim/syntax/arduino.vim (este es para syntax on...) ~/.vim/ftplugin/arduino.vim (este es tu vimrc) Saludos y gracias por el post.

  • syvic on Sáb, 02/12/2011 - 12:45

    Uhmm, qué buen consejo! Tantos años usando vim y todavía no controlo todas sus funciones. Muchas gracias!

  • Anonymous on Lun, 02/21/2011 - 13:10

    Parece que no funciona del todo asi. Pero si pones la ultima linea, la del au ....
    dentro el vimrc entonces ya va del todo.

    Saludos y gracias....

  • Anonymous on Sáb, 07/16/2011 - 21:25

    estoy intentando probar esto en Mac OsX Pero cuando ejecuto el SConstruct me da el siguiente error

    argento:pruebas darkomen$ ./SConstruct
    Traceback (most recent call last):
    File "./SConstruct", line 45, in
    env = environment()
    NameError: name 'environment' is not defined
    argento:pruebas darkomen$

    Alguien sabe por qué puede ser??

  • Anonymous on Mié, 04/04/2012 - 15:58

    Tengo problemas para usar librerias externas, como por ej. IRremote. Alguna ayuda?

  • Anonymous on Mié, 04/04/2012 - 16:05

    lo arregle agregandolo en /usr/share/arduino/libraries/
    muchas gracias

  • syvic on Mié, 04/04/2012 - 16:01

    ¿Puedes ser un poco más específico? ¿Qué error te da?