Acelerómetro ADXL345

Me gustaría usar un acelerómetro en mi bici para detectar cuando estoy frenando y encender ciertos leds. Para eso me he comprado el acelerómetro y giroscopio ADXL345.

Con el siguiente código obtengo las inclinaciones sobre los 3 ejes:

#include <SPI.h>
#include <Wire.h>
#include <SparkFun_ADXL345.h>

ADXL345 adxl = ADXL345();

void setup(){
  Serial.begin(9600);
  adxl.powerOn();
  adxl.setRangeSetting(2); // puesto en 2G
}

void loop(){
  int x, y, z;
  adxl.readAccel(&x, &y, &z);  
  Serial.print(x + "," + y + "," + "z");  
 }

¿cómo se miden las aceleraciones en los 3 ejes que es lo que me interesa?

gracias.

Puedes usarlos para otra cosa porque la luz de stop ya se ha inventado y se resuelve con un swich puesto en el pedal o manija de freno.

En los últimos coches eléctricos, cuando levantas el acelerador, se produce una retención importante y por seguridad encienden la luz de freno.

Sobre la legalidad o no, tengo entendido que cualquier luz en una bicicleta es legal siempre y cuando no deslumbre.

Me gustaría que no se desviase la conversación, ¿alguien sabe cómo obtener las aceleraciones?

Gracias.

Con mi humilde inglés

ArduMyth:
Lee el nombre de la función ¿A que te suena?

readAccel

leer aceleración.

ArduMyth:
ve a la librería y mira el comentario de la función

// Read the accelerometer values and store them in variables declared above x,y,z

Lee los valores del acelerómetro y los guarda en las variables declaradas arriba x,y,z

ArduMyth:
¿Qué valores estás obteniendo?

Los valores que obtengo deben ser ¿grados de inclinación?, pongo algunos ejemplos
(x, y, z)
206, -6, -125
-50, -36, 245
-13, 272, -28

Si coloco el sensor paralelo al suelo, con los pines hacia abajo:
0, 0, 245

Lo que me gustaría obtener son las fuerzas g en cada uno de los ejes, yo esperaría recibir 0,0,0 estando el dispositivo en reposo.

gracias.

Antes de acudir al foro le he dedicado tiempo al tema, mirando la librería, probando ejemplos y buscando por internet. Evidentemente no me he estudiado las 40 páginas porque es para un hobby, no lo voy a sacar al mercado (obviamente).

La fórmula que me indicas ya la había descartado, necesito saber la aceleración de forma individual para cada eje, no el módulo resultante de la misma.

Respecto a lo que comentas sobre dármelo hecho, ni lo he escrito ni se puede deducir de lo que he puesto.

Lo llaman acelerómetro pero en realidad es un giroscopio.

Asunto zanjado.

Personalmente las opiniones sobre seguridad vial no me son interesantes y me parecen inadeacuadas aqui, ademas de molestas cuando busco cosas de Arduino.

A mi el proyecto me gusta y quizas alguno desconozca lo que indica @jomaiz sobre que en coches modernos la luz roja se enciende incluso en desaceleraciones. En F1 por ejemplo la luz se enciende cuando el coche no entrega toda su potencia, ni siquiera tiene que desacelerar. Llamenla luz de freno, luz de stop, luz roja o luz que se me enciende cuando se me da la gana.

Es esto lo que quiere, encender la luz (hacer algo, podria ser tocar un "beep" o guardar un dato) al desacelerar (en una determinada circunstancia).

Y es eso sobre lo que me gustaria aprender a mi tambien ya que estoy en algo parecido.

jomaiz:
Lo llaman acelerómetro pero en realidad es un giroscopio.

No creo, es un acelerometro aunque en realidad no hemos podido todavia interpretar las lecturas. Yo estoy buscando y no lo encuentro con seguridad. Hasta donde yo llegue:

a) En un telefono samsung ingresando #0# + llamar, te abre el test, luego en "sensor" se puede leer las acelaracion y los angulos, quizas te sirva para entender las lecturas.
En estatico y sobre la mesa me da:
ACC Raw Data x: -40, y: -40, Z:+4090 (Los primeros son practicamente 0 y el + 4090 es el equivalete a 1G)
x-angle: 0, y-angle: 0, z-angle: 90

b) Creo que las aceleraciones se leen en mg/lsb, luego hay que convertirlas a G
c) Pero no te hace falta convertir, te bastaria con leer el dato de X, y la desaceleracion la tendras cuando sea negativo, luego tu tendras que decidir en cuanto de negativo debe ser para activar lo que quieres.

ArduMyth:
En cualquier caso recuerda 1G en todos sus ejes significa que estás estático, ya que 1G vendría a ser que sólo te está afectando la gravedad de la tierra y no hay "otro empuje" por medio.

Yo entiendo que no. En estatico tendras 1G sobre el eje Z, sobre los ejes X e Y tendras 0G

