Programando para o Arduino sem o IDE do Arduino .. mas com as bibliotecas fornecidas?

10

Recentemente, iniciei um novo projeto usando meu Arduino, que está coletando poeira há um tempo. Juntamente com a placa física que coleta poeira, minha cópia do avr-gcc e das bibliotecas do Arduino também. Posso gerenciar a atualização do avr-gcc, mas não me lembro como compilei as bibliotecas do Arduino. Com a fonte do Arduino, há arquivos de origem listados e tal, mas nenhum makefile (que eu possa ver) para realmente criar a biblioteca. Não me importo com a criação do IDE, apenas quero a biblioteca em formato binário e os arquivos de cabeçalho necessários. Existe alguma documentação ou tal para fazer isso?

Não quero usar o Arduino IDE, prefiro usar meu próprio editor de texto e um makefile.

Earlz
fonte
11
Isso pode ser útil para você.
Arminb 22/03/12
11
@arminb bleaklow.com/2010/06/04/a_makefile_for_arduino_sketches.html seria mais útil que isso. Seu link apenas fornece uma maneira de criar esboços a partir da linha de comando, não uma maneira de criar a biblioteca do arduino. Irrelevantes de qualquer forma, porque embora eu respondi minha própria pergunta
Earlz
@jippie Eu olhei para isso (não quando solicitado, mas recentemente ao revisitar isso), mas fiquei desanimado pelo fato de que você precisa ter o IDE do Arduino instalado. Tipo de derrotas o propósito
Earlz

Respostas:

9

Criei um pequeno projeto com um sistema de compilação personalizado (usando Ruby) que facilita bastante isso sem a necessidade de instalar o Arduino IDE. Basicamente, ele usa um Makefile de modelo e um script ruby ​​para facilitar a compilação das bibliotecas do Arduino. Você pode vê-lo em https://github.com/Earlz/make-wiring

No entanto, estou deixando aqui a resposta antiga para obter informações sobre como criar sua própria. É bastante complicado e irritante:

Instruções:

  1. Faça o download de uma cópia do código fonte do Arduino IDE
  2. Copie o conteúdo de hardware/arduino/cores/arduinopara um novo diretório que chamarei de arduino_build
  3. Copie o pins_arduino.harquivo de qualquer variante do Arduino hardware/arduino/variants(verifique boards.txt se você não tiver certeza) para arduino_build
  4. Adicione este makefile ao 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

E então apenas corra

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

E então, para fazer uso das bibliotecas compiladas, você pode usar um makefile simples 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

Além disso, se você tentar compilar as bibliotecas, libraries/você receberá um erro de vinculador se não fizer as coisas na ordem certa. Por exemplo, eu tive que fazer isso para usar o 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

O -larduinodeve ser a última biblioteca na linha de comando

Enfim, essa foi uma maneira muito fácil de compilar para mim. À medida que as versões futuras do Ardunio forem lançadas, esse makefile deve ser bastante à prova de futuro, exigindo apenas algumas modificações no OBJS e no HDRS. Além disso, esse makefile deve funcionar tanto com o BSD make quanto com o GNU make

Veja também uma versão ligeiramente modificada desta resposta no meu blog com um binário já compilado da biblioteca (compilado usando o pins_arduino.h "padrão").


** EDIT **

Descobri que a adição dos seguintes sinalizadores de otimização do compilador ao Makefile de construção da biblioteca e a cada projeto individual do Makefile reduz bastante o tamanho do binário final compilado. Isso torna o tamanho binário final comparável ao do IDE.

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

.

Portanto, para a biblioteca construa makefile:

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

e, para cada makefile do projeto:

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

Earlz
fonte
3

Se você deseja usar o Arduino IDE uma vez (ou uma vez por tipo de dispositivo), é a maneira mais fácil de criar uma biblioteca estática, bem como obter as fontes da biblioteca. Depois disso, você pode usar as ferramentas de desenvolvimento que mais lhe convierem.

Este artigo do Arduino (escrito para usuários que estão migrando para o IDE Eclipse) descreve a construção da biblioteca do Arduino, compilando um esboço com o IDE do Arduino e recuperando a biblioteca do diretório temporário do Arduino. Role cerca de 1/4 da página para a seção

  1. Copiando a biblioteca de um projeto IDE do Arduino
JRobert
fonte
0

Se você só precisa de um sistema de compilação que também possa pilotar seu programador de microcontroladores, platformio é seu amigo.

Luke Skywalker
fonte