Як компілювати, завантажувати та контролювати за допомогою командного рядка Linux?


19

Взаємодія Arduino Uno (завантаження тощо) з Arduino IDE (за допомогою пакету Fedora) прекрасно працює в рамках Fedora 21.

Але я скоріше хочу використовувати vim + make + vim-quickfix-режим тощо.

Як я можу це зробити?

Переважно за допомогою інструментів, доступних у сховищах Fedora.

Я припускаю, що IDE викликає утиліти командного рядка externals для завантаження тощо.

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

Можливо, є хороший приклад проекту, який можна подивитися на makefile?

Відповіді:


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команда, яка постачається з дистрибутивом Ardeino IDE. Станом на це написання мені було недостатньо добре задокументовано, щоб я міг зрозуміти, як ним користуватися. Наприклад, в README або в будь-якому з підручників, на які я потрапив, немає прикладних командних рядків, і я не міг зрозуміти, як використовувати його для завантаження коду на дошку. Однак, імовірно, він здатний дати нам швидший збір, ніж arduino. README також згадує можливість повторного використання об'єктних файлів з попередньої компіляції, тому існує деяка функціональність.


Для перегляду серійного виводу я використовую щось на кшталт

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. Для Arduino існує декілька проектів Makefile. Гугл для "Arduino Makefile" повертає багато результатів, включаючи те, що виглядає як хороший на Github: https://github.com/sudar/Arduino-Makefile

Компіляція з командного рядка не є тривіальною через те, як Arduino IDE обробляє бібліотеки.

Еквівалент послідовного монітора IDE, ймовірно, підключає емулятор терміналу (наприклад, екран) до / dev / ttyACM0, правда?

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

minicom -D /dev/ttyACM0 -b 115200

... наприклад.


1
Цей Makefile є по суті підтримуваною версією прийнятої відповіді. Також на GitHub є шаблонний проект, який показує, як його налаштувати: github.com/ladislas/Bare-Arduino-Project
Стефан ван дер Уолт

2

Якщо ви хочете повністю сумісне рішення для вашого проекту arduino (так, ви можете поділитися своїм проектом з іншими людьми, які використовують просто звичайний Arduino IDE), вам потрібно перевірити програму Amake для спрощення кліпу 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" після встановлення.

Крім того, він може підтримувати КОЖНУ плату / ліб / програміст, яку ви встановили / налаштували у своєму 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/

З цим ви можете зробити майже все - від завантаження дощок та бібліотек, до складання та завантаження сценаріїв. Не вистачає моніторингової частини (ви можете скористатися методом Metamorphic, використовуючи stty cat, Це працює!)

Команди дуже схожі на відповідь Metamorphic, оскільки цей інструмент розгалужується з цього

Інструкції на репортажі Github та на сторінці man:

    $ 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.