Jak kompilować, przesyłać i monitorować za pomocą wiersza poleceń systemu Linux?

19

Interfejs Arduino Uno (przesyłanie itp.) Z Arduino IDE (przy użyciu pakietu Fedora) działa dobrze w Fedorze 21.

Ale wolę używać trybu vim + make + vim-quickfix-mode itp.

Jak mogę to zrobić?

Najlepiej za pomocą narzędzi dostępnych z repozytoriów Fedory.

Zakładam, że IDE wywołuje zewnętrzne narzędzia wiersza poleceń do przesyłania itp.

Odpowiednikiem monitora szeregowego IDE jest prawdopodobnie podłączenie emulatora terminala (np. screen) /dev/ttyACM0, Prawda?

Być może istnieje dobry przykładowy projekt, który można obejrzeć na makefile?

maxschlepzig
źródło

Odpowiedzi:

7

Proponuję Googling dla projektów Makefile. Zrobiłem to jakiś czas temu dla programu Blink, po prostu widząc, co zostało wygenerowane przez IDE i replikując to w bardziej ogólny sposób.

#
# 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

Trzeba by ARDUINO_DIRprzynajmniej zmienić , aby odzwierciedlić miejsce instalacji IDE. Jeśli używasz innych rzeczy, takich jak biblioteka Wire, musisz ją nieco rozwinąć, aby skompilować dodatkowe biblioteki. Ponownie możesz użyć tego, co generuje IDE, aby poprowadzić zmiany.

Linie z wiodącymi spacjami powyżej wymagają znaku tabulacji zamiast spacji, co jest normalne dla pliku Makefile.

Nick Gammon
źródło
2
Przydałaby się również sekcja przesyłania w pliku make, aby załadować skompilowany szkic do arduino (używając avr-dude).
Gerben,
To na pewno byłoby przydatne. Jednak jak dotąd IDE spełniło moje potrzeby w zakresie kompilacji i przesyłania, nie mam silnej motywacji, aby wymyślić, jak to zrobić. :)
Nick Gammon
Spójrz na metamorficzną odpowiedź na łatwiejsze rozwiązanie
Victor Lamoine
20

Używam interfejsu wiersza polecenia do arduinopolecenia .

Uruchamiam tak:

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

Istnieje strona opisująca inne narzędzia wiersza polecenia, takie jak inotool. Ta strona ma również przykład Makefile. Te alternatywy wydają się kuszące, ale najwyraźniej żadna z nich nie działa. Zakładam, że jest to spowodowane pewnymi niedawnymi zmianami w plikach dystrybucyjnych Arduino IDE, od których zależą.

Działa arduinojak powyżej, jest trochę powolna, bo chyba ładuje Javę, ale przynajmniej działa. Istnieje również arduino-builderpolecenie dostarczane z dystrybucją Arduino IDE. W chwili pisania tego tekstu nie było wystarczająco dobrze udokumentowane, żebym mógł wymyślić, jak go używać. Na przykład nie ma przykładowych wierszy poleceń w README ani w żadnym samouczku, z którym się spotkałem, i nie mogłem wymyślić, jak go użyć, aby załadować kod na tablicę. Jednak przypuszczalnie jest w stanie zapewnić nam szybszą kompilację niż arduino. W README wspomniano również o możliwości ponownego wykorzystania plików obiektowych z poprzedniej kompilacji, więc istnieje kilka podobnych funkcji.


Aby wyświetlić wyjście szeregowe , używam czegoś takiego

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

Liczba 1000000 powinna pasować do liczby, którą przekazujesz Serial.begin()w kodzie planszy. Możesz także użyć, screenjeśli masz program interaktywny, który jest odpowiednio interaktywny, lub możesz użyć dowolnego narzędzia do pisania bezpośrednio na urządzeniu. Nawiasem mówiąc, mój Due pojawia się jako /dev/ttyACM0(zamiast /dev/ttyUSB0Uno).

Metamorficzny
źródło
1
Upewnij się, że masz jeden *.inoplik w katalogu, ponieważ niekoniecznie musi on przesyłać ten wymieniony w --uploadparametrze.
Chris Stryczyński
5

