Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Android

วิธีตรวจสอบว่ามือถือ Android รองรับเซ็นเซอร์ Accelerometer (เร่งความเร็ว) หรือไม่

ภาพรวม

ตัวอย่างนี้สาธิตวิธีตรวจสอบการรองรับเซ็นเซอร์ Accelerometer ซึ่งเป็นเซ็นเซอร์พื้นฐานที่สุด วัดแรงเร่ง (Acceleration) รวมถึงแรงโน้มถ่วง บน 3 แกน (X, Y, Z) พบได้ในสมาร์ทโฟนเกือบทุกเครื่อง

ขั้นตอนการสร้างโปรเจกต์

ขั้นตอนที่ 1: สร้างโปรเจกต์ใหม่

Android Studio → File → New Project → Empty Activity

ขั้นตอนที่ 2: Layout (res/layout/activity_main.xml)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"
    xmlns:app="https://schemas.android.com/apk/res-auto"
    xmlns:tools="https://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:gravity="center"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/actionEvent"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_marginTop="30dp"
        android:textSize="40sp"
        android:gravity="center" />

</LinearLayout>

ขั้นตอนที่ 3: โค้ดหลัก (src/MainActivity.java)

package com.example.myapplication;

import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorManager;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.RequiresApi;
import android.support.v7.app.AppCompatActivity;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    TextView textView;
    SensorManager sensorManager;

    @RequiresApi(api = Build.VERSION_CODES.N)
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        TextView actionEvent = findViewById(R.id.actionEvent);
        sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);

        // ตรวจสอบเซ็นเซอร์ Accelerometer
        Sensor accelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
        
        if (accelerometer != null) {
            actionEvent.setText("รองรับ Accelerometer (เร่งความเร็ว)");
            
            String info = String.format(
                "Name: %s\nVendor: %s\nVersion: %d\n" +
                "Max Range: %.2f m/s²\nResolution: %.2f m/s²\nPower: %.2f mA\nMin Delay: %d µs",
                accelerometer.getName(),
                accelerometer.getVendor(),
                accelerometer.getVersion(),
                accelerometer.getMaximumRange(),
                accelerometer.getResolution(),
                accelerometer.getPower(),
                accelerometer.getMinDelay()
            );
            actionEvent.append("\n\n" + info);
        } else {
            actionEvent.setText("ไม่รองรับ Accelerometer (ไม่น่าเป็นไปได้บนสมาร์ทโฟนสมัยใหม่)");
        }
    }
}

ข้อมูลเซ็นเซอร์ TYPE_ACCELEROMETER

คุณสมบัติรายละเอียด
ConstantSensor.TYPE_ACCELEROMETER
หน่วยm/s²
แกน3 แกน (X, Y, Z)
วัดค่าแรงเร่งเชิงเส้น + แรงโน้มถ่วง (Linear Accel + Gravity)
ค่าปกติ (วางแบน)X≈0, Y≈0, Z≈9.81
อุปกรณ์ที่มีทุกสมาร์ทโฟน (Mandatory for Android)

การใช้งานจริง

  • Screen Rotation: Auto-rotate Portrait/Landscape
  • Step Counter: นับก้าวเดิน/วิ่ง
  • Shake Detection: Shake to undo, Shake to refresh
  • Gesture Control: Flip to mute, Lift to wake
  • Gaming: Tilt controls (Racing, Maze)
  • Fall Detection: ตรวจจับการล้ม (Elderly care)
  • Vibration Analysis: วัดการสั่นสะเทือน

ค่าที่ได้จาก Accelerometer

// event.values[0] = X-axis (Right/Left)
// event.values[1] = Y-axis (Up/Down)  
// event.values[2] = Z-axis (Forward/Back)

// วางแบนหน้าจอขึ้น: X=0, Y=0, Z≈9.81
// ยืนตั้งตรง: X=0, Y≈9.81, Z=0
// วางกลับ: X=0, Y=0, Z≈-9.81

แยก Gravity และ Linear Acceleration

// ใช้ Low-pass filter แยก Gravity
float alpha = 0.8f;
gravity[0] = alpha * gravity[0] + (1 - alpha) * event.values[0];
gravity[1] = alpha * gravity[1] + (1 - alpha) * event.values[1];
gravity[2] = alpha * gravity[2] + (1 - alpha) * event.values[2];

linearAccel[0] = event.values[0] - gravity[0];
linearAccel[1] = event.values[1] - gravity[1];
linearAccel[2] = event.values[2] - gravity[2];

แนะนำ: ใช้ Virtual Sensors แทน

  • Sensor.TYPE_GRAVITY - แรงโน้มถ่วง (Filtered)
  • Sensor.TYPE_LINEAR_ACCELERATION - เร่งความเร็วเชิงเส้น (No gravity)
  • Sensor.TYPE_ROTATION_VECTOR - Orientation (Fused)

ข้อควรระวัง

  • ค่า Raw มี Noise สูง ควร Filter ก่อนใช้
  • Sampling rate สูง (minDelay ต่ำ) ใช้แบตเตอรี่มาก
  • ใช้ SENSOR_DELAY_UI สำหรับ UI, SENSOR_DELAY_GAME สำหรับเกม, SENSOR_DELAY_FASTEST สำหรับวิเคราะห์
  • ใน Manifest: <uses-feature android:name="android.hardware.sensor.accelerometer" android:required="true" />