개발자/Arduino

NANO33 BLE Sense 2 - LSM9DS1, 9축 IMU센서 실습

지구빵집 2020. 5. 10. 15:19
반응형

 

Arduino NANO33 BLE Sense 9축센서 정보 받아오기

 

Nano 33 BLE보드에 내장된 IMU는 “LSM9DS1” 이며 3축 가속도와 3 축 자이로, 3축 지자계 수치를 얻을 수 있다. 라이브러리를 얻으려면 Arduino Software (IDE)에서 라이브러리 관리자에서 설치하거나 ZIP 파일을 다운받아 압축파일로 설치하는 방법도 있다.

 

Arduino nano 33 BLE Sense 보드 모든 구성품 실습 강의

 

NANO 33 BLE Sense - 1. 온보드 RGB LED 실습

NANO 33 BLE Sense - 2. LSM9DS1, 9축 IMU센서 정보 활용

NANO 33 BLE Sense - 3. 기압 센서 사용해보기

NANO 33 BLE Sense - 4. 온습도 센서 HTS221 실습

NANO 33 BLE Sense - 5. 온보드 제스처 센싱 실습

NANO 33 BLE Sense - 6. 온보드 컬러 인식 RGB 센서 실습

NANO 33 BLE Sense - 7. 온보드 거리센서 실습

NANO 33 BLE Sense - 8. 더 살펴볼 것, 리소스와 더 많은 기능

 

 

온보드 9축 IMU 센서는 LSM9DS1으로, I2C 통신을 이용하여 데이터를 송신하고, NANO 33 BLE Sense에서는 "Arduino_LSM9DS1" 라이브러리를 통해 사용한다.

 

자이로 스코프 측정, 이미지 출처 https://www.mauroalfieri.it/elettronica/arduino-nano-33-ble-giroscopio-lsm9ds1.html

 

참고 이미지를 긴급하게 입수해서 올려드립니다. 20201115

 

이미지 https://www.researchgate.net/figure/Directionality-of-LSM9DS1-IMU-accelerometer-and-gyroscope-sensors-and-general-positioning_fig2_324101124  설명: Directionality of LSM9DS1 IMU accelerometer and gyroscope sensors and general positioning of the sensor and strap when placed on the hand.

 

LSM9DS1 칩에는 3축 가속도, 3축 자이로, 3축 지자기 센서가 들어 있다.

- 가속도 센서는 이동하는 물체의 가속도를 측정하는 센서로, 흔히 충격을 측정하는 목적으로 사용.

- 자이로 센서는 가속도 센서와 다르게, 각속도를 측정하는 센서입니다. 스마트 TV의 리모컨에 사용하며, 각 축의 회전을 감지한다.

- 지자기 센서는 커다란 자석인 지구의 S 극과 N 극을 이용해 움직임을 감지하는 센서.

 

아두이노 통합개발환경(스케치)에서 라이브러리 관리자에서 LSM9DS1 라이브러리를 아래 이미지를 참고하여 설치한다.

 

 

실습코드는 아래를 참고한다. 컴파일과 업로딩 시간은 오래 걸린다. 기다린다.

 

#include <Arduino_LSM9DS1.h>

void setup() {
  Serial.begin(9600);
  if (!IMU.begin()) { //LSM6DS3센서 시작
    Serial.println("LSM6DS3센서 오류!");
    while (1);
  }
}

float accel_x, accel_y, accel_z;
float gyro_x, gyro_y, gyro_z;
float mag_x, mag_y, mag_z;

void loop() {
  //가속도센서
  if (IMU.accelerationAvailable()) {
    IMU.readAcceleration(accel_x, accel_y, accel_z);
    Serial.print("가속도 센서 = ");
    Serial.print(accel_x);
    Serial.print(", ");
    Serial.print(accel_y);
    Serial.print(", ");
    Serial.println(accel_z);
  }

   //자이로센서
  if (IMU.gyroscopeAvailable()) {
    IMU.readGyroscope(gyro_x, gyro_y, gyro_z);
    Serial.print("자이로 센서 = ");
    Serial.print(gyro_x);
    Serial.print(", ");
    Serial.print(gyro_y);
    Serial.print(", ");
    Serial.println(gyro_z);
  }

   //지자계센서
  if (IMU.magneticFieldAvailable()) {
    IMU.readMagneticField(mag_x, mag_y, mag_z);
    Serial.print("지자계 센서 = ");
    Serial.print(mag_x);
    Serial.print(", ");
    Serial.print(mag_y);
    Serial.print(", ");
    Serial.println(mag_z);
  }

  delay(2000);
}

