본문 바로가기
WORK/Sotfware

[SENSOR] LIS2DH 6D Orientation detection source code

by KANG Stroy 2022. 9. 14.
728x90
728x90

LIS2DH 의 Accelerometer 의 6D 방향 관련 센서 레지스터 셋팅 입니다. 

참고 자료는 아래 PDF를 참고 하였습니다. 

LIS2DH12 Datasheet.pdf
1.36MB
LIS3DH_an3308-lis3dh-mems-digital-output-motion-sensor-ultralowpower-highperformance-3axis-nano-accelerometer-stmicroelectronics.pdf
1.95MB

6D 의 방향에 대한 부분 입니다. 

위와 같이 움직일 때 값을 확인 하기 위함 입니다. 

/* accelerometer interrupt occur function */ 
void LIS2DH12_INT1_handler(void)
{
	read_reg(0x31, value); /* INT1_SRC (31h): Read value from INT1_SRC */
	value &= 0b00111111; /* Bitwise AND operation */
	switch (value) /* Action dependent on orientation */
	{
		case 0x60:		printf("	TOP \r\n");					break;
		case 0x41:		printf("	RIGHT -------> \r\n");		break;
		case 0x42:		printf("	LEFT <-------- \r\n");		break;
		case 0x44:		printf("	UP UUUU \r\n");				break; 
		case 0x48:		printf("	DOWN \r\n");	 			break; 
		case 0x50:		printf("	BOTTOM  \r\n");				break;
		default:		break;
	}
}

int main(void)
{
	init_MCU(); /* Initialize MCU clock and pins */
	
    print("Starting program\r\n");
	/* Initialization of sensor */
    write_reg(0x21, 0x00); /* CTRL_REG2 (21h): IA1 enable high-pass filter bc */
    write_reg(0x22, 0x40); /* CTRL_REG3 (22h): IA1 interrupt on INT1 pin */
    write_reg(0x23, 0x00); /* CTRL_REG4 (23h): Set Full-scale to +/-2g */
    /* 6D orientation enable */
    write_reg(0x30, 0x7f); /* INT1_CFG (30h): INT1 Configuration */May 2018 DT0097 Rev 1 8/9
    www.st.com
    write_reg(0x32, 0x3A); /* INT1_THS (32h): INT1 Threshold set */
    write_reg(0x33, 0x00); /* INT1_DURATION (33h): INT1 Duration set */
    /* Start sensor */
    write_reg(0x20, 0x5f); /* CTRL_REG1 (20h): Start sensor at ODR 100Hz, Lowpower mode */
    
    HAL_Delay(1); /* Settling time 1ms */

	while (1)
    {
	   /* … */
    }
}

위와 같이 셋팅을 하였습니다. 

각도에 따른 Threshold 값 

Angle  Gravity Threshold
45 0.71 0x2C ( 44 ) 
50 0.77 0x2F
60 0.87 0x36
70 0.94 0x3A
80 0.98 0x3E
90 1.00 0x3F ( 62) 

각도에 따른 Threshold를 셋팅하는 레지스터의 값이 00 11 1111 만 셋팅이 가능하기 때문입니다. 

90도는 BIN 값은 ( 00  11 1111 = 0x3F 가 되죠 ) , 기울기의 값을 Threshold로 잡은 것입니다. 약 70 도 기울기가 발생을 하여야 인터럽트가(0x3A) 발생이 됩니다. 

지구의 중력은 " 1 " 입니다. 놀이 동산의 자이로드롭이나, 청룡열차 같은것은 이런 중력을 가지고 놉니다. 순간 떨어지는 순간 " 0 "의 중력가독도가 되면서 뜨는 현상이 발생이 됩니다. 이것은 무한도전에서 비행기를 타고 간접 무중력 체험을 하던것이 기억이 있을 것입니다. 

무한도전 세대가 아니라면 잘 모를거 같아서 아래와 같은 체험을 하였습니다. 비행기에서 순간적으로 떨어지면서 생기는 무중력의 상태를 만듭니다. 비행기를 타고 갈때 갑자기 뚝 떨어지는 현상을 격으면 짜증이 나기도 합니다. 그때 기장이 말하죠 기체 불안정이(난기류) 발생하였습니다.라고요. 꼭 비행기가 떨어질거라는 상상이 듭니다.  이때 순간적으로 중력이 떨어졌구나, 올라갔구나라는 생각을 하시면 웃음이 나오실려나요? 

엑셀센서는 이런 인터럽트 발생에 따라서 스위치 값을 설정 할 수 있습니다. 

TOP을 기준으로 하여서 왼쪽 오른쪽으로 기울기를 가져 가게 됩니다. 이때 자신이 어떻게 보느냐에 따라서 달라 질 수 있으니 테스트 하고 수정 하시면 되겠내요. 물체의 기준값을 어디로 해야 하는지는 프로그램 작성을 하시면서 기준점을 만드시면 되겠습니다. 

움직이는 물체의 좌우 방향 및 진행 방향을 알기 위해서는 엑셀 값과 자이로 센서를 같이 써서 상호 보완을 해 주시는게 좋을거 같습니다.

만약 엑셀 값을 진행 방향과 동일하게 앞뒤로 움직게 된다면? 값의 변화가 뒤짚어 지는 현상이 생깁니다. 자동차가 달리다가 급하게 엑셀을 달리면 앞뒤로 움직일 때가 있습니다. 이때 차량은 뒤집어 지지 않고 진행 방향과 정 반대로 움직이는 결과가 나오게 되는거죠. 물체가 뒤로 확 돌아 가는것을 만들기 위해서는 자이로 센서를 사용을 하던지, 약간의 프로그램 수정이 필요해 보입니다. 값을 수시로 확인하여 값을 보정하는것도 하나의 방법이겠내요. 

728x90

댓글