He creado un pequeño proyecto con un sistema de compilación personalizado (con Ruby) que lo hace bastante fácil sin tener que instalar el IDE de Arduino. Básicamente, utiliza una plantilla Makefile y un script ruby para que la compilación de las bibliotecas de Arduino sea extremadamente fácil. Puede verlo en enlace
Sin embargo, estoy dejando la respuesta anterior aquí para obtener información sobre cómo rodar la tuya. Aunque es bastante engorroso y molesto:
Direcciones:
- Descargue una copia del código fuente de Arduino IDE
- Copie el contenido de
hardware/arduino/cores/arduino
en un nuevo directorio al que me referiré como arduino_build
- Copie el archivo
pins_arduino.h
de la variante de Arduino que sea suya, desde hardware/arduino/variants
(verifique boards.txt si no está seguro) en arduino_build
- Agregue este makefile a arduino_build:
.
#BSD licensed, see http://lastyearswishes.com/static/Makefile for full license
HDRS = Arduino.h binary.h Client.h HardwareSerial.h IPAddress.h new.h pins_arduino.h Platform.h Printable.h Print.h \
Server.h Stream.h Udp.h USBAPI.h USBCore.h USBDesc.h WCharacter.h wiring_private.h WString.h
OBJS = WInterrupts.o wiring_analog.o wiring.o wiring_digital.o wiring_pulse.o wiring_shift.o CDC.o HardwareSerial.o \
HID.o IPAddress.o main.o new.o Print.o Stream.o Tone.o USBCore.o WMath.o WString.o
#may need to adjust -mmcu if you have an older atmega168
#may also need to adjust F_CPU if your clock isn't set to 16Mhz
CFLAGS = -I./ -std=gnu99 -DF_CPU=16000000UL -Os -mmcu=atmega328p
CPPFLAGS = -I./ -DF_CPU=16000000UL -Os -mmcu=atmega328p
CC=avr-gcc
CPP=avr-g++
AR=avr-ar
default: libarduino.a
libarduino.a: ${OBJS}
${AR} crs libarduino.a $(OBJS)
.c.o: ${HDRS}
${CC} ${CFLAGS} -c $*.c
.cpp.o: ${HDRS}
${CPP} ${CPPFLAGS} -c $*.cpp
clean:
rm -f ${OBJS} core a.out errs
install: libarduino.a
mkdir -p ${PREFIX}/lib
mkdir -p ${PREFIX}/include
cp *.h ${PREFIX}/include
cp *.a ${PREFIX}/lib
Y luego simplemente ejecuta
make
make install PREFIX=/usr/arduino (or whatever)
Y luego, para hacer uso de las bibliotecas compiladas, puedes usar un makefile simple como este:
default:
avr-g++ -L/usr/arduino/lib -I/usr/arduino/include -Wall -DF_CPU=16000000UL -Os -mmcu=atmega328p -o main.elf main.c -larduino
avr-objcopy -O ihex -R .eeprom main.elf out.hex
upload:
avrdude -c arduino -p m328p -b 57600 -P /dev/ttyUSB0 -U flash:w:out.hex
all: default upload
Además, si intenta compilar las bibliotecas en libraries/
obtendrá un error de vinculador si no hace las cosas en el orden correcto. Por ejemplo, tuve que hacer esto para usar SoftwareSerial:
avr-g++ -L/usr/arduino/lib -I/usr/arduino/include -Wall -DF_CPU=16000000UL -Os -mmcu=atmega328p -o main.elf main.c -lSoftwareSerial -larduino
El -larduino
debe ser la última biblioteca en la línea de comandos
De todos modos, esta fue una forma bastante fácil de compilar para mí. A medida que surjan futuras versiones de Ardunio, este archivo make debe ser bastante seguro para el futuro, requiriendo solo algunas modificaciones a OBJS y HDRS. Además, este makefile debería funcionar tanto con BSD como con GNU make
Vea también una versión ligeramente modificada de esta respuesta en mi con un binario ya compilado de la biblioteca (compilado usando el "standard" pins_arduino.h).
** EDIT **
Descubrí que agregar los siguientes indicadores de optimización del compilador a la biblioteca que crea Makefile y a cada proyecto individual Makefile reduce enormemente el tamaño del binario final compilado. Esto hace que el tamaño binario final sea comparable al del IDE.
-Wl,--gc-sections -ffunction-sections -fdata-sections
.
Por lo tanto, para el makefile de compilación de la biblioteca:
CFLAGS = -I./ -std=gnu99 -DF_CPU=16000000UL -Os -Wl,--gc-sections -ffunction-sections -fdata-sections -mmcu=atmega328p
CPPFLAGS = -I./ -DF_CPU=16000000UL -Os -Wl,--gc-sections -ffunction-sections -fdata-sections -mmcu=atmega328p
y, para cada archivo make del proyecto:
avr-g++ -L/usr/arduino/lib -I/usr/arduino/include -Wall -DF_CPU=16000000UL -Os -Wl,--gc-sections -ffunction-sections -fdata-sections -mmcu=atmega328p -o main.elf main.c -larduino
.
Ref: enlace