Magician Main Board for Sensing Robot
This project implements a multi-laser distance sensing and light control system on an Arduino Nano (ATmega328P).
W5100 이더넷 + VL53L0X ToF 센서로 만드는 산업 검사 로봇용 조명·거리 제어 보드
산업용 외관 결함 검사 로봇은 카메라가 부품 표면을 일정한 조도와 거리에서 촬영해야 신뢰할 수 있는 영상을 얻는데, 이 보드는 3개의 ToF 거리 센서로 표면과의 거리를 읽고 최대 64개의 조명을 제어하는 역할을 8비트 Arduino Nano 위에서 수행한다. 핵심은 SRAM이 2KB뿐인 MCU가 W5100 하드웨어 TCP/IP를 빌려 별도의 PC 없이도 네트워크에서 원격으로 조명·센서를 제어·모니터링할 수 있게 한 점이다.
COMPONENTS
Hardware components
- Arduino Nano (또는 UNO) — ATmega328P, 8비트 AVR
- WIZnet W5100 이더넷 모듈/실드 (하드웨어 TCP/IP, Telnet 서버 포트 23)
- VL53L0X ToF 거리 센서 ×3 (I²C, XSHUT로 주소 분리)
- 74HC595 시프트 레지스터 (조명 확장용, 옵션 / 데이지 체인으로 최대 64채널)
- LED·조명 출력 6~8채널
- 푸시 버튼 ×2 (아날로그 입력 A6, A7)
- 커스텀 PCB (KiCad 설계, 오픈 하드웨어)
Software & Tools
- Arduino IDE / AVR 툴체인 (C++)
- Pololu VL53L0X Arduino 라이브러리
- 내장 라이브러리:
Wire.h(I²C),SPI.h,Ethernet.h(W5100) - 접속 도구:
telnet(이더넷),picocom/screen(USB 시리얼, 115200 bps) - 상위 제어 소프트웨어: Magician Grabber (카메라/ATI/Teensy 통합 구동)
출처 안내 이 글은 EU 공동 펀딩 연구 프로젝트 MAGICIAN의 공개 GitHub 저장소
magician-project/magician_main_board(MIT License)와 프로젝트 홈페이지 magician-project.eu에 공개된 사실만을 바탕으로 합니다. 원문을 단순 번역하지 않고, "왜 8비트 MCU에 하드웨어 이더넷을 붙였는가" 라는 관점에서 부품의 역할과 설계 의도를 재구성한 편집 콘텐츠입니다. 원문에 없는 추정은[확인 필요]로 표시했습니다.
작성자 / 출처 신뢰도
재구성(게시) 관점. 본 콘텐츠는 maker.wiznet.io 편집 기준에 따라 WIZnet 이더넷 칩(W5100)의 역할을 중심으로 원 저장소를 재해석한 것이다. 기술적 사실은 모두 공개 저장소·홈페이지에서 확인했다.
원 프로젝트 출처 (확인됨)
- 저장소:
magician-project/magician_main_board(Public, MIT License, 약 36 commits, 버전 0.26) - 소속 프로젝트: MAGICIAN — Autonomous Defects Detection and Repair in Manufacturing
- 펀딩: EU Horizon Europe 공동 펀딩, Grant Agreement 101120731
- 기간: 2023년 10월 ~ 2027년 9월, 7개국 파트너 참여
- 목표: 제조 공정에서 외관 결함을 자율적으로 탐지·보수하는 인간-로봇 협업 로봇 개발
- 공개 채널: 홈페이지(magician-project.eu), LinkedIn, YouTube(@MAGICIANProject)
원 펌웨어 개발자 (일부 확인 필요)
- 저장소 기여자는 3명으로 표기되나 README에 실명·핸들이 명시되어 있지 않음 → 개별 개발자 식별
[확인 필요] - 홈페이지 메타데이터상 콘텐츠 작성자 핸들
nfelix가 확인되나, 이것이 펌웨어 작성자인지 웹 담당자인지는[확인 필요] - 저장소 Star/Fork는 현재 0 — 연구 컨소시엄 내부 협업용 공개 저장소로 보이며, 커뮤니티 인기도가 아니라 EU 연구 프로젝트라는 출처의 제도적 신뢰도가 핵심 근거이다.
신뢰도 요약: 회사·매출 등 비공개 정보는 다루지 않았다. "EU 펀딩 연구 프로젝트의 실제 검사 로봇 메인보드 코드"라는 점이 이 자료의 신뢰 근거이며, 개별 작성자 신상은 확인되지 않아 추정하지 않았다.
신규 콘텐츠 요약
- 무슨 프로젝트인가: 산업용 외관 결함 검사 로봇(MAGICIAN)의 메인보드 펌웨어 — 카메라 촬영을 위한 조명 제어 + 표면 거리 측정 + 버튼 입력을 담당하는 엣지 컨트롤러.
- 사용 칩: ATmega328P(제어), WIZnet W5100(이더넷), VL53L0X(ToF 거리), 74HC595(조명 확장).
- 프로토콜: I²C(센서), SPI(W5100 인터페이스), TCP/Telnet 포트 23(원격 제어), UART 115200(시리얼 제어), CSV 텍스트(데이터 리포팅).
- 플랫폼: Arduino Nano/UNO, KiCad 오픈 하드웨어 PCB.
- 핵심 가치: 가용 SRAM이 ~400바이트뿐인 8비트 MCU에서도 하드웨어 TCP/IP 오프로딩 덕분에 네트워크 제어 인터페이스를 안정적으로 구동한다는 것 — 즉 "작은 MCU + 결정적 유선 연결"이라는 산업 엣지 노드 설계의 전형.
유사한 기존 콘텐츠 (WIZnet Projects 내 검색)
선정 기준: 단순 키워드가 아니라 칩 / 프로토콜 / 플랫폼 / 응용 중 2개 이상이 겹치는 항목.
1. DryNoMore — 자동 관수 엣지 컨트롤러 (겹침 4개: Arduino Nano · WIZnet 이더넷 · 74HC595 · 엣지+서버 분리)
- 링크: https://maker.wiznet.io/mason/projects/drynomore/
- 유사한 이유: 동일하게 Arduino Nano 위에서 다채널 센서를 읽고 74HC595 시프트 레지스터로 전원/출력을 제어하며, 현장 노드(엣지)와 설정·알림을 맡는 서버를 분리한 구조. WIZnet 이더넷으로 서버와 동기화한다는 점까지 거의 동일한 설계 패턴.
- 다른 점: DryNoMore는 W5500 + Telegram Bot 기반의 저전력 슬립형 농업 노드이고, 본 프로젝트는 W5100 + Telnet 기반의 상시 동작 산업 검사 노드다. 또한 본 보드는 ToF 거리 센싱과 조명 제어라는 비전 보조 역할이 핵심.
- 연결 포인트: 둘 다 "8비트 MCU + 시프트 레지스터 + WIZnet 이더넷"이라는 동일 골격 → 시프트 레지스터 출력 제어 + 이더넷 동기화 공통 모듈을 묶어 시리즈 콘텐츠로 연결 가능.
2. AR22 LCU — STM32 방사선 검출기의 W5500 TCP 로깅 (겹침 2개: WIZnet 이더넷 · Telnet/TCP 센서 스트리밍)
- 링크: https://maker.wiznet.io/Benjamin/projects/ar22-lcu-w5500-ethernet-tcp-dose-logging-on-a-dual-range-stm32f446-radiation-detector/
- 유사한 이유: 센서 측정값을 WIZnet 이더넷 위 TCP 서버로 내보내고
telnet으로 바로 접속해 실시간 값을 받는 구조가 동일하다. 본 프로젝트의 "포트 23 Telnet 리포팅"과 사실상 같은 패턴. - 다른 점: AR22는 STM32F446(상대적으로 풍부한 RAM)에서 JSON 라인을 스트리밍하지만, 본 프로젝트는 SRAM이 극단적으로 부족한 ATmega328P에서 CSV 라인을 내보낸다 → MCU 등급과 리포팅 포맷이 다르다.
- 연결 포인트: "WIZnet 이더넷 = 가장 간단한 센서 텔레메트리 채널"이라는 주제로 저사양 MCU(CSV) vs 중급 MCU(JSON) 비교 콘텐츠를 만들 수 있다.
3. ROS2 Jazzy Rover ↔ W5500 유선 이더넷 브리지 (겹침 2~3개: WIZnet 이더넷 · 로봇 응용 · 유선 결정성 철학)
- 링크: https://maker.wiznet.io/viktor/projects/ros2-jazzy-rover-control-esp32-mqtt-w5500-ethernet/
- 유사한 이유: "Wi-Fi는 산업 환경에서 가장 먼저 끊긴다"는 문제의식 아래 로봇에 유선 WIZnet 이더넷을 적용해 통신 경계를 명확히 하는 설계 사상이 본 프로젝트의 산업 검사 로봇용 유선 제어와 맞닿아 있다.
- 다른 점: ROS2 Rover는 ESP32 + MQTT + ROS2 상위 스택을 갖춘 자율 주행 모바일 로봇이고, 본 프로젝트는 ROS 없이 단일 바이트 명령 기반의 단순·결정적 제어를 택했다.
- 연결 포인트: 같은 "검사 로봇" 도메인에서 단순 명령 제어 보드(본 글) → MQTT/ROS2 확장(ROS2 Rover) 으로 이어지는 확장 경로를 제시할 수 있다.
차이점과 확장 가치
기존 콘텐츠 대비 차별점. 위 3건과 달리 본 프로젝트는 (1) 비전 검사를 위한 조명 제어가 1차 목적이라는 점, (2) ToF 거리 기반으로 어떤 조명을 켤지 결정하는 센서-액추에이터 폐루프를 가진다는 점, (3) 그리고 무엇보다 2KB SRAM 한계와 정면으로 싸운 메모리 엔지니어링(시리얼 버퍼 축소, SRAM 잔량 감시, 소프트웨어 리셋 복구)이 명시적으로 드러난다는 점에서 다르다. WIZnet 하드웨어 TCP/IP가 "왜 필요한가"를 가장 극단적인 환경에서 보여주는 사례다.
확장 가치. 원 저장소가 직접 제안한 확장(MQTT over Ethernet, ESP32 포팅)은 maker.wiznet.io의 기존 자산과 자연스럽게 연결된다. 예컨대 본 보드의 CSV 텔레메트리를 ROS2 Rover 사례의 MQTT 브리지로 바꾸면 검사 로봇이 상위 SCADA/MES와 연동되고, ToF 기반 조명 결정 로직은 그대로 두되 W5100을 W6100/W55RP20 계열로 올리면 8비트의 메모리 곡예 없이 동일 기능을 더 여유롭게 구현할 수 있다. "메모리에 쪼들리는 ATmega328P → 여유 있는 RP2350+W6300" 마이그레이션 스토리로 묶으면 좋은 후속 콘텐츠가 된다.
PROJECT DESCRIPTION
문제 제기. 카메라가 부품 표면의 미세 결함을 잡아내려면 조명 각도·밝기와 표면까지의 거리가 일정해야 한다. 그렇다면 조명을 켜고 끄는 작은 보드 하나에, 풀 OS도 못 올리는 8비트 MCU를 쓰면서도, 검사 셀 밖에서 원격으로 안전하게 제어·기록하려면 어떻게 해야 할까?
이 프로젝트의 답은 — "제어 지능은 작게, 네트워크는 하드웨어에 맡긴다" 이다. 거리 판단과 조명 시퀀싱 같은 실시간 결정은 ATmega328P가 직접 하고, TCP/IP 처리는 통째로 W5100 칩에 오프로딩한다. 그 결과 ~400바이트 SRAM만 남은 MCU에서도 Telnet 제어 서버가 돌아간다.
0. 핵심 기술/부품 — W5100 하드웨어 TCP/IP와 VL53L0X ToF
이 보드의 두 축은 W5100과 VL53L0X다. W5100은 TCP/IP 스택을 칩 내부 하드웨어로 처리하는 WIZnet 이더넷 컨트롤러로, MCU는 SPI로 소켓 데이터만 주고받으면 된다. ATmega328P처럼 RAM이 부족한 MCU에서 소프트웨어 TCP 스택을 돌리는 것은 거의 불가능하기 때문에, "TCP/IP를 칩이 대신 해준다"는 점이 이 설계의 전제다. VL53L0X는 적외선 ToF(비행시간) 방식으로 mm 단위 거리를 측정하는 센서로, 검사 대상 표면과의 거리를 읽어 조명 결정에 쓰인다.
1. 개발 도구/플랫폼 — Arduino + Pololu VL53L0X 라이브러리
플랫폼은 Arduino(AVR/C++)이며, 거리 센서는 Pololu VL53L0X 라이브러리를 쓴다. 표준 Wire.h(I²C), SPI.h, Ethernet.h(W5100)만으로 구성되어 외부 의존성이 최소화되어 있다. 단, Pololu 라이브러리가 무겁기 때문에 그대로 빌드하면 스택 오버플로로 리셋이 발생할 수 있다는 점이 README에 명시되어 있어, 플랫폼 선택 자체가 메모리 제약과 직결된다.
2. 동작 원리 — 거리 읽기 → 조명 결정 → 보고
동작은 "측정 → 결정 → 출력 → 보고"의 순환이다. 펌웨어는 3개의 ToF 센서로 거리를 읽고, 선택된 조명 모드(순차 점등, 펄스, 센서 기반 최근접 조명, 타이머 점멸)에 따라 LED를 구동한 뒤, 그 결과(시간·버튼·거리·조명 상태)를 시리얼과 이더넷으로 동시에 내보낸다. 이 루프가 카메라가 촬영하는 동안 표면 조도를 능동적으로 맞추는 역할을 한다.
3. 장치 A 구현 — ToF 거리 센싱 서브시스템 (3× VL53L0X)
3개의 VL53L0X가 하나의 I²C 버스를 공유하되, XSHUT 핀으로 주소를 분리한다. VL53L0X는 기본 I²C 주소가 모두 같아서 버스에 여러 개를 그냥 붙이면 충돌한다. 그래서 부팅 시 XSHUT(A0/A1/A2)로 센서를 하나씩만 깨운 뒤 새 주소를 할당하는 순차 초기화가 필요하다.
// 의사코드: XSHUT로 주소 충돌 회피 for (i = 0; i < 3; i++) digitalWrite(xshut[i], LOW); // 전부 꺼서 버스에서 제거 for (i = 0; i < 3; i++) { digitalWrite(xshut[i], HIGH); // i번 센서만 활성화 sensor[i].init(); sensor[i].setAddress(0x30 + i); // 고유 주소 부여 } // 측정값: 정상(mm) / F=실패 / H=너무 멈 / 0=비활성4. 장치 B 구현 — 조명 제어 서브시스템 (직접 GPIO ↔ 74HC595)
조명은 직접 GPIO 6채널 또는 74HC595 시프트 레지스터 8채널 모드로 구동하며, 데이지 체인으로 최대 64채널까지 확장된다. 핀 수가 부족한 Arduino Nano에서 다수의 조명을 제어하려면 시프트 레지스터가 필수다. 명령 h/i로 두 모드를 런타임 전환하고, OE(출력 인에이블, D2 액티브 로우)와 SRCLR(클리어, A3)로 출력 전체를 안전하게 끄거나 초기화한다. "센서 기반 최근접 조명" 모드에서는 가장 가까운 표면 방향의 조명만 켜는 식으로 ToF 입력과 조명을 연동한다.
// 의사코드: 시프트 레지스터로 N번 조명만 점등 void setLight(uint8_t n) { uint64_t bits = (1ULL << n); digitalWrite(LATCH, LOW); for (int b = totalLights - 1; b >= 0; b--) shiftOut(DATA, CLOCK, MSBFIRST, (bits >> b) & 1); digitalWrite(LATCH, HIGH); // 래치로 출력 갱신 }5. 핵심 통신/제어 로직 — 단일 바이트 명령 + 이중 채널
제어는 시리얼과 Telnet(포트 23) 양쪽에서 동일한 단일 바이트 명령으로 이루어진다. 예: v(버전), a(센서 기반 조명), p(펄스 길이 증가), z(전체 소등 후 리셋), 0~6(개별 조명 점등). 8비트 MCU의 파싱 부담을 줄이려는 의도적으로 단순한 텍스트 프로토콜이다. 일부 명령은 README에서 Dangerous로 분류되는데, 카메라 보드가 조명에 과전압을 걸 수 있는 구성에서 조명 상태를 직접 바꾸면 하드웨어 손상 위험이 있기 때문이다.
⚠️ 보안 관점(설계 관찰): 포트 23 Telnet 서버에는 인증이 없다. 연구실 폐쇄망을 전제로 한 설계로 보이며, 산업 현장 배치 시에는 접근 제어가 필요하다 — 이는 9·12절의 개선 항목으로 연결된다.
6. 검증/예외 처리 — SRAM 감시와 소프트웨어 리셋
가장 특징적인 부분은 메모리 안정성 방어 로직이다. 부팅 시 가용 SRAM을 측정해 231바이트 미만이면 불안정으로 간주하고, resetFunc() 소프트웨어 리셋으로 저메모리 상태에서 스스로 복구한다. 또한 Pololu 라이브러리의 메모리 압박을 줄이기 위해 AVR 코어의 시리얼 버퍼를 TX 16B / RX 8B로 축소하도록 안내한다(이 상태에서 프로그램 ~66%, 동적 메모리 ~80% 사용, 잔여 401B). 거리값도 정상/실패(F)/범위초과(H)/비활성(0)으로 구분해 보고한다.
int freeRam() { // 스택과 힙 사이 여유 측정 extern int __heap_start, *__brkval; int v; return (int)&v - (__brkval ? (int)__brkval : (int)&__heap_start); } if (freeRam() < 231) resetFunc(); // 임계치 미만이면 자기 복구7. 서버 & 결과 — Telnet 제어 + CSV 텔레메트리
결과적으로 이 보드는 네트워크에서 접속 가능한 작은 제어 서버가 된다. telnet <ip> 또는 picocom -b 115200으로 접속하면 명령을 보내 조명 모드를 바꾸고, 동시에 상태를 CSV 한 줄로 받는다.
형식: time_ms, button1, button2, dist1, dist2, dist3, light0..N
예시: 1050, 0, 1, 523, 812, 1500, 1, 0, 0, 0, 0, 0상위 소프트웨어 Magician Grabber가 카메라/ATI/Teensy와 함께 이 보드를 묶어 검사 셀 전체를 조율한다. 즉 이 보드 단독 결과물은 "원격 제어 가능한 조명·거리 노드"이고, 시스템 결과물은 "조명·거리가 통제된 상태에서 촬영하는 자율 결함 검사 셀"이다.
Takeaways
- 하드웨어 TCP/IP의 존재 이유를 극단적으로 보여주는 사례다. SRAM 400바이트 환경에서 네트워크 서버가 돈다는 것은 W5100이 스택을 통째로 맡았기 때문이다.
- 시프트 레지스터는 핀 부족 MCU의 정석적 조명 확장 해법이며, 데이지 체인으로 6→64채널 확장이 코드 변경 최소화로 가능하다.
- 동일 I²C 주소 센서 다중 사용 = XSHUT 순차 초기화라는 패턴은 ToF·다중 센서 설계의 재사용 가능한 공식이다.
- 메모리는 기능이 아니라 안정성의 문제다. SRAM 감시·소프트 리셋·버퍼 축소가 펌웨어 신뢰성의 실질적 코어였다.
개선 여지
- 인증 없는 Telnet → 산업 배치 시 접근 제어/암호화 채널 필요. (원 저장소도 IoT 통합을 향후 과제로 명시)
- 8비트 SRAM 한계 → ESP32 또는 RP2350 계열로 이전 시 버퍼 해킹 없이 동일 기능 구현 가능(원 저장소가 ESP32 포팅을 향후 개선으로 언급).
- CSV 평문 리포팅 → MQTT over Ethernet으로 바꾸면 상위 MES/SCADA 연동과 다중 노드 수집이 쉬워진다(원 저장소 명시 과제).
- 조명 과전압 위험 명령 → 펌웨어 레벨 인터록/안전 상태 강제 추가 여지.
신규 설계 시 참고
비슷한 "센서 + 액추에이터 + 네트워크 보고" 엣지 노드를 새로 만든다면, MCU 선택 단계에서 메모리 여유와 네트워크 스택 부담을 먼저 분리해 판단하는 것이 좋다. 본 프로젝트처럼 8비트를 고수해야 한다면 W5100/W5500 같은 하드웨어 TCP/IP가 사실상 필수이고, 처음부터 W6100·W55RP20(RP2040)·W6300+RP2350 같은 조합을 택하면 메모리 곡예 없이 동일 구조를 더 안전하게 구현하면서 MQTT·TLS까지 자연스럽게 얹을 수 있다. 다중 동일 주소 I²C 센서, 시프트 레지스터 출력 확장, SRAM 잔량 감시는 그대로 재사용 가능한 설계 블록이다.
Documents
- 원 저장소(README·소스·PCB 문서): https://github.com/magician-project/magician_main_board
- 커넥터/배선 안전 가이드: https://github.com/magician-project/magician_main_board/blob/main/doc/connectors.md
- 상위 통합 소프트웨어 Magician Grabber: https://github.com/magician-project/magician_grabber
- MAGICIAN 프로젝트 홈페이지: https://www.magician-project.eu/
- 사용 라이브러리: Pololu VL53L0X Arduino Library (https://github.com/pololu/vl53l0x-arduino)

