วิธีการรวบรวมอัพโหลดและตรวจสอบผ่านทางบรรทัดคำสั่ง Linux?


19

การเชื่อมต่อ Arduino Uno (การอัพโหลด ฯลฯ ) กับ Arduino IDE (โดยใช้แพ็คเกจ Fedora) ทำงานได้ดีภายใต้ Fedora 21

แต่ฉันอยากจะใช้ vim + make + vim-quickfix-mode ฯลฯ

ฉันจะทำสิ่งนั้นได้อย่างไร

ควรใช้เครื่องมือที่มีอยู่ในคลังเก็บ Fedora

ฉันคิดว่า IDE เรียกโปรแกรมอรรถประโยชน์บรรทัดคำสั่ง externals สำหรับการอัปโหลด ฯลฯ

เทียบเท่ากับมอนิเตอร์อนุกรมของ IDE อาจเชื่อมต่อเทอร์มินัลอีมูเลเตอร์ (เช่นscreen) ไป/dev/ttyACM0ใช่ไหม?

อาจมีตัวอย่างโครงการที่ดีที่เราสามารถดู makefile ได้?

คำตอบ:


7

ฉันจะแนะนำ Googling สำหรับโครงการ 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


2
ส่วนการอัปโหลดในไฟล์ make จะมีประโยชน์เช่นกันในการอัปโหลดแบบร่างที่คอมไพล์แล้วไปยัง arduino (โดยใช้ avr-dude)
Gerben

นั่นจะเป็นประโยชน์อย่างแน่นอน อย่างไรก็ตามจนถึงขณะนี้ IDE ได้ตอบสนองความต้องการของฉันสำหรับการรวบรวมและอัพโหลดฉันไม่ได้มีแรงจูงใจอย่างมากที่จะหาวิธีที่จะทำมัน :)
Nick Gammon

ดูคำตอบของ Metamorphic เพื่อหาคำตอบที่ง่ายขึ้น
Victor Lamoine

20

ผมใช้อินเตอร์เฟซบรรทัดคำสั่งไปยังarduinoคำสั่ง

ฉันวิ่งแบบนี้:

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

มีหน้าซึ่งอธิบายเครื่องมือบรรทัดคำสั่งอื่น ๆ inotoolเช่น Makefileหน้านั้นยังมีตัวอย่าง ทางเลือกเหล่านี้ดูน่าหลงใหล แต่เห็นได้ชัดว่าในขณะที่เขียนนี้ไม่มีใครทำงาน ฉันสมมติว่านี่เป็นเพราะการเปลี่ยนแปลงล่าสุดในไฟล์ Arduino IDE ที่พวกเขาต้องพึ่งพา

วิ่งarduinoตามข้างบนค่อนข้างช้าเพราะมันต้องโหลด Java ฉันเดา แต่อย่างน้อยก็ใช้งานได้ นอกจากนี้ยังมีarduino-builderคำสั่งที่มาพร้อมกับ Arduino IDE distribution จากการเขียนนี้ฉันไม่ได้มีเอกสารเพียงพอที่จะเข้าใจวิธีการใช้งาน ตัวอย่างเช่นไม่มีบรรทัดคำสั่งตัวอย่างใน README หรือในบทเรียนใด ๆ ที่ฉันเจอและฉันไม่สามารถหาวิธีใช้มันเพื่ออัปโหลดรหัสไปยังบอร์ด arduinoแต่สันนิษฐานว่ามันสามารถที่จะให้เรารวบรวมได้เร็วกว่า README ยังกล่าวถึงความสามารถในการนำไฟล์ออบเจ็กต์มาใช้ใหม่จากคอมไพล์ก่อนหน้านี้ได้


เพื่อดูอนุกรมเอาท์พุทฉันใช้สิ่งที่ชอบ

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

หมายเลข 1000000 ควรตรงกับหมายเลขที่คุณส่งให้Serial.begin()ในรหัสบอร์ดของคุณ นอกจากนี้คุณยังสามารถใช้screenหากคุณมีโปรแกรมบอร์ดที่มีการโต้ตอบที่เหมาะสมหรือคุณสามารถใช้ยูทิลิตี้อะไรก็ได้ในการเขียนโดยตรงไปยังอุปกรณ์ โดยวิธีการของฉันแสดงให้เห็นว่าเป็น/dev/ttyACM0(แทนที่จะ/dev/ttyUSB0เป็น Uno)


1
ตรวจสอบให้แน่ใจว่าคุณมี*.inoไฟล์เดียวในไดเรกทอรีเนื่องจากดูเหมือนจะไม่จำเป็นต้องอัปโหลดไฟล์ที่กล่าวถึงโดย--uploadพารามิเตอร์
Chris Stryczynski

5

สิ่งที่คุณต้องการคือ Makefile มี Makefile บางโครงการสำหรับ Arduino Googling สำหรับ "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
Stefan van der Walt

2

หากคุณต้องการโซลูชันที่เข้ากันได้อย่างสมบูรณ์สำหรับโครงการ arduino ของคุณ (ใช่คุณสามารถแบ่งปันโครงการของคุณกับคนอื่น ๆ ที่ใช้ Arduino IDE ธรรมดาเท่านั้น) คุณต้องตรวจสอบAmakeเครื่องมือเพื่อทำให้ cli ของ 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]

มีกาวอัจฉริยะอยู่ในนั้นสามารถจดจำบอร์ดและไฟล์และตรวจสอบยูเอสบีของบอร์ดโดยอัตโนมัติ ดังนั้นหลังจากคำสั่ง SuccessFull "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" เมื่อติดตั้งแล้ว

นอกจากนี้ยังสามารถรองรับทุกบอร์ด / lib / โปรแกรมเมอร์ที่คุณติดตั้ง / กำหนดค่าใน 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มากเนื่องจากเครื่องมือนี้แยกออกมาจากคำสั่งนั้น

คำแนะนำในrepo 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.
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.