Bagaimana cara mengkompilasi, mengunggah dan memantau melalui baris perintah Linux?


18

Menggabungkan Arduino Uno (mengunggah dll.) Dengan Arduino IDE (menggunakan paket Fedora) berfungsi dengan baik di bawah Fedora 21.

Tapi saya lebih suka menggunakan vim + make + vim-quickfix-mode dll.

Bagaimana saya bisa melakukan itu?

Lebih disukai melalui alat yang tersedia dari repositori Fedora.

Saya berasumsi bahwa IDE memanggil utilitas baris perintah eksternal untuk mengunggah dll.

Setara dengan monitor serial IDE mungkin menghubungkan emulator terminal (misalnya screen) ke /dev/ttyACM0, kan?

Mungkin ada contoh proyek yang bagus yang bisa dilihat di makefile?

Jawaban:


7

Saya akan menyarankan proyek Googling untuk Makefile. Saya melakukan beberapa waktu yang lalu untuk program Blink, pada dasarnya melihat apa yang dihasilkan oleh IDE dan mereplikasi itu dengan cara yang lebih umum.

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

Anda harus mengubah ARDUINO_DIRsetidaknya, untuk mencerminkan di mana Anda menginstal IDE. Jika Anda menggunakan hal-hal lain seperti perpustakaan Wire Anda perlu mengembangkannya untuk mengkompilasi perpustakaan tambahan. Sekali lagi, Anda dapat menggunakan apa yang dihasilkan IDE untuk memandu perubahan Anda.

Baris dengan spasi terdepan di atas akan membutuhkan karakter tab alih-alih spasi, seperti normal untuk Makefile.


2
Bagian unggahan dalam file make juga akan berguna, untuk mengunggah sketsa yang dikompilasi ke Arduino (menggunakan avr-dude).
Gerben

Itu pasti akan bermanfaat. Namun sejauh ini, IDE telah memenuhi kebutuhan saya untuk kompilasi dan mengunggah, saya tidak termotivasi untuk mengetahui bagaimana melakukannya. :)
Nick Gammon

Lihatlah jawaban Metamorphic untuk solusi yang lebih mudah
Victor Lamoine

20

Saya menggunakan antarmuka baris perintah ke arduinoperintah .

Saya menjalankannya seperti ini:

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

Ada halaman yang menggambarkan alat-alat baris perintah lainnya, seperti inotool. Halaman itu juga punya contoh Makefile. Alternatif-alternatif ini tampaknya menarik, tetapi tampaknya, sampai tulisan ini dibuat, tidak ada satupun yang berfungsi. Saya berasumsi ini adalah karena beberapa perubahan terbaru dalam file distribusi Arduino IDE yang mereka andalkan.

Berjalan arduinoseperti di atas agak lambat, karena harus memuat Java, saya kira, tapi setidaknya itu berfungsi. Ada juga arduino-builderperintah yang datang dengan distribusi IDE Arduino. Pada tulisan ini, itu tidak cukup didokumentasikan dengan baik bagi saya untuk dapat mengetahui cara menggunakannya. Misalnya tidak ada contoh baris perintah di README atau tutorial yang saya temui, dan saya tidak tahu cara menggunakannya untuk mengunggah kode ke papan tulis. Namun, agaknya itu bisa memberi kita kompilasi lebih cepat daripada arduino. README juga menyebutkan dapat menggunakan kembali file objek dari kompilasi sebelumnya, jadi ada beberapa fungsi make-like.


Untuk melihat output serial saya menggunakan sesuatu seperti

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

Angka 1000000 harus sesuai dengan angka yang Anda berikan Serial.begin()dalam kode papan Anda. Anda juga dapat menggunakan screenjika Anda memiliki program papan yang interaktif tepat, atau Anda dapat menggunakan utilitas apa pun untuk menulis langsung ke perangkat. Ngomong-ngomong, hak saya muncul sebagai /dev/ttyACM0(bukan /dev/ttyUSB0untuk Uno).


