浅谈Android传感器 III-磁传感器

传感器

282人已加入

描述

磁传感器
 
  磁传感器是把磁场、电流、应力应变、温度、光等外界因素引起敏感元件磁性能变化转换成电信号,以这种方式来检测相应物理量的器件。
 
  磁传感器广泛用于现代工业和电子产品中以感应磁场强度来测量电流、位置、方向等物理参数。在现有技术中,有许多不同类型的传感器用于测量磁场和其他参数。
 
  磁传感器是把磁场、电流、应力应变、温度、光等外界因素引起敏感元件磁性能变化转换成电信号,以这种方式来检测相应物理量的器件。磁传感器分为三类:指南针、磁场感应器、位置传感器。指南针:地球会产生磁场,如果你能测地球表面磁场就可以做指南针。电流传感器:电流传感器也是磁场传感器。电流传感器可以用在家用电器、智能电网、电动车、风力发电等等。位置传感器: 如果一个磁体和磁传感器相互之间有位置变化,这个位置变化是线性的就是线性传感器,如果转动的就是转动传感器。
 
  大生活中用到很多磁传感器,比如说指南针,电脑硬盘、家用电器等等。
 
  在传统产业改造中的应用及市场
 
  据报道,1995年仅工业过程控制传感器的全球市场已达到260亿美元;2001年计算机HDD用SV-GMR磁头的市场超过了4000亿日元(约合34亿美元)。若采用新型微型磁传感器,既使操作更简便,又提高了可靠性,增长了器件寿命,降低了成本。
 
  使用新型磁传感器可以显着提高测量和控制精度,如使用GMI(巨磁阻抗)磁场传感器,检测分辨率和常用磁通门磁强计一样,而响应速度却快了一倍,消耗功率仅为后者的1%;若用霍尔器件,其分辨率仅4A/m,而所需外场比前者高300余倍;在应力检测中,SI 传感器的灵敏度是常用电阻丝的2000倍高,是半导体应变规的20~40倍。工业机床的油压或气压汽缸活塞位置检测,广泛采用套在活塞杆上的永磁环和AMR元件组成的磁传感器,检测精度达0.1mm,检测速度可在0~500mm/s内以高低速度变换;改用GMI或SV-GMR传感器后,测量精度至少可以提高1个数量级。在机床数控化时代,数字磁尺帮助设计师们实现了闭环控制。使用绝对信号输出的磁尺,则不受噪声、电源电压波动等干扰,也不必原点复位。使用工作状态磁敏开关,还可以完成手动与数控之间的转换。
 
  旋转磁编码器在旋转量的检测控制中起关键作用,它在数控机床、机器人、工厂自动化设备的位置检测、传输速度控制,磁盘、打印机之类的自动化设备通讯设备的旋转量检测中都是不可缺少的重要部件。其检测对象是光磁图形,不受油雾粉尘的影响,因此比目前最先进的光编码器的可靠性高寿命长,尤其适合于自动焊接、油漆机器人和与钢铁有关的位置检测以及各种金属、木材、塑料等加工行业的应用。而仍大量使用光编码器,由于这种器件易受粉尘、油污和烟雾的影响,用在自动焊接、油漆机器人、纺织和钢铁、木料、塑料等的加工中,可靠性极差。应用AMR、GMR 、GMI敏感元件构成的旋转磁编码器,就不存在上述缺点,因此,它们的市场需求年增长率在30%以上。在家用电器和节能产品中也也有其广泛的应用潜力,在节能环保产品中也大有用武之地。若使用微型磁编码器和控制微机一体化,更有利于简化控制系统结构,减少元件数和占空体积,这在精密制造和加工业中意义十分重大。
 
  在环境监测中的应用
 
  环境保护的前提是对各个环境参数(温度、气压、大气成份、噪声。..。..。)的监测,这里需要使用多种大量的传感器。采用强磁致伸缩非晶磁弹微型磁传感器,可以同时测量真空或密闭空间的温度和气压,而且不用接插件,可以遥测和远距离访问。在食品包装、环境科学实验等方面,应用前景广阔。
 
  在交通管制中的应用
 
  交通事故和交通阻塞是城市中和城市间交通存在的一个大问题。国内外都在加强高速公路行车支持道路系统(AHS)、智能运输系统(ITS)和道路交通信息系统(VICS)等的开发与建设。在这些新系统中,高灵敏度、高速响应微型磁传感器大有用武之地。例如,用分辨率可达1nT的GMI和SI传感器,可构成ITS传感器(作高速路上的道路标志,测车轮角度,货车近接距离),汽车通过记录仪(测通行方向、速度、车身长度、车种识别),停车场成批车辆传感器,加速度传感器(测车辆通过时路桥的振动等)。
 
  磁传感器在电子罗盘中的应用
 
  几个世纪以来,人们在导航中一直使用磁罗盘。有资料显示早在二千多年前中国人就开始使用天然磁石-一种磁铁矿来指示水平方向。电子罗盘(数字罗盘,电子指南针,数字指南针)是测量方位角(航向角)比较经济的一种电子仪器。如今电子指南针广泛应用于汽车和手持电子罗盘,手表,手机,对讲机,雷达探测器,望远镜,探星仪,穆斯林麦加探测器(穆斯林钟),手持 GPS 系统,寻路器,武器/导弹导航( 航位推测 ),位置/方位系统,安全/定位设备,汽车、航海和航空的高性能导航设备,电子游戏机设备等需要方向或姿态显示的设备。
 
  地球本身是一个大磁铁,地球表面的磁场大约为0.5Oe,地磁场平行地球表面并始终指向北方。利用GMR薄膜可做成用来探测地磁场的传感器。图5显示这种传感器的具体工作原理。我们可以制出能够探测磁场X和Y方向分量的集成GMR传感器。此传感器可作为罗盘并应用在各种交通工具上作为导航装置。美国的NVE公司已经把GMR传感器用在车辆的交通控制系统上。例如,放置在高速公路边的GMR传感器可以计算和区别通过传感器的车辆。如果同时分开放置两个GMR传感器,还可以探测出通过车辆的速度和车辆的长度,当然GMR也可用在公路的收费亭,从而实现收费的自动控制。另外高灵敏度和低磁场的传感器可以用在航空、航天及卫星通信技术上。大家知道,在军事工业中随着吸波技术的发展,军事物件可以通过覆盖一层吸波材料而隐蔽,但是它们无论如何都会产生磁场,因此通过GMR磁场传感器可以把隐蔽的物体找出来。当然,GMR磁场传感器可以应用在卫星上,用来探测地球表面上的物体和底下的矿藏分布。
 
  门磁传感器在智能家居中的应用
 
  在智能家居门禁系统中门磁开关的作用是负责门磁通电否,通电带磁(闭门),断电消磁(开门),门磁安装于门与门套上,开关安装于屋内,配合自动闭门器使用,一般可承受150公斤的拉力。
 
  有线门磁为嵌入式安装更加隐蔽,感应门窗的开合,适用于木质或铝合金门窗发出有线常闭/常开开关信号。门磁是用来探测门、窗、抽屉等是否被非法打开或移动。它由无线发射器和磁块两部分组成。门磁系统其实和床磁等原理相同。

  Android平台提供了两种传感器让我们可以确定设备的位置: 地磁传感器和方向传感器。 Android还提供了一种传感器让我们可以决定人脸离手机多近的时候关闭屏幕(距离传感器proximity sensor)。 地磁传感器和距离传感器都是基于硬件的。 大多数手持设备供应商都有提供一个地磁传感器。 同样, 手持设备制造商通常包含一个距离传感器来在通话的时候决定何时关闭屏幕。 方向传感器(orientation sensor)是基于软件的, 它通过加速度传感器和地磁传感器来计算数据。 但是方向传感器在Android2.2中已经不推荐使用。

  位置传感器在确定设备在世界中所处的位置时会很有用。 比如我们可以使用地磁传感器跟加速传感器合作来决定设备相对于地磁北极的位置。 我们还可以使用方向传感器(或者基于传感器的方向方法)来确定设备相对于APP框架为参考的位置。 位置传感器通常不用于监测设备移动或者运动, 比如摇动, 倾斜等。

  地磁传感器和方向传感器通过SensorEvent的多维数组返回数据。 栗如, 方向传感器在每次返回传感器事件的时候提供了地磁力在三维空间的强度值。 同样方向传感器则提供了方位角(Yaw偏航角), 俯仰角(pitch)和翻滚角(roll)。 下表提供了Android平台各位置传感器的信息:

   SensorEvent.values[0]

  沿x轴旋转矢量分量(x*sin(θ/2 ))。

  无单位

  SensorEvent.values[1]

  沿y轴旋转矢量分量(y*sin(θ/2 ))。

  SensorEvent.values[2]

  沿z轴旋转矢量分量(z*sin(θ/2 ))。

  TYPE_GEOMAGNETIC_ROTATION_VECTOR

  SensorEvent.values[0]

  沿x轴旋转矢量分量(x*sin(θ/2 ))。

  无单位

  SensorEvent.values[1]

  沿y轴旋转矢量分量(y*sin(θ/2 ))。

  SensorEvent.values[2]

  沿z轴旋转矢量分量(z*sin(θ/2 ))。

  TYPE_MAGNETIC_FIELD

  SensorEvent.values[0]

  沿x轴的地磁强度

  μT

  SensorEvent.values[1]

  沿y轴的地磁强度

  SensorEvent.values[2]

  沿z轴的地磁强度

  TYPE_MAGNETIC_FIELD_UNCALIBRATED

  SensorEvent.values[0]

  沿x轴的地磁强度(无硬铁校准hard iron calibration)

  μT

  SensorEvent.values[1]

  沿y轴的地磁强度(无硬铁校准hard iron calibration)

  SensorEvent.values[2]

  沿z轴的地磁强度(无硬铁校准hard iron calibration)

  SensorEvent.values[3]

  沿x轴铁偏差校准(Iron bias estimation)

  SensorEvent.values[4]

  沿y轴铁偏差校准(Iron bias estimation)

  SensorEvent.values[5]

  沿z轴铁偏差校准(Iron bias estimation)

  TYPE_ORIENTATION①

  SensorEvent.values[0]

  方位角(绕z轴的角度)

  度

  SensorEvent.values[1]

  俯仰角(pitch) (绕x轴的角度)

  SensorEvent.values[2]

  翻滚角(roll) (绕y轴的角度)

  TYPE_PROXIMITY

  SensorEvent.values[0]

  与对象的距离②

  cm

  ① 该传感器在Android2.2版本中不再推荐使用。 Sensor framework提供了备用的方法, 下文会有介绍。

  ② 一些距离传感器只提供二进制数据代表远和近。

  使用游戏旋转矢量传感器:

  游戏旋转矢量传感器跟旋转矢量传感器是相同的, 除了它不使用地磁场。 因此Y轴不指向北边而是一些别的参考系。

  因为游戏旋转矢量传感器不使用地磁场, 相关的方向因不受磁场影响而更加准确。 如果不在意北边在哪的话可以在游戏中使用该传感器, 这时候普通的旋转矢量就不合适了, 因为它依赖于磁场。 下面的代码演示了如何获取一个该传感器的实例:

  private SensorManager mSensorManager;

  private Sensor mSensor;

  。..

  mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);

  mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_GAME_ROTATION_VECTOR);

  使用地磁旋转矢量传感器:

  地磁旋转矢量传感器跟旋转矢量传感器一样, 但是它使用地磁代替陀螺仪。 所以它的精确度会比普通旋转矢量传感器要低, 但是功耗也降低了。 应该只有当需要在后台获取旋转信息而不想要消耗太多电量的时候才使用它。 该传感器当与批处理(batching)一起是最有用的。

  下面的代码演示了如何获取实例:

  private SensorManager mSensorManager;

  private Sensor mSensor;

  。..

  mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);

  mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_GEOMAGNETIC_ROTATION_VECTOR);

  方向传感器:

  方向传感器让我们可以监测设备相对于地球参考系的位置(特指地磁北极)。 下面代码演示了如何获取该传感器实例:

  private SensorManager mSensorManager;

  private Sensor mSensor;

  。..

  mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);

  mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);

  方向传感器通过使用设备的地磁场传感器和设备的加速度计合作获得它的数据。 通过使用这俩硬件传感器, 方向传感器可以提供这三个维度的数据:

  l 方位角(绕z轴的角度)。 这个角度在地磁北极和设备的y轴之间。 比如如果设备的y轴对准地磁北极, 那么该值是0, 如果设备的y轴对准南极, 则该值为180. 同样的, 当y轴指向东边, 该值是90, 指向西边则为270.

  l 俯仰角(pitch) (绕x轴的角度)。 处于z轴正方向和y轴正方向之间的时候该值是正的, z轴正方向和y轴负方向的时候, 该值是负的。 范围是180度~-180度。

  l 翻滚角(roll) (绕y轴的角度)。 当处于z轴正方向和x轴正方向时该值为正。 Z轴正方向和x轴负方向的时候, 该值为负。 取值范围是90~-90度。

  这个定义跟航空学中的方位角, 俯仰角和翻滚角是不一样的, 航空学中x轴表示沿飞机的长边(飞机尾部到头部)。 此外由于历史原因, 翻滚角在顺时针方向为正(数学上讲, 它应该在逆时针方向为正)。

  方向传感器通过处理加速度计和地磁场传感器的数据来得到它自己的数据。 因为涉及的处理任务比较繁重, 所以精度和准确度被减少(只有当翻滚角分量为0的时候它的数据才可靠)。 因此, 方向传感器在Android2.2中就不推荐使用了。 官方推荐使用getRotationMatrix()方法和getOrientation()方法结合来计算方向值, 代替方向传感器。 我们还可以使用remapCoordinateSystem()方法来映射方向值到APP参考框架。 下面的代码演示了如何从方向传感器直接获得方向数据, 只有几乎没有翻滚角的时候才推荐这样使用:

  public class SensorActivity extends Activity implements SensorEventListener {

  private SensorManager mSensorManager;

  private Sensor mOrientation;

  @Override

  public void onCreate(Bundle savedInstanceState) {

  super.onCreate(savedInstanceState);

  setContentView(R.layout.main);

  mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);

  mOrientation = mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);

  }

  @Override

  public void onAccuracyChanged(Sensor sensor, int accuracy) {

  // Do something here if sensor accuracy changes.

  // You must implement this callback in your code.

  }

  @Override

  protected void onResume() {

  super.onResume();

  mSensorManager.registerListener(this, mOrientation, SensorManager.SENSOR_DELAY_NORMAL);

  }

  @Override

  protected void onPause() {

  super.onPause();

  mSensorManager.unregisterListener(this);

  }

  @Override

  public void onSensorChanged(SensorEvent event) {

  float azimuth_angle = event.values[0];

  float pitch_angle = event.values[1];

  float roll_angle = event.values[2];

  // Do something with these orientation angles.

  }

  }

  我们并不会经常用到处理方向传感器的原始数据。

  使用地磁场传感器:

  地磁场传感器让我们可以监测地球磁场的变化。 下面的代码展示如何获取它的实例:

  private SensorManager mSensorManager;

  private Sensor mSensor;

  。..

  mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);

  mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);

  该传感器提供了三维磁场的原始数据。 通常我们不需要直接使用该传感器, 而是使用旋转矢量传感器来确定旋转运动的原始数据, 或者我们还可以使用加速度计和地磁场传感器跟getRotationMatrix()方法合作获取旋转矩阵和倾角矩阵。 然后可以使用这些矩阵同getOrientation()和getInclination()方法来获得方位角和地磁倾角数据。

  使用未校正的磁力计:

  未校正的磁力计跟地磁场传感器相似, 但是它没有”硬铁校正”(hard iron calibration)。 工厂校正和温度校正依然应用于磁场。 未校正的磁力计在处理坏硬铁估计(bad hard iron estimations)的时候有用。 通常geomagneticsensor_event.value[0]将会接近uncalibrated_magnetometer_event.values[0]- uncalibrated_magnetometer_event.values[3]。 也就是, calibrated_x ~= uncalibrated_x - bias_estimate_x.

  注意: 未校正传感器提供更多的原始结果并可能包括一些偏差, 但是它们的测量值包含更少的校正导致的跳变。 一些APP可能会更想这些未校正的原始数据, 因为他们更加平滑和可靠。 比如当APP想要实现自己的传感器合成, 则他们可能更喜欢没有矫正过的数据。

  除了磁场, 未校正磁力计还会提供硬铁校正在每个轴的估计值。 下面代码演示了如何获取该传感器实例:

  private SensorManager mSensorManager;

  private Sensor mSensor;

  。..

  mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);

  mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD_UNCALIBRATED);

  使用距离传感器(Proximity Sensor):

  距离传感器让我们可以确定一个目标与设备的距离。 下面代码演示了如何获取它的实例:

  private SensorManager mSensorManager;

  private Sensor mSensor;

  。..

  mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);

  mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);

  距离传感器通常用来确定手持设备跟人脸的距离(比如用户接到电话或者在打电话的时候)。 大多数距离传感器返回绝对距离, 但是它们中的个别分子会返回”远/近”这样的信息。 下面的代码展示给我们如何使用这玩意儿:

  public class SensorActivity extends Activity implements SensorEventListener {

  private SensorManager mSensorManager;

  private Sensor mProximity;

  @Override

  public final void onCreate(Bundle savedInstanceState) {

  super.onCreate(savedInstanceState);

  setContentView(R.layout.main);

  // Get an instance of the sensor service, and use that to get an instance of

  // a particular sensor.

  mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);

  mProximity = mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);

  }

  @Override

  public final void onAccuracyChanged(Sensor sensor, int accuracy) {

  // Do something here if sensor accuracy changes.

  }

  @Override

  public final void onSensorChanged(SensorEvent event) {

  float distance = event.values[0];

  // Do something with this sensor data.

  }

  @Override

  protected void onResume() {

  // Register a listener for the sensor.

  super.onResume();

  mSensorManager.registerListener(this, mProximity, SensorManager.SENSOR_DELAY_NORMAL);

  }

  @Override

  protected void onPause() {

  // Be sure to unregister the sensor when the activity pauses.

  super.onPause();

  mSensorManager.unregisterListener(this);

  }

  }


打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分