반응형

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 활용하기

4. 【 아두이노Nano33#3】 NANO 33 IoT BLE 저전력 블루투스 사용설명서 #1 (BLE로 LED & 서보모터 제어하기)

 

1편에서는 BLE와 UUID가 무엇인지? 통신하는 방식에 대해 알아보았고BLE를 이용해서 LED와 서보모터를 간단히 제어해 보았습니다. 

이번 2편에서는 BLE 통신으로 릴레이 모듈을 이용한 도어 솔레노이드를 제어해 보겠습니다.
아울러 사실감을 주기 위해 미니어처 도어를 3D프린팅 하여 보여드리려고 합니다.
다음 3편에서는 스마트폰으로 제어해 볼 수 있도록 앱인벤터를 활용하는 것까지 다루어 보겠습니다.
사전 준비로 Nano33 ioT 보드를 사용하기 위한 환경 설정과 예시 코드는 1편을 참고해 주세요.

【 학습 목표 】

<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 시리즈 핀 배열

 

<2편>  Nano33 ioT 블루투스(BLE)로 도어록 솔레노이드 제어하기

 

【 실습 준비 】

이번 실습을 위해 필요한 준비물입니다. 아래와 같은 재료를 준비하면 실습을 진행할 수 있습니다.
스위치가 연결된 보드는 실습 1)의 재료와 연결이 같습니다. 

- Nano33 ioT 보드 X 2개 이상
- 브레드 보드(400핀 또는 840핀) X 2개 이상
- LED X 1개
- 저항 220옴(150Ω~470Ω 가능)  X 1개
- 저항 10K옴(4.7KΩ~10KΩ 가능)  X 1개
- 푸시 버튼(종류 모양 상관없음) X 1개 
- 도어록 솔레노이드 & 걸쇠 (모델명 SM1054, 12V, 0.6A  / 또는 6V SM1054S 원형헤드) X 1개
- 점퍼선(연결선) 또는 PCB헤더 X 한 묶음

 

 ① 주요 부품 소개 ( 도어록용 솔레노이드 2종 및 걸쇠 /  릴레이 / USB 다중 커넥터 & 5V 전원공급기 )

< 솔레노이드(도어록) 제품 규격 및 사이즈  >

 

또는 아래와 같은 제품도 사용해 볼 만합니다.  작동전압은 6V이며, 0.57A 전류를 소모합니다. 

 

 < 도어록용 걸쇠 >

 < 릴레이 >

( ※ 5V 출력이 지원되는 아두이노 우노/나노의 경우는 직접제어가 가능하지만 Nano33ioT 보드는 보드에 있는 특정핀의 납땜 등의 조치를 하지 않는 이상 3.3V의 출력만 사용할 수 있기 때문에 그 상태에서는 보드에서 릴레이 직접제어는 보드 손상을 초래할 수 있어 삼가야 합니다.)

실습에 사용된 릴레이는 5V입력 전원으로 동작되고 교류전원 250V 10A까지 제어되는 모듈입니다.

 릴레이 사용법 
 - 릴레이는 코일에 전류를 흘려 코일의 유도 작용에 의해 접점을 On / Off 해주는 스위치입니다. 
 - 이를 이용하면, 낮은 전압(예, 5V)으로 220V의 전원을 끊거나 연결시킬 수 있습니다.
 - 좌측 IN에 HIGH(또는 LOW) 신호가 가해지면 Com단자와 NO 단자가 연결되어 스위치 형태로 작동됩니다.
 - NC (Normal Close : 평상시 연결되어 있음)   
 - NO (Normal Open : 평상시 열려 있음, 연결 끊어짐) 

  - NC단자와 Com 단자가 디폴트로 연결되어 있고, 릴레이가 동작이 되면 이 연결이 끊어지고,
    Com단자가 NO단자와 연결이 됩니다. 이 부분을 전기제품이나 콘센트의 한쪽 부분의 연결을 끊어 
    스위치 형태로 구성할 수 있습니다.

 

