> For the complete documentation index, see [llms.txt](https://freegrow-1.gitbook.io/product-docs-kr/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://freegrow-1.gitbook.io/product-docs-kr/creatorkit_q1/undefined/arduino-mega-2560.md).

# Arduino Mega 2560 연동

### **이 글에서는**&#x20;

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

***

### 준비물

* Arduino Mega 2560 보드

<figure><img src="https://2885569511-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FYKyrLLe7cm7ZOhiSB0gg%2Fuploads%2FbYwYCGiqXnRQ1F5ORTgV%2Fimage.png?alt=media&amp;token=a703c982-1a47-494b-956b-abc9089dc58c" alt="" width="375"><figcaption></figcaption></figure>

* GrowSpace 개발자 태그

<figure><img src="https://2885569511-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FYKyrLLe7cm7ZOhiSB0gg%2Fuploads%2FvhVduTa6mCUMMrXLUt7P%2Fimage.png?alt=media&amp;token=9be89b9d-c4ff-4531-bb35-fd275a7d106c" alt=""><figcaption></figcaption></figure>

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

<table data-card-size="large" data-view="cards"><thead><tr><th></th><th></th><th data-hidden data-card-cover data-type="files"></th></tr></thead><tbody><tr><td>점퍼 전선</td><td></td><td><a href="https://2885569511-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FYKyrLLe7cm7ZOhiSB0gg%2Fuploads%2FUsUmFERwCGozsxPCvKWX%2Fa81c31a56%20(1).jpg?alt=media&amp;token=119787fe-9cec-48e2-b1a7-347e87e0342f">a81c31a56 (1).jpg</a></td></tr><tr><td>제공하는 시리얼 연결케이블)</td><td></td><td><a href="https://2885569511-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FYKyrLLe7cm7ZOhiSB0gg%2Fuploads%2FuUuQtX1D6NL8QnxWz5dm%2FSE-9140f3b8-841b-4138-b8db-f39a5f2e8819%20(1).png?alt=media&amp;token=5fdec11e-80fa-41a8-b942-cdae60b5cb06">SE-9140f3b8-841b-4138-b8db-f39a5f2e8819 (1).png</a></td></tr></tbody></table>

> ⚠️ **UNO 보드는 하드웨어 시리얼 포트가 1개뿐이라 고속 통신 시 오류가 발생할 수 있습니다.** Mega 2560은 Serial1\~3을 제공하여 안정적인 통신이 가능합니다.

***

### Arduino IDE 설정 및 보드 연결

* Arduino IDE 설치 후 실행

* 상단 메뉴에서 다음 설정 적용

  * **Tools > Board > Arduino Mega or Mega 2560**

  <figure><img src="https://2885569511-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FYKyrLLe7cm7ZOhiSB0gg%2Fuploads%2FHqxJbXpbgX5uBBSSRfyI%2Fimage.png?alt=media&amp;token=83ce30f6-d361-41bb-81db-2aa27dff25ca" alt=""><figcaption></figcaption></figure>

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

  <figure><img src="https://2885569511-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FYKyrLLe7cm7ZOhiSB0gg%2Fuploads%2FE17Ddjt4ytq3HNtftxgB%2Fimage.png?alt=media&amp;token=35716757-5d91-4470-8fee-9cf5b471bec9" alt=""><figcaption></figcaption></figure>

* Arduino Mega 2560을 USB로 PC에 연결

***

### 하드웨어 핀 연결

GrowSpace 개발자 태그의 **우측 커넥터 (5V 전용)** 기준으로, 아래와 같이 연결합니다:

| 개발자 태그 핀 | Arduino Mega 핀 |
| -------- | -------------- |
| TX       | RX1 (19번)      |
| RX       | TX1 (18번)      |
| 5V       | 5V             |
| GND      | GND            |

> 🔄 **TX ↔ RX는 반드시 교차 연결해야 통신이 가능합니다.**

아래는 Arduino Mega 보드의 핀 배치 예시입니다.&#x20;

Serial1 포트의 TX1(18번) / RX1(19번)을 기준으로 연결하세요.

{% columns %}
{% column width="25%" %}

<figure><img src="https://2885569511-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FYKyrLLe7cm7ZOhiSB0gg%2Fuploads%2F6r9MBylIKkBBGn27flLv%2Fimage.png?alt=media&amp;token=6a628ca1-5d03-435c-ad8e-cfbfa7b296a5" alt="" width="375"><figcaption><p>개발자 태그와 아두이노 mega2560을 연결한 모습</p></figcaption></figure>

{% endcolumn %}

{% column %}

<figure><img src="https://2885569511-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FYKyrLLe7cm7ZOhiSB0gg%2Fuploads%2FL9kHidFFNcXH0aDQnUFq%2F%EC%95%84%EB%91%90%EB%8B%88%EC%98%A4.jpg?alt=media&amp;token=b39d5e9f-ecef-4971-8926-cee134d7e4a3" alt=""><figcaption></figcaption></figure>

{% endcolumn %}
{% endcolumns %}

***

### 시리얼 중계 예제 (기본 통신 확인)

```cpp
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` 명령어를 입력하고 정상 응답이 확인되면 연결 성공입니다.

<figure><img src="https://2885569511-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FYKyrLLe7cm7ZOhiSB0gg%2Fuploads%2FwIoe0dwhE7ErtqAoWPN9%2Fimage.png?alt=media&amp;token=5e5c65eb-1030-4522-a080-617922ee49ec" alt=""><figcaption></figcaption></figure>

***

### 명령어 기반 위치 파싱 예제

```cpp
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 실행 결과

<figure><img src="https://2885569511-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FYKyrLLe7cm7ZOhiSB0gg%2Fuploads%2F1TjLqBdpt939CytSz07f%2F%EC%95%84%EB%91%90%EC%9D%B4%EB%85%B8%20LEP.png?alt=media&amp;token=cb5963c1-3904-4e5a-a638-efdd1e252d7d" alt=""><figcaption></figcaption></figure>

* lec 실행 결과

<figure><img src="https://2885569511-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FYKyrLLe7cm7ZOhiSB0gg%2Fuploads%2FxJXpx3iI6e2gIFAlJhuf%2F%EC%95%84%EB%91%90%EC%9D%B4%EB%85%B8LEC.png?alt=media&amp;token=227cb392-93f4-4072-aa77-1255d0567744" alt=""><figcaption></figcaption></figure>

***

### 마무리

이 가이드를 통해 Arduino Mega 2560에서 GrowSpace 개발자 태그와의 시리얼 통신을 설정하고, `lec`, `lep` 명령어를 기반으로 실시간 위치 데이터를 파싱하여 출력하는 과정을 실습할 수 있습니다.

* `lep`: X, Y, Z 좌표 + 품질(QF) 확인
* `lec`: Anchor 정보 + 거리 + 위치 데이터까지 파악 가능
