¿Programación para Arduino sin el IDE de Arduino ... pero con las bibliotecas proporcionadas?

10

Recientemente empecé un nuevo proyecto con mi Arduino que ha estado acumulando polvo durante un tiempo. Junto con la placa física que recoge polvo, también lo ha hecho mi copia de avr-gcc y las bibliotecas Arduino. Puedo administrar la actualización de avr-gcc, pero no recuerdo cómo compilé las bibliotecas de Arduino. Con la fuente de Arduino, hay archivos de origen listados y similares, pero no makefile (que puedo ver) para construir la biblioteca. No me importa crear el IDE, solo quiero la biblioteca en formato binario y los archivos de encabezado que necesitaré. ¿Hay alguna documentación o algo así para hacer esto?

No quiero usar el IDE de Arduino, prefiero usar mi propio editor de texto y un makefile.

    
pregunta Earlz

3 respuestas

9

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:

  1. Descargue una copia del código fuente de Arduino IDE
  2. Copie el contenido de hardware/arduino/cores/arduino en un nuevo directorio al que me referiré como arduino_build
  3. 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
  4. 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

    
respondido por el Earlz
3

Si está dispuesto a usar el IDE de Arduino una vez (o una vez por tipo de dispositivo), es la forma más fácil de crear una biblioteca estática, así como obtener las fuentes de la biblioteca. Después de eso, puede utilizar las herramientas de desarrollo que más le convengan.

Este artículo de Arduino (escrito para los usuarios que se trasladan al IDE de Eclipse) describe la creación de la biblioteca de Arduino mediante la compilación de Haga un boceto con el IDE de Arduino y recupere la biblioteca del directorio temporal de Arduino. Desplácese hacia abajo aproximadamente 1/4 de la página a la sección

  
  1. Copiando la biblioteca desde un proyecto IDE de Arduino
  2.   
    
respondido por el JRobert
0

Si solo necesita un sistema de compilación que también pueda pilotear a su programador de microcontroladores, platformio es su amigo.

    
respondido por el Luke Skywalker

Lea otras preguntas en las etiquetas