본문 바로가기
아두이노_프로세싱/아두이노

가속도 센서로 각도 측정

by 돌돌쌤 2013. 6. 28.

가속도 센서로 각도 측정

 

가속도센서에 대한 기본은 이전글 확인

http://eskelt.tistory.com/79

 

이전글에서 확인할수 있듯이

사용한 ADXL335 센서는 한축을 -90~90도로 기울이면

-1g~1g값을  아날로그 값으로 출력해준다

 이값을 아두이노에서 아날로그 입력을 받아

각도로 변환 출력하면 된다.

 

즉, 입력받은 값을 -1 ~ 1 값으로 매핑

이 값은 sin(-90도)~sin(90도) 값이므로

asin(-1)~asin(1)로 라디안 값을 구하고 각도로 변환하면 된다.

 센서회전(가속도)

센서에서

출력되는 값

sin(-90도)~sin(90도) 값으로 매핑

asin으로

라디안 얻고 

라디안값을 각도로 변환 

 -90도 (-1g)

 270

 -1

 asin(-1) = -π/2

 asin(-1)*180/π = -90

 0도( 0g)

 338

 0

 asin( 0) = 0

 asin( 0)*180/π = 0

 90도( 1g)

 407

 1

 asin( 1) = π/2

 asin( 1)*180/π = 90

 

 

스케치 소스

========================================================================

float x,y,z;

 

void setup(){
  Serial.begin(9600);
}

void loop(){
 
  x = analogRead(0);
  y = analogRead(1);
  z = analogRead(2);


// 센서에서 읽은 값을 -1~1 사이의 범위가 좁은 값으로 변환하기 위해

// 실수형으로 변수 선언하고 스케치 맨 하단 mapinfloat 함수를 호출을 통해 변환

// 그리고 -1~ 1 사이를 벗어나지 않도록 constrain 처리
  float xsintheta = constrain(mapinfloat(x,268,406,-1,1),-1,1);
  float ysintheta = constrain(mapinfloat(y,267,406,-1,1),-1,1);
  float zsintheta = constrain(mapinfloat(z,275,412,-1,1),-1,1);
  

// -1~1 사이의 값을 각도 값으로 변환  
  float xtheta = asin(xsintheta)*180/PI;
  float ytheta = asin(ysintheta)*180/PI;
  float ztheta = asin(zsintheta)*180/PI;
 

  Serial.print("x : ");
  Serial.print(xtheta  );
  Serial.print("   ");
  Serial.print("y : ");
  Serial.print(ytheta);
  Serial.print("   ");
  Serial.print("z : ");
  Serial.println(ztheta);
}

 

// -1~1 사이의 범위가 좁은 값으로 변환하기 위한 함수

float mapinfloat(float i, float imin,float imax, float omin, float omax){
  float o = (i-imin)*(omax-omin)/(imax-imin) + omin;
  return o;
}

========================================================================

 

작동영상

먼저 x축을 90도까지 기울여 값을 serial모니터에 출력

다음 y축을 -90도에서 90도까지 기울여 serial모니터에 출력한 화면.

확인한 결과 -70~70도 사이에서는 비교적 정확한 값을 측정한 반면

그 ±70도 이상에서는 정확하지 않은 값이 측정됨.