저전력 고성능의 프로세서가 사용되며 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를 사용했으며 다운을 받은 뒤 추가적인 설치를 하도록 한다.
프로그래밍을 하기 전에 아두이노 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>' 를 작성하여 설치된 라이브러리를 사용할 수 있도록 해준다.
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형으로 바꾸는 작업을 했다. 여러 시도 끝에 위와 같은 코드를 이용했으나 더 간단한 코드가 있을 것이다.