한 일년도 훨씬 전쯤에 가속도센서를 이용한 각도 측정에 대한 글을 올렸었습니다만, 당시엔 실험자체를 제가 수행했던 것이 아니었고, 또 그 당시 홈페이지 자료도 다 잃어서 다시 실험하고 정리했습니다. 그러다보니 좀 늦었네요. 많은 분들(3명?^ㅠ^)이 메일과 제 방명록에 요청하셨었는데 참 죄송스럽다는.... 이번 테스트에는 당시의 DSP2812에서 Cortex M3 LM8962로 프로세서를 교체하고 가속도센서도 바꾸었습니다. 당시 가속도센서 여분이 없더라는..ㅜ.ㅜ 그래서 주위를 둘러보니 withrobot사의 myAccel3LV02라는 보드가 있더군요. 판매처는 디바이스마트입니다.


꽤 소형입니다. 판매자의 소개를 잠시 빌리면


이렇게 SPI, I2C 통신을 모두 지원한다는군요. 음... 이번에 데리고 놀고있는 CortexM3 보드가 ADC가 총 4개가 있더군요... 제가 생각하는 전체 센서모듈에서 가속도센서 3축에 자이로 2축을 생각하면 모자라길래 자이로센서는 직접 ADC할 생각으로 보정에 필요한 가속도센서는 SPI를 이용하기로 했습니다. 뭐 withrobot에서 배포하는 아름다운 예제가 있길래...~~^^




그 아름다운 예제를 이전에 제가 테스트한 - 엔코더해석 결과를 일정시간간격으로 시리얼통신으로 전송하기-에 포함시켜 생각하기로 했습니다. 가속도센서나 자이로센서나 판매처나 제작사도 많고 그러다보니 사용예제도 참 잘 배포된다는 생각이 듭니다. 그러나, 한가지 아쉬운것은 실제 참값과의 오차나 혹은 참값에 도달하는 시간등을 알수있도록 예제가 꾸며져 있는건 없더군요...(아직 못찾았다는...).. 그래서 저는 참값과의 비교를 위해 엔코더를 버릴수가 없더군요. 또 미분(실제로는 차분)과 적분등을 수행하기 위해 샘플링타임이 필요하니까 딱 위 최근글에서 제가 살짝 바꾼 예제에 가속도센서 예제를 포함시키는게 제일 편하다는 생각을 하게 된겁니다. 하여간... 위 그림처럼 가속도센서 예제에만 들어있는 헤더화일과 c화일을 프로젝트에 포함시킵니다.



그리고 저의 변형예제의 타이머인터럽트 핸들러에 위 코드를 넣어주면됩니다. (풀 코드는 맨아래 넣어두겠습니다..) 그러면

엔코더값, 가속도의 X축, 가속도의 Y축, 가속도의 Z축;


이렇게 시리얼통신으로 데이터가 넘어옵니다. 콤마(,)와 세미콜론(;)으로 데이터들 사이와 줄을 구분지은건 제가 사용할 프로그램이 MATLAB이기 때문에 받을때부터 좀 쉽게 받을려고 해서 그렇습니다.^^. 시리얼 통신으로 데이터를 받는 것도 [Cortex M3] 단순 시리얼통신 테스트 ComPortMaster에서 이야기한 방법 그대로 사용할 것입니다.



먼저 흔들리는 진자의 회전중심축에 가속도센서를 장착합니다.



그러면, 위 그림처럼 보이듯이, atan 함수를 이용해서 정말 간단히 기울어진 각도를 가속도센서를 이용해서 측정할 수 있다는 사실을 알 수 있습니다. 여기서 예전에도 이야기 했지만, 많은 분들이 말씀하시는 스케일펙터의 조절이라던지 가속도센서의 출력 범위(g)의 조절등은 고려할 필요가 없습니다. (적어도 위 상황이라면) 그것은 (y성분/z성분)을 계산할때, 각 종 펙터들을 그 이전에 곱했다 하더라도 약분되어서 없어질 것이기 때문입니다. 실험결과 데이터를 MATLAB에서 처리한 코드는

Acc = load('AccelTest01.txt');

ts = 0.01;
EncAngle = Acc(:,1)*360/2000;
AccY = Acc(:,3);
AccZ = Acc(:,4);
[N, temp] = size(EncAngle);
t = 0:ts:ts*(N-1);

AccAngle = -atan(AccY./AccZ)*180/pi+2.6;

figure
plot(t, EncAngle)
grid on
hold on
xlabel('second');
ylabel('degree');
plot(t, AccAngle, 'r')
legend('Encoder','Accelerometer');
hold off


위 코드에서 8번행은 그래프를 그리기 위한 시간축을 생성한 것이구요. 10번행은 atan함수를 이용해서 각도를 검출한 부분입니다. 부호가 '-'가 붙은 이유는 엔코더의 '+'방향과 반대로 연결되었더군요...^^... 그리고 10번행 마지막의 2.6도를 더하는 것은 가속도센서를 연결할 때 딱 센터를 맞추지 못하고 좀 기울어졌기 때문입니다. 뭐 프로세서단계에서 보정할 수 있었지만, 그놈의 귀찮음때문에....^^  예전 자료에 비하면, 일단 이번 가속도센서의 출력은 정말 깨끗하다는 사실을 알 수 있습니다. 노이즈를 많이 줄였다고 하던데 정말 그래보입니다.
 


위 그래프에서 파랑색선과 빨강색선이 거의 겹쳐잘 안보이긴 하는데요. 파랑색선은 진자에 직접연결된 엔코더에서 각도를 잡은겁니다. 즉, 참값이라고 봐도 무방합니다. 빨강선은 가속도센서에서 각도를 잡은겁니다.



이제 가속도센서가 각도를 검출할수있는 원리는 이야기했습니다. 그러나 가속도센서만으로 그 각도를 검출할 수 있는건 딱 위의 상황... 전 가속도센서 회전 중심축에 연결되어야하고 그 회전중심축은 제자리에 가만히 있어야만 할 때입니다.



위 그림처럼 만약 가속도센서가 회전중심축에 있지 못하면, 가속도센서는 접선방향의 가속도 성분과 법선방향의 가속도성분을 측정하게 되어서 회전각도를 검출하는데 문제가 생기게 됩니다.



위 그림처럼 가속도센서를 진자의 끝에 연결했습니다.  또 연결할때 실수(^^)로 이번엔 X축이 회전하게 되었다는...ㅋ... 뭐 그래도 상관은 없으니까요...



결과 그래프입니다. 파랑색 엔코더에서 읽어들인 회전각도와 상당한 오차가 발생한다는 사실을 알수있습니다. 중간에 팍 하고 튀는 부분은 제가 손으로 살짝 친겁니다. 가속도센서이니 충격에대해서는 당연히 다른 센서(속도성분을 검출하거나 각도성분을 검출하는 센서보다) 더 민감할 수 밖에 없을겁니다.

위 두 실험의 결론을 말하면, 가속도센서 만으로 각도를 검출하는것은 병진운동성분이 있는 경우는 힘들다는 것입니다. 이제 자이로가 등장해야지요...^^



위 두 실험데이터는

gettingAngleUsingAccelerometor.zip


으로 올려놓았습니다. MATLAB화일과 시리얼통신으로 받은 데이터는 txt화일입니다. 마지막으로 아래에는 다시 메인 c 코드 전체입니다.

//*****************************************************************************
//
// Withrobot에서 배포하는 엔코더 테스트화일에 
// 시리얼 통신 예제와 타이머 인터럽트 사용예를 통합하고
// 다시 myAccel3LV02보드 테스트용 예제를 통합하고
// 출력양식을 조금 변경함.
//                                              -PinkWink-    2009.06.08
//
//
//*****************************************************************************

#include 
#include 
#include 
#include 
#include "../../../hw_types.h"
#include "hw_ssi.h"
#include "../../../hw_memmap.h"
#include "sysctl.h"
#include "gpio.h"
#include "uart.h"
#include "ssi.h"
#include "qei.h"
#include "ustdlib.h"
#include "timer.h"
#include "interrupt.h"

#include "myAccel3LV02.h"
#include "myAccel3LV02_hal_spi.h"

#ifdef DEBUG
void
__error__(char *pcFilename, unsigned long ulLine)
{
}
#endif

#define BUFFER_LEN              32

static void UARTPutString(char * str);
static void InitTIMERINT(void);
static void InitUART(void);
static void InitQEI(void);
static void TimerIntHandler(void);

int main(void)
{
    SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | SYSCTL_XTAL_8MHZ);

    InitTIMERINT();		// Initialize Timer Interrupt
    InitUART();			// Initialize Serial
    InitQEI();			// Initialize Encoder Module
    MA3_INIT();			// Initialize Accelerometer

    // Loop Start.
    while(1)
    {
    }
}

