I have some troubles to read magnetics measurements with MLX90393 sensor and TCA9548A multiplexer. My project is to take 3D map of magnetic field which created by Helmoltz coils. To do that I want to make a 2D matrix of sensor that I translate inside the coils.
For now I just try to get data which are transmit by the sensor with the multiplexer, but I have just constant values. I don't know if it's problem of code or electronic one.
This is my code, I know that it is not really optimize but it's my second arduino project. I try two codes, first one is homemade code with the second one is with adafruit library.
First code:
Code: Select all
#include <Adafruit_MLX90393.h>
#include <Wire.h>
#define Addr_MUX 0x70
#define Addr_cap 0x0C
#define Addr_xyz 0x3E
#define Addr_xyz_RM 0x4E
Adafruit_MLX90393 Sensor;
//initialise la communicaiton série et le capteur
void setup(){
Serial.begin(9600);
Wire.begin();
//Sensor.begin_I2C();
//Sensor.begin();
Serial.print("B_z");
Serial.print("\t");
Serial.print("B_y");
Serial.print("\t");
Serial.print("B_x");
Serial.print("\t");
Serial.println("mT");
}
void TCAselect (uint8_t i){
if (i>7) return;
Wire.beginTransmission(Addr_MUX);
Wire.write(i>>1);
Wire.endTransmission();
}
void readB(uint8_t bus){
TCAselect(bus);
unsigned int data[7];
Wire.beginTransmission(Addr_cap);
Wire.write(Addr_xyz);
Wire.endTransmission();
Wire.requestFrom(Addr_cap, 1);
if (Wire.available()==1){
unsigned int c = Wire.read();
}delay(50);
Wire.beginTransmission(Addr_cap);
Wire.write(Addr_xyz_RM);
Wire.endTransmission();
Wire.requestFrom(Addr_cap, 7);
if (Wire.available()==7){
for (int i = 0; i<=7; i++){
data[i]=Wire.read();
}
}
// récupération des données en bits
int X_mag = data[1] * 256 + data[2];
int Y_mag = data[3] * 256 + data[4];
int Z_mag = data[5] * 256 + data[6];
// int T = data[7] * 256 + data[8];
// 3534.3 experimental calibration
float X_mes = abs(X_mag / 3534.3);
float Y_mes = abs(Y_mag / 3534.3);
float Z_mes = abs(Z_mag / 3534.3);
String(data_mes) = String(X_mes);
String(str2) = String(Y_mes);
String(str3) = String(Z_mes);
data_mes.concat("\t" + str2 + "\t" + str3);
Serial.println(data_mes);
}
void loop(){
readB(0);
delay(500);
}
Code: Select all
#include <Adafruit_MLX90393.h>
#include <Wire.h>
#define Addr_MUX 0x70
Adafruit_MLX90393 Sensor;
//initialise la communicaiton série et le capteur
void setup(){
Serial.begin(9600);
Wire.begin();
//Sensor.begin_I2C();
//Sensor.begin();
Serial.print("B_z");
Serial.print("\t");
Serial.print("B_y");
Serial.print("\t");
Serial.print("B_x");
Serial.print("\t");
Serial.println("mT");
}
void TCAselect (uint8_t i){
if (i>7) return;
Wire.beginTransmission(Addr_MUX);
Wire.write(i>>1);
Wire.endTransmission();
}
void readB(uint8_t bus){
TCAselect(bus);
float x, y, z;
if (Sensor.readData(&x, &y, &z)){
Serial.print(x*1000, 2); Serial.print("\t");
Serial.print(y*1000, 2); Serial.print("\t");
Serial.println(z*1000, 2);
} else {Serial.println("Impossible de lire B"); }
}
void loop(){
readB(0);
delay(500);
}
In picture 3 the electrical diagram, I put pull-up resistors for SD0 and SC0 ouput, and pull-down resistor for reset output (r = 4.7kOhm for each resistors)
Thank you for reading and for helping.