Comment compiler, télécharger et surveiller via la ligne de commande Linux?

19

L'interface d'un Arduino Uno (téléchargement, etc.) avec l'Arduino IDE (à l'aide du package Fedora) fonctionne correctement sous Fedora 21.

Mais je veux plutôt utiliser vim + make + vim-quickfix-mode etc.

Comment puis je faire ça?

De préférence via les outils disponibles dans les référentiels Fedora.

Je suppose que l'EDI appelle des utilitaires de ligne de commande externes pour le téléchargement, etc.

L'équivalent du moniteur série de l'IDE est probablement de connecter un émulateur de terminal (par exemple screen) à /dev/ttyACM0, non?

Peut-être y a-t-il un bon exemple de projet que l'on peut regarder dans le makefile?

maxschlepzig
la source

Réponses:

7

Je suggérerais de googler pour les projets Makefile. J'en ai fait un il y a quelque temps pour le programme Blink, en voyant essentiellement ce qui a été généré par l'IDE et en le reproduisant de manière plus générale.

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

Vous devrez ARDUINO_DIRau moins changer pour refléter où vous avez installé l'IDE. Si vous utilisez d'autres choses comme la bibliothèque Wire, vous devrez l'étendre quelque peu pour compiler des bibliothèques supplémentaires. Encore une fois, vous pouvez utiliser ce que l'EDI génère lui-même pour guider vos modifications.

Les lignes avec les espaces de tête ci-dessus auraient besoin du caractère de tabulation au lieu d'espaces, comme c'est normal pour un Makefile.

Nick Gammon
la source
2
Une section de téléchargement dans le fichier make serait également utile pour télécharger le croquis compilé sur l'arduino (en utilisant avr-dude).
Gerben
Ce serait certainement utile. Cependant, jusqu'à présent, l'IDE a répondu à mes besoins de compilation et de téléchargement, je ne suis pas fortement motivé pour trouver comment le faire. :)
Nick Gammon
Jetez un œil à la réponse métamorphique pour une solution plus simple
Victor Lamoine
20

J'utilise l' interface de ligne de commande pour la arduinocommande .

Je le lance comme ceci:

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

Il y a une page qui décrit d'autres outils de ligne de commande, comme inotool. Cette page contient également un exemple Makefile. Ces alternatives semblent séduisantes, mais apparemment, au moment de la rédaction de cet article, aucune d'entre elles ne fonctionne. Je suppose que cela est dû à des changements récents dans les fichiers de distribution Arduino IDE dont ils dépendent.

Exécuter arduinocomme ci-dessus est un peu lent, car il doit charger Java, je suppose, mais au moins cela fonctionne. Il existe également une arduino-buildercommande fournie avec la distribution Arduino IDE. Au moment de la rédaction de ce document, il n'était pas suffisamment bien documenté pour que je puisse comprendre comment l'utiliser. Par exemple, il n'y a pas d'exemple de ligne de commande dans le README ou dans l'un des didacticiels que j'ai rencontrés, et je n'ai pas pu comprendre comment l'utiliser pour télécharger du code sur la carte. Cependant, il est vraisemblablement capable de nous donner une compilation plus rapide que arduino. Le fichier README mentionne également la possibilité de réutiliser les fichiers objets d'une compilation précédente, il existe donc des fonctionnalités de création.


Pour afficher la sortie série, j'utilise quelque chose comme

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

Le nombre 1000000 doit correspondre au numéro auquel vous passez Serial.begin()dans votre code de carte. Vous pouvez également l'utiliser screensi vous avez un programme de carte qui est suffisamment interactif, ou vous pouvez utiliser n'importe quel utilitaire pour écrire directement sur l'appareil. Au fait, mon Due apparaît comme /dev/ttyACM0(plutôt que /dev/ttyUSB0pour l'Uno).