jomaiz:
Asunto zanjado.

Me gustaria que no lo zanjes, pero si lo haces comentame por privado tus avances.... :wink:

Porque va a quedar terminado o zanjado algo que ni siquiera vio la luz.
No quise opinar porque me la paso respondiendo todos y cada hilo pero tendré que dar mi punto de vista.

Empecemos por lo básico

Main Chipset: ADXL345
Communication: IIC/SPI Communication Protocol
Measuring Ranging: ±2g±16g
Digital Output: SPI/IIC
3-axis, ±2g/±4g/±8g/±16g
Compact Accelemotor/Inclinometer
Working Voltage: 3V to 5V
Working Temperature: -40° to 85°
Working Current: 30uA
Low Power Consumption
Compatible with 51, AVR, Arduino

Asi que puede medir aceleración en diferentes rangos, en que rango estamos? Hay que definirlo o por defecto esta en digamos ±2g?

Si mide aceleraciones, su salida será aceleraciones y ademas tmb inclinación... pues estara en otro registro.

Busquemos alguna librería, pues acá encontré una Libreria ADX345

Que trae este ejemplo

//Arduino 1.0+ Only!
//Arduino 1.0+ Only!

#include <Wire.h>
#include <ADXL345.h>


ADXL345 adxl; //variable adxl is an instance of the ADXL345 library

void setup(){
  Serial.begin(9600);
  adxl.powerOn();

  //set activity/ inactivity thresholds (0-255)
  adxl.setActivityThreshold(75); //62.5mg per increment
  adxl.setInactivityThreshold(75); //62.5mg per increment
  adxl.setTimeInactivity(10); // how many seconds of no activity is inactive?
 
  //look of activity movement on this axes - 1 == on; 0 == off 
  adxl.setActivityX(1);
  adxl.setActivityY(1);
  adxl.setActivityZ(1);
 
  //look of inactivity movement on this axes - 1 == on; 0 == off
  adxl.setInactivityX(1);
  adxl.setInactivityY(1);
  adxl.setInactivityZ(1);
 
  //look of tap movement on this axes - 1 == on; 0 == off
  adxl.setTapDetectionOnX(0);
  adxl.setTapDetectionOnY(0);
  adxl.setTapDetectionOnZ(1);
 
  //set values for what is a tap, and what is a double tap (0-255)
  adxl.setTapThreshold(50); //62.5mg per increment
  adxl.setTapDuration(15); //625μs per increment
  adxl.setDoubleTapLatency(80); //1.25ms per increment
  adxl.setDoubleTapWindow(200); //1.25ms per increment
 
  //set values for what is considered freefall (0-255)
  adxl.setFreeFallThreshold(7); //(5 - 9) recommended - 62.5mg per increment
  adxl.setFreeFallDuration(45); //(20 - 70) recommended - 5ms per increment
 
  //setting all interupts to take place on int pin 1
  //I had issues with int pin 2, was unable to reset it
  adxl.setInterruptMapping( ADXL345_INT_SINGLE_TAP_BIT,   ADXL345_INT1_PIN );
  adxl.setInterruptMapping( ADXL345_INT_DOUBLE_TAP_BIT,   ADXL345_INT1_PIN );
  adxl.setInterruptMapping( ADXL345_INT_FREE_FALL_BIT,    ADXL345_INT1_PIN );
  adxl.setInterruptMapping( ADXL345_INT_ACTIVITY_BIT,     ADXL345_INT1_PIN );
  adxl.setInterruptMapping( ADXL345_INT_INACTIVITY_BIT,   ADXL345_INT1_PIN );
 
  //register interupt actions - 1 == on; 0 == off  
  adxl.setInterrupt( ADXL345_INT_SINGLE_TAP_BIT, 1);
  adxl.setInterrupt( ADXL345_INT_DOUBLE_TAP_BIT, 1);
  adxl.setInterrupt( ADXL345_INT_FREE_FALL_BIT,  1);
  adxl.setInterrupt( ADXL345_INT_ACTIVITY_BIT,   1);
  adxl.setInterrupt( ADXL345_INT_INACTIVITY_BIT, 1);
}

void loop(){
  
  //Boring accelerometer stuff   
  int x,y,z;  
  adxl.readAccel(&x, &y, &z); //read the accelerometer values and store them in variables  x,y,z

  // Output x,y,z values - Commented out
  //Serial.print(x);
  //Serial.print(y);
  //Serial.println(z);


  //Fun Stuff!    
  //read interrupts source and look for triggerd actions
  
  //getInterruptSource clears all triggered actions after returning value
  //so do not call again until you need to recheck for triggered actions
   byte interrupts = adxl.getInterruptSource();
  
  // freefall
  if(adxl.triggered(interrupts, ADXL345_FREE_FALL)){
    Serial.println("freefall");
    //add code here to do when freefall is sensed
  } 
  
  //inactivity
  if(adxl.triggered(interrupts, ADXL345_INACTIVITY)){
    Serial.println("inactivity");
     //add code here to do when inactivity is sensed
  }
  
  //activity
  if(adxl.triggered(interrupts, ADXL345_ACTIVITY)){
    Serial.println("activity"); 
     //add code here to do when activity is sensed
  }
  
  //double tap
  if(adxl.triggered(interrupts, ADXL345_DOUBLE_TAP)){
    Serial.println("double tap");
     //add code here to do when a 2X tap is sensed
  }
  
  //tap
  if(adxl.triggered(interrupts, ADXL345_SINGLE_TAP)){
    Serial.println("tap");
     //add code here to do when a tap is sensed
  } 

 
}

