-
해커톤 ESP32를 활용한 Bluetooth 통신 구현프로젝트 2025. 1. 29. 16:31
인원
4인팀으로 출전 했고, 나의 역할은 Bluetooth 및 NFC 통신 구현, 코드 디버깅 이었다.
각각 팀원들의 역할은 화면 인터페이스 담당, AI 인식 담당, 팀장이 총괄을 맡았다.
아이디어 개요
휴대용 혈당계는 잦은 채혈로 인한 사용자의 불편함과 부피가 작은게 아니라 휴대성이 좋지 않다. 또한 버튼은 한정적인데 매뉴얼은 복잡하다. 그렇기에 우리는 복잡한 매뉴얼, 나쁜 휴대성을 해결하기 위해 핸드폰 뒤에 붙이는 형식의 Maqsafe( iPhone 충전기, 자석을 이용해 뒤에 붙히기만 하면된다.) 혈당계를 생각했다. 또한 자주 채혈을 한다는 불편함을 해결하기위해 AI 인식을 이용한 식단관리, 먹은 음식에 대한 데이터를 도출 한뒤 올라갈 혈당을 예상하여 사용자가 자신의 혈당을 항상 알기위해 채혈을 하는것을 방지해 불편함을 해소한다.
프로젝트 개요
맥세이프 기반 혈당계를 활용해 스마트폰과의 근거리 무선통신 기능을 구현하여 휴대성과 터치 인터페이스를 만들어 편의성 향상. 음식 데이터 셋을 추출 하여 AI 화면 인식을 통해 혈당 예측, 하루에 먹은 음식에 대한 예상 혈당치 출력
주요기능
크게 3가지 이다.
1. 카메라로 음식을 찍을시 화면 인식을 통한 음식 칼로리 및 혈당 도출
2. 터치 인터페이스를 통한 편의성
3. 혈당계와 핸드폰의 근거리 통신으로 데이터 전송
구현 및 테스트
일단 해커톤에서 내가 사용한 esp32의 개요는 다음과 같다.
이 제품은 Wi-Fi 와 Bluetooth 를 포함하고 있기때문에 통신 설정만 해주면된다.
언어는 c++, 개발환경은 vscode의 platfromIO을 사용했다.
프로젝트를 먼저 만들어야되는데, 여기서 보드 와 프레임워크 설정을 한뒤 완료를 한다.
PlatformIO에는 Bluetooth 또는 NFC를 사용하기 위한 라이브러리 항목이 있다. 여기에 검색하면 사람들이 사용하는 라이브러리를 설치할수있다.
마지막으로 PlatformIO.ini 파일 설정만 바꿔주면 준비는 끝났다고 할수있다. PlatformIO.ini는 프로젝트의 보드,프레임워크,라이브러리 등을 정의한다. 그래서 코드 밑줄을 보면 내가 추가한 라이브러리를 볼수있다.
일단 처음 Bluetooth 예제 통신을 하였다. 간단하게 핸드폰과 연결되면서 통신을 해봤다. 핸드폰 앱은 serial Bluetooth terminal을 사용했다. 다음은 코드다.
#include <TFT_eSPI.h> // TFT LCD를 제어하기 위한 라이브러리 #include <BluetoothSerial.h> // Bluetooth 기능을 제어하기 위한 라이브러리 BluetoothSerial SerialBT; // BluetoothSerial 객체 생성 TFT_eSPI tft = TFT_eSPI(); // TFT LCD 제어를 위한 TFT_eSPI 객체 생성 void setup() { Serial.begin(115200); // 시리얼 통신을 위해 115200 baud rate로 초기화 SerialBT.begin("ESP32_Test"); // 블루투스 이름을 "ESP32_Test"로 설정하여 활성화 tft.init(); // TFT 디스플레이 초기화 tft.setRotation(1); // 디스플레이 방향 설정 (1: 가로 모드) tft.fillScreen(TFT_BLACK); // 전체 화면을 검은색으로 채움 tft.setTextColor(TFT_WHITE); // 텍스트 색상을 흰색으로 설정 tft.drawString("Bluetooth ON", 10, 10); // (10,10) 위치에 "Bluetooth ON" 텍스트 표시 } void loop() { if (SerialBT.available()) { // Bluetooth로 데이터가 수신되면 실행 String msg = SerialBT.readString(); // 수신된 문자열을 msg에 저장 tft.fillScreen(TFT_BLACK); // 화면 초기화 tft.drawString("Received:", 10, 10); // (10,10) 위치에 "Received:" 텍스트 표시 tft.drawString(msg, 10, 30); // (10,30) 위치에 수신된 msg 문자열 표시 } }
일단 성공적으로 테스트 통신은 완료했다.
그럼 이제 NFC 통신으로 넘어간다.( Bluetooth 통신 테스트는 보드 고장 점검 및 NFC 안될시 보험 같은것이다)
우리가 사용하러 가져온 NFC 모듈은 이것이다.
RFID-RC522 일단 NFC는 ( Near Field Communication)으로 근거리 무선통신 기술이다. 그래서 10cm 이내의 거리에서 무선 데이터를 송수신 하는 기술이다. 우리가 눈여겨보는 것은 근거리 통신, 저전력, 빠른연결이다. 그렇기에 Bluetooth 보다 더 모든면에서 효율적이라고 생각했다.
하지만 문제가 발생했다.
문제는 2가지 였다.
첫번째는 연결 문제였다
NFC 모듈을 사용하기 위해선 지정된 핀과 연결되어야 하는데 우리가 쓰는 TTGO에는 없는 핀이 많았다.
찾아보니 TTGO의 디스플레이 때문에 핀을 연결했고 그 핀이 NFC모듈과 겹치는 거였다. 일단 NFC 모듈에 필요한 연결은
23,19,18,5,0 +3.3v이다. 하지만 위에 올린 DataSheet를 보면 핀이 없다! 그래서 핀을 정의하여 연결 핀을 재조정했다.
#define RST_PIN 22 // GPIO22 #define SS_PIN 21 // GPIO21 #define MISO_PIN 27 // GPIO27 #define MOSI_PIN 26 // GPIO26 #define SCK_PIN 25 // GPIO25
이렇게 연결하니 정상적으로 모듈이 작동이 됐다.
두번째는 모듈의 기능이다.
우리는 스마트폰과의 NFC 통신을 구현하고자 하였다. 하지만 RFID-RC522는 스마트폰과의 직접 통신은 불가능 했다.
RC522는 ISO14443A 프로토콜 기반의 NFC 태그를 읽고 쓰는 역할을 한다. P2P 모드를 지원하지 않으므로
단순한 RFID 태그 역할만 하게 된다. 그렇기에 만약 우리가 NFC 통신을 위해서는 P2P모드를 지원하는 모듈을 가져왔어야했다.(PN532, SM130 등)원래의 프로젝트였으면 바로 물건을 구매하고 배송했겠지만, 해커톤이라 중간에 돌릴수가 없었다.
결국 우리는 다른 무선 통신 방식을 사용하기로 했다.
대체 방안은 Bluetooth , Wi-Fi 가 있었다. 그중에서 구현에 성공한 Bluetooth 로 방법을 돌렸다. Classic Bluetooth도 괜찮은 선택이었겠지만, 우리는 BLE(Bluetooth Low Energy)로 구현하기로 했다.
BLE는 클래식과 다르게 소비전력이 매우 낮고 전송속도가 낮다. 그리고 연결시간이 매우 빠르게 연결가능하다.
그래서 주로 스마트 워치등에서 사용된다.
BLE는 클라이언트-서버 구조로 동작하고, 이는 Peripheral과 Central로 이루어진다(전자가 전송, 후자가 요청)
전송 구조를 요약하면 ESP32는 BLE Peripheral서버 역할이고 , 스마트폰은 BLE Central 역할이다.
자세한 내용은 다음 깃허브에 올려놨다.
https://github.com/xdada-bang/mygit/tree/master/MagSafe_ESP32
정상적으로 연결된 모습을 볼수있다.(혈당계 데이터를 받은 모습,연결된 핸드폰의 MAC 주소가 나온 모습)
마지막으로 팀장과 코드들 점검하고 최종 프로토 타입을 냈다.
다음은 최종 프로토 타입 시연 영상이다.(인터페이스 위주의 시연,최종결과는 LOLIN D32 보드로 실행)
결과 및 후기
우리가 처음 설계한대로는 나오지않았다. 밤새 고민하고 만들었지만 부족한 부분이 많이 보였다...
그래도 창의성과 미흡하지만 기술 구현에 성공하여 대회에서 대상을 받은 것 같다. 팀원들과 팀장 모두 고생이 많았다.
대회 준비를 하면서 팀원들과 협력하며 개발한 결과 의사소통의 중요성을 느낀것같다.. 해커톤이 단순히 결과품을 만드는 것 뿐만 아니라 지정 과제도 풀면서 점수를 따야되기 때문에 정말 모두 힘든 대회였던것같다.
특히 제한된 시간안에 발표 준비와 결과물을 준비해야 하는 경험은 해커톤 대회가 주는 장점중 하나이다.
해커톤이 끝나고 NFC 통신이 올바르게 구현됬으면 어땟을까 하고 코드를 잠시 생각해 봤다.
일단 NFC 통신은 NFC 라이브러리인 #include <MFRC522.h>를 사용했었다. 그리고 RC522는 SPI 통신을 사용하므로 SPI.h 도 선언해야한다. 그외에는 Bluetooth 통신과 다른점은 거의 없다 객체,인스턴스 생성후 -> RC522의 모듈를 init로 초기화 하면 준비가 끝이다. 하지만 RC522가 우리의 설계에 안맞았다는게 정말 안타까웠다.
'프로젝트' 카테고리의 다른 글
캡스톤 디자인: 보행자와 운전자를 위한 AI 기반 스마트 펜스 개발 (0) 2025.01.27