Arduino DUE, I2C und Grove IMU 9DOF v2.0

Hi!

Ich versuche, irgendwie den Grove IMU 9DOF v2.0 Beschleunigungssensor an meinem Arduino DUE (mit Shield [2]) zum Laufen zu bringen. Aber der DUE scheint den Sensor nicht zu finden. Habe schon den I2C-Scanner ausprobiert, aber der meldet nur "no devices found", ganz egal, an welchem I2C-Port ich den einstecke. Beim Anschließen sollte man ja nicht viel falsch machen können [1]. 3,3V sollte der Sensor laut Specs können.

Wie kann ich herausfinden, wo das Problem liegt? Sensor defekt, Shield defekt, Arduino defekt, ich zu doof?

[1] Ich hätte gerne ein Bild hochgeladen, bekomme aber nur die Meldung "Entschuldigung, ein Fehler ist aufgetreten". Also DUE, Shield drauf, Sensor über das mitgelieferte Kabel an einer I2C-Buchse eingesteckt, Wahlschalter am Shield natürlich auf 3,3V gestellt.

[2] Ergänzung: Gemeint ist das Grove Base Shield V2 von https://www.seeedstudio.com/Base-Shield-V2.html

Format oder Größe des Bildes anpassen.
Link des Sensors posten.

Hier der Link zum Sensor:

https://wiki.seeedstudio.com/Grove-IMU_9DOF_v2.0/

Zum Bild-Upload: Bild ist JPG, 376430 Pixel, 61kB. Habe alternativ PNG probiert, sowie JPG 188215 mit 40kB - jedes Mal der gleiche Fehler. Der Upload läuft hoch bis 100% und dann kommt der Fehler.

Wie bzw. an welche Pins des DUE hast du den Sensor angeschlossen ?

