1. 제품 소개
이번에는 BMI160 6축 센서에 대해서 알아보겠습니다.
BMI160 센서 모듈은 3축(x/y/z) 가속도계와 3축 자이로스코프가 결합된 모듈입니다.
구매처가 설명하는 제품 정보는 다음과 같습니다.
작동전압: 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 라이브러리 포함하기로 추가해 줍니다.
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://sensibilityit.tistory.com/403
봐도봐도 무슨 말인지 확실히 알기가 힘드네요. 나이먹었나.... 쩝.
일단 센서가 잘 되는 걸 확인한 걸로 만족하고센서의 활용은 다음으로 미루겠습니다.
'아두이노' 카테고리의 다른 글
[모듈] 동작감지 센서 (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 |