Skip to content

ArduinoをNintendo Switchのコントローラとして動かす

Posted on:2018年12月29日 at 17:59

Arduino を Nintendo Switch のコントローラとして動かす方法。

Switch-Fightstick を利用する方法

Switch-Fightstickというものがある。

全部同じプロジェクト名なので注意が必要。
しかし、オリジナルのプロジェクトを fork して、それぞれの機能を付与しているだけなので、コアの部分は同じである。

色んな人が解説しているので、そちらを参照。

Arduino で使う場合は、AVR として使うため、Arduino の書き方や資産が利用できないので注意。

Switch-Arduino-Joystick を利用する方法

Switch-Arduino-Joystickというものがある。

こちらは多分未完成か、利用方法を説明していない。
使えるようにまでなったのでメモ書き程度に記載する。

前提

Switch に認識させる条件

Switch-Arduino-Joystick を認識させるために

PID,VID の変更

SparkFun のボードを利用している場合。

~/Library/Arduino15/packages/SparkFun/hardware/avr/1.1.12/boards.txt を開き、利用しているボードの*.build.vid, *.build.pid を変更する。

SendReport()の改変

ポッ拳プロコンの HID Report Descriptor は、REPORT ID が記載されていない。
HID().SendReport()の引数は(uint8_t id, const void* data, int len)であるため、先頭 1byte は id の送信に固定されている。 /Applications/Arduino.app/Contents/Java/hardware/arduino/avr/libraries/HID/src/HID.h を下記の改変を行うことで回避する。

int HID_::SendReport(uint8_t id, const void* data, int len)
 {
     auto ret = USB_Send(pluggedEndpoint, &id, 1);
     if (ret < 0) return ret;
     auto ret2 = USB_Send(pluggedEndpoint | TRANSFER_RELEASE, data, len);
     if (ret2 < 0) return ret2;
     return ret + ret2;
 }
int HID_::SendReport(uint8_t id, const void* data, int len)
 {
//     auto ret = USB_Send(pluggedEndpoint, &id, 1);
//     if (ret < 0) return ret;
     auto ret2 = USB_Send(pluggedEndpoint | TRANSFER_RELEASE, data, len);
     if (ret2 < 0) return ret2;
//     return ret + ret2;
     return ret2;
 }

上記手順にて、Arduino を Switch に認識させる事ができる。

全面コードを書き直して、新規ライブラリとして作成しました。
https://github.com/celclow/SwitchControlLibrary