개발자/Arduino

Arduino NANO 33 BLE Sense 개발 가이드 3 - 센서 다루기

지구빵집 2020. 5. 1. 13:54
반응형

 

 

아두이노 nano 33 Sense에 대한 설명은 앞선 자료를 참고한다. 아래는 센서와 라이브러리 자료다. 라이브러리(영어: library)는 주로 소프트웨어를 개발할 때 컴퓨터 프로그램이 사용하는 일관성 있게 존재하는 자원의 그룹이다. 여기에는 구성 데이터, 문서, 도움말 자료, 메시지 틀, 미리 작성된 코드, 서브루틴(함수), 클래스, 값, 자료형 사양을 포함할 수 있다. 

 

Sensors and Libraries

 

 

Arduino Nano 33 BLE Sense 개발 가이드 강의 자료 목록

 

Arduino NANO 33 BLE Sense 개발 가이드 1 - 시작하기

Arduino NANO 33 BLE Sense 개발 가이드 2 - 훑어보기

Arduino NANO 33 BLE Sense 개발 가이드 3 - 센서 다루기

Arduino Nano 33 BLE Sense 개발 가이드 4 - 센서 종합 테스트

Arduino Nano 33 BLE Sense 개발 가이드 5 - BLE 통신 테스트

 

 

아래는 Nano 33 BLE Sense 보드 구성품의 데이터 시트다. 데이터 시트(Datasheet)란, 한마디로 각 전자부품의 사용 설명서다. 회로 설계할 때 고려해야 할 것들이 들어있는 설명서라는 말이다. 전자 제품을 사면 함께 들어있는 설명서처럼 데이터 시트도 제조사에 따라 그 형식과 내용이 조금씩 다르다. 요즘은 모든 전자부품 제조회사들이 pdf 형태로 데이터 시트를 제공하고 있어 쉽게 구할 수 있다. 데이터 시트에 대한 설명과 보는 방법에 대한 자세한 자료를 참고하기 바란다. (아래표의 출처 링크)

 

센서/모듈 이름

목적

데이터 시트

nRF52840

32Bbit, 64MHz MCU

링크

NINA-B306

Bluetooth

링크

LSM9DS1

9축 IMU센서

링크

LP22HB

대기압 센서

링크

HTS221

주변 온도, 상대 습도 센서

링크

APDS-9960

근접, 주변광, RGB, 제스처 센서

링크

MP34DT05

디지털 마이크

링크

 

 

센서 데이터 시트

 

IMU

LSM9DS1 (datasheet)

Microphone

MP34DT05 (datasheet)

Gesture, light, proximity

APDS9960 (datasheet)

Barometric pressure

LPS22HB (datasheet)

Temperature, humidity

HTS221 (datasheet)

 

위의 두 가지를 한번에 통합한 자료는 아래를 참고한다.

 

Sensor Name

 Parameters

 Links

LSM9DSI – ST Microelectronics

Accelerometer, Gyroscope, Magnetometer

LSMDSI Datasheet

Arduino_LSM9DS1 Library

LPS22HB – ST Microelectronics

Pressure

LPS22HB Datasheet

Arduino_LPS22HB Library

HTS221 – ST Microelectronics

Temperature and Humidity

LPS22HB Datasheet

Arduino_HTS221 Library

APDS9960 – Avago Tech.

Proximity, Light, Colour, Gesture

LPS22HB Datasheet

Arduino_APDS9960 Library

MP34DT05 – ST Microelectronics

Microphone

MP34DT05 Datasheet

Inbuilt-PDM Library

 

Nano 33 BLE Sense 보드에 있는 RGB LED를 테스트하는 코드다. 일치하는지 확인은 안 했지만 GPIO 22, 23, 24번 핀이 red, green, blue 색에 할당이 되었으니 아래 코드를 업로드하여 테스트하면 색깔이 변하는 것을 확인할 수 있다.

 

//Arduino Nano 33 BLE Sense RGB LED
//소스코드 출처: https://rootsaid.com/arduino-nano-33-ble-sense/
//last update: 2020.04.30

const int ledPin = 22;
const int ledPin2 = 23;
const int ledPin3 = 24;

void setup() 
{
	pinMode(22, OUTPUT);
	pinMode(23, OUTPUT);
	pinMode(24, OUTPUT);
}

