使用Arduino 連結 LSM303DLH模組(加速度+磁力計)
使用Arduino 連結 LSM303DLH模組(加速度+磁力計)接線說明:
1. 需準備邏輯準位轉換IC (Logic Level converter)
2. 接線圖如下
3. Arduino IDE code:
#include <Wire.h>
#include <math.h>
// LSM303DLH 的 i2c 地址。由於 Arduino i2c 資料空間是 7 bit 所以要右移一個位元
#define ACC_ADDRESS (0x30 >> 1)
#define MAG_ADDRESS (0x3C >> 1)
#define LSM303DLH_CTRL_REG1_A 0x20
#define LSM303DLH_CTRL_REG2_A 0x21
#define LSM303DLH_CTRL_REG3_A 0x22
#define LSM303DLH_CTRL_REG4_A 0x23
#define LSM303DLH_CTRL_REG5_A 0x24
#define LSM303DLH_HP_FILTER_RESET_A 0x25
#define LSM303DLH_REFERENCE_A 0x26
#define LSM303DLH_STATUS_REG_A 0x27
#define LSM303DLH_OUT_X_L_A 0x28
#define LSM303DLH_OUT_X_H_A 0x29
#define LSM303DLH_OUT_Y_L_A 0x2A
#define LSM303DLH_OUT_Y_H_A 0x2B
#define LSM303DLH_OUT_Z_L_A 0x2C
#define LSM303DLH_OUT_Z_H_A 0x2D
#define LSM303DLH_INT1_CFG_A 0x30
#define LSM303DLH_INT1_SRC_A 0x31
#define LSM303DLH_INT1_THS_A 0x32
#define LSM303DLH_INT1_DURATION_A 0x33
#define LSM303DLH_INT2_CFG_A 0x34
#define LSM303DLH_INT2_SRC_A 0x35
#define LSM303DLH_INT2_THS_A 0x36
#define LSM303DLH_INT2_DURATION_A 0x37
#define LSM303DLH_CRA_REG_M 0x00
#define LSM303DLH_CRB_REG_M 0x01
#define LSM303DLH_MR_REG_M 0x02
#define LSM303DLH_OUT_X_H_M 0x03
#define LSM303DLH_OUT_X_L_M 0x04
#define LSM303DLH_OUT_Y_H_M 0x05
#define LSM303DLH_OUT_Y_L_M 0x06
#define LSM303DLH_OUT_Z_H_M 0x07
#define LSM303DLH_OUT_Z_L_M 0x08
#define LSM303DLH_SR_REG_M 0x09
#define LSM303DLH_IRA_REG_M 0x0A
#define LSM303DLH_IRB_REG_M 0x0B
#define LSM303DLH_IRC_REG_M 0x0C
int ax=0,ay=0,az=0;
int mx=0,my=0,mz=0;
void setup(){
Serial.begin(9600);
Wire.begin();
enableDefault();
}
void loop(){
readdata();
Serial.println("Accelerometer:\t\t\tMagnetometer:");
Serial.print("X:");
Serial.print(ax);
Serial.print("\t\t\t\tX:");
Serial.println(mx);
Serial.print("Y:");
Serial.print(ay);
Serial.print("\t\t\t\tY:");
Serial.println(my);
Serial.print("Z:");
Serial.print(az);
Serial.print("\t\t\t\tZ:");
Serial.println(mz);
delay(500);
}
void enableDefault()
{
// Enable Accelerometer, register 0x20
// 0x27 = 0b00100111
// Normal power mode, all axes enabled
writeAccReg(0x20, 0x27);
// Enable Magnetometer, register 0x02
// 0x00 = 0b00000000
// Continuous conversion mode
writeMagReg(0x02, 0x00);
}
// Writes an accelerometer register
void writeAccReg(byte reg, byte value)
{
Wire.beginTransmission(ACC_ADDRESS);
Wire.write(reg);
Wire.write(value);
Wire.endTransmission();
}
// Writes a magnetometer register
void writeMagReg(byte reg, byte value)
{
Wire.beginTransmission(MAG_ADDRESS);
Wire.write(reg);
Wire.write(value);
}
// Reads all 6 channels of the LSM303DLH and stores them in the object variables
void readdata()
{
readAcc();
readMag();
}
// Reads the 3 accelerometer channels and stores them in vector a
void readAcc()
{
Wire.beginTransmission(ACC_ADDRESS);
// assert the MSB of the address to get the accelerometer
// to do slave-transmit subaddress updating.
Wire.write(0x28 | (1 << 7));
Wire.endTransmission();
Wire.requestFrom(ACC_ADDRESS, 6);
while (Wire.available() < 6);
uint8_t xla = Wire.read();
uint8_t xha = Wire.read();
uint8_t yla = Wire.read();
uint8_t yha = Wire.read();
uint8_t zla = Wire.read();
uint8_t zha = Wire.read();
ax = (xha << 8 | xla) >> 4;
ay = (yha << 8 | yla) >> 4;
az = (zha << 8 | zla) >> 4;
}
// Reads the 3 magnetometer channels and stores them in vector m
void readMag()
{
Wire.beginTransmission(MAG_ADDRESS);
Wire.write(LSM303DLH_OUT_X_H_M);
Wire.endTransmission();
Wire.requestFrom(MAG_ADDRESS, 6);
while (Wire.available() < 6);
uint8_t xhm = Wire.read();
uint8_t xlm = Wire.read();
uint8_t yhm = Wire.read();
uint8_t ylm = Wire.read();
uint8_t zhm = Wire.read();
uint8_t zlm = Wire.read();
mx = (xhm << 8 | xlm);
my = (yhm << 8 | ylm);
mz = (zhm << 8 | zlm);
}

0 意見:
張貼留言