반응형

3회에 걸쳐 Nano33 ioT 보드의 BLE 저전력 블루투스를 사용하는 다양한 방법에 대해 다루고자 합니다.  아두이노 나노33 보드시리즈는 콤팩트하면서 사용법이 아두이노 우노(나노)와 유사하여 쉽게 접근가능하고 여기에 더해 WiFi기능과 저전력 블루투스 기능을 활용할 수 있는 매우 장점이 큰 보드입니다. 다만 유사한 기능을 제공하는 ESP32 보드에 비해 단가가 조금 나가는 단점이 있지만 아두이노 정품 보드의 정통성?을 이어받아 안정적이고 불량률이 거의 없다는 점이 장점인 보드입니다.  기본적인 스펙과 사용법은 아래, 이전 게시글을 참고하시면 상세하게 파악할 수 있으니 참고해 보세요.

【 Nano33 IoT 선수학습 】

1. 【 아두이노Nano33#1】 NANO 33 IoT 처음사용 설명서

2. 【 아두이노Nano33#1-2】 NANO 33 IoT 처음사용 설명서 #1-2 (LSM6DS3 센서 테스트) (자이로센서 등등)

3. 【 아두이노Nano33#2】 NANO 33 IoT 처음사용 설명서 2편 WiFi 활용하기

 

【 학습 목표 】

<1편>  Nano33 기본 환경설정과 BLE 페어링 후 스위치로 LED On/Off 제어하기
      ① BLE(UUID)에 대한 이해와 nano33 BLE 사용을 위한 기본 환경 설정(보드&라이브러리 설치)
      ② Nano33 BLE  스캔과 페어링
      ③ Nano33 스위치회로와 LED회로 제작 후 블루투스(BLE)로 제어하기
      ④ 서보모터 스위치로 제어하기

<2 편> 블루투스로 도어(Door 문)  잠금장치(솔레노이드) 열고 닫기
      ① 주요 부품 소개 ( 솔레노이드 / 솔레노이드 잠금걸쇠 / 릴레이 )
      ② 도어 미니어처 제작 (3D 모델링과 3D 프린팅)
      ③ 블루투스(BLE)로 도어 열고 닫기

<3 편> 앱 인벤터(App Inventor) 만들고 스마트폰으로 도어 열고 닫기
      ① nRF Connect 앱 활용해 보기 (LED 기본 제어)
      ② 블루투스 스캔 및 연결과 같은 기본 앱 기능 만들고 LED 제어해 보기
      ③ 앱 안정성 높이고 연결하려는 BLE장치 바로 연결시키기
      ④ LED 제어와 Door 제어 결합된 앱 만들기

 

< Nano33 ioT 스펙과 기본 정보 >

Nano33 보드 시리즈 스펙 정보

 

Nano33 시리즈 핀 배열

 

<1편>  Nano33 기본 환경설정과 BLE 페어링 후 스위치로 LED On/Off 제어하고 서보모터까지 하기


      ① BLE(UUID)에 대한 이해와 nano33 BLE 사용을 위한 기본 환경 설정(보드&라이브러리 설치)

   - UUID란 ? 
  UUID는 Universally Unique Identifier의 약자이며 범용의 고유 식별자를 의미합니다.  네트워크 상에서 고유성이 보장되는  id를 만들기 위한 표준 규약으로서, 서로 모르는 많은 개체들을 식별하고 구별하기 위해서는 거의 중복되지 않는 각각의 고유한 이름이 필요한데요, 이를 구현하기 위해 128비트(16바이트) 길이의 값을 사용합니다. 
128비트의 길이는 2진으로 표현하면 대략 아래 예시와 같습니다.

1110110100 0101001001 0101010010 1010101011 1110101001 1010101010 1110101010 1010101001 0101010101 0101010101 1010010011 1110101110 01110101

