Accelerometer ADXL345 - mcworkshop

MC   WORKSHOP
Vai ai contenuti

Menu principale:

Accelerometer ADXL345

ELMETTO TATTICO PARTE PRIMA
FONDO PAGINA

Accelerometer ADXL345
Ultimo aggiornamento 12 FEBBRAIO 2020

L'accelerazione gravitazionale si indica con la lettera g e la sua unità di misura è il metro al secondo quadrato. Sulla superficie terrestre il valore esatto di g varia a seconda del luogo, in particolare della latitudine e dell'altitudine: per questo motivo è stato anche introdotto un valore convenzionale per g, pari a 9,80665 m/s². Si tratta di un valore medio che approssima il valore dell'accelerazione di gravità presente al livello del mare a una latitudine di 45,5°. Tale valore viene a volte rappresentato con g0, quando g viene invece usato per rappresentare l'effettiva accelerazione di gravità locale. Il simbolo è scritto g minuscolo per distinguerlo dalla costante gravitazionale G che compare nella equazione di Newton e fu calcolata per la prima volta da Henry Cavendish.

INDICE
Calibrazione
Calibrazione semplice
Coefficenti
Sensibilità
Collegamenti
Formattazione SD
Sketch 1
Sketch Test
ADXL e datalogger
Collegamenti
Sketch
Contenuto SD
Excel
TXT e CSV
Open Office Calc
Grafico
Test con motore disassato
Sketch
Video
Sketch / collegamenti
Pitch, Roll, Yaw (ψ-θ-φ)
Assi Cartesiani
Elmetto tattico

Questo è un accelerometro a 3 assi in grado di misurare forze di accelerazione sia statiche sia dinamiche. La forza gravitazionale terrestre è un tipico esempio di forza statica, mentre le forze dinamiche possono essere causate da vibrazioni, movimenti, etc. L'unità di misura per l'accelerazione è il metro al secondo quadrato (m / s ^ 2). Tuttavia, i sensori dell'accelerometro esprimono le misurazioni in “g” o gravità. Una "g" è il valore della forza gravitazionale terrestre che è pari a 9,81 metri al secondo al quadrato.

Calibrazione (offset)

