ESP32 연동

실시간 위치 데이터 수신 및 파싱 (lec / lep 명령어 활용)

이 글에서는

GrowSpace 개발자 태그를 Arduino ESP32 보드에 연결하여, lec, lep 명령어를 통해 실시간 위치 데이터를 수신하고 파싱하는 방법을 안내합니다. 처음 ESP32와 태그를 연결해보는 분들도 쉽게 따라할 수 있도록 단계별로 친절하게 설명드리겠습니다.

ESP32는 UNO와 달리 다중 하드웨어 시리얼을 지원하며, 소형 테스트 환경 구성에 적합한 보드입니다


준비물

항목
용도

ESP32 보드 (예: DevKitC)

시리얼 수신 및 파싱

GrowSpace 개발자 태그

위치 정보 송신 장치

Arduino IDE

코드 작성 및 업로드

점퍼 케이블 (4핀)

TX, RX, GND, 3.3V 연결용


Arduino IDE 설정

설치

  • Arduino IDE 공식 페이지에서 설치 파일 다운로드 https://www.arduino.cc/en/software

  • Windows 사용자는 .msi 인스톨러 권장

ESP32 보드 추가

  • Arduino IDE 실행 → File > Preferences

  • Additional Board Manager URLs에 아래 주소 입력:

https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json
  • Tools > Board > Board Manager → ESP32 설치

  • 설치 후 Tools > Board > ESP32 Dev Module 선택

  • Tools > Port에서 자동 인식된 포트 선택


시리얼 연결 구성

GrowSpace 개발자 태그의 좌측 커넥터는 3.3V 시리얼을 지원합니다. ESP32 보드의 TX2/RX2 핀에 아래와 같이 연결하세요:

개발자 태그
ESP32 보드

TX

GPIO 16 (RX2)

RX

GPIO 17 (TX2)

GND

GND

3.3V

3.3V

⚠️ TX ↔ RX는 반드시 교차 연결해야 합니다. 예: 태그 TX → ESP32 RX, 태그 RX → ESP32 TX

아래는 ESP32 DevKit의 핀맵입니다. TX2/RX2의 위치를 확인하고 정확히 연결해 주세요:


시리얼 중계 예제 코드

이 코드는 PC와 태그 간 시리얼 데이터를 ESP32가 중계하는 코드입니다.

#define SERIAL2_RX 16
#define SERIAL2_TX 17

String inputFromSerial = "";
String inputFromSerial2 = "";

void setup() {
  Serial.begin(115200);
  Serial2.begin(115200, SERIAL_8N1, SERIAL2_RX, SERIAL2_TX);
  Serial.println("ESP32 Serial <-> Serial2 중계 시작");
}

void loop() {
  // Serial0 입력 → Serial2로 전송
  while (Serial.available()) {
    char ch = Serial.read();
    if (ch != '\n') inputFromSerial += ch;
    if (ch == '\n') {
      Serial2.print(inputFromSerial);
      Serial2.print('\r');
      inputFromSerial = "";
    }
  }

  // Serial2 입력 → Serial0 출력
  while (Serial2.available()) {
    char ch = Serial2.read();
    inputFromSerial2 += ch;
    if (ch == '\n') {
      Serial.print("[Serial2 → Serial] 수신: ");
      Serial.print(inputFromSerial2);
      inputFromSerial2 = "";
    }
  }
}
  • 시리얼 모니터 설정: 115200bps, Newline 전송 설정

  • si 명령어를 입력했을 때 장비 정보가 출력되면 연결 성공입니다.


위치 데이터 파싱 예제 (lep / lec 명령어)

개발자 태그는 lep 또는 lec 명령어를 통해 현재 위치 정보를 반환합니다. 아래 코드는 해당 응답을 분석하고 보기 좋게 출력하는 예제입니다.

전체 코드 구조

#define SERIAL2_RX 16
#define SERIAL2_TX 17

String inputFromSerial = "";
String inputFromSerial2 = "";

void setup() {
  Serial.begin(115200);
  Serial2.begin(115200, SERIAL_8N1, SERIAL2_RX, SERIAL2_TX);
  Serial.println("ESP32 Serial <-> Serial2 (\n 기준 파싱 시작)");
}

