아두이노로 UWB 좌표를 받으려면 보드 선택부터 막힙니다. 우노는 하드웨어 시리얼 포트가 USB와 공유되는 단 하나뿐이라, UWB 태그를 그대로 물리면 통신이 꼬입니다.
Arduino UWB 위치추적이란, GrowSpace UWB 태그나 리스너를 아두이노 보드와 시리얼로 연결해 실시간 좌표를 아두이노에서 직접 읽어오는 방식입니다. 보드에 따라 배선과 코드가 달라지므로 우노와 메가를 나눠서 봐야 합니다.
시작하기 전에 커넥터 전압부터 확인합니다. 개발자 태그의 우측 커넥터는 5V이고, 좌측은 3.3V입니다. 아두이노 우노와 메가는 5V 장치이므로 우측 커넥터를 씁니다. 라즈베리파이 같은 3.3V 보드에 우측 커넥터를 연결하면 회로가 손상되니, 좌우를 헷갈리지 않아야 합니다.
우노는 왜 라이브러리가 하나 더 필요한가
우노의 하드웨어 시리얼은 USB 업로드·모니터링과 공유됩니다. 그래서 UWB 통신에는 소프트웨어 시리얼을 따로 써야 합니다.
여기서 일반 SoftwareSerial을 쓰면 문제가 생깁니다. UWB 통신 속도인 115200bps에서 오류율이 높아지기 때문입니다. 이 문제를 피하려면 AltSoftSerial 라이브러리를 씁니다. 내부 타이머 기반이라 고속 통신에서도 수신이 안정적입니다. 우노 기준으로 RX는 D8, TX는 D9로 고정되어 충돌 여지도 적습니다.
라이브러리는 아두이노 IDE의 스케치 > 라이브러리 포함하기 > 라이브러리 관리에서 AltSoftSerial을 검색해 설치합니다.
우노 배선
| 태그 핀 | 우노 핀 |
|---|---|
| HV(5V) | 5V |
| GND | GND |
| TXD | D8 (AltSoftSerial RX) |
| RXD | D9 (AltSoftSerial TX) |
TX와 RX는 반드시 교차로 연결합니다. 태그의 TX는 우노의 RX로, 태그의 RX는 우노의 TX로 물립니다.
배선이 끝나면 다음 코드를 업로드합니다.
#include <AltSoftSerial.h>
AltSoftSerial altSerial; // RX: D8, TX: D9
void setup() {
Serial.begin(115200); // USB 시리얼
altSerial.begin(115200); // GrowSpace 장치
delay(100);
altSerial.print("reset\r");
delay(1000);
while (altSerial.available()) altSerial.read(); // 버퍼 정리
altSerial.print("lep\r");
}
void loop() {
while (altSerial.available()) {
char c = altSerial.read();
Serial.write(c); // PC로 그대로 출력
}
}시리얼 모니터를 115200bps로 열면 다음과 같은 값이 올라옵니다.
POS,0,0104,12.34,56.78,9.01,95,BC앞의 두 값은 식별자이고, 이어지는 세 숫자가 X, Y, Z 좌표(m)입니다. 출력이 전혀 없다면 점퍼선 연결과 AltSoftSerial 설치 여부부터 다시 확인합니다.
메가로 넘어가야 할 때
우노로 테스트하다 보면 데이터가 간헐적으로 깨지는 경우가 생깁니다. 이럴 땐 아두이노 메가 2560을 권합니다. 메가는 하드웨어 시리얼을 4개(Serial0~3) 지원합니다. 소프트웨어 시리얼 없이도 UWB 통신을 안정적으로 받습니다.
메가 배선
메가의 Serial1을 사용합니다.
| 태그 핀 | 메가 핀 |
|---|---|
| TX | RX1 (핀 19) |
| RX | TX1 (핀 18) |
| 5V | 5V |
| GND | GND |
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() 자동 호출
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 = "";
}
}
}
void serialEvent1() {
while (Serial1.available()) {
char inChar = (char)Serial1.read();
inputFromSerial1 += inChar;
if (inChar == '\n') {
Serial.print("From Serial1: ");
Serial.print(inputFromSerial1);
inputFromSerial1 = "";
}
}
}시리얼 모니터에서 si를 입력했을 때 장비 정보가 출력되면 통신이 정상 연결된 것입니다. 이어서 lep이나 lec을 입력해 좌표를 확인합니다.
좌표값 읽어서 쓰기
두 보드 모두 UWB 장치가 보내는 값의 형식은 같습니다. lep이면 POS,x,y,z,qf이고, lec이면 앵커별 거리와 위치가 함께 나오는 DIST,...,POS,... 형식입니다. QF는 0에서 100 사이 품질지수이며, 60 이상이면 비교적 안정적인 값으로 봅니다.
로봇이나 자동화 장비에 이 좌표를 바로 연결한다면, 문자열을 콤마 기준으로 나눠 숫자로 변환하는 파싱 함수 하나만 더 있으면 됩니다. 우노나 메가 모두 방식은 같습니다.
자주 묻는 질문
우노와 메가 중 어떤 걸 골라야 하나요?
간단한 테스트나 프로토타입이면 우노로 충분합니다. 데이터가 자주 깨지거나 다른 시리얼 장치를 동시에 써야 한다면 메가로 넘어가는 편이 낫습니다.
시리얼 연결은 했는데 아무 값도 안 들어옵니다.
TX와 RX가 교차 연결됐는지부터 확인합니다. 우노라면 AltSoftSerial이 제대로 설치됐는지, 보드레이트가 115200인지도 함께 봅니다.
좌측 3.3V 커넥터에 연결하면 안 되나요?
아두이노는 5V 장치이므로 우측 커넥터를 씁니다. 좌측은 라즈베리파이나 ESP32처럼 3.3V로 동작하는 보드 전용입니다.
다음 단계
우노로 먼저 연결을 확인하고, 통신이 불안정하면 메가로 옮기는 순서가 가장 무난합니다. 배선표와 코드는 위 그대로 옮기면 되고, 나머지는 좌표를 어디에 쓸지 정하는 일만 남습니다.
→ 아두이노·라즈베리파이 등 개발 환경에 맞는 키트 구성 문의하기

