TL;DR
Para programar aplicaciones arduino utilizar Arduino-Makefile.
El archivo Makefile
, utilizando una arduino mega y las librerías que
se encuentran en el directorio libraries
, es de la forma:
# Arduino Make file. Refer to https://github.com/sudar/Arduino-Makefile
BOARD_TAG = mega
BOARD_SUB = atmega2560
MONITOR_PORT = /dev/ttyACM0
AVRDUDE_CONF = /etc/avrdude.conf
USER_LIB_PATH = libraries
ARDUINO_LIBS = <...>
include /usr/share/arduino/Arduino.mk
Opciones para creación de programas
Actualmente para crear programas con arduino se puede utilizar tres opciones:
-
arduino web editor: editor web que compila (verifica los programas) en linea.
Para hacer el upload a una placa se necesita instalar el programa arduino create agent, el cual tiene como dependencia en debian el paquete
libappindicator3-1
, el cual debe descargarse desde debian los repositorios de debian stable ya que testing a la fecha no posee el paquete:$ echo 'deb [arch=amd64] http://deb.debian.org/debian/ stable main' \ | sudo tee /etc/apt/sources.list.d/stable-for-arduino.list $ sudo apt-get update $ sudo apt-get install -Vy libappindicator3-1 $ sudo rm /etc/apt/sources.list.d/stable-for-arduino.list
Para tener acceso termisos para conectarse a la placa por el puerto serie usb el usuario debe pertenecer al grupo
dialout
:$ sudo addgroup $(id -un) dialout
para que el grupo sea efectivo debemos reloguearnos al sistema o utilizar en una consola el comando
newgrp dialout
-
arduino ide: permite programar, compilar y enviar a la placa localmente. En debian se instala como parte del paquete
arduino
:$ sudo apt-get install -Vy arduino
Al iniciar el ide, si no se pertenece al grupo
dialout
se muestra un cartel indicando que esto es necesario.A mi criterio la experiencia del IDE es mala, ya que como editor de textos es bastante mediocre. Como positivo tiene el hecho que permite de forma sencilla especificar el modelo de placa utilizada (Tools > Boards), el puerto al que está conectada la placa (Tools > Port) y cuenta con un monitor del puerto serie (Tools > Serial Monitor).
Las librerías que serán utilizadas por los proyectos se deben agregar a arduino como un zip (Sketch > Include Library > Add .ZIP Library…) o descargandose de internet (Sketch > Include Library > Manage Libraries…), con lo cual son agregadas por defecto bajo el directorio
~/Arduino/libraries/
.En la [guia para librerías de arduino] se indica que las librerías de arduino se pueden encontrar en tres lugares:
- IDE installation folder (
USER_LIB_PATH=~/Arduino/libraries
) - core folder (
ARDUINO_LIB_PATH=/usr/share/arduino/libraries
) - libraries folder inside your sketchbook
La instalación en 2. y 3. debe realizarse de forma manual.
- IDE installation folder (
-
Arduino-Makefile: es un conjunto de Makefiles que permiten compilar y enviar al dispositivo los programas utilizando solamente la linea de comandos. A diferencia de las otras opciones no se posee un Serial Monitor, por lo que conviene instalar un programa como
picocom
para conectarse al puerto serie:$ sudo apt-get install -Vy arduino-mk picocom
Es la opción más potente para el desarrollador aunque puede dar problemas al momento de configurar.
Vale la pena notar que tanto en este caso como en el anterior se instala el paquete
arduino
, el cual posee varios ejemplos:$ dpkg -L arduino | grep /examples/
Uso de arduino-mk
Como ejemplo de uso de arduino-mk se tiene el programa Blink
que se instala
junto al paquete arduino-mk
:
$ dpkg -L arduino-mk | grep -i /blink/
/usr/share/doc/arduino-mk/examples/Blink/Blink.ino
/usr/share/doc/arduino-mk/examples/Blink/Makefile
Comenzamos copiando el ejemplo:
$ cp -a /usr/share/doc/arduino-mk/examples/Blink $HOME/arduino-example
A continuación, debe editarse el Makefile
teniendo en cuenta la placa
utilizada. En mi caso que estoy utilizando una arduino mega. A continuación
se mostrarán dos errores posibles que pueden cometerse al editarse el archivo
Makefile
, y los mensajes de error asociados
Placa incorrecta o no especificada correctamente.
En el siguiente ejemplo del archivo Makefile
la placa no está completamente
especificada (se utiliza el ide 1.0 en lugar del ide 1.6):
BOARD_TAG = mega
ARDUINO_PORT = /dev/ttyACM0
include /usr/share/arduino/Arduino.mk
Al intentar compilar:
$ make clean && make
...
mkdir -p build-mega
/usr/share/arduino/hardware/tools/avr/bin/avr-g++ -x c++ -include Arduino.h -MMD -c -mmcu= -DF_CPU=16000000L -DARDUINO=1813 -DARDUINO_ARCH_AVR -D__PROG_TYPES_COMPAT__ -I/usr/share/arduino/hardware/arduino/avr/cores/arduino -I/usr/share/arduino/hardware/arduino/avr/variants/mega -Wall -ffunction-sections -fdata-sections -Os -fpermissive -fno-exceptions -std=gnu++11 -fno-threadsafe-statics -flto Blink.ino -o build-mega/Blink.ino.o
avr-g++: error: missing device or architecture after ‘-mmcu=’
make: *** [/usr/share/arduino/Arduino.mk:1252: build-mega/Blink.ino.o] Error 1
...
Corrigiendo en el Makefile
la versión de la placa:
BOARD_TAG = mega
BOARD_SUB = atmega2560
MONITOR_PORT = /dev/ttyACM0
include /usr/share/arduino/Arduino.mk
Se encuentra que la compilación esta vez se realiza sin problemas:
$ make clean && make
AVR Memory Usage
----------------
Device: atmega2560
Program: 1554 bytes (0.6% Full)
(.text + .data + .bootloader)
Data: 9 bytes (0.1% Full)
(.data + .bss + .noinit)
Configuración incorrecta de avrdude
.
El segundo problema surge al querer cargar (upload
) el programa a la placa:
$ make upload
...
make[1]: Entering directory '/home/jmpc/arduino-example'
/usr/share/arduino/hardware/tools/avr/bin/avrdude -q -V -p atmega2560 -C /usr/share/arduino/hardware/tools/avr/etc/avrdude.conf -D -c wiring -b 115200 -P /dev/ttyACM0 \
-U flash:w:build-mega-atmega2560/arduino-example_.hex:i
avrdude: can't open config file "/usr/share/arduino/hardware/tools/avr/etc/avrdude.conf": No such file or directory
avrdude: error reading system wide configuration file "/usr/share/arduino/hardware/tools/avr/etc/avrdude.conf"
make[1]: *** [/usr/share/arduino/Arduino.mk:1462: do_upload] Error 1
Lo anterior sucede porque al invocar al programa avrdude
(utilizado para
programar la placa) no se le está pasando la ruta correcta de configuración.
Revisando el paquete avrdude
vemos que la configuración se encuentra en
/etc/avrdude.conf
:
$ dpkg -L avrdude | grep /etc/
/etc/avrdude.conf
con lo que se debe utilizar la variable AVRDUDE_CONF = /etc/avrdude.conf
para que la configuración se tome correctamente y el programa pueda cargarse
a la placa.
Corrección de Makefile
De lo anterior el archivo Makefile
debe quedar como:
# Arduino Make file. Refer to https://github.com/sudar/Arduino-Makefile
BOARD_TAG = mega
BOARD_SUB = atmega2560
MONITOR_PORT = /dev/ttyACM0
AVRDUDE_CONF = /etc/avrdude.conf
include /usr/share/arduino/Arduino.mk
Y al momento de compilar y cargar a la placa:
$ make clean && make && make upload
...
avrdude: AVR device initialized and ready to accept instructions
avrdude: Device signature = 0x1e9801 (probably m2560)
avrdude: reading input file "build-mega-atmega2560/arduino-example_.hex"
avrdude: writing flash (1554 bytes):
avrdude: 1554 bytes of flash written
avrdude: safemode: Fuses OK (E:FD, H:D8, L:FF)
avrdude done. Thank you.
...
Conclusiones
- El utilizar el editor web para programar no me agrada ya que se pierde la posibilidad de realizar las tareas de forma offline y tener las herramientas en el sistema.
- El IDE es malo (muy malo..). Quizás no sea justo compararlo con otros
entornos de desarrollo, pero el
vim
le da mil vueltas. - Antes de dar con el archivo
/usr/share/doc/arduino-mk/examples/Blink/Makefile
que posee las combinaciones necesarias para utilizar varias de las placas más comunes de arduino perdí horas tratando de dar con los valores correctos para poder compilar. Por otro lado el problema de la configuración deavrdude
me llevó minutos. - Si bien el archivo
Makefile
es sencillo, este tiene hardcodeadas varias rutas del sistema, lo que no está tan bueno…