static void TimerIntHandler(void)
{
    unsigned long pos;
    char buffer[BUFFER_LEN];
    short data_short_array[3];

	// Clear interrupt flag
	TimerIntClear( TIMER0_BASE, TIMER_TIMA_TIMEOUT );

	// Read Encoder Value
	pos = QEIPositionGet(QEI0_BASE);
	usnprintf(buffer, BUFFER_LEN, "%d, ", pos);
	buffer[BUFFER_LEN - 1] = 0;
	UARTPutString(buffer);

	// Read Accel Data
	MA3_CS_ON();
	MA3_READ(MA3_REG_OUTX_L, (unsigned char*)data_short_array, sizeof(data_short_array));
	MA3_CS_OFF();
	usnprintf(buffer, BUFFER_LEN, "%d,  %d,  %d;\n", data_short_array[0], data_short_array[1], data_short_array[2]);
	UARTPutString(buffer);
}

static void UARTPutString(char * str)
{
    while(*str)
        UARTCharPut(UART0_BASE, *str++);
}

static void InitTIMERINT(void)
{
    SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER0);
    TimerConfigure( TIMER0_BASE, TIMER_CFG_32_BIT_PER );
    TimerLoadSet( TIMER0_BASE, TIMER_A, SysCtlClockGet() / 100 );	// 10ms
    TimerIntRegister( TIMER0_BASE, TIMER_A, TimerIntHandler );
    IntMasterEnable();
    TimerIntEnable( TIMER0_BASE, TIMER_TIMA_TIMEOUT );
    TimerEnable( TIMER0_BASE, TIMER_A );
}

static void InitUART(void)
{
    SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0);
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
    GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1);
    UARTConfigSetExpClk(UART0_BASE, SysCtlClockGet(), 115200, (UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE | UART_CONFIG_PAR_NONE));
}

static void InitQEI(void)
{
    SysCtlPeripheralEnable(SYSCTL_PERIPH_QEI);
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC);

    GPIOPinTypeQEI(GPIO_PORTC_BASE, GPIO_PIN_4 | GPIO_PIN_6);
    QEIConfigure(QEI0_BASE, (QEI_CONFIG_CAPTURE_A_B | QEI_CONFIG_NO_RESET | QEI_CONFIG_QUADRATURE | QEI_CONFIG_NO_SWAP), 0xffffffff);
    QEIVelocityConfigure(QEI0_BASE, QEI_VELDIV_1, SysCtlClockGet() / 100);

    QEIEnable(QEI0_BASE);
    QEIVelocityEnable(QEI0_BASE);
}

   NT-ARSv1 (각도 측정, 자이로 센서 가속도 센서 이용, ARS, IMU) 
 
자이로 센서와 가속도 센서를 이용한 각도 측정의 어려움을 해결할 수 있는 ARS모듈로 낮은 가격과 작은 크기를 가지며, 금속 케이스가 있어 활용도가 높음. NT-ARSv1 : 관련페이지


 