128비트는 경우의 수(가지 수)가 2의 128승 이므로,  이를 굳이 계산해보면, 340,282,366,920,938,463,463,374,607,431,768,211,456  라는 어마 어마한 가지 수가 나오기 때문에, 실제적으로 겹치지 않는 ID를 가질 수 있다고 할 수 있습니다.  더군다나,  범위가 제한적인 WiFi 혹은 BLE 블루투스 네트워크에서는 현실적으로 겹칠 수 없는 고유 ID를 가질 수 있다고 할 수 있습니다. 
( 비트 단위의 가지 수 이해를 돕기 위해, 또 다른 예시를 들자면,  인터넷 IP부족으로 인해 32비트의 IPv4를 대신하여 128비트의 주소 길이를 가진 IPv6가 나왔습니다. 
 ○ IPv4는   8비트씩 4부분으로 10진수로 표시 →   220.123.103.253  (약 43억 개)
 ○ IPv6는 16비트씩 8부분으로 16진수로 표시 →   2201:0123:1adc:ffff:253d:a3d2:bc34:67da  (43억X43억X43억X43억 개)
  따라서 IPv6의 주소 범위는 0000:0000:0000:0000:0000:0000:0000:0000에서 ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff  이기 때문에 거의 무한대의 주소 개수를 사용할 수 있다고 할 수 있습니다) 

 그럼, 다시 UUID로 넘어와서,  그런데, 128비트나 되는 수를 2진수로 표현하면 너무 많은 자리 수를 차지하기에 이를 16진수로 표현하게 되는데요,  4비트가 각각 16진 한 자리를 차지하므로,  자리수로는 32자리가 되고 아래처럼 4개의 '-' 구분자를 넣어 표시하게 됩니다.  

19B10000-E8F2-537E-4F6C-D104768A1214    (8자리 - 4자리 - 4자리 - 4자리 - 12자리) 
'-' 구분자까지 포함하면 전체 자리 수는 36자리로 표현됩니다.

사실 UUID는 저전력 블루투스인 BLE 뿐 아니라, 데이터베이스, 시스템 인스턴스, JAVA5와 같은 코드에서 고유 식별자를 생성하기 위해 두루두루 사용되고 있습니다.  

UUID의 코드 구성은 아래와 같습니다. 

이미지 출처 :&nbsp;https://www.techtarget.com/searchapparchitecture/definition/UUID-Universal-Unique-Identifier

 UUID는 이런 규칙에 의해서 생성되기 때문에 동일한 UUID가 생성되어 충돌이 일어날 확률은 거의 0에 가깝다고 할 수 있습니다.   
 또한 UUID는 이런 규칙으로 생성시킬 수 있는 생성기(Generator)가 있으며,  대표적으로 아래 두 가지 사이트에서 제공되는 것을 많이 이용합니다. 
1.  온라인 UUID 제너레이터 :   https://www.uuidgenerator.net/  
2.  온라인 UUID 툴 : https://www.uuidtools.com/

위 사이트를 보면, UUID는 생성 방법에 따라 버전 1에서부터 버전 5까지 있는데요, 버전 1 또는 버전 4를 대표적으로 많이 사용합니다.  그래서 위 1 버전 또는 4 버전 둘 중 하나를 골라 생성 후 복사(copy)하여 사용하면 됩니다. 

<BLE 란?>
그럼 여기서 BLE에 대해 간략히 설명하자면,  BLE는  Bluetooth Low Energy의 약자로 기존 블루투스 통신의 약점인 소비전력을 크게 낮춘 블루투스 통신 방식이라 할 수 있습니다.  (Bluetooth LE로 표시하기도 함)
스마트워치나, 헬스케어 디바이스, 스마트폰과 연동되는 이어폰 및 다양한 기기 등, 배터리를 사용해야 하는 무선기기 간 통신이 늘어남에 따라 배터리 소모를 줄여줄 수 있는 기존 블루투스(Bluetooth Classic)를 개량한 통신형태가 필요했고 이에 나타난 것이 BLE 통신이라고 할 수 있습니다.  이런 과정에서 통신하고자 하는 기기간 식별을 위해 범용고유 ID식별 기술인 UUID 방식을 사용하고 있습니다. 

