KSP-Controller
KSP-Controller
Summary
KSP-Controller는 Kerbal Space Program용 커스텀 조종 패널을 만드는 프로젝트로, 현재는 Adafruit ESP32-S3 Reverse TFT Feather를 중심으로 UI, 입력 장치, USB HID, 유선 네트워크를 함께 실험하는 구조로 정리되어 있습니다. 여기서 WIZnet W5500은 보조 네트워크 인터페이스 역할을 맡아, 부팅 시 이더넷 초기화, DHCP 또는 고정 IP 설정, 그리고 ksp-controller.local 형태의 mDNS 노출까지 담당하도록 설계되어 있습니다.
이미지 출처 : AI 생성
What the Project Does
Kerbal Space Program(KSP)은 우주선, 항공기, 로버 등을 직접 설계하고 조종하면서 궤도 진입, 도킹, 착륙, 탐사 같은 임무를 수행하는 우주 비행 시뮬레이션 게임입니다. 단순한 아케이드 조작이 아니라 추진력, 연료 소비, 질량 변화, 중력권, 궤도 역학 같은 요소가 플레이 전반에 반영되기 때문에, 비행 전 설계와 비행 중 제어를 모두 세밀하게 다뤄야 합니다. 이런 특성 때문에 KSP는 일반 게임패드만으로는 부족한 경우가 많고, 다수의 스위치, 모드 전환, 상태 표시, 보조 입력 장치를 갖춘 별도 제어 패널이 특히 잘 어울립니다.
Kerbal Controller 예시 : https://www.instructables.com/Kerbal-Controller-the-Basics/
이 프로젝트의 핵심 목적도 바로 여기에 있습니다. 게임 조작을 범용 입력 장치 하나로 끝내지 않고, KSP 조작을 별도의 임베디드 패널로 분리해 물리 인터페이스로 확장하는 것입니다. 저장소 설명상 현재 실험 단계에서는 ESP32-S3 Feather 계열 보드를 기반으로 TFT 메뉴 UI, I²C NeoKey 키패드, 향후 확장 가능한 USB HID, 그리고 선택적 이더넷 연결을 함께 검증하고 있습니다. 즉, 입력은 버튼·키패드·엔코더 쪽에서 들어오고, 출력은 화면 표시와 LED 피드백으로 나가며, 네트워크는 진단·설정·이름 기반 접근 같은 보조 채널로 배치된 구조입니다.
이미지 출처 : AI 생성
아키텍처 관점에서 보면 이 저장소는 “최종 완성품”보다는 “기능 블록을 분리해 검증하는 실험용 백플레인”에 가깝습니다. README는 현재 플랫폼을 ESP32-S3 Feather 기반 실험 단계로 두고, 최종 빌드는 Teensy 4.1로 이동할 수 있다고 밝히고 있습니다. 다시 말해 지금의 구조는 UI, 입력 처리, 저장장치, 네트워크를 모듈별로 시험한 뒤, 필요하면 더 많은 GPIO와 성능 여유가 있는 최종 플랫폼으로 이식하는 전개를 전제로 합니다.
Why Use W5500 Instead of ESP32 Wi-Fi?
이 프로젝트에서 주목할 만한 설계 선택 중 하나는, 네트워크 연결을 단순히 “ESP32에 Wi-Fi가 있으니 그 기능을 그대로 쓰면 된다”는 방식으로 처리하지 않았다는 점입니다. 이 컨트롤러는 손으로 직접 조작하는 물리 패널을 목표로 하기 때문에, 무선 연결의 편의성보다 입력 반응의 일관성과 통신 지연의 예측 가능성이 더 중요할 수 있습니다. Wi-Fi는 배선을 줄일 수 있다는 장점이 있지만, 실제 사용 환경에서는 액세스 포인트 상태, 전파 간섭, 재연결 동작, 절전 전환 같은 변수로 인해 응답 타이밍이 흔들릴 수 있습니다. 반면 W5500 기반 Ethernet은 물리 링크가 고정되어 있고 통신 상태를 더 명확하게 관리할 수 있어, 사용자 입력과 시스템 반응의 안정성이 중요한 KSP용 컨트롤 패널에서는 더 적합한 선택으로 해석할 수 있습니다.
Where WIZnet Fits
이 프로젝트에서 확인되는 정확한 WIZnet 부품은 W5500입니다. 하드웨어 문서와 BOM에는 Adafruit Ethernet FeatherWing이 W5500 기반 보드로 명시되어 있고, 상위 PlatformIO 설정에는 -DUSE_ETHERNET, -DETHERNET_CS=10, 그리고 WIZnet의 WIZ_Ethernet_Library 저장소가 의존성으로 포함되어 있습니다. 문서상 역할은 단순 “인터넷 연결 가능” 수준이 아니라, SPI 기반 유선 네트워크 블록을 Feather 스택에 추가하는 것입니다.
이 선택이 임베디드 실험에 맞는 이유도 분명합니다. W5500은 하드와이어드 TCP/IP 구조를 사용하고, 최대 80MHz SPI, 32KB 내부 버퍼, 8개의 하드웨어 소켓을 제공하므로 MCU 쪽 네트워크 스택 부담을 줄이기 쉽습니다. 이 프로젝트처럼 ESP32-S3에서 화면, 입력, USB 기능을 동시에 시험하는 경우, 네트워크를 별도 칩으로 분리하면 펌웨어 구조를 단순하게 유지하기 좋습니다. 특히 이 저장소는 최종적으로 더 큰 I/O 구성을 염두에 두고 있기 때문에, 네트워크를 독립 블록으로 다루는 접근이 전체 아키텍처를 모듈화하는 데 유리합니다.
다만 현재 검증 가능한 범위에서는 W5500이 KSP 실시간 텔레메트리 전송 경로로 이미 완성되어 있다고 말할 수는 없습니다. README와 개발 로그에는 “Ethernet-based diagnostics”, “optional HTTP config”, “HID + Ethernet telemetry for KSP mods” 같은 목표가 적혀 있지만, 실제로 확인되는 펌웨어 코드는 우선 이더넷 초기화와 mDNS 응답기 구동까지입니다. 따라서 현 시점의 W5500 역할은 “완성된 게임 연동 통신”보다 “실험용 유선 네트워크 계층”으로 보는 편이 정확합니다.
Implementation Notes
저장소에는 W5500 사용 흔적이 문서 수준을 넘어 실제 빌드 설정과 펌웨어 코드에 남아 있습니다.
첫 번째로, 최상위 platformio.ini에는 다음과 같은 설정이 들어 있습니다.
-DUSE_ETHERNET-DETHERNET_CS=10https://github.com/Wiznet/WIZ_Ethernet_Library.git
파일 경로: platformio.ini
이 설정은 이 프로젝트가 SPI 칩 셀렉트 핀을 명시적으로 잡고, WIZnet용 이더넷 라이브러리를 빌드에 포함하도록 구성되어 있음을 보여줍니다. 즉, W5500은 선택 부품이 아니라 펌웨어 레벨에서 전처리 매크로와 라이브러리 의존성으로 연결된 네트워크 장치입니다.
두 번째로, firmware/src/main.cpp와 firmware/src/net_config.h에는 실제 초기화 흐름이 확인됩니다.
setupEthernet(useDHCP, mac, localIP, gateway, subnet, dns);if (EthernetBonjour.begin(hostname.c_str()))
파일 경로: firmware/src/main.cpp
또한 네트워크 설정 함수 내부에는 다음 호출이 있습니다.
Ethernet.begin(mac);Ethernet.begin(mac, localIP, dns, gateway, subnet);
파일 경로: firmware/src/net_config.h
이 코드는 부팅 시 SD 카드에서 설정을 읽고, DHCP 또는 고정 IP 방식으로 이더넷을 올린 뒤, mDNS 호스트명을 등록하는 구조를 의미합니다. 왜 중요한가 하면, 이 프로젝트의 네트워크 계층이 단순 링크 업 수준이 아니라 “설정 파일 기반 부팅 + 주소 할당 + 이름 기반 접근”까지 포함한 운영 흐름으로 설계되어 있기 때문입니다. KSP 컨트롤러 같은 실험 장비에서 이런 방식은 USB 직결 없이도 장치를 찾고 설정을 분리 관리하는 데 유리합니다.
Practical Tips / Pitfalls
W5500과 SD를 같은 SPI 버스에 올릴 계획이라면 CS 충돌부터 정리해야 합니다. 하드웨어 문서는 Ethernet CS를 기본 GPIO10으로 두되, 다른 FeatherWing과 충돌 시 GPIO9로 변경하는 시나리오를 적어 두고 있습니다.
이 프로젝트는 SD 카드 설정 파일을 읽은 뒤 이더넷을 초기화하므로, config.json 또는 mac.txt가 없을 때의 기본값 동작을 먼저 검증하는 것이 좋습니다. 현재 코드는 파일이 없으면 기본 MAC과 DHCP로 폴백합니다.
전원은 가볍게 보면 안 됩니다. 하드웨어 문서에는 전류 소모가 큰 상황에서 외부 3.3V 레귤레이터가 필요할 수 있다고 적혀 있습니다. TFT, NeoPixel, Ethernet, SD를 한 스택에 올리면 전원 안정성이 먼저 흔들릴 수 있습니다.
이 저장소는 실험 플랫폼으로 ESP32-S3를 쓰지만, 대형 패널로 갈수록 GPIO 수와 성능 여유가 부족해질 수 있습니다. 문서도 최종 단계에서 Teensy 4.1 전환 가능성을 따로 정리합니다.
KSP 연동을 이더넷으로 확장하려면 먼저 “현재 구현된 네트워크 기능”과 “향후 텔레메트리 목표”를 분리해서 보는 편이 좋습니다. 지금 확인되는 것은 이더넷 초기화와 mDNS이고, 실제 KSP 텔레메트리 루프는 개발 로그에 개념 스케치 수준으로 적혀 있습니다.
EMI와 배선 안정성 측면에서는 USB, TFT, NeoPixel, SPI Ethernet을 같은 섀시에 넣을 때 점퍼선 실험 배선보다 짧고 고정된 하네스로 넘어가는 시점을 빨리 잡는 것이 좋습니다. 이 프로젝트도 현재는 FeatherWing 적층과 브레드보드 실험 구성을 전제로 합니다.
FAQ
Q1. 왜 이 프로젝트에 WIZnet W5500을 쓰는 것이 맞나요?
A. 현재 구조는 ESP32-S3에서 TFT UI, I²C 입력, USB HID 확장을 함께 실험하는 형태입니다. 이런 조건에서는 네트워크를 MCU 내부 소프트웨어 스택에 더 얹기보다, W5500처럼 하드와이어드 TCP/IP 칩으로 분리하는 편이 구조가 단순합니다. W5500은 SPI 연결만으로 붙고, 8개 하드웨어 소켓과 32KB 내부 버퍼를 제공하므로 네트워크 계층을 독립 블록처럼 다루기 쉽습니다. 저장소도 바로 그 방향으로 W5500 FeatherWing과 전용 라이브러리를 포함하고 있습니다.
Q2. 이 프로젝트에서 W5500은 플랫폼에 어떻게 연결되나요?
A. 문서 기준으로 W5500 FeatherWing은 SPI를 사용하며, ESP32-S3 Feather의 MOSI/MISO/SCK를 공유하고 전용 CS를 둡니다. 제안된 기본 CS는 GPIO10이고, 충돌 시 GPIO9로 재할당할 수 있게 설명되어 있습니다. 다시 말해 연결 방식은 “공유 SPI + 분리된 CS” 구조이며, SD 같은 다른 SPI 장치가 있으면 CS 관리가 필수입니다.
Q3. 이 프로젝트에서 W5500이 하는 일은 정확히 무엇인가요?
A. 현재 검증 가능한 역할은 유선 네트워크 초기화, IP 설정, 그리고 mDNS 이름 광고입니다. 펌웨어는 SD 카드에서 네트워크 설정을 읽고 setupEthernet(...)으로 DHCP 또는 고정 IP를 적용한 뒤, EthernetBonjour.begin(...)으로 호스트명을 노출합니다. 따라서 지금 시점에서 W5500은 KSP 컨트롤 패널의 “네트워크 운영 레이어”를 담당한다고 보는 것이 정확합니다.
Q4. 초보자도 따라 할 수 있나요?
A. 완전 초보자에게는 약간 어렵습니다. 이유는 이 프로젝트가 단일 보드 예제가 아니라 TFT, 키패드, SD, Ethernet FeatherWing, 설정 파일, PlatformIO 빌드를 함께 다루기 때문입니다. 다만 임베디드 실험용으로는 좋은 구조입니다. 먼저 ESP32-S3 단독 부팅과 화면 확인, 그다음 NeoKey, 그다음 W5500 링크 업과 DHCP 확인 순으로 단계 분리하면 접근성이 올라갑니다.
Q5. Wi-Fi 대신 W5500 Ethernet을 쓰는 차이는 무엇인가요?
A. 이 저장소 문서만 놓고 보면 ESP32-S3는 Wi-Fi/BLE를 내장하지만, 프로젝트는 별도로 W5500 기반 유선 이더넷도 실험 대상으로 둡니다. 유선 Ethernet은 IP 확보와 물리 링크 상태가 더 예측 가능하고, 패널형 장비처럼 고정 설치되는 장치에 잘 맞습니다. 반면 Wi-Fi는 배선은 줄어들지만 RF 환경과 전원·절전 상태, 연결 재수립 같은 변수가 늘어납니다. 특히 이 프로젝트처럼 실험 장비를 책상 위에서 안정적으로 디버깅하려면 W5500이 더 통제하기 쉬운 선택입니다.