vean la de seteos postibles tiene, es sinceramente espectacular.
Sensibilidad, disparons, umbrales, todo pensado.. casi corriendo esto tal vez lo tengas medio encaminado.

Subiré la librería para una descarga directa, pero si lo buscas en el gestor debe haber otras similares que sirvan.

NOTA: Para el que no entienda aún, la unidad mg es milésimo de G (gravedad) así que la conversión es obvia.

sunrom-992100.zip (167 KB)

No quiero entrar al trapo pero es que ya... le tocan a uno la moral:

Soy analista programador informático con más de 15 años de experiencia laboral. He sido moderador de varios foros y participo en unos cuantos, no me vengas a contar cómo se desarrolla ni cómo funciona la vida.

Sobre frenar y desacelerar, ¿de verdad el problema es léxico? Si hubiese puesto decelerar en lugar de frenar ¿no habría ningún problema? ¿En serio?
No ves correcto que al decelerar encienda una luz y yo ya te he explicado que coches de la vida real ya lo hacen a día de hoy, precisamente por seguridad.

La culpa de esta "discusión" la tengo yo por dar demasiados datos, por hablar de coches y bicicletas... ¿Has pensado que igual lo quiero aplicar en un circuito privado donde no hay por qué cumplir las normas de tráfico? Es mi problema.

Por último aquí nadie exige nada, si como comentas estás cansado o estás en desacuerdo simplemente deja de participar.

No voy a volver a entrar al trapo, comentarios constructivos... bienvenidos seaís.

Tal vez lo que te sugerí sea una pavada pero lo probaste? No tengo el sensor de modo que imposible decirte por experiencia práctica como se comporta.

NOTA: Respecto de los comentarios. Noto siempre muy poca voluntad para escuchar algo, si se dice de un modo porque lo dijo asi, y si se dice de otro porque se dijo al revés.
No hablo de nadie y hablo de todos y me incluyo.
En fin... no hay nada que caiga bien a nadie.
Si todos son programadores para que preguntan? Porque necesitan ayuda no y si necesitan ayuda y alguien se las da, porque no leen lo que les dice.. .o todo los que les dicen estan dicho con mala intención?
Que pasa si no fue dicho con mala intención? Donde nos metemos... nos hacemos chiquitos y nos escondemos o contraatacamos con toda las ganas.

Quiero que por favor todos los interlocutores de este u otro hilo tengan a bien escuchar lo que se les dice.

Cuando escribimos no todos tenemos la capacidad de un escritor para decir las cosas como se espera entender, a veces sonamos bruscos, a veces podemos sonar imperativos, y a veces groseros... ahora hablo por mi. Muchas veces no era la razón, (otras si pero este no es el caso).
Entonces intentente ver el bosque y no solo vean el arbol y entonces se pierden la oportunidad de ver lo demas.

Si alguien dice.. mira la librería (yo también lo hago) porque no mirarla? TIene procedimientos y funciones que pueden tener la respuesta. Generalmente la tienen.
Ayer alguien con un problema con una matrix led del MAX7219 solo tenia que cambiar un bool rotate de false a true para que su arreglo de matrices led se viera de izquierda a derecha y no de arriba a abajo. Y eso estaba en la librería y no habia ejemplos que lo indicaran o cuesta encontrarlos.

Acá puede pasar lo mismo. Y eso quiere decir ArduMyth.

No es para entrar en controversias pero si para que bajemos un poco el tono no en este sino en todos los hilos y no nos creamos nada.. el que viene y pregunta debe escuchar, y leer las sugerencias o tomar lo que le sirve y continuar.

Solo seamos mas tolerantes todos okay?

Este tema de que dijo, no dijo esta terminado
Todo lo que no tenga que ver con el hilo de aca en mas lo borro porque ya me cansé de advertir.
Paso a la acción.

Estoy currando, en cuanto lo pruebe te comento.

Gracias.

surbyte:
Busquemos alguna librería, pues acá encontré una Libreria ADX345

...

casi corriendo esto tal vez lo tengas medio encaminado.

Lo he estado probando y creo que es un buen punto de partida. Detecta los toques simples, dobles, cuando hay actividad...

¡Gracias!

Eso me pareció.. y fue pura casualidad.