BLE 통신이 기존 블루투스 클래식(Bluetooth Class)에 비해 저전력인 이유는 기존 연결 방식은 연속적인 데이터 스트림으로 인해 지속적으로 전력을 소모하게 되는 반면에,   BLE는 동작 주기(duty cycle)가 수 밀리초(ms)로 가벼운 구동 방식을 취하며, 사용되지 않는 대부분 시간을 슬립 모드(sleep mode, 또는 절전모드)로 있어 전력 소모가 매우 적은 가장 큰 차이점이 있습니다. 
 그리고 2MHz의 대역폭을 사용하고 1Mbps의 전송 속도를 지원하지만 동작 주기가 짧아 평균 전송 속도를 낮출 수 있어  전력 효율을 향상할 수 있고 장치에 따라 배터리 교환 없이 1년 이상을 사용할 수도 있습니다.  따라서 저전력 블루투스 기술을 활용하면 전력소비를 크게 줄일 수 있는 통신 디바이스 또는 시스템을 구성할 수 있습니다.

기존 블루투스 클래식의 연결방식은 Master와 Slave의 방식으로 연결이 되는데요, Master가 Master 주변으로 주변에 있던 Salve에게 요청 신호를 넣고 슬레이브가 그에 응답한 뒤 페어링이 이루어지는 연결방식을 사용하고 있습니다. 

BLE 통신에서는 Central이라고 하는 Observer 역할의 중앙장치와 Peripheral이라고 하는 주변장치로 구분하여 통신하는데요, 
주변장치(Peripheral)가 주변에 일정간격으로 Advertise(일종의 라디오처럼 브로드캐스팅)하고 Central(옵저버-observer)이 스캔을 하여 페어링을 하게 되는 구조를 갖고 있습니다.  

이미지 출처 : Microchip
이미지 출처 : Microchip
이미지 출처 : Microchip

정리하자면, 
주변장치인 Advertiser (Broadcaster)는 Advertising Packet을 자신 주변으로 주기적으로 보내는 장치이며,
중앙장치인 Observer는  Advertiser가 보내고 있는 Advertising Packet을 듣기 위해 주기적으로 Scanning 하게 됩니다. 
그러다 연결하고자 하는 프로파일(Profile-서비스 묶음) 정보가 일치하게 되면 연결신호를 주고받고 승낙되면서 페어링 하게 됩니다.   이 과정에서 서비스 이름 및 특성(CHARACTERISTIC)과 UUID가 일치하는지 확인하게 됩니다. 

이미지 출처 : Random nerd tutorials lab


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

【 실습 준비 】

이번 실습을 위해 필요한 준비물입니다. 아래와 같은 재료를 준비하면 실습을 진행할 수 있습니다.

- Nano33 ioT 보드 X 2개 이상
- 브레드 보드(400핀 또는 840핀) X 2개 이상
- LED X 1개
- 저항 220옴(150Ω~470Ω 가능)  X 1개
- 저항 10K옴(4.7KΩ~10KΩ 가능)  X 1개
- 푸시 버튼(종류 모양 상관없음) X 1개 
- 서보모터(SG90 또는 MG90) X 1개
- 점퍼선(연결선) 또는 PCB헤더 3핀 이상 X 한 묶음

 

  ① BLE(UUID)에 대한 이해와 nano33 BLE 사용을 위한 기본 환경 설정(보드&라이브러리 설치)

그럼, 이제 Arduino nano 33 ioT 모듈과 BLE를 사용기 위한 기본적인 환경설정을 해볼게요. 

