您好,歡迎來電子發(fā)燒友網(wǎng)! ,新用戶?[免費(fèi)注冊]

您的位置:電子發(fā)燒友網(wǎng)>電子元器件>傳感器>

關(guān)于Android傳感器之完全解析

2018年09月24日 10:44 作者:工程師譚軍 用戶評論(0
  傳感器
?
  傳感器(英文名稱:transducer/sensor)是一種檢測裝置,能感受到被測量的信息,并能將感受到的信息,按一定規(guī)律變換成為電信號或其他所需形式的信息輸出,以滿足信息的傳輸、處理、存儲、顯示、記錄和控制等要求。
?
  傳感器的特點(diǎn)包括:微型化、數(shù)字化、智能化、多功能化、系統(tǒng)化、網(wǎng)絡(luò)化。它是實(shí)現(xiàn)自動檢測和自動控制的首要環(huán)節(jié)。傳感器的存在和發(fā)展,讓物體有了觸覺、味覺和嗅覺等感官,讓物體慢慢變得活了起來。通常根據(jù)其基本感知功能分為熱敏元件、光敏元件、氣敏元件、力敏元件、磁敏元件、濕敏元件、聲敏元件、放射線敏感元件、色敏元件和味敏元件等十大類。
?
  主要作用
?
  人們?yōu)榱藦耐饨绔@取信息,必須借助于感覺器官。
?
  而單靠人們自身的感覺器官,在研究自然現(xiàn)象和規(guī)律以及生產(chǎn)活動中它們的功能就遠(yuǎn)遠(yuǎn)不夠了。為適應(yīng)這種情況,就需要傳感器。因此可以說,傳感器是人類五官的延長,又稱之為電五官。
?
  新技術(shù)革命的到來,世界開始進(jìn)入信息時(shí)代。在利用信息的過程中,首先要解決的就是要獲取準(zhǔn)確可靠的信息,而傳感器是獲取自然和生產(chǎn)領(lǐng)域中信息的主要途徑與手段。
?
  在現(xiàn)代工業(yè)生產(chǎn)尤其是自動化生產(chǎn)過程中,要用各種傳感器來監(jiān)視和控制生產(chǎn)過程中的各個(gè)參數(shù),使設(shè)備工作在正常狀態(tài)或最佳狀態(tài),并使產(chǎn)品達(dá)到最好的質(zhì)量。因此可以說,沒有眾多的優(yōu)良的傳感器,現(xiàn)代化生產(chǎn)也就失去了基礎(chǔ)。
?
  在基礎(chǔ)學(xué)科研究中,傳感器更具有突出的地位?,F(xiàn)代科學(xué)技術(shù)的發(fā)展,進(jìn)入了許多新領(lǐng)域:例如在宏觀上要觀察上千光年的茫茫宇宙,微觀上要觀察小到fm的粒子世界,縱向上要觀察長達(dá)數(shù)十萬年的天體演化,短到 s的瞬間反應(yīng)。此外,還出現(xiàn)了對深化物質(zhì)認(rèn)識、開拓新能源、新材料等具有重要作用的各種極端技術(shù)研究,如超高溫、超低溫、超高壓、超高真空、超強(qiáng)磁場、超弱磁場等等。顯然,要獲取大量人類感官無法直接獲取的信息,沒有相適應(yīng)的傳感器是不可能的。許多基礎(chǔ)科學(xué)研究的障礙,首先就在于對象信息的獲取存在困難,而一些新機(jī)理和高靈敏度的檢測傳感器的出現(xiàn),往往會導(dǎo)致該領(lǐng)域內(nèi)的突破。一些傳感器的發(fā)展,往往是一些邊緣學(xué)科開發(fā)的先驅(qū)。
?
  傳感器早已滲透到諸如工業(yè)生產(chǎn)、宇宙開發(fā)、海洋探測、環(huán)境保護(hù)、資源調(diào)查、醫(yī)學(xué)診斷、生物工程、甚至文物保護(hù)等等極其之泛的領(lǐng)域。可以毫不夸張地說,從茫茫的太空,到浩瀚的海洋,以至各種復(fù)雜的工程系統(tǒng),幾乎每一個(gè)現(xiàn)代化項(xiàng)目,都離不開各種各樣的傳感器。