La variabile dipendente (y) e` l'accelerazione calibrata, quella indipendente (x) è la lettura del sensore. Si trasformi la lettura "grezza" in quella calibrata con questa formula: y=ax+b
I valori di a e b si calcolano separatamente per ciascun asse facendo le misure con il sensore in su e poi capovolgendolo. Supponiamo che con il sensore in su si legga 9.4 m/s^2 (x1), mentre si vorrebbe leggere 9.8 m/s^2 (e questa lettura la si chiami y). Con il sensore capovolto si legge -9.7 m/s^2 (x2), mentre si vorrebbe leggere -9.8 m/s^2 (lettura -y).

Calibrazione semplice

Io ho utilizzato un sistema di calibrazione "casereccio". Vediamo il codice. Prima di stampare su monitor seriale o su LCD sottraiamo il valore di x alla lettura di x, e la stessa cosa la facciamo per y. Per quanto riguarda z, quando il sensore è a riposo si deve leggere la forza di gravità, cioè 9,81 (0.91),  e non 0.

lcd.print("X ");
lcd.print(X_out);

Se x con il sensore a riposo segna 0.08 scriverò nello sketc questo:

lcd.print("X ");
X_out = X_out - 0.08;
lcd.print(X_out);

Nello sketch dove trovate dopo [ lcd.print("X ");] una operazione con x_out, y_out e z_out è semplicemente la taratura del sensore.

Coefficenti

I coefficienti a e b si calcolano in questo modo:

a=2y/(x1-x2)
b=y(x1+x2)/(x2-X1)

a= 196/191 = 1.0262
b=147/955 = 0.1539

Sensibilità

Sensibilità risoluzione a 10 bit

+/- 2g = 256
+/- 4g = 128
+/- 8g = 64
+/- 16g = 32


clic to enlarge

Collegamenti

clic to enlarge

Sketch 1


// August 2019 by MC Workshop.
// This example code is in the public domain.
//ADXL by Dejan LCD by MCW
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
int ADXL345 = 0x53;
float X_out, Y_out, Z_out;
LiquidCrystal_I2C lcd(0x27, 16, 2);
void setup() {
 Serial.begin(9600);
 Wire.begin();
 Wire.beginTransmission(ADXL345);
 Wire.write(0x2D);
 Wire.write(8);
 Wire.endTransmission();
 delay(10);
 lcd.backlight();
 lcd.init();
 lcd.backlight();
 lcd.setCursor(0, 0);
}
void loop() {
 Wire.beginTransmission(ADXL345);
 Wire.write(0x32);
 Wire.endTransmission(false);
 Wire.requestFrom(ADXL345, 6, true);
 X_out = ( Wire.read() | Wire.read() << 8);
 X_out = X_out / 256;
 Y_out = ( Wire.read() | Wire.read() << 8);
 Y_out = Y_out / 256;
 Z_out = ( Wire.read() | Wire.read() << 8);
 Z_out = Z_out / 256;
 lcd.setCursor(0, 0);
 lcd.print("X ");
// inserite la calibrazione
 lcd.print(X_out);
 lcd.print(" Y ");
// inserite la calibrazione
 lcd.print(Y_out);
 lcd.setCursor(0, 1);
 lcd.print("Z ");
// inserite la calibrazione
 lcd.print(Z_out);
 delay (500);
}
Sketch Test ADXL


//Michael Klements
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_ADXL345_U.h>
Adafruit_ADXL345_Unified accel = Adafruit_ADXL345_Unified(12345);
void displaySensorDetails(void)
{
 sensor_t sensor;
 accel.getSensor(&sensor);
 Serial.println("------------------------------------");
 Serial.print  ("Sensor:       "); Serial.println(sensor.name);
 Serial.print  ("Driver Ver:   "); Serial.println(sensor.version);
 Serial.print  ("Unique ID:    "); Serial.println(sensor.sensor_id);
 Serial.print  ("Max Value:    "); Serial.print(sensor.max_value); Serial.println(" m/s^2");
 Serial.print  ("Min Value:    "); Serial.print(sensor.min_value); Serial.println(" m/s^2");
 Serial.print  ("Resolution:   "); Serial.print(sensor.resolution); Serial.println(" m/s^2");  
 Serial.println("------------------------------------");
 Serial.println("");
 delay(500);
}
void displayDataRate(void)
{
 Serial.print  ("Data Rate:    ");  
 switch(accel.getDataRate())
 {
   case ADXL345_DATARATE_3200_HZ:
     Serial.print  ("3200 ");
     break;
   case ADXL345_DATARATE_1600_HZ:
     Serial.print  ("1600 ");
     break;
   case ADXL345_DATARATE_800_HZ:
     Serial.print  ("800 ");
     break;
   case ADXL345_DATARATE_400_HZ:
     Serial.print  ("400 ");
     break;
   case ADXL345_DATARATE_200_HZ:
     Serial.print  ("200 ");
     break;
   case ADXL345_DATARATE_100_HZ:
     Serial.print  ("100 ");
     break;
   case ADXL345_DATARATE_50_HZ:
     Serial.print  ("50 ");
     break;
   case ADXL345_DATARATE_25_HZ:
     Serial.print  ("25 ");
     break;
   case ADXL345_DATARATE_12_5_HZ:
     Serial.print  ("12.5 ");
     break;
   case ADXL345_DATARATE_6_25HZ:
     Serial.print  ("6.25 ");
     break;
   case ADXL345_DATARATE_3_13_HZ:
     Serial.print  ("3.13 ");
     break;
   case ADXL345_DATARATE_1_56_HZ:
     Serial.print  ("1.56 ");
     break;
   case ADXL345_DATARATE_0_78_HZ:
     Serial.print  ("0.78 ");
     break;
   case ADXL345_DATARATE_0_39_HZ:
     Serial.print  ("0.39 ");
     break;
   case ADXL345_DATARATE_0_20_HZ:
     Serial.print  ("0.20 ");
     break;
   case ADXL345_DATARATE_0_10_HZ:
     Serial.print  ("0.10 ");
     break;
   default:
     Serial.print  ("???? ");
     break;
 }  
 Serial.println(" Hz");  
}
void displayRange(void)
{
 Serial.print  ("Range:         +/- ");  
 switch(accel.getRange())
 {
   case ADXL345_RANGE_16_G:
     Serial.print  ("16 ");
     break;
   case ADXL345_RANGE_8_G:
     Serial.print  ("8 ");
     break;
   case ADXL345_RANGE_4_G:
     Serial.print  ("4 ");
     break;
   case ADXL345_RANGE_2_G:
     Serial.print  ("2 ");
     break;
   default:
     Serial.print  ("?? ");
     break;
 }  
 Serial.println(" g");  
}
void setup(void)
{
 Serial.begin(9600);
 Serial.println("Accelerometer Test"); Serial.println("");
 if(!accel.begin())
 {
   Serial.println("ADXL345 no detected");
   while(1);
 }
 /* Set the range to whatever is appropriate for your project */
 accel.setRange(ADXL345_RANGE_16_G);
 // displaySetRange(ADXL345_RANGE_8_G);
 // displaySetRange(ADXL345_RANGE_4_G);
 // displaySetRange(ADXL345_RANGE_2_G);  
 /* Display some basic information on this sensor */
 displaySensorDetails();
 /* Display additional settings (outside the scope of sensor_t) */
 displayDataRate();
 displayRange();
 Serial.println("");
}
void loop(void)
{
 /* Get a new sensor event */
 sensors_event_t event;
 accel.getEvent(&event);
 /* Display the results (acceleration is measured in m/s^2) */
 Serial.print("X: "); Serial.print(event.acceleration.x); Serial.print("  ");
 Serial.print("Y: "); Serial.print(event.acceleration.y); Serial.print("  ");
 Serial.print("Z: "); Serial.print(event.acceleration.z); Serial.print("  ");Serial.println("m/s^2 ");
 delay(500);
}



dopo aver inserito la calibrazione

ADXL345 + DATALOGGER (SD CARD)

Collegamenti della SD
GND to GND
VCC to +5V
MISO to pin 12
MOSI to pin 11
SCK to pin 13
CS  to pin 4

Formattazione SD
Per la corretta formattazione della SD si consiglia di scaricare SD Memory Card Formatter for Windows a questo link: https://www.sdcard.org/downloads/formatter/eula_windows/index.html
- non mi assumo nessuna responsabilità ai link esterni ai quali faccio riferimento -

Sketch

//ADXL345 DATALOGGER
//by MCW 26 Agosto 2019
//This example code is in the public domain.
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
//SD-------
#include <SPI.h>
#include <SD.h>
const int chipSelect = 4;
//----------
int ADXL345 = 0x53;
float X_out, Y_out, Z_out;
LiquidCrystal_I2C lcd(0x27, 16, 2);
void setup() {
 Serial.begin(9600);
   lcd.backlight();
 lcd.init();
 lcd.setCursor(0, 0);
 //----------
 while (!Serial) {
   ;
 }
 Serial.println("Inizializzazione SD");
 lcd.print ("inizializ SD");
 if (!SD.begin(chipSelect)) {
   Serial.println("SD non presente");
   lcd.setCursor(0, 1);
   lcd.print ("... no SD...");
   while (1);
 }
 Serial.println("SD OK");
 lcd.clear();
 delay(500);
 lcd.setCursor(0, 0);
 lcd.print ("SD OK!");
 //------------
 Wire.begin();
 Wire.beginTransmission(ADXL345);
 Wire.write(0x2D);
 Wire.write(8);
 Wire.endTransmission();
 delay(10);
 lcd.backlight();
 lcd.init();
 lcd.setCursor(0, 0);
}
void loop() {
 Wire.beginTransmission(ADXL345);
 Wire.write(0x32);
 Wire.endTransmission(false);
 Wire.requestFrom(ADXL345, 6, true);
 X_out = ( Wire.read() | Wire.read() << 8);
 X_out = X_out / 256;
 Y_out = ( Wire.read() | Wire.read() << 8);
 Y_out = Y_out / 256;
 Z_out = ( Wire.read() | Wire.read() << 8);
 Z_out = Z_out / 256;
 lcd.setCursor(0, 0);
 lcd.print("X ");
 X_out = X_out - 0.08;
 lcd.print(X_out);
 lcd.print(" Y ");
 Y_out = Y_out - 0.011;
 lcd.print(Y_out);
 lcd.setCursor(0, 1);
 lcd.print("Z ");
 Z_out = Z_out + 0.131;
 lcd.print(Z_out);
 delay (500);
 //---------
 String dataString = "X: " + String(X_out, 3) + "\tY: " + String(Y_out, 3) + "\tZ: " + String(Z_out, 3);
 File dataFile = SD.open("datalog.txt", FILE_WRITE);
 if (dataFile) {
   dataFile.println(dataString);
   dataFile.close();
   Serial.println(dataString);
 }
 else {
   Serial.println("Errore");
  lcd.setCursor(0, 0);
  lcd.print("Errore ");
 }
 //---------
}

Contenuto della SD
file tipo: TXT
nome: DATALOG

X: -0.014 Y: 0.012 Z: 1.010
X: -0.045 Y: 0.016 Z: 1.014
X: -0.006 Y: -0.269 Z: 0.940
X: -0.006 Y: -0.265 Z: 0.947
X: 0.002 Y: -0.238 Z: 0.955
X: -0.002 Y: -0.183 Z: 0.967
X: 0.002 Y: -0.007 Z: 0.975
X: -0.002 Y: 0.012 Z: 0.983
X: -0.002 Y: 0.016 Z: 0.983
X: -0.002 Y: 0.012 Z: 0.979
X: -0.002 Y: 0.012 Z: 0.979
X: 0.002 Y: 0.012 Z: 0.979
X: 0.002 Y: 0.009 Z: 0.983
X: -0.010 Y: 0.024 Z: 0.994
X: -0.014 Y: 0.032 Z: 0.983
X: 0.002 Y: 0.009 Z: 0.986
X: -0.017 Y: 0.028 Z: 0.983
X: -0.017 Y: 0.036 Z: 0.979
X: -0.080 Y: -0.011 Z: 0.131
X: 0.123 Y: -0.183 Z: 1.143
X: 0.002 Y: 0.009 Z: 0.979
X: 0.002 Y: 0.005 Z: 0.975
X: -0.014 Y: 0.028 Z: 0.979
X: 0.002 Y: 0.009 Z: 0.975
X: -0.002 Y: 0.009 Z: 0.979
X: -0.021 Y: 0.036 Z: 1.010
X: -0.053 Y: 0.087 Z: 0.963
X: 0.002 Y: -0.003 Z: 0.971
X: 0.025 Y: 0.028 Z: 0.971
X: 0.006 Y: 0.012 Z: 0.967
X: -0.002 Y: 0.009 Z: 0.979
X: 0.002 Y: 0.005 Z: 0.979
X: 0.022 Y: 0.001 Z: 0.975
X: -0.002 Y: 0.012 Z: 0.971
X: 0.010 Y: 0.005 Z: 0.963




Importiamo i dati in Excel
Dal menù dati, carica dati da testo. Si selezioni il file, poi, importa. Si selezioni delimitato, poi, avanti. Si spunti tabulazione, poi, avanti. Il formato per colonna è: generale. Poi, fine. Selezionare nel foglio di lavoro esistente.



E' possibile salvare in CSV. In questo modo possiamo utilizzare Open Office Calc




Si selezionino le tre colonne B, D, F e si generi il grafico.




Test con motore disassato
2/10/2019

Sketch

//ADXL345 DATALOGGER
//by MCW 1 ottobre 2019
//This example code is in the public domain.
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
//SD-------
#include <SPI.h>
#include <SD.h>
const int chipSelect = 4;
//----------
int ADXL345 = 0x53;
float X_out, Y_out, Z_out;
LiquidCrystal_I2C lcd(0x27, 16, 2);
void setup() {
 Serial.begin(9600);
   lcd.backlight();
 lcd.init();
 lcd.setCursor(0, 0);
 //----------
 while (!Serial) {
   ;
 }
 Serial.println("Inizializzazione SD");
 lcd.print ("inizializ SD");
 if (!SD.begin(chipSelect)) {
   Serial.println("SD non presente");
   lcd.setCursor(0, 1);
   lcd.print ("... no SD...");
   delay (3000);
   while (1);
 }
 Serial.println("SD OK");
 lcd.clear();
 delay(500);
 lcd.setCursor(0, 0);
 lcd.print ("SD OK!");
 delay (3000);
 //------------
 Wire.begin();
 Wire.beginTransmission(ADXL345);
 Wire.write(0x2D);
 Wire.write(8);
 Wire.endTransmission();
 delay(10);
 lcd.setCursor(0, 0);
}
void loop() {
 Wire.beginTransmission(ADXL345);
 Wire.write(0x32);
 Wire.endTransmission(false);
 Wire.requestFrom(ADXL345, 6, true);
 X_out = ( Wire.read() | Wire.read() << 8);
 X_out = X_out / 256;
 Y_out = ( Wire.read() | Wire.read() << 8);
 Y_out = Y_out / 256;
 Z_out = ( Wire.read() | Wire.read() << 8);
 Z_out = Z_out / 256;
 lcd.setCursor(0, 0);
 lcd.print("X ");
 X_out = X_out - 0.08;
 lcd.print(X_out);
 lcd.print(" Y ");
 Y_out = Y_out - 0.011;
 lcd.print(Y_out);
 lcd.setCursor(0, 1);
 lcd.print("Z ");
 Z_out = Z_out + 0.131;
 lcd.print(Z_out);
 delay (500);
 //---------
 String dataString = "X: " + String(X_out, 3) + "Y: " + String(Y_out, 3) + "Z: " + String(Z_out, 3);
 File dataFile = SD.open("datalog.txt", FILE_WRITE);
 if (dataFile) {
   dataFile.println(dataString);
   dataFile.close();
   Serial.println(dataString);
 }
 else {
   Serial.println("Errore");
  lcd.setCursor(0, 0);
  lcd.print("Errore ");
 }
 //---------
}



ATTENZIONE
Con piedinatura: SCL, SDA, SDO, INT2, INT1, CS, VCC, GND; collegamento I2C
/*Arduino CH340 ADXL 345
 A4 = SDA
 A5 = SCL
 piedinatura: SCL, SDA, SDO, INT2,INT1, CS, VCC, GND
 COLLEGAMENTI: SDA pin4, SCL pin5
*/
#include <Wire.h>
//#include <Servo.h>
//Servo myservox;
//Servo myservoy;
int ADXL345 = 0x53;
float X_out, Y_out, Z_out;
float roll, pitch;
void setup() {
 Serial.begin(9600);
//myservox.attach(9);
//myservoy.attach(10);
 Wire.begin();
 Wire.beginTransmission(ADXL345);
 Wire.write(0x2D);
 Wire.write(8);
 Wire.endTransmission();
 delay(10);
}
void loop() {
 Wire.beginTransmission(ADXL345);
 Wire.write(0x32);
 Wire.endTransmission(false);
 Wire.requestFrom(ADXL345, 6, true);
 X_out = ( Wire.read() | Wire.read() << 8);
 X_out = X_out / 256;
 Y_out = ( Wire.read() | Wire.read() << 8);
 Y_out = Y_out / 256;
 Z_out = ( Wire.read() | Wire.read() << 8);
 Z_out = Z_out / 256;
 roll = atan(Y_out / sqrt(pow(X_out, 2) + pow(Z_out, 2))) * 180 / PI;
 pitch = atan(-1 * X_out / sqrt(pow(Y_out, 2) + pow(Z_out, 2))) * 180 / PI;
 Serial.print("Xa= ");
 Serial.print(X_out);
 Serial.print("   Ya= ");
 Serial.print(Y_out);
 Serial.print("   Za= ");
 Serial.print(Z_out);
 Serial.print("   roll= ");
 Serial.print(roll);
 Serial.print("   pitch= ");
 Serial.println(pitch);
 /*
   if (roll < 0)
   {
   //Serial.print("  ");
   myservox.write(10);
   delay (300);
   }
   else
   {
   myservox.write(90);
   delay (300);
   }
   if (roll > 0)
   {
   //Serial.print("  ");
   myservox.write(170);
   delay (300);
   }
   else
   {
   myservox.write(90);
   delay (300);
   }
   if (pitch > 1)
   {
   //Serial.print(" ");
   myservoy.write(140);
   delay (300);
   }
   if (pitch < -1)
   {
   //Serial.print("  ");
   myservoy.write(170);
   delay (300);
   }
 */
}
Con piedinatura: INT, ADO, XCL, XDA, SDA, SCL, GND, VCC

/*
* Arduino CH340
* GY521
* peidinatura: INT, ADO, XCL, XDA, SDA, SCL, GND, VCC
* COLLEGAMENTI: SCL pin A5, SDA pin A4.
*/
#include<Wire.h>
const int MPU = 0x68;
int16_t AcX, AcY, AcZ, Tmp, GyX, GyY, GyZ;
void setup()
{
 Serial.begin(9600);
 Wire.begin();
 Wire.beginTransmission(MPU);
 Wire.write(0x6B);
 Wire.write(0);
 Wire.endTransmission(true);
}
void loop() {
 Wire.beginTransmission(MPU);
 Wire.write(0x3B);
 Wire.endTransmission(false);
 Wire.requestFrom(MPU, 14, true);
 delay (100);
 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)
 delay (100);
 Serial.print("Accelerometer: ");
 Serial.print("AcX = "); Serial.print(AcX);
 Serial.print(" | Y = "); Serial.print(AcY);
 Serial.print(" | Z = "); Serial.println(AcZ);
 Serial.print("Temperature: "); Serial.print(Tmp / 340.00 + 36.53); Serial.println(" C ");
 Serial.print("Gyroscope: ");
 Serial.print(" GyX = "); Serial.print(GyX);
 Serial.print(" | Y = "); Serial.print(GyY);
 Serial.print(" | Z = "); Serial.println(GyZ);
 Serial.println(" ");
}

Arduino Nano con Oled SSD1306
/*
  Arduino nano
  GY521
  Oled
*/
#include<Wire.h>
const int MPU = 0x68;
int16_t AcX, AcY, AcZ, Tmp, GyX, GyY, GyZ;
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
Adafruit_SSD1306 display(128, 32, &Wire, 4);
void setup()
{
 Serial.begin(9600);
 Wire.begin();
 Wire.beginTransmission(MPU);
 Wire.write(0x6B);
 Wire.write(0);
 Wire.endTransmission(true);
 if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
   while (true);
 }
}
void loop() {
 Wire.beginTransmission(MPU);
 Wire.write(0x3B);  // partenza registro 0x3B (ACCEL_XOUT_H)
 Wire.endTransmission(false);
 Wire.requestFrom(MPU, 14, true);
 delay (100);
 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)
 delay (100);
 Serial.print("Accelerometer: ");
 Serial.print("AcX = "); Serial.print(AcX);
 Serial.print(" | Y = "); Serial.print(AcY);
 Serial.print(" | Z = "); Serial.println(AcZ);
 Serial.print("Temperature: "); Serial.print(Tmp / 340.00 + 36.53); Serial.println(" C ");
 Serial.print("Gyroscope: ");
 Serial.print(" GyX = "); Serial.print(GyX);
 Serial.print(" | Y = "); Serial.print(GyY);
 Serial.print(" | Z = "); Serial.println(GyZ);
 Serial.println(" ");
 //oled
 display.display();
 display.clearDisplay();
 display.setTextSize(1);
 display.setTextColor(WHITE);
 display.setCursor(0, 0);
 display.print ("X ");
 display.print(GyX);
 display.print ("   Y ");
 display.println(GyY);
 display.setCursor(0, 12);
 display.print ("Z ");
 display.print(GyZ);
 display.print ("  t ");
 display.print(Tmp / 340.00 + 36.53);
 display.setCursor(0, 24);
 display.println ("MCWorkshop");
 delay(100);
}
-------
Pitch, Roll, Yaw (ψ-θ-φ)
Beccheggio, rollio, imbardata
Attenzione a non confondere l'imbardata (asse z) con la lettura dell'accellerometro z




Assi cartesiani


PARTE PRIMA ELMETTO TATTICO
//Casco V 1.0 04-02-2020 by MCW
#include<Wire.h>
const int MPU = 0x68; // indirizzo MPU
int16_t AcX, AcY, AcZ, Tmp, GyX, GyY, GyZ;
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
Adafruit_SSD1306 display(128, 32, &Wire, 4);
//
#include <Servo.h>
Servo myservox;
Servo myservoy;
//
void setup()
{
 myservox.attach (9);
 myservoy.attach (10);
 Serial.begin(9600);
 Wire.begin();
 Wire.beginTransmission(MPU);
 Wire.write(0x6B);  // registro
 Wire.write(0);     // registro a zero
 Wire.endTransmission(true);
 if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
   while (true);
 }
}
void loop() {
 Wire.beginTransmission(MPU);
 Wire.write(0x3B);  // partenza registro 0x3B (ACCEL_XOUT_H)
 Wire.endTransmission(false);
 Wire.requestFrom(MPU, 14, true);
 delay (100);
 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)
 delay (100);
 Serial.print("Accelerometer: ");
 Serial.print("AcX = "); Serial.print(AcX);
 Serial.print(" | Y = "); Serial.print(AcY);
 Serial.print(" | Z = "); Serial.println(AcZ);
 //temperatura in gradi centigradi
 Serial.print("Temperature: "); Serial.print(Tmp / 340.00 + 36.53); Serial.println(" C ");
 Serial.print("Gyroscope: ");
 Serial.print(" GyX = "); Serial.print(GyX);
 Serial.print(" | Y = "); Serial.print(GyY);
 Serial.print(" | Z = "); Serial.println(GyZ);
 Serial.println(" ");
 //oled
 display.display();
 display.clearDisplay();
 display.setTextSize(1);
 display.setTextColor(WHITE);
 display.setCursor(0, 0);
 display.print ("X ");
 display.print(GyX);
 display.print ("   Y ");
 display.println(GyY);
 display.setCursor(0, 12);
 display.print ("Z ");
 display.print(GyZ);
 display.print ("  t ");
 display.print(Tmp / 340.00 + 36.53);
 display.setCursor(0, 24);
 display.println ("MCWorkshop");
 delay(10);
 //Servo X
 if (AcX < -1350)
 {
   myservox.write(10);
 }
 else
 {
   myservox.write(170);
 }
 delay(100);
 //Servo Y
 if (AcY > -9500)
 {
   myservoy.write(180);
 }
 else
 {
   myservoy.write(140);
 }
 delay(100);
}
 
Copyright 2015. All rights reserved.
Torna ai contenuti | Torna al menu