Auf dem DUE sitzt das Grove Base Shield V2 (https://www.seeedstudio.com/Base-Shield-V2.html), wobei der Spannungswahlschalter auf 3,3V gestellt ist (muss so für Arduino Due laut Doku). Der Sensor ist dort an einem der mit I2C beschrifteten Ports eingesteckt.

Ok, das sollte so funktionieren.
Kannst du den Sensor auch ohne das Shield am DUE anschließen. Also Spannung und den I2C Bus.

Hi!

Habe den Sensor jetzt wie folgt angeschlossen

Sensor I2C: Anschluss am DUE

VCC: +3V3-OUT-Anschluss am DUE (Buchsenleiste auf der Seite mit der Anschlussbuchse für ein externes Netzteil
GND: GND des DUE (2 Buchsen unterhalb des 3V3-OUTs von oben)
SDA: I2C SDA des DUE
SCL: I2C SCL des DUE

Achso: Der DUE ist nur über den USB-Programmer-Port am PC angeschlossen. Keine sonstige Spannungsversorgung am DUE (weder am 2. USB-Port noch am Anschluss für ein separates Netzteil).

Und mit welchem Ergebnis ?

Äh, ja: Unverändert. Der IMU wird nicht erkannt.

Wenn alles richtig angeschlossen ist, tippe ich auf ein defekt des Sensors.
Hast du noch einen anderen Sensor, um den DUE und I2C zu testen ?

Einen anderen I2C-Sensor habe ich gerade nicht da. Muss ich mir besorgen.

Alternativ soll man den Sensor auch mittels SPI anschließen können. Das könnte ich alternativ auch mal probieren; eine Library habe ich auf Github gebunden.

Allerdings finde ich nirgendwo ein Anschlussschema dafür. Am Sensor gibt es dafür 4 Anschlüsse: CS, SCLK, MOSI, MISO. Ich vermute, die Verkabelung müsste so sein:

IMU : DUE
CS: D4, D10 oder D52
SCLK: SCK am SPI-Sockel
MOSI: COPI am SPI-Sockel
MISO: CIPO am SPI-Sockel

Aber wie ist das mit der Spannungsversorgung? Erfolgt das über diese 4 Pins "parallel" oder muss ich dazu noch die VIN & GND-Anschlüsse der I2C-Buchse am Sensor herausführen und am Arduino anschließen?

Die muss auch zum Sensor geführt werden, auch Ground muss verbunden werden, damit beide Bauteile den gleich Bezug haben.

Im Pinout sind die SPI Pins mit MOSI, MISO, SCK, GND, 5V und Reset beschriftet. CS für ChipSelect ist eigentlich frei wählbar.

Hi!

Also ich habe die IMU nun wie von Plumps beschrieben angeschlossen. Als Library habe ich die Bolder Flight Systems MPU9250 genommen - ist den Datenblättern nach für exakt den Chip erstellt, der auch auf dem Grove-Board zu finden ist.

Die Lib hat einen Beispiel-Sketch für die MPU 9250 unter SPI (in der IDE zu finden unter Examples / Bolder [...] / arduino / mpu9250 / spi). Wenn ich den ausführe, erhalte ich die Meldung

"Error initializing communication with IMU"

Der Beginn des Programms sieht so aus:

#include "mpu9250.h"

/* Mpu9250 object, SPI bus, CS on pin 10 */
bfs::Mpu9250 imu(&SPI, 10);

void setup() {
  /* Serial to display data */
  Serial.begin(115200);
  while(!Serial) {}
  /* Start the SPI bus */
  SPI.begin();
  /* Initialize and configure IMU */
  if(!imu.Begin()) {
    Serial.println("Error initializing communication with IMU");
    while(1) {}
  }
  // ...

In imu.Begin() tritt der Fehler an folgender Stelle auf:

bool Mpu9250::Begin()
{
    // Hier wird imu_.Begin(); aufgerufen
    // Habe den Code hier mal reinkopiert:
    pinMode(dev_, OUTPUT);	// dev_ = 10
    /* Toggle CS pin to lock in SPI mode */
    digitalWrite(dev_, LOW);
    delay(1);
    digitalWrite(dev_, HIGH);
    delay(1);

	// Hier jetzt weiter mit Mpu9250::Begin()
	/* 1 MHz for config */
	spi_clock_ = SPI_CFG_CLOCK_; // SPI_CFG_CLOCK_= 1000000
	/* Select clock source to gyro */
	if (!WriteRegister(PWR_MGMNT_1_, CLKSEL_PLL_)) // PWR_MGMNT_1_ = 0x6B, CLKSEL_PLL_ = 0x01
	{
		return false; // Hier tritt bereits der Fehler auf
	}
	

Da klappt also noch nicht einmal der erste Kommunikationsversuch.

Neue/Andere IMU kaufen? Was würdet ihr denn empfehlen? Ich brauche keinen Kompass, aber Beschleunigung & Drehwinkel.

Hallo!

Habe nun einen zweiten I2C-Sensor probiert (diesen hier: https://www.seeedstudio.com/Grove-6-Axis-Accelerometer-Gyroscope.html?queryID=18eac7ef2a1595e2c3b1e3e4a7963503&objectID=542&indexName=bazaar_retailer_products)

Auch hier erkennt der I2C-Scanner kein Device.

Ich finde das komisch, dass weder I2C noch SPI läuft. Arduino defekt?

Noch ergänzend: Habe an den I2C-Ports am Arduino mal die Spannung zwischen VCC und GND gemessen. Ist im Ruhezustand 3,3V, wie es ja auch sein sollte.

Aber mir ist aufgefallen, dass wenn der I2C-Scanner läuft, die Spannung periodisch auf bis zu ca. 1V einbricht. Das kann doch unmöglich richtig sein, denn das würde ja bedeuten, dass dem Sensor bei jeder Abfrage der Saft ausgeht.

Wieso soll dem Sensor der Saft ausgehen? Von welcher Spannung reden wir hier?

Was Du da schreibst klingt mit sehr komisch.
Generell gesagt:
Die Versorgungsspannung muß stabil und immer vorhanden sein.
Daten wechseln zwischen HIGH und LOW und somit mißt man alles mögliche zwischen 0V und Versorgungsspannung. Also auf den Pins SDA und SCL bei I2C bzw MOSI, MISO und CLK kann an alles mögliche auch zeitlich veränderliche Spannungen messen.

Grüße Uwe

Ich habe auf dem DUE das Arduino Base Shield V2, bei dem der Spannungswahlschalter für den DUE passend auf 3,3V eingestellt ist.

Auf diesem Shield sind unter Anderem vier I2C-Anschlüsse. Jeder mit vier Pins. Diese Pins sind mit GND, VCC, SDA und SCL beschriftet. Ich habe mit dem Multimeter die Spannung zwischen VCC und GND gemessen, während der I2C-Scanner gelaufen ist und ansonsten NICHTS am Arduino angeschlossen war.

Dass SDA und SCL wechselnde Werte haben, ist klar. Aber zwischen VCC und GND hätte ich konstante Werte erwartet, denn das ist ja die Spannungsversorgung des Sensors.

Da muß eine stabile Spannung vorhanden sein.

Wenn Du das Shield abziehst hast Du das gleiche Problem mit dem Arduino DUE ?
Grüße Uwe

Es ist wie verhext - heute steht die Spannung (am Shield) wie eine 1. Ich habe den Messaufbau seit meiner Messung eigentlich unangetastet gelassen. Und nun habe ich stabile 3,3V, so wie es sein soll. (Das Multimeter ist neu und kalibriert.) Aber I2C geht trotzdem nicht.

Jedenfalls habe ich nun auch noch ein zweites Base Shield am Arduino probiert. 2 Sensoren und 2 Base Shields, an mehreren USB-Ports, mehreren USB-Kabeln, und mehreren PCs. Ich habe so ca. 50 Versuche gemacht - und in keiner Kombi erkennt der I2C-Scanner etwas.

Das einzige, was ich noch nicht ausgetauscht habe, ist der DUE. Aber ich bekomme wohl die Tage ein Alternativgerät zum Probieren.

Dann warten wir auf diesen letzten Test.
Grüße Uwe