Wie kompiliere, lade und überwache ich über die Linux-Kommandozeile?


18

Die Verbindung eines Arduino Uno (Hochladen usw.) mit der Arduino IDE (unter Verwendung des Fedora-Pakets) funktioniert unter Fedora 21 einwandfrei.

Aber ich möchte lieber vim + make + vim-quickfix-mode etc. verwenden.

Wie kann ich das machen?

Am besten über die Tools, die in den Fedora-Repositories verfügbar sind.

Ich gehe davon aus, dass die IDE externe Kommandozeilenprogramme zum Hochladen etc. aufruft.

Das Äquivalent zum seriellen Monitor der IDE ist wahrscheinlich der Anschluss eines Terminal-Emulators (zB screen) an /dev/ttyACM0, oder?

Vielleicht gibt es ein gutes Beispielprojekt, das man sich im Makefile anschauen kann?

Antworten:


7

Ich würde vorschlagen, für Makefile-Projekte zu googeln. Ich habe es vor einiger Zeit für das Programm Blink gemacht, indem ich im Grunde gesehen habe, was von der IDE generiert wurde, und das auf eine allgemeinere Art und Weise repliziert habe.

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

Sie müssten ARDUINO_DIRzumindest ändern , um zu berücksichtigen, wo Sie die IDE installiert haben. Wenn Sie andere Dinge wie die Wire-Bibliothek verwenden, müssen Sie sie etwas erweitern, um zusätzliche Bibliotheken zu kompilieren. Auch hier können Sie das verwenden, was die IDE selbst generiert, um Ihre Änderungen zu steuern.

Die Zeilen mit den führenden Leerzeichen benötigen das Tabulatorzeichen anstelle von Leerzeichen, wie es für ein Makefile üblich ist.


2
Ein Upload-Abschnitt in der make-Datei wäre auch nützlich, um die kompilierte Skizze auf das Arduino hochzuladen (mit avr-dude).
Gerben,

Das wäre auf jeden Fall nützlich. Da die IDE meine Anforderungen zum Kompilieren und Hochladen bisher erfüllt hat, bin ich nicht stark motiviert, herauszufinden, wie das geht. :)
Nick Gammon

Werfen Sie einen Blick auf die metamorphe Antwort für eine einfachere Lösung
Victor Lamoine

20

Ich benutze die Befehlszeilenschnittstelle für den arduinoBefehl .

Ich führe es so aus:

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

Es gibt eine Seite, auf der andere Befehlszeilentools wie beschrieben werden inotool. Diese Seite hat auch ein Beispiel Makefile. Diese Alternativen scheinen verlockend zu sein, aber anscheinend funktioniert zum jetzigen Zeitpunkt keine von ihnen. Ich gehe davon aus, dass dies auf einige kürzlich vorgenommene Änderungen in den Arduino IDE-Distributionsdateien zurückzuführen ist, von denen sie abhängen.

Das Laufen arduinowie oben ist etwas langsam, weil es Java laden muss, aber zumindest funktioniert es. Es gibt auch einen arduino-builderBefehl, der mit der Arduino IDE-Distribution geliefert wird. Zum Zeitpunkt des Schreibens war es nicht ausreichend dokumentiert, um herauszufinden, wie ich es verwenden soll. Zum Beispiel gibt es keine Beispielbefehlszeilen in der README-Datei oder in einem der Tutorials, auf die ich gestoßen bin, und ich konnte nicht herausfinden, wie man damit Code auf das Board hochlädt. Vermutlich ist es uns jedoch möglich, schneller zu kompilieren als arduino. In der README-Datei wird auch darauf hingewiesen, dass Objektdateien aus einer früheren Kompilierung wiederverwendet werden können.


Zum Anzeigen der seriellen Ausgabe verwende ich so etwas wie

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

Die Nummer 1000000 sollte mit der Nummer übereinstimmen, die Sie Serial.begin()in Ihrem Kartencode übergeben. Sie können auch screenein Board-Programm verwenden, das entsprechend interaktiv ist, oder Sie können ein beliebiges Hilfsprogramm verwenden, um direkt auf das Gerät zu schreiben. Übrigens, mein Due erscheint als /dev/ttyACM0(und nicht /dev/ttyUSB0für die Uno).


1
Stellen Sie sicher, dass Sie eine einzelne *.inoDatei im Verzeichnis haben, da diese nicht unbedingt die vom --uploadParameter angegebene Datei hochzuladen scheint .
Chris Stryczynski

