1. 제품 소개

이번에는 BMI160 6축 센서에 대해서 알아보겠습니다.


BMI160 센서 모듈은 3축(x/y/z) 가속도계와 3축 자이로스코프가 결합된 모듈입니다.

구매처가 설명하는 제품 정보는 다음과 같습니다. 

https://www.aliexpress.com/item/1pcs-BMI160-Latest-Stance-Accelerometer-Gyroscope-module-6-Dof-inertial-Measurement-Sensors/32718555571.html


작동전압: 3.2V ~ 6V

전류소모: 1mA 미만

Acceleration optional ruler: ±2g/±4g/±8g/±16g
Gyro optional scale: ±125°/s, ±250°/s, ±500°/s, ±1000°/s, ±2000°/s
Accelerometer zero drift: ±40mg
Gyroscope zero drift: ±10°/s
Programmable frequency: 25/32Hz~1600Hz
6D detection and positioning
16-bit data output
Impact resistance: 10,000 gx 200μs
2 independent programmable interrupt generators
Built-in 1024 byte FIFO
Working temperature: -40 ° C ~ +85 ° C 


음.. 몇 개 빼고 나머지는 잘 모르겠네요. 가속도계나 자이로스코프의 민감도 같은 걸 설정하는 것도 가능해 보이기는 합니다.


핀 정보는 다음과 같습니다.

I2C, SPI 통신이 가능하며, 여기서는 사용하는 핀의 수가 적은 I2C 통신으로 테스트 해보겠습다.

I2C 모드 사용 시 주의점이 있는데, I2C 주소를 0x68 사용 시에는 SAO와 GND를 연결해줘야 한다고 합니다. 이번에는 0x68을 사용하도록 하겠습니다.


2. 회로도


아두이노 나노

 BMI160

 GND

 GND

 5V

 VIN

 A5(SCL)

 SCL

 A4(SDA)

 SDA

 

 SAO > 센서의 GND와 연결

 D2

 INT1


3. 실제 연결도

(실제론 아래의 예제에서는 INT1-D2 의 연결은 필요치 않습니다. 해당 연결은 다른 예제 사용 시 인터럽트 설정을 위해 필요합니다.)


4. 테스트용 예제 작성

github의 BMI160 관련 링크는 다음과 같습니다.

https://github.com/hanyazou/BMI160-Arduino

https://github.com/MHEtLive/MH-BMI160


위의 링크가 좀 더 내용이 자세하기는 한데 2년 전 것이라서, 아래 링크의 내용을 참고로 하기로 합니다.

예제도 accelGyro.ino 예제를 그대로 사용해 보기로 합니다.


먼저 라이브러리 추가가 필요합니다. 첨부한 zip 파일을 스케치 > 라이브러리 포함하기 > ZIP 라이브러리 포함하기로 추가해 줍니다.

MH_BMI160.zip


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
 /*!
  * accelGyro.ino
  *
  * I2C addr:
  *   0x68: connect SDIO(SAO) pin of the BMI160 to GND which means the default I2C address
  *   0x69: set I2C address by parameter
  *
  * Through the example, you can get the sensor data by using getSensorData:
  * get acell by paremeter onlyAccel;
  * get gyro by paremeter onlyGyro;
  * get both acell and gyro by paremeter bothAccelGyro.
  * 
  * With the rotation of the sensor, data changes are visible.
  *
  */
 
#include <MH_BMI160.h>
 
MH_BMI160 BMI160;
const int8_t I2C_ADDR = 0x68//0x69;
 
void setup(){
  
  Serial.begin(9600);
  delay(100);
  
  // BMI160 하드웨어 초기화 
  if (BMI160.softReset() != BMI160_OK){
    Serial.println("reset false");
    while(1);
  }
  
  // BMI160 I2C 주소 초기화
  if (BMI160.I2cInit(I2C_ADDR) != BMI160_OK){
    Serial.println("init false");
    while(1);
  }
}
 
void loop(){  
  
  int i = 0;
  int rslt;
  int16_t accelGyro[6]={0}; // int16_t: 16비트 integer형
  
  // 가속도계와 자이로 정보 모두 얻어옴
  // 넘겨준 accelGyro 파라미터는 데이터를 저장할 포인터
  rslt = BMI160.getAccelGyroData(accelGyro);
  
  if(rslt == 0){
    
    for(i=0; i<6; i++){
      
      if (i<3){ // 처음 3개가 자이로 데이터
        
        Serial.print(accelGyro[i]*3.14/180.0); Serial.print("\t");
      }
      else// 다음 3개가 가속도 데이터
        
        Serial.print(accelGyro[i]/16384.0); Serial.print("\t");
      }
    }
    
    Serial.println();
    
  }
  else{
    
    Serial.println("err");
  }
 
  delay(500);
}
cs


원래 예제의 getAccelData, getGyroData 부분은 함수 내용이 좀 잘못되어 있는 것 같습니다. 테스트 해 봤을 때 값을 제대로 받아오질 않았네요. 라이브러리의 cpp 파일을 수정하면 되겠지만 그건 나중의 일로...


5. 결과

6가지 값이 계속적으로 출력됩니다. 센서를 이리저리 움직여보면 그에 따라 값이 확확 바뀌는 걸 알 수 있습니다.

다만, 해당 값이 어떤 의미를 갖고 그 값을 어떻게 사용해야 하는지에 대해서는 따로 알아볼 필요가 있습니다.

그래서 검색을 해 보았는데, 이게 쉬운게 아니더군요.

https://sensibilityit.tistory.com/445?category=657462

https://embedscope.com/103

https://sensibilityit.tistory.com/403

https://hs36.tistory.com/39


봐도봐도 무슨 말인지 확실히 알기가 힘드네요. 나이먹었나.... 쩝.

일단 센서가 잘 되는 걸 확인한 걸로 만족하고센서의 활용은 다음으로 미루겠습니다.

'아두이노' 카테고리의 다른 글

[모듈] 동작감지 센서  (0) 2019.04.23
[모듈] 물 수위 센서  (0) 2019.04.22
[모듈] Raindrops Sensor 모듈  (0) 2019.04.19
[모듈] 4-LEDs 모듈  (0) 2019.04.19
아두이노에서 JSON 사용하기  (0) 2019.04.18

+ Recent posts