Modifica registri MPU6050

Ciao a tutti

Ho un mpu6050 e volevo provare a impostare il fondoscala della lettura delle accelerazioni a 16g.

Siccome non ho mai fatto queste operazioni sui registri, prima di scriverli ho provato solo a leggerli ma ho già trovato difficoltà.

Non capisco se li leggo correttamente ::slight_smile:

per leggere il valore del registro utilizzo questo sketch, le righe da 50 a 55 le ho scritte io

#include<Wire.h>
const int MPU=0x68;  // I2C address of the MPU-6050
int16_t Tmp,GyX,GyY,GyZ;

float AcX;
float AcY;
float AcZ;


byte lettura;

void setup(){
  Wire.begin();
  Wire.beginTransmission(MPU);
  Wire.write(0x6B);  // PWR_MGMT_1 register
  Wire.write(0);     // set to zero (wakes up the MPU-6050)
  Wire.endTransmission(true);
  Serial.begin(9600);
  

}
void loop(){
  Wire.beginTransmission(MPU); //Begin a transmission to the I2C slave device with the given address. Subsequently, queue bytes for transmission with the write() function and transmit them by calling endTransmission(). 
  Wire.write(0x3B);  // starting with register 0x3B (ACCEL_XOUT_H) /// Writes data from a slave device in response to a request from a master, or queues bytes for transmission from a master to slave device (in-between calls to beginTransmission() and endTransmission()). 
  Wire.endTransmission(false); //Ends a transmission to a slave device that was begun by beginTransmission() and transmits the bytes that were queued by write(). If true, endTransmission() sends a stop message after transmission, releasing the I2C bus.If false, endTransmission() sends a restart message after transmission. The bus will not be released, which prevents another master device from transmitting between messages. This allows one master device to send multiple transmissions while in control.The default value is true. 
  Wire.requestFrom(MPU,14,true);  // request a total of 14 registers
  AcX=Wire.read()<<8|Wire.read();  // 0x3B (ACCEL_XOUT_H) & 0x3C (ACCEL_XOUT_L)     
  AcY=Wire.read()<<8|Wire.read();  // 0x3D (ACCEL_YOUT_H) & 0x3E (ACCEL_YOUT_L)
  AcZ=Wire.read()<<8|Wire.read();  // 0x3F (ACCEL_ZOUT_H) & 0x40 (ACCEL_ZOUT_L)
  Tmp=Wire.read()<<8|Wire.read();  // 0x41 (TEMP_OUT_H) & 0x42 (TEMP_OUT_L)
  GyX=Wire.read()<<8|Wire.read();  // 0x43 (GYRO_XOUT_H) & 0x44 (GYRO_XOUT_L)
  GyY=Wire.read()<<8|Wire.read();  // 0x45 (GYRO_YOUT_H) & 0x46 (GYRO_YOUT_L)
  GyZ=Wire.read()<<8|Wire.read();  // 0x47 (GYRO_ZOUT_H) & 0x48 (GYRO_ZOUT_L)
  
  Serial.print("AcX = "); Serial.print((AcX/16384),3);
  Serial.print(" | AcY = "); Serial.print((AcY/16384),3);
  Serial.print(" | AcZ = "); Serial.print((AcZ/16384),3);
  Serial.print(" | Tmp = "); Serial.print(Tmp/340.00+36.53);  //equation for temperature in degrees C from datasheet
  Serial.print(" | GyX = "); Serial.print(GyX);
  Serial.print(" | GyY = "); Serial.print(GyY);
  Serial.print(" | GyZ = "); Serial.println(GyZ);
  delay(500);
  //***************************
  Wire.beginTransmission(MPU);
  Wire.write(0x75);
  Wire.endTransmission(false);
  Wire.requestFrom(MPU,1,true);
  lettura=Wire.read();
  Serial.println(lettura,BIN);
  //***************************
  delay(2000);
}

se leggo il registro 0x75, cioè quello che contiene l’indirizzo del dispositivo(register map, pag 46), la lettura è corretta. 68(HEX), 1101000(BIN).

se mi sposto sul registro 0x1C (accel_config, quello che vorrei modificare, pag 6 - 15 - 16) il valore è sempre 0, sia in BIN che HEX. Questo è dovuto al fatto che di default il registro sarebbe 00000000 come scritto a pag 16? ::slight_smile:

anche su altri registri stessa cosa, solo che non conosco i parametri di default

insomma vorrei capire se leggo correttamente i registri o sto sbagliando qualcosa, ho cercato parecchio online ma non ho trovato nulla di utile

grazie