Как скомпилировать, загрузить и контролировать через командную строку Linux?


19

Взаимодействие Arduino Uno (загрузка и т. Д.) С Arduino IDE (с использованием пакета Fedora) прекрасно работает в Fedora 21.

Но я скорее хочу использовать vim + make + vim-quickfix-mode и т. Д.

Как я могу это сделать?

Желательно с помощью инструментов, доступных в репозиториях Fedora.

Я предполагаю, что IDE вызывает утилиты командной строки внешних программ для загрузки и т. Д.

Эквивалентом последовательного монитора IDE является, вероятно, подключение эмулятора терминала (например screen) к /dev/ttyACM0, верно?

Возможно, есть хороший пример проекта, который можно посмотреть на make-файле?

Ответы:


7

Я бы предложил поиск в Google для проектов Makefile. Я сделал это некоторое время назад для программы Blink, в основном, наблюдая за тем, что было сгенерировано IDE, и копируя это в более общем виде.

#
# Simple Arduino Makefile
#
# Author: Nick Gammon
# Date: 18th March 2015

# where you installed the Arduino app
ARDUINO_DIR = C:/Documents and Settings/Nick/Desktop/arduino-1.0.6/

# various programs
CC = "$(ARDUINO_DIR)hardware/tools/avr/bin/avr-gcc"
CPP = "$(ARDUINO_DIR)hardware/tools/avr/bin/avr-g++"
AR = "$(ARDUINO_DIR)hardware/tools/avr/bin/avr-ar"
OBJ_COPY = "$(ARDUINO_DIR)hardware/tools/avr/bin/avr-objcopy"

MAIN_SKETCH = Blink.cpp

# compile flags for g++ and gcc

# may need to change these
F_CPU = 16000000
MCU = atmega328p

# compile flags
GENERAL_FLAGS = -c -g -Os -Wall -ffunction-sections -fdata-sections -mmcu=$(MCU) -DF_CPU=$(F_CPU)L -MMD -DUSB_VID=null -DUSB_PID=null -DARDUINO=106
CPP_FLAGS = $(GENERAL_FLAGS) -fno-exceptions
CC_FLAGS  = $(GENERAL_FLAGS)

# location of include files
INCLUDE_FILES = "-I$(ARDUINO_DIR)hardware/arduino/cores/arduino" "-I$(ARDUINO_DIR)hardware/arduino/variants/standard"

# library sources
LIBRARY_DIR = "$(ARDUINO_DIR)hardware/arduino/cores/arduino/"

