Skip to content

Commit 46c2dac

Browse files
committed
Add Examples and correct some bugs
1 parent d653d8b commit 46c2dac

File tree

7 files changed

+140
-31
lines changed

7 files changed

+140
-31
lines changed

README.md

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -23,14 +23,14 @@ MIT license, all text above must be included in any redistribution.
2323

2424
## Connections
2525
### Power supply
26-
| Arduino | MagAlpha |
27-
| -------- | -------- |
28-
| GND | GND |
26+
| Arduino | MagVector |
27+
| -------- | --------- |
28+
| GND | GND |
2929
| **+3.3V** (Not 5V)| VDD |
3030

3131
| Warning |
3232
| :-------: |
33-
| Unlike some Arduino & Genuino boards, the **MagAlpha runs at 3.3V**. Even if the I/O can tolerate 5V, check that the voltage applied to VDD is at 3.3V. **Applying a voltages higher than 3.3V to the VDD pin could damage the sensor**.|
33+
| Unlike some Arduino & Genuino boards, the **MagVector runs at 3.3V**. Even if the I/O can tolerate 5V, check that the voltage applied to VDD is at 3.3V. **Applying a voltages higher than 3.3V to the VDD pin could damage the sensor**.|
3434

3535
### Serial communication
3636
MagVector sensors have different communication interfaces available. The MV300 is available with either a I2C or a SPI communication interface.
@@ -44,19 +44,19 @@ MagVector sensors have different communication interfaces available. The MV300 i
4444
Do not forget to connect SA1 and SA2 pins to define the I2C device address.
4545

4646
#### SPI (4-wire interface)
47-
| Arduino | MagAlpha |
48-
| --------------- | -------- |
49-
| COPI (aka MOSI) | COPI |
50-
| CIPO (aka MISO) | CIPO |
51-
| SCK | SCLK |
47+
| Arduino | MagVector |
48+
| --------------- | --------- |
49+
| COPI (aka MOSI) | COPI |
50+
| CIPO (aka MISO) | CIPO |
51+
| SCK | SCLK |
5252
| any available digital pin (default: pin 7) | /CS |
5353

5454
## Setup
5555
Install the library directly from within the Arduino IDE by using the Library Manager (Sketch => Include Library => Manage Libraries...).
5656

5757
It is also possible to import the library Zip file (check release tab) from the Arduino IDE (Sketch => Include Library => Add .ZIP Library...).
5858

59-
The library can also be manually installed by copying the MagAlpha library folder in your arduinosketchfolder/libraries/ folder. You may need to create the libraries subfolder if its your first library. Restart the IDE to see the library.
59+
The library can also be manually installed by copying the MagVector library folder in your arduinosketchfolder/libraries/ folder. You may need to create the libraries subfolder if its your first library. Restart the IDE to see the library.
6060

