[...]Ademas hay q integrar la aceleracion para obtener la velocidad (q es el parametro q se le pasa a la pc para q mueva el cursor), y ahi puede existir algun valor residual por el error en la integracion o ruido, asiq hay q aplicar una funcion q detecte cuando el mouse dejo de moverse.
[...]
El codigo es un poquito largo, pero trate de modularizar lo mas q pude para q lo puedan entender.¿Que has modularizado?¿Si el código esta igual (o casi) que en la nota de aplicación de freescale?
Tus cálculos de integración no son correctos a mi parecer por lo que miré en los algoritmos:BrunoF, los calculos que comenta gera estan basados en la nota de aplicacion AN3397 de Freescale, y son correctos. Mira el documento en la pagina 2, la formula "Formula 1", ademas esa parte del código la puedes ver igual en la pagina 11.
¿Que tipo de acelerómetro es?¿Envía un voltaje proporcional a la aceleración en cada eje?Hola Bruno! El acelerometro es el MMA7260QT de freescale. Como vos decis, da una tension proporcional a la aceleracion en sus patas (es tri-axial).
El problema de integrar es el que ya se conoce y es que hay una valor que se desconoce. Al integrar la aceleración obtienes la velocidad, pero te falta saber un parametro constante(llamado generalmente V0 o Vi(Velocidad Inicial) en estos caso). Partiendo de la aceleración, es todo un tema detectar cuándo está realmente en reposo el dispositivo sin utilizar algún otro sensor de apoyo, porque tanto para un estado de reposo como de movimiento uniforme, el acelerómetro dará valores semejantes(la aceleración tiende a 0, por lo que Vel=ctte). Similar sucede al integrar nuevamente para averiguar la posición...Es cierto, pero asumo q cuando se enchufa el mouse, este esta en posicion de reposo, por lo tanto Vi=0. Ademas para evitar ciertas derivas, hay una funcion q se fija si la aceleracion es nula en cierta cantidad de muestras, entonces asume q la velocidad tambien lo es (suponiendo q cuando uno esta moviendo el mouse con la mano, es improbable q logre una aceleracion constante igual a cero).
gera: A(t), V(t) y P(t) son funciones en el tiempo.Lo que pasa es q uso el metodo del trapecio para integrar las funciones. Es bastante mas preciso q sumar los sucesivos valores.
Tus cálculos de integración no son correctos a mi parecer por lo que miré en los algoritmos:
¿Que has modularizado?¿Si el código esta igual (o casi) que en la nota de aplicación de freescale?Jeje, si, mucho del codigo lo copie textual de la app note de freescale. Pero lo modifique bastante y agregue una q otra funcion (por el tema de usb y del filtrado).
Oye Gera, ¿de casualidad tu acelerómetro es como éste?
(http://img199.imageshack.us/img199/5430/dsc00165i.th.jpg) (http://img199.imageshack.us/img199/5430/dsc00165i.jpg)
Es que lo conseguí esta semana y ya le tengo un proyecto planeado. Y pues aprovecharía que ya llevas camino recorrido. :mrgreen: Me costó como 23USD, casi casi regalado.
buenísimo gera, estoy impaciente de qeu logres controlar eso de los filtros, pero hasata ahroa va muy bien, lindo trabajo!!
cuando termines el filtro me gustaría verlo para entenderlo, si se puede claro.
saludos, felicidades por el excelente trabajo que tienes hasta ahora
Yo imagino que el problema de la velocidad no era la velocidad en sí, sino que había que volver a integrar la velocidad para llegar a la posición. Una vez teniendo la posición se debe calcular el delta de la posición para saber cuánto se movió el acelerómetro, que es básicamente como trabajan los mouse, enviando deltas en x y y.
Pero también había pensado en un control directo con la aceleración, lo cual es mucho más fácil y rápido de implementar y que Gera ya aplicó.
No he podido ver los videos de youtube (firewall escolar) pero qué bueno que llegaste a un mejor desempeño del sistema Gera.
Quisiera tomar muchas mas muestras a la hora de la calibracionEl algoritmo ya toma 128 muestras, que ya son suficientes para el promedio. Para obtener más muestras sin "desbordar" lo más facil es que declares las variables sstatex y sstatey como unsigned long long. También puedes probar a declarar todas las variables de la función calibrate como float y hacer la conversión a entero después de la división.
Por mas muestras q tome, siempre me da un valor un poco menor q el real.Si tu código es como este...:
accelerationx[1] = (accelerationx[1]-(sstatex+4))/2;Desde luego si solo tenias errores en el eje Y, esa puede ser la causa.
accelerationy[1] = (accelerationX[1]-(sstatey+4))/2; accelerationX!!!
este modelito te viene anillo al dedo!,si freescale no te manda nuevamente avisame yo te puedo mandar tengo 5 :mrgreen:, saludos!!
si gera te lo puedo pasar porsupuesto , que proteus tenes? yo lo hago con el 6,9.saludos!!!!
El tema con zigbee es q vas a tener q comprar un par de modulos minimo. En cambio bluetooth tenes en el celular, en la PC, etc..
Bueno, fijate como haces, espero novedades :D
saludos!!!
Fijate en esta parte del codigo:Código: C
void data_transfer(void) { usb_task(); if(usb_enumerated()) { LED_ON(LEDGREEN); LED_OFF(LEDRED); out_data[0] = 0; if(input(PIN_B2)) { out_data[0] = 1; //button state goes here delay_us(100); } out_data[1] = (int8) (-accelerationx[1]/3); out_data[2] = (int8) (accelerationy[1]/3); out_data[3] = 0; //wheel state goes here usb_put_packet(1,out_data,4,USB_DTS_TOGGLE); } else { LED_OFF(LEDGREEN); LED_ON(LEDRED); } }
En el arreglo out_data[] va toda la informacion sobre el mouse... out_data[0] indica el estado de los botones del mouse. Las posiciones 1 y 2 del arreglo indican la velocidad de desplazamiento del mouse, y out_data[3] es la ruedita del scroll.
suerte!
Lamentablemente ya no dan muestras gratis de este acelerometro. Ademas ya es modelo obsoleto y no lo fabrican mas :(
Si queres muestras gratis necesitas un mail corporativo. Proba usar el de tu empresa/universidad o el q consigas.
saludos!!
hola quisiera saber si me pueden enviar informacion de este pryecto a mi correo david.keusen@gmail.com lo que son diagranas esquematicos de todas las conexiones del pic con el acelerometro los pulsadores.... el codigo fuente del pic..... y el codigo o programa que se requiere en la computadora.
de antemano les agradezco muchooo
saludso
hermano pero los valores de resistencias y capacitores no aparecen
Zarek Podés recurrir a una OR.
out_data[0] = 0;
if (click_izq_presionado) out_data[0] |= 1;
if (click_der_presionado) out_data[0] |= 2;
De esta manera vas incluyendo valores sin eliminar a otros. En este caso out_data[0] terminaría con el valor 3, indicando que tanto el click izquierdo como derecho están presionados a la vez.
Saludos.