1
Pastikan Anda memiliki satu *.inofile dalam direktori, karena sepertinya tidak perlu mengunggah yang disebutkan oleh --uploadparameter.
Chris Stryczynski

5

Yang Anda butuhkan adalah Makefile. Ada beberapa proyek Makefile di sekitar untuk Arduino. Googling untuk "Arduino Makefile" mengembalikan banyak hasil termasuk yang terlihat bagus di Github: https://github.com/sudar/Arduino-Makefile

Kompilasi dari baris perintah bukanlah hal sepele karena cara IDE Arduino menangani perpustakaan.

Setara dengan monitor serial IDE mungkin menghubungkan emulator terminal (misalnya layar) ke / dev / ttyACM0, kan?

Untuk monitor serial saya akan merekomendasikan minicom. Ini adalah emulator terminal yang berfungsi penuh (vt102) pada baris perintah.

minicom -D /dev/ttyACM0 -b 115200

... sebagai contoh.


1
Makefile ini pada dasarnya adalah versi yang dipertahankan dari jawaban yang diterima. Ada juga proyek templat di GitHub yang menunjukkan kepada Anda bagaimana cara mengaturnya: github.com/ladislas/Bare-Arduino-Project
Stefan van der Walt

2

Jika Anda menginginkan solusi yang sepenuhnya kompatibel untuk proyek Arduino Anda (ya, Anda dapat membagikan proyek Anda dengan orang lain yang menggunakan IDE Arduino biasa) Anda perlu memeriksa amake alat untuk menyederhanakan cli Arduino, saya menggunakannya dengan Geany tetapi yang lain menggunakannya dengan vi, Atom, dll.

Ini terinspirasi dan proyek Ino dan Arturo yang sekarang sudah mati; mohon 5 menit untuk mengujinya dan berikan umpan balik.

Contoh penggunaan:

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]

Ini memiliki beberapa lem pintar di sana, ia dapat mengingat papan dan file, dan bahkan mendeteksi secara otomatis usb papan; jadi setelah perintah "amake -v" berhasil, Anda dapat melakukan ini pada baris perintah dan itu akan berhasil.

amake -v
[to compile/verify your code]

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

Jika Anda menggunakan beberapa makro IDE, Anda dapat membuat kompilasi dan mengunggah perintah dengan mudah, misalnya menggunakan Geany IDE, itu akan menjadi:

  • Kompilasi / Verifikasi: cd% d; amake -v uno% f
  • Unggah: cd% d; amake -u uno% f

Anda bisa mendapatkan lebih banyak bantuan dengan menjalankan hanya "amake" atau "amake -h" setelah diinstal.

Juga, ini dapat mendukung SETIAP papan / lib / programmer yang telah Anda instal / konfigurasikan di Arduino IDE Anda, ya, papan modern seperti Adafuit Trinket M0 / Arduino M0 dll ...

Hanya jalankan IDE Arduino Anda, pergi ke manajer papan, instal dukungan dan itu saja, cukup ikuti beberapa instruksi sederhana dan Anda sudah siap.

Papan yang Anda miliki tidak didukung? tidak masalah, deteksi fqbn (baca file README.md) dan sampaikan sebagai nama papan.

Saya mencari penguji untuk menumbuhkan jumlah atau alias alias dan deteksi otomatis tanda tangan USB yang tepat.

Ingat ini adalah alat yang dikembangkan pribadi, sekarang dibagikan kepada publik, Anda tahu, hanya seorang programmer menggaruknya gatal ...

Bersulang.


2

Alat CLI resmi

Tim arduino sedang mengembangkan klien cli https://github.com/arduino/arduino-cli

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

Anda dapat melakukan hampir semua hal dengan ini, mulai dari mengunduh papan dan perpustakaan, hingga menyusun dan mengunggah skrip. Apa yang hilang adalah bagian pemantauan (Anda dapat menggunakan metode Metamorphic menggunakan stty cat, Berhasil!)

Perintahnya sangat mirip dengan jawaban Metamorphic karena alat ini bercabang dari yang itu

Instruksi di repo Github dan halaman manual:

    $ 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.
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.