Métamorphique
la source
1
Assurez-vous d'avoir un seul *.inofichier dans le répertoire, car il ne semble pas nécessairement télécharger celui mentionné par le --uploadparamètre.
Chris Stryczynski
5

Ce dont vous avez besoin est un Makefile. Il y a quelques projets Makefile pour Arduino. Googler pour "Arduino Makefile" renvoie de nombreux résultats, y compris ce qui ressemble à un bon sur Github: https://github.com/sudar/Arduino-Makefile

La compilation à partir de la ligne de commande n'est pas anodine en raison de la façon dont l'IDE Arduino gère les bibliothèques.

L'équivalent du moniteur série de l'IDE est probablement de connecter un émulateur de terminal (par exemple un écran) à / dev / ttyACM0, non?

Pour le moniteur série, je recommanderais minicom. Il s'agit d'un émulateur de terminal entièrement fonctionnel (vt102) sur la ligne de commande.

minicom -D /dev/ttyACM0 -b 115200

... par exemple.

Majenko
la source
1
Ce Makefile est essentiellement une version maintenue de la réponse acceptée. Il existe également un projet de modèle sur GitHub qui vous montre comment le configurer: github.com/ladislas/Bare-Arduino-Project
Stefan van der Walt
2

Si vous voulez une solution entièrement compatible pour votre projet arduino (oui, vous pouvez partager votre projet avec d' autres personnes qui utilisent tout simplement Arduino IDE) vous devez vérifier amake un outil pour simplifier la cli du arduino, je l' utilise avec Geany mais d'autres l'utilisent avec vi, Atom, etc.

C'est inspiré et les projets Ino et Arturo maintenant morts; veuillez prendre 5 minutes pour le tester et donner vos commentaires.

Exemple d'utilisation:

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]

Il contient de la colle intelligente, il peut se souvenir de la carte et du fichier, et même détecter automatiquement l'USB de la carte; donc après une commande "amake -v" réussie, vous pouvez le faire sur la ligne de commande et cela fonctionnera.

amake -v
[to compile/verify your code]

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

Si vous utilisez des macros IDE, vous pouvez facilement créer les commandes de compilation et de téléchargement, par exemple en utilisant Geany IDE, cela deviendra:

  • Compiler / vérifier: cd% d; amake -v uno% f
  • Téléchargement: cd% d; amake -u uno% f

Vous pouvez obtenir plus d'aide pour exécuter simplement "amake" ou "amake -h" une fois installé.

En outre, il peut prendre en charge CHAQUE carte / lib / programmeur que vous avez installé / configuré dans votre Arduino IDE, oui, une carte moderne comme Adafuit Trinket M0 / Arduino M0 etc ...

Allumez simplement votre IDE Arduino, allez dans le gestionnaire de carte, installez le support et c'est tout, mais suivez quelques instructions simples et vous êtes prêt.

La carte que vous avez n'est pas prise en charge? pas de problème, détectez le fqbn (lisez le fichier README.md) et passez-le comme nom de carte.

Je recherche des testeurs pour augmenter le nombre ou les alias de carte et la détection automatique des signatures USB appropriées.

N'oubliez pas qu'il s'agit d'un outil développé par des particuliers, maintenant partagé avec le public, vous savez, juste un programmeur qui gratte ses démangeaisons ...

À votre santé.

Pavel Milanes Costa
la source
2

Outil CLI officiel

L'équipe arduino développe un client cli https://github.com/arduino/arduino-cli

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

Vous pouvez presque tout faire avec cela, du téléchargement de tableaux et de bibliothèques à la compilation et au téléchargement de scripts. Ce qui manque, c'est la partie surveillance (vous pouvez utiliser la méthode de Metamorphic en utilisant stty cat, ça marche!)

Les commandes sont très similaires à la réponse de Metamorphic puisque cet outil se dérive de celui-là

Instructions dans le dépôt Github et la page de manuel:

    $ 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.
Madacol
la source