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

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

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

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

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

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

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

Возможно, есть хороший пример проекта, который можно посмотреть в makefile?

, 👍30

Обсуждение

**Натыкаясь, поскольку все эти ответы довольно старые** По состоянию на 05 июня 2021 года инструмент "arduino-cli" чрезвычайно хорош. Вы можете сделать очень простой 2-строчный "Makefile" в кратчайшие сроки., @Tim


6 ответов


Лучший ответ:

2

Отличный способ скомпилировать и прошить устройство Arduino из командной строки и интегрировать его с Vim-использовать PlatformIO Core (CLI).

Поскольку он написан на Python, его легко установить, даже если он не упакован для вашего дистрибутива Linux. PlatformIO поддерживает множество микроконтроллерных устройств, а не только Arduino. Таким образом, вам не нужно переключать среду разработки, когда вы ориентируетесь на другую платформу. PlatformIO позаботится о загрузке подходящего набора инструментов (компилятора и т.д.) Для вашей цели.

Пример

Начало работы с PlatformIO и клоном Arduino Pro Mini 3.3 v на Fedora 35:

mkdir -p ~/local
cd ~/local
python -m venv platformio
source platformio/bin/activate
pip install platformio

Это устанавливает PlatformIO (CLI) в виртуальную среду, т. Е. Его основная команда затем доступна из ~/local/platformio/bin/pio, а pio находится в вашем ПУТИ, когда виртуальная среда активирована.

Далее нам нужно найти правильный идентификатор платы для создания нового проекта:

pio boards arduino | less

Это означает поиск Pro.*Mini в списке. Существует несколько версий Pro Mini, в нашем примере pro8MHzatmega328 (3,3 В, 8 МГц, ATmega328, 30 Кб флэш-памяти, 2 кБ оперативной памяти) является правильным, что можно проверить, посмотрев на маркировку платы, а также на ее регулятор напряжения и маркировку процессора.

Чтобы создать новый проект

mkdir ~/project/some_new_project
cd ~/project/some_new_project
pio project init --board pro8MHzatmega328 --ide vim

Который печатает:

The current working directory /home/juser/project/arduino/pro-mini will be used for the project.