우선, 아두이노 IDE에서 nano33 ioT 보드를 인식하기 위해서는 보드 관련 라이브러리를 설치해야 하는데요, 아래처럼 "보드라이브러리"에서(그냥 라이브러리 관리자가 아님에 주의!)  "nano 33"으로 검색한 후 아래 분홍색 점선 박스의 보드 라이브러리를 설치해 주세요. ( 좀 더 상세한 사용법은 이 글 맨 위에 있는 "[선수학습] Nano 33 ioT 처음사용설명서" 게시글 링크를 참고해 주세요)

 

설치 후에는 아래처럼, 새로운 보드 그룹이 생겨나며 Arduino NANO 33 IoT를 선택할 수 있습니다. 

다음, BLE 기능을 사용하기 위해서는 "라이브러리 관리자"에서 "arduinoble" 라이브러리를 설치해야 합니다.

 

      ② Nano33 BLE  스캔과 페어링

arduinoble 라이브러리를 설치하게 되면, 관련 예제 파일들이 설치되는데요,  예제 파일에는 BLE 라이브러리를 사용해서  블루투스를 활용할 수 있는 내용으로 구성되어 있어 이를 응용해 볼 수 있습니다. 

스캔파일의 내용은 아래와 같습니다

#include <ArduinoBLE.h>

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

  // begin initialization
  if (!BLE.begin()) {
    Serial.println("starting Bluetooth® Low Energy module failed!");

    while (1);
  }

  Serial.println("Bluetooth® Low Energy Central scan");

  // start scanning for peripheral
  BLE.scan();
}

void loop() {
  // check if a peripheral has been discovered
  BLEDevice peripheral = BLE.available();

  if (peripheral) {
    // discovered a peripheral
    Serial.println("Discovered a peripheral");
    Serial.println("-----------------------");

    // print address
    Serial.print("Address: ");
    Serial.println(peripheral.address());

    // print the local name, if present
    if (peripheral.hasLocalName()) {
      Serial.print("Local Name: ");
      Serial.println(peripheral.localName());
    }

    // print the advertised service UUIDs, if present
    if (peripheral.hasAdvertisedServiceUuid()) {
      Serial.print("Service UUIDs: ");
      for (int i = 0; i < peripheral.advertisedServiceUuidCount(); i++) {
        Serial.print(peripheral.advertisedServiceUuid(i));
        Serial.print(" ");
      }
      Serial.println();
    }

    // print the RSSI
    Serial.print("RSSI: ");
    Serial.println(peripheral.rssi());

    Serial.println();
  }
}

Scan 파일은 아두이노 IDE의 예제 항목에 있지만, 필요한 경우 아래를 다운로드하여 압축을 풀고 사용해 보세요.

Scan.zip
0.00MB

특별한 회로 조립 없이 나노 33 보드만 PC와 연결하여 , 코드를 업로드하고 시리얼모니터 창을 열어보면, Nano33 보드 주변으로 블루투스 신호가 잡히는 것을 볼 수 있습니다. 

신호 중에는 일반 블루투스(클래식) 장치도 있고, UUID 서비스 이름과 UUID 고유번호가 보이는 BLE 장치도 검색된 것을 알 수 있습니다. 

 

 

    ③ Nano33 스위치회로와 LED회로 제작 후 블루투스(BLE)로 제어하기

< 1. LED 회로(주변장치-Peripheral) >

아래 연결도를 참고하여 주변장치(Peripheral)로 사용될 LED 회로를 준비해 주세요. 

[ 코드 - LED 회로 ]

./*  [ LED Peripheral (LED 회로)]  Server */

#include <ArduinoBLE.h>

BLEService ledService("19B10000-E8F2-537E-4F6C-D104768A1214"); // Bluetooth® Low Energy LED Service

// Bluetooth® Low Energy LED Switch Characteristic - custom 128-bit UUID, read and writable by central
BLEByteCharacteristic switchCharacteristic("19B10001-E8F2-537E-4F6C-D104768A1214", BLERead | BLEWrite);

const int ledPin = LED_BUILTIN; // pin to use for the LED

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