void loop() {
  while (Serial.available()) {
    char ch = Serial.read();
    if (ch != '\n') inputFromSerial += ch;
    if (ch == '\n') {
      Serial2.print(inputFromSerial);
      Serial2.print('\r');
      inputFromSerial = "";
    }
  }

  while (Serial2.available()) {
    char ch = Serial2.read();
    inputFromSerial2 += ch;
    if (ch == '\n') {
      inputFromSerial2.trim();
      if (inputFromSerial2.startsWith("POS,")) parseLEP(inputFromSerial2);
      else if (inputFromSerial2.startsWith("DIST,")) parseLEC(inputFromSerial2);
      else Serial.println(inputFromSerial2);
      inputFromSerial2 = "";
    }
  }
}

lep 명령어 응답 파싱 (태그 위치 정보)

void parseLEP(String line) {
  Serial.println("[LEP 위치 결과]");
  int idx = 0;
  String parts[5];

  while (line.length() > 0 && idx < 5) {
    int comma = line.indexOf(',');
    if (comma == -1) {
      parts[idx++] = line;
      break;
    }
    parts[idx++] = line.substring(0, comma);
    line = line.substring(comma + 1);
  }

  Serial.print("X: "); Serial.println(parts[1]);
  Serial.print("Y: "); Serial.println(parts[2]);
  Serial.print("Z: "); Serial.println(parts[3]);
  Serial.print("품질(QF): "); Serial.println(parts[4]);
  Serial.println();
}

lec 명령어 응답 파싱 (거리 + 위치 정보)

void parseLEC(String line) {
  Serial.println("[LEC 거리 + 위치 결과]");

  int posIndex = line.indexOf("POS,");
  if (posIndex == -1) {
    Serial.println("→ 위치 정보 없음");
    return;
  }

  String distPart = line.substring(0, posIndex - 1);
  String posPart = line.substring(posIndex);

  int anchorIdx = 0;
  int anStart = 0;
  while ((anStart = distPart.indexOf("AN", anStart)) != -1) {
    int idStart = anStart + 2;
    int idEnd = distPart.indexOf(",", idStart);
    String id = distPart.substring(idStart, idEnd);

    int valStart = idEnd + 1;
    float x = distPart.substring(valStart, distPart.indexOf(",", valStart)).toFloat();
    valStart = distPart.indexOf(",", valStart) + 1;
    float y = distPart.substring(valStart, distPart.indexOf(",", valStart)).toFloat();
    valStart = distPart.indexOf(",", valStart) + 1;
    float z = distPart.substring(valStart, distPart.indexOf(",", valStart)).toFloat();
    valStart = distPart.indexOf(",", valStart) + 1;
    float d = distPart.substring(valStart, distPart.indexOf(",", valStart)).toFloat();

    Serial.print("AN"); Serial.print(anchorIdx++); Serial.print(" (ID "); Serial.print(id); Serial.print("): ");
    Serial.print("x="); Serial.print(x);
    Serial.print(", y="); Serial.print(y);
    Serial.print(", z="); Serial.print(z);
    Serial.print(" → 거리: "); Serial.print(d); Serial.println("m");

    anStart = valStart;
  }

  Serial.println("▶ 태그 위치:");
  parseLEP(posPart);
}

테스트 방법 요약

  • 위 코드를 업로드한 후 Arduino IDE의 시리얼 모니터 실행

  • lep 또는 lec 명령어를 입력

  • 위치 정보가 정상적으로 출력되는지 확인 (XYZ 좌표, 거리 등)


마무리

이 매뉴얼에서는 GrowSpace 개발자 태그를 ESP32와 연결하여, 시리얼 통신을 통해 위치 명령어를 입력하고 데이터를 수신/파싱하는 전체 흐름을 안내드렸습니다.

이 과정을 통해 단일 태그의 실시간 위치 추적이 가능하며, 이후 BLE 전송, Wi-Fi 연동, MQTT 연동 등 다양한 확장 실험으로 이어질 수 있습니다.

혹시 실습 중 연결이 안 되거나 응답이 없을 경우, TX/RX 핀 교차 연결 여부와 시리얼 포트 설정을 꼭 다시 확인해주세요!

Last updated