코드의 출처: Arduino NANO33 BLE 내장 9축센서 정보 받아오기

 

또다른 예제 코드와 아래 결과값을 확인한다.

 

#include <Arduino_LSM9DS1.h>

void setup() {
  Serial.begin(9600);
  while (!Serial);
  Serial.println("Started");
  if (!IMU.begin()) { // IMU센서를 초기화합니다. 초기화중 문제가 발생하면 오류를 발생시킵니다.
    Serial.println("Failed to initialize IMU!");
    while (1);
  }
}
float x, y, z; // 각 센서별로 XYZ값을 저장할 변수입니다.

void loop() {
  delay(500);
  if (IMU.accelerationAvailable()) { // 가속도 센서의 값을 출력합니다.
    IMU.readAcceleration(x, y, z); // x, y, z에 각 축별 데이터를 넣습니다.
    Serial.print("가속도 센서 - ");
    Serial.print(x);
    Serial.print('\t');
    Serial.print(y);
    Serial.print('\t');
    Serial.print(z);
    Serial.println(" G's");
  }

  if (IMU.gyroscopeAvailable()) { // 자이로 센서의 값을 출력합니다.
    IMU.readGyroscope(x, y, z);
    Serial.print("자이로 센서 - ");
    Serial.print(x);
    Serial.print('\t');
    Serial.print(y);
    Serial.print('\t');
    Serial.print(z);
    Serial.println(" degrees/second");
  }
  
  if (IMU.magneticFieldAvailable()) { // 지자기 센서의 값을 출력합니다.
    IMU.readMagneticField(x, y, z);
    Serial.print("지자기 센서 - ");
    Serial.print(x);
    Serial.print('\t');
    Serial.print(y);
    Serial.print('\t');
    Serial.print(z);
    Serial.println(" uT");
  }
  Serial.println();
  Serial.println();
}

코드출처: 9축 IMU 센서 사용하기

 

위 코드를 실행한 결과를 참고하자.

 

위코드를 실행한 결과

 

가속도, 자이로, 지자기 센서의 출력값이 정상적으로 표시됨을 확인한다. 이 값들을 이용해 충격의 강도를 감지해 RGB LED의 색상으로 알려주는 코드를 만들어 본다. 아래의 소스코드를 업로드 한다.

코드는 가속도 센서를 이용해 임계값을 설정하고, 임계값 이하일 때는 청색 LED가, 이상일 때는 적색 LED가 점등하도록 코드를 구성한다.

 

#include <Arduino_LSM9DS1.h>

float XYZaverage, PMGain1 = 0.15, PMGain2 = 0.05; // 임계값 설정

void setup() 
{
  pinMode(22, OUTPUT); // 적색 LED
  pinMode(23, OUTPUT); // 청색 LED
  digitalWrite(22, HIGH); // 온보드 RGB LED는 LOW상태일때 점등합니다.
  digitalWrite(23, HIGH);
  if (!IMU.begin()) {  // LSM9DSI센서 시작
    while (1)
      ;
  }
  float accel_x, accel_y, accel_z, sum = 0;
  for (int i = 0; i < 10; i++) {
    while (!IMU.accelerationAvailable()) {
    }
    IMU.readAcceleration(accel_x, accel_y, accel_z);
    sum += accel_x + accel_y + accel_z;
    delay(100);
  }
  XYZaverage = sum / 10;
}

float accel_x, accel_y, accel_z, sum;

void loop() {
  while (!IMU.accelerationAvailable()) { // 가속도가 측정되지 않으면 센서가 준비될 때 까지 기다립니다.
  }
  IMU.readAcceleration(accel_x, accel_y, accel_z); // 가속도를 측정합니다.
  sum = accel_x + accel_y + accel_z; // X, Y, Z 가속도값을 합쳐서 계산합니다.
  if (sum >= XYZaverage + PMGain1 || sum <= -1 * (XYZaverage - PMGain1)) 
  { // 임계값보다 높을 때 실행
    digitalWrite(22, LOW);
    digitalWrite(23, HIGH);
    delay(500);
  } 
  else if (sum >= XYZaverage + PMGain2 || sum <= -1 * (XYZaverage - PMGain2))
  { // 임계값보다 낮을 때 실행
             
    digitalWrite(22, HIGH);
    digitalWrite(23, LOW);
    delay(500);
  }
}

코드출처: 9축 IMU 센서 응용 예제

 

 

 

 

 

 

반응형