Construyendo programas arduino

2021/03/30

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:

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