Hola buenas, estamos trabajando con un acelerometro adxl335 para la fabricacion de una alarma.
La idea es que cuando se encienda la alarma se alimente el sensor y cuando este se mueva haga sonar una sirena... lo tenemos todo hecho, salvo lo del sensor que solo podemos hacerle funcionar el ejeY.
La idea es que tome como valor de referencia la posicion en la que sea encendido el sensor pues la alarma es para una moto y esta no siempre se aparca en la misma posicion.
conseguimos que funcione limitando el voltaje del sensor, pero esto nos limita en su colocacion en la moto por eso la opcion de que sea cual sea la posicion de la moto el sensor tome esa posicion como cero y a partir de ahi detecte los movimientos....
la pregunta seria: existe algun codigo para tomar como referencia los valores del giroscopio-acelerometro una vez alimentado este, sea cual sea este valor, es decir su posicion fisica, y a partir de ahi aplicar los margenes sumando y/o restando un valor para hacer saltar la sirena???
pd:somos muuy nuevos en este mundillo, no tenemos ni idea de programacion y lo que vamos aciendo lo sacamos de manera autodidacta de internet a base de probar...
incluyo el sketch que hemos conseguido para el acelerometro...
// these constants describe the pins. They won't change:
const int xpin = A2; // x-axis of the accelerometer
const int ypin = A3; // y-axis
const int zpin = A4; // z-axis (only on 3-axis models)
int sampleDelay = 200; //number of milliseconds between readings
int estadox=2;
int estadoy=2;
int estadoz=2;
int salida=2;
void setup()
{
// initialize the serial communications:
Serial.begin(9600);
//Make sure the analog-to-digital converter takes its reference voltage from
// the AREF pin
analogReference(EXTERNAL);
pinMode (salida, OUTPUT);
pinMode(xpin, INPUT);
pinMode(ypin, INPUT);
pinMode(zpin, INPUT);
}
void loop()
{
estadoy = analogRead(ypin);
if (estadoy >= 550)
{
digitalWrite (salida, HIGH); //se activa la alarma durante Xtiempo
delay (2000);
digitalWrite (salida, LOW);
}
estadoy = analogRead(ypin);
if (estadoy <= 500)
{
digitalWrite (salida, HIGH); //se activa la alarma durante Xtiempo
delay (2000);
digitalWrite (salida, LOW);
}
Serial.print( analogRead(xpin));
Serial.print("\t");
//add a small delay between pin readings. I read that you should
//do this but haven't tested the importance
delay(1);
Serial.print( analogRead(ypin));
Serial.print("\t");
//add a small delay between pin readings. I read that you should
//do this but haven't tested the importance
delay(1);
Serial.print( analogRead(zpin));
Serial.print("\n"); // delay before next reading:
delay(sampleDelay);
}
Un acelerómetro, detecta el movimiento, y da valores mientras se mueve. Si no hay movimiento, esos valores tienen que ser bajos, cercanos a cero, y aumentar cuando hay movimiento. Basándonos en esto, no entiendo lo de el valor de referencia de encendido, ya que si no hay movimiento, los valores tienen que ser bajos.
Mirando el código (que deberías haber puesto usando el tag "code", tal y como dicen las normas) veo que usas el acelerómetro directamente conectado al arduino. Hay placas, no muy caras, que conectadas por i2c y usando la librería adecuada, funcionan perfectamente.
perdón por el abandono...motivos laborales...
soy el compañero de proyecto de navarone630...
la idea no es cambiar de sensor pues ya le tengo...
e preguntado y me dicen que tengo que hacer una función para que una vez que alimento el sensor haga una lectura y la almacene para usarla como comparativa...
la verdad que no se si nos hemos explicado bien, seguramente no, pero como dijo navarone630 no tenemos ni idea de programación...
la cosa es, con un mando a distancia y a través de la arduino, cuando detecta la pulsación del botón, alimentamos al sensor, cuando lo hacemos realizamos una lectura de los valores emitidos por el sensor y los tomamos como referencia, me explico:
al encender el sensor en posición horizontal la lectura es de 600 (por decir un numero),peor si lo hago en vertical esa lectura es de 300, lo que necesitamos es que haga la lectura y la tome como referencia para que con esa lectura X activemos la alarma, por ejemplo cuando X sea 50 puntos mayor o menor del valor de referencia leído al encender el sensor ya que este valor puede no ser siempre el mismo pues se podría encender estando en diferente angulo...
la cosa es que por ignorancia no podemos hacer esa función para que realice la lectura...
nose si se me entiende....
gracias y pido disculpas si lo hemos escrito mal o en mal lugar... somos un poco zoquetes con los foros...
aitory, cual es el problema con tu código?
Tu compañero presentó un código. Dices que lo alimentas y quieres ese valor como referencia para luego cuando se mueve algo, que dispare una alarma, y cual es el problema.
Lees los datos del sensor?
Empecemos por ahi.
Hola, si si leo los datos del sensor, hay un skecth de muestra en el menu...
Con el sketch subido por el compi enciendo y apago el sensor y me ace todo bien...
He intentado meter la lectura del sensor en el programa como una funcion, pues es lo que me recomendaron pero nada... si lo hago directamente me anula todo y salta la alarma sin tocar nada.
Intentare aprender un poco mas sobre el lenguaje porque creo ke el problema es ese, ke no tenemos ni p... idea jajajaj
Debes intentar mejor la forma en que te explicas. Realmente muy confuso.
Tu programa tiene un par de errores.
No se define los pines analogicos con pinMode(xpin, INTERNAL); eso es para digitales
Usas ypin dos veces en el loop, supongo que uno es xpin y el otro ypin
// these constants describe the pins. They won't change:
const int xpin = A2; // x-axis of the accelerometer
const int ypin = A3; // y-axis
const int zpin = A4; // z-axis (only on 3-axis models)
int sampleDelay = 200; //number of milliseconds between readings
int estadox = 2;
int estadoy = 2;
int estadoz = 2;
int salida = 2;
void setup() {
// initialize the serial communications:
Serial.begin(9600);
//Make sure the analog-to-digital converter takes its reference voltage from
// the AREF pin
analogReference(EXTERNAL);
pinMode (salida, OUTPUT);
// pinMode(xpin, INPUT); Son entradas analógicas, no hay que definirlas como si fueran entradas digitales
// pinMode(ypin, INPUT);
// pinMode(zpin, INPUT);
Serial.println("X \t Y \t Z");
}
void loop() {
estadoy = analogRead(xpin); // error tenias definido ypin
if (estadoy >= 550) {
digitalWrite (salida, HIGH); //se activa la alarma durante Xtiempo
delay (2000);
digitalWrite (salida, LOW);
}
estadoy = analogRead(ypin);
if (estadoy <= 500) {
digitalWrite (salida, HIGH); //se activa la alarma durante Xtiempo
delay (2000);
digitalWrite (salida, LOW);
}
Serial.print( estadox);
Serial.print("\t");
delay(1); // delay ridículo
Serial.print(estadoy);
Serial.print("\t");
delay(1); // delay ridículo
Serial.print(analogRead(zpin));
Serial.print("\n"); // delay before next reading:
delay(sampleDelay);
}
Tu programa no responde a un pulsador tal como explicas. Ese programa solo mira que algo del giroscopo supere 500 o 550 en x e y.
No tiene ninguna coherencia, porque supongamos que fuera una moto y quieres tomar el dato cuando esta estática y luego si se mueve que haga sonar una alarma.
Se supone que debes LEER datos de un momento y luego comparalos contra un desplazamiento en X e Y de esos valores.
Exacto... necesito que haga eso ultimo que.comentas... que lea el valor y lo use para compararlo cuando se mueva... el escrito de arriba funciona eso, cuando supera esos valores y con eso no me sirve...
Hola aitory, espero no te asustes con este link pero creo que es lo que buscas.
Uds buscan un detector de movimiento, algo que el MPU6050 hace perfectamente. Este sketch explora esta cuestión, y lo hace muy bien.
vean que en el setup, exiten algunas funciones que calculan el valor de detección, calibran el sensor precisamente en el arranque en el que se supone que esta detenido.
Luego cualquier movimiento generarará una alarma
Entonces lo que esta dentro del sketch deberá ser usado cuando se presione el pulsador (tal como uds) querían. y luego verán si funciona.
Yo les recomiendo que bajen la librería y el sketch, lo prueben tal como está y si funciona entonces se ponen a pensar como modificarlo.