※ 릴레이는 작동 방법에 따라 두 가지 종류가 있습니다.   신호(Signal) 라인 In으로 High 신호가 입력되면 작동(Trigger)되는 High Level Trigger 타입이 있고,   Low 신호가 입력되면 작동되는 Low Level Trigger 타입이 있습니다. 
보통 High Level Trigger 타입을 사용하면 좀 더 직관적으로 편하게 사용할 수 있습니다.   이 번 실습에도 High Level Trigger 타입의 릴레이를 사용하고 있습니다. 

 

통신을 위해서는 송수신 회로가 필요한데,  BLE통신에서는 중앙회로(Central-버튼 회로)와 주변회로(Peripheral-릴레이 솔레노이드 회로)로 부르며,  버튼이 들어간 중앙회로는 지난 1편의 회로와 동일하기 때문에 이번 편에서는 솔레노이드 회로(Peripheral) 제작만 설명드리겠습니다.  1편의 내용을 보고 버튼회로도 함께 준비해 주세요.
우선, 버튼회로 도면을 보여드리면 아래와 같습니다.


아래가, 솔레노이드가 연결된 릴레이회로 도면입니다.

이번 실습에서는 어느 정도 크기가 있는 솔레노이드는 12V 정도를 사용하는데요.  이 것을 아두이노 보드 출력으로 직접 제어하기는 어렵기 때문에 릴레이라는 모듈을 사용합니다. 
이번 실습에 사용될 솔레노이드는 DC12V 정격입력이지만, 구하기 쉬운 9V건전지와 7.4V 리튬폴리머 배터리를 사용해 볼게요.  솔레노이드에 다이오드를 연결해 놓았는데, 코일로 구성된 부품은 작동 시 역기전력이 발생하는데요. 이로부터 회로를 보호하기 위한 부품으로 되도록 연결해 주는 것이 좋습니다. 

비교적 구하기 쉬운 9V 4각 건전지로 솔레노이드 동작을 위한 전원 연결한 모습
RC카 등에 많이 사용되는 7.2V 리튬폴리머 배터리로 솔레노이드를 동작시키는 모습


이번 회로에서는 전원이 3가지나 들어가는데요(위 그림 참조), 아두이노 3.3v 출력 단자로 릴레이 전원을 대체하려고 한다면 Nano보드가 손상될 수 있으니 주의해 주세요!

그리고 종류가 다른 전원들을 하나의 회로에 사용하고자 할 때는 GND(-)는 모두 연결해 주어야 합니다. 

[ 동작을 위한 아두이노 코드입니다. ]

버튼회로 코드는 아두이노 IDE의  ArduinoBLE》Central 》LedControl 예제를 기본으로 해서 수정 사용합니다.

< 버튼회로 (중앙장치 Central) 코드 >

/*  Relay 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 - RELAY 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() != "RELAY") {
      return;
    }

    // stop scanning
    BLE.stopScan();

    controlRelay(peripheral);

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

void controlRelay(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 Relay characteristic
  BLECharacteristic relayCharacteristic = peripheral.characteristic("19b10001-e8f2-537e-4f6c-d104768a1214");

  if (!relayCharacteristic) {
    Serial.println("Peripheral does not have RELAY characteristic!");
    peripheral.disconnect();
    return;
  } else if (!relayCharacteristic.canWrite()) {
    Serial.println("Peripheral does not have a writable RELAY 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
        relayCharacteristic.writeValue((byte)0x01);
      } else {
        Serial.println("button released");

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

  Serial.println("Peripheral disconnected");
}

 

릴레이회로 코드는 1편에서 사용하였던 ArduinoBLE》Peripheral 》LED 예제를 사용하면 됩니다.

< 릴레이회로 (주변장치 Peripheral) 코드 >

/*  Relay Peripheral (Relay가 연결된 회로)  Server */

#include <ArduinoBLE.h>

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

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

