중력 센서(TYPE_GRAVITY)는 중력 가속도에 대한 값을 반환하는 센서 입니다.

중력 센서를 가속도 센서 비교 (TYPE_ACCELEROMETER / TYPE_LINEAR_ACCELERATION)를 할 때

다루지 않은 이유는 가속센서는 조금만 움직여도 가속도 값이 더해져서 표시가 됩니다.


중력 센서는 그냥 중력만 표시할 뿐 그 이외의 어떠한 값이 포함 되지 않습니다.

, 아무리 핸드폰을 흔들고 달려보아도 총 중력 값이 변하지 않고 항상 9.8의 값을 유지 합니다.

이 말은 z축의 값이 9.8이 되도록 한다면 핸드폰은 완전한 평형을 이루고 있다는 뜻이고

중력 센서를 이용하면 간단하게라도 수평계를 만들 수 있습니다.

 


1 중력 센서



1.1 중력 센서 이벤트 값


TYPE_GRAVITY 센서가 작동 되면 리턴되는 값으로 다음과 같은 value를 넘겨 주며 단위는 가속도(m/s2) 입니다.


Sensor 

 Sensor event data

 표현 값

 측정 단위

 TYPE_GRAVITY

 SensorEvent.values[0]

 x축 중력 강도

 m/s²

 TYPE_GRAVITY

 SensorEvent.values[1]

 y축 중력 강도

 m/s²

 TYPE_GRAVITY

 SensorEvent.values[2]

 z축 중력 강도

 m/s²


 

2 중력 센서 프로젝트

 


2.1 신규 프로젝트 생성


안드로이드 스튜디오에서 적당한 이름으로 프로젝트를 하나 생성합니다.

 

2.2 Layout 작성


activity_main.xml

 

중력 센서가 보내오는 x, y, z축의 m/s2 값들을 출력할 수 있는 TextView를 작성합니다.

 


<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/tvTitle"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Gravity Sensor"
        android:layout_marginTop="50dp"
        android:textSize="30dp"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
    <TextView
        android:id="@+id/tvXaxis"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintTop_toBottomOf="@+id/tvTitle"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        android:textSize="25dp"
        android:text="X axis : 0"
        />
    <TextView
        android:id="@+id/tvYaxis"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintTop_toBottomOf="@+id/tvXaxis"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        android:textSize="25dp"
        android:text="Y axis : 0"
        />
    <TextView
        android:id="@+id/tvZaxis"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintTop_toBottomOf="@+id/tvYaxis"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        android:textSize="25dp"
        android:text="Z axis : 0"
        />
    <TextView
        android:id="@+id/tvGravity"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintTop_toBottomOf="@+id/tvZaxis"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        android:textSize="25dp"
        android:text="Total Gravity : 0"
        />
</android.support.constraint.ConstraintLayout>


2.3 Java Source


MainActivity.java

소스를 보면 알겠지만 기존 센서와 동일한 프로세스로 작동이 됩니다.

핸드폰이 움직일 때 마다 각 축으로부터 받는 중력을 합한 중력 총량을 구합니다.



package com.example.desk.sensorgravity;

import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity implements SensorEventListener {

    private SensorManager sensorManager;
    private Sensor gravitySensor;
    private double total;
    TextView tvXaxis, tvYaxis, tvZaxis, tvGravity;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        tvXaxis = (TextView)findViewById(R.id.tvXaxis);
        tvYaxis = (TextView)findViewById(R.id.tvYaxis);
        tvZaxis = (TextView)findViewById(R.id.tvZaxis);



        tvGravity = (TextView)findViewById(R.id.tvGravity);

        sensorManager = (SensorManager)getSystemService(Context.SENSOR_SERVICE);
        gravitySensor = sensorManager.getDefaultSensor(Sensor.TYPE_GRAVITY);
    }

    @Override
    protected void onResume() {
        super.onResume();
        sensorManager.registerListener(this, gravitySensor, SensorManager.SENSOR_DELAY_NORMAL);
    }

    @Override
    protected void onPause() {
        super.onPause();
        sensorManager.unregisterListener(this);
    }

    @Override
    public void onSensorChanged(SensorEvent event) {
        if(event.sensor == gravitySensor) {

            total = Math.sqrt(Math.pow(event.values[0],2) + Math.pow(event.values[1], 2) + Math.pow(event.values[2] , 2));

            tvXaxis.setText("X axis : " + String.format("%.2f", event.values[0]));
            tvYaxis.setText("Y axis : " + String.format("%.2f", event.values[1]));
            tvZaxis.setText("Z axis : " + String.format("%.2f", event.values[2]));
            tvGravity.setText("Total Gravity : "  + String.format("%.2f", total) + " m/s\u00B2");
        }
    }

    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {

    }
}


3. 결과

 

3.1 결과 화면

 

핸드폰을 평평한 곳에 놓았을 때나 흔들고 이동을 하여도 전체 중력 값은 동일한 것을

확인 할 수 있습니다.


android gravity sensor



3.2 Source Code


 

SensorGravity.7z



 

3.3 APK File


SensorGravity.apk


- copy coding -


+ Recent posts