Wie kann ich feststellen, welche Arduino-Karte (oder welcher Controller) in der Software?

14

Ich habe ein Projekt, an dem ich entweder an einem Uno oder einem Mega (oder sogar an einem Due) arbeiten möchte, und es wäre schön, wenn ich nicht zwei Versionen der Software bräuchte. Zum Beispiel müssen Sie bei einem Mega-Gerät zur Verwendung von SoftwareSerial andere Stifte als bei einem Uno-Gerät verwenden. Siehe die Dokumentation zu Software Serial . Auf jeden Fall wäre es schön zu erkennen, dass ich ein Uno verwende, damit ich nur die Pins 4 und 5 für TX / RX verwenden kann. Wenn ich ein Mega verwende, erkennt die Software die Pins 10 und 11 (und von) und verwendet sie nur Natürlich muss ich es anders verkabeln, aber zumindest wird die Software dieselbe sein.

tooshel
quelle

Antworten:

16

Laufzeit

Meines Wissens können Sie den Kartentyp nicht erkennen, aber Sie können die ATmega-Geräte-ID lesen. Überprüfen Sie diese Frage, wie es getan werden kann: Kann eine ATmega- oder ATtiny-Gerätesignatur während des Betriebs gelesen werden? Beachten Sie jedoch, dass sich bei Verwendung dieser Methode mehrere Registerzuweisungen ändern, nicht nur die Pinbelegung. Daher kann Ihr Code erheblich komplexer werden. Der Vorteil ist, dass Sie , wenn Sie es schaffen, alle sich ändernden Registerzuordnungen und andere Hardware-Abhängigkeiten zu umgehen, eine einzige .hex-Datei verwenden können, um Ihre Geräte direkt zu programmieren avrdude.

Kompilierzeit

Eine andere Möglichkeit, den Typ der Karte / Steuerung herauszufinden, ist die Kompilierungszeit. Grundsätzlich kompilieren Sie Teile des Codes oder stellen Makros ein, abhängig vom in der Arduino IDE konfigurierten Gerätetyp. Überprüfen Sie dieses Code-Sniplet für ein Beispiel:

#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
#define DEBUG_CAPTURE_SIZE 7168
#define CAPTURE_SIZE 7168
#elif defined(__AVR_ATmega328P__)
#define DEBUG_CAPTURE_SIZE 1024
#define CAPTURE_SIZE 1024
#else
#define DEBUG_CAPTURE_SIZE 532
#define CAPTURE_SIZE 532
#endif

Das Code-Sniplet wurde schamlos kopiert https://github.com/gillham/logic_analyzer/wiki Überprüfen Sie den Code auf weitere gerätespezifische Tricks.

Abhängig vom Betriebssystem Ihres Hosts finden Sie die unterstützten Controllertypen in der folgenden Datei:

  • Linux: /usr/lib/avr/include/avr/io.h
  • Windows: ...\Arduino\hardware\tools\avr\avr\include\avr\io.h

Die Verwendung des C-Präprozessors (mit dem der obige Code verarbeitet wird) ist für diese Site möglicherweise nicht zulässig. http://stackoverflow.com wäre der bessere Ort für detaillierte Fragen.

Wenn Sie unter Linux arbeiten, können Sie leicht alle unterstützten Controllertypen finden, indem Sie Folgendes eingeben:

grep 'defined (__AVR' /usr/lib/avr/include/avr/io.h | sed 's/^[^(]*(\([^)]*\))/\1/'
jippie
quelle
.. \ Arduino \ hardware \ tools \ avr \ avr \ include \ avr \ io.h für Windows
mpflaga
@mpflaga Ich habe die Antwort aktualisiert. Vielen Dank für Ihre Eingabe.
jippie
Alle AVR-spezifischen vordefinierten Makros sind in der avr-libc-Dokumentation aufgeführt .
Ignacio Vazquez-Abrams
Wie erhält die Arduino-IDE die Board-Informationen? ( Tools > Get Board Info) Ich hatte gehofft, eine String-Prüfung über eine serielle Verbindung durchzuführen, damit der richtige COM-Port automatisch ausgewählt werden kann, wenn meine Anwendung gestartet wird. Weil natürlich die IDE dies kann, eine Idee, wenn sie die oben genannten Methoden verwenden?
4.
@ n00dles Die oben beschriebenen Methoden unterscheiden sich von den gewünschten. Es ist wahrscheinlich eine eigene Frage auf Arduino.SE wert. Ich kann die Get Board Info nicht überprüfen, sie ist nicht in der von mir zur Verfügung gestellten Arduino-Version.
jippie
6

Wie in der Arduino-Hardwarespezifikation angegeben , definiert die Arduino-IDE jetzt ein Makro für jede Karte, wie in der build.boardEigenschaft boards.txt definiert . Dieser Wert wird angehängt, ARDUINO_damit beispielsweise folgende Makros für die Boards angezeigt werden, an denen Sie interessiert sind:

  • Uno: ARDUINO_AVR_UNO
  • Mega 2560: ARDUINO_AVR_MEGA2560
  • Fällig: ARDUINO_SAM_DUE