build:

    $(CPP) $(CPP_FLAGS) $(INCLUDE_FILES) $(MAIN_SKETCH) -o $(MAIN_SKETCH).o
    $(CC) $(CC_FLAGS) $(INCLUDE_FILES) $(LIBRARY_DIR)avr-libc/malloc.c -o malloc.c.o
    $(CC) $(CC_FLAGS) $(INCLUDE_FILES) $(LIBRARY_DIR)avr-libc/realloc.c -o realloc.c.o
    $(CC) $(CC_FLAGS) $(INCLUDE_FILES) $(LIBRARY_DIR)WInterrupts.c -o WInterrupts.c.o
    $(CC) $(CC_FLAGS) $(INCLUDE_FILES) $(LIBRARY_DIR)wiring.c -o wiring.c.o
    $(CC) $(CC_FLAGS) $(INCLUDE_FILES) $(LIBRARY_DIR)wiring_analog.c -o wiring_analog.c.o
    $(CC) $(CC_FLAGS) $(INCLUDE_FILES) $(LIBRARY_DIR)wiring_digital.c -o wiring_digital.c.o
    $(CC) $(CC_FLAGS) $(INCLUDE_FILES) $(LIBRARY_DIR)wiring_pulse.c -o wiring_pulse.c.o
    $(CC) $(CC_FLAGS) $(INCLUDE_FILES) $(LIBRARY_DIR)wiring_shift.c -o wiring_shift.c.o
    $(CPP) $(CPP_FLAGS) $(INCLUDE_FILES) $(LIBRARY_DIR)CDC.cpp -o CDC.cpp.o
    $(CPP) $(CPP_FLAGS) $(INCLUDE_FILES) $(LIBRARY_DIR)HardwareSerial.cpp -o HardwareSerial.cpp.o
    $(CPP) $(CPP_FLAGS) $(INCLUDE_FILES) $(LIBRARY_DIR)HID.cpp -o HID.cpp.o
    $(CPP) $(CPP_FLAGS) $(INCLUDE_FILES) $(LIBRARY_DIR)IPAddress.cpp -o IPAddress.cpp.o
    $(CPP) $(CPP_FLAGS) $(INCLUDE_FILES) $(LIBRARY_DIR)main.cpp -o main.cpp.o
    $(CPP) $(CPP_FLAGS) $(INCLUDE_FILES) $(LIBRARY_DIR)new.cpp -o new.cpp.o
    $(CPP) $(CPP_FLAGS) $(INCLUDE_FILES) $(LIBRARY_DIR)Print.cpp -o Print.cpp.o
    $(CPP) $(CPP_FLAGS) $(INCLUDE_FILES) $(LIBRARY_DIR)Stream.cpp -o Stream.cpp.o
    $(CPP) $(CPP_FLAGS) $(INCLUDE_FILES) $(LIBRARY_DIR)Tone.cpp -o Tone.cpp.o
    $(CPP) $(CPP_FLAGS) $(INCLUDE_FILES) $(LIBRARY_DIR)USBCore.cpp -o USBCore.cpp.o
    $(CPP) $(CPP_FLAGS) $(INCLUDE_FILES) $(LIBRARY_DIR)WMath.cpp -o WMath.cpp.o
    $(CPP) $(CPP_FLAGS) $(INCLUDE_FILES) $(LIBRARY_DIR)WString.cpp -o WString.cpp.o
    rm core.a
    $(AR) rcs core.a malloc.c.o
    $(AR) rcs core.a realloc.c.o
    $(AR) rcs core.a WInterrupts.c.o
    $(AR) rcs core.a wiring.c.o
    $(AR) rcs core.a wiring_analog.c.o
    $(AR) rcs core.a wiring_digital.c.o
    $(AR) rcs core.a wiring_pulse.c.o
    $(AR) rcs core.a wiring_shift.c.o
    $(AR) rcs core.a CDC.cpp.o
    $(AR) rcs core.a HardwareSerial.cpp.o
    $(AR) rcs core.a HID.cpp.o
    $(AR) rcs core.a IPAddress.cpp.o
    $(AR) rcs core.a main.cpp.o
    $(AR) rcs core.a new.cpp.o
    $(AR) rcs core.a Print.cpp.o
    $(AR) rcs core.a Stream.cpp.o
    $(AR) rcs core.a Tone.cpp.o
    $(AR) rcs core.a USBCore.cpp.o
    $(AR) rcs core.a WMath.cpp.o
    $(AR) rcs core.a WString.cpp.o
    $(CC) -Os -Wl,--gc-sections -mmcu=$(MCU) -o $(MAIN_SKETCH).elf $(MAIN_SKETCH).o core.a -lm
    $(OBJ_COPY) -O ihex -j .eeprom --set-section-flags=.eeprom=alloc,load --no-change-warnings --change-section-lma .eeprom=0 $(MAIN_SKETCH).elf $(MAIN_SKETCH).eep
    $(OBJ_COPY) -O ihex -R .eeprom $(MAIN_SKETCH).elf $(MAIN_SKETCH).hex

Вам нужно будет ARDUINO_DIRкак минимум изменить , чтобы отразить, где вы установили IDE. Если вы используете другие вещи, такие как библиотека Wire, вам нужно несколько расширить ее для компиляции дополнительных библиотек. Опять же, вы можете использовать то, что сама IDE генерирует для управления вашими изменениями.

Строки с ведущими пробелами выше будут нуждаться в символе табуляции вместо пробелов, как обычно для Makefile.


2
Раздел загрузки в файле make также был бы полезен для загрузки скомпилированного эскиза в arduino (используя avr-dude).
Гербен

Это определенно было бы полезно. Однако, поскольку до сих пор среда IDE удовлетворяла мои потребности в компиляции и загрузке, у меня нет сильной мотивации решать, как это сделать. :)
Ник Гэммон

Посмотрите на Метаморфический ответ для более простого решения
Виктор Ламойн

20

Я использую интерфейс командной строки для arduinoкоманды .

Я запускаю это так:

arduino --upload sketch/sketch.ino --port /dev/ttyUSB*

Есть страница, которая описывает другие инструменты командной строки, например inotool. На этой странице также есть пример Makefile. Эти альтернативы кажутся заманчивыми, но, по-видимому, на момент написания этой статьи ни один из них не работал. Я предполагаю, что это связано с некоторыми недавними изменениями в дистрибутивных файлах Arduino IDE, от которых они зависят.

Запуск, arduinoкак описано выше, немного медленный, потому что он должен загружать Java, но, по крайней мере, он работает. Существует также arduino-builderкоманда, поставляемая с дистрибутивом Arduino IDE. На момент написания статьи это было недостаточно хорошо задокументировано, чтобы я мог понять, как его использовать. Например, нет примеров командных строк в README или в каких-либо уроках, с которыми я сталкивался, и я не мог понять, как использовать их для загрузки кода на доску. Тем не менее, по-видимому, это может дать нам более быструю компиляцию, чем arduino. В README также упоминается возможность многократного использования объектных файлов из предыдущей компиляции, поэтому есть некоторая функциональность, похожая на make.


