Skip to content

buzzler/appleii-bluetooth-joystick

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

16 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Note

영어 원문은 README.en.md를 참고하세요.

이 저장소는 kirbyfrugia/appleii-bluetooth-joystick을 포크한 것입니다.


브레드보드 버전


목적

쓰던 옛날 아날로그 조이스틱이 별로 좋지 않아서 "새것"을 사려고 했습니다. 그런데 시대에 맞는 그저 그런 제품도 ebay에서 50달러 정도 한다는 걸 알게 되었습니다. 저는 짠돌이이고, 또 주변에 현대식 게임패드가 잔뜩 있습니다. 그래서 생각했죠. 그 현대식 게임패드들을 Apple IIGS와 Laser 128에서 쓰게 만들면 어떨까?

그렇게 해서 만든 것이 이 프로젝트입니다. 현대식 블루투스 게임패드를 Apple II에서 사용할 수 있게 해 줍니다. 어차피 조이스틱은 결국 살 것 같지만, 만드는 재미가 쏠쏠한 프로젝트였습니다.

전자공작을 좀 해 본 분이라면 부품을 잔뜩 쟁여두고 있을 겁니다. 이 프로젝트는 이론상 저렴합니다. 브레드보드, 저항, 다이오드 같은 흔한 부품들이 이미 있다면요. 대부분의 부품 단가는 낮지만 묶음으로만 팔기 때문에, 처음 시작하는 분이라면 결국 더 많이 쓰게 됩니다. Digikey가 좋긴 한데 배송비가... 결국 이미 가진 부품 상태에 따라 대략 15~35달러 정도가 들 겁니다.

참고: A2io라는 제품도 있더군요. 분명 더 잘 만들어졌겠지만 55달러였고 모바일 기기 사용이 필요해 보였습니다. 모바일 앱을 쓰고 싶지도 않았고, 직접 만드는 재미가 있었기 때문에 이걸 만들었습니다.

크레딧

Apple II 조이스틱이 어떻게 동작하는지는 주로 Laser 128 기술 참고 매뉴얼과 Quinn Dunki의 이 글을 통해 배웠습니다.

ESP32/블루투스 쪽은 Bluepad32를 사용합니다. 도움이 되었던 링크들입니다.

사용법

연결하기

DE9 커넥터를 조이스틱 포트에 꽂으세요. ESP32는 USB에 연결합니다. 두 장치는 따로 전원을 받습니다. 아래의 "전원 레일" 섹션을 보세요. 일반적으로는 어느 순서로 연결해도 괜찮습니다. 그래도 Apple II는 끈 상태에서 작업하는 것이 좋습니다.

컨트롤러 페어링

기본적으로 bluepad32는 페어링 모드에 들어간 기기가 있으면 자동으로 페어링합니다. 그런데 주변에서 다른 기기와 페어링하려는 컨트롤러까지 잡혀 버리면 곤란하므로, 직접 페어링 모드를 토글할 수 있도록 구현했습니다. 새 컨트롤러를 페어링하려면 핀 13(GPIO 13)을 LOW로 떨어뜨리면 됩니다. 물리적 스위치를 써도 되고, 브레드보드라면 그냥 GND에 연결해도 됩니다.

이미 컨트롤러 하나가 연결된 상태에서 다른 컨트롤러를 연결하면, 새로 연결된 쪽이 사용됩니다.

컨트롤러 캘리브레이션

조이스틱의 중앙이 Apple II에서의 중앙과 맞지 않는 경우가 있습니다. 아래 아날로그 스틱 동작 원리를 보면 그 이유를 짐작할 수 있을 겁니다. 게다가 수십 년 묵은 캐패시터가 그대로 있을 수도 있고요.

컨트롤러의 L1과 R1을 동시에 누르면 x, y의 오프셋 값을 잡아서 이후 조이스틱 입력에 반영합니다. 이걸로 컨트롤러 중앙을 보정할 수 있습니다. TotalReplay 이미지(검색해 보세요)에 들어 있는 조이스틱 프로그램을 사용하면 편합니다. 스틱을 중앙에 두고 L1+R1을 누르면 됩니다.

캘리브레이션 값은 플래시 메모리에 저장되므로 전원을 빼도 유지됩니다.

만들고 싶다면: 동작 원리

맨 위 경고에 적었듯, 저는 하드웨어 지식이 딱 어떻게든 굴러갈 정도뿐이고, 어떤 부분에서는 그것조차 부족합니다. 그러니 잘못된 점이나 위험한 부분을 발견하면 알려 주세요! 특히 Apple II를 손상시킬 위험이 있는 부분이라면 더더욱요. 더 좋게는, 더 나은 방법이 있다면 코드나 설계를 직접 기여해 주세요.