The next files/directories have been created in /home/juser/arduino/pro-mini
include - Put project header files here
lib - Put here project specific (private) libraries
src - Put project source files here
platformio.ini - Project Configuration File
Platform Manager: Installing atmelavr
Downloading  [####################################]  100%
Unpacking  [####################################]  100%
Platform Manager: atmelavr @ 3.4.0 has been installed!
Tool Manager: Installing platformio/toolchain-atmelavr @ ~1.70300.0
Downloading  [####################################]  100%          
Unpacking  [####################################]  100%          
Tool Manager: toolchain-atmelavr @ 1.70300.191015 has been installed!
The platform 'atmelavr' has been successfully installed!
The rest of the packages will be installed later depending on your build environment.

Project has been successfully initialized including configuration files for `vim` IDE.

Для первого теста можно скопировать простой пример мигающего светодиода, используя обычные функции setup()/loop (). Можно повторно использовать существующий "скетч" из Arduino IDE, просто нужно добавить #include <Arduino.h> вверху и поместить его в src/some-name.cc или src/some-name.cpp.

Чтобы скомпилировать все:

pio run

Который печатает:

Processing pro8MHzatmega328 (platform: atmelavr; board: pro8MHzatmega328; framework: arduino)
--------------------------------------------------------------------------------
Verbose mode can be enabled via `-v, --verbose` option
CONFIGURATION: https://docs.platformio.org/page/boards/atmelavr/pro8MHzatmega328.html
PLATFORM: Atmel AVR (3.4.0) > Arduino Pro or Pro Mini ATmega328 (3.3V, 8 MHz)
HARDWARE: ATMEGA328P 8MHz, 2KB RAM, 30KB Flash
DEBUG: Current (avr-stub) On-board (avr-stub, simavr)
PACKAGES: 
 - framework-arduino-avr 5.1.0 
 - toolchain-atmelavr 1.70300.191015 (7.3.0)
LDF: Library Dependency Finder -> https://bit.ly/configure-pio-ldf
LDF Modes: Finder ~ chain, Compatibility ~ soft
Found 5 compatible libraries
Scanning dependencies...
No dependencies
Building in release mode
Compiling .pio/build/pro8MHzatmega328/src/sos-switch.cc.o
Linking .pio/build/pro8MHzatmega328/firmware.elf
Checking size .pio/build/pro8MHzatmega328/firmware.elf
Advanced Memory Usage is available via "PlatformIO Home > Project Inspect"
RAM:   [          ]   0.4% (used 9 bytes from 2048 bytes)
Flash: [          ]   3.8% (used 1170 bytes from 30720 bytes)
========================= [SUCCESS] Took 0.51 seconds =========================

Поэтому для этого примера я создал src/sos-switch.cc, который компилируется в файл .pio/build/.../sos-switch.cc.o.

Чтобы загрузить (прошить) устройство:

pio run --target upload

Как всегда, распространенной ловушкой являются разрешения USB - устройства. Например, в Fedora мое последовательное устройство USB2TTL регистрируется как /dev/ttyUSB0 с разрешениями на чтение и запись только для root:dialout. Таким образом, вы должны добавить своего пользователя в группу дозвона или настроить разрешения другими способами.

Режим Vim Quickfix

Для интеграции с режимом quickfix Vim достаточно простого makefile, например:


.PHONY: all
all: build


.PHONY: build
build:
    pio run

.PHONY: upload
upload:
    pio run --target upload

Таким образом, все строится, когда :make вызывается в Vim, и там можно перемещаться в режиме quickfix, как обычно.

Последовательный Мониторинг

Простой способ контролировать последовательный интерфейс-использовать picocom, например:

picocom --baud 9600 --echo --imap lfcrlf --noreset /dev/ttyUSB0

где:

  • --imap lfcrlf отображает новую строку в возврат каретки + новую строку, так что мы можем просто написать Serial.print("multi\nlines\n") вместо Serial.print ("multi\r\nlines\r\n") в нашей программе
  • --noreset сообщает picocom не очищать DTR - без этого, когда DTR подключен, устройство Anrdoid сбрасывается

Конечно, при загрузке нужно прекратить работу picocom.


В качестве альтернативы можно использовать команду PlatformIO monitor:

pio device monitor

В отличие от picocom, он не требует явного отображения или обработки DTR. Однако, как и в случае с picocom, он должен быть прекращен при загрузке/перепрошивке. Это означает, что PlatformIO не приостанавливает мониторинг автоматически при вызове pio run --target upload.

Заключительные замечания

  • PlatformIO в настоящее время упакован для Fedora и, таким образом, может быть непосредственно доступен в Fedora 36 или около того
  • классическая Arduino IDE была упакована для Fedora, но больше не доступна в Fedora 35 из-за большого исхода пакета Java
  • существует также плагин PlatoformIO для VSCode который кажется довольно популярным
,

Хороший ответ. Re “--imap lfcrlf”: Это не нужно, если вы используете Serial.println (), который является “способом Arduino” печати новой строки., @Edgar Bonet

@EdgarBonet да, Serial.println() пишет \r\n, поэтому нам не нужно сопоставление, если оно используется исключительно. Тем не менее, как классическая Arduino IDE, так и PlatformIO monitor неявно сопоставляют "\n " с "\r\n", так что вам сойдет с рук один \n. Если вы передадите "\r\n", вы можете получить "\r\r\n", что не повредит. Даже если ваша программа использует Serial.println (), вы все равно можете использовать \n в многострочных строках. Обновил свой ответ, чтобы проиллюстрировать этот момент. Однако для консоли, ориентированной на конечного пользователя, имеет смысл придерживаться "\r\n " и обнаруживать оплошности, не имея такого сопоставления., @maxschlepzig


6

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

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

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

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

minicom -D /dev/ttyACM0 -b 115200

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

,

Этот Makefile, по сути, является поддерживаемой версией принятого ответа. На GitHub также есть проект шаблона, который показывает вам, как его настроить: https://github.com/ladislas/Bare-Arduino-Project, @Stefan van der Walt


11

Я бы посоветовал поискать в 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. Если вы используете другие вещи, такие как проводная библиотека, вам нужно будет несколько расширить ее, чтобы скомпилировать дополнительные библиотеки. Опять же, вы можете использовать то, что сама среда IDE генерирует, чтобы направлять ваши изменения.

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

,

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

Это определенно было бы полезно. Однако, поскольку до сих пор IDE удовлетворяла мои потребности в компиляции и загрузке, я не очень мотивирован, чтобы понять, как это сделать. :), @Nick Gammon

Взгляните на метаморфический ответ для более простого решения, @Victor Lamoine

Кто-то предложил отредактировать утверждение "Я бы предложил поискать в Google проекты Makefile" на том основании, что люди, вероятно, все равно попали на эту страницу из Google. Однако я думаю, что это все еще полезное предложение, особенно в прямом ответе на опубликованный вопрос. Мой ответ дал **один** предложенный способ достижения результата, поиск Google может предоставить другие., @Nick Gammon


30

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

Я запускаю его так:

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

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

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


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

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

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

,

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

Переменная отображения X11 не была установлена, но эта программа выполнила операцию, которая требует этого. Для меня, @Jackie


2

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

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

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

cd ~/Arduino/Blink/
[переместить в папку проекта arduino]

amake -v uno Blink.ino
[для компиляции/проверки кода]

amake -u uno Blink.ino /dev/ttyUSB0
[чтобы загрузить свой код на arduino, подключенный через USB]

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

amake -v
[для компиляции/проверки кода]

amake -u
[чтобы загрузить свой код на arduino, подключенный через USB]

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

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

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

Кроме того, он может поддерживать каждую плату/библиотеку/программатор, который вы установили/настроили в своей Arduino IDE, да, современную плату, такую как Adafuit Trinket M0 / Arduino M0 и т. Д.

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

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

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

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

Твое здоровье.

,

6

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

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

Анонс: https://blog.arduino.cc/2018/08/24/announcing-the-arduino-command-line-interface-cli/

С его помощью можно делать практически все-от загрузки плат и библиотек до компиляции и загрузки скриптов. Чего не хватает, так это части мониторинга (вы можете использовать метод Metamorphic с помощью 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.
,