6161
Check this tutorial on Arduino library installation for more information:
6262
* [All About Arduino Libraries](http://learn.adafruit.com/adafruit-all-about-arduino-libraries-install-use)
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
#include <mv300sensor.h>
2+
3+
MV300SensorI2c mv300sensori2c;
4+
uint8_t registerReadbackValue = 0;
5+
uint16_t magFieldBx, magFieldBy, magFieldBz, temperature;
6+
int16_t magFieldBxSigned, magFieldBySigned, magFieldBzSigned, temperatureSigned;
7+
double magFieldBxInMilliTesla, magFieldByInMilliTesla, magFieldBzInMilliTesla, temperatureInDegreeCelsius;
8+
uint8_t frameCounter;
9+
char data[400];
10+
11+
void setup() {
12+
mv300sensori2c.begin();
13+
mv300sensori2c.setDeviceAddress(0x14);
14+
mv300sensori2c.setClockFrequency(400000);
15+
Serial.begin(115200, SERIAL_8N1);
16+
while(!Serial){}//wait for serial port to connect. Needed for native USB
17+
mv300sensori2c.writeRegister(16, 4, 0); //Set TRIGMODE=1 (Trigger measurement after write or read frame), BRANGE=0 (±250mT)
18+
mv300sensori2c.writeRegister(17, 1, 0); //Set MODE = 1 (Host Controlled Mode)
19+
for(uint8_t i=0;i<20;++i) {
20+
registerReadbackValue=mv300sensori2c.readRegister(i, 0);
21+
sprintf(data, "Reg[%u] = %u", i, registerReadbackValue);
22+
Serial.println(data);
23+
}
24+
mv300sensori2c.readRegister(0, 1); //Read register 0 and trigger a new acquisition by setting 2-bit Trigger to 1
25+
}
26+
27+
void loop() {
28+
delayMicroseconds(175); //wait for the previous conversion to finish
29+
mv300sensori2c.readMagneticComponents(&magFieldBx, &magFieldBy, &magFieldBz, &temperature, &frameCounter);
30+
magFieldBxSigned=twosComplement(magFieldBx, 12);
31+
magFieldBySigned=twosComplement(magFieldBy, 12);
32+
magFieldBzSigned=twosComplement(magFieldBz, 12);
33+
temperatureSigned=twosComplement(temperature, 12);
34+
magFieldBxInMilliTesla=convertMagneticFieldFromLsbToMilliTesla(magFieldBxSigned, 0);
35+
magFieldByInMilliTesla=convertMagneticFieldFromLsbToMilliTesla(magFieldBySigned, 0);
36+
magFieldBzInMilliTesla=convertMagneticFieldFromLsbToMilliTesla(magFieldBzSigned, 0);
37+
temperatureInDegreeCelsius=convertTemperatureFromLsbToDegreeCelsius(temperatureSigned);
38+
sprintf(data, "Bx = % 8.3f mT, By = % 8.3f mT, Bz = % 8.3f mT, Temperature = % 6.1f °C, frame = %u", magFieldBxInMilliTesla, magFieldByInMilliTesla, magFieldBzInMilliTesla, temperatureInDegreeCelsius, frameCounter);
39+
Serial.println(data);
40+
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
#include <mv300sensor.h>
2+
3+
MV300SensorSpi mv300sensorspi;
4+
const uint8_t spiChipSelectPin = 7;
5+
int32_t spiSclkClockFrequency = 1000000;
6+
uint8_t registerReadbackValue = 0;
7+
uint16_t magFieldBx, magFieldBy, magFieldBz, temperature;
8+
int16_t magFieldBxSigned, magFieldBySigned, magFieldBzSigned, temperatureSigned;
9+
double magFieldBxInMilliTesla, magFieldByInMilliTesla, magFieldBzInMilliTesla, temperatureInDegreeCelsius;
10+
uint8_t frameCounter;
11+
char data[400];
12+
13+
void setup() {
14+
mv300sensorspi.begin(spiSclkClockFrequency, SPI_MODE3, spiChipSelectPin);
15+
Serial.begin(115200, SERIAL_8N1);
16+
while(!Serial){}//wait for serial port to connect. Needed for native USB
17+
mv300sensorspi.writeRegister(16, 4, 0); //Set TRIGMODE=1 (Trigger measurement after write or read frame), BRANGE=0 (±250mT)
18+
mv300sensorspi.writeRegister(17, 1, 0); //Set MODE = 1 (Host Controlled Mode)
19+
for(uint8_t i=0;i<20;++i) {
20+
registerReadbackValue=mv300sensorspi.readRegister(i, 0);
21+
sprintf(data, "Reg[%u] = %u", i, registerReadbackValue);
22+
Serial.println(data);
23+
}
24+
mv300sensorspi.readRegister(0, 1); //Read register 0 and trigger a new acquisition by setting 2-bit Trigger to 1
25+
}
26+
27+
void loop() {
28+
delayMicroseconds(175); //wait for the previous conversion to finish
29+
mv300sensorspi.readMagneticComponents(&magFieldBx, &magFieldBy, &magFieldBz, &temperature, &frameCounter, 1);
30+
magFieldBxSigned=twosComplement(magFieldBx, 12);
31+
magFieldBySigned=twosComplement(magFieldBy, 12);
32+
magFieldBzSigned=twosComplement(magFieldBz, 12);
33+
temperatureSigned=twosComplement(temperature, 12);
34+
magFieldBxInMilliTesla=convertMagneticFieldFromLsbToMilliTesla(magFieldBxSigned, 0);
35+
magFieldByInMilliTesla=convertMagneticFieldFromLsbToMilliTesla(magFieldBySigned, 0);
36+
magFieldBzInMilliTesla=convertMagneticFieldFromLsbToMilliTesla(magFieldBzSigned, 0);
37+
temperatureInDegreeCelsius=convertTemperatureFromLsbToDegreeCelsius(temperatureSigned);
38+
sprintf(data, "Bx = % 8.3f mT, By = % 8.3f mT, Bz = % 8.3f mT, Temperature = % 6.1f °C, frame = %u", magFieldBxInMilliTesla, magFieldByInMilliTesla, magFieldBzInMilliTesla, temperatureInDegreeCelsius, frameCounter);
39+
Serial.println(data);
40+
}

keywords.txt

Lines changed: 23 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -13,26 +13,29 @@ MV300SensorSpi KEYWORD1
1313
# Methods and Functions (KEYWORD2)
1414
#######################################
1515

16-
begin KEYWORD2
17-
end KEYWORD2
18-
setDeviceAddress KEYWORD2
19-
getDeviceAddress KEYWORD2
20-
setDataMode KEYWORD2
21-
getDataMode KEYWORD2
22-
setChipSelectPin KEYWORD2
23-
setClockFrequency KEYWORD2
24-
getClockFrequency KEYWORD2
25-
readMagneticComponents KEYWORD2
26-
readRegisterQuickReadMode KEYWORD2
27-
readRegisterBurstMode KEYWORD2
28-
writeRegisterBurstMode KEYWORD2
29-
readRegister KEYWORD2
30-
writeRegister KEYWORD2
31-
readMagneticComponentsWithCrcCheck KEYWORD2
32-
readRegisterQuickReadModeWithCrcCheck KEYWORD2
33-
readRegisterBurstModeWithCrcCheck KEYWORD2
34-
readRegisterWithCrcCheck KEYWORD2
35-
writeRegisterWithCrcCheck KEYWORD2
16+
begin KEYWORD2
17+
end KEYWORD2
18+
setDeviceAddress KEYWORD2
19+
getDeviceAddress KEYWORD2
20+
setDataMode KEYWORD2
21+
getDataMode KEYWORD2
22+
setChipSelectPin KEYWORD2
23+
setClockFrequency KEYWORD2
24+
getClockFrequency KEYWORD2
25+
readMagneticComponents KEYWORD2
26+
readRegisterQuickReadMode KEYWORD2
27+
readRegisterBurstMode KEYWORD2
28+
writeRegisterBurstMode KEYWORD2
29+
readRegister KEYWORD2
30+
writeRegister KEYWORD2
31+
readMagneticComponentsWithCrcCheck KEYWORD2
32+
readRegisterQuickReadModeWithCrcCheck KEYWORD2
33+
readRegisterBurstModeWithCrcCheck KEYWORD2
34+
readRegisterWithCrcCheck KEYWORD2
35+
writeRegisterWithCrcCheck KEYWORD2
36+
twosComplement KEYWORD2
37+
convertMagneticFieldFromLsbToMilliTesla KEYWORD2
38+
convertTemperatureFromLsbToDegreeCelsius KEYWORD2
3639

3740
#######################################
3841
# Instances (KEYWORD2)

library.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
name=MagVector 3D Magnetic Sensor Library
1+
name=MagVector 3D Magnetic Sensor
22
version=1.0.0
33
author=Mathieu Kaelin, Monolithic Power Systems <[email protected]>
44
maintainer=Mathieu Kaelin <[email protected]>

src/mv300sensor.cpp

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,28 @@ uint8_t crcPolynomialLookupTable[256] ={0x00,0x07,0x0e,0x09,0x1c,0x1b,0x12,0x15,
1717
0xae,0xa9,0xa0,0xa7,0xb2,0xb5,0xbc,0xbb,0x96,0x91,0x98,0x9f,0x8a,0x8d,0x84,0x83,
1818
0xde,0xd9,0xd0,0xd7,0xc2,0xc5,0xcc,0xcb,0xe6,0xe1,0xe8,0xef,0xfa,0xfd,0xf4,0xf3};
1919

20+
int16_t twosComplement(uint16_t value, uint8_t numberOfBits) {
21+
if ((value & (1 << (numberOfBits - 1))) != 0) {
22+
value = value - (1 << numberOfBits);
23+
}
24+
return value;
25+
}
26+
27+
double convertMagneticFieldFromLsbToMilliTesla(int16_t magneticFieldInLsb, uint8_t brange) {
28+
int16_t valueInMilliTesla;
29+
if (brange == 0) {
30+
valueInMilliTesla=magneticFieldInLsb/7.0;
31+
}
32+
else {
33+
valueInMilliTesla=magneticFieldInLsb/14.0;
34+
}
35+
return valueInMilliTesla;
36+
}
37+
38+
double convertTemperatureFromLsbToDegreeCelsius(int16_t temperatureInLsb) {
39+
return (temperatureInLsb/5.0)-41.0;
40+
}
41+
2042
MV300SensorI2c::MV300SensorI2c(){
2143
i2cAddress=0x14;
2244
}

src/mv300sensor.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,10 @@
1010
#include <SPI.h>
1111
#include <Wire.h>
1212

13+
int16_t twosComplement(uint16_t value, uint8_t numberOfBits=12);
14+
double convertMagneticFieldFromLsbToMilliTesla(int16_t magneticFieldInLsb, uint8_t brange=0);
15+
double convertTemperatureFromLsbToDegreeCelsius(int16_t temperatureInLsb);
16+
1317
class MV300SensorI2c {
1418
public:
1519
MV300SensorI2c();

0 commit comments

Comments
 (0)