自製Switch Pro相容遊戲控制器(一):支援任天堂Switch遊戲機的USB手把

家裡的任天堂Switch遊戲機,Joy-Con控制器也出現了類比搖桿「漂移」的狀況,也就是明明沒有碰觸搖桿,遊戲裡的角色卻自己動了起來。一勞永逸解決這個問題的辦法有三個:

  • 更換Joy-Con的類比搖桿模組
  • 買個新的手把
  • 用Arduino自己做一個控制器

更換Switch遊戲機的Joy-Con類比搖桿

買一個新的類比搖桿,擰開幾個螺絲拆下舊的Joy-Con搖桿模組:

拆開Joycon

我另外買了半透明黑的Joy-Con副廠外殼,但只用了前半部,把Joy-Con的主板和類比搖桿挪到半透明外殼,再鎖回螺絲就完成了。

更換新的類比搖桿模組

換好類比搖桿和外殼前蓋的左Joy-Con控制器外觀:

更新模組之後的Hoycon

自製Switch Pro相容USB遊戲控制器

Jason Harley寫了一個Leonardo-Switch-Controller程式庫,可讓採用ATmega32U4微控器的開發板,如:Arduino Leonardo或Arduino Micro,被電腦或任天堂Switch遊戲機識別為Switch Pro控制器。

請先到Leonardo-Switch-Controller專案網站下載程式庫.zip原始檔,將它解壓縮之後,把其中的”Joystick”資料夾存入“文件/Arduino/libraries”路徑。

複製程式庫

Joystick程式庫的作用是建立遊戲控制器的USB HID Report(人機介面報告)和Report Descriptor(報告描述器),下一篇文章會補充說明,廣告一下,關於藍牙鍵盤滑鼠的HID報告說明,請參閱《超圖解ESP32深度實作》第16章BLE藍牙人機輸入裝置應用實作。

在boards.txt中新增開發板

原本在Arduino Leonardo板燒錄USB人機介面程式(如:鍵盤滑鼠和遊戲控制器)之後,下次要再燒錄其他Arduino程式,得先重新燒錄Arduino Bootloader(開機啟動程式韌體,相關步驟請參閱這一篇貼文)。本文使用的Leonardo-Switch-Controller程式庫提供一個開發板設定檔(boards.txt),可以讓Arduino Leonardo板的USB介面兼具人機介面和(燒錄程式用的)UART序列埠功能。

這是此程式庫的boards.txt當中的自訂“Leonardo Pokken”開發板的設置內容:

##############################################################

leonardotest.name=Leonardo Pokken
leonardotest.vid.0=0x2341
leonardotest.pid.0=0x0036
leonardotest.vid.1=0x0f0d
leonardotest.pid.1=0x0092
leonardotest.vid.2=0x2A03
leonardotest.pid.2=0x0036
leonardotest.vid.3=0x2A03
leonardotest.pid.3=0x8036

leonardotest.upload.tool=avrdude
leonardotest.upload.protocol=avr109
leonardotest.upload.maximum_size=28672
leonardotest.upload.maximum_data_size=2560
leonardotest.upload.speed=57600
leonardotest.upload.disable_flushing=true
leonardotest.upload.use_1200bps_touch=true
leonardotest.upload.wait_for_upload_port=true

leonardotest.bootloader.tool=avrdude
leonardotest.bootloader.low_fuses=0xff
leonardotest.bootloader.high_fuses=0xd8
leonardotest.bootloader.extended_fuses=0xcb
leonardotest.bootloader.file=caterina/Caterina-Leonardo.hex
leonardotest.bootloader.unlock_bits=0x3F
leonardotest.bootloader.lock_bits=0x2F

leonardotest.build.mcu=atmega32u4
leonardotest.build.f_cpu=16000000L
leonardotest.build.vid=0x0f0d
leonardotest.build.pid=0x0092
leonardotest.build.usb_product="POKKEN CONTROLLER"
leonardotest.build.board=AVR_LEONARDO
leonardotest.build.core=arduino
leonardotest.build.variant=leonardo
leonardotest.build.extra_flags={build.usb_flags}

請複製上面的文字,貼入本機的Arduino開發環境的boards.txt檔案,本機的boards.txt檔的預設路徑是:

  • Windows 10系統:“C:\Users\使用者名稱\AppData\Local\Arduino15\packages\arduino\hardware\avr\IDE版本\”
  • macOS系統:“~/Library/Arduino15/packages/arduino/hardware/avr/IDE版本/”