디지털 포텐셔미터(레오스탯으로 사용)로 만든 아날로그 스틱

전통적인 Apple II 아날로그 조이스틱은 꽤 단순합니다. 안에 축마다 하나씩, 150k 옴 포텐셔미터 두 개가 들어 있습니다. 스틱을 움직이면 포텐셔미터(이하 "팟")가 조정되어 Apple II 내부 회로의 저항을 바꿉니다. 컴퓨터는 그 저항을 통해 내부 캐패시터를 충전하는 데 걸리는 시간을 측정합니다. 충전 시간이 달라지므로 세밀한 움직임과 정확한 각도를 감지할 수 있습니다. C64나 Atari 같은 단순한 4방향 온/오프 디지털 조이스틱에 비하면 꽤 인상적이죠.

이 프로젝트는 디지털 포텐셔미터(이하 "디지팟")를 사용합니다. 현대식 게임패드의 스틱 위치를 디지팟의 저항 값으로 변환하는 식이죠. Apple II는 0~150kΩ 범위를 기대하지만 150kΩ 디지팟은 구하기 어렵습니다. 그래서 이 프로젝트는 축당 100kΩ 디지팟 두 개를 직렬로 사용합니다.

비용을 더 줄이려면 축당 디지팟 한 개만 써도 됩니다. 다만 범위 일부를 잃을 수 있습니다. 직접 시도해 보진 않았지만 다른 사람들이 물리 조이스틱을 만들 때 그렇게 한 사례가 있고, 흔히 들리는 불만은 비행 시뮬레이터 같은 게임에서 부족하다는 점이었습니다.

코드는 축당 두 개의 MCP4161 디지팟에 같은 와이퍼 값을 설정하고 직렬로 연결합니다. 예를 들어 150kΩ 저항을 얻으려면 두 디지팟을 각각 75kΩ로 설정합니다.

또한 제 옛날 조이스틱은 거의 정사각형에 가까운 움직임 범위를 보였는데, 현대식 게임패드는 원형에 가깝게 제한됩니다. 그래서 코드는 입력을 "사각형에 맞도록" 약간 보정합니다. 보정 강도는 코드에서 조정할 수 있습니다. SQUARENESS 값을 참고하세요.

마지막으로, 와이퍼가 얼마나 낮은 값까지 내려갈 수 있는지 제한하는 변수도 있습니다. 원하면 조정해 보세요. WIPER_MIN_SAFE를 보세요.

버튼

Apple II 버튼은 아주 단순합니다. 버튼 상태는 bluepad32에서 가져옵니다. 버튼이 눌리지 않았을 때는 Apple II 버튼 스위치 입력을 떠 있는(floating) 상태로 둬야 하고, 눌렸을 때는 470Ω 저항을 통해 5V로 끌어올립니다. 이를 위해 다이오드를 사용합니다.

전원 레일

이 프로젝트는 ESP32(3.3V 로직)와 Apple II(5V 로직)를 인터페이스합니다. 두 장치가 서로 다른 전압으로 동작하므로 신호 무결성과 하드웨어 안전을 위해 신경을 좀 썼습니다. 다시 한번 말씀드리지만 저는 전문가가 아니니, 설계상 결함이 보이면 알려 주세요.

레벨 시프팅, 격리, 페일세이프

ESP32에서 나오는 모든 3.3V SPI 및 제어 신호는 74HCT245 버스 트랜시버를 통해 레벨 시프팅됩니다.

  • 74HCT245는 Apple II 게임 I/O 포트의 5V 레일로 전원을 공급받습니다.
  • 참고: "T" 버전(HCT)을 사용하는 이유는 입력 임계값이 3.3V 로직과 호환되면서 Apple II와 디지팟을 위해 5V를 출력할 수 있기 때문입니다.

한쪽 시스템이 꺼져 있을 때 전원이 역류하거나 디지팟으로 잘못된 SPI 명령이 가는 것을 막기 위해, 74HCT245의 OE 핀은 하드웨어 페일세이프로 관리합니다.

  • 10kΩ 풀업 저항이 OE 핀을 Apple II 5V 레일에 연결합니다. 따라서 ESP32가 연결되지 않았거나 전원이 꺼져 있으면 OE가 HIGH가 되어 버퍼는 하이 임피던스 상태가 됩니다.
  • 2N7000 MOSFET이 인버터 역할을 합니다. ESP32 GPIO가 초기화되며 MOSFET 게이트를 HIGH로 구동하면, MOSFET이 OE 핀을 GND로 끌어내려 출력이 활성화됩니다.

