아두이노 나노가 업그레이드되어 나노 패밀리 시리즈 보드들을 출시했다.

저전력 고성능의 프로세서가 사용되며 WIFI , BLE 등의 기능들을 지원하는데 ,
나는 출시된 보드들 중 ArduinoBLE 라이브러리를 사용해 볼 것이다.
사용된 보드는 아두이노 나노33 IOT 지만 에브리를 제외한 다른 보드에서도 사용이 가능하다.
패밀리로 출시된 보드들의 스펙은 아래와 같다

보드이름 마이크로 컨트롤러 스펙 특징
아두이노 나노 every Atmega4809 20MHz/ 48KB/ 6KB, 8Bit 아두이노 나노에 비해 성능 향상, 5V I/O 사용
아두이노 나노 33 IOT SAMD21G18A 48MHz/ 256KB
/ 32KB, 32Bit
Arm Coretex M0 아키텍처, NINA W102 (ESP32 기반 WIFI, BLE), 6축 IMU, 3.3V I/O 사용
아두이노 나노 33 BLE nRF 52840 64MHz/ 1MB
/ 256KB, 32Bit
Arm Coretex M4F 아키텍처, NINA B306 BLE 칩셋, 6축 IMU, 3.3V I/O 사용
아두이노 나노 33 BLE Sense nRF 52840 64MHz/ 1MB
/ 256KB, 32Bit
Arm Coretex M4F 아키텍처, NINA B306 BLE 칩셋, 9축 IMU, 3.3V I/O 사용

 


1. 아두이노 IDE 세팅

기본적으로 프로그래밍은 아두이노 IDE를 사용했으며 다운을 받은 뒤 추가적인 설치를 하도록 한다.

Arduino IDE 설치 공식 사이트

설치를 끝낸 후 아두이노를 실행하면 다음과 비슷한 화면이 뜰 것이다.

 

1-1 ) 아두이노 나노 33 IOT 보드 설정

프로그래밍을 하기 전에 아두이노 IDE에 보드 설정을 해야하는데 기본적인 보드들은 툴>보드에 리스트 중에서 찾아볼 수 있으나, Nano 33 IOT 는 툴>보드>보드매니저에서 검색을 통해 추가할 수 있다. 혹은 보드 연결시, 인식한 보드 정보를 찾고 하단 알림창을 통해 바로 다운받을 수도 있다.

사진에서는 이미 설치가 되어있다. 'nano 33' 을 검색하여 'Nano 33 IOT는 Arduino SAMD Boards (32-bits Cortex-M0+) by Arduino' 를 설치한다. 다시 보드 탭에 들어가보면 추가된 정보 확인이 가능하다.

 

1-2) ArduinoBLE 라이브러리 추가

BLE 연결를 하기 위해 라이브러리를 추가적으로 설치한다.

툴> 라이브러리 관리 탭을 누르고 'arduinoBLE' 를 검색한 후 'ArduinoBLE by Arduino'를 설치한다. 
그리고 최상단에 '#include <ArduinoBLE.h>' 를 작성하여 설치된 라이브러리를 사용할 수 있도록 해준다.


2. ArduinoBLE 기본 코드 

BLEService CountingService("19B10000-E8F2-537E-4F6C-D104768A1214");
BLEStringCharacteristic CountingChar("19B10001-E8F2-537E-4F6C-D104768A1214",BLEWrite|BLERead | BLENotify, 10);

2-1) Service(서비스)와 Characteristic(특성)

Service 와 Characteristic의 UUID를 지정한다. 하나의 Service에 여러개의 Characteristic를 가질 수 있다. 


위 코드의 Characteristic은 String값을 가지므로 코드 끝에 추가적으로 길이를 지정해야한다. ex) 10
String을 제외한 Bool, Int Char 등의 값을 가진 Characteristic 로 변경하고 싶은 경우,  'BLEStringCharcteristic' 부분을 원하는 속성으로 변경한 뒤 길이지정 값을 빼주면 된다.
Parameter, 즉 BLEWrite(쓰기), BLERead(읽기), BLENotify(읽기반복) 또한 추가 변경 가능하다.

다음은 setup 문에서 추가해야할 구문이다.

Serial.begin(9600);

if (!BLE.begin()) {
    Serial.println("starting BLE failed!");

    while (1);
  }

  BLE.setLocalName("QuitSmocking");
  BLE.setAdvertisedService(CountingService); 
  CountingService.addCharacteristic(CountingChar);
  BLE.addService(CountingService);

  BLE.advertise();
  
Serial.println("Bluetooth device active, waiting for connections...");


2-2) 신호 송출

BLE모듈의 동작을 확인한다.  잘못되는 경우 실패했음을 화면으로 알린다.

Service 의 이름과 UUID, 추가할 Characteristic을 정한 뒤, 마지막으로 전체적인 Service를 세팅한다.
그리고 advertise 신호를 내보내, BLE 기기를 주변에 알린다.

 

다음은 loop문이다.

BLEDevice central = BLE.central();

if (central) {
	Serial.print("Connected to central: ");
	Serial.println(central.address());
    
    while(central.connected()){
	  /*쓰기*/
      CountingChar.writeValue((String)Counting);
	  /*읽기*/
      if(CountingChar.written()) {
          if (CountingChar.value()) {
              int val = atoi(CountingChar.value().c_str());
              Counting=val;

              Serial.print("Counting: ");
              Serial.println(val);
          }//value
      }//written
  }//connected
}//central

 

2-3) 연결 성공

연결이 성공적으로 이루어지면, 연결된 기기의  Mac 주소를 출력한다. 
이후 연결된 상태 동안에 실행할 코드를 작성해나가면 된다.

2-4) 쓰기
BLE모듈이 연결된 기기에 데이터를 쓸 경우, 설정한 Characteristic의 자료형에 맞추어 전송할 값을 넣는다.
여기선 설정한 자료형이 String 이었으므로, int 형의 Counting 변수를 String 으로 형변환하여 전송했다.

2-5) 읽기
BLE 모듈이 연결된 기기가 쓴 데이터를 읽는 경우, 값의 유무를 판별한 후 읽어온다.
가져온 데이터는 CountingChar.value 이다.

나는 가져온 값을, int형으로 쓰려는데 유니코드로 출력이 되어 가져온 값을 String으로 바꾼 후 다시 int형으로 바꾸는 작업을 했다. 여러 시도 끝에 위와 같은 코드를 이용했으나 더 간단한 코드가 있을 것이다. 

+ Recent posts