void loop() 
{
    digitalWrite(ledPin, LOW);
    digitalWrite(ledPin2, LOW);
    digitalWrite(ledPin3, LOW);
    delay(1000);          
    digitalWrite(ledPin, LOW);
    digitalWrite(ledPin2, LOW);
    digitalWrite(ledPin3, HIGH);
    delay(1000);    
    digitalWrite(ledPin, LOW);
    digitalWrite(ledPin2, HIGH);
    digitalWrite(ledPin3, HIGH);
    delay(1000);
    digitalWrite(ledPin, HIGH);
    digitalWrite(ledPin2, LOW);
    digitalWrite(ledPin3, LOW);
    delay(1000);  
    digitalWrite(ledPin, HIGH);
    digitalWrite(ledPin2, LOW);
    digitalWrite(ledPin3, HIGH);
    delay(1000);  
    digitalWrite(ledPin, HIGH);
    digitalWrite(ledPin2, HIGH);
    digitalWrite(ledPin3, LOW);
    delay(1000);  
    digitalWrite(ledPin, HIGH);
    digitalWrite(ledPin2, HIGH);
    digitalWrite(ledPin3, HIGH);
    delay(1000);
}

 

아래는 센서 전체 코드이다. 출처는 상단 주석에 나와있다. 결과를 시리얼 모니터로 확인한 이미지도 아래에 나타낸다. 주의 할 점은 코드를 업로드 하고 바로 씨리얼 모니터 포트를 끊게 되어 있으니 업로딩을 완료하면 메뉴 > 툴 > 포트로 진입하여 다시 컴포트를 선택하고 시리얼 모니터를 확인하면 잘 나온다.

 

//센서 전체 테스트 코드
//Program to read sensor data and display on Serial Monitor
//소스 출처: https://circuitdigest.com/microcontroller-projects/arduino-nano-33-ble-sense-board-review-and-getting-started-guide
//last update: 2020. 04. 30 
//날 좋은데 일이라니~

#include <Arduino_LSM9DS1.h> //Include the library for 9-axis IMU
#include <Arduino_LPS22HB.h> //Include library to read Pressure
#include <Arduino_HTS221.h> //Include library to read Temperature and Humidity
#include <Arduino_APDS9960.h> //Include library for colour, proximity and gesture recognition

void setup(){
    Serial.begin(9600); //Serial monitor to display all sensor values

  if (!IMU.begin()) //Initialize IMU sensor
  { Serial.println("Failed to initialize IMU!"); while (1);}

  if (!BARO.begin()) //Initialize Pressure sensor
  { Serial.println("Failed to initialize Pressure Sensor!"); while (1);}

  if (!HTS.begin()) //Initialize Temperature and Humidity sensor
  { Serial.println("Failed to initialize Temperature and Humidity Sensor!"); while (1);}

  if (!APDS.begin()) //Initialize Colour, Proximity and Gesture sensor
  { Serial.println("Failed to initialize Colour, Proximity and Gesture Sensor!"); while (1);}
 }

float accel_x, accel_y, accel_z;
float gyro_x, gyro_y, gyro_z;
float mag_x, mag_y, mag_z;
float Pressure;
float Temperature, Humidity;
int Proximity;

void loop()
{
  //Accelerometer values
  if (IMU.accelerationAvailable()) {
    IMU.readAcceleration(accel_x, accel_y, accel_z);
    Serial.print("Accelerometer = ");Serial.print(accel_x); Serial.print(", ");Serial.print(accel_y);Serial.print(", ");Serial.println(accel_z);
  }
delay (200);

  //Gyroscope values
  if (IMU.gyroscopeAvailable()) {
    IMU.readGyroscope(gyro_x, gyro_y, gyro_z);
    Serial.print("Gyroscope = ");Serial.print(gyro_x); Serial.print(", ");Serial.print(gyro_y);Serial.print(", ");Serial.println(gyro_z);
  }
delay (200);

  //Magnetometer values
  if (IMU.magneticFieldAvailable()) {
    IMU.readMagneticField(mag_x, mag_y, mag_z);
    Serial.print("Magnetometer = ");Serial.print(mag_x); Serial.print(", ");Serial.print(mag_y);Serial.print(", ");Serial.println(mag_z);
  }
delay (200);

  //Read Pressure value
  Pressure = BARO.readPressure();
  Serial.print("Pressure = ");Serial.println(Pressure);
  delay (200);

  //Read Temperature value
  Temperature = HTS.readTemperature();
  Serial.print("Temperature = ");Serial.println(Temperature);
  delay (200);

  //Read Humidity value
  Humidity = HTS.readHumidity();
  Serial.print("Humidity = ");Serial.println(Humidity);
  delay (200);

  //Proximity value
  if (APDS.proximityAvailable()) {
    Proximity = APDS.readProximity();
    Serial.print("Proximity = ");Serial.println(Proximity);
    }
  delay (200);

  Serial.println("_____________________________________________________");
  delay(1000);
}

 