참고: 2N7000은 게이트 임계 전압이 최대 3.0V까지 올라갈 수 있습니다. ESP32 출력이 3.3V이므로 트랜지스터를 완전히 켜기에는 마진이 크지 않습니다. OE 핀을 스위칭하기에는 보통 충분하지만, 결과가 다를 수 있습니다. 테스트하려면 OE 핀의 전압을 확인하세요. ESP32가 활성 상태일 때 0V에 가깝게 떨어져야 합니다. 게이트 임계 전압이 더 낮은 로직 레벨 MOSFET이 더 낫겠지만, 저는 2N7000을 잔뜩 갖고 있었고 제 환경에서는 잘 작동했습니다.

부품 목록

이 장치를 만들면서 사용한 부품들입니다. 비용 대부분이 브레드보드/브레이크아웃 보드 등에 들어가므로 PCB로 만들면 더 싸질 가능성이 큽니다. 대부분의 부품이 묶음 단위로 팔리기 때문에, 저항/다이오드 같은 부품을 이미 가지고 있지 않다면 더 많이 들 수 있습니다.

  • 1 - ESP32 - 개당 $6.67. Classic Bluetooth 모드를 지원하는 모델로 골라야 합니다. 위의 Bluepad32 문서를 확인하세요.
  • 1 - ESP32 브레이크아웃 보드 - 개당 $4.33. 필수는 아니지만 작업이 훨씬 편해집니다.
  • 4 - MCP4161-104E/P 디지팟 - 개당 $1.38
  • 1 - DB9 브레이크아웃 보드 - $7.96. 비용을 줄이고 싶다면 단순 수커넥터로도 가능합니다. 저는 배선이 훨씬 편해서 이 보드를 썼습니다.
  • 약 10개의 104 캐패시터 - 전체 약 $0.70.
  • 1 - 74HCT245N - 개당 $0.92.
  • 2 - 1N5817 다이오드
  • 1 - 2N7000 MOSFET - 개당 $0.08.
  • 저항. 가지고 있지 않다면 키트로 사세요. 1kΩ 6개, 10kΩ 몇 개, 470Ω 몇 개가 필요합니다.
  • 어떻게 만들지에 따라 전선과 단자.
  • 브레드보드나 납땜 가능한 보드. 원하는 것으로. 좋은 것은 약 $8.

레이아웃

KiCad로 만든 회로도를 참고하세요.

주의사항:

  • 제 ESP32는 그림에 표시된 핀 번호와 다른 핀 번호를 사용했습니다. 그러니 표시된 핀 번호보다는 GPIO/IO 라인이 맞는지 확인하세요.
  • 그림에는 없지만 전원 레일(VCC-GND 사이)에 0.1µF 세라믹 캐패시터(104)를 군데군데 넣었습니다.
  • Apple II는 버튼에 470Ω 저항을 요구합니다. 제 Laser 128에서는 이 값으로 버튼 인식이 살짝 경계선이었습니다. 사양이 470Ω을 요구하고 저는 겁이 많아서 권장하진 않습니다. 그래도 버튼이 잘 안 눌린다면 더 작은 저항으로 시도해 볼 수 있습니다. 본인 책임으로요.

다음 단계 / 가능한 문제

스틱 캘리브레이션용 물리 포텐셔미터를 추가하면 좋을 것 같습니다. 최소/최대 저항과 중앙 위치를 조정할 수 있는 거요. 그러면 훨씬 정밀한 캘리브레이션이 가능하고, 캘리브레이션 프로그램이 필요 없어집니다. 게임 도중에도 조정할 수 있고요.

스틱을 왼쪽 아래 끝까지 내리면 가끔 오버플로우가 일어나서 조이스틱 캘리브레이션 프로그램상에서 스틱이 위로 튀어 오르는 현상을 발견했습니다. 옛날 물리 조이스틱에서도 같은 현상이 나타나니, 실제 하드웨어 한계일지도 모릅니다.

저는 PCB를 설계해 본 적이 없는데, 누군가가 만든다면 꽤 저렴할 것 같습니다. 같이 만들 사람이 있다면 합류할 수 있어요. 저는 납땜 실력이 별로고 SMD는 무서워서 스루홀 부품을 사용했습니다.

About

ESP32-based adapter that lets modern Bluetooth gamepads work as analog joysticks on Apple IIGS / Laser 128 (Bluepad32 + MCP4161 digipots)

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages

  • C++ 100.0%