命令行Arduino编译和上传?

时间:2011-11-18 21:20:21

标签: linux macos command-line arduino

如何在Mac和Linux上从命令行编译和上传Arduino sketches?我已经安装了Arduino编程环境。在任何地方都有一些样品制作文件吗?

12 个答案:

答案 0 :(得分:39)

有一个名为Ino的命令行Arduino工具包。它只是这样做。

答案 1 :(得分:12)

从命令行(在Windows,Mac和Linux上)编译和上传草图(与C / C ++源相关)直接通过自1.5.0以来的arduino可执行文件的标志支持。

可以使用arduino --upload [sketch.ino]

编译和上传ino

Documentation

答案 2 :(得分:8)

这是我的模板gnu make包含AVR项目,您可能需要调整其中的一些以适应您的环境。它创建了依赖项,有许多标准的gcc选项,我发现它们很有用或者可以优化大小,以及我使用的库目录。我成功地使用它来编译arduino软件,我之前也在arduino编辑器中攻击了PdePreprocessor,从命令行运行以生成所有的巫术:

https://github.com/wesen/mididuino/blob/master/app/src/processing/app/preproc/PdePreprocessor.java

#
# generic AVR makefile
#
# (c)  July 2011 - Manuel Odendahl - wesen@ruinwesen.com
#

# include this into your main Makefile, after having defined TARGET and TARGET_OBJS

all: $(TARGET).hex

CURDIR := $(dir $(lastword $(MAKEFILE_LIST)))
include $(CURDIR)MidiCtrl.mk

CC             = avr-gcc
CXX            = avr-g++
OBJCOPY        = avr-objcopy
AVR_ARCH       ?= atmega64
LDAVR_ARCH     ?= avrmega64
FLASH_PROTOCOL = jtag2

CFLAGS   += -Os -ffunction-sections -DAVR -I. -mmcu=$(AVR_ARCH) -mcall-prologues -fshort-enums -fpack-struct -Wall -Werror
CFLAGS   += -Wall -DLITTLE_ENDIAN -g -flto

CFLAGS += no-tree-loop-optimize -ffreestanding -morder1 -funsigned-char -funsigned-bitfields -fshort-enums -fpack-struct
CFLAGS += -fdata-sections -fno-split-wide-types -fno-inline-small-functions -mcall-prologues

CLDFLAGS += -Wl,--relax,--gc-sections -ffunction-sections
CLDFLAGS += -mmcu=$(AVR_ARCH)
LDFLAGS  = -m $(LDAVR_ARCH) -M

# generate list
# CFLAGS += -Wa,-adhlns=$@.lst

%.o: %.cpp
        $(CXX) $(CXXFLAGS) -c $< -o $@

%.o: %.c
        $(CC) $(CFLAGS) -c $< -o $@

%.o: %.s
        $(CC) $(CFLAGS) -c $< -o $@

%.s: %.c
        $(CC) -S $(CFLAGS) -fverbose-asm $< -o $@

%.o: %.S
        $(CC) $(CFLAGS) -c $< -o $@

%.syx: %.hex
        ihex2sysex $< $@

%.srec: %.elf
        $(OBJCOPY) -j .text -j .data -O srec $< $@

%.hex: %.elf
        $(OBJCOPY) -j .text -j .data -O ihex $< $@

%.ee_srec: %.elf
        $(OBJCOPY) -j .eeprom --change-section-lma .eeprom=0 -O srec $< $@

AVR_BASE_DIR  ?= $(abspath $(CURDIR)..)
AVR_LIB_DIR   ?= $(AVR_BASE_DIR)/hardware/libraries

