아두이노 나노가 업그레이드되어 나노 패밀리 시리즈 보드들을 출시했다.
저전력 고성능의 프로세서가 사용되며 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를 사용했으며 다운을 받은 뒤 추가적인 설치를 하도록 한다.
설치를 끝낸 후 아두이노를 실행하면 다음과 비슷한 화면이 뜰 것이다.
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형으로 바꾸는 작업을 했다. 여러 시도 끝에 위와 같은 코드를 이용했으나 더 간단한 코드가 있을 것이다.