Die interne IMU des klassischen XIAO nRF52840 Sense lässt sich ohne zusätzliche Verdrahtung über Arduino auslesen. Sie liegt am internen I²C-Bus Wire1 und hat die Adresse 0x6A. Hier findest du das Pinout, die passende Softwarekombination und einen Sketch für Beschleunigung und Drehrate.

Die Anleitung gilt für Seeeds klassisches Sense-Board, Artikelnummer 102010469. Der Sketch wurde mit dem mbed-Boardpaket 2.9.3 und der Bibliothek Seeed Arduino LSM6DS3 2.0.7 erfolgreich kompiliert. Am 25. Oktober 2026 habe ich den Sketch auf meinem Board per USB ausgeführt und die IMU-Ausgaben beim Liegen und Kippen aufgezeichnet. Die Stromübersicht verbindet Schaltplan-Berechnungen mit den typischen Bauteilwerten aus den Datenblättern.
- Pins zuordnen: Platinenaufdruck, nRF52840-Pin und Arduino-Index auseinanderhalten, mit vollständiger Tabelle für Core 2.9.3.
- IMU einrichten: Boardpaket, Boardeintrag und Bibliothek in festgelegten Versionen installieren und mit einem kurzen Sketch auslesen.
- Fehler und Stromangaben einordnen: vier typische Fehlerbilder prüfen und die Teilströme von Regler, IMU, LEDs und Widerstandspfaden einordnen.
Welches XIAO nRF52840 ist gemeint?
Prüfe zuerst, ob dein Board zu dieser Anleitung passt. Gemeint ist das klassische XIAO nRF52840 Sense mit der Seeed-Artikelnummer 102010469. Es trägt einen nRF52840 mit 64 MHz Taktfrequenz, der die USB-Verbindung selbst herstellt; ein eigener USB-UART-Wandler ist nicht an Bord. Funkseitig bietet der Chip Bluetooth Low Energy. WLAN gibt es auf diesem Board nicht, WLAN-Beispiele aus anderen XIAO-Anleitungen passen deshalb nicht. Das Wort „Sense“ steht für die eingebaute Sensorik: eine IMU vom Typ LSM6DS3TR-C mit dreiachsigem Beschleunigungssensor und dreiachsigem Gyroskop sowie ein Mikrofon. Ein Magnetometer gehört nicht dazu, einen Kompasswinkel liefert das Board also nicht. Dieser Ratgeber nutzt ausschließlich die IMU.
Achte besonders auf diese drei Bezeichnungen:
- Klassisches XIAO nRF52840 Sense: Gegenstand dieses Ratgebers. Pinreferenz, Sketch und Schaltplananalyse beziehen sich auf diese Ausführung.
- XIAO nRF52840 ohne Sense: gleiche MCU, aber kein eingebautes Sense-Sensormodul. Der IMU-Teil dieser Anleitung läuft dort ins Leere.
- XIAO nRF52840 Sense Plus: eigenes Layout mit eigener Dokumentation. Übertrage das Pinbild dieses Artikels nicht auf das Plus; es ist hier nicht Gegenstand.
Seeed führt die klassische und die Plus-Ausführung inzwischen gemeinsam auf einer Wiki-Seite ([1]). Vergleiche deshalb Produktbezeichnung und Aufdruck deines Boards, statt eine Revisionsnummer aus der Dokumentation auf dein Exemplar zu übertragen. Der hier ausgewertete Schaltplan ([2]) trägt im Revisionsfeld V1.1 und enthält die Sense-Bauteile, obwohl der Dokumenttitel nur „XIAO nRF52840“ lautet. Die tatsächliche Bestückung und Revision deines Exemplars musst du am Board abgleichen. Die folgenden Anschlussangaben beziehen sich auf diesen Schaltplan.


