Im letzten Jahr habe ich ziemlich viel Code für Arduino geschrieben und gleichzeitig mehrere Entwicklungstools geändert. Der Artikel erwähnt die Optionen, die ich ausprobiert habe, und detaillierter, worüber ich angehalten habe. Es geht um eine Reihe von Tools für den Fall, dass> 10 Projekte für verschiedene Boards und ein wenig um die Entwicklung und Installation von Bibliotheken.Entwicklungsumgebung
Was ist das Problem?
Wahrscheinlich, weil Arduino sich nicht auf professionelle Entwickler konzentriert, zeichnet sich das Ökosystem um die Standard-IDE durch das Fehlen der für mich üblichen Tools aus:- Nur in neueren Versionen wurde eine Art Bibliotheksverwaltung eingeführt, während ohne die Ähnlichkeit von Gemfile / require.txt / package.json für das Projekt nicht angegeben werden kann, welche Versionen verwendet werden
- Keine Integration mit Git oder anderen VCS
- Ein Texteditor ist nicht mit meinem bevorzugten Texteditor zu vergleichen
- Es gibt keine Möglichkeit, die Board-Auswahl im Projekt zu speichern
- unbequeme Ausgabe von Kompilierungsfehlern
Die Arduino-Website enthält eine Liste alternativer Entwicklungswerkzeuge . In dieser Liste gibt es Optionen, die ich aus verschiedenen Gründen nicht ausprobiert habe. Beispielsweise haben Atmel Studio und Visual Studio CE dies nicht berücksichtigt. Ich wollte ein Tool finden, das die Arbeit über die Befehlszeile unterstützt.Was versucht
Ino
Ino - ein Projekt der russischen Firma Amperka, einem Befehlszeilenprogramm für die Arduino-Firmware.Das Projekt war sehr beliebt,> 200 Gabeln. Das letzte Commit war im April 2014, daher funktioniert es nicht mit den neuesten Versionen der IDE (es scheint seit 1.5).Es gibt eine lebende Gabel von Arturo , ich habe sie ein wenig benutzt, aber in einigen exotischen Fällen gab es Probleme.Arduino-Makefile
Arduino-Makefile - kompilieren und herunterladen mit make. Arduino Due, Zero und andere 32-Bit-Karten werden nicht unterstützt. Der Unterschied zur Standard-IDE besteht darin, dass die Methoden vor der Verwendung deklariert werden müssen. Wenn Sie also fertige Projekte übertragen, müssen Sie möglicherweise die Quelle bearbeiten. Wenn ich mich richtig erinnere, konnte ich mich mit Arduino-Makefile und SparkFun Pro Micro nicht anfreunden.Was ich benutze
PlatformIO
PlatformIO ist ein hervorragendes Projekt, das von Entwicklern aus der Ukraine erstellt wurde. Es enthält ein Befehlszeilenprogramm, mit dem Sie Programme kompilieren und in mehrere Mikrocontrollerfamilien herunterladen können (Atmel AVR, Atmel SAM, ST STM32, TI MSP430 und andere). Gleichzeitig werden verschiedene Bibliotheksgruppen unterstützt (auf der PlatformIO-Website werden sie als Frameworks bezeichnet): Arduino, Energia, mbed sowie nativer Code für Atmel AVR, espressif, MSP430.PlatformIO war ursprünglich darauf ausgerichtet, über die Befehlszeile zu arbeiten. Es gibt auch Plugins für die Integration in Texteditoren und IDEs: Atom, CLion, Eclipse, Emacs, NetBeans, Qt Creator, Sublime Text, Vim und Visual Studio.PlatformIO eignet sich besonders für:- ein Projekt für mehrere Boards, d.h. Der gleiche Code sollte für verschiedene Karten kompiliert werden
- , .. ,
- ssh, PlatformIO Raspberry Pi