const int relayPin = 2; // pin to use for the Relay

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

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

  // set RELAY pin to output mode
  pinMode(relayPin, 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("RELAY");
  BLE.setAdvertisedService(relayService);

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

  // add service
  BLE.addService(relayService);

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

  // start advertising
  BLE.advertise();

  Serial.println("BLE RELAY 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 RELAY:
      if (switchCharacteristic.written()) {
        if (switchCharacteristic.value()) {   // any value other than 0
          Serial.println("Relay on");
          digitalWrite(relayPin, HIGH);         // will turn the LED on
        } else {                              // a 0 value
          Serial.println(F("Relay off"));
          digitalWrite(relayPin, LOW);          // will turn the LED off
        }
      }
    }

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


< 코드 다운로드 >
위 두 가지 코드를 압축하였으니 다운로드하여 사용해 보세요. 

03. Relay.zip
0.00MB

 

코드 내용을 살펴보면 릴레이가 연결된 핀 번호를 정확하게 적어주어야 합니다. 
그리고 사용할 서비스 UUID와 특성 UUID를 예시에 있는 것 말고 다른 번호로 변경하고 싶다면 아래 UUID 생성 사이트를 이용하세요 uuidgenerator.net  또는 http://www.uuidtools.com 사이트를 이용하면 됩니다.

물론, 기본 예제에 제시된 UUID를 그대로 사용해도 됩니다

setLocalName을 “RELAY”로 하였는데요,  중요한 것은 버튼회로(Central)의 setLocalName과 일치시켜야 합니다.

즉, 연결하고자 하는 회로별로 로컬 네임을 설정해 주면 되는데요,  서로 로컬 네임이 일치하는 기기끼리 페어링 되도록 코딩되어 있습니다 (UUID 포함)

Central 코드도 서비스 이름과 로컬네임만 RERAY로 변경해 놓았습니다. 

 

< 도어 미니어처 제작 >

이번 실습에서는 좀 더 사실감을 주기 위해 3D 프린터로 미니 도어를 만들어 보았습니다 도어 모델링에 사용한 툴은 Fusion360입니다

사이즈는  ( 가로 160mm X 높이 185mm ), 바닥 ( 160mm x 130mm ), 두께 5mm입니다

그리고 문에 사용할 경첩을 따로 설계했습니다

경첩의 홀은  M3 x 8mm 나사를 기준으로 제작했습니다

문의 솔레노이드 고정과 걸쇠 고정 홈은  M2 x 5mm 나사를 기준으로 제작했습니다

 

경첩을 문위에 맞대어 보면 아래와 같습니다.  치수가 정확하게 일치하도록 제작했습니다.

 출력은 문과 경첩 각각 따로 하도록 하였습니다. 

※ 만약 출력한다면 슬라이서 프로그램에서 내부채움(Infill)은 70% 이상 권해드립니다 (출력물을 떨어뜨렸을 때 쉽게 부서지지 않도록)
슬라이서 프로그램으로 슬라이싱 할 수 있는 STL파일(도어와 경첩)을 아래 압축하여 올려드립니다. 

도어와 경첩 STL 파일.zip
0.10MB

미니어처 모형은 아래처럼 잘 출력되었습니다. 

그리고 여기에 솔레노이드와 걸쇠 그리고 경첩까지 달아 놓은 모습입니다. 

도어 미니어처에 솔레노이드와 걸쇠를 달아 놓은 모습입니다
도어 미니어처에 경첩을 달아 놓은 모습입니다

 

< 솔레노이드 >

 

솔레노이드도 크기와 작동 전압 범위에 따라 몇 가지 종류가 있습니다.

작동 방식은 전선에 직류 전기를 넣으면 코일에 발생된 자기장에 의해 쇠뭉치가 전진하고, 입력 전기가 없으면 자기장이 소멸되어 스프링에 의해 원위치로 돌아오는 원리로 작동됩니다. 

실습에 사용된 도어형 솔레노이드도 위 사진의 아래쪽에 있는 솔레노이드에 케이스를 씌운 형태입니다

 

 < 다중 전원 공급기 >

이번 실습에서 5V전원을 많이 사용하기 때문에 USB 다중 전원공급기를 만들어 보았습니다
실습에 반드시 필요한 것은 아니기 때문에 참고용으로 봐주세요.

접지선이 있고 두께가 비교적 굵은(16A) 전원 케이블을 잘라 연결해 주었습니다. 

 규격은 전원코드에 표시되어 있으니 확인해 보고 비교적 여유 있는 전원코드를 사용하면 좋습니다.

아래 노란 원으로 표시된 부분을 연결할 때는 선을 잡아당겼을 때 쉽게 풀리지 않도록 단단히 고정해야 하며 합선되지 않도록 주의해야 합니다 그리고 감전될 수 있기 때문에 보호 케이스를 씌어 주거나 추가 조치를 해주는 것이 좋습니다. 

 

파워는 소형의 5V-5A 출력의 파워를 사용했습니다.  나노보드 4개 및 릴레이전원 공급 등 이 실습에는 충분히 사용하고도 남는 용량입니다. 

Nano 보드를 한 번에 많이 연결하기 위해 USB A-Femail 타입의 커넥터를 연결된 상태로 사용했고요.

커넥터에는 데이터 연결은 필요 없으니 양 끝에 있는 +단자와 -단자만 서로 연결해 주면 됩니다

그리고 바닥면이 합선이 되지 않도록 캡톤(내열) 테이프로 감싸주었습니다

추가로 스위치를 달아 개별로 켜고 끌 수 있도록 하였습니다 

그럼, 버튼회로와 릴레이 회로를 준비해 연결해 보세요.

릴레이에 5V를 공급하기 위해 마이크로 USB 케이블 커넥터를 연결해 보았습니다

※ 항상 + , - 극성에 주의해서 연결해 주세요. (보드 및 부품 손상 방지)

이 실습에서 솔레노이드용 전원으로 9V 건전지가 사용하기 제일 간편하지만, 용량도 적고 출력 전류가 낮은 타입이어서 실물 제작에 적용하기에는 적합하지 않으니 참고하세요.

그리고 동작을 시켜보면,  잘 작동하는 것을 알 수 있습니다.   그럼, 다른 전원도 테스트해 볼게요 현재 솔레노이드가 12V 용이지만 작동되는 힘은 약해도 9V건전지와 7.2V 리튬배터리도 역시 잘 작동하는 것을 볼 수 있습니다.

그럼, 1편에서 사용했던 LED회로와 서보회로를 모두 연결해 볼게요.  아래는 개별로 스위치를 켜고 끄면서 작동을 원하는 장치끼리 페어링 하여 제어해 본 것이고요,  이렇게 하기 위해서는 버튼(중앙장치) 회로의 코드에 있는 SetLocalName="    " 이름을 연결하려고 하는 각각의 이름,  예를 들어 "LED" , "SERVO" ,  "RELAY" 등으로 수정하여 매번 업로드해주어야 페어링 됩니다. 

그리고 여기서부터는 번갈아 가며 3가지 주변회로에 페어링 될 수 있도록코드 속의 LocalName을 “MULTI”로 통일하였으니 참고하세요.  즉 모든 코드의 SetLocalName="MULTI"로 통일하였습니다.  그렇지 않으면 번갈아가며 페어링 하기 위해서는 매번 중앙장치의 코드의 SetLocalName을 바꾸어 업로드해야 하기 때문이죠.

우선 버튼 회로부터 전원을 ON 합니다.  다음, LED 회로를 ON 하고 버튼을 눌러보면 빠르게 페어링 되어 LED가 제어되는 것을 볼 수 있고,  그다음, LED회로는 OFF 하고 서보회로를 ON 하여 페어링 시켜보면 릴레이 회로도 페어링 되어 잘 작동하는 것을 볼 수 있습니다. 
 학습용으로 활용할 수 있도록 네 가지 회로를 아크릴판에 올려봤습니다. 

스위치를 개별로 작동시켜 원하는 장치 간 페어링을 시켜 작동시킬 수도 있고, 
전원을 모두 ON 하고 랜덤으로 페어링 하여 작동시켜 볼 수도 있습니다.   그래서 
기존 페어링을 끊으려고 하려면,  보드에 있는 리셋 버튼을 눌러주면 됩니다.  해당 보드가 리셋되는 사이 랜덤으로 주변에 있는 다른 보드와 다시 페어링 됩니다. 

다음 3편에서는 앱인벤터를 활용하여 (BLE방식으로) 스마트폰으로 작동시켜 볼게요. 

감사합니다.

아래 유튜브 영상도 함께 참고하면 보다 수월하게 내용을 파악하실 수 있습니다. (아래 영상 클릭)

 

 

 

 

 

 

 

 

 

반응형