This code will read the data from the X,Y and Z axis of the MLX90393 Magnetometer and display it on a serial monitor. Remember to check the solder links on the I2C lines on your Nucleo as this can interfere on certain boards.
main.cpp@0:61c51438425a, 2018-11-21 (annotated)
- Committer:
- Angath
- Date:
- Wed Nov 21 22:27:05 2018 +0000
- Revision:
- 0:61c51438425a
Working code to read the data from the X,Y and Z axis of the MLX90393
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Angath | 0:61c51438425a | 1 | #include "mbed.h" |
Angath | 0:61c51438425a | 2 | |
Angath | 0:61c51438425a | 3 | int addr = 0x0C <<1; // 8bit I2C address |
Angath | 0:61c51438425a | 4 | |
Angath | 0:61c51438425a | 5 | I2C i2c(PB_9 , PB_8); //sda, scl |
Angath | 0:61c51438425a | 6 | |
Angath | 0:61c51438425a | 7 | Serial pc(PA_2, PA_3); //Tx/Rx |
Angath | 0:61c51438425a | 8 | |
Angath | 0:61c51438425a | 9 | int main() |
Angath | 0:61c51438425a | 10 | { |
Angath | 0:61c51438425a | 11 | char config [4]; |
Angath | 0:61c51438425a | 12 | char data[7] = {0}; |
Angath | 0:61c51438425a | 13 | |
Angath | 0:61c51438425a | 14 | config[0] = 0x60; |
Angath | 0:61c51438425a | 15 | config[1] = 0x00; |
Angath | 0:61c51438425a | 16 | config[2] = 0x5C; |
Angath | 0:61c51438425a | 17 | config[3] = 0x00; |
Angath | 0:61c51438425a | 18 | |
Angath | 0:61c51438425a | 19 | i2c.write(addr, config, 4, false); |
Angath | 0:61c51438425a | 20 | |
Angath | 0:61c51438425a | 21 | i2c.read(addr, data, 1); |
Angath | 0:61c51438425a | 22 | |
Angath | 0:61c51438425a | 23 | config[0] = 0x60; |
Angath | 0:61c51438425a | 24 | config[1] = 0x02; |
Angath | 0:61c51438425a | 25 | config[2] = 0xB4; |
Angath | 0:61c51438425a | 26 | config[3] = 0x02; |
Angath | 0:61c51438425a | 27 | |
Angath | 0:61c51438425a | 28 | i2c.write(addr, config, 4, false); |
Angath | 0:61c51438425a | 29 | |
Angath | 0:61c51438425a | 30 | i2c.read(addr, data, 1); |
Angath | 0:61c51438425a | 31 | |
Angath | 0:61c51438425a | 32 | wait(0.25); |
Angath | 0:61c51438425a | 33 | |
Angath | 0:61c51438425a | 34 | while (1) { |
Angath | 0:61c51438425a | 35 | |
Angath | 0:61c51438425a | 36 | config[0] = 0x3E; // Single measurement mode, ZYX enabled |
Angath | 0:61c51438425a | 37 | |
Angath | 0:61c51438425a | 38 | i2c.write(addr, config, 1, false); |
Angath | 0:61c51438425a | 39 | i2c.read(addr, data, 1); |
Angath | 0:61c51438425a | 40 | |
Angath | 0:61c51438425a | 41 | wait(0.1); |
Angath | 0:61c51438425a | 42 | |
Angath | 0:61c51438425a | 43 | config[0] = 0x4E; |
Angath | 0:61c51438425a | 44 | |
Angath | 0:61c51438425a | 45 | i2c.write(addr, config, 1, false); // Read command, followed by ZYX bits set |
Angath | 0:61c51438425a | 46 | i2c.read(addr, data, 7); |
Angath | 0:61c51438425a | 47 | |
Angath | 0:61c51438425a | 48 | int xMag = ((data[1] * 256) + data[2]); |
Angath | 0:61c51438425a | 49 | int yMag = ((data[3] * 256) + data[4]); |
Angath | 0:61c51438425a | 50 | int zMag = ((data[5] * 256) + data[6]); |
Angath | 0:61c51438425a | 51 | |
Angath | 0:61c51438425a | 52 | printf("X Axis = %d \n", xMag); |
Angath | 0:61c51438425a | 53 | printf("Y Axis = %d \n", yMag); |
Angath | 0:61c51438425a | 54 | printf("Z Axis = %d \n", zMag); |
Angath | 0:61c51438425a | 55 | |
Angath | 0:61c51438425a | 56 | wait(5); |
Angath | 0:61c51438425a | 57 | } |
Angath | 0:61c51438425a | 58 | } |