11 votos

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

Recientemente he comenzado un nuevo proyecto usando mi Arduino que ha estado acumulando polvo durante un tiempo. Junto con el tablero físico que recoge el polvo, también lo ha hecho mi copia de avr-gcc y las bibliotecas de Arduino. Puedo manejar la actualización de avr-gcc, pero no puedo recordar cómo compilé las bibliotecas de Arduino. Con la fuente de Arduino, hay una lista de archivos fuente y demás, pero no hay un makefile (que yo pueda ver) para construir la biblioteca. No me importa construir el IDE, sólo quiero la biblioteca en formato binario y los archivos de cabecera que necesitaré. ¿Existe alguna documentación o algo parecido para hacer esto?

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

11voto

Brad Leach Puntos 9012

He creado un pequeño proyecto con un sistema de construcción personalizado (usando Ruby) que lo hace bastante fácil sin tener que instalar el IDE de Arduino. Básicamente, utiliza un Makefile de plantillas, y un rubí script para hacer la compilación de las librerías de Arduino extremadamente fácil. Podéis verlo en https://github.com/Earlz/make-wiring

Sin embargo, dejo la vieja respuesta aquí para información sobre el rodaje de la tuya. Es bastante engorroso y molesto, sin embargo:

Instrucciones:

  1. Descargue una copia del código fuente del IDE de Arduino
  2. Copia el contenido de hardware/arduino/cores/arduino a un nuevo directorio al que me referiré como arduino_build
  3. Copia el pins_arduino.h archivo de cualquier variante de Arduino de la que sea suyo hardware/arduino/variants (compruebe el boards.txt si no está seguro) para arduino_build
  4. Añade este archivo 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 corre

make
make install PREFIX=/usr/arduino (or whatever)

Y luego, para hacer uso de las bibliotecas compiladas y demás, se puede utilizar un simple archivo 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 intentas compilar las bibliotecas en libraries/ tendrás un error de enlace si no haces las cosas en el orden correcto. Por ejemplo, tuve que hacer esto para usar el 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 mando

De todos modos, esta fue una forma bastante fácil de compilarlo para mí. A medida que salgan las futuras versiones de Ardunio, este archivo debería ser a prueba de futuro, requiriendo sólo unas pocas modificaciones en OBJS y HDRS. Además, este makefile debería funcionar tanto con BSD make como con GNU make

Vea también una versión ligeramente modificada de esta respuesta en mi blog con un binario ya compilado de la biblioteca (compilado con el pins "estándar" de arduino.h).


** EDITAR **

Encontré que al agregar las siguientes banderas de optimización del compilador tanto al Makefile del edificio de la biblioteca como a cada proyecto individual, el Makefile reduce enormemente el tamaño del binario compilado final. Esto hace que el tamaño del binario final sea comparable al del IDE.

-Wl,--gc-sections -ffunction-sections  -fdata-sections  

.

Así que, para la biblioteca construye un archivo:

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 de 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: http://arduino.cc/forum/index.php?topic=153186.0

3voto

Darren Newton Puntos 835

Si está dispuesto a utilizar el IDE de Arduino una vez (o una vez por tipo de dispositivo), es la forma más fácil de construir una biblioteca estática, así como de obtener las fuentes de la biblioteca. Después de eso puedes usar cualquier herramienta de desarrollo que te convenga.

Este Artículo de Arduino (escrito para los usuarios que se mueven al IDE de Eclipse) describe la construcción de la biblioteca de Arduino mediante la compilación de un boceto con el IDE de Arduino y la recuperación de la biblioteca del directorio temporal de Arduino. Desplácese hacia abajo alrededor de 1/4 de la página hasta la sección

  1. Copiar la biblioteca de un proyecto IDE de Arduino

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X