// 아래 코드는 시리얼 포트가 준비될 때까지 무한 대기하게 됩니다.
// 따라서 시리얼모니터 사용 없이 동작시키고자 한다면 아랫부분을 반드시 주석 처리해 주세요 
  while (!Serial);    

  // set LED pin to output mode
  pinMode(ledPin, OUTPUT);

  // begin initialization
  if (!BLE.begin()) {
    Serial.println("starting Bluetooth® Low Energy module failed!");

    while (1);     // BLE 서비스가 시작될 때까지 무한 루프
  }

  // set advertised local name and service UUID:
  BLE.setLocalName("LED");
  BLE.setAdvertisedService(ledService);

  // add the characteristic to the service
  ledService.addCharacteristic(switchCharacteristic);

  // add service
  BLE.addService(ledService);

  // set the initial value for the characeristic:
  switchCharacteristic.writeValue(0);

  // start advertising
  BLE.advertise();

  Serial.println("BLE LED Peripheral");
}

void loop() {
  // listen for Bluetooth® Low Energy peripherals to connect:
  BLEDevice central = BLE.central();

  // if a central is connected to peripheral:
  if (central) {
    Serial.print("Connected to central: ");
    // print the central's MAC address:
    Serial.println(central.address());

    // while the central is still connected to peripheral:
    while (central.connected()) {
      // if the remote device wrote to the characteristic,
      // use the value to control the LED:
      if (switchCharacteristic.written()) {
        if (switchCharacteristic.value()) {   // any value other than 0
          Serial.println("LED on");
          digitalWrite(ledPin, HIGH);         // will turn the LED on
        } else {                              // a 0 value
          Serial.println(F("LED off"));
          digitalWrite(ledPin, LOW);          // will turn the LED off
        }
      }
    }

    // when the central disconnects, print it out:
    Serial.print(F("Disconnected from central: "));
    Serial.println(central.address());
  }
}

(LED회로 코드 다운로드하기)

LED_Prep_ok.zip
0.00MB

 

< 2. 스위치(S/W) 회로 (중앙장치-Central) >

아래 연결도를 참고하여 중앙장치(Central)로 사용될 버튼 회로를 준비해 주세요. 

[ 코드 - 스위치(S/W) 회로 ]

/*  LED Control Central (버튼이 있는 회로) Client */

#include <ArduinoBLE.h>

// variables for button
const int buttonPin = 2;
int oldButtonState = LOW;

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

// 아래 코드는 시리얼 포트가 준비될 때까지 무한 대기하게 됩니다.
// 따라서 시리얼모니터 사용 없이 동작시키고자 한다면 아랫부분을 반드시 주석 처리해 주세요 
  while (!Serial);    

  // configure the button pin as input
  pinMode(buttonPin, INPUT);

  // initialize the Bluetooth® Low Energy hardware
  BLE.begin();

  Serial.println("Bluetooth® Low Energy Central - LED control");

  // start scanning for peripherals
  BLE.scanForUuid("19b10000-e8f2-537e-4f6c-d104768a1214");
}

void loop() {
  // check if a peripheral has been discovered
  BLEDevice peripheral = BLE.available();

  if (peripheral) {
    // discovered a peripheral, print out address, local name, and advertised service
    Serial.print("Found ");
    Serial.print(peripheral.address());
    Serial.print(" '");
    Serial.print(peripheral.localName());
    Serial.print("' ");
    Serial.print(peripheral.advertisedServiceUuid());
    Serial.println();

    if (peripheral.localName() != "LED") {
      return;
    }

    // stop scanning
    BLE.stopScan();

    controlLed(peripheral);

    // peripheral disconnected, start scanning again
    BLE.scanForUuid("19b10000-e8f2-537e-4f6c-d104768a1214");
  }
}

