martedì 21 ottobre 2014

lis3lv02dq ed Arduino

A seguito del precedente post, ho provato l'accelerometro triassiale LIS3LV02DQ (scheda tecnica)
A differenza del modello ADXL335 questo integrato si collega ad Arduino mediante un bus I2C con i due pin SDA ed SCL rispettivamente ai pin A04 ed A05 di Arduino UNo



Schema in Fritzing (la pedinatura dell'accelerometro risulta differente da quella che ho usato io perche' in questo caso il sensore non e' montato su una basetta)


Come nel caso precedente ci sono un po' di indicazioni contrastanti sul tipo di alimentazione. La scheda tecnica riporta una tensione di Vcc di 3.6 V per cui, per sicurezza, ho alimentato mediante il pin 3V3 di Arduino

Lo sketch per Arduino e' stato copiato da Internet effettuando piccole modifiche (nell'originale erano usate dei metodi della libreria Wire che sono obsoleti)
------------------------------------------------------------------------------------
#include <Wire.h>

// TWI (I2C) sketch to communicate with the LIS3LV02DQ accelerometer

//Modified code from http://research.techkwondo.com/blog/julian/279
//Thanks Julian.

// Using the Wire library (created by Nicholas Zambetti)
// http://wiring.org.co/reference/libraries/Wire/index.html
// On the Arduino board, Analog In 4 is SDA, Analog In 5 is SCL
// These correspond to pin 27 (PC4/ADC4/SDA) and pin 28 (PC5/ADC5/SCL) on the Atmega8
// The Wire class handles the TWI transactions, abstracting the nitty-gritty to make
// prototyping easy.

void setup()

{

 Wire.begin(); // join i2c bus (address optional for master)
 Serial.begin(9600);
 Wire.beginTransmission(0x1D);
 Wire.write(0x20); // CTRL_REG1 (20h)
 Wire.write(0x87); // Device on, 40hz, normal mode, all axis's enabled
 Wire.endTransmission();
}

void loop()
{
#define i2cID 0x1D
#define outXhigh 0x29
#define outYhigh 0x2B
#define outZhigh 0x2D
#define outXlow 0x28
#define outYlow 0x2A
#define outZlow 0x2C

byte z_val_l, z_val_h, y_val_l, y_val_h, x_val_l, x_val_h;

//----------X Values-----------------------
 int x_val;

//-------------------------------
 Wire.beginTransmission(i2cID);
 Wire.write(outXlow);
 Wire.endTransmission(); 
Wire.requestFrom(i2cID, 1);
while(Wire.available())
{
  x_val_l = Wire.read();
}
//------------------------------- 
 Wire.beginTransmission(i2cID);
 Wire.write(outXhigh);
 Wire.endTransmission();
  
Wire.requestFrom(i2cID, 1);
if(Wire.available())
{
  x_val_h = Wire.read();
}
//------------------------------- 
x_val = x_val_h;
x_val <<= 8;
x_val += x_val_l;
//----------Y Values-----------------------
 int y_val;

//-------------------------------
 Wire.beginTransmission(i2cID);
 Wire.write(outYlow);
 Wire.endTransmission(); 
Wire.requestFrom(i2cID, 1);
while(Wire.available())
{
  y_val_l = Wire.read();
}
//------------------------------- 
 Wire.beginTransmission(i2cID);
 Wire.write(outYhigh);
 Wire.endTransmission();
  
Wire.requestFrom(i2cID, 1);
if(Wire.available())
{
  y_val_h = Wire.read();
}
//------------------------------- 


y_val = y_val_h;
y_val <<= 8;
y_val += y_val_l;


//----------Z Values-----------------------
 int z_val;

//-------------------------------
 Wire.beginTransmission(i2cID);
 Wire.write(outZlow);
 Wire.endTransmission(); 
Wire.requestFrom(i2cID, 1);
while(Wire.available())
{
  z_val_l = Wire.read();
}
//------------------------------- 
 Wire.beginTransmission(i2cID);
 Wire.write(outZhigh);
 Wire.endTransmission();
  
Wire.requestFrom(i2cID, 1);
if(Wire.available())
{
  z_val_h = Wire.read();
}
//------------------------------- 


z_val = z_val_h;
z_val <<= 8;
z_val += z_val_l;

Serial.print(x_val, DEC);
Serial.print(";"); 
Serial.print(y_val, DEC);
Serial.print(";"); 
Serial.println(z_val, DEC);

delay(1);

}
------------------------------------------------------------------------------------


In condizioni statiche il sensore sembra essere decisamente stabile

asse X : 27u +/- 0u
asse Y : -11u +/- 0u
asse Z : 1037 +/- 0.4u

il passo di campionamento nel tempo (calcolato usando lo script del post precedente) e' stato di 13.5+/-1.9 ms 

Picchiettando sul tavolo (o meglio da sotto il tavolo, dal basso verso l'alto) e lateralmente si osserva la risposta del sensore