Para que funcione esto tendrás que hacer un directorio con el nombre del
proyecto (como lo haría el IDE del arduino). Dentro de ese directorio
pones este makefile, revisas que las direcciones de los directorios que
contiene este makefile se corresponden con las de tu ordenador y ya
estás preparado para usarlo.
Las instrucciones de como compilar están al final de makefile, pero
básicamente es hacer un make, como si fuera un programa C normal y si no
hay errores, hacer un make upload.
Si no te sale a la primera pues es cuestión de revisar bien los
directorios y probar de nuevo.
Como cada cosa nueva en programación, tendrás que probar, estudiar,
probar, estudiar, probar, leer algo en intenet, probar, estudiar,
probar...
Un último apunte, recuerda que hemos puesto una tarjetita con un botón
en el arduino. Si tienes pulsado el botón, el reset estará desactivado y
el arduino no cargará el programa. Esto vale también si lo haces desde
el IDE.
#Vidal 2013
#Makefile para compliar desde la linea de comandos para arduino
#Basado en el makefile.mk de Tim Marston ( http://ed.am/dev/make/arduino-mk)
#El makefile original esta en el directorio programas y funciona perfectamente.
#Pero yo le he he cambiado un par de cositas (están marcadas)
#----------------------------------------------------------------------------------------
#Esta la defino yo aquí. Es la que creo que tiene mi arduino
#----------------------------------------------------------------------------------------
BOARD = atmega328
#----------------------------------------------------------------------------------------
# directorio por defecto del arduino
# lo he puesto fijo por que en este ordenador solo está en un sitio
#----------------------------------------------------------------------------------------
ARDUINODIR = /usr/share/arduino
#----------------------------------------------------------------------------------------
# default arduino version
#----------------------------------------------------------------------------------------
ARDUINOCONST = 100
#----------------------------------------------------------------------------------------
# el path por defecto de avr tools
#---------------------------------------------------------------------------------------
AVRTOOLSPATH = $(subst :, , $(PATH)) $(ARDUINODIR)/hardware/tools $(ARDUINODIR)/hardware/tools/avr/bin
#----------------------------------------------------------------------------------------
# donde se pueden bscar librerias
#el SKETCHBOOKDIR en el original (.mk) aquí no tenia valor y se buscaba valor mas abajo
#Asi que yo se lo he puesto fijo
#----------------------------------------------------------------------------------------
SKETCHBOOKDIR = $(HOME)/sketchbook
LIBRARYPATH = libraries libs $(SKETCHBOOKDIR)/libraries $(ARDUINODIR)/libraries
#----------------------------------------------------------------------------------------
# default serial device to a poor guess (something that might be an arduino)
#----------------------------------------------------------------------------------------
SERIALDEVGUESS := 0
ifndef SERIALDEV
SERIALDEV := $(firstword $(wildcard \
/dev/ttyACM? /dev/ttyUSB? /dev/tty.usbserial* /dev/tty.usbmodem*))
SERIALDEVGUESS := 1
endif
#----------------------------------------------------------------------------------------------
# Los parametros de la tarjeta desde el fichero boards.txt
# Hacen falta para luego los FLAGS del avr-gcc
# readboardsparam = $(shell sed -ne "s/$(BOARD).$(1)=\(.*\)/\1/p" $(BOARDSFILE)) # Esta lo que hace es
# cargar en readboardasparam la intruccion del shell sed y sed lo que hace es sustituir $BOARD Y $(1)
# por los comandos que se ponen luego en el call (algo rebuscado pero efica)
#----------------------------------------------------------------------------------------------
BOARDSFILE := $(ARDUINODIR)/hardware/arduino/boards.txt
readboardsparam = $(shell sed -ne "s/$(BOARD).$(1)=\(.*\)/\1/p" $(BOARDSFILE))
BOARD_BUILD_MCU = $(call readboardsparam,build.mcu)
BOARD_BUILD_FCPU := $(call readboardsparam,build.f_cpu)
BOARD_BUILD_VARIANT := $(call readboardsparam,build.variant)
#$(call readboardsparam,upload.speed)
#Le he cambiado la velocidad del serie a la que o quiero y no se corresponde con la del board.txt
BOARD_UPLOAD_SPEED := 115200
BOARD_UPLOAD_PROTOCOL := $(call readboardsparam,upload.protocol)
BOARD_USB_VID := $(call readboardsparam,build.vid)
BOARD_USB_PID := $(call readboardsparam,build.pid)
BOARD_BOOTLOADER_UNLOCK := $(call readboardsparam,bootloader.unlock_bits)
BOARD_BOOTLOADER_LOCK := $(call readboardsparam,bootloader.lock_bits)
BOARD_BOOTLOADER_LFUSES := $(call readboardsparam,bootloader.low_fuses)
BOARD_BOOTLOADER_HFUSES := $(call readboardsparam,bootloader.high_fuses)
BOARD_BOOTLOADER_EFUSES := $(call readboardsparam,bootloader.extended_fuses)
BOARD_BOOTLOADER_PATH := $(call readboardsparam,bootloader.path)
BOARD_BOOTLOADER_FILE := $(call readboardsparam,bootloader.file)
#----------------------------------------------------------------------------------------
# Si no se encuentra esta variable es que hay algun problema con el AVR seleccionado
#----------------------------------------------------------------------------------------
ifeq "$(BOARD_BUILD_MCU)" ""
ifneq "$(MAKECMDGOALS)" "boards"
ifneq "$(MAKECMDGOALS)" "clean"
$(error ¿Seguro que es ese chip?. make boards te da una lista)
endif
endif
endif
#----------------------------------------------------------------------------------------
# comprueba que no haya más de un "ino" en el directorio
# (para que sea compatible con el IDE de arduino)
#----------------------------------------------------------------------------------------
#INOFILE := $(wildcard *.ino *.pde)
INOFILE := $(wildcard *.ino)
ifdef INOFILE
ifneq "$(words $(INOFILE))" "1"
$(error Hay mas de un .ino en este directorio!)
endif
#----------------------------------------------------------------------------------------
#Se saca el nombre de mi proyecto y se crea el tarjet y los sources que se van a compilar
#----------------------------------------------------------------------------------------
TARGET := $(basename $(INOFILE))
SOURCES := $(INOFILE) \
$(wildcard *.c *.cc *.cpp *.C) \
$(wildcard $(addprefix util/, *.c *.cc *.cpp *.C)) \
$(wildcard $(addprefix utility/, *.c *.cc *.cpp *.C))
#----------------------------------------------------------------------------------------
# automatically determine included libraries
#----------------------------------------------------------------------------------------
LIBRARIES := $(filter $(notdir $(wildcard $(addsuffix /*, $(LIBRARYPATH)))), \
$(shell sed -ne "s/^ *\# *include *[>\"]\(.*\)\.h[>\"]/\1/p" $(SOURCES)))
endif
#----------------------------------------------------------------------------------------
# software
#----------------------------------------------------------------------------------------
findsoftware = $(firstword $(wildcard $(addsuffix /$(1), $(AVRTOOLSPATH))))
CC := $(call findsoftware,avr-gcc)
CXX := $(call findsoftware,avr-g++)
LD := $(call findsoftware,avr-ld)
AR := $(call findsoftware,avr-ar)
OBJCOPY := $(call findsoftware,avr-objcopy)
AVRDUDE := $(call findsoftware,avrdude)
AVRSIZE := $(call findsoftware,avr-size)
#----------------------------------------------------------------------------------------
# directories
#----------------------------------------------------------------------------------------
ARDUINOCOREDIR := $(ARDUINODIR)/hardware/arduino/cores/arduino
LIBRARYDIRS := $(foreach lib, $(LIBRARIES), \
$(firstword $(wildcard $(addsuffix /$(lib), $(LIBRARYPATH)))))
LIBRARYDIRS += $(addsuffix /utility, $(LIBRARYDIRS))
#----------------------------------------------------------------------------------------
#ficheros a compilar
#----------------------------------------------------------------------------------------
TARGET := $(if $(TARGET),$(TARGET),a.out)
OBJECTS := $(addsuffix .o, $(basename $(SOURCES)))
DEPFILES := $(patsubst %, .dep/%.dep, $(SOURCES))
ARDUINOLIB := .lib/arduino.a
ARDUINOLIBOBJS := $(foreach dir, $(ARDUINOCOREDIR) $(LIBRARYDIRS), \
$(patsubst %, .lib/%.o, $(wildcard $(addprefix $(dir)/, *.c *.cpp))))
BOOTLOADERHEX := $(addprefix \
$(ARDUINODIR)/hardware/arduino/bootloaders/$(BOARD_BOOTLOADER_PATH)/, \
$(BOARD_BOOTLOADER_FILE))
#----------------------------------------------------------------------------------------
# configuracion avrdude
#----------------------------------------------------------------------------------------
ifeq "$(AVRDUDECONF)" ""
ifeq "$(AVRDUDE)" "$(ARDUINODIR)/hardware/tools/avr/bin/avrdude"
AVRDUDECONF := $(ARDUINODIR)/hardware/tools/avr/etc/avrdude.conf
else
AVRDUDECONF := $(wildcard $(AVRDUDE).conf)
endif
endif
#----------------------------------------------------------------------------------------
# flags
#----------------------------------------------------------------------------------------
CPPFLAGS += -Os -Wall -fno-exceptions -ffunction-sections -fdata-sections
CPPFLAGS += -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums
CPPFLAGS += -mmcu=$(BOARD_BUILD_MCU)
CPPFLAGS += -DF_CPU=$(BOARD_BUILD_FCPU) -DARDUINO=$(ARDUINOCONST)
CPPFLAGS += -DUSB_VID=$(BOARD_USB_VID) -DUSB_PID=$(BOARD_USB_PID)
CPPFLAGS += -I. -Iutil -Iutility -I $(ARDUINOCOREDIR)
CPPFLAGS += -I $(ARDUINODIR)/hardware/arduino/variants/$(BOARD_BUILD_VARIANT)/
CPPFLAGS += $(addprefix -I , $(LIBRARYDIRS))
CPPDEPFLAGS = -MMD -MP -MF .dep/$<.dep
CPPINOFLAGS := -x c++ -include $(ARDUINOCOREDIR)/Arduino.h
AVRDUDEFLAGS += $(addprefix -C , $(AVRDUDECONF)) -DV
AVRDUDEFLAGS += -p $(BOARD_BUILD_MCU) -P $(SERIALDEV)
AVRDUDEFLAGS += -c $(BOARD_UPLOAD_PROTOCOL) -b $(BOARD_UPLOAD_SPEED)
LINKFLAGS += -Os -Wl,--gc-sections -mmcu=$(BOARD_BUILD_MCU)
#----------------------------------------------------------------------------------------
# figure out which arg to use with stty (for OS X, GNU and busybox stty)
#----------------------------------------------------------------------------------------
STTYFARG := $(shell stty --help 2<&1 | \
grep -q 'illegal option' && echo -f || echo -F)
#----------------------------------------------------------------------------------------
# include dependencies
#----------------------------------------------------------------------------------------
ifneq "$(MAKECMDGOALS)" "clean"
-include $(DEPFILES)
endif
#----------------------------------------------------------------------------------------
# default rule
#----------------------------------------------------------------------------------------
.DEFAULT_GOAL := all
#_______________________________________________________________________________
# RULES
.PHONY: all target upload clean boards monitor size bootloader
all: clear target
clear:
clear
display:
@echo "\n\n "
@echo "el ARDUINODIR: " $(ARDUINODIR)
@echo "el ARDUINOCONST: " $(ARDUINOCONST)
@echo "el AVRTOOLSPATH: " $(AVRTOOLSPATH)
@echo "el LIBRARYPATH: " $(LIBRARYPATH)
@echo "el SJATCHBOOKDIR: " $(SKETCHBOOKDIR)
@echo "el BOARDSFILE: " $(BOARDSFILE)
@echo "el readboardsparam: " $(readboardsparam)
@echo "el call " $(call readboardsparam,upload.speed)
@echo "el findsoftware: " $(findsoftware)
@echo "el CC: " $(CC)
@echo "el OBJECTS: " $(OBJECTS)
@echo "el DEPFILES: " $(DEPFILES)
@echo "el TARGET: " $(TARGET)
@echo "el SOURCES " $(SOURCES)
@echo "el BOARD_BOOTLOADER_PATH " $(BOARD_BOOTLOADER_PATH)
@echo "el AVRDUDEFLAGS " $(AVRDUDEFLAGS)
@echo "\n\n"
target: $(TARGET).hex
upload: target
@echo "\nEnviando al arduino..."
@test -n "$(SERIALDEV)" || { \
echo "error: SERIALDEV could not be determined automatically.">&2; \
exit 1; }
@test 0 -eq $(SERIALDEVGUESS) || { \
echo "*GUESSING* at serial device:" $(SERIALDEV); \
echo; }
stty $(STTYFARG) $(SERIALDEV) hupcl
$(AVRDUDE) $(AVRDUDEFLAGS) -U flash:w:$(TARGET).hex:i
clean:
rm -f $(OBJECTS)
rm -f $(TARGET).elf $(TARGET).hex $(ARDUINOLIB) *~
rm -rf .lib .dep
boards:
@echo "Available values for BOARD:"
@sed -nEe '/^#/d; /^[^.]+\.name=/p' $(BOARDSFILE) | \
sed -Ee 's/([^.]+)\.name=(.*)/\1 \2/' \
-e 's/(.{12}) *(.*)/\1 \2/'
monitor:
@test -n "$(SERIALDEV)" || { \
echo "error: SERIALDEV could not be determined automatically.">&2; \
exit 1; }
@test -n `which screen` || { \
echo "error: can't find GNU screen, you might need to install it."
>&2 \
exit 1; }
@test 0 -eq $(SERIALDEVGUESS) || { \
echo "*GUESSING* at serial device:" $(SERIALDEV); \
echo; }
screen $(SERIALDEV)
size: $(TARGET).elf
echo && $(AVRSIZE) --format=avr --mcu=$(BOARD_BUILD_MCU) $(TARGET).elf
bootloader:
@echo "Burning bootloader to board..."
@test -n "$(SERIALDEV)" || { \
echo "error: SERIALDEV could not be determined automatically.">&2; \
exit 1; }
@test 0 -eq $(SERIALDEVGUESS) || { \
echo "*GUESSING* at serial device:" $(SERIALDEV); \
echo; }
stty $(STTYFARG) $(SERIALDEV) hupcl
$(AVRDUDE) $(AVRDUDEFLAGS) -U lock:w:$(BOARD_BOOTLOADER_UNLOCK):m
$(AVRDUDE) $(AVRDUDEFLAGS) -eU lfuse:w:$(BOARD_BOOTLOADER_LFUSES):m
$(AVRDUDE) $(AVRDUDEFLAGS) -U hfuse:w:$(BOARD_BOOTLOADER_HFUSES):m
ifneq "$(BOARD_BOOTLOADER_EFUSES)" ""
$(AVRDUDE) $(AVRDUDEFLAGS) -U efuse:w:$(BOARD_BOOTLOADER_EFUSES):m
endif
ifneq "$(BOOTLOADERHEX)" ""
$(AVRDUDE) $(AVRDUDEFLAGS) -U flash:w:$(BOOTLOADERHEX):i
endif
$(AVRDUDE) $(AVRDUDEFLAGS) -U lock:w:$(BOARD_BOOTLOADER_LOCK):m
# building the target
$(TARGET).hex: $(TARGET).elf
$(OBJCOPY) -O ihex -R .eeprom $< $@
.INTERMEDIATE: $(TARGET).elf
$(TARGET).elf: $(ARDUINOLIB) $(OBJECTS)
$(CC) $(LINKFLAGS) $(OBJECTS) $(ARDUINOLIB) -lm -o $@
%.o: %.c
mkdir -p .dep/$(dir $<)
$(COMPILE.c) $(CPPDEPFLAGS) -o $@ $<
%.o: %.cpp
mkdir -p .dep/$(dir $<)
$(COMPILE.cpp) $(CPPDEPFLAGS) -o $@ $<
%.o: %.cc
mkdir -p .dep/$(dir $<)
$(COMPILE.cpp) $(CPPDEPFLAGS) -o $@ $<
%.o: %.C
mkdir -p .dep/$(dir $<)
$(COMPILE.cpp) $(CPPDEPFLAGS) -o $@ $<
%.o: %.ino
mkdir -p .dep/$(dir $<)
$(COMPILE.cpp) $(CPPDEPFLAGS) -o $@ $(CPPINOFLAGS) $<
%.o: %.pde
mkdir -p .dep/$(dir $<)
$(COMPILE.cpp) $(CPPDEPFLAGS) -o $@ $(CPPINOFLAGS) $<
# building the arduino library
$(ARDUINOLIB): $(ARDUINOLIBOBJS)
$(AR) rcs $@ $?
.lib/%.c.o: %.c
mkdir -p $(dir $@)
$(COMPILE.c) -o $@ $<
.lib/%.cpp.o: %.cpp
mkdir -p $(dir $@)
$(COMPILE.cpp) -o $@ $<
.lib/%.cc.o: %.cc
mkdir -p $(dir $@)
$(COMPILE.cpp) -o $@ $<
.lib/%.C.o: %.C
mkdir -p $(dir $@)
$(COMPILE.cpp) -o $@ $<
# Local Variables:
# mode: makefile
# tab-width: 4
# End: