Raspberry Pi Zero W(WH) をUSB経由で Nintendo Switchに接続する
注意事項
この記事は、Nintendo Switch の本体やソフトウェア等を改造するものではありませんが、記事の内容を実行することは、Nintendo Switch利用規約 の第1条第5項に該当する可能性がありますので、それを承知した上で自己の責任において実施するようにお願いします。
イントロダクション
諸般の事情で、Raspberry PiのUSBガジェットモードを使って、Nintendo Switchに接続して、Pro Controllerの動きを模倣するプログラムを動かす機会がありました。せっかくなので、その足跡を記そうと思います。
ちなみに操作にそこまで精度が必要でない場合は、USB経由ではなくBluetooth経由のほうが断然楽です。Bluetooth経由の接続であれば、Raspberry Piを持たずともBluetoothドングルさえ持っていれば、仮想環境でも実現可能なので、かなり手軽です。
Bluetooth向けのライブラリは、https://github.com/mart1nro/joycontrol をおすすめします。とても使いやすく、拡張も容易です。もちろん複雑なことをするためにはPythonの知識が必要になります。ただし個人的な見解ですが、Joycontrolの開発に使われているPythonは学習コストが比較的低い言語なので、他のプログラミング言語の学習経験があるプログラマであれば、すぐに適応できると思います。
この記事ではBluetoothではなく、USBを使った接続をします。
利用するライブラリについて
USB経由でSwitchに接続するにあたって、どんな方法があるかを調べました。
現状ではマイコンを使ったものが主流のようですが、正直マイコン制御の必要性を個人的には感じず、マイコンを使うことのデメリットのほうが大きいように思えたので、別のアプローチはないか、という視点で調べていました。
私の拙い知識と、調べることのできた範囲で分かった事実は以下。
・仮想環境を使って実装することは難しく実機が必要
・LinuxのUSB Gadget APIを利用することが手早い
最も参考になったのは、このブログの記事です。
スマホでNintendo Switchを操作する 〜 USB GadgetでPro Controllerをシミュレート 〜
https://mzyy94.com/blog/2020/03/20/nintendo-switch-pro-controller-usb-gadget/
本記事では、mzyy94さんがGithubで公開しているnsconを利用させてもらい、そのdemoプログラムを実行するまでの導入手順を解説しようと思います。
https://github.com/mzyy94/nscon
ちなみに私が利用させてもらった時点での最新は、5/10のコミットです。今後、nsconの開発が進んでしまうと記事と差異が出る可能性があるので注意。
開発環境について
この記事を執筆時点(2020/08/22)の私の環境です。
必須の環境というわけではなく、近いほど再現性が高くなり、記事の内容についての信頼度が高くなると思います。
開発機 (LATITUDE E6230)
Windows 10 Pro
- バージョン:1903
- OSビルド:18362.900
Raspberry Pi Zero W
Raspbian GNU/Linux 10 (buster)
- イメージ:2020-02-13-raspbian-buster
- イメージ:2020-05-27-raspios-buster-full-armhf
Raspberry Piの購入
Pi Zero W/WHを選択する理由
Raspberry Piのラインナップの中で、USB Gadgetを最も低コストで利用することを目的にどのモデルが最適化を考えました。そうすると選択肢は、Pi Zero / Pi Zero W / Pi Zero WHの三択になりました。
開発しやすさを考えると、無線LANを標準で装備しているPi Zero W もしくは、Pi Zero WHが現実的な選択だと思います。
今回はGPIOピンヘッダを利用しないので、私はZero Wを購入しました。
ただし、Wは現状、国内の在庫が少ない状況なので、入荷を待つよりもWHを購入したほうが早いと思います。
ちなみに、無線LANの機能を使わずに頑張るならZeroでも可能ですが、リモートで開発が不可能になってしまうので、私はお勧めしません。
Pi Zeroを選択するなら(余談)
余談に近い話ですが、もしPi Zeroを使う場合、どんなデメリットがあるか。
USB Gadget モードを有効にすると、Zeroの基盤にあるたったひとつのUSBポートにSwitchを接続する必要があるため、ポートを占有してしまうことになります。
通常、開発する場合、ネットワークに接続してRaspberry PiにSSH/VNCでリモート接続する方法や、USBから直接PCに接続してネットワーク共有するような方法が主流です。
ですが、USBが使えない以上、無線LAN/有線LANのアダプターを接続することも、PCに直接接続ことも、またハブを利用してマウスやキーボード等の周辺機器を接続することもできないので、プログラムコードを書き換えるためにいちいちSwitchからUSBを抜いて、周辺機器を差し替える必要があり、かなり面倒になることが予想できます。
もちろん面倒さに目をつぶって、USBを抜き差しし毎回プログラムを書き込みなおすという手段も不可能ではないでしょうが、本来はLinux OSを搭載していてフレキシブルに開発を進められるRaspberry Piのメリットを全く享受できないため、非常にもったいなく感じます。
よって、この記事では無線LAN機能を搭載したPi Zero Wまたは、Pi Zero WHを利用することを前提にします。
実際に購入するには
minimal
今回の目的のために最低限必要なものは以下です。
- Raspberry Pi Zero W / WH 本体
- microSDカード(8GB~)
※ 新規で購入する場合は、コスパ的に32GBをおすすめします。 - USB2.0 A(オス) - microBケーブル (データ通信用)
※ スマホの充電用ケーブルがデータ通信できるなら代用可能
optional
追加で購入しておいたほうが良いものは以下です。
※ 必須に限りなく近いものも混ざってます
- 本体ケース
→本体保護のため - ヒートシンク
→発熱の抑制/熱暴走の回避のため - 電源(1.2A(6W)を満たすもの) / microUSBケーブル
→電源確保用 ※スマホ充電器でも代用可能 - microUSB OTG用ホストケーブル
→有線接続でマウスなどを接続するため - miniHDMIケーブル/変換コネクタ
→モニタに直接表示するため
Raspberry Piの導入経験がある場合や、十分な水準の知識を持っている場合、または多くの代用品を持っている場合は購入を省略することが可能だと思いますが、知識的に自信がない場合や初めて購入する場合はできる限り揃えたほうが、もしも不測の事態が起こった場合、対処しやすくなると思います。
いわゆる転ばぬ先の杖です。
ちなみに私はmicroSDカードとmicroUSBケーブル以外は所有しておらず、知識的にも不得意分野で自信がなかったのでほぼほぼすべて新規で購入してます。
電源に関しては、スマホの充電用に大き目なものを所有していたのでそれを流用しています。また、モニターはパソコン用のHDMI接続可能なモニターを代用。マウスやキーボードなどの入力機器は、logcool製でPCに接続しているものがある場合、ドングルを差し替えるだけでRaspberry Pi OSで動作するようなので、それを代用しています。
USBポートは単一なので、初期設定時に有線で入力機器を直接接続して利用したい場合は別途USBハブを利用するか、Bluetooth対応のキーボード/マウスを利用するとよいかもしれません。
この記事ではそのあたりの内容については割愛します。
実際に購入した組み合わせ
私が実際に購入した組み合わせです。
- Raspberry Pi Zero W(本体)
https://www.switch-science.com/catalog/3200/ - ケース / ヒートシンク / OTGケーブル / miniHDMIコネクタ
Raspberry Pi Zero WH スターターセット ヒートシンクケース アクリルケース GPIO 40ピン コネクタ ネジドライバー Raspberry Pi Zero W/Zero用
購入先についてはいくつか選択肢がありますが、私の場合はコストを抑えることが第一優先だったため、スイッチサイエンスさんからRaspberry Pi W本体を購入して、Amazonからケースやケーブル類のセットを購入しました。
前述しましたがPi Wは品薄の状態で現在も在庫0の状態が続いています。入手には、少し割高ですがAmazonを利用することが最も早いと思います。
価格は日々変動していますが、概ね一式で5000円程度です。代用できる機器が多ければ多いほど初期投資に必要なコストは下がります。
スターターセット + USBケーブル
購入の組み合わせ例も書いておこうと思います。
Raspberry Pi Zero WH スターターセット (10.5W小型電源, 高速型64GB MicroSD, USBスイッチケーブル, ケース, HDMIケーブル, MicroUSB変換付き)
- メディア: Personal Computers
代用できる機器をほとんど持っておらず、初めてRaspberry Piを手っ取り早く購入する場合におすすめの組み合わせです。ほぼほぼAll-in-Oneなので、色々悩むことなく買ってしまえる組み合わせだと思います。
スターターキットに、別途USBケーブルを組み合わせているのは、スターターキットの電源用のケーブルを通信用のケーブルとして流用できないかもしれない(商品説明上は確認できなかった)ので、念のためmicroB-AのUSBケーブル(Switchと接続するためのケーブル)を追加で買っておいたほうが良いためです。
もし、スマホ用に余っているケーブルがあれば流用できるので、通信が可能であると明記されているケーブルを持っているのであれば、わざわざ新しいものを購入せずとも問題ないです。
Raspberry Pi OS (Raspbian)の導入
Raspberry Piの起動
microSDにOSイメージを書き込んで、電源を入れて起動します。
Raspberry Pi Imagerを使う方法が最新のやり方のようですが、この記事ではbalenaEtcherを使ってmicroSDカードに任意のOSを書き込む方法を採用します。
OSイメージのダウンロード
Raspberry Pi OSの最新版を入手します。
公式:https://www.raspberrypi.org/downloads/raspberry-pi-os/
私は初めてRaspberry Piを利用したので、desktop and recommended softwareを導入しました。細かい手順が変わる可能性があるので、詳しくない方は同じようにdesktop and recommended softwareを利用すると間違いがないです。
ちなみに、もし公式サイトからのダウンロードが遅い場合は、各国にミラーサイトもあります。日本であれば、例えばjaistからダウンロードできます。
jaist:http://ftp.jaist.ac.jp/pub/raspberrypi/raspios_full_armhf/images/
このURLでいうところの、raspios_full_armhfが、desktop and recommended software(32bit)のことのようです。
2.5GB近くありますが、Raspberry Piからダウンロードするより、PCからダウンロードしたほうが基本的には性能的に早いと思うので大は小を兼ねるの気持ちで落としましょう。
※ 慣れている方はlite版などを利用しても問題ないです
microSDのフォーマット
OSイメージをダウンロードしている間に、SDアソシエーションのSDメモリカードフォーマッターを利用して、確実にフォーマットしていきましょう。
https://www.sdcard.org/jp/downloads/formatter/
上記サイトからダウンロードしてインストール。
microSDカードをPCに接続してフォーマットします。ここでは32GBのmicroSDカードを利用する想定です。
フォーマットの方法は、特に理由がなければクイックフォーマットを選択。
OSイメージの書き込み
サイトからbalenaEtcherをダウンロード。
インストールして、OSイメージをmicroSDに書き込みます。
- Flash from fileからダウンロードしたOSイメージを選択します。
(zipのまま選択可能です) - Select targetからフォーマットしたmicroSDカードを選択します。
- Flash! を選択し、microSDカードにイメージを書き込みます。
ちょっと知識不足で申し訳ないのですが、私の環境では毎回validateが失敗します。もしかすると環境依存の問題かもしれません。スクリーンショット上はFaildと表示されていますが、書き込み自体には成功しているので、気にせずに進みます。
事前設定
PCからmicroSDカードを抜く前に、microSDカードの最も上位の階層に"ssh"というファイル名の空ファイルを作成しておきましょう。
私の場合、microSDカードはDドライブにマウントされているので、D:\に"ssh"ファイルを作る感じですね。
Raspberry Pi OSは初期状態では、セキュリティ面を考慮してSSHが無効になっています。microSDの最上位階層にあらかじめ空ファイルを作成しておくことで、SSHをあらかじめ有効にすることができます。
ちなみに、ここであらかじめ無線ネットワークの設定をしておくことも可能ですが、初めての場合はGUI経由での設定をおすすめします。設定に失敗して、うまく無線LANが有効にならない現象に遭遇しました。その時は、結局再フォーマットしてインストールしなおしたので、この記事では確実な方法で設定を実施することにします。
2度目以降のインストールなど、慣れた状態であればネットワーク設定を実施してしまうのもありだと思います。その場合は、設定済みの /etc/wpa_supplicant/wpa_supplicant.conf をコピーして、再利用する方法をおすすめしますが、この記事では割愛します。
Raspberry Pi 起動
さっそく起動してみましょう。
PCから取り出したmicroSDカードをRaspberry Pi 左側のスロットの差し込み、電源に繋いだUSBケーブルを左側のUSBポートに接続します。
黄緑色のアクセスランプが点滅し始めて、OSが起動します。
左側のminiHDMIポートとモニターを接続して、しばらく待つとRaspberry Pi OSのデスクトップ画面が表示されます。
ここまでくればOSの起動は完了。続いて初期設定をしていきましょう。
リモート環境構築
OSの起動には成功しましたが、いちいち直接接続で操作をしていては面倒で仕方ないので、SSHとVNCを使えるようにしてリモートで開発できるように設定していきましょう。
ここでは、ネットワークには未接続、HDMI経由でモニターに接続、USB経由でキーボード/マウスに接続できている前提とします。このスクリーンショットでは、USBポートに設定済みのlogicoolのレシーバーが刺さっていて、マウスとキーボードが使用可能な状態になっています。
PCにUSBで直接接続して初期設定する方法もあるので、前提を満たせない場合はそちらを調べて試してみるとよいと思います。
この記事ではベーシカルな方法で初期設定を実施していきます。
初期設定
初回起動時にデスクトップ上に設定用のダイアログが表示されます。ターミナルなどを使って手動で設定することも可能ですが、せっかくなので使えるものは利用させてもらいましょう。
地域の設定をしましょう。
- Contory: Japan
- Language: Japanese
- Timezone: Tokyo
Nextに進む際に時間がかかることがありますが、辛抱強く待ちましょう。
任意のパスワードを設定します。
初期設定は"raspberry"ですが、念のため変更しておきましょう。
特にこだわりがなければNextで先に進みます。
しばらく待つと、wifiのアクセスポイントが表示されます。
任意のアクセスポイントを選択します。
パスワードを入力して、LANに接続するのを待ちましょう。
(後ろでディレクトリを開いてますが、単純なスクリーンショットの撮影ミスなので気にしないでください)
ソフトウェアのアップデートをGUI上で実施できますが、時間がものすごくかかるのと、この後の手順でアップデートしますので、ここでは一旦リモートの設定を優先するためにSkipしましょう。
これで初期設定は終わりです。
素直にRestartを選択して再起動しましょう。
SSH経由の接続確認
次にSSH接続を試してみましょう。
本体はもうネットワークに接続できているので、PCから接続することが可能です。この時点で、Raspberry Piは電源のみが刺さっていれば十分な状態です。
PCにSSHクライアントがインストール済みの前提です。この記事では、windows10標準のsshコマンドをPowerShell経由で使っていきます。
Windowsキー+R でファイル名を指定して実行ダイアログを開き、powershellと入力してPowerShellを開きます。
Raspberry Pi の初期ホストは、raspberrypi.localなので以下のコマンドで接続可能です。
> ssh pi@raspberrypi.local
The authenticity of host 'raspberrypi.local (fe80::ef80:456b:2901:bff8%16)' can't be established.
ECDSA key fingerprint is SHA256:69+nblw08z0AoQgVD3SpwPDuUTfNNrAoEqG5rktH/C4.
Are you sure you want to continue connecting (yes/no)? yesWarning: Permanently added 'raspberrypi.local,fe80::ef80:456b:2901:bff8%16' (ECDSA) to the list of known hosts.
pi@raspberrypi.local's password:
パスワードは初期設定したものを入力しましょう。
パスワード認証を無事通過し、めでたくSSH接続に成功しました。
SSH接続した直後フォントが切り替わることがあります。その状態では日本語が表示できないので、タイトルバーを右クリック→プロパティで、フォントをMSゴシックにでも変更しておきましょう。
試しにSSH経由で再起動してみましょう。
$ sudo reboot
コマンドを実行すると、SSH接続が切断されます。Raspberry Piのアクセスランプを見ていると、一旦ランプが消えた後、再びランプが動き始めて再起動したことが分かると思います。しばらくすると起動して再びSSH接続できるようになります。
VNCの設定
続いてVNCで接続できるようにしていきましょう。
もしLinuxに慣れていないとどうしてもGUI操作したくなって泣きたくなる場合があると思うので一応設定しますが、不要な方は省略しても大丈夫です。
SSH接続した状態で、Raspberry Pi側の設定を変更します。
$ sudo raspi-config
設定画面が開くので、 5 Interfacing Optionsを選択。
P3 VNCを選択。
<はい>を選択。
VNCサーバーが有効になりました。
ただ初期状態だと、認証方式がUNIX Password認証で多くのVNCクライアントで接続することが難しい状態です。今回は、外部に公開サーバーを構築するわけではないので、素直に認証方式をVNC Password認証に変更して使い勝手を良くしておきます。
まず設定ファイルの中身を確認しましょう。
$ sudo cat /root/.vnc/config.d/vncserver-x11
Authenticationを指定している行がないので、行末に追加しましょう。
$ echo "Authentication=VncAuth" | sudo tee -a /root/.vnc/config.d/vncserver-x11
$ sudo cat /root/.vnc/config.d/vncserver-x11
末尾に追加されたことを確認して、vncパスワードを設定しましょう。
特に理由がなければ、piユーザのパスワードと同じでも構いません。
ただ、繰り返しますがこれは外部に公開する予定がないから緩く作っているだけで、本来はもう少し気を付けたほうがよいので注意してください。
$ sudo vncpasswd -service
パスワードを2回入力して登録完了です。
一旦、再起動します。
$ sudo reboot
VNC経由の接続確認
Raspberry Piが再起動している間に、PCにVNCクライアントをインストールしましょう。この記事ではUltraVNCを使用します。
公式サイトからダウンロードしてインストールします。
https://www.uvnc.com/downloads/ultravnc.html
UltraVNC Viewerを起動します。
接続先:raspberrypi.local:5900
Raspberry Pi上でVNCサーバが待ち受け中の場合、パスワードを求められます。先ほど設定したパスワードを入力。
認証に成功するとデスクトップ画面が表示されます。
これで完全にRaspberry Piをリモートで動かすことができるようになりました。余程のことがない限り、直接的に接続して操作する必要はなく、基本的にPCの画面を操作するだけで済むので作業の負担がかなり減ります。
OSの最新化
さて、次にOSを最新化しましょう。
やることは単純ですが、非常に時間がかかるので何かの片手間に実施するのがちょうどいいくらいです。のんびりいきましょう。
ミラーサーバの設定
いきなりアップデートを実施しても良いのですが、Raspberry Pi初期設定では日本から接続するとダウンロード速度が遅い場合があるので、毎度おなじみjaistの肩をお借りしましょう。
まずPowerShellからSSH接続します。
> ssh pi@raspberrypi.local
Raspberry Pi OSには、標準でnanoというエディタが搭載されているのでこれを使用しましょう。ちなみにviも使えますが、私の環境ではそのまま使ってもうまく動作しないようだったので、この記事では素直にnanoを使います。
$ sudo nano /etc/apt/sources.list
nanoは、viのような複雑なキーバインドがないシンプルなエディタなのでそのまま編集できます。一行目をコメントアウトして、次行にミラーサーバのURLを追加しましょう。
deb http://ftp.jaist.ac.jp/raspbian/ buster main contrib non-free rpi
保存はCtrl+O。
保存するファイル名を尋ねられるのでそのままEnter押下で上書き保存です。
保存ができたら、Ctrl+Xでnanoを終了しましょう。
念のため、catコマンドで変更が反映されているか確認します。
$ sudo cat /etc/apt/sources.list
問題なければ、ミラーサーバの設定は完了です。
ちなみに、/etc/apt/sources.list.d/raspi.list にもリポジトリが設定されていますが、こちらは軽く調べてみたところ、日本にはミラーサーバが存在しないようなので、そのままにしておきます。私自身、中国のサーバに設定を変更してみたりして試してみましたが、結局は公式サーバと速度に大差なかったので、この記事では甘んじて受け入れることにします。
パッケージの最新化
早速ですが最新化していきましょう。とにかく時間がかかるので覚悟してほしいのと、もし途中で電源が切断すると重要なファイルが破損可能性があるので、安定した状態で実行するようにしてください。
$ sudo apt update
※ エラーが出た場合、ミラーサーバの設定を失敗している可能性があるので確認してみてください。
$ sudo apt upgrade
$ sudo apt dist-upgrade
$ sudo apt autoremove
microSDカードの延命
Raspberry Piのメインストレージは通常microSDですが、microSDはSSDなどと同じように書き込み上限が決まっているため、長期使用すれば必ず故障します。しかも、SSDなどとは違って、S.M.A.R.T情報を確認して故障の予兆を知ることもできないので、より厄介です。
今回の用途はWEBサーバなどと違って、頻繁に書き込みが発生するような用途ではないので、短期間で一気にお亡くなりになることはないとは思いますが、気を付けなければならないのがスワップファイルです。
Raspberry Pi Zero / Zero W / Zero WHのメモリサイズは512MB。現在入手可能なRaspberry Piのラインナップの中でも最小なので、普通に使えばスワップしがちです。スワップファイルは通常、頻繁に書き込みがされるものなので、microSDの寿命をダイレクトに縮めます。
よって多くの場合、Raspberry Piの初期設定でスワップファイルを無効にしたり、ログファイルなど頻繁に書き込みが行われるファイルをRAMディスクに移動させるなど、延命のための予防をします。
この記事では、スワップファイルの無効化だけ実施します。気になる方はほかにも延命方法があるので調べてみてください。
スワップファイルの無効化
現在のメモリの状況を確認します。
$ free
upgrade直後なので見事にスワップしています。これを無効化します。
$ sudo swapoff --all
$ free
Swapが消えたことが分かると思います。ただ、このコマンドを実行するだけでは、再起動時に自動でスワップファイルが生成されてしまうので、dphys-swapfileというパッケージを削除しておきます。
$ sudo apt remove dphys-swapfile
$ sudo apt autoremove
再起動して、もう一度確認します。
$ sudo reboot
$ free
再起動後もSwapが無効できていればOKです。
nsconの導入
nsconの開発者のmzyy94さんブログの記事を参考に初期設定をしていきます。
スマホでNintendo Switchを操作する 〜 USB GadgetでPro Controllerをシミュレート 〜
https://mzyy94.com/blog/2020/03/20/nintendo-switch-pro-controller-usb-gadget/
USBガジェットモードで起動する
まずは、ガジェットモードでブートできるように各種ファイルを編集していきます。
/boot/config.txt
/boot/config.txtに、dtoverlay=dwc2を追記します。
ファイルの末尾に追記してもよさそうですが、記述してほしそうな箇所が用意されているので、そこに追記しましょう。
$ sudo nano /boot/config.txt
(中略)
# Additional overlays and parameters are documented /boot/overlays/README
# Enable audio (loads snd_bcm2835)
dtparam=audio=on(中略)
↓
(中略)
# Additional overlays and parameters are documented /boot/overlays/README
dtoverlay=dwc2
# Enable audio (loads snd_bcm2835)
dtparam=audio=on(中略)
/etc/modules
/etc/modulesに、dwc2、libcompositeを追記します。
$ sudo cat /etc/modules
ファイルの内容を確認して、dwc2とlibcompositeの記述がないことを確認します。
$ echo "dwc2" | sudo tee -a /etc/modules
$ echo "libcomposite" | sudo tee -a /etc/modules
$ sudo cat /etc/modules
再びファイルの内容を確認して、文字列が追記されたことを確認します。
$ sudo reboot
再起動後、設定が有効となります。
Windowsとの接続確認
Nintendo Switchに接続する前にWindows PCに対して、Pro Controllerとして認識されるかどうかを確認します。
まず、Raspberry PiのUSBポートとWindows PCのUSBポートをUSBケーブルで接続します。
次に以下のシェルスクリプト(add_procon_gadget.sh)を実行します。
https://gist.github.com/mzyy94/60ae253a45e2759451789a117c59acf9#file-add_procon_gadget-sh
折角インターネットに接続しているので、直接ダウンロードして実行しましょう。
$ cd ~/
$ wget https://gist.githubusercontent.com/mzyy94/60ae253a45e2759451789a117c59acf9/raw/23ddee29d94350be80b79d290ac3c8ce8400bd88/add_procon_gadget.sh
$ ls -l
ダウンロードできました。実行権限がないのでchmodしてから実行しましょう。
$ chmod 755 ./add_procon_gadget.sh
$ sudo sh ./add_procon_gadget.sh
実行するとWindowsにRaspberry Piが認識されるはずです。
※動きがないときは、そのままPC側でUSBケーブルを抜き差しすると反応があるかも……
デバイスとプリンタの画面を見ると認識されていることが分かります。
※ デバイスとプリンタの画面を開く方法が分からない場合は、Windowsキー+Rで「ファイル名を指定して実行」に"control printers"を入力して実行すれば開きます。
これが確認できれば、準備完了。PCからUSBケーブルを抜いてください。
実行環境の作成
ソースコードのダウンロード
シンプルにgit cloneでソースコードをダウンロードしましょう。
とりあえず、場所は /home/pi/source/nscon をソースコードを管理する作業ディレクトリとしましょう。
$ mkdir ~/source
$ cd ~/source
$ git clone https://github.com/mzyy94/nscon.git
$ cd ./nscon
$ ls -l
ばっちりクローンできました。
ちなみに、先ほど使ったadd_procon_gadget.shは、Raspberry Piを起動するたびに実行する必要があります。使いやすいようにシェルスクリプトをnsconディレクトリに移動しておきましょう。
$ mv ~/add_procon_gadget.sh ~/source/nscon/
Go言語のインストール
nsconはGoで開発されているので、Goの実行環境がなければ動きません。Raspberry Pi OSにデフォルトではインストールされていないものの、aptコマンドでインストール可能なので早速インストールしましょう。
$ sudo apt install golang
少し時間がかかります。
お茶でも入れてのんびり待ちましょう。
インストールが終われば、ついに実行です。
demoプログラムの実行
Switchの準備
ホーム画面の「設定」から、「コントローラーとセンサー」メニューを開き、Proコントローラーの優先通信をONに設定します。
もし既に有線接続しているコントローラーがあれば、外しておいたほうが良いかもしれません。(私の環境では、Raspberry Pi以外は有線接続していない状態です)
物理的な接続
Raspberry PiとNintendo SwitchをUSBケーブルで接続します。
Nintendo Switchはドックに接続している必要があります。
USBケーブルは、Raspberry PiのUSB microB端子から、SwitchのドックのUSB A端子に接続します。
使用するUSBケーブルは、通信可能なケーブルである必要があります。(充電用ケーブルでは接続できません)
実行
さっそく実行しましょう。もし、Raspberry Piを再起動している場合、add_procon_gadget.shを実行する必要があります。
$ sudo sh ./add_procon_gadget.sh
起動中に一度実行すれば、問題ありません。
add_procon_gadget.shを実行済みの状態で、再度add_procon_gadget.shを実行すると上記のようなエラーが出ます。実行したか分からなくなったときはとりあえず実行してみても特に問題ないようです。
さて、demoを実行します。
Switchはホーム画面か、ボタンの動作チェックの画面に移動しておきましょう。
$ sudo go run demo/main.go
こんな感じでログが出てくれば、とりあえず正常に接続できているはずです。
PCのキーを押下すると、Pro Controllerのボタン押下をエミュレートしてくれるので、キーを押下して動作を試してみましょう。最初のボタンは何度か押さないと反応しないことがあります。
キーに対応するボタンの一部を記載しておきます。
矢印ボタン上:Wキー
矢印ボタン下:Sキー
矢印ボタン右:Dキー
矢印ボタン左:Aキー
Aボタン:Enterキー
Bボタン:Spaceキー
Homeボタン:Escキー
demo/main.goのソースコードを読むことで対応するキーや、動きの詳細が分かります。
プログラムはCtrl-Cで終了します。
総括
駆け足になってしまいましたが、環境構築からプログラムの実行までを書いてみました。実際はここからプログラムを応用して、目的を達成することが非常に重要になると思うのですが、最初の一歩までの手順となりますが、せっかくなので実績を残しておきたかったので書き残しました。
ある程度知識がないと実行までのハードルがなかなか高そうだったので、情報共有の意味を込めて。参考の参考程度になれば幸いです。