Linux 명령 행을 통해 컴파일, 업로드 및 모니터링하는 방법은 무엇입니까?


19

Arduino Uno (업로드 등)와 Arduino IDE (Fedora 패키지 사용)의 인터페이스는 Fedora 21에서 잘 작동합니다.

그러나 오히려 vim + make + vim-quickfix-mode 등을 사용하고 싶습니다.

어떻게해야합니까?

Fedora 리포지토리에서 사용 가능한 도구를 통해 설정하는 것이 좋습니다.

IDE가 업로드 등을 위해 외부 명령 행 유틸리티를 호출한다고 가정합니다.

IDE의 시리얼 모니터에 해당하는 아마 터미널 에뮬레이터 (예를 들어 연결하는 screen로)를 /dev/ttyACM0오른쪽?

아마도 makefile을 볼 수있는 좋은 예제 프로젝트가 있습니까?

답변:


7

Makefile 프로젝트를위한 인터넷 검색을 제안합니다. 나는 기본적으로 IDE에 의해 생성 된 것을보고 더 일반적인 방식으로 복제함으로써 Blink 프로그램을 위해 한동안 되돌아갔습니다.

#
# 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_DIRIDE 설치 위치를 반영 하려면 최소한 변경해야합니다 . Wire 라이브러리와 같은 다른 것을 사용하는 경우 추가 라이브러리를 컴파일하기 위해 다소 확장해야합니다. 다시, IDE가 생성 한 것을 사용하여 변경을 안내 할 수 있습니다.

위의 선행 공백이있는 행 은 Makefile에서와 같이 공백 대신 문자 가 필요합니다 .


2
make 파일의 업로드 섹션도 컴파일 된 스케치를 arduino에 업로드하는 데 유용합니다 (avr-dude 사용).
Gerben

확실히 유용 할 것입니다. 그러나 지금까지 IDE가 컴파일 및 업로드에 대한 필자의 요구를 충족 시켰으므로 어떻게해야하는지에 대한 동기 부여가되지 않습니다. :)
Nick Gammon

쉽게 솔루션을 변성 대답을 살펴보십시오
빅터 Lamoine에게

20

내가 사용 받는 명령 줄 인터페이스를 arduino명령 .

나는 이것을 다음과 같이 실행한다 :

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

와 같은 다른 명령 줄 도구를 설명 하는 페이지가 있습니다inotool . 이 페이지에는 예제가 Makefile있습니다. 이 대안들은 유혹적인 것처럼 보이지만,이 글을 쓰는 시점에는 그 어느 것도 작동하지 않습니다. 나는 이것이 Arduino IDE 배포 파일이 최근에 변경 되었기 때문이라고 가정합니다.

arduino위와 같이 실행 하면 Java를로드해야하기 때문에 약간 느립니다.하지만 적어도 작동합니다. arduino-builderArduino IDE 배포판과 함께 제공 되는 명령 도 있습니다 . 이 글을 쓰는 시점에서 나는 그것을 사용하는 방법을 알아낼 수있을 정도로 충분히 문서화되지 않았다. 예를 들어 README 또는 내가 본 튜토리얼에는 명령 행의 예가 없으며 코드를 보드에 업로드하기 위해 명령 행을 사용하는 방법을 알 수 없었습니다. 그러나 아마도 우리보다 빠른 컴파일을 제공 할 수 arduino있습니다. README는 또한 이전 컴파일에서 객체 파일을 재사용 할 수 있다고 언급하므로 일부 유사한 기능이 있습니다.


직렬 출력을 보려면 다음과 같은 것을 사용하십시오

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

숫자 1000000은 Serial.begin()보드 코드에 전달한 숫자와 일치해야 합니다. screen적절한 대화 형 보드 프로그램이 있거나 유틸리티를 사용하여 장치에 직접 쓸 수있는 경우 에도 사용할 수 있습니다 . 그건 그렇고, 내 Due는 /dev/ttyACM0( /dev/ttyUSB0Uno 대신) 로 표시됩니다 .


1
매개 변수에서 *.ino언급 한 파일을 반드시 업로드 할 필요는 없으므로 디렉토리에 단일 파일 이 있는지 확인하십시오 --upload.
Chris Stryczynski

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를 사용하는 다른 사람들과 프로젝트를 공유 할 수 있습니다) arduino의 cli를 단순화하는 도구를 확인해야합니다 .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 저장소 및 매뉴얼 페이지의 지침 :

    $ 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.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.