MKR1000 / MKR1010 switch erkennen

Hallo liebe Forumgemeinde,

kann mir jemand sagen wie ich per Software unterscheiden kann ob ich einen MKR1000 oder einen MKR1010 im Einsatz habe?

Ich möchte je nach Modell eine andere Bibliothek laden lassen.

Merci und Grüße!

Unterscheiden und verschiedene Libs einbinden kannst Du nur zur Compilezeit.

Dazu musst Du die Preprozessordirektiven für die beiden Prozessoren in Erfahrung bringern.
Dann kannst Du sowas bauen:

#if defined(__AVR_ATmega328P__)
 #include <lib1.h>
#elif defined(__AVR_ATmega2560__)
 #include <lib2.h>
#endif

Nur dass Du eben die Bezeichnungen für Deine Prozessoren, anstelle der beiden ATmega einsetzen musst.

Gruß Tommy

Üblicherweise (oder besser "optimaler weise") finden solche Unterscheidungen allerdings bei Bedarf innerhalb der Bibliothek statt.
So kann der "gleiche" Sketch dann auf unterschiedlicher Hardware laufen.

Das stimmt. Er will aber 2 verschiedene Libs einbinden - warum auch immer. Da gehe ich davon aus, dass es nicht nur 2 Versionen einer Lib sind.

Gruß Tommy

coprea:
...

Die „schlimmste“ Idee, auf die ich bisher kam, war zwei identische Arduinos unterscheiden zu können. Meine Lösungen waren einmal ein Jumper und einmal eine Art Kennung im EEPROM.

Worauf kommt es Dir genau an? Also „Hardware-Projekt-mäßig“?

Gruß

Gregor

Moin,

danke für die bisherigen Antworten!

Der Sketch soll auf unterschiedlichen Hardwareversionen laufen können ohne ihn anpassen zu müssen.

Der MKR1000 und MKR1010 nutzen ja WiFi101 bzw. WiFiNINA z. bsp.
Und hier wollte ich entsprechend einen Switch bauen um nicht noch am Code etwas anpassen zu müssen bei einem Boardwechsel.

Grüße

Auch wenn Du beim Kompilieren den Arduino erkennen kannst (es gibt Systemvariablen dafür) wird der Sketch für den ausgewählten Arduino kompiliert und läuft nur dort.
Wenn der gleiche Sketch auf 2 Arduinos laufen soll müssen zuerst mal beide Arduinos den gleichen Controller drauf haben. Eventuelle Hardwareinitialisation muß für zusätzliche Hardware selektiv gemacht werden.
Diesen Punkt sehe ich das Hauptproblem. Der eine MKR hat einen ESP32, der andere einen WINC1500.
Da sehe ich keine Möglichkeit das mit der Arduino IDE zu machen. Du müßtest mit einer anderen Entwicklungsumgebung bzw manuell kompilieren und die ganze initialisation selbst schreiben. Die Erkennung kann über ein Pin oder über eine antwort der Verschiedenen Bausteine erfolgen.

Grüße Uwe

Auch wenn Du beim Kompilieren den Arduino erkennen kannst, wird der Sketch für den ausgewählten Arduino kompiliert und läuft nur dort

Das ist ja gerade das Prinzip der Arduino-IDE, dass direkt vor dem Hochladen für die gewünschte Ziel-Plattform kompiliert wird. Natürlich möglichst immer aus demselben Sourcecode. Frage ist nur, wie tief die #ifdef versteckt werden.

wenn der MKR1010 als ESP32 erkennbar ist könntest du versuchen das Board so zu erkennen:

#if defined(ARDUINO_ARCH_ESP32)

mangels derartiger Boards kann ich das aber nicht testen.

Wo findet eigentlich der Konnex zwischen der Board-Auswahl und dem define statt? Ein Parameter aus der boards.txt?

noiasca:
Wo findet eigentlich der Konnex zwischen der Board-Auswahl und dem define statt? Ein Parameter aus der boards.txt?

boards.txt

