Joystick mit MLX90393 Magnetometer

Hallo!

Ich habe es mir momentan als Ziel gesetzt einen 3D gedruckten Joystick mit einem Arduino umzusetzen.
Bin bereits mit dem CAD-Design fast fertig:

Heute is der Sensor angekommen und ich wollte schauen ob alles funktioniert.
Und da ich hier schreibe ist es ja offensichtlich, dass es nicht funktioniert.

Ich habe die Anleitung nach Sparkfuns Hompage befolgt, da es das gleiche pcb desgin für das breakout module ist. (Qwiic Magnetometer (MLX90393) Hookup Guide - SparkFun Learn)

/*

  3.3V = 3.3V
  GND = GND
  SDA = A4
  SCL = A5

*/

#include <Wire.h>
#include <MLX90393.h>

MLX90393 mlx;
MLX90393::txyz data; //Create a structure, called data, of four floats (t, x, y, and z)

void setup()
{
  Serial.begin(9600);
  Serial.println("MLX90393 Read Example");
  Wire.begin();
  //Connect to sensor with I2C address jumpers set: A1 = 1, A0 = 0
  //Use DRDY pin connected to A3
  //Returns byte containing status bytes
  byte status = mlx.begin(1, 0, A3);
  delay(2000);

  //Report status from configuration
  Serial.print("Start status: 0x");
  if(status < 0x10) Serial.print("0"); //Pretty output
  Serial.println(status, BIN);
  
  mlx.setGainSel(1);
  mlx.setResolution(0, 0, 0); //x, y, z
  mlx.setOverSampling(0);
  mlx.setDigitalFiltering(0);
  //See MLX90393.h and .cpp for additional functions including:
  //set/getOverSample, set/getTemperatureOverSample, set/getDigitalFiltering, set/getResolution
  //set/getTemperatureCompensation, setOffsets, setWThresholds
}

void loop()
{
  mlx.readData(data); //Read the values from the sensor

  Serial.print("magX[");
  Serial.print(data.x);
  Serial.print("] magY[");
  Serial.print(data.y);
  Serial.print("] magZ[");
  Serial.print(data.z);
  Serial.print("] temperature(C)[");
  Serial.print(data.t);
  //Serial.print("] status[");
  //Serial.print(status);
  Serial.print("]");

  Serial.println();

  delay(100);
}

Als Arduino benutze ich einen Leonardo und der Sensor ist von Melaxis MLX90393.
Wenn ich alles nach Anleitung anstecke bekomme ich am seriellen Monitor "Start status: 0x11111111"
ausgegeben und mehr nicht.
Wenn ich den Sensor vom Breadboard abstecke oder ihn im setup falsch initalisiere bekomme ich unrealistische Werte ausgegeben (wie 440°C bei Raumtemperatur von 22°C).

Mir würde das Verhalten sagen, dass der Sensor (bei richtigem Anschluss/Code) etwas macht aber nicht aus dem setup raus kommt oder im Loop die Daten nicht an den Arduino bekommt.

Ich würde mich wirklich freuen wenn mir jmd. damit helfen könnte oder mir Lösungsansätze vorschlägt.
Mit dem Herstellerdatenblatt oder der benutzen Bibliothek komme ich mit meinem Verständnis nicht sehr weit.

Hier Bilder von meinem Aufbau:
Der Sensor wird durch eine Netzteil mit 3.3V versorgt und Sensor, Netzteil und Arduino haben alle das gleiche Nullpotential.



Die SDA/SCL Pins sind beim Leonardo auf D2 (SDA) und D3 (SCL).
Anders als beim UNO wo sie auf A4 (SDA) und A5 (SCL) sind.
Es gibt am Leonardo auch Pins mit der Bezeichnung SDA SCL am Ende der Pinleiste D8, D9 … (diese sind direkt mit D2 und D3 verbunden).

uxomm:
Die SDA/SCL Pins sind beim Leonardo auf D2 (SDA) und D3 (SCL).
Anders als beim UNO wo sie auf A4 (SDA) und A5 (SCL) sind.
Es gibt am Leonardo auch Pins mit der Bezeichnung SDA SCL am Ende der Pinleiste D8, D9 … (diese sind direkt mit D2 und D3 verbunden).

Danke habe SDA und SCL umgesteckt, funktioniert aber leider trotzdem noch nicht.

Kann es sein das die Bibiliothek für den Sensor nicht richtig funktioniert? die Wire.h wird im Code orange vorgehoben aber die MLX90393.h nicht.

Ich habe Serial.prints nach allen Zeilen gemacht um zu schauen wo das Programm hängen bleibt und es bleibt in Zeile 50 bei dem "mlx.readData(data);" stehen.