Beispiel, wie Sie diese Makros in Ihrem Code verwenden können:

#if defined(ARDUINO_AVR_UNO)
//Uno specific code
#elif defined(ARDUINO_AVR_MEGA2560)
//Mega 2560 specific code
#elif defined(ARDUINO_SAM_DUE)
//Due specific code
#else
#error Unsupported hardware
#endif
per1234
quelle
Ich würde sagen, dies ist die einfachste und direkteste Antwort auf die Frage. Ich wünschte, es wäre das Akzeptierte.
Erutan409
4

Eine einfache Möglichkeit zum Board-Sniffing ist die Verwendung einer Bibliothek wie ArduinoManager. Hiermit können Sie sehr einfach den Namen und die Funktionen des Boards ermitteln https://github.com/backupbrain/ArduinoBoardManager abrufen

Es verwendet die oben beschriebene Technik, um viele Informationen zu fast jedem Arduino-Board anzuzeigen. Daher eignet es sich hervorragend, um Projekte zu erstellen, die in vielen verschiedenen Umgebungen bereitgestellt werden können.

Einfach herunterladen und in Ihr Arduino-Projekt einbinden.

#include "ArduinoBoardManager.h"

ArduinoBoardManager arduino = ArduinoBoardManager(); // required if you want to know the board name and specific features

void setup() {
  Serial.begin(9600);

  Serial.print("Board is compatible with Arduino ");
  Serial.println(arduino.BOARD_NAME);

  Serial.println("Speed/SRAM/Flash: ");
  Serial.print(ArduinoBoardManager::MAX_MHZ);
  Serial.println(ArduinoBoardManager::SRAM_SIZE);
  Serial.println(ArduinoBoardManager::FLASH_SIZE);

  // Board features (multiple serial ports on Mega, for example)
  if (arduino.featureExists(ArduinoBoardManager::FEATURE_MULTIPLE_SERIAL)) {
    Serial.println("Your board supports multiple serial connections");
  }

}

void loop() {
}

Die resultierende Ausgabe auf Arduino Uno ist:

Board is compatible with Arduino UNO

Speed/SRAM/Flash: 
16000000
2048
33554432

Der Vorgang zum Erstellen dieser Bibliothek (einschließlich Beispielcode) zum Ermitteln eines Arduino-Platinenmodells und einer Arduino-Platinenversion wird in meinem Blog ausführlich beschrieben.

Adonis Gaitatzis
quelle
Ihre Arduino Due-Erkennung in ArduinoBoardManager.h ist möglicherweise falsch. Lesen Sie diesen Beitrag .
Ulrich Stern
Bitte geben Sie eine Lizenz in Ihrem Projekt ..
arun
2

Für alle mit Arduio Due kompatiblen Boards

#if defined (__arm__) && defined (__SAM3X8E__) // Arduino Due compatible
// your Arduino Due compatible code here
#endif

(Siehe die Datei Weitere Informationen finden sam3.h. )

Wenn Sie nur das Arduino Due anvisieren möchten (ohne kompatible Boards), können Sie verwenden

#if defined (_VARIANT_ARDUINO_DUE_X_)
// your Arduino Due code here
#endif

(Dies ist in den Arduino Due's definiert variant.h- Datei von .)

Gutschrift an Adam F /programming//a/21058963/354144

nialsh
quelle
1

Da der Arduino Due eine andere Prozessorfamilie (ARM) als die AVRs ist, können Sie nicht für alle drei dieselbe ausführbare Datei verwenden . Sie können aber den gleichen Quellcode haben (vorausgesetzt, die Syntax für das Lesen eines Ports ist für den AVR- und den ARM-Teil gleich) und nur zwei ausführbare Dateien (da dieselbe auf Uno und Mega ohne Neukompilierung ausgeführt wird).

Sie können den Kartentyp zur Laufzeit bestimmen, ohne ihn neu kompilieren zu müssen, indem Sie zwei digitale Pins auswählen, die noch nicht von Ihrem Programm auf einer der Karten verwendet werden, und sie als Karten-ID hoch oder niedrig binden. Wenn Sie beispielsweise die Pins PC1 und PC3 auswählen:

 PC1   PC3   Board ID
  0     0      Uno
  0     1      Mega
  1     0      Due
  1     1      spare

Dann lesen Sie einfach den Port beim Einschalten und stellen Sie eine Variable in Ihrem Programm ein.

Ein anderes Schema, das verwendet werden kann und nur einen Pin bindet, besteht darin, einen analogen Eingangspin und einen Widerstandsteiler zu verwenden und Widerstände so zu wählen, dass Sie unterschiedliche Spannungen in Schritten von beispielsweise 0,25 V erhalten. Ich habe diese Technik verwendet, um nicht nur einen Board-Typ anzugeben, sondern auch eine Board-Revision für dasselbe Board (was in gewissem Sinne ein neuer Board-Typ ist).

Tcrosley
quelle