0% encontró este documento útil (0 votos)
110 vistas3 páginas

Comunicación I2C con ADXL345 en Arduino

Este documento describe cómo comunicarse con un sensor ADXL345 utilizando comunicación I2C para leer mediciones de aceleración en tres ejes. Define las direcciones del registro para configurar el rango y frecuencia de muestreo, y rutinas para escribir y leer datos del sensor. En el bucle principal, lee los datos del sensor y los imprime por el puerto serie.
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
110 vistas3 páginas

Comunicación I2C con ADXL345 en Arduino

Este documento describe cómo comunicarse con un sensor ADXL345 utilizando comunicación I2C para leer mediciones de aceleración en tres ejes. Define las direcciones del registro para configurar el rango y frecuencia de muestreo, y rutinas para escribir y leer datos del sensor. En el bucle principal, lee los datos del sensor y los imprime por el puerto serie.
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd
Está en la página 1/ 3

#include <Wire.

h>;

//Comunicacion I2C con ADXL345:


//Direcciones:
# define DEVICE 0x53 // Direccion de ADXL345
# define DATAX0 0x32 // LSB de la medicion en el eje ""
# define DATAX1 0x33 // MSB de la medicion en el eje ""
# define DATAY0 0x34
# define DATAY1 0x35
# define DATAZ0 0x36
# define DATAZ1 0x37
# define DATA_FORMAT 0x31 //Configuracion del rango de medicion.
# define BW_RATE 0x2c // Direccion donde se configura frequency sample, para I2C se tiene
como limite MAXIMO 800 (Hz), debido a la velocidad de sampleo de 400kHz
# define POWER_CTL 0x2d // Direccion donde se coloca al sensor en Measure Mode
//Esctrituras
# define range_2g 0x0 //Byte a mandar a DATA_FORMAT --> Este valor se puede modificar
para dejar en FULL_RES las mediciones
# define range_4g 0x1
# define range_8g 0x2
# define range_16g 0x3 //

# define freq_100 0xA //Byte a mandar a BW_RATE


# define freq_200 0xB
# define freq_400 0xC
# define freq_800 0xD
# define freq_1600 0xE
# define freq_3200 0xF //

# define measure_on 0x8 //pasa de stanby a measure mode


# define measure_off 0x0 //pasa a standby mode

//Declaracion de variables:
byte rango_seleccionado;
byte _buff[6]; //Arreglo donde se almacenaran los datos exraidos del Sensor, 2 Bytes
por cada eje
int ser_read=0;
int i=1;

void setup() {

Wire.begin(); // Inicia libreria para comunicacion I2C


Serial.begin (9600);
writeTo(POWER_CTL,measure_on); //Manda al sensor a Measure_on
Serial.println("seleccionar rango de medicion (2, 4, 8, 16 g): ");
while(i==1){
ser_read=Serial.parseInt();
if (Serial.available()>0){ //Espera Ingreso de datas en puerto Serial
Serial.print("Se ha seleccionado un rango de: ");
Serial.print(ser_read); Serial.println(" g");
delay(100);
Serial.print(ser_read);
i=2;
}
}

if (ser_read==2){
writeTo(DATA_FORMAT, range_2g); //Escribe seleccion de usuario a la Adress
correspondiente
Serial.print("hola 2");
delay(500);
}
else if (ser_read==4){
writeTo(DATA_FORMAT, range_4g);
}
else if (ser_read==8){
writeTo(DATA_FORMAT, range_8g);
}
else if (ser_read==16){
writeTo(DATA_FORMAT, range_16g); //
}

Serial.println("seleccionar frequencia maxima (100, 200, 400, 800, 1600, 3200) [Hz]: ");

while(i==2){
ser_read= Serial.parseInt();
if (Serial.available()>0){
Serial.print("Se ha seleccionado una frecuancua de: ");
Serial.print(ser_read); Serial.println(" g");
delay(100);
i=3;
}
}
if (ser_read==100){ //Escribe seleccion de usuario a la Adress
correspondiente
writeTo(BW_RATE, freq_100);
}
else if (ser_read==200){
writeTo(BW_RATE, freq_200);
}
else if (ser_read==400){
writeTo(BW_RATE, freq_400);
Serial.print("hola 100");
delay(500);
}
else if (ser_read==800){
writeTo(BW_RATE, freq_800);
}
else if (ser_read==1600){
writeTo(BW_RATE, freq_1600); //
}
}
void loop() {

uint8_t howManyBytesToRead=6; //Lectura de 6 bytes, 2 por eje


ReadFrom( DATAX0, howManyBytesToRead, _buff); //Lectura de los datos, se almazenara
en arreglo de 6 bits
int x = (((int)_buff[1]) << 8) | _buff[0]; // crea variable x a partir de la union entre 2 bytes
de informacion del eje, el MSF lo corre 8 unidades
int y = (((int)_buff[3]) << 8) | _buff[2];
int z = (((int)_buff[5]) << 8) | _buff[4]; //
Serial.print(x);
Serial.print(", ");
Serial.print(y);
Serial.print(", ");
Serial.println(z);
}

void writeTo(byte address, byte val) { //Funcion para la escritura al sensor

Wire.beginTransmission(DEVICE); // Comienza la transmision


Wire.write(address); // Manda direccion especifica dentro del sensor
Wire.write(val); // Valor a Escribir
Wire.endTransmission(); // fin de la transmicion
}

void ReadFrom(byte address, int num, byte _buff[]) {

Wire.beginTransmission(DEVICE); // Comienza la transmision


Wire.write(address); // Manda direccion especifica dentro del sensor
Wire.endTransmission(); // fin de la transmision
Wire.beginTransmission(DEVICE); // Empieza transmicion al sensor
Wire.requestFrom(DEVICE, num); // Hace un request del sensor, num son los
numeros de bytes a recibir
int j = 0;
while(Wire.available()) // Verifica disponibilidad de datos
{
_buff[j] = Wire.read(); // recibe un bit y lo almacena en una parte j del arreglo
j++;
}
Wire.endTransmission(); // fin de la transmision
}

También podría gustarte