nodemcuv2.build.board=ESP8266_NODEMCU

#ifdef ARDUINO_ESP8266_NODEMCU
  Serial.println("Nodemcu");
#elif ARDUINO_ESP8266_WEMOS_D1MINI
  Serial.println("Wemos D1 Mini");
#elif ARDUINO_ESP8266_WEMOS_D1MINIPRO
  Serial.println("Wemos D1 Mini Pro");
#endif

Gruß Fips

Karma.

übrigens

# Arduino MKR WiFi 1010
# --------------------
mkrwifi1010.name=Arduino MKR WiFi 1010
mkrwifi1010.vid.0=0x2341
mkrwifi1010.pid.0=0x8054
mkrwifi1010.vid.1=0x2341
mkrwifi1010.pid.1=0x0054

mkrwifi1010.upload.tool=bossac
mkrwifi1010.upload.protocol=sam-ba
mkrwifi1010.upload.maximum_size=262144
mkrwifi1010.upload.use_1200bps_touch=true
mkrwifi1010.upload.wait_for_upload_port=true
mkrwifi1010.upload.native_usb=true
mkrwifi1010.build.mcu=cortex-m0plus
mkrwifi1010.build.f_cpu=48000000L
mkrwifi1010.build.usb_product="Arduino MKR WiFi 1010"
mkrwifi1010.build.usb_manufacturer="Arduino LLC"
mkrwifi1010.build.board=SAMD_MKRWIFI1010
mkrwifi1010.build.core=arduino
mkrwifi1010.build.extra_flags=-DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ {build.usb_flags} -DUSE_BQ24195L_PMIC
mkrwifi1010.build.ldscript=linker_scripts/gcc/flash_with_bootloader.ld
mkrwifi1010.build.openocdscript=openocd_scripts/arduino_zero.cfg
mkrwifi1010.build.variant=mkrwifi1010
mkrwifi1010.build.vid=0x2341
mkrwifi1010.build.pid=0x8054
mkrwifi1010.bootloader.tool=openocd
mkrwifi1010.bootloader.file=mkrwifi1010/samd21_sam_ba_arduino_mkrwifi1010.bin

dann gehe ich mal von einem

#if defined (SAMD_MKRWIFI1010)

aus.

Vielen Dank an Alle!!!

Hier ist die Lösung:

#if defined(ARDUINO_SAMD_MKRWIFI1010)
  Serial.println("MKR 1010 detected");
#endif

#if defined(ARDUINO_SAMD_MKR1000)
  Serial.println("MKR 1000 detected");
#endif

Grüße und Euch noch eine gute Zeit!

Kleine Korrektur, da es immer nur einen Zielprozessor geben kann:

#if defined(ARDUINO_SAMD_MKRWIFI1010)
  Serial.println("MKR 1010 detected");
#elif defined(ARDUINO_SAMD_MKR1000)
  Serial.println("MKR 1000 detected");
#else
  Serial.println("falscher Prozessor"); 
#endif

Gruß Tommy

Hi

Dort würde ich dann aber eine Error-Direktive verbauen - wenn nicht der richtige Prozessor eingestellt ist, bricht das Kompilieren ab.

Oder stehe ich gerade auf dem Schlauch, wozu Das dienen soll?

MfG

Wenn ich Compileranweisungen verpacken würde, dann mit Sicherheit ja.

Hier ging die Vorlage erstmal auf Serial.println, also habe ich es so ergänzt.

Gruß Tommy

postmaster-ino:
Hi

Dort würde ich dann aber eine Error-Direktive verbauen - wenn nicht der richtige Prozessor eingestellt ist, bricht das Kompilieren ab.

Oder stehe ich gerade auf dem Schlauch, wozu Das dienen soll?

MfG

Einen Sketch der mit beiden AKRs funktionieren soll und darum Teile nur für den einen bzw andere Teile für den anderen Kompiliert werden. So wie ein Sketch für den Arduino und den Mega funktionieren soll obwohl er andere Pinbelegung hat.