Skip to content

Lunar Lander on your phone, Jedi controls on the Arduino

Written in javascript & Arduino wiring, this project lets you control a smartphone with your mind (and an UNO), runs on both Android and iOS

Alan

Published January 23, 2026

Original author: Alex JonssonOriginal source (new tab)

Lunar Lander on your phone, Jedi controls on the Arduino

Project description

Lunar Lander를 “물리 컨트롤러”로 조종하기

스마트폰 게임을 Arduino + Ethernet으로 제어하는 Raw TCP 컨트롤러 제작기

PROJECT DESCRIPTION

Lunar Lander on your phone, Jedi controls on the Arduino, PROJECT DESCRIPTION

이 프로젝트는 스마트폰에서 실행되는 Lunar Lander(자바스크립트 게임) 를, Arduino UNO + Ethernet Shield 로 만든 물리 컨트롤러(버튼 + 가변저항)로 조종하는 제작기입니다.
핵심은 “마이크로컨트롤러/폰에 무거운 서버를 올리는 대신” Raw TCP 소켓 통신으로 오버헤드를 줄여 조작 지연(latency) 을 최소화하는 것입니다.


배경 및 동기

Lunar Lander의 오마주 클론(비상업용) 프로젝트가 존재했고, 이를 iOS/Android 에서 돌려보고 싶었습니다.

“스마트폰을 컨트롤러로 조종”이 아니라, 반대로 현실의 컨트롤러로 스마트폰 게임을 조종하는 경험을 만들고 싶었습니다.

네트워크 입력은 지연이 곧 체감 난이도라, Raw TCP(Chrome sockets 기반) 로 오버헤드를 줄이는 접근을 선택했습니다.


시스템 아키텍처

Lunar Lander on your phone, Jedi controls on the Arduino, 시스템 아키텍처

프로젝트의 전체 구성은 다음과 같습니다.

로컬 컨트롤러(Arduino UNO + Ethernet Shield)

아날로그 입력: 가변저항(스로틀 역할)

디지털 입력: 버튼(액션/트리거)

스마트폰 앱(웹 기반, Evothings Studio/Viewer로 실행)

스마트폰에서 게임 UI를 띄우고

TCP 소켓으로 Arduino에 연결해 입력을 받아 게임 동작에 반영


데이터 흐름

Lunar Lander on your phone, Jedi controls on the Arduino, 데이터 흐름

사용자가 가변저항/버튼 조작

Arduino가 값을 읽고(또는 이벤트를 만들고) TCP로 전송

스마트폰 앱이 TCP로 수신 → 게임 조작값으로 변환

결과적으로 “폰에서 게임은 돌아가되, 조작은 현실의 컨트롤러”가 담당


준비물 (Components)

Hardware

Arduino UNO ×1

Arduino Ethernet Shield(또는 Ethernet 연결 수단) ×1

가변저항(일반적으로 10kΩ) ×1

푸시버튼 ×1

브레드보드, 점퍼 케이블

Software

Evothings Studio(Workbench + Viewer)

(예제 소스) Evothings demo repo의 Lunar Lander 폴더(앱/Arduino 스케치 포함)


하드웨어 구성

Lunar Lander on your phone, Jedi controls on the Arduino, 하드웨어 구성

가변저항 → A0(Analog 0) 연결

버튼 → D3(Digital 3) 연결

Ethernet Shield 장착 후 라우터(또는 스위치)에 연결

Maker 글에선 여기서 Fritzing/배선 사진 1~2장을 넣으면 “한 번에 이해”가 됩니다. (Hackster 원문에도 Fritzing 스케치가 언급됩니다.)


구현 단계 (DETAILS)

1) Arduino 스케치 업로드

Arduino IDE에서 프로젝트의 arduinoeth.ino(스케치)를 열고 업로드합니다.

업로드 후 Serial Monitor로 Ethernet이 DHCP로 IP를 받는지 확인합니다.

DHCP가 없으면 스케치의 IP 관련 라인을 수동 설정하도록 안내(원문에 “라인 48~50 주석 해제”로 언급)

중요: 최종적으로 “Arduino의 IP 주소”를 메모해 둡니다(앱 설정에 필요).

2) Evothings Studio 준비

PC에 Evothings Workbench 설치

스마트폰에 Evothings Viewer 설치

3) 앱 설정 (IP 입력)

index.html의 IP 입력 영역(원문에서는 line 128의 ArduinoIpAddress 언급)에 Arduino IP를 넣어둡니다.

경우에 따라 app.js에서도 동일 IP로 TCP connect 설정이 필요합니다(원문에서는 line 26 언급).

4) 실행

Workbench에 index.html을 드래그&드롭 → RUN

스마트폰이 Arduino와 같은 Wi-Fi/같은 네트워크에 붙어 있어야 연결됩니다.

연결 후 버튼을 누르면 첫 “착륙 시도”가 시작됩니다.


포인트 정리 (왜 Raw TCP였나?)

이 프로젝트가 재밌는 지점은 “스마트폰 연동”이 아니라, 게임 조작 품질을 네트워크 설계로 끌어올린 것입니다.
원문에서도 “fat server를 피하고 raw TCP로 오버헤드/지연을 줄이려 했다”고 명확히 말합니다.


확장 아이디어

가변저항/버튼 외에 IMU(자이로) 를 붙여 “기울기 조종”으로 확장

LAN이 아닌 외부망 제어를 하려면, TCP 대신 WebSocket 브릿지/중계 서버를 추가해 구조 분리

입력값에 필터(이동평균/저역통과)를 적용해 조작 안정화


마치며

Lunar Lander 같은 단순 게임도, 현실의 입력 장치 + 네트워크 구조가 들어가면 완전히 다른 체험이 됩니다.
이 글의 목적은 “게임 하나 만들기”가 아니라, 연결된 디바이스 입력을 지연 적게 전달하는 방법을 손에 잡히는 예제로 정리하는 데 있습니다.

Comments

Comments