void controlLed(BLEDevice peripheral) {
  // connect to the peripheral
  Serial.println("Connecting ...");

  if (peripheral.connect()) {
    Serial.println("Connected");
  } else {
    Serial.println("Failed to connect!");
    return;
  }

  // discover peripheral attributes
  Serial.println("Discovering attributes ...");
  if (peripheral.discoverAttributes()) {
    Serial.println("Attributes discovered");
  } else {
    Serial.println("Attribute discovery failed!");
    peripheral.disconnect();
    return;
  }

  // retrieve the LED characteristic
  BLECharacteristic ledCharacteristic = peripheral.characteristic("19b10001-e8f2-537e-4f6c-d104768a1214");

  if (!ledCharacteristic) {
    Serial.println("Peripheral does not have LED characteristic!");
    peripheral.disconnect();
    return;
  } else if (!ledCharacteristic.canWrite()) {
    Serial.println("Peripheral does not have a writable LED characteristic!");
    peripheral.disconnect();
    return;
  }

  while (peripheral.connected()) {
    // while the peripheral is connected

    // read the button pin
    int buttonState = digitalRead(buttonPin);

    if (oldButtonState != buttonState) {
      // button changed
      oldButtonState = buttonState;

      if (buttonState) {
        Serial.println("button pressed");

        // button is pressed, write 0x01 to turn the LED on
        ledCharacteristic.writeValue((byte)0x01);
      } else {
        Serial.println("button released");

        // button is released, write 0x00 to turn the LED off
        ledCharacteristic.writeValue((byte)0x00);
      }
    }
  }

  Serial.println("Peripheral disconnected");
}

(스위치 회로 코드 다운로드하기)

LedControl_Cent.zip
0.00MB

 

 아래는 두 회로를 실제로 조립한 모습입니다.

나노33 BLE 주변장치회로(LED)와 중앙장치회로(스위치)

 

작업의 편의상 하나의 PC에 두 대의 아두이노를 연결하여 작업할 텐데요.

장치관리자를 열어서 연결된 포트를 확인하면 편합니다. (포트 번호는 PC에 따라 Nano33 보드에 따라 기본적으로 랜덤으로 할당됩니다.  다만 인식한 포트 번호에 마우스 우클릭 후 고급탭으로 들어가서 아래처럼 번호를 변경해 줄 수도 있습니다. )

아두이노 보드 연결 포트 번호 변경하는 방법

 

그리고, 하나의 PC에 아두이노 두 대를 연결해서 시리얼 모니터 통신을 하려면, 아두이노 IDE 상에서 nano33 보드가 각각 포트를 다르게 인식하도록 해야 하는데요,  만약, 코드 하나를 열고서 그 IDE에서 예제를 클릭하거나 열기로 불러오게 되면
  두 개의 아두이노가 같은 포트로 인식되어 시리얼 모니터를 이용한 통신이 안 됩니다.

우선 첫 번째 예제로 Central 항목에 있는 “LedControl” 파일을 열어주세요. 
앞서 설명한 대로 두 번째 예제 파일은 Arduino IDE 프로그램을 새로 실행시켜서 열어주세요.
두 번째 파일은 새로 실행된 IDE의 예제에서 Peripheral 항목에 있는 “LED” 파일을 열어주세요.

이때 각각의 nano33이 인식되는 포트가 다르게 어디로 할당되는지 확인해 주세요.

현재 LedControl 코드는 버튼 회로에 업로드해야 하기에 버튼이 있는 나노의 포트로 선택하세요.
마찬가지로 LED 코드는 LED가 연결된 회로에 업로드하기 위해 LED가 있는 나노를 선택하세요.
그리고 각각 코드를 업로드해줍니다.


두 개의 나노보드의 포트를 하나의 PC에서 각각 다르게 인식시키는 확실한 방법은,  해당 아두이노 코드를 각각 저장하고, 각각의 코드를 직접 더블 클릭해서 열면 됩니다. 

일단, 코드를 업로드해보세요,  그리고 바로 버튼을 눌러보세요.   그럼,  동작이 안 될 거예요.  
그리고 ' LedControl' 코드와 'LED'코드의 IDE에서 시리얼모니터를 각각 열어보세요. 그럼, 서로 페어링 되는 내용이 표시되고,  그런 다음 동작시켜 보면 아래처럼 동작이 잘 될 거예요.

 

