ESP32_Bluetooth활용 - 1

박찬영·2022년 5월 22일
1

ESP32_Study

목록 보기
1/5

MPU-6050센서 활용


ESP32와 MPU-6050 연결

ESP32MPU-6050
VCC3.3VVCC
GNDGNDGND
SDAD21SDA
SCLD22SCL

코드

#include <BluetoothSerial.h>
#include <Adafruit_MPU6050.h>           
#include <Adafruit_Sensor.h>
#include <Wire.h>

#if !defined(CONFIG_BT_ENABLED) || !defined(CONFIG_BLUEDROID_ENABLED)
  #error Bluetooth is not enabled! Please run     `make menuconfig` to and enable it
#endif
    
BluetoothSerial SerialBT;
Adafruit_MPU6050 mpu;

void setup(void) {
  Serial.begin(115200);
  SerialBT.begin("ESP32_test");
  Serial.println("connect");
  while(!Serial){
    delay(10);
  }
  Serial.println("MPU Gyro range");

  if(!mpu.begin()){
    Serial.println("We can't find MPU");
    while(1){
      delay(10);
    }
  }
  Serial.println("We found MPU");
  
  mpu.setAccelerometerRange(MPU6050_RANGE_8_G);
  Serial.print("Accelerometer range set to: ");
  switch (mpu.getAccelerometerRange()) {
  case MPU6050_RANGE_2_G:
    Serial.println("+-2G");
    break;
  case MPU6050_RANGE_4_G:
    Serial.println("+-4G");
    break;
  case MPU6050_RANGE_8_G:
    Serial.println("+-8G");
    break;
  case MPU6050_RANGE_16_G:
    Serial.println("+-16G");
    break;
  }
  
  mpu.setGyroRange(MPU6050_RANGE_500_DEG);
  Serial.print("Gyro range set to: ");
  switch (mpu.getGyroRange()) {
  case MPU6050_RANGE_250_DEG:
    Serial.println("+- 250 deg/s");
    break;
  case MPU6050_RANGE_500_DEG:
    Serial.println("+- 500 deg/s");
    break;
  case MPU6050_RANGE_1000_DEG:
    Serial.println("+- 1000 deg/s");
    break;
  case MPU6050_RANGE_2000_DEG:
    Serial.println("+- 2000 deg/s");
    break;
  }
  
  mpu.setFilterBandwidth(MPU6050_BAND_21_HZ);
  Serial.print("Filter bandwidth set to: ");
  
  switch (mpu.getFilterBandwidth()) {
  case MPU6050_BAND_260_HZ:    
 	Serial.println("260 Hz");
  	break;
  case MPU6050_BAND_184_HZ:
    Serial.println("184 Hz");
    break;
  case MPU6050_BAND_94_HZ:
    Serial.println("94 Hz");
    break;
  case MPU6050_BAND_44_HZ:
    Serial.println("44 Hz");
    break;
  case MPU6050_BAND_21_HZ:
    Serial.println("21 Hz");
    break;
  case MPU6050_BAND_10_HZ:
    Serial.println("10 Hz");
    break;
  case MPU6050_BAND_5_HZ:
    Serial.println("5 Hz");
    break;
  }

  Serial.println("");
  delay(100);
}

void loop(void) {
 if(SerialBT.available()){
  if(SerialBT.read() == 'S'){
     while(1){
       sensors_event_t a, g, temp;
       mpu.getEvent(&a, &g, &temp);
       if(SerialBT.read() == 'P'){
         SerialBT.println("stop");
         break;
       }
       SerialBT.print("X: ");
       SerialBT.print(g.gyro.x + 0.02);
       SerialBT.print(", Y: ");
       SerialBT.print(g.gyro.y - 0.02);
       SerialBT.print(", Z: ");
       SerialBT.print(g.gyro.z + 0.01);
       SerialBT.println();
       delay(500);
      }
    }
  }
}

코드 설명

#include <BluetoothSerial.h>  //블루투스를 위한 라이브러리
#include <Adafruit_MPU6050.h> //MPU센서 사용을 위한 라이브러리
#include <Adafruit_Sensor.h>  //일반적인 Asafruit사의 센서를 위한 기본적인 라이브러리
#include <Wire.h>             //I2C통신을 위한 라이브러리

위에는 밑에 코드들을 실행하기 위한 라이브러리들이다.


#if !defined(CONFIG_BT_ENABLED) || !defined(CONFIG_BLUEDROID_ENABLED)                  //bluetooth가 활성화 되어있는지 체크
  #error Bluetooth is not enabled! Please run `make menuconfig` to and enable it       //활성화 x일 경우 에러 표시
#endif

Buletooth 연결을 확인하는 코드이다.


BluetoothSerial SerialBT;
Adafruit_MPU6050 mpu;

블루투스와 MPU를 사용하기 위해 객체를 정의해준다.