開啟本機的boards.txt檔,搜尋“leonardo”,找到Arduino Leonardo開發板的設置,在它的註解分隔線(####…)之前,貼入新的“Leonardo Pokken”開發板設置:

新新boards.txt

連接Arduino Leonardo板與傳統控制器(Wii Classic Controller)

Joystick程式庫可搭配任意遊戲手把(如:Sony PlayStation 2控制器),甚至是自行用類比搖桿模組和按鍵開關自製的遊戲控制器,只是相關的按鍵、搖桿感測程式要自己寫。CC_Leo_Switch.ino範例檔連接的是Wii傳統控制器,所以需要額外安裝驅動Wii控制器的“Nintendo Extension Controller(任天堂擴充控制器)”程式庫(NintendoExtensionCtrl)

連接Arduino與Wii傳統控制器(Classic Controller)的相關說明,以及控制器的按鍵布局,請參閱這一篇貼文

連接Leonardo板與傳統控制器(Wii Classic Controller)

上傳程式之前,「控制板」請選擇上文新增的“Leonardo Pokken”:

Arduino IDE

Joystick程式庫的類別方法說明,請參閱下一篇文章。

連接Switch測試自製的Switch Pro相容控制器

用USB線連接自製的Switch Pro控制器以及Switch主機,切換到「控制器→搜尋控制器」畫面,依照畫面的說明,按住自製控制器的L或R鍵,Switch將能感應到它,只是控制器的圖示呈現灰色:

Switch的搜尋控制器畫面

返回到上一層畫面,可以看到Switch感測到“Switch Pro”控制器,而且使用上沒問題:

Switch的控制器畫面

延伸閱讀

Posts created 469

4 thoughts on “自製Switch Pro相容遊戲控制器(一):支援任天堂Switch遊戲機的USB手把

  1. 詳細的說明,我想問一下我的理解是否正確
    1. 因為Switch本身支援USB HID裝置,才能讓數位資料進入Switch再由Switch判斷哪個鍵被按了
    2. 我在想是否有可能性能透過外接晶片的方式,讓本身不支援外接手把的老遊戲機升級,ESP32做得到這件事嗎?
    3. 有看到一個比較有意思的產品,但它的功能是反過來的,也就是透過外接晶片的方式讓老遊戲機變成手把,而不是外接手把來控制老遊戲機。似乎用的也是ESP32晶片,連結如下:
    https://shop.insidegadgets.com/product-category/wireless/

    綜上,我想知道是否能在老遊戲機中加裝一塊晶片來解析外接手把的數位資料,再輸出訊號啟動相對應的按鍵?若有可能,ESP32是否能做到?

    1. 你提到的「讓本身不支援外接手把的老遊戲機升級」,應該是指「讓不支援非原廠手把的遊戲機,支援其他廠商的新型手把」。

      一直以來都有周邊廠商或個人開發或破解遊戲機的控制器,大多是把A遊戲機的控制器用在B遊戲機或者其他設備,像美國就把Xbox控制器用在操控潛艇設備和拆彈機器人。

      除了常見的「把手」和「搖桿」,某些遊戲機還有獨特的控制器,像是釣魚竿、跳舞墊、光線槍、森巴沙鈴、電車駕駛、Kinect體感控制…等,很值得被再次活用。N年前就有人把Kinect接PC,用它感測到的人體姿態來玩任天堂瑪利歐遊戲。

      遊戲機大多採用專屬的介面和通訊協定,所以需要透過晶片和程式將A把手的訊號轉換成B遊戲機的格式。這方面的資訊還不少,很多都是用Arduino程式開發,無論是早期的Atari、NEC PC-Engine, 任天堂NES, GameCube, Wii, Sony PlayStation, SEGA MegaDrive, Saturn, Dreamcast等的控制器,都能找到訊號格式分析文件和程式實作。

      微控器不見得是用ESP32,因為初代的ESP32沒有原生的USB介面,到了ESP32-S2, S3等系列才支援,可以用程式模擬成USB-HID設備。這個”BlueRetro”開源專案(網址:https://github.com/darthcloud/BlueRetro)支援超多款遊戲機控制器,能把它們轉換成藍牙無線版。

      不過,像Xbox One系列主機,雖然它採用USB和藍牙介面,但控制器都內建加密晶片,系統也沒被破解,所以沒辦法直接連上自製的控制器。任天堂Switch遊戲機也採用USB和藍牙介面,但它的把手訊號沒有加密,系統也被破解,只要安裝“MissionControl”系統外掛(開源程式網址:https://github.com/ndeadly/MissionControl),就可以透過藍牙無線連接PlayStation Dualsens和Xbox One在內的多種控制器。

      have fun!

  2. 您好,我想使用arduino leonardo偵測Switch Pro遊戲手把的動作,想詢問是否可以將兩者連接再一起?或是有其他方式可以偵測?

    1. Arduino Leonardo無法連接Switch Pro遊戲手把,請試試ESP32和BlueRetro開源專案。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

Related Posts

Begin typing your search term above and press enter to search. Press ESC to cancel.

Back To Top