Buenas.
He hecho un proyecto con Arduino uno y un acelerómetro MMA7361. Paso los datos a un TFT con los grados actuales y memorizo los máximos.
El caso es que va bien menos que cuando se inicia el acelerómetro (antes de empezar a medir) da unos valores aleatorios que con el código que tengo los memoriza como máximos.
He buscado alguna solución, como usar el 'While (hasta que no esté a cero) ... ', pero ese comando ya no está soportado.
Alguna idea?
grad_X y grad_Y son los valores que da el acelerómetro.
//********************* TFT máximos ****************************************//
//ROLL ************
if (grad_X > 0 & izq_max < grad_X) { // Izquierda ***
izq_max = 0;
izq_max = grad_X;
tft.fillRect (82, 8, 38, 22, ST7735_BLUE);
tft.setCursor (83, 12); tft.setTextColor (ST7735_GREEN); tft.setTextSize(2); tft.print (izq_max);
}
if (grad_X < 0 & drch_max > grad_X) { // Derecha ***
drch_max = grad_X;
tft.fillRect (122, 8, 37, 22, ST7735_BLUE);
tft.setCursor (123, 12); tft.setTextColor (ST7735_GREEN); tft.setTextSize(2); tft.print (drch_max);
}
//PITCH ************
if (grad_Y > 0 & pic_max < grad_Y) { // Picado ***
pic_max = grad_Y;
tft.fillRect (0, 98, 38, 22, ST7735_BLUE);
tft.setCursor (1, 100); tft.setTextColor (ST7735_GREEN); tft.setTextSize(2); tft.print (pic_max);
}
if (grad_Y < 0 & enc_max > grad_Y) { // Encabritado ***
enc_max = grad_Y;
tft.fillRect (40, 98, 38, 22, ST7735_BLUE);
tft.setCursor (41, 100); tft.setTextColor (ST7735_GREEN); tft.setTextSize(2); tft.print (enc_max);
}
Tu error está en como haces el AND dentro del condicional
//********************* TFT máximos ****************************************//
//ROLL ************
if (grad_X > 0 && izq_max < grad_X) { // Izquierda ***
izq_max = grad_X;
tft.fillRect (82, 8, 38, 22, ST7735_BLUE);
tft.setCursor (83, 12); tft.setTextColor (ST7735_GREEN); tft.setTextSize(2); tft.print (izq_max);
}
if (grad_X < 0 && drch_max > grad_X) { // Derecha ***
drch_max = grad_X;
tft.fillRect (122, 8, 37, 22, ST7735_BLUE);
tft.setCursor (123, 12); tft.setTextColor (ST7735_GREEN); tft.setTextSize(2); tft.print (drch_max);
}
//PITCH ************
if (grad_Y > 0 && pic_max < grad_Y) { // Picado ***
pic_max = grad_Y;
tft.fillRect (0, 98, 38, 22, ST7735_BLUE);
tft.setCursor (1, 100); tft.setTextColor (ST7735_GREEN); tft.setTextSize(2); tft.print (pic_max);
}
if (grad_Y < 0 && enc_max > grad_Y) { // Encabritado ***
enc_max = grad_Y;
tft.fillRect (40, 98, 38, 22, ST7735_BLUE);
tft.setCursor (41, 100); tft.setTextColor (ST7735_GREEN); tft.setTextSize(2); tft.print (enc_max);
}
NOTA: esta pregunta debió ir en Software no en Proyectos.
Tu hilo no reune las condiciones para esta sección y será movido.
El código no es ningún problema. Funciona perfectamente.
Repito, el problema es que al iniciarse el acelerómetro, da un dato aleatorio de inclinación, y el código lo lee y lo memoriza, evidentemente como máximo; el código para leer a tiempo real no guarda nada.
Hazme un favor, Surbyte, no contestes a mis posts, porque es la segunda vez que me haces lo mismo.
En otro post, me respondiste sin leer (o entender, que igual es que no me explico, pero por más que repaso lo que escribo ahora - y en su día en aquel otro post- no veo una mala explicación), no ya sólo lo que me pasaba, es que ni siquiera leías mis respuestas a tus sugerencias. Insistías con lo mismo aún cuando ya te había dicho dos veces que no funcionaba (un tft con el que tus comandos no iban ... si?).
Deja que la gente vea mis posts sin respuestas, y si pueden ayudar lo hagan, y así no piensen que con lo que me estás diciendo, me estás ayudando, y no respondan.
Gracias de antemano.
Esto sigue estando mal programado.
if (grad_X > 0 & izq_max < grad_X) { // Izquierda ***
es asi
if (grad_X > 0 && izq_max < grad_X) { // Izquierda ***
Y eso fue lo que te respondí. En el primer o segundo hilo que destacó al pie dices no saber de programación por eso te hagó énfasis en el error.
Sino mira el Ardutips al respecto, en un condicional se usa && o || pero no & o | solamente y eso fue lo que yo te respondí.
La falla en tu arranque la leí pero como quieres que resuelva algo que no tengo delante mío?
Y porque no reproduces en este foro un listado de los valores aleatorios del arranque para poder entender de lo que hablas?
NOTA como moderador: llevas 3 hilos hablando del mismo tema, en lugar de concentrar todo en uno, no cierres este hasta resolver tu problemática, entendido!! Porque esto se considera doble o triple post.
Tu tema por lo visto nunca se agotó y sigues con tu trabajo FP
1er hilo en Proyectos Inclinómetro con indicador TFT lo dejaste abandonado en 17-06-2016 sin explicación y era un Proyecto!!! que aun sigues
2do hilo en Software TFT. Presentar variables en pantalla. en ese hilo te ayudé de nuevo. Y lo dejaste inconcluso una vez mas.
3ro este hilo, en el que estamos.
“Lo que menos quiero es confrontar contigo.
Te dejo la ultima inquietud de que pongas una lista de datos para que quien te responda te ayude.
Ahora, a mi no me pidas que lo haga..
Y si vuelves a abrir otro hilo te lo cierro, comprendido?
Llevas 3 hilos abiertos del mismo tema. Eso es triple post, te queda claro?”
Surbyte Dixit. En mi bandeja de entrada personal de este foro.
- Te he pedido amablemente que no me contestes, e insistes. Igual esperas que me caliente y te mande a la mierda. Pero de momento no lo voy a hacer, porque como tienes el poder de amenazarme (cosa imposible si no tuvieras poder de ejecutarlo), pues voy a seguir siendo una persona educada, y DE MOMENTO, me voy a contener.
- Insisto en los hechos. NO LEES!! NO LEEES!! COJONES!! NO LEES!!
- El código no da ningún problema. Falta un ‘&’? Cierto, y? Tiene algo que ver con ‘La falla en tu arranque’? Ya dije que el código va perfecto!! (que por cierto, por curiosidad, he probado a poner un solo ‘&’ en todos y no falla). Es exactamente lo mismo que en el post el TFT, tú respondes, lo que te parece bien, te demuestro que no va, y erre que erre. Es por eso que aquel post, como dices, se quedó colgando. Es un diálogo de besugos (unilateral).
- Por supuesto, el post anterior en ‘Proyectos?, sigue abierto porque el proyecto no está terminado, y este último post movido a software (iniciado en ‘Proyectos’ porque pensaba que así podría evitarte) seguramente acabe igual. QUE NO LEES O NO TE SALE DE LAS NARICES!!!
De verdad, lo agradezco, ignórame.
Usa tu poder shurmano para ignorarme.
- Mis hilos no son lo mismo. Uno es el planteamiento (sin acabar, evidentemente, y que no creo que termine/comparta, visto lo visto), el otro es sobre TFTs (mostrar en pantalla), y el último es sobre el acelerómetro en concreto. Deberías, tú que tienes el poder de amenazar/castigar, ser el más estricto de todos.
- Datos: NO LEES!! COÑO QUE NO LEES!!: datos aleatorios que no tienen nada que ver con el código. Que reproduzca los datos aleatorios? Entiendes el significado de ‘ALEATORIO’? Tú andas bien de Castellano?
“Ahora, a mi no me pidas que lo haga..” QUE TE ESTOY PIDIENDO QUE NO LO HAGAS!!!!!
PD. Si se me permite, una pequeña violación de las formas: me la suda que me banees: tanto aporto como recibo ==0.
El dato aleatorio solo te da al iniciar el acelerómetro? Yo lo que haría es una vez inicializado el acelerómetro limpiar el valor máximo y listo, ya no te aparecerá ese valor aleatorio y el resto será lo que te vaya dando el sensor.
El por qué pasa esto? eso habría que verlo y desde aquí sin ver el acelerómetro y demás es complicado. Tienes filtros en los pines de lectura del arduíno, igual es ruido la primera vez hasta que manda señal... por darte ideas.
Entiendo que el acelerómetro lo inicializas sólo una vez.
Saludos!
Sí, hay filtros a cada una de las salidas del acelerómetro. Y se notan mucho.
Entiendo que es al inicializar el acelerómetro, porque es el arduino quién lo alimenta. Aunque pensándolo ahora, puede ser perfectamente al revés.
Tengo pensado probar con el sleep del acelerómetro (y de paso descarto quién es, es que lee o el que detecta), conectarle después que arranque arduino...
Lo que dices sería código...
Se me ocurrió inicializar la variable izq_max ==0 (y el resto) desde el setup, pero no funcionó, creo recordar.
Mañana probaré lo del sleep y pensaré el borrado desde el código y comento a ver.
He aislado el problema al código. Arrancando sin el acelerómetro (sin corriente), hace lo mismo. No es problema del acelerómetro y que dé datos aleatorios al arrancar.
Este es el código que estoy usando, sacado de aquí: Triple_Axis_Accelerometer_MMA7361_SKU_DFR0143-DFRobot
//*********************** Cálculo de grados inclinación ************************//
analog_x = analogRead(0);
analog_y = analogRead(1);
vol_x = analog_x * 3.3 / 1024;
vol_y = analog_y * 3.3 / 1024;
//rangos de 'MI' acelerómetro x: 0.98 - 2.58 1.75 Voltios - 180º 45º 0º
// y: 1.85 - 2.58 1.85
add_x = vol_x - 1.75;
add_y = vol_y - 1.85;
g_x = add_x / 0.8;
g_y = add_y / 0.8;
// if (g_x <= 1 && g_x >= -1)
{
grados_x = asin(g_x) * 180.0 / PI;
grados_y = asin(g_y) * 180.0 / PI;
}
/*
if (g_x > 1) grados_x = 90;
if (g_x < -1) grados_x = -90;
if (g_y > 1) grados_y = 90;
if (g_y < -1) grados_y = -90;
*/
// Quitar decimales
grad_X = int (grados_x);
grad_Y = int (grados_y);
He comentado esas líneas (que corrigen asin (1) = 0) y he solucionado en parte el problema.
En el eje Y ahora funciona normal, pero en el X, siempre me da el mismo valor al iniciar, -64.
Y ahora me he dado cuenta de otro problema. Esto va a ir en un vehículo, y puede estar parado ya inclinado (sobre todo en el caso de una bicicleta en la pata de cabra), por lo que me haría falta una forma de ‘resetearlo’.
Como dije en el primer post, un comando tipo ‘wait’ (grad_X == 0) [-> sería como que te subes a la bici y te pones vertical y que entonces comience el loop], me solucionaría todo el problema y no me haría falta comentar esas líneas.
He hecho un pin como entrada, y a un interruptor (tengo otro para encender el arduino, y otro para la pantalla), y he metido todo el código del cálculo de los ángulos en un while.
while (digitalRead(2) ==HIGH) {
todo el código anterior sin comentar nada
}
Al iniciar no marca nada.
Lo estoy probando porque parece que a veces se cuelga, se queda un tiempo sin leer de tanto en tanto.
Cualquier código va con etiquetas.
while (digitalRead(2) ==HIGH) {
todo el código anterior sin comentar nada
}
Edita por favor!!