여기서 다시, 시리얼(모니터) 통신 없이 전원을 연결하여 테스트해보면, 페이링이 되지 않고 동작도 되지 않을 거예요.
 
 그 이유는 LedControl 코드와 LED 코드에 기본적으로 아두이노 IDE의 시리얼 모니터가 열려야 동작되도록 하는 코드가 들어 있어 그렇습니다. 
아래 이미지에 보면,  while ( !Serial );  이라는 코드로 인해, 시리얼 모니터가 열리지 않을 경우 그다음라인으로 넘어가지 않도록 되어 있기 때문인데요,   이 부분을 주석처리하게 되면,   나노 33 보드들에 전원을 연결만 하게 되면 바로 페어링 되어 동작이 가능한 상태가 됩니다. 

주석처리 →    //  while ( !Serial );


이후 코드를 재업로드하고 테스트해 보면, 두 장치 모두 PC연결 없어도 페어링과 동작이 잘 됩니다. 

 

 ④ 서보모터 스위치로 제어하기

그럼 이제 두 번째 실습으로 버튼으로 서보모터를 구동시켜 보도록 하겠습니다.

아래 보이는 연결도를 참고하여 두 번째 회로를 준비해 주세요. 

[ 코드 - 서보모터 Peripheral 회로용 코드 ]

/*  Servo Peripheral (서보 회로)  Server */

#include <ArduinoBLE.h>
#include <Servo.h>    // 서보 라이브러리를 지정
#define servoPin 3    // 서보 모터핀을 지정
Servo myservo;          // 서보 라이브러리 객체를 선언
int pos=0;            // 현재 각도를 저장할 변수를 지정한다

BLEService myservoService("19B10000-E8F2-537E-4F6C-D104768A1214"); // Bluetooth® Low Energy Servo Service

// Bluetooth® Low Energy LED Switch Characteristic - custom 128-bit UUID, read and writable by central
BLEByteCharacteristic switchCharacteristic("19B10001-E8F2-537E-4F6C-D104768A1214", BLERead | BLEWrite);

// const int ledPin = LED_BUILTIN; // pin to use for the LED

void setup() {
  Serial.begin(9600);
//  while (!Serial);    
  
  myservo.attach(servoPin);   // 서보모터 핀을 설정한다
//  pinMode(ledPin, OUTPUT);

  // begin initialization
  if (!BLE.begin()) {
    Serial.println("starting Bluetooth® Low Energy module failed!");
    while (1);     // BLE 서비스가 시작될 때까지 무한 루프
  }

  // set advertised local name and service UUID:
  BLE.setLocalName("SERVO");
  BLE.setAdvertisedService(myservoService);

  // add the characteristic to the service
  myservoService.addCharacteristic(switchCharacteristic);

  // add service
  BLE.addService(myservoService);

  // set the initial value for the characeristic:
  switchCharacteristic.writeValue(0);

  // start advertising
  BLE.advertise();

  Serial.println("BLE Servo Peripheral");
}

void loop() {
  // listen for Bluetooth® Low Energy peripherals to connect:
  BLEDevice central = BLE.central();

  // if a central is connected to peripheral:
  if (central) {
    Serial.print("Connected to central: ");
    // print the central's MAC address:
    Serial.println(central.address());

    // while the central is still connected to peripheral:
    while (central.connected()) { 
      // if the remote device wrote to the characteristic,
      // use the value to control the LED:
      if (switchCharacteristic.written()) {
        if (switchCharacteristic.value()) {   // any value other than 0
          Serial.println("Servo turn on");
              myservo.write(180);   // 서보모터의 각도를 변경한다              
              delay(500); // 서보 모터의 각도가 변하는 것을 기다려 준다. 

              myservo.write(0);   // 서보모터의 각도를 변경한다              
              delay(500); // 서보 모터의 각도가 변하는 것을 기다려 준다.                  
        }
      }
          Serial.println(F("Servo turn off"));
    }

    // when the central disconnects, print it out:
    Serial.print(F("Disconnected from central: "));
    Serial.println(central.address());
  }
}

