Làm cách nào để biên dịch, tải lên và giám sát thông qua dòng lệnh Linux?


18

Kết nối một Arduino Uno (tải lên, v.v.) với Arduino IDE (sử dụng gói Fedora) hoạt động tốt trong Fedora 21.

Nhưng tôi muốn sử dụng vim + make + vim-quickfix-mode, v.v.

Làm thế nào tôi có thể làm điều đó?

Tốt nhất là thông qua các công cụ có sẵn từ kho Fedora.

Tôi giả sử rằng IDE gọi các tiện ích dòng lệnh bên ngoài để tải lên, v.v.

Tương đương với màn hình nối tiếp của IDE có thể đang kết nối trình giả lập thiết bị đầu cuối (ví dụ screen) với /dev/ttyACM0, phải không?

Có lẽ có một dự án ví dụ tốt người ta có thể nhìn vào makefile?

Câu trả lời:


7

Tôi sẽ đề nghị Googling cho các dự án Makefile. Tôi đã làm một lần trước cho chương trình Blink, bằng cách cơ bản nhìn thấy những gì được tạo ra bởi IDE và sao chép nó theo cách tổng quát hơn.

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

Bạn sẽ cần phải thay đổi ARDUINO_DIRít nhất, để phản ánh nơi bạn đã cài đặt IDE. Nếu bạn sử dụng những thứ khác như thư viện Dây, bạn sẽ cần mở rộng phần nào để biên dịch các thư viện bổ sung. Một lần nữa, bạn có thể sử dụng những gì IDE tự tạo để hướng dẫn các thay đổi của bạn.

Các dòng có khoảng trắng ở trên sẽ cần ký tự tab thay vì khoảng trắng, như bình thường đối với Makefile.


2
Một phần tải lên trong tệp make cũng sẽ hữu ích, để tải bản phác thảo đã biên dịch lên arduino (sử dụng avr-dude).
Gerben

Điều đó chắc chắn sẽ hữu ích. Tuy nhiên, cho đến nay, IDE đã đáp ứng nhu cầu biên dịch và tải lên của tôi, tôi không có động lực mạnh mẽ để tìm ra cách thực hiện nó. :)
Nick Gammon

Hãy xem câu trả lời biến thái để có giải pháp dễ dàng hơn
Victor Lamoine

20

Tôi sử dụng giao diện dòng arduinolệnh cho lệnh .

Tôi chạy nó như thế này:

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

Có một trang mô tả các công cụ dòng lệnh khác, như inotool. Trang đó cũng có một ví dụ Makefile. Những lựa chọn thay thế này có vẻ hấp dẫn, nhưng rõ ràng, như trong bài viết này, không ai trong số họ làm việc. Tôi cho rằng điều này là do một số thay đổi gần đây trong các tệp phân phối Arduino IDE mà chúng phụ thuộc vào.

Tôi chạy arduinonhư trên là hơi chậm, vì nó phải tải Java tôi đoán, nhưng ít nhất nó hoạt động. Ngoài ra còn có một arduino-builderlệnh đi kèm với phân phối Arduino IDE. Theo văn bản này, nó không đủ tài liệu để tôi có thể tìm ra cách sử dụng nó. Chẳng hạn, không có dòng lệnh ví dụ nào trong README hoặc trong bất kỳ hướng dẫn nào tôi đã gặp, và tôi không thể tìm ra cách sử dụng nó để tải mã lên bảng. Tuy nhiên, có lẽ nó có thể cung cấp cho chúng tôi biên dịch nhanh hơn arduino. README cũng đề cập đến việc có thể sử dụng lại các tệp đối tượng từ một trình biên dịch trước đó, do đó có một số chức năng giống như.


Để xem đầu ra nối tiếp, tôi sử dụng một cái gì đó như

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

Số 1000000 phải khớp với số bạn chuyển đến Serial.begin()trong mã bảng của bạn. Bạn cũng có thể sử dụng screennếu bạn có một chương trình bảng tương tác phù hợp hoặc bạn có thể sử dụng bất kỳ tiện ích nào để ghi trực tiếp vào thiết bị. Nhân tiện, Duệ của tôi xuất hiện dưới dạng /dev/ttyACM0(chứ không phải /dev/ttyUSB0cho Uno).


1
Hãy chắc chắn rằng bạn có một *.inotệp duy nhất trong thư mục, vì nó dường như không nhất thiết phải tải lên tệp được đề cập bởi --uploadtham số.
Chris Stryczynski

