Ich möchte eine Skizze schreiben, die auf verschiedenen Arduino-Boards kompiliert werden kann. Ich möchte auf dem PC anzeigen, welche Karte gerade angeschlossen ist.
Dies bedeutet, dass der Benutzer den PC über ein USB-Kabel mit dem Arduino / Teensy-Board verbindet, auf dem meine Skizze ausgeführt wird, und dem PC über Serial mitteilt, welches Board angeschlossen ist. Auf dem PC läuft meine C # -Anwendung, die diese Daten empfängt und anzeigt.
Deshalb brauche ich die Tafel, die beim Erstellen der Skizze ausgewählt wurde:
Ich habe den Code auf https://github.com/backupbrain/ArduinoBoardManager gefunden, aber er liefert keine korrekten Ergebnisse (abgesehen von der Tatsache, dass mehrere Boards fehlen).
Hier ein Ausschnitt aus dem Code:
static const uint8_t BOARD_MICRO= 0x04;
....
#elif defined(__AVR_Atmega32U4__) // Yun 16Mhz, Micro, Leonardo, Esplora
static const uint8_t BOARD = 0x04;
static const uint8_t NUM_BITS = 8;
static const uint16_t CPU = __AVR_Atmega32U4__;
static const unsigned long SRAM_SIZE = 2500;
static const unsigned long EEPROM_SIZE = 1000;
static const unsigned long FLASH_SIZE = 32000;
#elif defined(.....
Dieser Code liefert also dasselbe Ergebnis (BOARD = 0x04 = Micro) für Yun 16MHz, Micro, Leonardo und Esplora.
Gibt es eine Möglichkeit, in meinem C-Code genau die Zeichenfolge abzurufen, die der Benutzer im Menü des Arduino-Compilers ausgewählt hat?
Antworten:
Dank der Hilfe von Charlie Hanson und jantje habe ich die universelle Lösung gefunden!
Da es schade ist, dass jeder Arduino-Programmierer denselben Schmerz durchmachen muss, um herauszufinden, wie er an den Board-Namen kommt, biete ich meinen Code der Öffentlichkeit an, damit jeder ihn einfach kopieren und einfügen kann.
Hier ist es:
Sie können diesen Code sogar in eine neue Header-Datei einfügen und # in Ihr Projekt einbinden.
PD Wenn Sie zusätzlich zur Karte auch das CPU-Modell kennen wollen, suchen Sie die Datei avr_cpunames.h
quelle
Beachten Sie, dass dies ein Windows-Mod ist, der unter Linux ähnlich sein muss.
Der erste ist schnell und einfach. Ändern Sie einfach die von Ihnen verwendeten platform.txt-Dateien wie unten beschrieben. Dies hat den Nachteil, dass Sie die platform.txt-Dateien mit jeder Version ändern müssen.
Füge -DBOARD = \ "$ {build.board} \" zum Rezept hinzu. Dies ermöglicht
Was gibt Ihnen die Zeichenfolge "ARDUINO_AVR_LEONARDO" (für den Leonardo) in Boardname.
Die zweite Möglichkeit besteht darin, auf eine bessere IDE zu wechseln (wie bereits von anderen vorgeschlagen). Als Entwickler des Arduino Eclipse Plugins würde ich empfehlen, das Arduino Eclipse Plugin zu verwenden. Im Arduino Eclipse Plugin machen Sie dies wie folgt: Klicken Sie mit der rechten Maustaste auf das Feld "Kompilieroptionen"
im Feld Anhängen an C und C ++.
Dadurch wird der obige Code kompiliert
Adendum
Mir war nicht bewusst, dass Sie den "schönen Namen" wollten. Ich bin nicht sicher, ob dies in der platform.txt in Arduino IDE behoben werden kann. Ändern Sie im Arduino Eclipse-Plugin das Fixe oben in
um den schönen Namen (für den Leonardo "Arduino Leonardo") im Define Board zu bekommen.
quelle
Die genauen Namen im Menü stammen aus der Datei boards.txt in Ihrer Arduino IDE (Arduino \ hardware \ arduino \ avr \ boards.txt). Ich denke, Sie müssten die Datei selbst analysieren und die erkannte Karte dort finden.
quelle
Ich habe vor einiger Zeit eine verwandte Frage gestellt .
Es ist eine interne * .h-Datei vorhanden, die von der IDE erstellt wird und den ausgewählten Kartentyp enthält. Die Liste der möglichen Optionen ist in der verknüpften Frage angegeben, jedoch nur für AVR-Karten. Ich glaube, die Nicht-AVR-Liste ist viel kürzer.
Es müssen lediglich einige bedingte Anweisungen hinzugefügt werden, um die richtigen Informationen an den PC zu senden. Ein einfaches Beispiel:
Wenn Sie sich in der Skizze mehrmals auf den Kartentyp beziehen müssen, verwenden Sie das folgende Format:
Letzteres ist viel aufgeräumter, auch wenn Sie es nur
__BOARD_TYPE
einmal benötigen , da es den umständlichen#ifdef
Teil Ihrer Funktionen entfernt.Sie müssen natürlich eine für jedes Board schreiben, von dem Sie erwarten, dass es Ihrem Endbenutzer zur Verfügung steht, und Sie müssen diese Liste möglicherweise aktualisieren, sobald neue Modelle erscheinen.
quelle
Die ursprüngliche Antwort ist veraltet, da neue Boards hinzugefügt wurden. Der Basistest ist korrekt, aber es ist nicht klar, woher die Liste der Boards stammt.
Wenn Sie die
boards.txt
Datei suchen und sie durchsehen (z. B.~\Library\Arduino\hardware\arduino\avr\boards.txt
auf einem Mac), hat jedes Board einen Eintrag in der Art von<BOARD>.build.board=<NAME>
, sodass der MKR1000 beispielsweise eine Zeile hat:mkr1000.build.board=SAMD_MKR1000
Das entsprechende #define kann durch das Präfix
<NAME>
mit erzeugt werden,ARDUINO_
so dass in diesem Beispiel der folgende Code für eine MKR1000-Karte fehlerhaft ist ...#if defined(ARDUINO_SAMD_MKR1000) #error
quelle