Pinout: Aufdruck, MCU-Pin und Arduino-Bezeichnung
Für jeden Anschluss gibt es drei Bezeichnungen, die du auseinanderhalten musst. Auf der Platine steht zum Beispiel D6. Im nRF52840 heißt derselbe Anschluss P1.11, also Port 1, Pin 11. Der Arduino-Core verwaltet die Pins zusätzlich über einen Zahlenindex, und dieser Index ist bei D6 nicht 6, sondern 7. Der Grund ist ein interner Eintrag: Index 6 belegt in dieser Variante den Anschluss P0.31, der für die Batteriemessung vorgesehen ist. Ab D6 sind deshalb alle Zahlenindizes um eins verschoben. Verwende im Code die symbolischen Namen D0 bis D10. Ein pinMode(6, OUTPUT) schaltet nicht D6, sondern den internen Batterie-ADC-Pin.
Die Tabelle gilt für den klassischen Anschlussplan V1.1 und für Core 2.9.3. Andere Core-Versionen und das Plus können abweichen.
Tabelle seitlich scrollen →
| Platinenaufdruck / Arduino-Name | MCU-Pin | Zahlenindex in mbed 2.9.3 | Hauptfunktion dieses Cores |
|---|---|---|---|
| D0 / A0 | P0.02 | 0 | Analog-/Digitalanschluss |
| D1 / A1 | P0.03 | 1 | Analog-/Digitalanschluss |
| D2 / A2 | P0.28 | 2 | Analog-/Digitalanschluss |
| D3 / A3 | P0.29 | 3 | Analog-/Digitalanschluss |
| D4 / A4 | P0.04 | 4 | Wire SDA, außerdem Analog/Digital |
| D5 / A5 | P0.05 | 5 | Wire SCL, außerdem Analog/Digital |
| D6 | P1.11 | 7 | Serial1 TX |
| D7 | P1.12 | 8 | Serial1 RX |
| D8 | P1.13 | 9 | SPI SCK |
| D9 | P1.14 | 10 | SPI MISO |
| D10 | P1.15 | 11 | SPI MOSI |
Quellen: Boarddefinition und Variantendateien aus dem Seeed-Paketindex ([3]) und dem Core-Archiv 2.9.3 ([4]); MCU-Zuordnung nach Schaltplan V1.1 ([2]).
Die interne IMU erreichst du über keines dieser Randpads. Sie hängt an einem zweiten I²C-Bus, den der Core als Wire1 anlegt:
Tabelle seitlich scrollen →
| Interne Verbindung | MCU-Pin / Wert |
|---|---|
| Wire1 SDA | P0.07 |
| Wire1 SCL | P0.27 |
| IMU-Versorgung, geschaltet | P1.08 |
| IMU INT1 | P0.11 |
| I²C-Adresse der IMU | 0x6A |
Ein I²C-Scanner, der wie üblich auf Wire läuft, sucht an D4 und D5 und findet die IMU dort nicht. Für den Sketch in diesem Artikel musst du nichts umlegen: Die Bibliothek erkennt das Sense-Target, schaltet intern auf Wire1 um und aktiviert die IMU-Versorgung über P1.08 ([5]). Die beiden 10-kΩ-Pullups des internen Busses hängen laut Schaltplan an dieser geschalteten Versorgung und nicht an der 3,3-V-Schiene. Solange die Versorgung aus ist, ist der interne Bus also auch nicht auf HIGH gezogen.
RGB-LED und Versorgung
Die Platine trägt eine RGB-LED, die der Core als LEDR, LEDG und LEDB kennt; die MCU-Pins sind P0.26, P0.30 und P0.06. Laut Schaltplan liegt sie gegen 3V3. Ein LOW am jeweiligen Ausgang schaltet den Kanal ein, ein HIGH schaltet ihn aus. Das ist die umgekehrte Logik zu einer externen LED mit Vorwiderstand gegen GND; vermische beide Fälle nicht in einem Beispiel.
5V ist der USB-VBUS-Anschluss, GND die Masse und 3V3 die vom Regler erzeugte 3,3-V-Schiene. Alle GPIOs arbeiten mit 3,3-V-Logik; 5-V-Signale gehören nicht an diese Pins. Diese Anleitung versorgt das Board ausschließlich über USB. Eine Einspeisung von außen an 3V3 muss die Rückstrom- und Parallelversorgungspfade über Regler und Batterieschaltung berücksichtigen und wird hier nicht angeleitet.
Arduino einrichten und die IMU auslesen
Die Schritte folgen der Einstiegsseite von Seeed ([1]) und der IMU-Anleitung ([6]). Verwende für diesen Einstieg die genannten Versionen. So kannst du bei der Fehlersuche dieselbe Softwaregrundlage zugrunde legen.
- Board per Datenkabel verbinden. Schließe für den ersten Versuch nur das XIAO an den Rechner an, ohne externe Sensoren und ohne Akku. Das Kabel muss Datenleitungen führen; ein reines Ladekabel versorgt das Board, erlaubt aber keinen Upload. Prüfe, ob ein neuer serieller Port erscheint. Wenn nicht, wechsle Kabel oder USB-Buchse, bevor du in der Software suchst.
- Boardpaket eintragen. Trage in den Voreinstellungen der Arduino IDE im Feld für zusätzliche Boardverwalter-URLs
https://files.seeedstudio.com/arduino/package_seeeduino_boards_index.jsonein. Vorhandene Einträge bleiben stehen; mehrere URLs trennst du mit Komma. Installiere danach im Boardverwalter das Paket „Seeed nRF52 mbed-enabled Boards“ in Version 2.9.3. Der Download ist umfangreich und kann je nach Verbindung dauern. - Genaues Target auswählen. Wähle im Menü Werkzeuge unter Board den Eintrag „XIAO nRF52840 Sense (No Updates)“ und darunter den Port des Boards. Der Zusatz „No Updates“ gehört in diesem Paket zum Menünamen und ist kein Fehler. Nicht wählen: das zweite Seeed-Paket ohne mbed, den Eintrag ohne Sense und das Plus-Board. Seeed empfiehlt den mbed-Core für IMU und Mikrofon; für BLE und niedrigen Verbrauch nennt das Wiki den anderen Core. Diese Anleitung legt sich für die IMU fest, ein späteres Funk- oder Batterieprojekt kann eine andere Grundlage brauchen.
- Bibliothek installieren. Installiere über den Bibliotheksverwalter „Seeed Arduino LSM6DS3“ von Seeed Studio in Version 2.0.7. Es gibt mehrere Bibliotheken mit LSM6DS3 im Namen; prüfe Herausgeber und Version. Andere LSM6DS3-Bibliotheken können eine andere Buskonfiguration oder Programmierschnittstelle haben; das folgende Listing ist auf die Seeed-Bibliothek abgestimmt.
- Beispiel übertragen. Lege einen neuen Sketch mit dem Listing direkt nach dieser Schrittfolge an und lade ihn hoch. Er setzt die I²C-Adresse ausdrücklich auf 0x6A, weil die Bibliothek standardmäßig 0x6B annimmt, und wartet höchstens drei Sekunden auf einen geöffneten seriellen Monitor. Seeeds Beispiel
HighLevelExampleaus der IMU-Anleitung ist der dokumentierte Ausgangspunkt; es wartet mit einem unbeschränktenwhile (!Serial)und läuft ohne offenen Monitor nicht weiter. - Ausgabe prüfen. Öffne den seriellen Monitor mit 115200 Baud. Die Verbindung läuft über die native USB-Schnittstelle des nRF52840; einen USB-UART-Treiber wie für CH340-Wandler brauchst du nicht. Erwartet werden pro Zeile drei Beschleunigungen in g und drei Drehraten in °/s. Liegt das Board ruhig, bleibt der Betrag des Beschleunigungsvektors nahe 1 g. Kippst du es langsam, verschieben sich die Anteile zwischen den Achsen; drehst du es, reagieren die Drehraten.
#include <Arduino.h>
#include <LSM6DS3.h>
#if !defined(TARGET_SEEED_XIAO_NRF52840_SENSE)
#error "Select XIAO nRF52840 Sense in Seeed nRF52 mbed-enabled Boards 2.9.3."
#endif
LSM6DS3 imu(I2C_MODE, 0x6A);
bool imuReady = false;
void setup() {
Serial.begin(115200);
const unsigned long started = millis();
while (!Serial && (millis() - started < 3000UL)) {
delay(10);
}
imuReady = (imu.begin() == 0);
}
void loop() {
if (!imuReady) {
Serial.println("IMU init failed: check board target and library version.");
delay(1000);
return;
}
Serial.print("Accel[g]: ");
Serial.print(imu.readFloatAccelX(), 3); Serial.print(", ");
Serial.print(imu.readFloatAccelY(), 3); Serial.print(", ");
Serial.print(imu.readFloatAccelZ(), 3);
Serial.print(" | Gyro[deg/s]: ");
Serial.print(imu.readFloatGyroX(), 2); Serial.print(", ");
Serial.print(imu.readFloatGyroY(), 2); Serial.print(", ");
Serial.println(imu.readFloatGyroZ(), 2);
delay(200);
}
Sketch herunterladen (.zip mit .ino)Build erfolgreich · Core 2.9.3 · Bibliothek 2.0.7
Mein USB-Check: Ruhelage und Kippbewegung
Für den Check habe ich das Board über USB angeschlossen und den Sketch oben ausgeführt, ohne Akku oder externe Sensoren. Der Serial Monitor lief mit 115200 Baud in Arduino IDE 2.3.10. Zuerst lag das Board flach, anschließend habe ich es von Hand ungefähr auf die Seite gekippt. Die seitliche Lage war nicht mechanisch fixiert.

