Buenas a todos. Estoy haciendo un programa para detectar los tapp con en adxl345, ya ha realizado toda la parte de correccion de medida y demás pero me falta detectar un tapp simple o doble y no veo donde estoy fallando. ¿Alguna idea?
Es configuración spi sin libreria. aqui os dejo el codigo encuestion:
#include <SPI.h>
int CS2 = 10;
// ***Configuracion del control y formato***//
char POWER_CTL = 0x2D; //Power Control Register
char DATA_FORMAT = 0x31;
char DATAX0 = 0x32; //X-Axis Data 0
char DATAX1 = 0x33; //X-Axis Data 1
char DATAY0 = 0x34; //Y-Axis Data 0
char DATAY1 = 0x35; //Y-Axis Data 1
char DATAZ0 = 0x36; //Z-Axis Data 0
char DATAZ1 = 0x37; //Z-Axis Data 1
//**configuracion de los tapp***//
char INT_SOURCE=0x30; //INT_SOURCE
char INT_ENABLE = 0x2E; //configuracion DEL TAP
char INT_MAP = 0x2F; //configuracion DEL TAP;
char TAP_AXES = 0x2A; //configuracion DEL TAP
char DURATION = 0x21; //configuracion DEL TAP
char LATENT = 0x22; //configuracion DEL TAP
char WINDOW = 0x23; //configuracion DEL TAP
char tapps[10];
//byte buff;
byte values1[10];
int x2, y2, z2;
float Xg,Yg,Zg;
float Xg_offset,Yg_offset,Zg_offset;
float Xg_gain,Yg_gain,Zg_gain;
float accX,accY,accZ;
#define TO_READ (6)
byte buff[TO_READ] ;
int regAddress = 0x32;
int tapType=0;
void setup()
{
SPI.begin();
SPI.setDataMode(SPI_MODE3);
Serial.begin(9600);
pinMode(CS2, OUTPUT);
digitalWrite(CS2, HIGH);
writeRegister(DATA_FORMAT, 0x01, CS2); //lo configuro +-4g
writeRegister(POWER_CTL, 0x08, CS2); //se activa la medicion continua
//Configuracion de los tapp
//Activo los Single y Double Taps.
writeRegister(INT_ENABLE, 0xE0,CS2 ); //1110 0000
//Envio el tap y doble tap interuupts al pin 1 de INT1
writeRegister(INT_MAP, 0x9F, CS2); //1001 1111
//busco los tap solamente en el eje x
writeRegister(TAP_AXES, 0x01, CS2); //0000 0001 pag 26.
//defino la duracion del tap que tiene que ser leida.
writeRegister(DURATION, 0x10, CS2); //0000 1010 pag 25
//100ms defino la latencia que puedes espera para el segundo tapp.
writeRegister(LATENT, 0x50, CS2); //en decimal 80
writeRegister(WINDOW, 0xFF, CS2); //calcula el tiempo durante la segunda latencia
delay(50);
}
void loop()
{
readRegister(DATAX0, 6, values1, CS2);
x2 = ((int)values1[1] << 8) | (int)values1[0];
y2 = ((int)values1[3] << 8) | (int)values1[2];
z2 = ((int)values1[5] << 8) | (int)values1[4];
/* Serial.print(x2 * 1);
Serial.print(',');
Serial.print(y2 * 1);
Serial.print(',');
Serial.println(z2 * 1);
delay(2000);
*/
//convierto los valores a valores G
Xg=((float)x2)*(4.0/1024.0);Yg=((float)y2)*(4.0/1024.0); Zg=(float)z2*(4.0/1024.0);
// offsetAxis = 0.5 * (Acel+1g + Accel-1g)
// gainAxis = 0.5 * ((Acel+1g - Accel-1g)/1g)
// Calculo el offset y la ganancia para calcular los nuevos valores finales del acelerometro
/** Los siguientes valores son calculadaod mediante medicion directa de Xg, Yg, Zg **************/
/* // OFFSET values */
Xg_offset=-0.03; Yg_offset=-0.005; Zg_offset=-0.04;
Xg_gain=0.53; Yg_gain=0.545; Zg_gain=0.48;
//Calculo los resultados finales
accX = (Xg - Xg_offset)/Xg_gain; accY = (Yg - Yg_offset)/Yg_gain; accZ = (Zg - Zg_offset)/Zg_gain;
/*//muestro los nuevos valores con la correcion por programa
//Imprime los resultado..
Serial.println("Valores convertidos a fuerza G");
Serial.print("Xg="); Serial.println(Xg);
Serial.print("Yg="); Serial.println(Yg);
Serial.print("Zg="); Serial.println(Zg);
Serial.println();
delay(2000);
*/
//muestro los nuevos valores con la correcion por programa
//Imprime los resultado..
//Serial.println("Valores Corregidos");
Serial.print("accX="); Serial.print(accX);Serial.print(" ");
Serial.print("accY="); Serial.print(accY);Serial.print(" ");
Serial.print("accZ="); Serial.print(accZ);Serial.print(" ");
Serial.println(tapType);
Serial.println();
delay(500);
if(tapType > 0)
{
if(tapType == 1){
Serial.println("SINGLE");
}
else{
Serial.println("DOUBLE");
}
detachInterrupt(0);
delay(500);}
attachInterrupt(0, tap, RISING);
}
void writeRegister(char registerAddress, char value, int CS)
{
digitalWrite(CS, LOW);
SPI.transfer(registerAddress);
SPI.transfer(value);
digitalWrite(CS, HIGH);
}
void readRegister(char registerAddress, int numBytes, byte * values, int CS)
{
char address = 0x80 | registerAddress;
if (numBytes > 1)address = address | 0x40;
digitalWrite(CS, LOW);
SPI.transfer(address);
for (int i = 0; i < numBytes; i++)
{
values[i] = SPI.transfer(0x00);
}
digitalWrite(CS, HIGH);
}
void tap(void){
//borrar la variable de interrupciones ADXL345
readRegister(INT_SOURCE, 1, values1, CS2);
if(values1[0] & (1<<5))tapType=2;
else tapType=1;;
}