스마트폰 또는 휴대용 장치에는 Wi-Fi 및 인터넷 기능이 있어야 하며, 어플리케이션 소프트웨어와 같은 다양한 기능을 실행할 수 있어야 하며, 내장형 센서가 있어야 합니다. 고급형 스마트폰은 근접 센서, 주변광 센서, 3
축 가속도계, 자력계 등 다양한 센서를 통합할 수 있다. 안드로이드 2.3
자이로 스코프, 회전 벡터, 선형 가속, 중력 및 압력 센서 등 다양한 새로운 센서를 지원하는 API 가 추가되었습니다. 응용 소프트웨어는 이러한 새로운 센서를 사용 하 여 이들을 결합 하 여 고정밀 고급 모션 감지 기능을 구현할 수 있습니다.
3 축 가속도계 또는 낮은 g 값 센서는 안드로이드 API
가 지원하는 센서 중 하나이며 애플리케이션에 표준 인터페이스 데이터를 제공하는 특정 좌표계를 갖추고 있습니다. 좌표 공간의 정의는 그림 1 과 같이 휴대폰 화면의 기본 방향과 관련이 있습니다.
그림
1. 3 축 가속도계의 안드로이드 좌표계
안드로이드 좌표계에서 좌표 원점은 화면의 왼쪽 아래 구석에 있고 x 축은 수평으로 오른쪽, y 를 가리킵니다 이 시스템에서 화면 뒤의 좌표는 음의 z 축 값을 가집니다. 안드로이드 가속도계 데이터는
sensor.type _ accelerometer
모든 숫자 값은 SI
표준 단위로 정의됩니다
values [0]: x 축의 가속도 값에서 GX
values [1]: y
축의 가속도 값에서 gy 를 뺀 값입니다 장치가 테이블 위에 평평하게 놓여 있을 때 가속도 값은 +9.81 입니다. 이는 장치의 가속도 값 (0 m/s2) 에서 중력 가속도 값 (-9.81 m/s2) 을 뺀 값입니다.
디바이스가 테이블 위에 평평하게 놓여 있고 가속도 A m/s2 로 하늘 방향으로 밀면 가속도 값은 A+9.81 과 같습니다. 이는 디바이스 가속도 값 (+A
m/s2) 에서 중력을 뺀 값입니다
표 1
에는 디바이스의 각 위치에 해당하는 센서의 가속도 값 판독값이 나와 있습니다. 다음 표를 사용하여 가속도계의 방향이 시스템 좌표와 일치하는지 확인할 수 있습니다.
가속도 센서를 통해 3 축 가속도 값을 읽을 때 센서의 3
축 방향이 시스템 좌표와 일치한다고 가정해야 합니다. 그러나 실제 제품에서는 센서 칩이 다르거나 설치 방향이 다를 수 있으므로 데이터 방향도 다를 수 있습니다. 그림 2 는 비스칼 MMA8452Q
3 축 가속도 센서의 방향 정의를 보여 줍니다.
그림 2 에서 칩을 설치할 때 핀 1 을 오른쪽 아래 위치 (PD) 에 두고 PCB 앞에 설치해야 안드로이드
< P > 좌표계의 기본 위치와 일치시킬 수 있습니다. 이렇게 설치하면 데이터 방향이 시스템 좌표 정의와 일치하는지 확인할 수 있습니다. 다른 경우에는 데이터가 시스템 정의와 정확히 일치하지 않으므로 데이터 방향과 좌표를 변경해야 합니다. 경우에 따라 X와 y 축을 교환해야 하거나 방향과 X-Y 축을 모두 바꿔야 합니다.
방향을 변경하거나 X-Y 축을 교환해야 하는지 여부를 결정하는 방법은 표 1 과 같이
1.
위 (UP) 에 장치를 배치합니다.
2. 센서에서 3 축 데이터를 읽습니다. Y 축의 데이터가 1g
(9.81m/S2) 이고 다른 두 축의 데이터가 약 0 인 경우 X-Y 축을 교환할 필요가 없습니다. 그렇지 않으면 x 축과 y 축을 교환해야 합니다. 3 단계로 이동합니다.
2.1.
y 축에서 읽은 데이터가 +1 g (+9.81m/s2) 인 경우 y 축의 방향을 변경할 필요가 없습니다. 데이터가 음수인 경우 y
2.2.
표 1 과 같이 왼쪽 (LEFT) 위치에 장치를 배치합니다. X 축에서 읽은 데이터는 ±1g (±9.81m/s2) 여야 하고 다른 두 축의 데이터는 약 0 이어야 합니다. X
축의 데이터가 양수이면 방향을 변경할 필요가 없습니다. 그렇지 않으면 x 축의 방향을 변경해야 합니다. 그런 다음 4 단계를 수행하여 z 축의 방향을 결정합니다.
3.
장치는 위쪽 (UP) 위치에 남아 있으며 센서에서 3 축 데이터를 읽습니다. 이 시점에서 x 축의 데이터는 1g
(9.81m/S2) 이고, 다른 두 축의 데이터는 약 0 이며 X-Y 교환이 필요합니다.
3.1. x 축의 데이터를 +1 g
(+9.81m/s2) 로 읽는 경우 x 축의 방향을 변경할 필요가 없습니다. 그렇지 않으면 변화가 필요하다.
3.2. 표 1 과 같이 왼쪽 (LEFT) 위치에 장치를 배치합니다. Y
축에서 읽은 데이터는 ±1g (±9.81m/s2) 여야 하고 다른 두 축의 데이터는 약 0 이어야 합니다. Y 축의 데이터가 양수이면 방향을 변경할 필요가 없습니다. 그렇지 않으면 변화가 필요하다. 그런 다음 4 단계를 수행하여 Z
축의 방향을 결정합니다.
4. 전면 위 (FRONT-UP) 위치에 장치를 놓고 센서에서 3 축 데이터를 읽습니다. Z 축의 데이터가 +1 g
(+9.81m/s2) 이고 다른 두 축의 데이터가 약 0 인 경우 z 축 방향은 변경할 필요가 없습니다. Z 축 데이터가 -1 g (-9.81m/s2) 이면 z 축 방향을 변경해야 합니다.
안드로이드 시스템에서 센서 데이터는 커널 공간의 Linux 드라이버에 의해 읽혀지고 HAL 계층 드라이버에 의해 API 로 전송됩니다. 계층 구조는 그림 3
와 같습니다. 따라서 센서 데이터는 Linux 드라이버 계층 또는 HAL 계층에서 변환할 수 있습니다.
안드로이드 Hal 파일에서 x 축, y 축 및 z 축의 방향 변경
HAL
파일에는 센서에서 읽은 가속 데이터를 다음으로 변환하는 매크로 정의 세트가 있습니다
//conversion of
acceleration data to si units (m/s 2)
와 같은 코드 Defineconvert _ a _ x (-convert _ a)# defineconvert _ a _ y (convert _ a) 상수 GRAVITY_EARTH
는 표준 중력 가속도 값, 즉 9.81m/s2 이며 LSG 는 중력 가속도 값의 최소 유효 개수 값입니다 (예: MMA8452
따라서 CONVERT_A 는 가속도 센서에서 읽은 데이터를 디지털 판독값에서 표준 중력 가속도 단위로 변환하는 데 사용됩니다.
CONVERT_A_X, CONVERT_A_Y 및 CONVERT_A_Z 를 각각 수정하여 x, y 및 z
를 쉽게 변경할 수 있습니다 축의 방향이 시스템 정의와 반대인 경우 (-CONVERT_A) 를 사용하여 방향을 변경할 수 있습니다. 방향이 같으면 (CONVERT_A) 를 사용하면 방향이 그대로 유지됩니다.이 매크로 정의는 fsl 안드로이드 9 (안드로이드 2.2) 드라이버의 HAL 파일 sensor.c 에 있습니다. Fsl 안드로이드 10
(안드로이드 2.3) 의 경우 'libsensors' 폴더의 HAL 파일 Sensor.h 에서 찾을 수 있습니다.
안드로이드 2.2 Hal
파일에서 x 축과 y 축 교환
경우에 따라 센서 데이터의 좌표가 시스템 좌표와 일치하도록 x 축과 y 축을 교환해야 합니다.
fsl
안드로이드 9 (안드로이드 2.2) 드라이버의 경우 x 축과 y 축 교환이 매우 간단합니다.
먼저 HAL 파일 sensor.c
의 sensor_poll () 함수에서
switch (event) 코드를 찾습니다
break;
case
ABS _ y:
ssensors.acceleration.y = event >
break;
caseabs _ z:
ssensors.acceleration.z = event.value * convert.
break;
}
그런 다음 다음과 같이 코드를 수정합니다.
switch (event.code) {
break;
caseabs _ y:
ssensors.acceleration.x = event.value * convert.
break;
caseabs _ z:
ssensors.acceleration.z = event.value *
break;
}
는 안드로이드 2.3 의 HAL 파일에서 x 축과 y 축 교환
에서
안드로이드 2.3 의 모든 HAL
파일은' libsensors' 폴더에 있습니다. AccelSensor.cpp 파일에 있는 두 함수를 수정해야 합니다.
먼저 다음과 같이 AccelSensor () 함수의 코드를 수정합니다.
if
(Accel _ is) Lt; Accelerometer;; If (! Ioctl(data_fd, EVIOCGABS(EVENT_TYPE_ACCEL_X),
amp; Absinfo)) {
mpendingevents [accelerometer]. acceleration.y =
ABS
}
if (! Ioctl(data_fd,
eviocgabs (event _ type _ Accel _ y), amp;; Absinfo)) {
mpendingevents [가속기]. acceleration.x = absinfo.value * com
}
if (! Ioctl(data_fd, EVIOCGABS(EVENT_TYPE_ACCEL_Z), amp;; Absinfo)) {
mpendingevents [accelerometer]. acceleration.z = absinfo.value * com
}
}
그런 다음 다음과 같이 processEvent () 함수의 코드를 수정합니다.
<; Int value){
스위치 (코드) {
case event _ type _ Lt; Accelerometer;; Mpendingevents [accelerometer]. acceleration.y = value * convert _ a _ y;
break;
caseevent _ type _ Accel _ y:
mpendingmask | = 1lt; Lt; Accelerometer;; Mpendingevents [accelerometer]. acceleration.x = value * convert _ a _ x;
break;
caseevent _ type _ Accel _ z:
mpendingmask | = 1lt; Lt; Accelerometer;; Mpendingevents [accelerometer]. acceleration.z = value * convert _ a _ z;
break;
}
}
가 완료되면 x 축과 y 축의 데이터가 서로 교환됩니다.
커널 구동 파일에서 x 축과 y 축 교환
X 축과 y 축의 데이터 교환은 센서 데이터 읽기를 처음 시작할 때 기본 리눅스 드라이버에서 구현할 수 있습니다. 이런 식으로 HAL 파일은 센서 칩이 PCB
에 설치된 방식이나 다양한 유형의 센서를 사용하는 방식에 관계없이 일관성을 유지할 수 있습니다.
안드로이드 2.2 및 2.3
에서 이 작업을 수행하는 가장 쉬운 방법은 report_abs () 함수의 코드를 수정하는 것입니다. 이 함수에서 센서 데이터는 다음과 같이 함수 mma8452_read_data () 를 호출하여 읽습니다 (사용된 센서가 MMA8452Q
인 경우).
X, amp;; Y, amp;; Z)! = 0) {
//dbg ("MMA 8452 data read failed \ n");
복귀; }
X 축과 Y
축은
if (mma8452 _ read _ data (amp Y, amp;; X, amp;; Z)! = 0) {
//dbg ("MMA 8452 data read failed \ n");
복귀; }
안드로이드
2.2 의 경우 MMA8452 의 커널 드라이버 파일은 mma8452.c;; 안드로이드 2.3 의 경우 드라이버 파일은' hwmon' 폴더에 있는 mxc_mma8452.c 입니다.
커널 드라이버 파일에서 x 축, y 축 및 z 축의 방향 변경
센서 데이터의 방향은 커널
드라이버 파일에서도 변경할 수 있습니다. Report_abs () 함수에 주석이 있는 다음 명령문을 추가하여 데이터 방향을 변경할 수 있습니다.
if
(mma8452 _ read _ data ( Y, amp;; X, amp;; Z)! = 0) {
//dbg ("MMA 8452 data read
failed \ n");
복귀;
}
x * =-1; //reverse x direction
y * =-1;
//reverse y direction
z * =-1; //reverse zdirection
input _ report _ ABS (mma8452 _ idev-gt; 입력, ABS_X, x);
input _ report _ ABS (mma8452 _ idev-gt; Input, ABS_Y, y);
input _ report _ ABS (mma8452 _ idev-gt; Input, ABS_Z, z);
input _ sync (mma8452 _ idev-gt; Input);
요약
안드로이드
시스템은 가속도계에 대한 좌표계를 정의했으므로 실제 센서에서 읽은 데이터를 변환해야 일관성을 유지할 수 있습니다. 변환이 필요한지 여부에 관계없이 x, y 및 Z
축의 방향과 X-Y 축 좌표를 확인해야 합니다.
HAL 파일이나 Kernel 구동 파일을 변경하여 축의 방향을 변경하거나 X 축과 Y 축을 교환할 수 있지만 HAL 파일과 Kernel 구동을 동시에 수정하지 마십시오.
찾기