Serial.begin(115200);
SerialBT.begin("ESP32_test");
Serial.println("connect");
while(!Serial){
  delay(10);
}
Serial.println("MPU Gyro range");

직렬로 시리얼 모니터와 통신하기 위해 Serial.begin을 써준다.
(뒤에 있는 숫자는 데이터 속도인 초당 비트이다.)
SerialBT.begin은 모든 것이 제대로 실행되었는지 확인을 위해 써준다. 그리고 옆에 블루투스 이름을 적어준다.
시리얼이 통신이 안될 경우 False, 통신이 되면 True로 바뀐다. 그것을 while로 확인.


 if(!mpu.begin()){
    Serial.println("We can't find MPU");
    while(1){
      delay(10);
    }
  }
  Serial.println("We found MPU");

MPU센서를 못찾을 경우 (begin을 이용하여 초기화)
esp32 초기화버튼을 눌러 줌으로 써 센서를 찾는다.
연결이 되면 We found MPU를 출력해서 알려준다.


  mpu.setAccelerometerRange(MPU6050_RANGE_8_G);
  Serial.print("Accelerometer range set to: ");
  switch (mpu.getAccelerometerRange()) {
  case MPU6050_RANGE_2_G:
    Serial.println("+-2G");
    break;
  case MPU6050_RANGE_4_G:
    Serial.println("+-4G");
    break;
  case MPU6050_RANGE_8_G:
    Serial.println("+-8G");
    break;
  case MPU6050_RANGE_16_G:
    Serial.println("+-16G");
    break;
  }

mpu.setAccelerometerRange()은 각속도계 측정 범위이다.
(우리는 각속도를 출력하지 않지만, 실제로 해본 결과 각속도도 같이 계산되어야 센서 판독값이 더 잘나온다.)


  mpu.setGyroRange(MPU6050_RANGE_500_DEG);
  Serial.print("Gyro range set to: ");
  switch (mpu.getGyroRange()) {
  case MPU6050_RANGE_250_DEG:
    Serial.println("+- 250 deg/s");
    break;
  case MPU6050_RANGE_500_DEG:
    Serial.println("+- 500 deg/s");
    break;
  case MPU6050_RANGE_1000_DEG:
    Serial.println("+- 1000 deg/s");
    break;
  case MPU6050_RANGE_2000_DEG:
    Serial.println("+- 2000 deg/s");
    break;
  }

mpu.setGyroRange()은 자이로센서의 측정 범위 설정를 해준다.
더 민감한 출력의 응답을 얻을려면 초당 더 작은 각도를 설정하면 된다.
(우리는 500도를 선택했다.)


 mpu.setFilterBandwidth(MPU6050_BAND_21_HZ);
  Serial.print("Filter bandwidth set to: ");
  
  switch (mpu.getFilterBandwidth()) {
  case MPU6050_BAND_260_HZ:
  	Serial.println("260 Hz");
  	break;
  case MPU6050_BAND_184_HZ:
    Serial.println("184 Hz");
    break;
  case MPU6050_BAND_94_HZ:
    Serial.println("94 Hz");
    break;
  case MPU6050_BAND_44_HZ:
    Serial.println("44 Hz");
    break;
  case MPU6050_BAND_21_HZ:
    Serial.println("21 Hz");
    break;
  case MPU6050_BAND_10_HZ:
    Serial.println("10 Hz");
    break;
  case MPU6050_BAND_5_HZ:
    Serial.println("5 Hz");
    break;
  }

  Serial.println("");
  delay(100);
}

mpu.setFilterBandwidth()은 대역폭을 설정해준다.
이것은 모든 불필요한 주파수가 걸러지고 더 부드럽고 깨끗한 출력이 얻어는데 사용된다고 한다.
여기서는 저역 통과 필터가 사용되었다.
저역 통과 필터는 자이로스코프 출력에 잘 쓰이고,
이것은 저주파의 신호만 골라낼 때 많이 사용한다. (보다 정확한 값을 얻기 위해)


if(SerialBT.available()){
  if(SerialBT.read() == 'S'){
     while(1){
       sensors_event_t a, g, temp;
       mpu.getEvent(&a, &g, &temp);
       if(SerialBT.read() == 'P'){
         SerialBT.println("stop");
         break;
       }
       SerialBT.print("X: ");
       SerialBT.print(g.gyro.x + 0.02);
       SerialBT.print(", Y: ");
       SerialBT.print(g.gyro.y - 0.02);
       SerialBT.print(", Z: ");
       SerialBT.print(g.gyro.z + 0.01);
       SerialBT.println();
       delay(500);
      }
    }
  }
}

loop안에 있는 모든 코드이다. SerialBT.read를 사용해 블루투스 시리얼에서 보내는 신호를 받고 그것이 S일 경우 X, Y, Z의 값을 받아온다.
delay는 0.5초로 설정했다.
만약 P를 받을 경우 센서 판독값을 받아오는 것을 멈춘다.


참고 사진

profile
안녕하세여

0개의 댓글