본 가이드는 GrowSpace 개발자 태그를 Arduino Mega 2560 보드와 시리얼로 연결하여,
lec / lep 명령어를 주고받고, 위치 데이터를 파싱해 출력하는 방법을 단계별로 안내합니다.
Arduino 환경에서 UWB 위치 정보를 실시간으로 처리하고자 하는 개발자에게 실질적인 실습 가이드가 될 수 있도록 구성했습니다.
1. 준비물
- Arduino Mega 2560 보드

- Arduino IDE 프로그램
- GrowSpace 개발자 태그

- 점퍼 케이블 (TX, RX, 5V, GND)


※ UNO 보드는 시리얼 포트가 1개뿐이기 때문에 고속 통신(115200bps)에서는 불안정합니다.
Mega 2560은 하드웨어 시리얼 포트(Serial1~3)를 제공해 안정적인 연결이 가능합니다.
2. Arduino IDE 설치
- Arduino 공식 사이트에서 운영체제에 맞는 설치 파일 다운로드
- 설치 진행 (가이드 기준 MSI Installer 기준)
왜 UNO 대신 Mega 2560을 사용할까요?
많은 분들이 흔히 사용하는 Arduino UNO는 시리얼 포트가 1개뿐입니다. 그래서 고속 통신이 필요한 GrowSpace 개발자 태그와 연결하려면 SoftwareSerial을 써야 하는데, 이 방식은 115200bps 속도에서는 오류가 많고 불안정해요.
하지만 Arduino Mega 2560은 하드웨어 시리얼 포트를 4개(Serial0~3)까지 지원하므로 빠르고 안정적인 통신이 가능합니다!
3. Arduino 보드 연결 및 IDE 설정
1. Arduino Mega 2560을 USB로 PC에 연결

2. Arduino IDE 실행 → 다음 설정 적용
- Tools > Board > Arduino Mega or Mega 2560

- Tools > Port > 연결된 COM 포트 선택 (예: COM3)

4. 핀 연결 방법
이번 실습에서는 우측 커넥터 기준, 5V 전원 사용, Serial1 포트를 사용합니다.
개발자 태그 | Arduino Mega |
---|---|
TX | RX1 (19번 핀) |
RX | TX1 (18번 핀) |
5V | 5V |
GND | GND |
개발자 태그와 아두이노 mega2560을 연결한 모습입니다.

⚠️ TX ↔ RX는 반대로 연결해야 통신이 가능합니다!
즉, 태그의 TX → 아두이노의 RX1 / 태그의 RX → 아두이노의 TX1
아래 다이어그램은 Arduino Mega 2560 보드의 전체 핀 배치를 보여줍니다.
본 가이드에서는 Serial1 포트를 사용하므로 TX1 (핀 18) / RX1 (핀 19) 연결 위치를 참고해 주세요.

5. 시리얼 데이터 중계 코드 (기본 송수신)
void setup() {
Serial.begin(115200); // USB Serial
Serial1.begin(115200); // 개발자 태그 연결
}
void serialEvent() {
static String input = "";
while (Serial.available()) {
char c = (char)Serial.read();
if (c != '\n') input += c;
else {
Serial1.print(input);
Serial1.print('\r'); // CR 전송
input = "";
}
}
}
void serialEvent1() {
static String response = "";
while (Serial1.available()) {
char c = (char)Serial1.read();
response += c;
if (c == '\n') {
Serial.print("From Tag: ");
Serial.println(response);
response = "";
}
}
}
Serial
: PC와 통신 (Serial Monitor)Serial1
: 개발자 태그와 통신- 명령어 입력 시 끝에 자동으로 CR(Carriage Return) 전송
이 코드를 업로드하고, Serial Monitor(115200bps)를 열어 si 명령어를 입력해보세요.
태그의 시스템 정보가 출력되면 통신 성공입니다!

6. 위치 데이터 파싱 코드 (lec / lep)
실시간으로 들어오는 lec
또는 lep
응답을 아두이노 코드에서 분리/해석하여 출력하는 예제입니다.
주요 기능
lep
: 태그의 위치(x, y, z)와 품질 지수(QF) 출력lec
: 각 앵커 ID, 좌표, 거리 + 태그 위치까지 상세 출력
String bufferSerial0 = "";
String bufferSerial1 = "";
void setup() {
Serial.begin(115200); // USB Serial
Serial1.begin(115200); // 개발자 태그 연결용 Serial1
}
void loop() {
// loop는 비워둠, serialEvent / serialEvent1 자동 실행
}
// Serial0로부터 명령 입력 받기
void serialEvent() {
while (Serial.available()) {
char inChar = (char)Serial.read();
if (inChar != '\n') {
bufferSerial0 += inChar;
}
if (inChar == '\n') {
bufferSerial0.trim(); // 개행 제거
if (bufferSerial0.equalsIgnoreCase("lec") || bufferSerial0.equalsIgnoreCase("lep")) {
Serial.print("명령 전송: ");
Serial.println(bufferSerial0);
Serial1.print(bufferSerial0); // CR만 붙임
Serial1.print('\r');
} else {
Serial.println("⚠ 지원하지 않는 명령입니다.");
}
bufferSerial0 = "";
}
}
}
// Serial1로부터 응답 수신 → lec/lep 파싱
void serialEvent1() {
while (Serial1.available()) {
char inChar = (char)Serial1.read();
bufferSerial1 += inChar;
if (inChar == '\n') {
bufferSerial1.trim();
if (bufferSerial1.startsWith("POS,")) {
parseLEP(bufferSerial1);
} else if (bufferSerial1.startsWith("DIST,")) {
parseLEC(bufferSerial1);
} else {
Serial.println("[응답] " + bufferSerial1);
}
bufferSerial1 = "";
}
}
}
// --- 위치만 파싱 (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;
} else {
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);
Serial.println("▶ Anchor 거리 정보:");
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);
}
- lep 명령 → X, Y, Z 좌표 + 품질(QF)을 실시간으로 출력
- lec 명령 → 각 앵커의 ID, 위치 좌표, 거리 + 최종 위치까지 모두 파싱 가능
명령 입력은 시리얼 모니터에서 “lec” 또는 “lep”만 입력하면 다음과 같은 결과가 나옵니다.
lep 실행결과

lec 실행결과

이 가이드를 통해 GrowSpace 개발자 태그와 Arduino Mega 2560 간의 시리얼 통신을 구축하고,
실시간 위치 데이터를 코드로 직접 처리하는 경험을 해보셨습니다.
UWB 기반 위치 데이터를 활용한 개발, 실내 측위 기반 프로젝트, 센서 융합 등
다양한 스마트 공간 개발의 시작점으로 GrowSpace 태그를 응용해보세요.