Diese sechs Zeilen stammen unverändert aus der flachen Ruhelage:
Accel[g]: -0.020, -0.057, 1.038 | Gyro[deg/s]: 0.07, -1.47, -1.68 Accel[g]: -0.021, -0.060, 1.037 | Gyro[deg/s]: 0.70, -1.40, -1.61 Accel[g]: -0.019, -0.058, 1.041 | Gyro[deg/s]: 0.14, -1.61, -1.68 Accel[g]: -0.019, -0.060, 1.038 | Gyro[deg/s]: 0.00, -1.54, -1.61 Accel[g]: -0.019, -0.058, 1.036 | Gyro[deg/s]: 0.70, -1.33, -1.68 Accel[g]: -0.021, -0.059, 1.041 | Gyro[deg/s]: 0.14, -1.61, -1.68
Für den Vergleich habe ich alle sechs Ruhezeilen und alle zwölf Zeilen aus der seitlich gehaltenen Lage gemittelt. Kein Messwert wurde entfernt oder korrigiert; die Tabelle enthält berechnete Mittelwerte, keine zusätzliche Serial-Ausgabe.
Tabelle seitlich scrollen →
| Messgröße | Flach liegend, 6 Zeilen | Seitlich gehalten, 12 Zeilen |
|---|---|---|
| Beschleunigung X | −0,020 g | −0,035 g |
| Beschleunigung Y | −0,059 g | 0,991 g |
| Beschleunigung Z | 1,039 g | 0,080 g |
| Drehrate X | 0,29 °/s | −0,82 °/s |
| Drehrate Y | −1,49 °/s | −1,39 °/s |
| Drehrate Z | −1,66 °/s | −2,26 °/s |
Beim Kippen wechselte der größte Beschleunigungsanteil von Z nach Y. Im Bewegungsauszug erreichte die ausgegebene X-Drehrate 92,12 °/s. Nach der Hauptbewegung wurden wieder deutlich kleinere Werte ausgegeben; einzelne Nachbewegungen sind im Verlauf sichtbar. Auch beim seitlichen Halten bewegte sich die Hand etwas: Die X-Drehrate schwankte dort zwischen −6,30 und +5,88 °/s.
Der Beschleunigungsbetrag √(ax² + ay² + az²) lag im Mittel bei 1,040 g im Liegen und 0,994 g beim seitlichen Halten. Der kurze Check belegt die Ausgabe und die Reaktion auf die Lageänderung. Er ist keine Kalibrierung und bestätigt weder einen exakten 90-Grad-Winkel noch die Messgenauigkeit des Sensors.
Originalausgaben herunterladen (.zip): alle sechs Ruhezeilen, zwölf Haltezeilen und 20 Zeilen der Kippbewegung als unveränderte TXT-Dateien.
Zum Sketch: imu.begin() liefert null, wenn die Initialisierung geklappt hat; nur dann gilt die IMU als bereit. Die Funktionen readFloatAccelX() bis readFloatAccelZ() geben g zurück, readFloatGyroX() bis readFloatGyroZ() Grad pro Sekunde ([7]). Die Prüfung am Anfang bricht den Build mit einer klaren Meldung ab, wenn nicht das Sense-Target aus Schritt 3 gewählt ist.
Welche Einstellungen setzt imu.begin()?
In Version 2.0.7 legt der Konstruktor die Standardwerte fest, die imu.begin() anschließend in die Sensorregister schreibt: Beschleunigung mit 416 Hz und ±16 g, Drehrate mit 416 Hz und ±2000 °/s. Beide Sensoren sind aktiviert. Der Sketch verändert diese Einstellungen nicht ([5]).
Laut den ODR-Tabellen 52 und 55 des ST-Datenblatts laufen beide Sensoren bei 416 Hz im High-Performance-Modus ([8]). Die Pause delay(200) begrenzt lediglich die Ausgabe auf knapp fünf Zeilen pro Sekunde. Intern arbeiten die Sensoren weiterhin mit 416 Hz; längere Ausgabepausen senken ihre Abtastrate nicht.
Ein idealisiertes Beispiel: Liegt das Board waagerecht, kann die Ausgabe etwa (0, 0, 1) g zeigen. Welche Achse die Erdschwere trägt und mit welchem Vorzeichen, hängt von der Einbaulage des Sensors ab. Erwarte also nicht zwingend ein positives Z, sondern gleiche die Orientierung mit dem Datenblatt ab. Verlässlicher ist der Betrag √(ax² + ay² + az²), der in Ruhe nahe 1 g liegt. Die Gyroskopwerte sind Drehraten, keine Lagewinkel; ein ruhendes Gyroskop zeigt Werte nahe null mit etwas Offset und Rauschen ([8]). Wer einen Winkel braucht, muss Drehraten über die Zeit integrieren oder mit der Beschleunigung verrechnen. Das ist ein eigenes Thema und nicht Teil dieser Einrichtung.
Wenn Upload, Sensor oder Werte nicht passen
Für die Fehlersuche sind diese vier Fälle hilfreich. Zwei davon betreffen die Softwarekonfiguration, ein weiterer die Interpretation der Sensorwerte.
- Kein Port oder keine Ausgabe. Prüfe zuerst Datenkabel und Portauswahl. Hängt eine zuvor geladene USB-Anwendung fest, erreichst du laut Seeed den Bootloader durch zweimaliges Drücken der Reset-Taste; anschließend erscheint ein anderer Port, den du in der IDE neu auswählst ([1]). Das ist ein Neustart in den vorhandenen Bootloader, kein Überschreiben. Ein Sketch mit unbeschränktem
while (!Serial)wartet still, bis ein Monitor geöffnet ist; der Sketch oben begrenzt diese Wartezeit auf drei Sekunden. Installiere keinen CH340-Treiber auf Verdacht: Der Schaltplan führt die USB-Datenleitungen an den nRF52840 selbst. - Initialisierung schlägt fehl oder ein Scanner sieht 0x6A nicht. Vergleiche Boardeintrag, Core-Version und Bibliotheksversion mit den Schritten oben. Ein Scanner auf Wire sucht am externen Bus D4/D5; die IMU liegt auf Wire1. Die Bibliothek legt Bus und Versorgung nur für das Sense-Target um ([5]). Ein PlatformIO-Nutzer beschrieb 2025 genau diesen Fall mit fehlender Target-Definition und fehlschlagendem
begin()([9]); sein Build-Flag ist eine Lösung für seine Umgebung, nicht für jede. Ein Forumsbericht vom Oktober 2026 beschreibt den Wechsel vom nicht-mbed-Core auf mbed 2.9.3 als funktionierend ([10]). Bleibt der Fehler trotz korrekter Umgebung, notiere Fehlermeldung und Versionen; ein Defekt ist damit nicht nachgewiesen. - Compilerfehler „MbedSPI … setBitOrder“. Dieser Fehler stammt aus einem Bericht vom September 2025 mit Core 2.9.2 und Bibliothek 2.0.5; der Nutzer wich auf 2.0.4 aus ([11]). Im Quellcode von 2.0.7 wird der Aufruf unter ARDUINO_ARCH_MBED übersprungen ([5]). Prüfe deshalb zuerst, ob die IDE wirklich Version 2.0.7 lädt und nicht eine ältere Kopie aus dem Sketchbook. Eine pauschale Rückstufung auf 2.0.4 oder ein Auskommentieren auf Verdacht ist nicht nötig. Tritt der Fehler mit 2.9.3 und 2.0.7 trotzdem auf, hilft nur das vollständige Buildlog weiter.
- Sensor liegt still, Werte sind trotzdem nicht null. Das allein weist noch nicht auf einen Fehler hin. Der Beschleunigungssensor misst die Erdschwere auch in Ruhe, das Gyroskop zeigt Offset und Rauschen; die Datenblattwerte dazu stehen bei ST ([8]). Entsprechende Fragen finden sich auch im Bibliotheksprojekt ([12], [13]). Kalibriere die drei Beschleunigungsachsen nicht auf null; damit entfernst du die Schwerkraft aus der Messung und machst die Lagebestimmung unbrauchbar.
Stromverbrauch: Was sich aus dem Schaltplan ableiten lässt
Ein niedriger Datenblattwert des nRF52840 sagt wenig über den Strom, den dein Board tatsächlich zieht. Zwischen Chip und USB-Buchse liegen Schutzdiode, Regler, Ladebaustein, Sensoren, LEDs und Widerstandspfade, und jeder dieser Posten hängt von Firmwarezustand und Versorgungsart ab. Grundlage der Schaltplan-Berechnungen ist der Plan mit Revisionsfeld V1.1 ([2]). Bei Bauteil-Typwerten ist der jeweilige Betriebsmodus angegeben.
Der Weg über USB führt von VBUS über die Schutzdiode D1 (SDM20U40) auf den Knoten VIN und von dort in den 3,3-V-Regler U6, einen SGM2040-3.3 ([14], Datenblatt [15]). Aus seinem Ausgang werden MCU, IMU, Mikrofon, LEDs und ein gegebenenfalls bestückter externer Flash gespeist.
Eine Batterie an VBAT gelangt über den MOSFET-Pfad Q1 auf denselben VIN-Knoten. Der Ladezweig ist davon getrennt: VBUS speist den Einzellen-Ladebaustein U2, einen BQ25101 mit 4,20 V Regelspannung, der in Richtung Akku lädt ([16]). Einen USB-UART-Wandler als eigenen Verbraucher gibt es in diesem Plan nicht; die USB-Kommunikation läuft im nRF52840 und kostet dort trotzdem Strom.
Als Modell für die 3,3-V-Schiene gilt: I3V3 ist die Summe aus MCU einschließlich genutzter USB- und Funkfunktionen, IMU, Mikrofon, gegebenenfalls Flash, LEDs sowie Pullup- und Leckströmen. Für eine belastbare Summe brauchst du zu jedem Verbraucher den Betriebszustand und die zugehörigen Stromangaben.
Teilströme auf dem XIAO nRF52840 Sense (laut Schaltplan V1.1 & Datenblättern)
Tabelle seitlich scrollen →
| Bauteil oder Strompfad | Teilstrom | Bedingung und Einfluss auf den Verbrauch |
|---|---|---|
| 3,3-V-Regler U6: SGM2040-3.3 | 1,0 µA typisch Ruhestrom I_Q | Eigenverbrauch des eingeschalteten Reglers; der Laststrom kommt hinzu. |
| VBUS-Gate-Widerstand R9: 100 kΩ | 50 µA bei 5,0 V | Schaltplan-Berechnung: 5,0 V / 100 kΩ. Fließt bei USB-Versorgung dauerhaft, auch wenn die MCU schläft; entfällt im reinen Batteriebetrieb. |
| Batterie-Spannungsteiler R16 + R17: 1 MΩ + 510 kΩ | 2,45 µA bei 3,7 V | Schaltplan-Berechnung: 3,7 V / 1,51 MΩ. Der Teilerpfad ist aktiv, solange P0.14 auf LOW liegt. |
| Interne IMU: LSM6DS3TR-C | ca. 0,90 mA typisch im kombinierten High-Performance-Modus | ST-Referenzwert für Beschleunigungssensor und Gyroskop zusammen, bei 1,6 kHz ODR. Der Sketch nutzt 416 Hz, ebenfalls High Performance. Die Versorgung lässt sich über P1.08 abschalten. |
| RGB-LED: LEDR / LEDG / LEDB, aktiv LOW | Rein ohmsche Obergrenzen: 1,50 mA je rotem/blauem Kanal, 0,33 mA grün | Schaltplan-Berechnung mit 3,3 V und R7/R3 = 2,2 kΩ bzw. R4 = 10 kΩ, ohne LED- und GPIO-Spannungsabfall; tatsächlich fließt weniger. Für Low Power alle drei Ausgänge auf HIGH setzen. |
Die IMU-Angabe stammt aus Tabelle 4 des ST-Datenblatts ([8]). Die LED-Kanäle haben unterschiedliche Vorwiderstände. Ihr Strom ergibt sich näherungsweise aus I_LED = (3,3 V − V_F − V_OL) / R; schon ein leuchtender Kanal kann die hier berechneten µA-Nebenströme deutlich übertreffen.
Die Zeilen gelten für unterschiedliche Versorgungs- und Betriebszustände und ergeben deshalb keine gemeinsame Board-Summe. Für Low Power lohnt es sich, die RGB-LED auszuschalten, eine ungenutzte IMU abzuschalten und den Batterieteiler nur zum Messen zu aktivieren. Vor dem Abschalten der IMU auch Wire1 freigeben, damit die Busleitungen den Sensor nicht über seine Eingänge rückspeisen.
USB- und Batteriebetrieb haben unterschiedliche Nebenverbraucher. Die Leistungsformel P = U × I allein beschreibt diese Unterschiede nicht. Bei USB ohne Akkuladung gilt näherungsweise: IUSB = I3V3 + LDO-Ruhestrom + Strom durch R9 + Eigenstrom des Ladebausteins + weitere VBUS-Zweige. R9 ist ein 100-kΩ-Widerstand von der VBUS-gesteuerten Gateleitung nach GND; bei 5 V fließen dort 5 V / 100 kΩ = 50 µA, unabhängig davon, was die MCU gerade tut.
Im Batteriebetrieb liegt dieser Zweig nicht an 5 V, dafür wirken andere Leck- und Messpfade. Derselbe MCU-Schlafmodus ergibt deshalb an USB und an Batterie unterschiedliche Eingangsströme. Sinkt die Batteriespannung unter 3,3 V plus den Spannungsabfall des Reglers, liefert die 3V3-Schiene keine 3,3 V mehr, und jede Rechnung mit festen 3,3 V wird ungültig.
Schaltplan-Berechnung: Verlustleistung am Regler
Angenommen sind 10 mA Last, 5,0 V an USB, 0,30 V Abfall an der Schutzdiode, 3,3 V am Reglerausgang und 1 µA Eigenstrom. Dann liegen am Reglereingang 4,7 V, und die Verlustleistung beträgt P_LDO ≈ (4,7 − 3,3) V × 0,010 A + 4,7 V × 0,000001 A ≈ 14 mW. Die Diode setzt bei diesem Strom zusätzlich etwa 3 mW um. Bei 3,7 V aus der Batterie und vernachlässigtem Abfall am MOSFET ergibt dasselbe 10-mA-Beispiel am Regler etwa 4,0 mW.
Beide Werte enthalten weder R9 noch Lade- oder LED-Zweige, und sie erlauben keine Aussage über Gehäusetemperatur oder Akkulaufzeit.
Schaltplan-Berechnung: Spannungsteiler für die Batterie
Die Batteriespannung wird über 1 MΩ (R16) von VBAT zum ADC-Knoten P0.31 und über 510 kΩ (R17) vom Knoten zu P0.14 geteilt. Ein LOW an P0.14 aktiviert den Pfad. Bei angenommenen 3,7 V fließen I = 3,7 V / 1,51 MΩ ≈ 2,45 µA, und am Knoten liegen etwa 3,7 V × 510/1510 ≈ 1,25 V. Das beschreibt die Schaltung, nicht die Genauigkeit einer ADC-Messung.
Ist der Pfad ausgeschaltet, fließt nicht automatisch null Strom; Leckströme bleiben eine eigene Frage. Mit dem Spannungsteiler-Rechner kannst du andere Widerstände oder eine andere Eingangsspannung einsetzen. Code für die Batteriemessung und eine Ladeanleitung gehören nicht zu diesem Einrichtungsbeispiel.
Kurzer Check vor dem nächsten Projekt
Halte nach dem ersten erfolgreichen Auslesen fest, womit du gearbeitet hast. Dann lässt sich ein späterer Aufbau reproduzieren und ein Fehler auf eine konkrete Änderung zurückführen.
- Exakte Boardvariante: klassisches XIAO nRF52840 Sense, Artikelnummer 102010469, mit Aufdruck und, falls erkennbar, Revision deines Exemplars.
- Core und Bibliothek: Seeed nRF52 mbed-enabled Boards 2.9.3 mit dem Eintrag „XIAO nRF52840 Sense (No Updates)“ und Seeed Arduino LSM6DS3 2.0.7.
- Port und IMU-Ausgabe: der verwendete Port und eine Zeile der seriellen Ausgabe mit plausiblen g- und °/s-Werten.
- Versorgung und Zusatzgeräte: USB über Datenkabel, kein Akku, keine externen Sensoren am Bus.
Für BLE und Batteriebetrieb müssen Softwarekonfiguration und Strombedarf neu betrachtet werden. Überträgst du die Schaltung später auf eine eigene Sensorplatine, brauchst du außerdem Stückliste und Bestückungsdaten; der Ratgeber zur Leiterplattenbestückung erklärt, wie du diese Unterlagen vorbereitest.
Quellen und Softwarestand
Quellenabgleich und Build: 24. Oktober 2026. USB- und IMU-Funktionscheck mit eigener Hardware: 25. Oktober 2026; Serial Monitor in Arduino IDE 2.3.10. Die Originalausgaben sind im Ergebnisabschnitt verlinkt. Der Sketch kompiliert mit Arduino CLI 1.5.1, Seeed mbed-Core 2.9.3 und Seeed Arduino LSM6DS3 2.0.7. Die Schaltplan-Berechnungen beziehen sich auf V1.1; Bauteilwerte auf die jeweils verlinkten Datenblätter.
- Seeed: Getting Started with XIAO nRF52840 (Sense)
- Seeed: Schaltplan, Revisionsfeld V1.1 (PDF)
- Seeed: Arduino-Paketindex
- Seeed: mbed-Core 2.9.3 (Quellarchiv)
- Seeed: LSM6DS3-Bibliothek 2.0.7, Implementierung
- Seeed: XIAO Sense IMU Usage
- Seeed: LSM6DS3-Bibliothek 2.0.7, Schnittstelle
- STMicroelectronics: LSM6DS3TR-C, Datenblatt (PDF)
- Seeed GitHub, Issue 27: Initialisierung und Board-Target
- Seeed-Forum: Zugriff auf die interne IMU
- Seeed-Forum: MbedSPI/setBitOrder mit älterer Bibliothek
- Seeed GitHub, Issue 7: Beschleunigung in Ruhe
- Seeed GitHub, Issue 12: Drehrate und Winkel
- SGMICRO: SGM2040 Produktdaten
- SGMICRO: SGM2040 Datenblatt (PDF)
- Texas Instruments: BQ25100/BQ25101 Datenblatt (PDF)