Also der Serielle Montor gibt mir das aus
"30
Start status: 0x11111111
36
42
50
"

/*
/*

  3.3V = 3.3V
  GND = GND
  SDA = D2
  SCL = D3

*/

#include <Wire.h>
#include <MLX90393.h>

MLX90393 mlx;
MLX90393::txyz data; //Create a structure, called data, of four floats (t, x, y, and z)

void setup()
{
  Serial.begin(9600);
  Serial.println("19");
  Serial.println("MLX90393 Read Example");
  Serial.println("21");
  Wire.begin();
  Serial.println("23");
  //Connect to sensor with I2C address jumpers set: A1 = 1, A0 = 0
  //Use DRDY pin connected to A3
  //Returns byte containing status bytes
  byte status = mlx.begin(1, 0, A3);
  Serial.println("28");
  delay(2000);
  Serial.println("30");

  //Report status from configuration
  Serial.print("Start status: 0x");
  if (status < 0x10) Serial.print("0"); //Pretty output
  Serial.println(status, BIN);
  Serial.println("36");

  mlx.setGainSel(1);
  mlx.setResolution(0, 0, 0); //x, y, z
  mlx.setOverSampling(0);
  mlx.setDigitalFiltering(0);
  Serial.println("42");
  //See MLX90393.h and .cpp for additional functions including:
  //set/getOverSample, set/getTemperatureOverSample, set/getDigitalFiltering, set/getResolution
  //set/getTemperatureCompensation, setOffsets, setWThresholds
}

void loop()
{
  Serial.println("50");
  mlx.readData(data); //Read the values from the sensor
  Serial.println("52");
  Serial.print("magX[");
  Serial.println("54");
  Serial.print(data.x);
  Serial.println("56");
  Serial.print("] magY[");
  Serial.println("58");
  Serial.print(data.y);
  Serial.println("60");
  Serial.print("] magZ[");
  Serial.println("62");
  Serial.print(data.z);
  Serial.println("64");
  Serial.print("] temperature(C)[");
  Serial.println("66");
  Serial.print(data.t);
  Serial.println("68");
  //Serial.print("] status[");
  //Serial.print(status);
  Serial.print("]");
  Serial.println("72");

  Serial.println();

  delay(100);
}

EDIT: Habe es auch mal mit einem UNO getestet.
Habe SDA und SCL an die Pins verbunden die bei meinem UNO so beschrieben waren
und es bleibt an der gleichen Zeile hängen.
Serieller Monitor:"
19
MLX90393 Read Example
21
23
28
30
Start status: 0x11111111
36
42
50
"

Ich habe deinen Hardware nicht und kann deshalb nichts testen und deine Frage leider nicht beantworten.
Wenn es ein Tutorial bei Sparkfun gibt, dann würde ich mich daran halten, die sind meist recht OK.

Was mir aber an den Fotos noch auffällt:
Für mich sieht es so aus, als ob die Anschlüsse 3,3 Volt (oranges Kabel) und GND (schwazes Kabel) des Sensor-Breakout-Boards beide an GND des Breadboards hängen. Das Sensor-Board hätte somit keine Stromversorgung.

Schau mal ob das Breakout-Board überhaupt (noch) funktioniert.
Zum Beispiel mit einem I2C-Scanner wie z.B.:
http://playground.arduino.cc/Main/I2cScanner
oder

Denn fehlende oder falsche Stromversorgung nehmen manche Chips ziemlich übel, wenn auf Datenleitungen Spannungen vorhanden sind.

Was mir sonst noch einfällt.
Der Leonardo ist, was die Anschlüsse betrifft, ein wenig anders als ein UNO, obwohl er auf den ersten Blick diesem sehr ähnelt. Zum Beispiel sind auch die Interrupt-Pins anders "angeordnet" als beim UNO. Wenn du also (auch) einen UNO besitzt, dann würde ich zuerst mal mit diesem testen und nicht mit einem Leonardo. Denn sehr viele Beispiele (im Internet) arbeiten mit einem UNO.
Oder du machst dich gut vertraut mit den Unterschieden zwischen UNO und Leonardo.

Das verstehe ich natürlich und du warst ja bereits sehr hilfreich, allein damit mir zu sagen wo die SDA/SCL pins sind.

Auf dem Foto sind die 3.3 Volt auf ground da hast du recht :smiley: aber in meinem aktuellen Aufbau ist es richtig angeschlossen. Habe es wahrscheinlich beim fürs Foto hinrichten ausversehen ausgesteckt und wieder falsch zusammen gesteckt.

der I2C Scanner findet etwas.
"Scanning...
I2C device found at address 0x0D !
done"