¿Cómo abrir la orientación y las coordenadas de los datos del acelerómetro en el controlador de Android?
Un teléfono inteligente o dispositivo portátil debe tener capacidades de Wi-Fi e Internet, poder ejecutar aplicaciones y muchas otras funciones, y definitivamente debería tener sensores integrados. Los teléfonos inteligentes de alta gama pueden integrar sensores como sensores de proximidad, sensores de luz ambiental, acelerómetros de tres ejes y magnetómetros. Android 2.3
Se agregó soporte API para una variedad de sensores nuevos, incluidos giroscopio, vector de rotación, aceleración lineal, gravedad y sensores de presión de aire. Las aplicaciones pueden utilizar estos nuevos sensores y combinarlos para lograr capacidades avanzadas de detección de movimiento con alta precisión.
Los acelerómetros de tres ejes o sensores de baja gravedad son uno de los sensores soportados por la API de Android
Su sistema de coordenadas específico proporciona datos de interfaz estándar a las aplicaciones. La definición del espacio de coordenadas está relacionada con la orientación predeterminada de la pantalla del teléfono móvil, como se muestra en la Figura 1.
Figura
1. Sistema de coordenadas de Android adecuado para acelerómetro de 3 ejes
En el sistema de coordenadas de Android, el origen de las coordenadas se encuentra en la esquina inferior izquierda de la pantalla y el eje X La horizontal apunta a la derecha, el eje Y apunta verticalmente a la parte superior y el eje Z apunta al frente de la pantalla. En este sistema, las coordenadas en la parte posterior de la pantalla tienen valores negativos del eje Z. Los datos del acelerómetro de Android se definen como:
Sensor.TYPE_ACCELEROMETER
Todos los valores están en unidades SI
Unidades estándar (m/s2), que miden la valor de aceleración del teléfono y restar el componente de aceleración gravitacional.
valores[0]: El valor de aceleración en el eje x menos Gx
valores[1]: El valor de aceleración en el eje y menos Gy
valores[2]: El valor de aceleración en el eje z menos Gz
Por ejemplo, cuando el dispositivo se apoya sobre la mesa y empuja su lado izquierdo hacia la derecha, x
El valor de aceleración del eje es positivo. Cuando el dispositivo reposa sobre una mesa, el valor de aceleración es 9,81, que es la aceleración debida a la gravedad (-9,81 m/s2) restada del valor de aceleración del dispositivo (0 m/s2).
Cuando el dispositivo se coloca plano sobre la mesa y se empuja hacia el cielo con una aceleración de A m/s2, el valor de aceleración es igual a A 9,81, que es el valor de aceleración del dispositivo esclavo (A
m/s2) menos la aceleración debida a la gravedad (-9,81 m/s2).
La Tabla 1
enumera las lecturas de aceleración del sensor correspondientes a cada posición del dispositivo. El usuario puede utilizar la siguiente tabla para comprobar si la orientación del acelerómetro es coherente con las coordenadas del sistema.
Al leer el valor de aceleración de 3 ejes del acelerómetro, es necesario asumir que la dirección de 3 ejes del sensor es consistente con las coordenadas del sistema. Sin embargo, en los productos reales, se pueden usar diferentes chips sensores o diferentes direcciones de montaje, por lo que la dirección de los datos será diferente. La Figura 2 muestra la definición de dirección para el sensor de aceleración de 3 ejes Freescale MMA8452Q
.
En la Figura 2, podemos ver que al instalar el chip, el pin 1 debe estar en la posición inferior derecha (PD) e instalado en el frente de la PCB para poder interactuar con Android.
El sistema de coordenadas coincide con la posición predeterminada. Después de dicha instalación, el usuario puede asegurarse de que la dirección de los datos sea consistente con la definición de coordenadas del sistema. En cualquier otro caso, los datos no serán exactamente como los define el sistema, por lo que será necesario cambiar la orientación y las coordenadas de los datos. En algunos casos, los ejes X
y los ejes Y deben intercambiarse, o la orientación y el eje X-Y deben cambiarse simultáneamente.
Para determinar si necesita cambiar la orientación o intercambiar los ejes X-Y:
1.
Coloque el dispositivo en la posición superior (ARRIBA), como como se muestra en la Tabla 1.
2. Leer datos de 3 ejes del sensor. Si los datos para el eje Y son ±1 g
(±9,81 m/s2) y los datos para los otros dos ejes son aproximadamente 0, no es necesario intercambiar los ejes X-Y. De lo contrario, deberá intercambiar el eje X y el eje Y e ir al paso 3.
2.1.
En esta posición, si los datos leídos por el eje Y son 1 g (9,81 m/s2), no es necesario cambiar la dirección del eje Y si los datos son negativos; es necesario cambiar la dirección del eje Y.
2.2.
Como se muestra en la Tabla 1, coloque el dispositivo en la posición orientada hacia la izquierda (IZQUIERDA). La lectura en el eje X debe ser ±1 g (±9,81 m/s2) y los otros dos ejes deben ser aproximadamente 0. Si los datos en el eje X
son positivos, no es necesario cambiar la dirección; de lo contrario, es necesario cambiar la dirección del eje X. Luego, realice el paso 4 para determinar la dirección del eje Z.
3.
El dispositivo permanece en la posición ARRIBA y lee los datos del sensor en los 3 ejes. En este punto, los datos en el eje X deben ser ±1 g
(±9,81 m/s2) y los datos en los otros dos ejes deben ser aproximadamente 0, lo que requiere el intercambio X-Y.
3.1. En esta posición, si el dato en el eje X es 1 g
(9,81 m/s2), no hay necesidad de cambiar la dirección de la dirección.
3.2. Como se muestra en la Tabla 1, coloque el instrumento en el lado izquierdo. Si los datos en el eje Y son positivos, no es necesario cambiar la dirección; de lo contrario, es necesario cambiar la dirección. Luego realice el paso 4 para orientar el eje Z
.
4. Coloque el dispositivo en posición boca arriba y lea los datos de tres ejes del sensor. Si los datos del eje Z son 1 g
(9,81 m/s2) y los datos de los otros dos ejes son aproximadamente 0, no es necesario cambiar la dirección del eje Z; los datos del eje Z son -1 g (-9,81 m/s2), es necesario cambiar la dirección del eje Z.
En Android, el controlador de Linux lee los datos del sensor en el espacio del kernel y luego el controlador de capa HAL los envía a la API. La estructura en capas se muestra en la Figura 3
. Por lo tanto, los datos del sensor se pueden transformar en la capa del controlador de Linux o en la capa HAL.
Cambiar la dirección de los ejes X, Y y Z en el archivo HAL de Android
En el archivo HAL
se incluirá un conjunto de definiciones de macros a Los datos de aceleración leídos del sensor se convierten a unidades estándar (m/s2). Como se muestra en el siguiente código:
//Convertir
datos de aceleración a unidades SI (m/s^2)
#define CONVERT_A (GRAVITY_EARTH /
p>
LSG)
#define CONVERT_A_X (-)
#define CONVERT_A_X (GRAVITY_EARTH /
LSG) p>
# define CONVERT_A_X (-)CONVERT_A)
#define CONVERT_A_Y (CONVERT_A)
#define CONVERT_A_Z (CONVERT_A)
En esta definición de macro , la constante GRAVITY_EARTH
p>es la aceleración estándar debida a la gravedad.
p> es el valor de aceleración de la gravedad estándar 9,81 m/s2, LSG es la cifra menos significativa del valor de la aceleración de la gravedad, por ejemplo
Por lo tanto, CONVERT_A se utiliza para convertir los datos leídos del sensor de aceleración de forma digital. lectura a gravedad estándar Unidad de aceleración.
Podemos cambiar fácilmente la dirección de los ejes X, Y y Z modificando CONVERT_A_X, CONVERT_A_Y y CONVERT_A_Z respectivamente
. Si la dirección del eje es opuesta a la definición del sistema, puede usar (-CONVERT_A) para cambiar su dirección. Si las direcciones son las mismas, use (CONVERT_A) y la dirección permanece sin cambios.
Esta macro está definida en el archivo HAL sensor.c ubicado en el controlador FSL de Android 9 (Android 2.2). Para FSLAndroid 10
(Android 2.3), puede encontrarlo en el archivo HAL sensor.h en la carpeta "libsensors".
Intercambiar el eje X y el eje Y en el archivo HAL de Android 2.2
Archivo
En algunos casos, para que las coordenadas de los datos del sensor sean consistentes con las coordenadas del sistema, se deben invertir los ejes X e Y.
Para FSL
Para el controlador de Android 9 (Android 2.2), intercambiar el eje X y el eje Y es muy sencillo. Primero, en el archivo HAL sensor.c
busque el siguiente código en la función sensor_poll():
switch (event.code) {
case ABS_X :