?
  由此可見,傳感器技術(shù)在發(fā)展經(jīng)濟(jì)、推動社會進(jìn)步方面的重要作用,是十分明顯的。世界各國都十分重視這一領(lǐng)域的發(fā)展。相信不久的將來,傳感器技術(shù)將會出現(xiàn)一個(gè)飛躍,達(dá)到與其重要地位相稱的新水平。
?
  主要特點(diǎn)
?
  傳感器的特點(diǎn)包括:微型化、數(shù)字化、智能化、多功能化、系統(tǒng)化、網(wǎng)絡(luò)化,它不僅促進(jìn)了傳統(tǒng)產(chǎn)業(yè)的改造和更新?lián)Q代,而且還可能建立新型工業(yè),從而成為21世紀(jì)新的經(jīng)濟(jì)增長點(diǎn)。微型化是建立在微電子機(jī)械系統(tǒng)(MEMS)技術(shù)基礎(chǔ)上的,已成功應(yīng)用在硅器件上做成硅壓力傳感器。
?
  傳感器的組成
?
  傳感器一般由敏感元件、轉(zhuǎn)換元件、變換電路和輔助電源四部分組成。
?
  敏感元件直接感受被測量,并輸出與被測量有確定關(guān)系的物理量信號;轉(zhuǎn)換元件將敏感元件輸出的物理量信號轉(zhuǎn)換為電信號;變換電路負(fù)責(zé)對轉(zhuǎn)換元件輸出的電信號進(jìn)行放大調(diào)制;轉(zhuǎn)換元件和變換電路一般還需要輔助電源供電
?
  主要功能
?
  常將傳感器的功能與人類5大感覺器官相比擬:
?
  光敏傳感器——視覺
?
  聲敏傳感器——聽覺
?
  氣敏傳感器——嗅覺
?
  化學(xué)傳感器——味覺
?
  壓敏、溫敏、
?
  流體傳感器——觸覺
?
  敏感元件的分類:
?
  物理類,基于力、熱、光、電、磁和聲等物理效應(yīng)。
?
  化學(xué)類,基于化學(xué)反應(yīng)的原理。
?
  生物類,基于酶、抗體、和激素等分子識別功能。
