现在的位置: 首页 > 综合 > 正文

android学习笔记—57前准备:认识android设备中的传感器

2018年04月05日 ⁄ 综合 ⁄ 共 6012字 ⁄ 字号 评论关闭

2013/5/14
57前准备:认识android设备中的传感器
------------------------------------
1.android手机中的传感器:
 在Android2.3 gingerbread系统中,google提供了11种传感器供应用层使用。
#define SENSOR_TYPE_ACCELEROMETER       1 //加速度
#define SENSOR_TYPE_MAGNETIC_FIELD      2 //磁力
#define SENSOR_TYPE_ORIENTATION         3 //方向
#define SENSOR_TYPE_GYROSCOPE           4 //陀螺仪
#define SENSOR_TYPE_LIGHT               5 //光线感应
#define SENSOR_TYPE_PRESSURE            6 //压力
#define SENSOR_TYPE_TEMPERATURE         7 //温度
#define SENSOR_TYPE_PROXIMITY           8 //接近
#define SENSOR_TYPE_GRAVITY             9 //重力
#define SENSOR_TYPE_LINEAR_ACCELERATION 10//线性加速度
#define SENSOR_TYPE_ROTATION_VECTOR     11//旋转矢量
我们依次看看这十一种传感器
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的数据没有单位,使用的坐标系与加速度相同。
举例:
 sensors_event_t.data[0] = x*sin(theta/2)
sensors_event_t.data[1] = y*sin(theta/2)
sensors_event_t.data[2] = z*sin(theta/2)
sensors_event_t.data[3] =   cos(theta/2)
GV、LA和RV的数值没有物理传感器可以直接给出,
需要G-sensor、O-sensor和Gyro-sensor经过算法计算后得出。
算法一般是传感器公司的私有产权。
-------------------------------------------------------------
2.Android设备传感器学习
  一、传感器的分类
分为三大类:1、动作传感器 2、位置传感器 3、环境传感器
1、动作传感器:跟手机的动作有关
加速度传感器( TYPE_ACCELEROMETER) 三轴加速度感应器 返回三个坐标轴的加速度  单位m/s2
重力传感器(TYPE_GRAVITY)
陀螺仪(TYPE_GYROSCOPE) 手机的姿态 游戏中用的较多 可判断方向返回三个坐标轴上的角度
等……
2、位置传感器
方向传感器(TYPE_ORIENTATIO)
磁场传感器(TYPE_MAGNETIC_FIELD)有夹角 返回三个坐标轴的数值  微特斯拉
距离传感器 (TYPE_PROXIMITY)
3、环境传感器
温度传感器( TYPE_TEMPERATURE) 单位 摄氏度
压力传感器 (TYPE_PRESSURE)单位 千帕斯卡
亮度传感器 ()根外界的光线的强弱有关手机亮度随之变化
翻转传感器 (TYPE_ROTATION_VECTOR)
等……
二、Android设备传感器的特点
三、获取手机当中说有的传感器的名称
四、使用传感器的方法
1、获取SensorManager对象,对整个传感器进行管理
2、执行SensorManager对象的getDefaultSensor(Sensor.TYPE_XXX)方法获取Sensor对象
3、获取Sensor对象的各种属性
-------------------------------
Android设备传感器(二)获取手机中所支持的传感器
Activity:

package com.yu.TestMobileSensor;

import java.util.List;
import android.hardware.Sensor;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.util.Log;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends Activity {
//定义控件
private TextView sensorList;
private Button btnSensor;
//手机传感器管理器,用来管理所有的传感器
private SensorManager sensorManager;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //得到SensorManager对象
        sensorManager = (SensorManager)getSystemService(Context.SENSOR_SERVICE);
        //根据ID获取文本控件
        sensorList = (TextView)this.findViewById(R.id.sensorList);
        //获取按钮控件
        btnSensor = (Button)this.findViewById(R.id.btn_gain);
        //添加监听器
        btnSensor.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//声明可变字符串
StringBuffer sb = new StringBuffer();
//获取手机全部的传感器
List<Sensor> sensors = sensorManager.getSensorList(Sensor.TYPE_ALL);
//迭代输出获得上的传感器
for (Sensor sensor : sensors) {
//System.out.println(sensor.getName().toString());
sb.append(sensor.getName().toString());
sb.append("\n");
Log.i("Sensor", sensor.getName().toString());
}
//给文本控件赋值
sensorList.setText(sb.toString());
}
});
    }

   
 // Menu
  // 当点击Menu按钮时,调用该方法
  @Override
  public boolean onCreateOptionsMenu(Menu menu) {
  menu.add(0, 1, 1, R.string.exit).setIcon(
  android.R.drawable.ic_menu_close_clear_cancel);
  return super.onCreateOptionsMenu(menu);
  }
  // 选中某个菜单项
  @Override
  public boolean onContextItemSelected(MenuItem item) {
  if (item.getItemId() == 1) {
  MainActivity.this.finish();
  }
  return super.onOptionsItemSelected(item);
  }

  // 返回键
  @Override
  public boolean onKeyDown(int keyCode, KeyEvent event) {
  if (keyCode == KeyEvent.KEYCODE_BACK) {
  finish();
  }
  return super.onKeyDown(keyCode, event);
  }
 
}

activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <Button
        android:id="@+id/btn_gain"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/btn_gain"/>
    <TextView
        android:id="@+id/sensorList"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"/>
</LinearLayout>

抱歉!评论已关闭.