Если вы записываете в случайные регистры I2C, вам нужно перезапустить передачу. Просто сделайте функцию, чтобы сделать это проще.
void writeReg ( int reg, int value )
{
Wire.beginTransmission(ADXAddress);
Wire.write(reg);
Wire.write(value);
Wire.endTransmission();
}
void setup()
{
Wire.setModule(0);
Wire.begin(ADXAddress);
Serial.begin(9600);
delay(100);
writeReg(Power_Register,8);
writeReg(BW_rate,10); // <-- should this be 0x10 ?
writeReg(dataFormat,11); // <-- should this be 0x11 ?
writeReg(fifoCntrl,0); // <-- this isn't strictly needed as fifoCntrl will be 0 at power on reset anyway
}
Во-вторых, урок, который вы использовали (я видел его в Интернете), на самом деле не на 100% правильный. При чтении регистра он должен записать только один байт, а не два перед чтением, один раз для установки указателя регистра. Упростите ваш код, чтобы сделать другую функцию для чтения, чтобы сделать его более легким для чтения.
int readAxis ( int reg )
{
Wire.beginTransmission(ADXAddress);
Wire.write(reg);
Wire.endTransmission();
Wire.requestFrom(ADXAddress,2);
int d0 = Wire.read();
int d1 = Wire.read();
return (d1<<8) + d0;
}
void loop ()
{
X_out = readAxis(X_Axis_Register_DATAX0); // this will read TWO bytes starting from X0 register (LSB + MSB)
Y_out = readAxis(X_Axis_Register_DATAY0);
Z_out = readAxis(X_Axis_Register_DATAZ0);
:
В-третьих, вы фактически ничего не печатаете, потому что забыли установить значения Xa, Ya, Za
:
Xa = (float)X_out/RANGE;
Ya = (float)Y_out/RANGE;
Za = (float)Z_out/RANGE;
Serial.print("Xa= ");
Serial.print(Xa);Serial.print("\t");
Serial.print("Ya= ");
Serial.print(Ya);Serial.print("\t");
Serial.print("Za= ");
Serial.println(Za);
Вам необходимо определить RANGE
на основе полной шкалы выбранного вами выхода ADXL (в единицах G). Пожалуйста, ознакомьтесь с таблицей ADXL для вашего режима работы (то есть это 2 Г или 16 Г и т. Д. ... каковы значения полной шкалы для каждого?)
#define ADXL_FULLSCALE 4096 // 2^(13 bits- 1 signed bit)
#define ADXL_FULLSCALE_G 16 // +/- 16 G operation
#define RANGE (ADXL_FULLSCALE /ADXL_FULLSCALE_G )