?
  通常據(jù)其基本感知功能可分為熱敏元件、光敏元件、氣敏元件、力敏元件、磁敏元件、濕敏元件、聲敏元件、放射線敏感元件、色敏元件和味敏元件等十大類(還有人曾將敏感元件分46類)。

  常用傳感器介紹與用法

  Android平臺支持三個(gè)大類的傳感器

  Motion sensors(運(yùn)動傳感器)

  這些傳感器測量加速力,并沿三個(gè)軸的旋轉(zhuǎn)力。此類別包括加速度計(jì),重力感應(yīng)器, 陀螺儀和旋轉(zhuǎn)矢量傳感器。

  Environmental sensors (環(huán)境傳感器)

  這些傳感器測量各種環(huán)境參數(shù),例如環(huán)境空氣溫度和壓力,照明和濕度。此類別包括氣壓計(jì),光度計(jì),和溫度計(jì)。

  Position sensors (位置傳感器)

  這些傳感器測量設(shè)備的物理位置。這個(gè)類別包括方向傳感器和磁力計(jì)。

  傳感器實(shí)現(xiàn)流程

  第一步:得到SensorManager

  SensorManager mSensorManager = (SensorManager) mContext

  .getSystemService(Context.SENSOR_SERVICE);12

  第二步:注冊傳感器

  Sensor sensor = mSensorManager

  .getDefaultSensor(Sensor.TYPE_ACCELEROMETER);

  if (null != sensor)

  mSensorManager.registerListener(this, sensor,

  SensorManager.SENSOR_DELAY_NORMAL);12345

  registerListener這個(gè)方法有三個(gè)參數(shù)。

  第一個(gè)參數(shù)是傳感器數(shù)據(jù)變化的監(jiān)聽器

  我們需要去實(shí)現(xiàn)SensorEventListener接口,他里面有兩個(gè)回調(diào)方法,

  @Override

  public void onSensorChanged(SensorEvent event) {

  //當(dāng)傳感器的數(shù)值發(fā)生變化時(shí)調(diào)用

  }

  @Override

  public void onAccuracyChanged(Sensor sensor, int accuracy) {

  //傳感器的精度發(fā)生變化時(shí)調(diào)用

  }123456789

  onSensorChanged方法只有一個(gè)SensorEvent類型的參數(shù)event,其中SensorEvent類有一個(gè)values變量非常重要,該變量的類型是float[]。但該變量最多只有3個(gè)元素,而且根據(jù)傳感器的不同,values變量中元素所代表的含義也不同。

  關(guān)于values值的詳細(xì)含義請看參考文章?。?!

  第二個(gè)參數(shù)是我們需要監(jiān)聽的傳感器

  Sensor sensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);1

  Sensor.TYPE_ACCELEROMETER則是Android設(shè)定傳感器類型,這里是指加速度傳感器,

  第三個(gè)參數(shù)是傳感器數(shù)據(jù)更新數(shù)據(jù)的速度

  有以下四個(gè)值可選,他們的速度是遞增的

  SENSOR_DELAY_UI

  SENSOR_DELAY_NORMAL

  SENSOR_DELAY_GAME

  SENSOR_DELAY_FASTEST

  傳感器的注銷

  //注銷所有傳感器對象

  public voidunregisterListener(SensorEventListener listener)

  //注銷指定的傳感器對象

  public voidunregisterListener(SensorEventListener listener, Sensor sensor)1234

  sensor的獲取依舊是通過SensorManager.getDefaultSensor()方法。

  獲得手機(jī)支持的所有傳感器

  Listsensors = sensorManager.getSensorList(Sensor.TYPE_ALL);1

  Android傳感器類型表

  加速度傳感器:TYPE_ACCELEROMETER

  以m/s2測量它設(shè)備所有三個(gè)物理軸線方向(x,y,和z)加速度。

  周圍溫度傳感器:TYPE_AMBIENT_TEMPERATURE

  檢測周圍空氣溫度。

  重力傳感器:TYPE_GRAVITY

  測量重力

  陀螺儀傳感器:TYPE_GYROSCOPE

  以rad/s測量設(shè)備三個(gè)物理軸線方向(x,y,和z)。旋轉(zhuǎn)速度。

  光照傳感器:TYPE_LIGHT

  以lx測量周圍的光線級別。

  線性加速度傳感器:TYPE_LINEAR_ACCELERATION

  檢測沿著一個(gè)軸向的加速度。

  磁力傳感器:TYPE_MAGNETIC_FIELD

  測量周圍的三個(gè)物理軸線方向的磁場。

  方向傳感器: TYPE_ORIENTATION

  測量設(shè)備所有三個(gè)物理軸線方向(x,y和x)的旋轉(zhuǎn)角度。

  壓力傳感器:TYPE_PRESSURE

  測量周圍空氣氣壓

  接近傳感器:TYPE_PROXIMITY

  檢測物體與手機(jī)的距離

  相對濕度傳感器:TYPE_RELATIVE_HUMIDITY

  檢測周圍空氣相對濕度

  旋轉(zhuǎn)矢量傳感器:TYPE_ROTATION_VECTOR

  用于檢測運(yùn)動和檢測旋轉(zhuǎn)。

  溫度傳感器: TYPE_TEMPERATURE

  檢測設(shè)備的溫度

  傳感器使用實(shí)踐

  這里以方向傳感器為例

  方向傳感器的獲取方式

  Sensor sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);1

  上面這個(gè),對,已經(jīng)被google棄用了,了解就好。

  Android中的坐標(biāo)系

  自己畫的有點(diǎn)丑,將就著看吧,Z軸默認(rèn)垂直于地面,所謂獲取的三個(gè)Values數(shù)組即對應(yīng)手機(jī)與Z,Y,X形成的夾角,后面會說明,

  前面說了,TYPE_ORIENTATION已被棄用,那么最新的方向傳感器是如何做的呢?

  事實(shí)上,Android 獲取手機(jī)旋轉(zhuǎn)的方向和角度是通過加速度傳感器和地磁傳感器共同計(jì)算得出的

  OK,我們這時(shí)候是需要同時(shí)使用兩個(gè)傳感器的,看代碼

  Sensor accelerometerSensor = sensorManager.getDefaultSensor(Sensor.

  TYPE_ACCELEROMETER);

  Sensor magneticSensor = sensorManager.getDefaultSensor(Sensor.

  TYPE_MAGNETIC_FIELD);

  sensorManager.registerListener(listener, accelerometerSensor,

  SensorManager.SENSOR_DELAY_GAME);

  sensorManager.registerListener(listener, magneticSensor,

  SensorManager.SENSOR_DELAY_GAME);12345678

  同時(shí)使用了加速度傳感器和地磁傳感器

  獲取旋轉(zhuǎn)矩陣數(shù)組R

  SensorManager.getRotationMatrix(R, null, accelerometerValues, magneticValues);1

  獲取手機(jī)旋轉(zhuǎn)數(shù)據(jù)

  SensorManager.getOrientation(R, values);1

  values 是一個(gè)長度為 3 的 float 數(shù)組,手機(jī)在各個(gè)方向上的旋轉(zhuǎn)數(shù)據(jù)都會被存放到這個(gè)數(shù)組當(dāng)中。

  對應(yīng)關(guān)系:

  values[0]-》Z軸、values[1]-》X軸、values[2]-》Y軸

  values[0]的取值范圍是-180到180 度,其中±180 度表示正南方向,0 度表示正北方向,-90 度表示正西方向,90 度表示正東方向,如圖

  所謂,實(shí)踐是檢驗(yàn)真理的唯一標(biāo)準(zhǔn),這是我檢測后自行畫的,大家看一下就明白該怎么根據(jù)獲取到的角度來做對應(yīng)的處理了

  一個(gè)完整的方向傳感器封裝類

  public class DirectionSensorUtils implements SensorEventListener {

  private SensorManager sensorManager;

  float[] accelerometerValues = new float[3];

  float[] magneticValues = new float[3];

  float lastRotateDegree;

  private ImageView compassImg;//指南針背景圖

  public DirectionSensorUtils(Context context , ImageView compassImg) {

  sensorManager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE);

  this.compassImg = compassImg;

  }

  //注冊傳感器

  public void registerSensor(){

  Sensor accelerometerSensor = sensorManager.getDefaultSensor(Sensor.

  TYPE_ACCELEROMETER);

  Sensor magneticSensor = sensorManager.getDefaultSensor(Sensor.

  TYPE_MAGNETIC_FIELD);

  sensorManager.registerListener(this, accelerometerSensor,

  SensorManager.SENSOR_DELAY_GAME);

  sensorManager.registerListener(this, magneticSensor,

  SensorManager.SENSOR_DELAY_GAME);

  }

  //解除傳感器注冊

  public void unregisterSensor(){

  if (sensorManager != null) {

  sensorManager.unregisterListener(this);

  }

  }

  @Override

  public void onSensorChanged(SensorEvent event) {

  // 判斷當(dāng)前是加速度傳感器還是地磁傳感器

  if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {

  // 通過clone()獲取不同的values引用

  accelerometerValues = event.values.clone();

  } else if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) {

  magneticValues = event.values.clone();

  }

  //獲取地磁與加速度傳感器組合的旋轉(zhuǎn)矩陣

  float[] R = new float[9];

  float[] values = new float[3];

  SensorManager.getRotationMatrix(R, null, accelerometerValues,

  magneticValues);

  SensorManager.getOrientation(R, values);

  //values[0]-》Z軸、values[1]-》X軸、values[2]-》Y軸

  //使用前請進(jìn)行轉(zhuǎn)換,因?yàn)楂@取到的值是弧度,示例如下

  // Math.toDegrees(values[0]);

  // Math.toDegrees(values[1]);

  // Math.toDegrees(values[2]);

  handleEvent(values);

  }

  public void handleEvent(float[] values){

  // 這里實(shí)現(xiàn)了一個(gè)指南針

  float rotateDegree = -(float) Math.toDegrees(values[0]);

  if (Math.abs(rotateDegree - lastRotateDegree) 》 1) {

  RotateAnimation animation = new RotateAnimation

 ?。╨astRotateDegree, rotateDegree, Animation.RELATIVE_TO_SELF, 0.5f, Animation.

  RELATIVE_TO_SELF, 0.5f);

  animation.setFillAfter(true);

  compassImg.startAnimation(animation);

  lastRotateDegree = rotateDegree;

  }

  }

  @Override

  public void onAccuracyChanged(Sensor sensor, int accuracy) {

  }

  }


非常好我支持^.^

(0) 0%

不好我反對

(0) 0%

( 發(fā)表人:金巧 )

      發(fā)表評論

      用戶評論
      評價(jià):好評中評差評

      發(fā)表評論,獲取積分! 請遵守相關(guān)規(guī)定!

      ?