컴파일과 업로딩을 하고 결과를 봐야 하는데 보드는 자동으로 업로딩 포트를 끊는다. 

아래처럼 센서 데이터를 컴포트로 송신하는 아름다운 결과를 볼 수 있다.

 

 

위 코드를 한글로 작성하여 소스코드를 공개한 자료 링크 

 

 

 

위 첨부 이미지를 참고하여 아래 코드는 이제 모든 것이 작동하는지 빠르게 확인하기 위해 예제 프로그램을 사용할 수 있습니다. File-> Examples-> PDM-> PDMSerialPlotter에 제공된 프로그램을 사용해 봅시다. 이 프로그램은 온보드 마이크를 사용하여 오디오를 듣고 직렬 플로터에 플로팅 합니다. 프로그램을 업로드하고 보드와 IDE가 작동하는지 확인할 수 있습니다. 

 

pdm 정리자료 링크 + pdm 영문 pdf 자료 

 

arduino pdm 라이브러리 링크

 

/*
  This example reads audio data from the on-board PDM microphones, and prints
  out the samples to the Serial console. The Serial Plotter built into the
  Arduino IDE can be used to plot the audio data (Tools -> Serial Plotter)

  Circuit:
  - Arduino Nano 33 BLE board

  This example code is in the public domain.
*/

#include <PDM.h>

// buffer to read samples into, each sample is 16-bits
short sampleBuffer[256];

// number of samples read
volatile int samplesRead;

void setup() {
  Serial.begin(9600);
  while (!Serial);

  // configure the data receive callback
  PDM.onReceive(onPDMdata);

  // optionally set the gain, defaults to 20
  // PDM.setGain(30);

  // initialize PDM with:
  // - one channel (mono mode)
  // - a 16 kHz sample rate
  if (!PDM.begin(1, 16000)) {
    Serial.println("Failed to start PDM!");
    while (1);
  }
}

void loop() {
  // wait for samples to be read
  if (samplesRead) {

    // print samples to the serial monitor or plotter
    for (int i = 0; i < samplesRead; i++) {
      Serial.println(sampleBuffer[i]);
    }

    // clear the read count
    samplesRead = 0;
  }
}

void onPDMdata() {
  // query the number of bytes available
  int bytesAvailable = PDM.available();

  // read into the sample buffer
  PDM.read(sampleBuffer, bytesAvailable);

  // 16-bit, 2 bytes per sample
  samplesRead = bytesAvailable / 2;
}

 

pdm 마이크로폰 데이터 값의 출력 화면은 생략한다.

 

 

참고자료

 

ArduinoBLE library

ArduinoBLE library Github

Designing a two-axis gesture-controlled platform for DSLR cameras

Getting started with the Arduino NANO 33 BLE Sense

Getting Started with Arduino products

Use your Arduino NANO 33 BLE Sense on the Arduino Web IDE

Arduino Nano 33 BLE Sense Review - What's New and How to Get Started?

영감을 주는 Arduino Project Hub

Guide on the Arduino IDE

Nano 33 BLE Sense Project

 

하~ 늘 좋은 날이 지나간다.

별들의 바다를 건너 도착한 지구라는 행성은 우리가 살기에 너무 좁다. 지루하고 또 지루한 날들이 얼마나 지나야 신나는 날들이 올까? 생각해 보면 늘 신나는 날이다. 아무리 볕이 들지 않는 사무실에서 일에 파묻혀 지내더라도 가장 흥미진진하고 신나고 즐거운 삶이다. 이것을 이해해야 한다. 그렇게 산다.

 

 

arduino nano 33 BLE Sense 보드 RGB Test 반짝 반짝

 

 

 

 

 

반응형