In this article we look at an MAG3110 connected to a Beaglebone first of all lets look at the sensor.
Freescale’s MAG3110 is a small, low-power, digital 3-axis magnetometer. The device can be used in conjunction with a 3-axis accelerometer to realize an orientation independent electronic compass that can provide accurate heading information. It features a standard I2C serial interface output and smart embedded functions.
The MAG3110 is capable of measuring magnetic fields with an output data rate (ODR) up to 80 Hz; these output data rates correspond to sample intervals from 12.5 ms to several seconds. The MAG3110 is available in a plastic DFN package and it is guaranteed to operate over the extended temperature range of -40°C to +85°C.
Here is a typical module for this sensor
Parts Required
Schematic/Connection
[codesyntax lang=”cpp”]
#include <stdio.h> #include <stdlib.h> #include <linux/i2c-dev.h> #include <sys/ioctl.h> #include <fcntl.h> void main() { // Create I2C bus int file; char *bus = "/dev/i2c-2"; if((file = open(bus, O_RDWR)) < 0) { printf("Failed to open the bus. \n"); exit(1); } // Get I2C device, MAG3110 I2C address is 0x0E(14) ioctl(file, I2C_SLAVE, 0x0E); // Select control register1(0x10) // Send Start Command , Active mode char config[2] = {0}; config[0] = 0x10; config[1] = 0x01; write(file, config, 2); sleep(1); // Read 6 bytes of data // msb first // Read xMag msb data from register(0x01) char reg[1] = {0x01}; write(file, reg, 1); char data[1] = {0}; if(read(file, data, 1) != 1) { printf("Error : Input/Output error \n"); exit(1); } char data_0 = data[0]; // Read xMag lsb data from register(0x02) reg[0] = 0x02; write(file, reg, 1); read(file, data, 1); char data_1 = data[0]; // Read yMag msb data from register(0x03) reg[0] = 0x03; write(file, reg, 1); read(file, data, 1); char data_2 = data[0]; // Read yMag lsb data from register(0x04) reg[0] = 0x04; write(file, reg, 1); read(file, data, 1); char data_3 = data[0]; // Read zMag msb data from register(0x05) reg[0] = 0x05; write(file, reg, 1); read(file, data, 1); char data_4 = data[0]; // Read zMag lsb data from register(0x06) reg[0] = 0x06; write(file, reg, 1); read(file, data, 1); char data_5 = data[0]; // Convert the data int xMag = (data_0 * 256 + data_1); if(xMag > 32767) { xMag -= 65536; } int yMag = (data_2 * 256 + data_3); if(yMag > 32767) { yMag -= 65536; } int zMag = (data_4 * 256 + data_5); if(zMag > 32767) { zMag -= 65536; } // Output data to screen printf("Magnetic field in X-Axis : %d \n", xMag); printf("Magnetic field in Y-Axis : %d \n", yMag); printf("Magnetic field in Z-Axis : %d \n", zMag); }
[/codesyntax]
Code Example
This is a controleverything example – they have code examples for various platforms. This is the C example from https://github.com/ControlEverythingCommunity/MAG3110
Save this as MAG3110.c, I used the Cloud 9 IDE
First of all compile the c program.
$>gcc MAG3110.c -o MAG3110
Run the c program.
$>./MAG3110
Output
After running you should see something like this
Magnetic field in X-Axis : -746
Magnetic field in Y-Axis : 1233
Magnetic field in Z-Axis : 277