Potrzebujesz pliku Makefile. W okolicy Arduino jest kilka projektów Makefile. Googling dla „Arduino Makefile” zwraca wiele wyników, w tym to, co wygląda dobrze na Github: https://github.com/sudar/Arduino-Makefile

Kompilacja z wiersza poleceń nie jest trywialna ze względu na sposób, w jaki Arduino IDE obsługuje biblioteki.

Odpowiednikiem monitora szeregowego IDE jest prawdopodobnie podłączenie emulatora terminala (np. Screen) do / dev / ttyACM0, prawda?

W przypadku monitora szeregowego polecam Minicom. Jest to w pełni funkcjonalny emulator terminala (vt102) w wierszu poleceń.

minicom -D /dev/ttyACM0 -b 115200

... na przykład.

Majenko
źródło
1
Ten Makefile jest zasadniczo utrzymaną wersją zaakceptowanej odpowiedzi. Istnieje również projekt szablonu na GitHub, który pokazuje, jak go skonfigurować: github.com/ladislas/Bare-Arduino-Project
Stefan van der Walt
2

Jeśli chcesz w pełni kompatybilne rozwiązanie dla Arduino projektu (tak, można udostępnić swój projekt z innymi osobami, które korzystają tylko zwykły Arduino IDE) trzeba sprawdzić AUpewnij narzędzia uproszczenie CLI Arduino, używam go z Geany ale inni używają go z vi, Atom itp.

Jest zainspirowany i martwe projekty Ino i Arturo; poświęć 5 minut na przetestowanie go i prześlij opinię.

Przykładowe zastosowanie:

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]

Ma tam jakiś inteligentny klej, może zapamiętać płytkę i plik, a nawet automatycznie wykryć USB płyty; więc po udanym poleceniu „amake -v” możesz to zrobić w wierszu poleceń i zadziała.

amake -v
[to compile/verify your code]

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

Jeśli użyjesz niektórych makr IDE, możesz łatwo tworzyć polecenia kompilacji i przesyłania, na przykład używając Geany IDE:

  • Kompiluj / Zweryfikuj: cd% d; amake -v uno% f
  • Prześlij: cd% d; amake -u uno% f

Więcej pomocy można uzyskać po zainstalowaniu „amake” lub „amake -h”.

Może również obsługiwać KAŻDĄ płytkę / lib / programator, który zainstalowałeś / skonfigurowałeś w swoim Arduino IDE, tak, nowoczesna płyta, taka jak Adafuit Trinket M0 / Arduino M0 itp ...

Po prostu uruchom Arduino IDE, przejdź do menedżera forum, zainstaluj wsparcie i to wszystko, jutro postępuj zgodnie z prostymi instrukcjami i gotowe.

Twoja płyta nie jest obsługiwana? to nie problem, wykryj plik fqbn (przeczytaj plik README.md) i przekaż go jako nazwę płyty.

Szukam testerów, aby zwiększyć liczbę lub aliasy płyty i automatyczne wykrywanie prawidłowych podpisów USB.

Pamiętaj, że to prywatne narzędzie, teraz udostępniane publicznie, wiesz, tylko programista drapie się po swędzeniu ...

Twoje zdrowie.

Pavel Milanes Costa
źródło
2

Oficjalne narzędzie CLI

Zespół arduino pracuje nad klientem cli https://github.com/arduino/arduino-cli

Ogłoszenie : https://blog.arduino.cc/2018/08/24/announcing-the-arduino-command-line-interface-cli/

Dzięki temu możesz zrobić prawie wszystko, od pobierania płyt i bibliotek, po kompilowanie i przesyłanie skryptów. Brakuje części monitorującej (możesz użyć metody Metamorphic za pomocą stty cat, To działa!)

Polecenia są bardzo podobne do odpowiedzi Metamorphic, ponieważ to narzędzie rozgałęzia się od tego

Instrukcje w repozytorium Github i stronie podręcznika:

    $ 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.
Madacol
źródło