( 서보모터 회로용(Peripheral) 코드 다운로드 하기)

Servo_Prep.zip
0.00MB

 

이번 실습의 서보모터용 코드는 아두이노 코드는 ArduinoBLE 라이브러리를 사용한 예제 파일들을 베이스로 해서 서보모터 제어에 필요한 부분만 추가해 넣어주면 됩니다.   그리고 다른 부품이나 모듈을 사용한 응용실습을 하려 할 때도 이렇게 기존 예제 파일을 수정해서 작성하면 됩니다.

여기서,  버튼 회로는 실습 1과 동일한 Central 항목에 있는 “LedControl” 파일을 그대로 사용합니다. 
두 번째 서보회로 파일은 Peripheral 항목에 있는 “LED” 파일에서 서보모터 구동을 위한 코드를 추가해 주면 서보모터를 쉽게 제어할 수 있습니다. 

 

서보모터 사용에 대한 관련 자료는 아래 링크를 참고해 보세요.

【 아두이노 기초 】 #23 서보 모터 제어 1

【 아두이노 기초 】 #28 서보(Servo) 모터 제어 하기 1

【 아두이노 기초 】 #29 서보(Servo) 모터 제어 하기 2

【 아두이노 기초 】 #30 서보(Servo) 모터 제어 하기 응용

 

서보모터(SG90/MG90 모델)는 동작 전압이 4.8~6V인데,  보통 5V 정도를 별도로 공급해 주는 것이 좋습니다. 
영상에서는 임시로 나노보드의 3.3V 출력 단자로 연결하여 테스트해 본 것인데요. 
만약 모터에 부하가 가해질 경우 나노보드가 손상될 수 있으니 꼭 별도의 전원으로 동작시켜주세요. 
그리고,  실습이 아니라 실제 응용을 하고자 한다면, SG90보다 안정성이 좀 더 좋은 MG90 서보를 사용하는 것을 권해드리고,  동작 토크가 더 필요하다면 MG996R과 같은 하이토크 모델급 이상을 사용하는 것이 좋을 거예요.   또한 작동 범위(각도)도  90도, 180도 360도 등 다양하게 있으니 사용 목적에 맞는 서보모터를 선택하면 됩니다. 

그리고 서보모터를 브레드보드에 연결하기 위해서는 이런 PCB헤더라고 하는 핀을 사용하거나, 가지고 있는 점퍼케이블로 양쪽을 연결해 주면 됩니다.  
그럼 통신포트를 확인하고 서보모터 회로에 코드를 업로드해 주세요.  
이제 버튼을 눌러보면 잘 동작하는 것을 볼 수 있습니다. 

블루투스(BLE) 무선으로 서보모터 제어하기

그럼 이제 아래처럼, PC 연결을 제외하고 외부 전원 연결로 동작이 잘 되는지 테스트해 보세요. 

그럼 여기서 서보모터에 별도의 전원을 연결해 볼게요

이때 그라운드(GND)는 모두 동일하게 묶어주어야 합니다. 

그럼 아주 활기 있게 움직이며, 이 때는 서보모터에 부하가 어느 정도 걸려도 잘 동작될 거예요.

 

그리고 아래 이미지처럼, 무선 전원으로 9V 배터리를 연결해서도 동작이 잘 되는 것을 볼 수 있습니다. 

실습 #1 BLE로 LED와 서보모터 제어는 여기까지고요, 
다음 #2편 영상에서는 도어록 솔레노이드를 블루투스(BLE)로 제어해 보겠습니다. 

마지막으로 아래 실습 강의 영상과 함께 학습하시면 내용이해에 도움이 될 것으로 생각됩니다. 
감사합니다.  
https://youtu.be/eePGckOYSZs

 

반응형