Arduino Mega 2560 연동
이 글에서는 
GrowSpace 개발자 태그를 Arduino Mega 2560 보드와 시리얼로 연결하여, lec, lep 명령어를 통해 위치 데이터를 실시간으로 수신하고 파싱하는 방법을 안내합니다. 하드웨어 시리얼이 지원되는 Mega 2560을 활용해 안정적인 고속 통신을 구성하는 방법과 예제 코드를 함께 제공합니다.
준비물
- Arduino Mega 2560 보드 

- GrowSpace 개발자 태그 

- Arduino IDE 프로그램 (공식: https://www.arduino.cc/en/software) 
- 점퍼 케이블) 

점퍼 전선

제공하는 시리얼 연결케이블)
⚠️ UNO 보드는 하드웨어 시리얼 포트가 1개뿐이라 고속 통신 시 오류가 발생할 수 있습니다. Mega 2560은 Serial1~3을 제공하여 안정적인 통신이 가능합니다.
Arduino IDE 설정 및 보드 연결
- Arduino IDE 설치 후 실행 
- 상단 메뉴에서 다음 설정 적용 - Tools > Board > Arduino Mega or Mega 2560 
  - Tools > Port > 연결된 COM 포트 선택 (예: COM3) 
  
- Arduino Mega 2560을 USB로 PC에 연결 
하드웨어 핀 연결
GrowSpace 개발자 태그의 우측 커넥터 (5V 전용) 기준으로, 아래와 같이 연결합니다:
개발자 태그 핀
Arduino Mega 핀
TX
RX1 (19번)
RX
TX1 (18번)
5V
5V
GND
GND
🔄 TX ↔ RX는 반드시 교차 연결해야 통신이 가능합니다.
아래는 Arduino Mega 보드의 핀 배치 예시입니다.
Serial1 포트의 TX1(18번) / RX1(19번)을 기준으로 연결하세요.


시리얼 중계 예제 (기본 통신 확인)
String inputFromSerial0 = "";
String inputFromSerial1 = "";
void setup() {
  Serial.begin(115200);    // USB Serial (Serial0)
  Serial1.begin(115200);   // Hardware Serial1 (핀 18 TX1, 19 RX1)
}
void loop() {
  // serialEvent()와 serialEvent1() 자동 호출됨
}
// Serial0 입력 → Serial1 출력 (CR만 붙임)
void serialEvent() {
  while (Serial.available()) {
    char inChar = (char)Serial.read();
    if (inChar != '\n') {
      inputFromSerial0 += inChar;
    }
    if (inChar == '\n') {
      Serial1.print(inputFromSerial0);
      Serial1.print('\r');
      inputFromSerial0 = "";
    }
  }
}
// Serial1 입력 → Serial0 출력
void serialEvent1() {
  while (Serial1.available()) {
    char inChar = (char)Serial1.read();
    inputFromSerial1 += inChar;
    if (inChar == '\n') {
      Serial.print("From Serial1: ");
      Serial.print(inputFromSerial1);
      inputFromSerial1 = "";
    }
  }
}설명
- setup()에서 USB 시리얼과 하드웨어 시리얼(Serial1)을 각각 초기화합니다.
- serialEvent()는 PC(Serial0)에서 입력한 문자열을 태그로 전송합니다.
- serialEvent1()은 태그에서 들어온 응답을 PC로 출력합니다.
- 명령어 전송 시 개행 문자( - \n) 기준으로 파싱 후,- \r캐리지 리턴을 자동 추가합니다.
Serial Monitor 설정 팁
- Baudrate: 115200bps 
- Newline 전송 설정: New Line 
- si명령어 전송 후 태그에서 시스템 정보가 출력되면 통신 성공입니다.
시리얼 모니터에서 si 명령어를 입력하고 정상 응답이 확인되면 연결 성공입니다.

명령어 기반 위치 파싱 예제
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 실행 결과 

- lec 실행 결과 

마무리
이 가이드를 통해 Arduino Mega 2560에서 GrowSpace 개발자 태그와의 시리얼 통신을 설정하고, lec, lep 명령어를 기반으로 실시간 위치 데이터를 파싱하여 출력하는 과정을 실습할 수 있습니다.
- lep: X, Y, Z 좌표 + 품질(QF) 확인
- lec: Anchor 정보 + 거리 + 위치 데이터까지 파악 가능
Last updated