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)
}