Publicado 2021-03-30. | Modificado 2021-04-02.
Palabras clave: debian arduino
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
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:
USER_LIB_PATH=~/Arduino/libraries
)ARDUINO_LIB_PATH=/usr/share/arduino/libraries
)La instalación en 2. y 3. debe realizarse de forma manual.
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/
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
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)
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.
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.
...
vim
le da mil vueltas./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 de avrdude
me llevó
minutos.Makefile
es sencillo, este tiene hardcodeadas varias
rutas del sistema, lo que no está tan bueno...