5

Was Sie brauchen, ist ein Makefile. Es gibt einige Makefile-Projekte für Arduino. Das Googeln nach "Arduino Makefile" liefert viele Ergebnisse, einschließlich derjenigen, die auf Github gut aussehen: https://github.com/sudar/Arduino-Makefile

Das Kompilieren über die Befehlszeile ist nicht einfach, da die Arduino IDE Bibliotheken verarbeitet.

Das Äquivalent zum seriellen Monitor der IDE besteht wahrscheinlich darin, einen Terminalemulator (z. B. einen Bildschirm) an / dev / ttyACM0 anzuschließen, oder?

Für den seriellen Monitor würde ich minicom empfehlen. Es ist ein voll funktionsfähiger Terminalemulator (vt102) in der Befehlszeile.

minicom -D /dev/ttyACM0 -b 115200

... zum Beispiel.


1
Dieses Makefile ist im Wesentlichen eine gepflegte Version der akzeptierten Antwort. Auf GitHub gibt es auch ein Vorlagenprojekt, das Ihnen zeigt, wie Sie es einrichten: github.com/ladislas/Bare-Arduino-Project
Stefan van der Walt

2

Wenn Sie eine vollständig kompatible Lösung für Ihr Arduino-Projekt möchten (ja, Sie können Ihr Projekt mit anderen Personen teilen, die nur eine einfache Arduino-IDE verwenden), müssen Sie ein Tool auswählen , um die Benutzeroberfläche des Arduino zu vereinfachen. Ich verwende es jedoch mit Geany andere benutzen es mit vi, Atom, etc.

Es ist inspiriert und die mittlerweile toten Ino- und Arturo-Projekte; Bitte nehmen Sie sich 5 Minuten Zeit, um es zu testen und geben Sie uns Feedback.

Beispiel Verwendung:

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]

Es hat einen intelligenten Klebstoff, es kann sich an die Platine und die Datei erinnern und sogar den USB-Anschluss der Platine automatisch erkennen. Nach einem erfolgreichen "amake -v" -Befehl können Sie dies in der Befehlszeile tun und es wird funktionieren.

amake -v
[to compile/verify your code]

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

Wenn Sie einige IDE-Makros verwenden, können Sie die Kompilierungs- und Upload-Befehle einfach erstellen, beispielsweise mit Geany IDE:

  • Kompilieren / Überprüfen: cd% d; amake -v uno% f
  • Upload: cd% d; amake -u uno% f

Sie können mehr Hilfe bekommen, wenn Sie "amake" oder "amake -h" einmal installiert haben.

Außerdem kann es JEDES Board / jede Bibliothek / jeden Programmierer unterstützen, die / den Sie in Ihrer Arduino IDE installiert / konfiguriert haben, ja, modernes Board wie das Adafuit Trinket M0 / Arduino M0 usw.

Feuern Sie einfach Ihre Arduino IDE, gehen Sie zum Board Manager, installieren Sie Support und das ist alles. Folgen Sie einfach ein paar einfachen Anweisungen und schon sind Sie fertig.

Das Board, das Sie haben, wird nicht unterstützt? Kein Problem, erkennen Sie den fqbn (lesen Sie die README.md-Datei) und geben Sie ihn als Board-Namen weiter.

Ich bin auf der Suche nach Testern, um die Anzahl der Board-Aliase und die automatische Erkennung der richtigen USB-Signaturen zu erhöhen.

Denken Sie daran, dies ist ein privat gewachsenes Werkzeug, das jetzt der Öffentlichkeit zur Verfügung gestellt wird. Es ist nur ein Programmierer, der sich am Juckreiz kratzt ...

Prost.


2

Offizielles CLI-Tool

Das Arduino-Team entwickelt einen Cli- Client https://github.com/arduino/arduino-cli

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

Sie können damit fast alles tun, vom Herunterladen von Boards und Bibliotheken bis zum Kompilieren und Hochladen von Skripten. Was fehlt, ist der Überwachungsteil (Sie können die Methode von Metamorphic verwenden stty cat, es funktioniert!)

Die Befehle sind der Antwort von Metamorphic sehr ähnlich, da sich dieses Tool aus diesem heraus verzweigt

Anleitung im Github-Repo und in der Manpage:

    $ 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.
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.