AVR_LIBS       += CommonTools Midi
AVR_LIB_DIRS   += $(foreach lib,$(AVR_LIBS),$(AVR_LIB_DIR)/$(lib))
AVR_INC_FLAGS  += $(foreach dir,$(AVR_LIB_DIRS),-I$(dir))
AVR_OBJS       += $(foreach dir,$(AVR_LIB_DIRS),$(foreach file,$(wildcard $(dir)/*.cpp),$(subst .cpp,.o,$(file))))
AVR_OBJS       += $(foreach dir,$(AVR_LIB_DIRS),$(foreach file,$(filter-out $(AVR_HOST_EXCLUDE),$(wildcard $(dir)/*.c)),$(subst .c,.o,$(file))))
AVR_DEPS       += $(subst .o,.d,$(AVR_OBJS))

# AVR_HOST_EXCLUDE can be used to exclude specific files later on

CXXFLAGS += $(AVR_INC_FLAGS)
CFLAGS += $(AVR_INC_FLAGS)

CXXFlags += -Werror -Wall
CFLAGS += -Werror -Wall

default: all

%.d:%.c
        set -e; $(CC) -MM $(CFLAGS) $< \
        | sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' > $@ ; \
        [ -s $@ ] || rm -f $@

%.d:%.cpp
        set -e; $(CXX) -MM $(CXXFLAGS) $< \
        | sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' > $@ ; \
        [ -s $@ ] || rm -f $@

%.host.d:%.c
        set -e; $(CC) -MM $(CFLAGS) $< \
        | sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' > $@ ; \
        [ -s $@ ] || rm -f $@

%.host.d:%.cpp
        set -e; $(CXX) -MM $(CXXFLAGS) $< \
        | sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' > $@ ; \
        [ -s $@ ] || rm -f $@

printlibs:
        echo $(AVR_LIBS)

$(TARGET).elf: $(TARGET).o $(TARGET_OBJS) $(AVR_OBJS)
        $(CXX) $(CLDFLAGS) -g -o $@ $^

_clean:
        - rm *.elf *.hex *.o .midictrl.flags

libclean:
        rm -rf $(TARGET_OBJS) $(OBJS)

# concrete settings for development environment

UNAME=$(shell uname)
ISWIN=$(findstring CYGWIN,$(UNAME))
ISMAC=$(findstring Darwin,$(UNAME))

CC = avr-gcc
CXX = avr-g++
OBJCOPY = avr-objcopy
AVR_ARCH = atmega64
F_CPU = 16000000L
CORE = minicommand2

答案 3 :(得分:5)

您需要从arduino草图中实际创建一个可行的cpp文件。 arduino环境会自动为您完成。获取这些文件的一个技巧是打开你的arduino preferences.txt(它在mac上的〜/ Library / Arduino中,我认为在你的文档和设置或Windows上的应用程序数据中,不记得确切),并设置构建.verbose = true,upload.verbose = true。启动arduino,编译草图(不要上传)。底部的控制台将显示编译的文件。您现在可以转到该目录,该目录将包含cpp文件,以及所有核心arduino对象的编译目标文件。您可以将这些复制到项目中并使用cpp文件进行进一步的黑客攻击。如果您需要有关Makefile的更多信息,请告诉我,我可以为您提供我所拥有的信息。

答案 4 :(得分:3)

您可以使用基于CMake的biicode(我正在工作的项目)(但您实际上并不需要编写任何cmake文件),而且管理Arduino库的工具

它的主要特点是:

  • 依赖性解析,传统上,就像maven一样,但没有配置文件:直接从源代码读取依赖关系。
  • 中央存储库,任何人都可以上传他们的库。它们可以被探索,导航和discovered in the web
  • 版本控制:它检查版本兼容性并允许安全更新依赖项
  • 您可以将其用于任何文本编辑器(它具有可选的eclipse integration
  • 它管理项目设置和编译,闪存生成固件到主板

您可以在here中看到快速演示documentation并阅读更多内容。

答案 5 :(得分:2)

如果您可以使用cmake,那么同一网站中会有一些链接(例如thisthis)。 GNU makefile与cmake略有不同,但并不复杂。只是谷歌一点,你可以找到很多Makefile示例如何编译AVR代码。

答案 6 :(得分:2)

您实际上可以使用arduino GUI进行编译和上传,并在首选项中将编辑器设置为外部。这样,您可以从xcode编辑C ++(PDE)文件,并让arduino生成实际的CPP并构建整个shebang。

您还可以使用XCode使用avr-gcc编译器为arduino编写普通的C ++ / C.

查看:https://stackoverflow.com/a/8192762/153835

然后,您可以使用普通的avrdude上传工具对arduino进行编程。看看:http://www.ladyada.net/library/arduino/bootloader.html

过去,Arduino所说的协议是对STK500协议的修改,只有与arduino捆绑在一起的avrdude才能说出来。我不知道主流avrdude是否已经升级,或者你是否仍然需要使用Arduino文件夹中的avrdude。

答案 7 :(得分:2)

我很喜欢Platformio。它还具有Visual Studio Code的扩展,因此您可以从那里进行所有操作。它具有内置的库管理器和上载器。

我的设置是一个NFS驱动器,在其中我有代码,安装在linux笔记本电脑上,还安装在Arduino旁边的Raspberry Pi上。

当需要编译时,我在笔记本电脑上进行编译,由于RPi在Arduino旁边,因此我从那里进行上传。

安装和配置后,基础很简单; 'platformio run'将编译您的代码。 “ platformio run -t上载”将编译并上载。

我还具有无需编译即可上传的bash函数;

function th(){
    if [ "${1}" = "upload" ];then
    if [ ! -f platformio.ini ]; then
        echo platformio.ini not found
    else 
        UPLOAD_PORT=`cat platformio.ini | grep upload_port | awk '{print $3}'`
        if [ "${UPLOAD_PORT}" = "" ]; then
            echo no upload port
        else
            if [ "${2}" != "" ]; then
                FIRMWARE=${2}
            else
#the firmware location seems to have moved
#               FIRMWARE='.pioenvs/megaatmega2560/firmware.hex'
                FIRMWARE='.pio/build/megaatmega2560/firmware.hex'
            fi
            if [ -f "${FIRMWARE}" ]; then
                avrdude -v -p atmega2560 -C /home/stevenk/.platformio/packages/tool-avrdude/avrdude.conf -c wiring -b 115200 -D -P "${UPLOAD_PORT}" -U flash:w:$FIRMWARE:i
            else
                echo ${FIRMWARE} not found
            fi
        fi
    fi
    else 
            wget --timeout 8 -qO- http://192.168.178.212/$1
    fi
}

答案 8 :(得分:1)

我有一个makefile for Arduino,可用于编译和上传Arduino(或普通AVR C)程序到Arduino。

以下是此makefile的一些重要功能

  • 支持通过Arduino上传为ISP或任何程序员
  • 支持编译普通AVR C程序
  • 支持用户和系统库。
  • 生成装配和符号文件
  • 使用备用Arduino核心(如ATtiny或Arduino备用核心)编程

答案 9 :(得分:1)

arduino团队正在开发 cli 客户 https://github.com/arduino/arduino-cli

公告https://blog.arduino.cc/2018/08/24/announcing-the-arduino-command-line-interface-cli/

    $ arduino-cli Arduino Command Line Interface (arduino-cli).

    Usage:   arduino-cli [command]

    Examples: arduino <command> [flags...]

    Available Commands:
      board         Arduino board commands.
      compile       Compiles Arduino sketches.
      config        Arduino Configuration Commands.
      core          Arduino Core operations.
      help          Help about any command
      lib           Arduino commands about libraries.
      sketch        Arduino CLI Sketch Commands.
      upload        Upload Arduino sketches.
      version       Shows version number of Arduino CLI.

答案 10 :(得分:1)

有一个官方的 Arduino CLI 工具:

https://blog.arduino.cc/2021/02/15/arduino-cli-0-16-0-is-ready-for-you-all/?queryID=undefined

在我看来,它工作得很好。 GitHub 存储库在这里:

https://github.com/arduino/arduino-cli

它的版本是 0.16.0。所以有点测试版,但不是真的......

答案 11 :(得分:0)

如果你不坚持制作,那么还有scons / sconstruct scons/sconstruct。因为这基本上是用Python编写的,所以调整比make更简单。此外,它可以使用任何Python调试器进行调试。