gsensorandroid
『壹』 求安卓下所有感測器的簡介
1 加速度感測器
加速度感測器又叫G-sensor,返回x、y、z三軸的加速度數值。
該數值包含地心引力的影響,單位是m/s^2。
將手機平放在桌面上,x軸默認為0,y軸默認0,z軸默認9.81。
將手機朝下放在桌面上,z軸為-9.81。
將手機向左傾斜,x軸為正值。
將手機向右傾斜,x軸為負值。
將手機向上傾斜,y軸為負值。
將手機向下傾斜,y軸為正值。
加速度感測器可能是最為成熟的一種mems產品,市場上的加速度感測器種類很多。
手機中常用的加速度感測器有BOSCH(博世)的BMA系列,AMK的897X系列,ST的LIS3X系列等。
這些感測器一般提供±2G至±16G的加速度測量范圍,採用I2C或SPI介面和MCU相連,數據精度小於16bit。
2 磁力感測器
磁力感測器簡稱為M-sensor,返回x、y、z三軸的環境磁場數據。
該數值的單位是微特斯拉(micro-Tesla),用uT表示。
單位也可以是高斯(Gauss),1Tesla=10000Gauss。
硬體上一般沒有獨立的磁力感測器,磁力數據由電子羅盤感測器提供(E-compass)。
電子羅盤感測器同時提供下文的方向感測器數據。
3 方向感測器
方向感測器簡稱為O-sensor,返回三軸的角度數據,方向數據的單位是角度。
為了得到精確的角度數據,E-compass需要獲取G-sensor的數據,
經過計算生產O-sensor數據,否則只能獲取水平方向的角度。
方向感測器提供三個數據,分別為azimuth、pitch和roll。
azimuth:方位,返回水平時磁北極和Y軸的夾角,范圍為0°至360°。
0°=北,90°=東,180°=南,270°=西。
pitch:x軸和水平面的夾角,范圍為-180°至180°。
當z軸向y軸轉動時,角度為正值。
roll:y軸和水平面的夾角,由於歷史原因,范圍為-90°至90°。
當x軸向z軸移動時,角度為正值。
電子羅盤在獲取正確的數據前需要進行校準,通常可用8字校準法。
8字校準法要求用戶使用需要校準的設備在空中做8字晃動,
原則上盡量多的讓設備法線方向指向空間的所有8個象限。
手機中使用的電子羅盤晶元有AKM公司的897X系列,ST公司的LSM系列以及雅馬哈公司等等。
由於需要讀取G-sensor數據並計算出M-sensor和O-sensor數據,
因此廠商一般會提供一個後台daemon來完成工作,電子羅盤演算法一般是公司私有產權。
4 陀螺儀感測器
陀螺儀感測器叫做Gyro-sensor,返回x、y、z三軸的角加速度數據。
角加速度的單位是radians/second。
根據Nexus S手機實測:
水平逆時針旋轉,Z軸為正。
水平逆時針旋轉,z軸為負。
向左旋轉,y軸為負。
向右旋轉,y軸為正。
向上旋轉,x軸為負。
向下旋轉,x軸為正。
ST的L3G系列的陀螺儀感測器比較流行,iphone4和google的nexus s中使用該種感測器。
5 光線感應感測器
光線感應感測器檢測實時的光線強度,光強單位是lux,其物理意義是照射到單位面積上的光通量。
光線感應感測器主要用於Android系統的LCD自動亮度功能。
可以根據采樣到的光強數值實時調整LCD的亮度。
6 壓力感測器
壓力感測器返回當前的壓強,單位是百帕斯卡hectopascal(hPa)。
7 溫度感測器
溫度感測器返回當前的溫度。
8 接近感測器
接近感測器檢測物體與手機的距離,單位是厘米。
一些接近感測器只能返回遠和近兩個狀態,
因此,接近感測器將最大距離返回遠狀態,小於最大距離返回近狀態。
接近感測器可用於接聽電話時自動關閉LCD屏幕以節省電量。
一些晶元集成了接近感測器和光線感測器兩者功能。
下面三個感測器是Android2新提出的感測器類型,目前還不太清楚有哪些應用程序使用。
9 重力感測器
重力感測器簡稱GV-sensor,輸出重力數據。
在地球上,重力數值為9.8,單位是m/s^2。
坐標系統與加速度感測器相同。
當設備復位時,重力感測器的輸出與加速度感測器相同。
10 線性加速度感測器
線性加速度感測器簡稱LA-sensor。
線性加速度感測器是加速度感測器減去重力影響獲取的數據。
單位是m/s^2,坐標系統與加速度感測器相同。
加速度感測器、重力感測器和線性加速度感測器的計算公式如下:
加速度 = 重力 + 線性加速度
11 旋轉矢量感測器
旋轉矢量感測器簡稱RV-sensor。
旋轉矢量代表設備的方向,是一個將坐標軸和角度混合計算得到的數據。
RV-sensor輸出三個數據:
x*sin(theta/2)
y*sin(theta/2)
z*sin(theta/2)
sin(theta/2)是RV的數量級。
RV的方向與軸旋轉的方向相同。
RV的三個數值,與cos(theta/2)組成一個四元組。
RV的數據沒有單位,使用的坐標系與加速度相同。
『貳』 android的gsensor的hal層enable值怎樣到驅動層
Android上層應用apk到G-sensor driver的大致流程: Android HAL層,即硬體抽象層,是Google響應廠家「希望不公開源碼」的要求推出的新概念 1,源代碼和目標位置 源代碼: /hardware/libhardware目錄,該目錄的目錄結構如下: /hardware/libhardware/hardware.c編譯成libhardware.so,目標位置為/system/lib目錄 /hardware/libhardware/include/hardware目錄下包含如下頭文件: hardware.h 通用硬體模塊頭文件 bit.h bit模塊頭文件 gralloc.h gralloc模塊頭文件 lights.h 背光模塊頭文件 overlay.h overlay模塊頭文件 qemud.h qemud模塊頭文件 sensors.h 感測器模塊頭文件 /hardware/libhardware/moles目錄下定義了很多硬體模塊 這些硬體模塊都編譯成xxx.xxx.so,目標位置為/system/lib/hw目錄 2,Android對於Sensor的API定義在 hardware/libhardware/include/hardware/sensor.h中,要求在sensor.so提供以下8個API函數 [控制方面] int (*open_data_source)(struct sensors_control_device_t *dev); int (*activate)(struct sensors_control_device_t *dev, int handle, int enabled); int (*set_delay)(struct sensors_control_device_t *dev, int32_t ms); int (*wake)(struct sensors_control_device_t *dev); [數據方面] int (*data_open)(struct sensors_data_device_t *dev, int fd); int (*data_close)(struct sensors_data_device_t *dev); int (*poll)(struct sensors_data_device_t *dev, sensors_data_t* data); [模塊方面] int (*get_sensors_list)(struct sensors_mole_t* mole, struct sensor_t const** list); 在java層Sensor的狀態控制由SensorService來負責,它的java代碼和JNI代碼分別位於: frameworks/base/services/java/com/Android/server/SensorService.java frameworks/base/services/jni/com_Android_server_SensorService.cpp 在Java層Sensor的數據控制由SensorManager來負責,它的java代碼和JNI代碼分別位於: frameworks/base/core/java/Android/hardware/SensorManager.java frameworks/base/core/jni/Android_hardware_SensorManager.cpp Android framework中與sensor通信的是sensorService.java和sensorManager.java。 sensorService.java的具體通信是通過JNI調用sensorService.cpp中的方法實現的。 sensorManager.java的具體通信是通過JNI調用sensorManager.cpp中的方法實現的。 sensorService.cpp和sensorManger.cpp通過hardware.c與sensor.so通信。其中sensorService.cpp實現對sensor的狀態控制,sensorManger.cpp實現對sensor的數據控制。 sensor.so通過ioctl控制sensor driver的狀態,通過打開sensor driver對應的設備文件讀取G-sensor採集的數據。 Android SDK提供了4個類來於sensor通信,分別為 sensor,sensorEvent,sensorEventListener,sensorManager。其中 sensorEventListener用來在sensorManager中注冊需要監聽的sensor類型。 sensorManager.java提供registrater(),unregistrater()介面供sensorEventListener使用。 sensorManager.java不斷輪詢從sensor.so中取數據。取到數據後送給負責監聽此類型sensor的 sensorEventListener.java。sensorEventListener.java通過在sensorManager.java中注冊可以監聽特定類型的sensor傳來的數據。 系統啟動時執行systemProcess,會啟動sensorService.java,在sensorService.java的構造函數中調用JNI方法_sensor_control_init()。 sensorService.cpp中相應的方法Android_int()會被執行。該函數會調用hardware.c中的方法hw_get_mole()此函數又通過調用load()函數在system/lib/hw下查找sensor.so 查找時會根據harware.c中定義好的sensor.*.so的擴展名的順序查找,找到第一個匹配的時候即停止,並將該sensor.so中定義好的一個全局變數HAL_MODULE_INFO_SYM帶回。該變數包含的一個 重要信息是它的一個成員結構變數中包含的一個函數指針open,該指針所指函數會對一個device結構變數賦值,從而帶出sensorService.cpp和sensorManager.cpp與sensor通信所需要的全部信息。 device結構變數有兩種變體分別供sensorService.cpp和sensorManaer.cpp使用。其中主要是一些函數指針指向與sensor通信的函數。 sensorService.cpp和sensorManager.cpp在得到HAL_MODULE_INFO_SYM結構後都會調用 sensors.h的inline函數open()通過HAL_MODULE_INFO_SYM的open函數指針將所需的device信息取回。 系統在啟動activityManager.java時,它會啟動sensorManager.java,它也會調用hardware.c中的方法hw_get_mole()帶回HAL_MODULE_INFO_SYM。
『叄』 android gsensor 休眠震動喚醒功能如何實現
一、喚醒源
設備休眠後,通過觸發喚醒源使設備恢復正常工作模式。設備喚醒源有多種,對於Android設備常見的就有PowerKey、來電喚醒、Alarm喚醒等。
喚醒源的實現處於內核空間,本文重點討論下PowerKey作為喚醒源的具體實現。
二、PowerKey喚醒源
PowerKey喚醒設備的原理,本質其實就是中斷。
PowerKey連接到CPU的一個輸入(Input)引腳(Pin)上,該Pin運行在中斷模式上。一旦PowerKey按下,引發Pin中斷;而該中斷具有喚醒CPU的功能,於是設備得以喚醒。
三、PowerKey對應的Pin
Configuration
和PowerKey相連的Pin的具體配置位於板級dts文件中,比如如下配置:
arch/arm/boot/dts/xxxxx.dts
power-key {
/** 是CPU的哪個Pin */
gpios = <&gpio0 GPIO_A5 GPIO_ACTIVE_LOW>;
/** Key code */
linux,code = <116>;
/** 起個名字 */
label = "power";
/** 該Pin具有wakeup的功能 */
gpio-key,wakeup;
};
著重說下linux,code =
<116>,116怎麼來的?
對於鍵盤,每一個按鍵都有唯一的編碼,在Linux中,編碼值位於:
input.h (kernelincludeuapilinux)
/*
* Keys and buttons
*/
#define KEY_RESERVED 0
#define KEY_ESC 1
#define KEY_BACKSPACE 14
#define KEY_TAB 15
#define KEY_POWER 116 /* SC System Power Down */
可知,PowerKey的編碼也在該文件中,且編碼值為116;一旦按下PowerKey,該值作為鍵值傳到input_event結構體的code成員變數中:
input.h (kernelincludeuapilinux)
/*
* The event structure itself
*/
struct input_event {
struct timeval time;
__u16 type;
__u16 code;
__s32 value;
};
之後我們會寫個Linux應用程序讀取code值。
『肆』 android 判斷是否有gsensor
Android中sensor在Android系統架構中的位置及其工作。方框圖如下:
從以上方框圖中,可以看出Android中sensor在系統分為四層:驅動層(Sensor Driver)、硬體抽象層(Native)、中間層(Framework)、應用層(Java)。硬體抽象層與中間層可以合並一起作為Framework層。
針對我們xx這里一個具體的Gsensor,下面將以具體的源碼形式來講解以上的這個系統框圖。
『伍』 在HTC手機上看到有個G-sensor校準,G-sensor是什麼東西
G-sensor中文是重力感測器的意思(英文全稱是Gravity-sensor),它能夠感知到加速力的變化,加速力就是當物體在加速過程中作用在物體上的力,比如晃動、跌落、上升、下降等各種移動變化都能被G-sensor轉化為電信號,然後通過微處理器的計算分析後,就能夠完成程序設計好的功能,比如MP3能根據使用者的甩動方向,前後更換歌曲,放進衣袋的時候也能夠計算出使用者的前進步伐。個別高端筆記本例如IBM高端系列也內置了G-sensor,在感知發生劇烈加速度時(如開始跌落),立即保護硬碟,避免硬碟損害。簡單的說,G-Sensor是智能化重力感應系統,應用在硬碟上可以檢測當前硬碟的狀態,當發生意外跌落時,會產生加速度,硬碟感應到加速度,磁頭就會自動歸位,使盤體和磁頭分離,防止在讀寫操作的時候受到意外的沖擊,從而有效的保護硬碟。
在手機中應用此項技術,可以根據使用者的動作而進行相應的軟體應用,比如游戲,使用者揮舞手機,游戲也會有相應的反應,就像Wii的微電機械繫統(MEMS)。