Letture errate del sensore MPU6050

Salve a tutti. Sono uno studente di ingegneria meccanica e insieme ad un mio compagno stiamo lavorando ad un progetto che richiede il funzionamento dell'accelerometro MPU6050 sopra citato. Avendo pochissima esperienza di programmazione in C (e quindi in generale con Arduino), siamo riusciti a far funzionare un programma che acquisisce le accelerazioni e trasferisce i dati su di una microSD prendendo spunto da pezzi di codice trovati su vari forum. Il problema che stiamo riscontrando è legato apparentemente alla troppa sensibilità dell'MPU6050, in quanto le accelerazioni registrate, se si sottopone il sensore a piccoli impulsi, presentano dei picchi di 6-8 G (se fermo l'accelerometro acquisisce accelerazioni nella norma, quindi ad esempio (1,0,0) G). Il problema appena esposto si è ripresentato anche provando altri codici trovati online e cambiando scheda Arduino/accelerometro. Mi chiedevo, quindi, se il problema potesse essere associato alla frequenza di acquisizione dell'MPU6050 e, se fattibile, in che modo è possibile variarla (quale istruzione bisogna utilizzare). Vi lascio qui di seguito il codice che stiamo utilizzando:

#include <SPI.h>
#include <Wire.h>
#define MPU 0x68  // I2C address of the MPU-6050
#include <MPU6050.h>
MPU6050 mpu(0x68);

double AcX, AcY, AcZ;

void setup(){
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }

  Serial.begin(115200);
  init_MPU();
  mpu.setXAccelOffset(29);        
  mpu.setYAccelOffset(-540);
  mpu.setZAccelOffset(584);
  Wire.beginTransmission(0x68);
    Wire.write(0x1C);
    Wire.write(B00010000);   //here is the byte for sensitivity (8g here) check datasheet for the one u want
  Wire.endTransmission(true);
}

void loop() {
  FunctionsMPU(); // Acquisisco assi AcX, AcY, AcZ.

  AcX=AcX/4095.875;
  AcY=AcY/4095.875;
  AcZ=AcZ/4095.875;
  
  Serial.print(AcX); Serial.print("\t");
  Serial.print(AcY); Serial.print("\t");
  Serial.println(AcZ);
  delay(5);
}
void init_MPU() {
  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);
  delay(1);
}

//Funzione per l'acquisizione degli assi X,Y,Z del MPU6050
void FunctionsMPU() {
  Wire.beginTransmission(MPU);
  Wire.write(0x3B);  // starting with register 0x3B (ACCEL_XOUT_H)
  Wire.endTransmission(false);
  Wire.requestFrom(MPU, 6, 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(); // 0x3D (ACCEL_YOUT_H) & 0x3E (ACCEL_YOUT_L) (?, 0x3F e 0x40)
}

:warning:
Ti segnalo che, nella sezione in lingua Inglese, si può scrivere SOLO in Inglese ... quindi, per favore, la prossima volta presta più attenzione in quale sezione metti i tuoi post; questa volta esso è stato spostato, da un moderatore della sezione di lingua Inglese, nella sezione di lingua Italiana ... la prossima volta potrebbe venire direttamente eliminato.
Grazie.

A quanto detto da UKHeliBob aggiungo ...

... cortesemente, come prima cosa, leggi attentamente il REGOLAMENTO della sezione Italiana del forum, (... e, per evitare future possibili discussioni/incomprensioni, prestando sempre molta attenzione al punto 15), dopo di che, come da suddetto regolamento (punto 16.7), fai la tua presentazione NELL'APPOSITA DISCUSSIONE spiegando bene quali esperienze hai in elettronica e programmazione, affinché noi possiamo conoscere la tua esperienza ed esprimerci con termini adeguati.

Grazie,

Guglielmo

P.S.: Ti ricordo che, purtroppo, fino a quando non sarà fatta la presentazione nell’apposita discussione, nel rispetto del succitato regolamento nessuno ti risponderà (eventuali risposte o tuoi ulteriori post, verrebbero temporaneamente nascosti), quindi ti consiglio di farla al più presto. :wink:

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.