Для просмотра последовательного вывода я использую что-то вроде

stty -F /dev/ttyUSB* 1000000 raw -clocal -echo
cat /dev/ttyUSB*

Число 1000000 должно совпадать с номером, который вы передаете Serial.begin()в коде вашей доски. Вы также screenможете использовать эту программу, если у вас есть интерактивная программа, или вы можете использовать любую утилиту для прямой записи на устройство. Кстати, мой Due показывается как /dev/ttyACM0(а не /dev/ttyUSB0для Uno).


1
Убедитесь, что у вас есть один *.inoфайл в каталоге, поскольку он не обязательно загружает файл, указанный в --uploadпараметре.
Крис Стрычински,

5

Что вам нужно, это Makefile. Есть несколько проектов Makefile для Arduino. Поиск в Google для Arduino Makefile возвращает много результатов, включая то, что на Github выглядит как хороший: https://github.com/sudar/Arduino-Makefile

Компиляция из командной строки не тривиальна из-за того, как Arduino IDE обрабатывает библиотеки.

Эквивалент последовательного монитора IDE, вероятно, подключает эмулятор терминала (например, экран) к / dev / ttyACM0, верно?

Для серийного монитора я бы порекомендовал миником. Это полнофункциональный эмулятор терминала (vt102) в командной строке.

minicom -D /dev/ttyACM0 -b 115200

... например.


1
Этот Makefile по сути является поддерживаемой версией принятого ответа. На GitHub есть также шаблон проекта, который показывает, как его настроить: github.com/ladislas/Bare-Arduino-Project
Стефан ван дер Уолт,

2

Если вы хотите полностью совместимое решение для вашего проекта Arduino (да, вы можете поделиться своим проектом с другими людьми, которые используют просто Arduino IDE), вам нужно проверить инструмент amake , чтобы упростить Cli Arduino, я использую его с Geany, но другие используют его с vi, Atom и т. д.

Это вдохновило и теперь мертвые проекты Ino и Arturo; пожалуйста, потратьте 5 минут, чтобы протестировать его, и, пожалуйста, оставьте отзыв.

Пример использования:

cd ~/Arduino/Blink/
[move to your arduino project folder]

amake -v uno Blink.ino
[to compile/verify your code]

amake -u uno Blink.ino /dev/ttyUSB0
[to upload your code to an arduino connected via USB]

Там есть какой-то умный клей, он может запоминать доску и файл и даже автоматически определять usb платы; поэтому после успешной команды "amake -v" вы можете сделать это в командной строке, и она будет работать.

amake -v
[to compile/verify your code]

amake -u
[to upload your code to an arduino connected via USB]

Если вы используете некоторые макросы IDE, вы можете легко создавать команды компиляции и выгрузки, например, используя Geany IDE, это станет:

  • Компилировать / Проверять: cd% d; amake -v uno% f
  • Загрузить: cd% d; amake -u uno% f

Вы можете получить дополнительную помощь, запустив «amake» или «amake -h» после установки.

Кроме того, он может поддерживать КАЖДУЮ плату / lib / programmer, которую вы установили / настроили в Arduino IDE, да, такую ​​современную плату, как Adafuit Trinket M0 / Arduino M0 и т. Д. ...

Просто запустите вашу Arduino IDE, перейдите к администратору конференции, установите поддержку и все, просто следуйте простым инструкциям и все готово.

Доска у вас не поддерживается? не проблема, определите fqbn (прочитайте файл README.md) и передайте его как имя платы.

Я ищу тестеров для увеличения числа или псевдонимов платы и автоматического определения правильных сигнатур USB.

Помните, что это частный инструмент, которым теперь обмениваются с публикой, вы знаете, просто программист, который чешется ...

Приветствия.


2

Официальный инструмент CLI

Команда Arduino разрабатывает клиент Cli. Https://github.com/arduino/arduino-cli.

Объявление : https://blog.arduino.cc/2018/08/24/announcing-the-arduino-command-line-interface-cli/

С этим вы можете делать практически все: от загрузки досок и библиотек до компиляции и загрузки скриптов. Что отсутствует является частью мониторинга (вы можете использовать метод метаморфических в использовании stty cat, оно работает!)

Команды очень похожи на ответ Metamorphic, так как этот инструмент выходит из этого

Инструкции в репозитории Github и на странице руководства:

    $ 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.
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.