[29호] 9축센서 블루투스 모듈 UMotion.M을 소개합니다
9축센서 블루투스 모듈 UMotion.M을 소개합니다.
(주)앱스톤에서 개발한 9축 센서 블루투스 모듈을 소개하고 관련 정보에 대해 이야기 한다.
글 | (주)앱스톤
9축센서
자유 공간에서 동작들을 감지할 수 있는 센서 중 가장 대중화된 센서이다. 9축이라 함은 가속도 3축, 관성 3축, 지자기 3축으로 총 9축의 값이 측정되기 때문에 9축 센서라고 불린다.
가속도센서
가속도를 측정하는 센서이다. 중력가속도(g=9.8㎨) 가 포함된 정보를 나타낸다. 가속도 센서가 3축이라 함은 센서가 3차원에서 움직일 때 x축, y축, z축 방향의 가속도를 측정할 수 있다는 의미이다.
관성센서
자이로센서는 가속도를 측정하는 가속도 센서와 달리 각속도를 측정한다. 각속도는 시간당 회전하는 각도를 의미한다.
지자기센서
지자기 센서는 지자계를 이용하여 절대적인 방향을 측정하기 위해 사용된다. 지자계의 세기가 작기 때문에 센서 데이터는 주위의 다른 자기 성분에 쉽게 영향을 받게 된다. 이러한 이유로 인해 정확성을 유지하기 위해 지자기센서는 잦은 보정을 필요로 한다.
9축센서 활용도
세가지 센서가 융합된 만큼 활용도가 크다. 기본적으로 가속도, 관성, 지자기의 정보를 쉽게 얻을 수 있으며 이 정보들을 이용하여 자세측정(AHRS)을 할 수 있다. 자세측정을 하는 방법을 간단하게 설명하면 자이로 센서와 관성센서의 데이터의 융합으로 인해 회전데이터를 만들어 낸다. 지자기센서로 지자계에 대한 보정작업이 이루어지며 이 회전데이터를 이용하여 현실공간(3D 공간)에서 물체 회전을 알아낼 수 있다. 회전 데이터는 일반적으로 Quaternion, Euler, Matrix 로 표현한다. 활용한 예를 들면 비행기, 배, 네비게이션 그리고 최근에는 스마트 핸드폰, 태블릿, 스마트 리모컨, 게임 컨트롤러, 재활치료, 스포츠 코칭시스템, 댄스 코칭시스템, 애니메이션, 모션캡쳐 등으로 쓰이고 있다.
9축센서로 구현된 어플 예
앱스톤에서 개발한 두가지 어플 사례를 담는다.
JAVAYO
잘못된 자세로 앉아 있는 것을 막기 위한 어플이다. 센서를 가슴부위에 착용한다. 올바른 자세로 앉은 후 켈리브레이션을 하면 자세를 체크하여 잘못된 자세일 경우 알람 및 진동으로 잘못된 자세임을 알려준다.
Motion Counter
반복된 운동(푸쉬업, 스쿼트, 아령운동 등)을 자동으로 카운터하는 어플이다. 센서를 운동하는 부위에 착용한다. 예를 들면 푸쉬업할 때는 아래 팔(low arm)에 스쿼트를 할때는 허벅지에 착용하는 식이다. 센서 착용 후 운동을 시작하는 자세에서 켈리브레이션을 한다. 반복운동을 하면 자동으로 움직임에 따라 카운트를 한다.
UMotion.M 제품의 장점
가장 큰 장점은 스마트 기기와 바로 연동이 가능한 점이다. 스마트폰, 태블릿, 노트북 등은 기본적으로 블루투스 통신 모듈이 탑재되어 있어 별도의 수신기 없이 연결이 가능하다. 기본적인 데모어플에서 그래프를 통한 값의 변동을 쉽게 볼 수 있다. 가속도, 관성, 지자기의 값을 그래프를 통해 확인할 수 있어서 추후 어플 구현 시 디버깅하기가 용이하다. JTAG 포트를 통해 펌웨어 구현도 가능하다. 사용자가 요구할 경우 펌웨어 구현이 가능한 base code를 제공하기 때문에 어플리케이션 뿐만 아니라 펌웨어 또한 구현 가능하다.
배터리 지속시간이 우수하다. 한번 충전 시 최대 8시간 운용이 가능하다. 어플리케이션 구현에 용이하도록 기본적인 샘플 코드 예제를 제공한다. 아래는 메뉴얼에 나온 내용을 일부 발췌한 내용이다. 이외에도 데이터를 읽고 어떻게 연산하면 되는지에 대해 자세하게 설명되어 있다.
시리얼 포트 연결 시 PC 프로그래밍 일부 예제 (C# 기준)
public System.IO.Ports.SerialPort _SerialPort = null;
// System.IO.Ports.SerialPort 라이브러리를 이용한다. void SerialSetting()
{
if (_SerialPort != null)
if (_SerialPort.IsOpen) // 시리얼 포트가 열려있는지 확인하고 조치를 취한다.
_SerialPort.Close();
try
{
/* 아래는 시리얼 포트 세팅에 관한 부분이다. 소스가 약간 복잡해진 이유는 COMPORT 넘버가 10 이상일 경우 오픈이 안되는 현상을 해결하기 위한 코드가 들어가서이다. 나머진 기본적인 BaudRate, DataBits, StopBit 등의 설정을 하는 부분이다. */
string []test = {“COM”};
string []temp = _strPort.Split(test, StringSplitOptions.RemoveEmptyEntries);
if(Convert.ToInt32(temp[0]) >= 10)
{
_SerialPort = new System.IO.Ports.SerialPort(“\\\\.\\”
+_strPort, 0, System.IO.Ports.Parity.None, 0, System.IO.Ports.
StopBits.One);
}
else
{
_SerialPort = new System.IO.Ports.SerialPort(_strPort, 0,
System.IO.Ports.Parity.None, 0, System.IO.Ports.StopBits.One);
}
_SerialPort.BaudRate = Convert.ToInt32(_strBaudRate);
_SerialPort.DataBits = 8;
_SerialPort.StopBits = StopBits.One;
_SerialPort.Parity = Parity.None;
_SerialPort.ReadBufferSize = 4096;
}
catch(Exception) { }
try
{
_SerialPort.Open(); // 위에서 설정한 데로 시리얼포트를 오픈한다.
_SerialPort.ReadTimeout = 400;
}
catch (Exception){ }
}
안드로이드의 경우
안드로이드 Bluetooth Sample 예제를 활용하여 쉽게 데이터를 취득할 수 있다.
옆에는 Bluetooth Chat을 실행하여 StonCap과 연결한 모습 (출력이 프로토콜 모드 상태여서 아래와 같은 상태로 출력되어 있다. ASCII 모드로 출력을 변경하면 값을 직접 확인할 수 있다.)
드리프트 완화 알고리즘이 채용 됐으며 신뢰성있는 데이터를 출력한다. 센서 스펙은 아래와 같다.
Gyro Full Scale Range (°/sec) : ±250 , ±500, ±1000, ±2000
Gyro Rate Noise (dps/√Hz) : 0.005
Acceleration Full Scale Range (g) : ±2, ±4, ±8, ±16
Compass Full Scale Range (μT) : ±1200