5

Những gì bạn cần là một Makefile. Có một vài dự án Makefile xung quanh cho Arduino. Googling cho "Arduino Makefile" trả về nhiều kết quả bao gồm cả những gì trông giống như một thứ tốt trên Github: https://github.com/sudar/Arduino-Makefile

Biên dịch từ dòng lệnh không tầm thường do cách Arduino IDE xử lý các thư viện.

Tương đương với màn hình nối tiếp của IDE có thể đang kết nối trình giả lập thiết bị đầu cuối (ví dụ: màn hình) với / dev / ttyACM0, phải không?

Đối với màn hình nối tiếp, tôi muốn giới thiệu minicom. Nó là một trình giả lập thiết bị đầu cuối đầy đủ chức năng (vt102) trên dòng lệnh.

minicom -D /dev/ttyACM0 -b 115200

... ví dụ.


1
Makefile này về cơ bản là một phiên bản duy trì của câu trả lời được chấp nhận. Ngoài ra còn có một dự án mẫu trên GitHub chỉ cho bạn cách thiết lập nó: github.com/ladislas/Bare-Arduino-Project
Stefan van der Walt

2

Nếu bạn muốn có một giải pháp tương thích đầy đủ cho dự án Arduino của bạn (có, bạn có thể chia sẻ dự án của bạn với những người khác sử dụng chỉ đơn giản Arduino IDE), bạn cần phải kiểm tra amake một công cụ để đơn giản hóa việc cli của Arduino, tôi sử dụng nó với Geany nhưng những người khác đang sử dụng nó với vi, Atom, v.v.

Đó là cảm hứng và các dự án Ino và Arturo đã chết; vui lòng dành 5 phút để kiểm tra và vui lòng cho phản hồi.

Ví dụ sử dụng:

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]

Nó có một số keo thông minh trong đó, nó có thể nhớ bảng và tập tin, và thậm chí tự động phát hiện ra usb của bảng; Vì vậy, sau lệnh "amake -v" thành công, bạn có thể thực hiện việc này trên dòng lệnh và nó sẽ hoạt động.

amake -v
[to compile/verify your code]

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

Nếu bạn sử dụng một số macro IDE, bạn có thể dễ dàng biên dịch và tải lên các lệnh, ví dụ như sử dụng Geany IDE, nó sẽ trở thành:

  • Biên dịch / Xác minh: cd% d; amake -v uno% f
  • Tải lên: cd% d; amake -u uno% f

Bạn có thể nhận thêm trợ giúp khi chỉ chạy "amake" hoặc "amake -h" sau khi cài đặt.

Ngoài ra, nó có thể hỗ trợ MỌI bảng / lib / lập trình bạn đã cài đặt / cấu hình trong Arduino IDE, vâng, hội đồng quản trị hiện đại của bạn như Adafuit đính M0 / Arduino M0 vv ...

Chỉ cần kích hoạt Arduino IDE của bạn, đi đến trình quản lý bảng, cài đặt hỗ trợ và đó là tất cả, hãy làm theo một số hướng dẫn đơn giản và bạn đã thiết lập xong.

Bảng bạn có không được hỗ trợ? không phải là một vấn đề, phát hiện fqbn (đọc tệp README.md) và chuyển nó dưới dạng tên bảng.

Tôi đang tìm kiếm người kiểm tra để tăng số bí danh hoặc bảng và tự động phát hiện chữ ký USB thích hợp.

Hãy nhớ rằng đây là một công cụ được phát triển riêng tư, hiện được chia sẻ với công chúng, bạn biết đấy, chỉ là một lập trình viên gãi ngứa ...

Chúc mừng.


2

Công cụ CLI chính thức

Nhóm arduino đang phát triển ứng dụng khách cli https://github.com/arduino/arduino-cli

Thông báo : https://blog.arduino.cc/2018/08/24/announcing-the-arduino-command-line-interface-cli/

Bạn có thể làm hầu hết mọi thứ với điều này, từ tải xuống bảng và thư viện, đến biên dịch và tải lên các tập lệnh. Điều còn thiếu là phần giám sát (bạn có thể sử dụng phương pháp của Metamorphic bằng cách sử dụng stty cat, Nó hoạt động!)

Các lệnh rất giống với câu trả lời của Metamorphic vì công cụ này được phân nhánh từ câu lệnh đó

Hướng dẫn trong repo Github và trang 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.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.