http://pinkwink.kr/trackback/73 관련글 쓰기
  • 이전 댓글 더보기
  • 엘고 2009/06/11 06:18

    오~~혹시 로봇두 만드시나요?~~부러워요^^~~기대할께요~~

    • PinkWink 2009/06/11 20:12

      히~~~
      저도 저한테 기대하고싶어요...
      요즘 작업진도가 너무 느려서요..ㅜ.ㅜ

  • 검도쉐프 2009/06/11 21:40

    여기는 무서운 블로그..ㅠ,ㅠ
    울 아내에게 대신 오라고 해야겠어요. 아내는 전자부품을 팔고 있어요. ㅋㅋ

    • PinkWink 2009/06/11 22:47

      ㅎ...저도 무서운 검도사범님의 블로그...
      거기 가기만 하면...
      야식의 유혹을 이길수가없어요...ㅋㅋ^^

  • 2009/06/12 04:27

    저도 이센서 지금 사용하고 있는데 ~
    IDG300 이랑 이걸로 쿼드 만들려고 노력중입니다.ㅠㅠ
    핑크윙크님 자료는 정말 많은 도움이 되는거 같아요 ~~
    칼만필터로 자이로랑 가속도 혼합시에
    가속도에서 나오는 롤각에 회전한 만큼의 롤각..
    그러니까 자이로로 측정한 각속도의 적분..
    각도를 더해줘서 예측 한다고 하는데..
    역시 병합을 해서 쓰야 겠내요..
    오늘도 해가 뜰려고 합니다 ㅠㅠ ㅎㅎ

    • PinkWink 2009/06/12 06:16

      ㅎ...안녕하세요...
      도움이 되었다니 그나마 다행입니다.
      작업하는 내용들을 서로 교환해도 좋을텐데요^^
      ㅎㅎ... 밤새는 사람들에게 아침은
      꽤 묘한 느낌으로 다가옵니다....
      휴~~ 저도 아직 할일이 남았네요^^

  • 썽리 2009/09/28 15:32

    안녕하세요~ 칼만필터를 이제 막 공부하고 있는 학생입니다~
    좋은자료 감사하고 혹시 글과 그림 참고해서 블로그에 담아도 될까요?
    (문제가 되는 커맨트 받으면 바로 삭제할께요~)

    • PinkWink 2009/09/28 15:40

      출처만 명확히 밝혀주신다면 상관없습니다.^^

  • 김진석 2009/11/16 19:31

    안녕하세요~
    저도 같은 가속도 센서를 사용하는데요,
    초기치 값이 궁금해서 이렇게 질문을 올립니다.
    12비트 변환을 사용했구요 측정범위는 -2g ~ 2g까지로 디폴트 되어 있는것을
    그대로 사용하엿는데요~
    평평한 곳에 가속도 센서를 그대로 올려놓은 후 x y z 축을 통신으로 받아 본결과
    0 0 1024가 떳는데 이게 맞는 건가요?
    제 생각으로는
    +- 2g이므로 가속도 0값은 중간인 2047이 되어야 하지 않나요?
    그래서 2047 2047 1024 가 되어야 한다고 생각하는데요
    정말 궁금합니다.

    • PinkWink 2009/11/17 08:28

      말씀하신데로이긴 할텐데요...
      설정을 어떻게 잡으셨나요?

      0 0 1024 라고 뜬다고 잘못된것이라기보다는
      만약 부호가 있는거라면 맞을거구요..
      부호없는 거라면
      말씀하신데로가 또 맞는듯합니다만...

      예제 코드의 설정부분과 데이터획득부분을 자세히 보셔야겠는데요...^^

  • 엘리 2010/01/24 17:29

    정리가 깔끔하시네요;;;
    허락해 주심 내용을 퍼가고 픈데 될가요?
    우쨰 퍼가죠 근데?;;;;;

    • PinkWink 2010/01/25 01:00

      잘 모르겠습니다만...
      다들... 잘 가져가시던데요^^
      출처만 명확히 하시면 가져가셔도 됩니다..

      다른이야기입니다만.. 사실 복사금지 기능을 넣어둔것이 처음부터는 아니였습니다. 어느날 제 홈페이지 주소같은 출처 하나없이 마치 자신의 글인양 정확하게 카피되어있는 글을 우연히 보게 되었습니다. 그 후 이건 아니지 않는가 하고 복사 방지를 걸게 되었습니다...^^

      그러나 다들 잘 가져가시던데요^^(물론 출처를 밝히시면서 말이죠^^)

  • 미냐 2010/02/16 18:00

    안녕하세요~ 가속도 센서 측정할때
    말씀하신데로 ADC그대로 받아서.. atan(Acc_X/Acc_Z) * 180 / PI를 해서 구했는데,
    ADC는 12bit이고 평평할 때 Acc_Z는 2.45V Acc_X는 1.65V로 대략 평균 33값이 나오는데..
    이게 각도로 나오지 않고, 평균 33에 +90 ~ -90도에 따라서 범위가 20~50사이로 값이 나오는데
    조금 이상합니다 ^^; 도움을 구해보려 해요!

    • PinkWink 2010/02/16 22:22

      atan를 적용하실때.. 예를 들면 평면에 가만히 있으면

      AccX = 1,65 쯤이고
      AccZ = 2.45 쯤이라고 하셨죠?

      atan(AccX/AccZ) = atan(1.65/2.45)로 하면 0이 아니자나요.^^

      실제로는

      atan((AccX-center)/(AccZ-center))

      로 하셔야 하고, 이때 center는 중력의 영향을 받지 않는 충의 중간값 여기서는 1.65여야합니다. 즉

      = atan((1.65-1.65)/(2.45-1.65))

      로 하셔야 0도를 얻게 됩니다.

  • 하급공학자; 2010/02/25 14:39

    안녕하세요 ^^

    항상 눈팅만 하다가 가는 사람들중의 하나 입니다.

    그러다가 오늘은 이렇게 용기를 내어서 한소절 적어 봅니다;;;

    -90 ~ +90 도 각을 구할려고 하는데요

    저는 각을 구할때요

    atan(AX/sqrt(AY*AY + AZ*AZ)) * (180/3.14)

    다음과 같이 구합니다...

    그런데 serial 통신으로 각을 직접 확인할려고 하는데.... 0 ~ 89도는 잘나오는데...

    90도가 되면 값이 막 튀는 현상이 생기고요... 0 ~ -90 도 값도 측정을 하여야 하는데... 이상한 값이 뜹니다. 45라는 값이 뜨는데요...

    시리얼 통신으로 따로 확인할 방법이 없을까요?! 또는 코드에서 -값을 적출해서;; 할 방법이나....

    • PinkWink 2010/02/25 14:50

      가속도센서만으로 각도를 구할때 arctan 명령으로 구하게 되면 90도 지점에서 문제가 생깁니다... 왜냐면 tan(90도)가 정의되지 않기 때문이지요....^^

  • 하급공학자; 2010/02/25 17:59

    그렇다면... 해결할 방법은 없을까요?!

    간단한 세그웨이를 구현 해볼려고 하는데요;;;

    가속도 센서에 대한 - 값은 어떻게 구해야 하는건가요;;; 혹;;; 그 부분 소스나...

    귀뜸해주실 말씀이라도 해주시면 정말 고맙겠습니다. ㅠ.ㅠ

    • PinkWink 2010/02/25 21:56

      아니요.. 전 90도 검출은 atan로 안된다고 한것이지.. '-'가 안된다고 하진 않았습니다. 분명 위에 적으신 내용대로라면 AX값이 '-'를 가지면 atan도 '-'의 값을 가지게 됩니다...^^ (혹시 C code 상에서 unsigned 로 선언하진 않으셨는지요????^^)

  • 현이11 2010/03/23 17:37

    안녕하세요? 자주 들어와서 블로그 내용을 공부하고있는데요~
    현재 가속도 센서 myAccel3LV02 가속도 센서를 사용하고 있습니다.
    SPI통신으로 값을 받아오긴 하는데, 이 값이 도데체 어떤 값인지 알고싶습니다.
    만약에 수평으로 이동했을때, 나오는 출력값이 m/s^2값인가요?
    그리고 이 센서를 기울였을때 나오는 데이터는 어떤값인가요?
    중력에 의해 나오는 값이라는 얘기는 많이 들었는데,
    어떠한 원리로 나오는지 몰라서요...
    혹시 PinkWink님 이 글 보시면 답글 달아주세요~ㅜ
    지금 며칠째 머리를 끙끙 싸매고 있어요ㅜㅜ

    • PinkWink 2010/03/24 01:10

      일단 센서의 출력은 당연히 해당 출력의 가속도값입니다.
      그러나 0-3.3V의 범위를 가지는 ADC 출력입장에서는 '-'값을 표현할 수 없으므로, 대략 1.65V쯤을 실제 '0'로 보고 있습니다.

      그러므로 출력에서 받은 값은 센터를 기준으로 빼줘야합니다.
      그렇게 해서
      -1.6V부터 +1.6V사이의 값을 가지도록 하는 것입니다.

      그리고 데이터시트에 표시되어있는 수치들을 이용해서 적절한 값(scale factor)을 곱해야만 원하시는 m/s^2의 수치를 얻을 수 있습니다.

      그리고, 가속도센서이므로 당연히 중력가속도성분을 검출하는 것입니다. 어떤 원리(??)까지는 댓글의 범위를 넘어서는군요. 위키디피아같은 곳을 확인하시면 가속도센서의 원리는 찾으실수있습니다.

      그리고, 답답한 마음 충분히 이해합니다(저도 그랬습니다^^)
      그러나 사실 명확하지 않은 질문이 몇개가 같이 있어서 저로서는 답변하기가 상당히 힘이듭니다. 저의 글과 또한 인터넷에서 검색된 결과들을 잠시 읽어보시고, 특히 myAccel3LV02같은 경우 withrobot에서 꽤 친절한 설명서를 같이 배포하는 것으로 알고있습니다. 그리고 다시 질문을 부탁드립니다.

  • 김기현 2010/05/13 09:33

    안녕하세요 자이로에이어 가속도에도전하고있는학생입니다 흐흐
    pink님 강의를 듣고 하나하나 진도를빼고있는데요
    GetAccelValue(AXIS_Y, &data_y);
    data_y=0xffff&data_y;
    printf("%d ", data_y);
    GetAccelValue(AXIS_Z, &data_z);
    data_z=0xffff&data_z;
    printf("%d \r ", data_z);
    Xresult = atan(data_y/data_z)*180/M_PI;
    printf("Y : %d \r",Xresult);
    라는 소스로 각도를 볼려고하였습니다
    여기서!! 45도까지는 각이안나오고 45도부터 둔감하게 63, 72,74도가나오더니 89도까지는 제대로 나오더군요
    이상해서 y축값 z축값 따로받아서 엑셀로 표를만들어보았더니 수식상으로는 이상이없어보입니다(엑셀파일을 올릴데가없네요 ㅎㅎ)
    그렇다면 초기 연산량때문에가아닌지 spi속도를 늘려보고 레지에있는 필터설정도 건드려보았는데 진척이없네요 ㅜ 답글부탁드리겠습니다^^

    • PinkWink 2010/05/13 14:54

      각 축 성분을 따로 받아서 PC상에서 ATAN를 수행하여 각도를 추출했을때 정상이라면 당연히 프로세서에서는 ATAN하는 부분이 문제가 아닐까요??

      그렇데 보여주신 코드상에서 가속도센서의 결과에서 바이어스를 고려하는 부분은 어디있나요?? 그냥 생략하고 안 보여주신건가요??

  • 김기현 2010/05/13 22:37

    흠 저코드가 다예요 바이어스가 오프셋값말씀하시는건가요?
    초기값이 y축은 33인지라 미미한값이라 그냥 뒀습니다
    엑셀로 계산을 하였을때는 y축 /z축 = 0.07843 부터 1.564136 까지나온걸
    atan(y축/z축) *180/PI 로 각으로 환산하더니 0~89도까지나와서
    스케일팩터라던가 고려를 안했거든요 올리신글도 서로상쇄된다고 하셔서
    이대로 실험을 하였답니다 ㅜ

    • PinkWink 2010/05/14 14:23

      음... 그러니까
      가속도센서의 값을 받아 PC에서 직접 각도를 계산했을때는 정상으로 보인다는 말씀이신거죠??
      그렇다면, 센서도 문제가 없고 센싱값을 읽어오는 부분도 문제가 없으니. ATAN를 계산하고, 그 결과를 모니터링하는 부분의 문제라는 이야기군요. 제가 도와드릴 부분이 없는데요^^ (현재는 무엇이 문제다..라고 꼭 집어 말씀드릴수가 없네요...ㅠㅠ)

    • 임동진 2011/01/10 23:57

      방금 저도 같은 문제로 고민하다 해결했습니다

      가속도 센서와 AVR로 atan()함수를 이용하여 기울기를 구하는데 둔하게 나와 해결책을 찾다 보니 스택(stack)크기가 문제가 될수 있다더군요

      옵션에서 스택 크기를 늘려주니 해결되었습니다

    • PinkWink 2011/01/12 13:50

      아.. AVR에서 그런 문제가 있을 수 있군요..
      아주 감사합니다.^^
      또 같은 문제로 고민하는 많은 분들께 도움이 될 수 있겠는데요^^

  • 박진원 2010/05/14 19:50

    여전히 고생이 많으시네요~ ^^ ㅋㅋㅋ
    전 몇일 전에 가속도 센서를 테스트 했었어요.. ^^ ㅋ 글도 올렸었구요 ㅋ
    테스트는 성공했구요 ㅋㅋ 그런데 오늘 조금 손볼까 싶어서 다시 보다가....
    흑... ㅠ 후배가 잠시 테스트 한다고 파워를 빌려갔다가 쓰고서 저도 아무 생각없이 꽂았는데.... ㅎㄷㄷ.... 10V....... ^^;
    3.3V 인가에 10V를 인가해버렸어요.. ㅠ 그 뒤로 오실로에서도 전압이
    아주 아주 낮게 나와요.. 몇십mV로.. ㅠ
    전압을 너무 높게줘서 사망한게 맞는거죠?? ㅠ
    방금까지 파형도 잘 나오다가 10V를 주고나서 이러네요.. ㅠ
    이걸 A/S 맡길수도 없구.. ㅠ 다시 구매해야겠어요.. ㅠ

    • PinkWink 2010/05/14 20:19

      저런.. 레귤레이터를 사용하지 않으셨나요??ㅜㅜ
      저도 예전에 그랬던 적이 있었답니다...
      저는 후배가 까만선과 빨간선을 바꿔서 사용한 파워서플라이를 사용해서.. 그만... 레귤레이터가 운명하셨더랬지요....^^

  • 2010/05/17 01:18

    비밀댓글입니다

    • PinkWink 2010/05/17 10:10

      자전거 로봇은 처음 들어봅니다. 전에도 말씀드렸지만
      가속도센서는 회전중심에 위치해야만 기울어지는 각도측정이 정확하다는 것이 원칙입니다. 그러나, 구동환경에 따라 꼭 회전중심에 위치하지 않더라도 충분할 수도 있습니다. 이것은 실험을 통해 확인해야할 것입니다.
      또한, 센서의 가격이 낮다 높다는 것은 메인칩의 성능이 높거나 낮아질수도 있지만, 같은 메인칩을 놓고 주변 필터의 성능이 좋아지거나 낮을 수도 있습니다. 이는 데이터시트를 통해 확인해야합니다. 필터의 성능이 노이즈없이 정말 깔끔할 수록 반대로는 응답시간이 늦을 수동 있습니다. 센서의 응답시간과 노이즈비율을 보고, 시뮬레이션을 통해 확인하는 것도 좋은 방법입니다.
      마지막으로 위에서 이야기했지만, 저역통과필터하나를 가지고도 가속도센서만으로 각도측정이 어느정도 가능하며, 만약 만족스럽지 못하다면, 자이로센서와 같이 사용하는 것이 일반적인 추세입니다만, 이도 역시 구동환경에서의 성능을 테스트해봐야하는 일입니다. 센서하나만 써도 괜찮다면 꼭 두개까지 사용할 필요는 당연히 없으니 말이지요.

  • 돼지돌이 2010/05/26 16:51

    안녕하세요.

    다들 아시겠지만, 센서 test하다가 알게된 간단한 사실;;; 저처럼 바보같이 센서의 원래 원리를 잊어버리고 궁금증에 헤매이다... 시간낭비 하실까봐 올립니다.

    저도 withrobot 사의 "MyAccel3LV02" 가속도 센서를 쓰는 사람중 한명입니다.

    이 센서도 총 12bit(4096)의 해상도를 보유하고 있는데...

    막상 써보니... 중력 가속도에 의하여 영향을 받아서... 각도 측정을 위하여서는 결국 2048(10bit)정도의 영향만을 가지더군요... 왜 굳이 10비트 분해능을 가진다면 더 자원을 절약할수 있을텐데... 왜 이렇게 만들었을까(12bit)... 고민 하였습니다. 분명히 저보다 내공이 높은 분들이 제품을 만든것이라 생가해서... 특별한 이유가 있겠다 싶어서요... 가만히 생가해보니... 이놈은 각도를 측정하는것이 아니라, 가속도를 측정하는 놈이였습니다. ㅎㅎㅎ;;; 그리고 2048만큼의 필요한 것은 제가 센서의 측정 모멘트를 2g로 설정하였고... 중력 가속도가 대략 1g라서.... 1/2 인 2048만 사용 되었던 것입니다 ㅠ.ㅠ 실험은 하지 않았지만... 6g 설정시... 1/6의 해상도가 출력 될듯 하군요 ㅠ.ㅠ;;;;
    왜 저는 이렇게 한심한 생각에 빠져서 살까요 ㅎㅎㅎㅎ;;; 아무쪼록 저같이 황당한 궁금증에 빠져서 사셔서 이런 생각을 하시는 분이 이글을 보고 간단하게 개념을 이해하시길;;;; 그리고 다시는 이런 길로 오지마시길;;;;

    • PinkWink 2010/05/26 17:51

      네... ^^.. 항상 그렇듯.. 시간이 중요하다기 보다는 스스로 알아가는 모든 학습이.. 가장 오래 기억이 남고.. 또 같은 실수를 다시는 하지 않게 되더군요...
      하시는 공부에 좋은 성과가 있으시길 바랍니다.^^

  • 박진원 2010/05/26 23:05

    ADC의 분주비에 대해서 여쭤볼려구 합니다.. ㅠ
    AVR의 경우 0 ~ 256 까지 분주비가 있는데 0에 가까울수록 변환 시간이 빠르고 빠릅니다. 256에 가까울수록 분주비가 느리고 변환 시간이 느립니다.
    그런데 분주비를 0에 두고 변환시간을 빨리 할 경우 값이 많이 차이가 납니다. 256의 분주비랑 0의 분주비에서 단순히 ADC 값을 받았을 경우...
    가속도 센서의 값을 단지 ADC로 받았는데 값이 엄청 다르네요..
    분주비를 빠르게 하면 분해능이 줄어든다도 하던데 그 이유 때문인가요..
    그렇다면.. 분주비를 무조건 가장 늦는 256으로 해야되는 건가요..
    최적의 분주비를 찾을 순 없는건가요.. ㅠ
    ADC를 다시 뒤적 거리다가 이렇게 찾아왔습니다.. ㅠ

    • PinkWink 2010/05/27 21:33

      ADC에서 분주비가의미하는 것입니다. 피크전압까지 몇등분하겠냐는 의미지요. 어떤 분주비를 선택하는가 하는 문제는 역시 디자이너의 선택입니다. ^^

  • 박진원 2010/05/27 23:51

    첨엔 그냥 당연히 분주비를 128로(가장 느린 분주비) 두고 가속도 센서로 각도를 구하곤 했는데 자이로 센서를 하면서 문뜩 의문도 들고 왠지 꼭 짚고 넘어가야 된단 생각에 0에서 128까지의 다양한 분주비를 하나 하나 모두 다 테스트 했습니다. 센서는 NTrex사의 MMA7260Q 3축 가속도 센서를 사용했습니다 ㅋㅋㅋㅋ
    ADC의 분주비를 바꿔가면서 테스트를 해 본 결과 분주비가 0에 가까울수록 값의 오차가 커졌습니다. 단순히 ADC값을 받는것, 각도 추출, 모든 곳에서 분주비가 128보다 높게 나왔습니다. 값을 그대로 사용하기에는 불가능할 정도였습니다. 분주비가 128에 가까울수록 분해능이 높다고 알고있는데 저는 수치를 엑셀파일에 저장했고, 그래프로 확인하고, 입력값들의 합계, 평균을 구했습니다. 필요하신분들은 말씀하시면 메일로 보내드리겠습니다. ^^; 굳이 필요할것 같진 않지만요 ㅋㅋ 암튼 제 개인적인 판단으로 그래프과 수치를 보고 판단한 결과 128의 분주비에서 가장 정확한 값이 나오는게 맞다는 판단을 했지만, 분주비가 16부터 32, 64 까지는 128과 비교해도 그래프상에서 육안으로 오차를 확인할 수 없고 입력 데이터들의 합계, 평균 모든면에서 거의 비슷한? 성능을 발휘했씁니다. ^^
    물론 그래프를 좀 더 정밀하게 해서 보게되면 약간 차이나는걸 미세하게나마 확인하실순 있을듯 한데 평균값도 거의 차이가 없고 비슷하게 나오네요.. ^^ 그래서 저처럼 빠른 반응 시간을 원하시는 분들은 16 분주비까지는 사용하셔도 무리가 없을거라 판단했습니다. 물론 또 실제로 구현시에는 좀 더 테스트를 해보고 128의 분주비와 비교도 필요하겠지만 나쁘지 않을껏 같습니다. ㅋㅋㅋ

    • PinkWink 2010/05/29 14:56

      좋은 경험이셨을듯합니다.. 그러나 그래프만으로는 객관적인 데이터라고 몰수는 없습니다. 뭔가 수치상으로 확인할 수 있는 것이 필요합니다. 에러의 RMS치를 구해서 비교를 해본다든지. 혹은 참값과 비교를 하기 어려운 실험환경에서라도.. 뭔가 수식화하면... 다른 누군가에게 설명할때 아주 깔끔하답니다. 더 나아가서는 학술적인 가치도 가질 수 있지요^^

  • 박진원 2010/05/29 23:16

    그렇군요~ ^^
    RMS수치란 평균을 말하는거 거죠? ㅋ 참고하겠 습니다. ㅋㅋ 필터를 적용 한 후엔 합계, 평균, 그래프 모두 분석을 했었는데.. ㅠ

    추가로, 디지털 필터를 적용했을땐 각도를 필터롤 걸러서 사용했는데 문득
    ADC값을 필터롤 걸러서 각도를 뽑아내면 좀 더 깨끗한 파형이 나오지 않을까 싶어서 한 번 해볼려구요 ㅋ 더 나아가서는 필터로 걸래는 ADC값으로 각을 추출하고 다시 필터로 걸러내면 어떨지.. ㅋ
    필터를 한 번 걸러내도 다음에 또 잡음이 생기는지 이론으로도 잘 모르겠네요.. ^^

    지금은 너무 급하게 서둘러서 대충대충가고 있다는 걸 제 자신도 잘 알고 있지만, 어쩔수가 없네요 ㅋㅋ 아직 제가 구현한 것들을 모두 제가 제것으로 만들진 못했지만 일단 결과물을 내고 좀 더 나아간 후 다시 처음으로 돌아와서 몰랐던 것들을 깊게 파고 들어가려고 합니다. ^.^
    그게 저 한테도 맞는거 같고, 동아리에서도 일단 결과물을 보여야 제가 하고싶은 과제에 대해서도 승락이 떨어지거든요 ^^; ㅋ
    일단 급하게 나간 후 다시 복습하면서 자세히 파고들어야겠어요.. ㅎ

    핑크윙크님 블로그 덕에 많은 정보를 얻고 또 궁금한 것들을 알아가고 정말 감사드립니다. ^^~*
    사시는 지역이 어디신지요~?
    혹 제가 그 지역으로 가게된다면 밥 한끼 꼭~!! 대접하고 싶네요. ^^

    • PinkWink 2010/05/30 01:28

      예.. 도움이 되었다니 다행입니다...
      항상 공학을 공부하는 사람들은
      (저도 잘 못해서 언제나 지도교수님께 야단을 맞지만 말이죠..ㅠㅠ)
      비판적이어야하는 것 같습니다.
      결과가 좋아졌습니다...
      ===> 어떤 환경에서?? 몇 %나 개선되었는지?? 등등 말이지요... 심지어
      ===> 내가 실험한 혹은 가상한 환경 내에서만 내것이 더 낳은 것은 아닌지
      하는 생각들이 필요한것같습니다.
      우리모두 화이팅입니다^^

  • 박진원 2010/05/29 23:37

    아~ 그리고 한 가지 더 궁금한게 있는데요^^;
    저는 각도를 구할 때 스케일펙터와 X축을 이용하여 구했거든요~?
    그런데 가속도 센서로 각도 측정과 그 한계를 보면 그냥

    각도 = ATAN(y/z) 이렇게만 되어이짜나요~? 그럼
    ADC 받은 y, z 값을 바로
    ATAN 함수를 이용해서 y를 z로 나누면 바로 각도가 나오나요~?
    ADC값을 바로 넣어서 해봤더니 안나와서요~ ^^;

    • PinkWink 2010/05/30 01:29

      BIAS는 시켜야합니다. 그리고 나면, 스케일팩터 같은 것은 곱하지 않아도 ATAN를 이용하면 각도가 나옵니다. 그것은 본문에 설명되어있지만, 스케일팩터도 뭔가를 곱하는 것이니... 나눕셈을 수행할때 그냥 약분되어버리기 때문입니다...^^

  • 2010/06/06 12:00

    비밀댓글입니다

    • PinkWink 2010/06/06 13:17

      예.. 타당해보이는 예상입니다만...
      그와 같은 예상을 해보는 것도 중요하지만
      간단히 실험을 해보시는 것도 괜찮을것 같은데요...

      그리고, 말씀하신 상황이라도, Z축은 생각보다 큰 영향을 받지 않습니다. 그래서 X/Z를 사용해도 큰 차이가 없을 수도 있습니다. 더구나, X/Z를 사용함으로써 불확실한 스케일팩터에 대한 걱정이 없어지고, 또한, 노이즈도 상당히 감쇠되는 것을 확인할 수 있습니다.

      그러나... 예전에도 이런 답변을 드렸던 것 같은데, 역시 디자이너의 선택이겠죠^^

  • 박진원 2010/06/07 20:30

    아, 그렇군요 ^^
    음.. 시간이 되면 다시 한 번 y/z를 사용해봐야 겠어요 ㅋㅋ
    그런데 제가 또 뭔가 실수를 한거겠지만 잘 안되더라구요 ^^;

    저번에 했던 식이

    각도 =
    atan(y축 현재 ADC값 - y축 오프셋 값 / z축 현재 ADC값 - z축 오프셋값)
    *180/3.141592

    이렇게 계산했었지 싶은데..

    다시 두축으로 계산하는 걸 알아봐야겠군요 ㅋ

    • PinkWink 2010/06/07 22:51

      참 희한한건 되다가 안되다가... 실수야 하는 거지만, 매번 다르게 혹은 같은 실수를 반복합니다. 그러다가 어느순간부터는 참 쉽게 됩니다. 과학은 참 특이하게 누군가 해 놓은것을 따라가는 데도, 처음엔 잘 되지 않다가... 갑자기 잘 되기 시작하더군요...ㅎㅎ^^

  • 박진원 2010/06/08 00:41

    그런가요~? ㅋ
    핑크윙크님이 그렇게 말씀하시니까 조금 위안이 되는데요? ㅋㅋ
    제가 워낙에 부족해서 매일 삽질?만 하다시피 하는거 같거든요..ㅠ

    가속도는 다 끝냈다 싶었는데 가속도도 여러가지군요...
    각도를 구하는게, 한축으로, 두축으로, 세축으로 구하는 방법...
    타이머를 사용해서 가속도?를 구하기도 하군요 ㅡㅡ..
    샘플링 시간을 사용해서요..
    음..
    막 주워담으며 빨리 빨리 오느라 정확하게 이해를 못하고 스쳐지나온게
    너무 많은거 같아요.. ㅎ
    기말고사를 준비하면서 가속도를 다시 처음부터 이해해야겠군요.. ^^
    원리와, 공식들의 차이? 그런것들도요.. ㅎ

  • 박진원 2010/06/08 01:05

    아~ 핑크윙크님~ 그럼 혹시
    //////////////////////
    한 축 < 두 축 < 세 축
    //////////////////////

    위 처럼세 축의 성분을 모두 이용한 각도가 가장 정확하게 나오는거 맞나요?

    • PinkWink 2010/06/08 12:48

      글쎄요.. 꼭 그렇다고는 말할 수 없는데....
      실제 확인해보질 않아서요....^^

  • 김태환 2010/06/30 01:53

    PinkWink님의 자료로 많은것을 배우고 있습니다.
    거기에 친절하게 매번 답해주시고 감사합니다.
    AM-3AXIS 가속도센서로 지금 각도를 찾고 있습니다.
    수평인 상태에서 X=1.52 Y=1.68 Z=2.48이 출력되고 있습니다.
    12비트 ADC를 하여 가속도를 아래와 같이 구했습니다.
    이곳 게시글을 참고해서요 http://cafe.naver.com/carroty/59522

    Acc_X = X_data[i];
    Acc_X *= (3.3/4096);
    Acc_X /= 0.8;

    Acc_Z = Z_data[i];
    Acc_Z *= (3.3/4096);
    Acc_Z /= 0.8;

    그리고 나서 atan(Acc_X/Acc_Z) * 180/PI 했는데 수평인 상태가 31도(1.63V) 정도 나오네요
    앞으로 기울리면 25도(1.26V)
    뒤로 기울리면 38도(2.00V)
    앞뒤로 기울렸을때 각도차이로는 +-7도 차이구요
    전압차이는 0.37V 입니다.
    그런데 눈짐작으로 봤을때도 수평에서 움직인 각도가 대략 40도 정도 움직인거같은데 7도 밖에 차이가 안나네요...
    0도부터가 안나온게 문제가 되는거 같은데...
    어떻게 수정해야 될까요?

    • PinkWink 2010/06/30 05:03

      수평인 상태에서 X=1.52 Y=1.68 Z=2.48의 값이 나온다고 하셨죠??

      그럼 일단 가속도센서는 x-y 평면에서 정확히 수평으로 놓여져 있지 않습니다..ㅠㅠ 왜냐면 x와 y값이 다르자나요...^^

      일단 그래서 일단 수평일때 x, y 모두 1.6이라고 그냥 가정하면,

      전체 수치에서 1.6을 모두 뺍니다. 그게 센터(0) 지점이니까요

      그럼,

      x = -0.08, y = 0.08, z = 1.88이 되는군요.응??? 그냥 예를 들어 하는 거니 제가 적는 수치에는 연연하지 마세요...ㅠㅠ

      그럼 x축을 중심으로 기울어진 각도는

      atan(-0.08/1.88)*180/pi = -2.43도 이고

      y축을 중심으로 기울어진 각도는

      위와 동일한데 부호만 다르므로 2.43도 입니다.^^

  • 김태환 2010/06/30 11:44

    아무리 수평이 안맞더라도 1~2도 차이 인데 처음 수평각이 1~2도가 아닌 31도가 나오는건 다른 문제가 아닌가요?
    지금 문제점을 정리 해보면 수평일때 유지 각이 0도가 아닌 31도가 나오구요
    앞뒤로 기울렸을때 차이는 +-6차이 입니다.
    각도기로 대충 기울기를 측정해보니 대략 +-20도 정도 되는데요...
    문제는 atan() 함수 안에 들어 가는 값이 위에서 구했던 값이 들어 가는게 아니고 다른 값이 들어 가는거 같던데.... ADC한 값에서 어떤 값이 들어 가야 하나요?

    • PinkWink 2010/06/30 11:59

      저... 음... 제가 바로 위에서 답을 드렸는데요...

      atan(1.52/2.48)이 아니라 수평의 센터값을 빼고
      atan((1.52-1.6)/(2.48-1.6))으로 하면 된다는 말씀입니다.

      다시 읽어보니 제가 제대로 답변을 안한것도 같네요..

      AccX, AccZ를 받았다고 치면 12비트 ADC라면

      ATAN( (AccX-2048)/(AccZ-2048) )

      만 해도 아마 각도가 나올겁니다.

      바로 위에 질문하신 수치 1.52, 1.68. 2.88을 가지고 할려고 하다보니 2048을 빼지 않고 1.6을 뺀 것입니다.

      제가 본문에서 밝혔듯 가속도 센서로 각도를 구할때는 센터값을 빼주기만하고 스케일펙터의 고려없이 바로 ATAN에 넣어줘도 각도가 나옵니다.

  • 김태환 2010/06/30 13:30

    PinkWink님께서 말씀하신대로 ADC값에서 수평의 센터값을 빼고 확인해보니 0도에서 +-20도 각이 나왔습니다^^
    그런데 수평의 센터값이 2048이 안나와서 수평상태에서 1250 값을 유지하고 있어서 1250을 뺐습니다.... 문제 없겠죠?
    아무튼 친절한 답변으로 많은 것을 배우고 있네요^^
    이제 하나 해결했으니 다음 단계로 넘어 가야겠습니다^^

  • 조현우 2010/07/28 20:12

    안녕하세요~
    3축가속도센서와 2축자이로센서를 이용해서 졸작을 진행중인 4학년입니다.
    여기서 좋은 정보를 너무 많이 봐서 일단 감사의 말씀 드리구요

    물어볼게 몇개 있는데요
    지금 해결해야할 과제가 가속도센서에 영향을 미치는 중력의 제거입니다
    여러 문서에서는 Zero_g Calibration의 방법이 나와있는데 적용이 잘 안되더라구요.

    참고로 저는 Z축이 고정된것이 아니라 여러 방향으로 움직이는 것을
    시나리오로 잡고 있스니다. (장갑에 달아서 이리저리 움직이는 것을 먼저
    트랙킹하려고 하구 있구요)

    그래서 나름 G값을 빼보려고 Z축을 기준으로 atan(x-center_x/z-center_x) atan(y-center_y/z-center_y)로 임시 각을 산출 했습니다. 하지만 Y축으로만 기울였을때 X와Z가 같이 줄면서 X축으로의 Roll각이 너무 크게 나와서 일단 몇가지 case를 적용시켜서 이를 막아놨는데요 .
    그래도 너무 불안정해서 문제가 있습니다.

    제가 해놓은건 측정된 [가속도의 값 - 9.8*sin(theta) ] 이런 식으로 일차적인 중력을 뺐구요.. 정지상태에서는 왁벽한 [0 0 0]을 가지고 있다가. 움직일때만 순수한 가속도를 얻고 싶은데 너무 어렵네요...
    현재 정지상태에서는 거의 [0 0 0]에 가깝지만 센서를 움직이게 되면
    매우 값의 변화가 심합니다.

    아직 필터는 거치지 않았구요..

    혹시
    중력을 제거하고 순수한 가속도를 얻을 수 있는 알고리즘이나 방법을
    알려주실수 있나요?

    자이로 센서를 이용한 각도 보정 글도 읽어봤는데
    사진이 많이 안나와서 제대로 이해를 못했습니다. ㅠ

    (아직 자이로만을 이용한 각도 산출도 실패했지만요..)

    그리고
    위의 예제를 보고 싶은데..
    파일이 안받아지네요 ㅠ 재업로드 가능하시다면..
    부탁드릴게요 ^^

    • PinkWink 2010/07/29 08:25

      사실.. 저도 가속도센서의 3축의 결과가 데이터시트에서 제시한 스케일펙터를 고려해서 계산했을때 오차가 생각보다 크더군요. 그래서 저는 복잡하게 생각하기도 싫고 해서.. 그냥.. 음.. 그냥.. 제가 제시한것처럼 사용한것입니다. (전 그렇게만 해도 되기때문에...)

      그리고, 오래된 글인 경우 티스토리가 사진을 안보여줄때가 간혹있긴 하던데, 제가 확인해볼때 사진과 첨부화일 모두 이상이 없던데요.. ^^
      (첨부화일은 단지 포스팅을 위해서 준비했던거라 제가 따로 가지고 있진 않습니다.)

  • 백언하 2010/08/11 20:00

    안녕하세요.
    매번 눈팅만 하다가 이렇게 또 질문을 하게 되었습니다...

    저는 ADXL345라는 가속도 센서를 쓰는데요.
    워낙 초보라 이해가 잘 안되는 부분이 있어서요..

    프로그램을 통해서 센싱 값이 들어오는데
    0 10 ff ee 0 d2
    --- ---- -----
    x y z

    이런 식으로 들어옵니다.
    인터넷이나 다른 분들이 하신 것을 보면
    ADC한 값이라고 해서 0부터 1024 사이의 값으로
    나오는 것 같은데요..

    데이타시트를 보면 output값이 2byte인데요.
    보통 축 값은 1byte int값으로 나타내는데 이걸 어떻게 나타내야될까요?
    그리고 이렇게 넘어오는 값은 ADC가 된 값인건가요??

    도저히 감을 못잡겠습니다ㅠ

    • PinkWink 2010/08/12 15:29

      실제 가속도값을 얻고 싶으신거라면, 데이터시트에 표시된 스케일팩터를 곱해주고, 물론 그 전에 십진수로 바꿔주시고, 보셔야할겁니다.

  • 아이엘 2010/09/29 17:27

    안녕하세요.
    핑크윙크님 글이 도움이 많이 되고있습니다.
    글을 남기는 이유는 다름이 아니고, 글을 읽다가 궁금한 것이 생겨서 말인데요

    3축 가속도 센서만으로 3차원 병진운동을 통한 그 좌표값을 알 수 있고,
    3축 회전을 통한 롤,피치,요 값을 알 수 있는 것 같은데.

    만약 사람이 그 센서를 손에 쥔 상태에서 가상의 평면을 기준으로(약간의 롤,피치,요 값의 오차가 있을 수 있고, 고정된 오차가 아니라 손의 움직임에 따라 랜덤하게 변화하겠죠) 병진운동을 한다면
    그 움직임을 3차원 좌표로 표현 할 수 있을까요?

    즉 자이로센서를 쓰지 않고, 평면에 대고 병진운동 한 것과 비교했을 때 그 오차가 크지 않은 결과값을 얻을 수 있을까 하는 질문입니다.

    • PinkWink 2010/09/29 21:56

      역시.. 테스트를 해봐야하는 부분일겁니다. 특히 가속도센서만으로 각도를 추정하는 것은 병진운동 성분이 얼마나 영향을 미치는지를 알아야만하고. 더구나 가속도센서로 거리를 측정하는것도 가속도센서의 결과에서 적분을 두분이나 수행해야하므로 단순히 적용해서는 거의 알 될 것입니다. 성능이 좋은 필터를 적용해야할 것으로 보입니다.

  • EQusJin 2010/11/05 15:12

    안녕하세요...
    윙크님이 맨 밑에 실험하신... 진자의 끝에 센서를 놓고 실험 했을 떄의
    그림을 보고 질문드립니다... 저도 지금 같은 문제를 겪고 있어서요...

    센서를 진자의 끝에 매달아서 흔들었다면...
    중력에 의한 변화와 회전에 의한 변화가 합해져서
    엔코더 값보다 더 큰 값이 나와야 하는게 아닌가 해서요...
    근데 값이 작게 나온게 왜 그런지 모르겟네요...;;;
    혹시 이 부분에 대해서 생각해 보신가 있는가 해서 질문 드립니다.

    병진운동 성분이 가속도값에 + 로 적용하지 않고 - 로 적용되는 이유가 궁금합니다.

    • PinkWink 2010/11/07 01:47

      그럴때도 있고 아닐때도 있습니다. 이 글의 그림은 어느정도 범위에서 적당히 두 그래프가 나타나게 하기 위해 실험을 좀 살살(^^?)한 것이구요^^

  • 이영주 2011/02/09 22:06

    안녕하세요 (__) 안드로이드 기반 커널단에서 이것저것 해보고 있는데, 공부겸 자료를 찾던 차에 오게 되었네요^^;

    포스팅 감사히 봤구요, 제가 질문드리려고 하는건 제 질문과 비슷한 내용의 글을 외국사이트에서 보고 약간 헷갈려서 인데요(http://www.physicsforums.com/showthread.php?t=220496)

    저 링크를 따라가보시면 해당 질문자가 사용하는 공식이 핑크윙크님의 공식과는 정반대인걸 확인했어요.. 덕분에 혼란스럽네요 ^^;;

    센서의 각 x, y, z 축 값을 이용한 연산이 어떤 의미를 가지게 되는건지, 조금만 더 자세히 설명해주시면 안될까요? 저 같은 초보를 구원해주십사..(__)

    아! 죄송한데 하나만 더 여쭤볼게요;;

    핑크윙크님 강좌는 대부분 MCU단에서 i2c나 SPI로 통신하는 론(?)을 다루시는데요

    저는 임베디드 리눅스에서 저런 통신없이 /dev/input/eventX 에서 들어오는 헥사값을 파싱해서 바로 사용하고 있어요

    지금 쓰는 보드는 안드로이드 2.2 를 탑재했고, 3축 가속도 센서는 bma150, Digital Compass는 hmc5843 을 탑재했는데요

    Digital Compass의 heading 정보를 얻고 싶은데 hmc5843의 기술문서에 의하면 tilt값과 Digital Compass의 각 축값을 이용한다고 돼있더라구요

    해서, 3축 가속도 센서를 tilt 센서 대용으로 사용하고 있는데, 값이 엄하게 나와서 고민중이에요

    bias를 해주고 싶어도 멍..해서 해주지도 못하고 ㅠㅠ

    제가 파싱해서 얻은 값을 아래에 써볼게요. 시간되시면 보시고 도움주시면 정말 감사할거 같습니다 (__)

    3-Axis Accelerometer
    ...
    Event Type 3 (Absolute)
    Event Code 1 (X-Axis)
    Value -383068
    Min -19613100
    Max 19613100
    Event Code 2 (Y-Axis)
    Value -306454
    Min -19613100
    Max 19613100
    Event Code 3 (Z-Axis)
    Value -10227925
    Min -19613100
    Max 19613100
    ...
    Digital Compass
    Event Type 3 (Absolute)
    Event Code 0 (X-Axis)
    Value -392
    Min -2047
    Max 2047
    Event Code 1 (Y-Axis)
    Value 881
    Min -2047
    Max 2047
    Event Code 0 (Z-Axis)
    Value 121
    Min -2047
    Max 2047
    ...

    • PinkWink 2011/02/10 08:55

      과거의 여러가지 실험과 또 개념을 생각해봐도.. 제가 틀린것 같지는 않습니다. 그러나 확실하지는 않습니다.^^ 제 포스팅에서 atan(X/Z)가 나오게 된 이유는 상당 그림에도 나와있습니다. 혹은 asin등을 사용하는 경우도 많습니다. 저의 경우는 대부분 MCU에서 데이터를 받아 그래프를 그릴때는 MATLAB을 이용한 경우가 대부분입니다. (다른걸 사용할줄을 몰라서요..ㅠㅠ) 그런데... 보여주신 데이터의 의미는... 음.. 잘 모르겠어요...ㅠㅠ 현재 제가 설날 불의의 사고로 인해 입원중이라 좀 몽롱한것도 있지만...ㅠㅠ 그리나 값의 변화가 좀 커보이는데요. 특히 센서가 수평상태인데도.. X,Y의 값의 차이가 크네요...ㅠㅠ

  • 이영주 2011/02/10 11:32

    아 저런.. 제가 그런것도 모르고 생각없이 질문만 덜컥 올려버렸네요;; ㅠㅠ 쾌차하시길 바랍니다 (__) 종종 놀러올게요~~^^

    • PinkWink 2011/02/12 09:39

      네 많은 도움을 드리지 못해 죄송합니다.^^

  • mijong 2011/02/25 18:05

    궁금한게있는데요
    엔코더가 뭐 인가요??

    제예상에는 각도를 측정하실려고 하신거 같은데

    찻다보니까 각도 측정 센서가 있더라고요..

    가속도 센서의 각 측정값을 비교 하기위해서 각도 측정 센서를 써도 되나요>???

    그리고 이상한게 그럼 도립진자로봇(벨런싱로봇 )만들때 굳이 칼만 필터나


    보상필터를 쓰지 않아도 만듥수 있나요

    • PinkWink 2011/02/25 18:23

      엔코더도 각도를 측정하는 센서입니다.^^
      그리고, 자이로-가속도 센서등과 관련된 글에서 엔코더가 등장하는 이유는 자이로나 가속도센서를 가지고 측정한 각도가 올바른지 확인하기 위해 비교용으로 사용하는거구요.
      밸런싱로봇은 상태가 두개입니다.
      로봇이 기울어지는 각도와 로봇이 이동한 거리 인데요.
      로봇이 기울어지는 각도는 제 경우엔 자이로센서와 가속도센서를 같이 사용을 했구요.
      로봇이 이동한 거리는 바퀴에 달려있는 엔코더를 이용해서 바퀴가 몇바퀴 돌았는지 측정했습니다.

  • mijong 2011/02/26 17:09

    엔코더 가 합쳐진 모터를 쓰셧나 보군요..

    아 혹시 엔코더를 쓰지 않고 로봇의 이동 거리를 측정할 방법이 있을까요??

    • PinkWink 2011/02/28 08:50

      네. .엔코더 내장형 모터입니다.
      뭔가를 측정하고 싶다면 당연히 센서를 써야겠죠..

      엔코더를 사용하시든...
      레이져 센서나 초음파 센서를 가지고 어떤 벽으로 부터의 거리를 측정하시든
      외부에 캅메라를 두고 영상으로 그 거리를 측정하시든...

      여러 방법이 있을겁니다.
      아마도.. 그중에 가장 간단한 방법이 엔코더일것입니다.^^

  • mijong 2011/03/02 14:58

    그 자이로 센서랑 가속도 센서에의한 각도랑 각속도의 값을 확인햇습니다.

    이제 이값들을 하이퍼터미널로 출력해서 pink님처럼 어떤 막대기를 달아서

    측정 할건데요,,, 그런데 엔코더 같이 정확하게 각도를 측정할 비교기가 없네요..

    그래서 그런데

    • PinkWink 2011/03/02 15:38

      참값과의 비교를 하고싶다는 생각이 들지 않으세요??
      내가 디자인한 결과물의 성능을 확인하고 싶자나요^^

  • mijong 2011/03/02 15:01

    1.가속도 센서를 2개 써서 1개는 비교기로 회전 중신에 달고(정확한 각도로가정..)

    하나는 병진운동 하는 끝에 달아서 가속도 센서의 각도측정의 한계를 보이고

    또 이와 같이 자이로 센서를 이용해서 적분의 오차가있음을 보일려고 하는데요..

    2.그리고 엔코더 가없으니 혹시 가속도 센서로 비교기 를 만들기 뭐 하면

    각도 센서로 하는게 낳을가요??

    • PinkWink 2011/03/02 15:41

      물론 그렇게 하셔도 될듯 하기는 합니다만,
      전 그런부분에서는 확고합니다.
      참값과의 비교는 어떤 센서든 혹은 어떤 알고리즘으로 만들어진 필터든 꼭 수행되어야할 과정입니다.
      각도센서든 뭐든.. 참값이라고 가정할 수 있는 수치와의 비교 말이죠.
      그런데 문제는
      그 비교할 대상이 정말 얼마나 정확해 줄 것인가하는 것이죠.
      전 엔코더를 이용한 것이고,
      다른 센서에 대해서는 고민해보지 않아 명쾌히 답변드릴 수가 없습니다.
      제가 드릴 수 있는 답변이란 고작
      "괜찮을지도 모르겠습니다..." 입니다.ㅠㅠ

  • mijong 2011/03/03 15:29

    엔코더는 어떤거 쓰셧나요???

    • PinkWink 2011/03/03 16:52

      http://pinkwink.kr/70 에서 소개되어있습니다.

  • mijong 2011/03/03 17:29

    근데요 이엔코더는 다른 드라이버나 따른 장치가 필요한가요???

    저는 그냥 하이퍼 터미널로 데이터값을 출력하려고 하거든요..

    atmega128쓰는데.. 그냥 엔코더에서 나오는 값을 해석 하면 각도가 나오나요???

    • PinkWink 2011/03/03 18:09

      그것은 제가 도와드릴부분이 아닙니다. 제가 사용한것은 Cortex-M3와 DSP 였는데 둘다 모두 엔코더 해석기능을 가지고 있었습니다. 그리고 해석을 했다하더라도 당연히 각도로 환산해주어야합니다.

  • mijong 2011/03/03 19:10

    cpu에 엔코더 해석 기능이 있다고요??

    음 그냥 엔코더의 값을 읽어 들여서 그값을 프로그래밍 상에서 해석하고

    각도로 환산 까지 같이 해줄수는 없나요??

    • PinkWink 2011/03/04 08:56

      이부분은 좀 그렇습니다. 엔코더는 A,B라고 해서 Z상을 제외하고 상이 두개 입니다. 이 두개의 상의 위상차를 이용해서 방향을 잡고, 펄스를 카운트해서 각도를 계산합니다. 엔코더의 사용방법에 대해서는 저는 다룬적이 없습니다.

  • mijong 2011/03/09 11:48

    엔코더 하나 학교에서 지원 받아서 살려고 하는데

    윙크 님은 어떤 엔코더를 추천하시나요??

    그리고 엔코더 해석 하려면 따른 엔코더 드라이버가 필요한가 보네요??/

    • PinkWink 2011/03/09 12:51

      한바퀴에 512펄스정도면 괜찮습니다. 모양리아 크기는 천차만별이니 선택하셔야하구요. 디바이스마트같은곳을 검색해보시면 됩니다. 사용하시는 MCU 별로 검색해보시면 아마 엔코더 해석법은 나올겁니다

  • mijong 2011/03/09 11:50

    그리고 혹시 각도 측정에 대해 많이 찻던중

    가변저항을 이용해서 측정하는 것도 있더라고요.

    가변저항으로 각도 측정 하는거는 어떻게 생각하시는지요????

    • PinkWink 2011/03/09 13:05

      아랫댓글은 의미없는것같아 삭제했습니다. ADC 방식의 말씀하신것은 흔히 포텐셔미터라고 부릅니다. 엔코더에 비하면 ADC 노이즈가 있을겁니다. 각도측정에 많이 사용하는데 괜찮을 겁니다. 그러나 역시 사용하고자하는 목적에 부합되는지는 설계자의 판단입니다.

  • starlsh 2011/04/17 23:02

    안녕하세요?

  • starlsh 2011/04/17 23:22

    안녕하세요?
    가속도센서에 대해 알고픈것이 있어 헤메이다가 PinkWink님의 블로그를 찾게되였습니다.
    외람되지만 한가지 질문할려고 합니다.
    저는 지금 안드로이드폰에 장착된 가속도센서로 작업을 하고 있는데요, 폰을 테이블우에 수평으로 놓고 x축과 y축으로의 이동거리를 구하려고 합니다. x축과 y축에 해당한 가속도값을 얻고 중력성분을 떼버리는데 까지는 하였는데... 값이 너무 산만하고 또 한축에서로 방향(정의 방향, 부의 방향)에 따라 양의 값과 음의 값이 달라지고 가속도값이다나니 한방향(정 혹은 부의 방향)에서도 가속과 감속에 따라 음의 값과 양의 값이 추출됩니다.
    그러다나니 이동방향을 잡기 힘듭니다.
    가속도센서로는 이동거리와 방향을 정확히 잡을수없는걸가요?
    만약 할수있다면 어떤원리에 기초해서 어떤 공식으로 실현해야 하는지...
    철없는 질문이지만 답변 좀 주세요…

    그리고 발을 상하셨다는데 수술후 운동치료를 잘 하셔야 합니다.
    저도 팔을 수술하였는데 운동치료를 잘 못해 지금도 약간씩 고생을 하고 있습니다… 빨리 완쾌되시기를…

    • PinkWink 2011/04/18 08:31

      자이로센서를 이용한 각도측정과 한계라는 글을 보시면 아시겠지만, 어떤 센서의 출력을 적분해서 원하는 것을 얻는 것은 아주 힘듭니다. 자이로센서의 경우만 봐도 한번만 적분하는 것인데도. 보정용으로서 다른 센서가 필요할 정도이거든요.
      가속도센서로 이동 거리까지 잡는 다는 것은 두 번의 적분이 수행되어야하므로 꽤 어려운 일이 됩니다. 그리고, 가속도센서로 방향만이라도 잡는 것도 생각보다는 어렵습니다. 방향은 '+'방향으로 진행하고 있지만, 그 가속도나 속도성분은 '-'방향일 수 있거든요.
      결론은 가속도센서만 가지고 이동거리와 방향을 잡는 것은 무지 어렵다는 것입니다.

  • starlsh 2011/04/18 13:42

    답변 감사합니다.

    • PinkWink 2011/04/18 17:32

      답변은 드렸지만, 도움은 못되드려 송구합니다.

  • Stdlib 2011/05/22 00:42

    안녕하세요.
    cortex lms-8962 보드에서 stdlib.h를 사용하려고 이것저것 알아보다. 들어오게 되었습니다. 포스팅하신내용와 크게 관련은 없어 보이나. 작성하신 코드에 stdlib가 인클루드 되어 있어 질문드립니다. 사용하고 싶은 함수는 malloc인데 혹시..사용하는법을 아시나요?

    • PinkWink 2011/05/22 08:01

      아.. 제가 하드웨어(펌웨어) 쪽은 이 글을 작성할 당시 빤짝 해본거였어요^^
      잘 모른답니다.
      도움이 되지 못해 죄송합니다.^^

  • 커피향기 2012/03/16 22:34

    안녕하세용~저기...PP:있으세용?아니..햄스터에대해서물어볼려구용..헤헤....저아직,13살이에용....헤..(햄스터초보랍니당~)

    • PinkWink 2012/03/17 12:09

      ㅎㅎ 이글에 댓글이 달려서 대학생이신줄 알았네요^^
      햄스터 잘 키우세요^^

  • 커피향기 2012/03/17 20:20

    감사해용~~(애교애교____)

  • 전병현 2012/10/26 18:47

    안녕하세요 매일 이곳글을 참고만 하다가 한가지 질문이 있어 질문하고자 합니다.
    우선 질문에 관련된 제가 하고있는 작업을 소개하자면...
    가속도센서와 자이로 센서를 부착한 물체의 이동 궤적을 추적하는것입니다.
    현재 두센서는 평행하게 위치한 상태로 함께 움직이게끔 되어있구요..
    원래 그냥 소프트웨어 개발잔데 몇년간 손놓고 있던 삼각함수와 미적분을 다시 건드리니
    머리가 많이 아프네요... 수많은 시도를 해보고 문제가 있어 이렇게 질문드리니 답변 부탁드릴게요

    만약 물체가 센서의 x축 +방향으로 이동후 정지시 (물체의 기울기와 방향은 변하지 않는다 가정합니다)
    가속도계의 x그래프는 +증가하였다 정점을 찍고 감소하여 -로되었다가 다시 정점을 찍고 0이 됩니다.
    이동후 물체가 멈춰있다면 이론상으로는 x그래프의 양수구간의 적분값과 음수 구간의 적분값이 같아서
    마지막 속도가 0이되어야 맞는데... 실제로는 어느정도 오차가 생깁니다.
    그리하여.. 실제론 물체가 멈춰있음에도 센서로 계산해낸 속도상으로는
    물체가 계속 등속도 운동을하고 있는첫처럼 보입니다.
    실제로 가속했다 감속하여 멈춘것이 아닌
    가속후 감속하여 저속으로 움직이는 경우와 같아지는것이죠

    질문을 정리하자면
    1)어떻게 하면 멈춘 상황의 오차인지... 단지 감속한 상태인건지를 판별할 수 있을까요?
    2)이러한 오차를 없앨수 있는 방법이 있는건지 알고싶습니다..
    3)실제로 가속도 센서와 자이로를 이용하여 트래킹하는 사용중이 시스템이 있는지 알고싶네요..
    4)실제로 신뢰성있는 시스템 개발이 가능할까요?

    읽어주셔서 감사합니다.

    • PinkWink 2012/10/26 19:35

      이와관련된 많은 질문들에 제가 항상 답변을 드리지만,

      실제 센서의 데이터를 단순히 적분한다는 것은
      많은 오차를 가지고 있습니다.
      실제 센서들이 가지는 노이즈, 오차등때문에
      이것이 적분되면서 꽤 많은 오차가 누적되기 때문입니다.

      결국, 아주 좋은 센서가 아니라면
      저가의 MEMS형은 결국 한 번의 적분만으로도 좋지 않은 결과가 나옵니다.

      그런데 가속도센서를 두 번이나 적분을 한다면, 그 결과는 뻔하지요.

      꽤 좋은 센서 0 바꿔 말하면 꽤 비싼 센서가 아니라면
      (혹은 비싸다고 하더라도, 결국 오차는 있습니다.)
      힘듭니다.

      그래서 많은 논문이나 자료를 보면, 아주아주 많은 필터에 대해 이야기를 합니다.

  • 심희석 2013/07/08 08:41

    안녕하세요 , 전 유비쿼터스 센서 네트워크 하다가 궁금한게 있어서 그러는데요
    통신을 zigbee로 하고 가속도 센서를 BMA150 을 써서 가속도의 값을 측정하려고 하는데요
    날아오는 데이터 값이
    0d 1d 01 d5 01 32
    x y z 이렇게 각각 상위비트 하위비트로 나눠서 16진수로 오는데
    이를 가시적으로 확인 가능한 데이터로 바꾸려면 어떻게 해야할까요?

    • PinkWink 2013/07/08 14:50

      정말 죄송합니다. 전 회로나 펌웨어 설계를 하는 엔지니어라 아니랍니다. 각각의 센서들에 대해서는 역시 해당 센서의 메뉴얼을 확인하는 것이 가장 좋을 듯합니다. 도움이 되지 못했네요...ㅠㅠ

  • 루도군 2013/08/31 19:31

    안녕하세요 가속도와 자이로 센서를 공부하고 있는 학생입니다.
    자료를 찾다가 우연히 들렸는데요. 현재 하고 있는게 자동차에 3축 자이로 가속도 센서를 달아서
    조향각을 구하려고 하는데요. z축 회전각, yaw각을 구해야 되는데 위에 공식에 넣으면 세타에 아크탄젠트 y/x로
    하면 될까요? 실험 하신 내용이 x축을 기준으로 회전하신거 같아서요. ㅎㅎ

    • PinkWink 2013/08/31 20:35

      조향각 즉, 위 글 기준으로 YAW 각을 얻고 싶다면, 하나의 센서가 더 필요합니다. 저가의 자이로라면 나머지 두 각도는 가속도센서와 함께 사용하면 되지만, YAW는 가속도센서로 보상할 수 없기 때문에 지자기 센서가 필요합니다.
      YAW, PITCH, ROLL을 모두 검출하기 위해 필요한것은
      3축 자이로
      3축 가속도
      3축 지자기 센서입니다.

1 ... 23 24 25 26 27 28 29 30 31 ... 37