Arduino
Ich werde die Dokumentation nicht nacherzählen. Hier finden Sie die Installationsanweisungen. Weitere Informationen finden Sie im Abschnitt Schnellstart .Die Ordnerstruktur des Projekts für PlatformIO unterscheidet sich vom Arduino IDE-Projekt. Jedes Projekt enthält eine platformio.ini-Datei, in der angegeben ist, welche Boards verwendet werden. Sie müssen also nicht jedes Mal das richtige Board auswählen.Ich werde Ihnen ein Beispiel geben, wie ich PlatformIO beim Entwickeln einer Bibliothek für Arduino verwende. Die Bibliothek verfügt über zwei Beispiele, von denen jedes ein Projekt im PlatformIO-Format ist. In der Projekteinstellungsdatei platformio.ini sind alle Karten aufgeführt, auf denen die Bibliothek ausgeführt werden soll:[env:nanoatmega328]
platform = atmelavr
framework = arduino
board = nanoatmega328
[env:sparkfun_promicro16]
platform = atmelavr
framework = arduino
board = sparkfun_promicro16
[env:due]
platform = atmelsam
framework = arduino
board = due
[env:teensy31]
platform = teensy
framework = arduino
board = teensy31
[env:nodemcu]
platform = espressif
framework = arduino
board = nodemcu
[env:uno]
platform = atmelavr
framework = arduino
board = uno
Mit dem Befehl können Sie ein Beispiel für alle Karten kompilieren:platformio run
Sie können nur für uno wie folgt kompilieren:platformio run -e uno
Laden Sie die Firmware auf uno herunter:platformio run --target upload -e uno
Starten Sie den Monitor für die serielle Schnittstelle:platformio serialports monitor
Aliase zu .zshrc hinzugefügt, um die Befehle zu verkürzen:alias compile="platformio run"
alias upload="platformio run --target upload"
alias serial="platformio serialports monitor"
Mit ihnen die gleiche Abfolge von Aktionen:compile
compile -e uno
upload -e uno
serial
Es gibt auch eine Integration mit Travis CI und anderen CI-Tools. Weitere Details finden Sie hier .Eigentlich hat die Arduino IDE eine Befehlszeilenschnittstelle , aber sie ist alles andere als perfekt.PlatformIO Nuances
PlatformIO beschleunigt die Arbeit, ist im Vergleich zur Arduino IDE flexibler und erleichtert die Automatisierung von Routineaufgaben. Es sind mehrere Punkte zu beachten:- Das Kompilieren in PlatformIO entspricht nicht immer dem Kompilieren in Arduino IDE. Was in PlatformIO kompiliert wurde, wird möglicherweise nicht in Arduino IDE kompiliert und umgekehrt
- Die Struktur des Projektordners stimmt nicht mit der Struktur für Arduino IDE überein
- Nicht alle Bibliotheken können über platformio lib installiert werden
Serial.print ("Könnte besser sein");
Was ist das Problem?
Der Standard Serial.print () ist etwas unpraktisch, wenn Sie denNamen und den Wert der Variablen drucken müssen , um beispielsweise "pin_2 = <state pin 2>, pin_3 = <state pin 3>" anzuzeigen. Dazu müssen Sie Folgendes tun:Serial.print("pin_2 = ");
Serial.print(digitalRead(2));
Serial.print(", pin_3 = ");
Serial.println(digitalRead(3));
Trotzdem möchte ich manchmal die Ausgabe für die Serie teilweise oder vollständig deaktivieren, zum Beispiel, wenn sie nur zum Debuggen verwendet wird. Natürlich können Sie dazu Aufrufe von Serial.print () kommentieren, aber ich hätte gerne eine elegantere Option.Was versucht
arduinoLogging
Diese Bibliothek verwendet eine printf-ähnliche Syntax zum Drucken und ermöglicht es Ihnen, LOGLEVEL festzulegen und somit die Ausgabe einiger oder aller Nachrichten zu deaktivieren. Nachrichten werden mit den Methoden Error, Info, Debug und Verbose angezeigt.Ein Beispiel: #include "Logging.h"
#define LOGLEVEL LOG_LEVEL_INFOS
void setup() {
Serial.begin(9600);
Log.Init(LOGLEVEL, &Serial);
Log.Info("pin_2 = %d, pin_3 = %d"CR, digitalRead(2), digitalRead(3));
Log.Debug(" , LOGLEVEL = LOG_LEVEL_INFOS");
}
Verfügbare Modifikatoren
Platzhalter | Kommentar | Beispiel |
---|
% s | replace with an string (char*) | Log.Info("String %s", myString); |
%c | replace with an character | Log.Info("use %c as input", myChar) |
%d | replace with an integer value | Log.Info("current value %d",myValue); |
%l | replace with an long value | Log.Info("current long %l", myLong); |
%x | replace and convert integer value into hex | Log.Info ("as hex %x), myValue); |
%X | like %x but combine with 0x123AB | Log.Info ("as hex %X), myValue); |
%b | replace and convert integer value into binary | Log.Info ("as bin %b), myValue); |
%B | like %x but combine with 0b10100011 | Log.Info ("as bin %B), myValue); |
%t | replace and convert boolean value into "t" or "f" | Log.Info ("is it true? %t), myBool); |
%T | like %t but convert into "true" or "false" | Log.Info ("is it true? %T), myBool); |
advancedSerial
Die Namen der Nachrichtenebenen Fehler, Info, Debug und Ausführlich in arduinoLogging sind nicht neutral. Ein Fehler führt nicht unbedingt zu einem Fehler, sondern ist nur eine Meldung, die auf einer beliebigen LOGLEVEL angezeigt wird (außer NOOUTPUT).Angesichts der Unannehmlichkeiten von printf habe ich meine eigene Version, advancedSerial, geschrieben .AdvancedSerial besteht eigentlich aus zwei Dingen: der Möglichkeit, print () und println () in der Ketten- und Nachrichtenebene aufzurufen. int a = 1;
int b = 2;
aSerial.print("a = ").print(a).print("b = ").println(b);
aSerial.p("a = ").p(a).p("b = ").pln(b);
Vollständiges Beispiel für Basic.inoDa die Namen der Methoden mit den Namen der Standardmethoden Serial.print () und Serial.println () übereinstimmen, können Sie Serial in den Quellen optional durch aSerial ersetzen.Für den Namen der Nachrichtenebenen habe ich v, vv, vvv, vvvv gewählt, eine ziemlich übliche Methode, um die Detailebenen der angezeigten Nachrichten anzugeben, die normalerweise als Flags -v, -vv usw. zu finden sind.Mit diesen Namen ist es einfacher, eine Ebene in eine andere zu bearbeiten. Beispielsweise ist vv -> vvv einfacher als Info -> Debug. #include "advancedSerial.h"
void setup() {
Serial.begin(9600);
aSerial.setPrinter(Serial);
aSerial.setFilter(Level::vv);
}
void loop() {
aSerial.l(Level::vv).pln(" ");
aSerial.l(Level::vvv).pln(" ");
delay(3000);
}
Vollständiges Beispiel für Advanced.inoSpeicherplatz sparen
Wenn Sie die Zeichenfolge in das Makro F () einschließen, wird sie nicht in den Speicher (SRAM) geladen. Verwenden Sie daher F (), um Speicher zu sparen: aSerial.print(F(" 16 "));
Natürlich hat die Verwendung von advancedSerial im Vergleich zur Standard-Seriennummer zu einem gewissen Overhead geführt. Ich habe versucht, grob abzuschätzen, welche. Im Folgenden präsentiere ich die Kompilierungsergebnisse für Arduino Uno, da es 2 KB Speicher hat und dies das Minimum unter den Boards ist, die ich normalerweise benutze.Normale Serien ohne Bibliotheken: void setup() {
Serial.begin(9600);
}
void loop() {
Serial.print("test");
Serial.println("test");
}
Speicherplatz: 5%dynamischer Speicher: 9%AdvancedSerial: #include <advancedSerial.h>
void setup() {
Serial.begin(9600);
aSerial.setPrinter(Serial);
aSerial.setFilter(Level::vv);
}
void loop() {
aSerial.print("test").println("test");
}
Speicherplatz: 5%dynamischer Speicher: 10%Beispiele / Advanced.ino-Speicherplatz: 9%dynamischer Speicher: 26%Beispiele / Advanced.ino unter Verwendung des Makrospeicherplatzes F (): 9%dynamischer Speicher: 10%Es stellt sich heraus, dass der Speicher belegt ist steigt leicht an. AdvancedSerial ist jedoch keine optimale Lösung in Bezug auf Ressourcen. Es gibt alternative Implementierungen, z. B. Debug .Bibliotheksinstallation
Was ist das Problem?
Standardmäßig installiert die Arduino IDE Bibliotheken global und in der Skizze wird nicht genau aufgezeichnet, welche Bibliotheken verwendet werden (mit Ausnahme der Direktiven #include natürlich) und welche Versionen. Aus diesem Grund müssen Sie zum Kompilieren der Skizze auf einem anderen Computer wissen, wo die erforderlichen Bibliotheken heruntergeladen werden müssen. Auch hier müssen die Bibliotheksversionen angegeben werden. Um solche Probleme zu vermeiden, installiere ich Bibliotheken nur lokal im Skizzenordner. Im Folgenden finden Sie zwei Möglichkeiten, Bibliotheken für die Arduino IDE und PlatformIO lokal zu installieren.Arduino IDE
Ich benutze selten die Arduino IDE, vielleicht gibt es einen besseren Weg. Die Methode lautet wie folgt: Installieren Sie Bibliotheken in einem Unterordner Ihres Projekts und platzieren Sie Symlinks (Verknüpfungen?) Für jede Bibliothek im Bibliotheksordner (in dem Ordner, in dem die Arduino IDE-Bibliotheken installiert sind).Übrigens, wenn ich mich richtig erinnere, kompiliert die Arduino IDE beim Kompilieren einer Skizze alle Bibliotheken aus dem Bibliotheksordner, sodass sich die Kompilierungszeit erhöht, wenn sich viele Bibliotheken in Bibliotheken befinden. Ein weiterer Grund, die Arduino IDE nicht zu verwenden.PlatformIO
Jedes PlatformIO-Projekt verfügt über einen lib-Unterordner, in den Bibliotheken eingefügt werden können. Dies ist bei der manuellen Installation von Bibliotheken der Fall. PlatformIO verfügt auch über einen separaten Befehl zum Installieren der platformio lib-Bibliotheken. Leider werden Bibliotheken standardmäßig global installiert, sodass die Bibliotheken lokal im lib-Unterordner installiert werden. Sie müssen sie im Projekt platformio.ini hinzufügen:[platformio]
lib_dir = ./lib
Weitere Informationen zu platformio lib finden Sie in der Dokumentation .