WSL1 (Windows Subsystem for Linux 1)を導入にする

 Windowsのプロンプトだけでは、何かと不便を感じるので、WSLを入れようと思うのですが、他の仮想環境と共存させたかったので、あえてWSL1を導入します。

 

 コンパネの「プログラムと機能」から、「Windows の機能の有効化または無効化」

 

f:id:mtosak:20200907001207p:plain

 僕の場合は、以前有効にしたことがあったので、チェックボックスがオンになっていることを確認。

 

 設定の「更新とセキュリティ」から、「開発者向け」を開き、開発者モードにチェックを入れる。

f:id:mtosak:20200907001358p:plain

 念のため、古いWSLをアンインストールする。

> lxrun /uninstall

 僕の場合、インストールしていなかったので、反応なし。

 

 今回は、debianを使いたいので、Microsoft Storeからdebianを検索して入手。

f:id:mtosak:20200907001752p:plain

 インストール後、起動。

 

 通常のLinuxと同様に更新作業を実施。

$ sudo apt update
$ sudo apt upgrade

 僕の場合は、SSHを使いたいのでSSHをインストール。

$ sudo apt install ssh

 ざっくり以上。

 詳細なディスク容量の差分は見てないけど、debianの場合は初期インストールの時点で80MBくらい消費で、SSHをインストールした時点でトータル85MBくらい?

 便利な世の中になったもんだ。 

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

f:id:mtosak:20200822113142p:plain
 ちなみに私が利用させてもらった時点での最新は、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 PiSSH/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 W本体を購入して、Amazonからケースやケーブル類のセットを購入しました。

 前述しましたがPi Wは品薄の状態で現在も在庫0の状態が続いています。入手には、少し割高ですがAmazonを利用することが最も早いと思います。
 価格は日々変動していますが、概ね一式で5000円程度です。代用できる機器が多ければ多いほど初期投資に必要なコストは下がります。

スターターセット + USBケーブル

 購入の組み合わせ例も書いておこうと思います。 

 

 

  

 代用できる機器をほとんど持っておらず、初めて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を利用すると間違いがないです。

f:id:mtosak:20200822145937p:plain

 ちなみに、もし公式サイトからのダウンロードが遅い場合は、各国にミラーサイトもあります。日本であれば、例えばjaistからダウンロードできます。
 jaisthttp://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カードを利用する想定です。
 フォーマットの方法は、特に理由がなければクイックフォーマットを選択。

f:id:mtosak:20200822151453p:plain

f:id:mtosak:20200822151620p:plain

OSイメージの書き込み

 サイトからbalenaEtcherをダウンロード。
 インストールして、OSイメージをmicroSDに書き込みます。

 https://www.balena.io/etcher/

f:id:mtosak:20200822152107p:plain

  1.  Flash from fileからダウンロードしたOSイメージを選択します。
     (zipのまま選択可能です)
  2.  Select targetからフォーマットしたmicroSDカードを選択します。
  3.  Flash! を選択し、microSDカードにイメージを書き込みます。

f:id:mtosak:20200822161748p:plain

 

f:id:mtosak:20200822161821p:plain

f:id:mtosak:20200822162734p:plain

 ちょっと知識不足で申し訳ないのですが、私の環境では毎回validateが失敗します。もしかすると環境依存の問題かもしれません。スクリーンショット上はFaildと表示されていますが、書き込み自体には成功しているので、気にせずに進みます。

事前設定

 PCからmicroSDカードを抜く前に、microSDカードの最も上位の階層に"ssh"というファイル名の空ファイルを作成しておきましょう。

f:id:mtosak:20200822162911p:plain

 私の場合、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が起動します。

f:id:mtosak:20200822153514p:plain

 左側のminiHDMIポートとモニターを接続して、しばらく待つとRaspberry Pi OSのデスクトップ画面が表示されます。

 

f:id:mtosak:20200822165344p:plain

 ここまでくればOSの起動は完了。続いて初期設定をしていきましょう。

リモート環境構築

 OSの起動には成功しましたが、いちいち直接接続で操作をしていては面倒で仕方ないので、SSHVNCを使えるようにしてリモートで開発できるように設定していきましょう。

f:id:mtosak:20200822170759p:plain

 ここでは、ネットワークには未接続、HDMI経由でモニターに接続、USB経由でキーボード/マウスに接続できている前提とします。このスクリーンショットでは、USBポートに設定済みのlogicoolのレシーバーが刺さっていて、マウスとキーボードが使用可能な状態になっています。

 PCにUSBで直接接続して初期設定する方法もあるので、前提を満たせない場合はそちらを調べて試してみるとよいと思います。

 この記事ではベーシカルな方法で初期設定を実施していきます。

初期設定

 初回起動時にデスクトップ上に設定用のダイアログが表示されます。ターミナルなどを使って手動で設定することも可能ですが、せっかくなので使えるものは利用させてもらいましょう。

f:id:mtosak:20200822165615p:plain

f:id:mtosak:20200822165641p:plain

 地域の設定をしましょう。

  • Contory: Japan
  • Language: Japanese
  • Timezone: Tokyo

 Nextに進む際に時間がかかることがありますが、辛抱強く待ちましょう。

f:id:mtosak:20200822165836p:plain

 任意のパスワードを設定します。
 初期設定は"raspberry"ですが、念のため変更しておきましょう。

f:id:mtosak:20200822170048p:plain

 特にこだわりがなければNextで先に進みます。

f:id:mtosak:20200822170153p:plain

 しばらく待つと、wifiのアクセスポイントが表示されます。
 任意のアクセスポイントを選択します。

f:id:mtosak:20200822170253p:plain

 パスワードを入力して、LANに接続するのを待ちましょう。

f:id:mtosak:20200822170334p:plain

 (後ろでディレクトリを開いてますが、単純なスクリーンショットの撮影ミスなので気にしないでください)

 ソフトウェアのアップデートをGUI上で実施できますが、時間がものすごくかかるのと、この後の手順でアップデートしますので、ここでは一旦リモートの設定を優先するためにSkipしましょう。

f:id:mtosak:20200822170454p:plain

 これで初期設定は終わりです。
 素直にRestartを選択して再起動しましょう。

SSH経由の接続確認

 次にSSH接続を試してみましょう。

 本体はもうネットワークに接続できているので、PCから接続することが可能です。この時点で、Raspberry Piは電源のみが刺さっていれば十分な状態です。

f:id:mtosak:20200822171506p:plain
 PCにSSHクライアントがインストール済みの前提です。この記事では、windows10標準のsshコマンドをPowerShell経由で使っていきます。

 Windowsキー+R でファイル名を指定して実行ダイアログを開き、powershellと入力してPowerShellを開きます。

f:id:mtosak:20200822172003p:plain

 

f:id:mtosak:20200822172122p:plain

 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)? yes

Warning: Permanently added 'raspberrypi.local,fe80::ef80:456b:2901:bff8%16' (ECDSA) to the list of known hosts.
pi@raspberrypi.local's password:

 パスワードは初期設定したものを入力しましょう。

f:id:mtosak:20200822173521p:plain

 パスワード認証を無事通過し、めでたくSSH接続に成功しました。

 SSH接続した直後フォントが切り替わることがあります。その状態では日本語が表示できないので、タイトルバーを右クリック→プロパティで、フォントをMSゴシックにでも変更しておきましょう。

f:id:mtosak:20200822172225p:plain

 試しにSSH経由で再起動してみましょう。

 $ sudo reboot

 コマンドを実行すると、SSH接続が切断されます。Raspberry Piアクセスランプを見ていると、一旦ランプが消えた後、再びランプが動き始めて再起動したことが分かると思います。しばらくすると起動して再びSSH接続できるようになります。

VNCの設定

 続いてVNCで接続できるようにしていきましょう。
 もしLinuxに慣れていないとどうしてもGUI操作したくなって泣きたくなる場合があると思うので一応設定しますが、不要な方は省略しても大丈夫です。

 SSH接続した状態で、Raspberry Pi側の設定を変更します。

 $ sudo raspi-config

f:id:mtosak:20200822174535p:plain

 設定画面が開くので、 5 Interfacing Optionsを選択。

f:id:mtosak:20200822174747p:plain

 P3 VNCを選択。

f:id:mtosak:20200822174830p:plain

<はい>を選択。

f:id:mtosak:20200822174727p:plain

 VNCサーバーが有効になりました。
 ただ初期状態だと、認証方式がUNIX Password認証で多くのVNCクライアントで接続することが難しい状態です。今回は、外部に公開サーバーを構築するわけではないので、素直に認証方式をVNC Password認証に変更して使い勝手を良くしておきます。

 まず設定ファイルの中身を確認しましょう。

 $ sudo cat /root/.vnc/config.d/vncserver-x11

f:id:mtosak:20200822175649p:plain

 Authenticationを指定している行がないので、行末に追加しましょう。

 $ echo "Authentication=VncAuth" | sudo tee -a /root/.vnc/config.d/vncserver-x11
 $ sudo cat /root/.vnc/config.d/vncserver-x11

f:id:mtosak:20200822180159p:plain

 末尾に追加されたことを確認して、vncパスワードを設定しましょう。
 特に理由がなければ、piユーザのパスワードと同じでも構いません。

 ただ、繰り返しますがこれは外部に公開する予定がないから緩く作っているだけで、本来はもう少し気を付けたほうがよいので注意してください。

 $ sudo vncpasswd -service

f:id:mtosak:20200822180508p:plain

 パスワードを2回入力して登録完了です。
 一旦、再起動します。

 $ sudo reboot

VNC経由の接続確認

 Raspberry Piが再起動している間に、PCにVNCクライアントをインストールしましょう。この記事ではUltraVNCを使用します。

 公式サイトからダウンロードしてインストールします。

 https://www.uvnc.com/downloads/ultravnc.html

 UltraVNC Viewerを起動します。

f:id:mtosak:20200822181126p:plain

 接続先:raspberrypi.local:5900

 Raspberry Pi上でVNCサーバが待ち受け中の場合、パスワードを求められます。先ほど設定したパスワードを入力。

f:id:mtosak:20200822181251p:plain

f:id:mtosak:20200822181313p:plain

 認証に成功するとデスクトップ画面が表示されます。

 これで完全に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 

f:id:mtosak:20200822182843p:plain

 nanoは、viのような複雑なキーバインドがないシンプルなエディタなのでそのまま編集できます。一行目をコメントアウトして、次行にミラーサーバのURLを追加しましょう。

deb http://ftp.jaist.ac.jp/raspbian/ buster main contrib non-free rpi

f:id:mtosak:20200822184413p:plain

 保存はCtrl+O。

f:id:mtosak:20200822184448p:plain

 保存するファイル名を尋ねられるのでそのままEnter押下で上書き保存です。
 保存ができたら、Ctrl+Xでnanoを終了しましょう。

 念のため、catコマンドで変更が反映されているか確認します。

 $ sudo cat /etc/apt/sources.list

f:id:mtosak:20200822184520p:plain

 問題なければ、ミラーサーバの設定は完了です。

 ちなみに、/etc/apt/sources.list.d/raspi.list にもリポジトリが設定されていますが、こちらは軽く調べてみたところ、日本にはミラーサーバが存在しないようなので、そのままにしておきます。私自身、中国のサーバに設定を変更してみたりして試してみましたが、結局は公式サーバと速度に大差なかったので、この記事では甘んじて受け入れることにします。

パッケージの最新化

 早速ですが最新化していきましょう。とにかく時間がかかるので覚悟してほしいのと、もし途中で電源が切断すると重要なファイルが破損可能性があるので、安定した状態で実行するようにしてください。

 $ sudo apt update

 ※ エラーが出た場合、ミラーサーバの設定を失敗している可能性があるので確認してみてください。

 $ sudo apt upgrade

 $ sudo apt dist-upgrade

 $ sudo apt autoremove

microSDカードの延命

 Raspberry Piのメインストレージは通常microSDですが、microSDSSDなどと同じように書き込み上限が決まっているため、長期使用すれば必ず故障します。しかも、SSDなどとは違って、S.M.A.R.T情報を確認して故障の予兆を知ることもできないので、より厄介です。

 今回の用途はWEBサーバなどと違って、頻繁に書き込みが発生するような用途ではないので、短期間で一気にお亡くなりになることはないとは思いますが、気を付けなければならないのがスワップファイルです。

 Raspberry Pi Zero / Zero W / Zero WHのメモリサイズは512MB。現在入手可能なRaspberry Piのラインナップの中でも最小なので、普通に使えばスワップしがちです。スワップファイルは通常、頻繁に書き込みがされるものなので、microSDの寿命をダイレクトに縮めます。

 よって多くの場合、Raspberry Piの初期設定でスワップファイルを無効にしたり、ログファイルなど頻繁に書き込みが行われるファイルをRAMディスクに移動させるなど、延命のための予防をします。

 この記事では、スワップファイルの無効化だけ実施します。気になる方はほかにも延命方法があるので調べてみてください。

スワップファイルの無効化

 現在のメモリの状況を確認します。

 $ free

f:id:mtosak:20200822194920p:plain

 upgrade直後なので見事にスワップしています。これを無効化します。

 $ sudo swapoff --all

 $ free

f:id:mtosak:20200822195012p:plain

 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

f:id:mtosak:20200822195659p:plain

 ファイルの内容を確認して、dwc2とlibcompositeの記述がないことを確認します。

 $ echo "dwc2" | sudo tee -a /etc/modules
 $ echo "libcomposite" | sudo tee -a /etc/modules

 $ sudo cat /etc/modules

f:id:mtosak:20200822195926p:plain

 再びファイルの内容を確認して、文字列が追記されたことを確認します。

 $ 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

f:id:mtosak:20200822200953p:plain

 ダウンロードできました。実行権限がないのでchmodしてから実行しましょう。

 $ chmod 755 ./add_procon_gadget.sh

 $ sudo sh ./add_procon_gadget.sh

 実行するとWindowsRaspberry Piが認識されるはずです。
 ※動きがないときは、そのままPC側でUSBケーブルを抜き差しすると反応があるかも……

f:id:mtosak:20200822201632p:plain

 デバイスとプリンタの画面を見ると認識されていることが分かります。

 ※ デバイスとプリンタの画面を開く方法が分からない場合は、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

f:id:mtosak:20200822202640p:plain

 ばっちりクローンできました。

 ちなみに、先ほど使った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に設定します。

f:id:mtosak:20200822212426p:plain

 もし既に有線接続しているコントローラーがあれば、外しておいたほうが良いかもしれません。(私の環境では、Raspberry Pi以外は有線接続していない状態です)

物理的な接続

 Raspberry PiNintendo SwitchをUSBケーブルで接続します。

 Nintendo Switchはドックに接続している必要があります。
 USBケーブルは、Raspberry PiのUSB microB端子から、SwitchのドックのUSB A端子に接続します。

f:id:mtosak:20200822215743p:plain

 使用するUSBケーブルは、通信可能なケーブルである必要があります。(充電用ケーブルでは接続できません)

実行

 さっそく実行しましょう。もし、Raspberry Piを再起動している場合、add_procon_gadget.shを実行する必要があります。

 $ sudo sh ./add_procon_gadget.sh

 起動中に一度実行すれば、問題ありません。

f:id:mtosak:20200822210731p:plain

 add_procon_gadget.shを実行済みの状態で、再度add_procon_gadget.shを実行すると上記のようなエラーが出ます。実行したか分からなくなったときはとりあえず実行してみても特に問題ないようです。

 さて、demoを実行します。

 Switchはホーム画面か、ボタンの動作チェックの画面に移動しておきましょう。

 $ sudo go run demo/main.go

 

f:id:mtosak:20200822211113p:plain

 こんな感じでログが出てくれば、とりあえず正常に接続できているはずです。

 PCのキーを押下すると、Pro Controllerのボタン押下をエミュレートしてくれるので、キーを押下して動作を試してみましょう。最初のボタンは何度か押さないと反応しないことがあります。

 キーに対応するボタンの一部を記載しておきます。

 矢印ボタン上:Wキー

 矢印ボタン下:Sキー

 矢印ボタン右:Dキー

 矢印ボタン左:Aキー

 Aボタン:Enterキー

 Bボタン:Spaceキー

 Homeボタン:Escキー

 demo/main.goのソースコードを読むことで対応するキーや、動きの詳細が分かります。

 プログラムはCtrl-Cで終了します。

総括

 駆け足になってしまいましたが、環境構築からプログラムの実行までを書いてみました。実際はここからプログラムを応用して、目的を達成することが非常に重要になると思うのですが、最初の一歩までの手順となりますが、せっかくなので実績を残しておきたかったので書き残しました。

 ある程度知識がないと実行までのハードルがなかなか高そうだったので、情報共有の意味を込めて。参考の参考程度になれば幸いです。

初めてのRaspberry Pi (本体購入編)

 諸々の事情があって、今更(2020年)ながらRaspberry Piに興味を持ち、購入するに至ったので、その経緯などをまとめます。

Raspberry Piのラインナップ

 2020年8月現在、Raspberry Piを購入する際は、その用途や目的によってどのバージョンを購入するか選択する必要があります。

 この記事を執筆している時点では、私もどのバージョンがどんな用途に向いているか見極めかねている状態なので、とりあえずコストパフォーマンスの観点で、現在購入可能なRaspberry Piをリスト化して比較してみることにします。

※ 参考:https://ja.wikipedia.org/wiki/Raspberry_Pi

※ 実売価格は、2020/08/16現在の情報です

Raspberry Pi 4 Model B

  • 発売日:2019年11月26日(国内)
  • CPU:1.5GHz (4Core)
  • メモリ:1GB, 2GB, 4GB, 8GB (LPDDR4 SDRAM)
  • 入出力:USB2.0x2, USB3.0x2
  • 映像出力:micro-HDMI(2.0)x2
  • 有線LAN:Gigabit Ethernet
  • 無線LAN:802.11 b/g/n/ac, Bluetooth 5.0/BLE
  • 電源:USB Type-C 3A (15W)
特徴

 現状のRaspberry Piで一番スペックが高いため、強いマシンパワーが必要になるような用途に向いていそうです。メモリのスペックごとにモデルが存在しているので、用途とお財布に相談して選ぶ形になると思います。ちなみに8GBは後発で発売されました。

 もともとRaspberry Piのイメージは、ミニマルなコンピュータのイメージが強かったので、8GB発売のニュースを見たときは、8GBもメモリがあってUSB3.0に対応しているならもはや普通のPCとほとんど変わらないんじゃない!? という驚きを感じたのを覚えてます。

 デフォルトでデュアルディスプレイ可能な贅沢スペックなので、普通に安価で持ち運び可能な作業用PCとしても使えそうで、その応用力というか汎用性の高さが強みなのかもしれません。

 また、スペックが高くなればなるほど付きまとう問題ですが、発熱量は一番大きいので、ファンを設置するなど発熱対策に一番気を使う必要があるようです。

実売価格

 1GBは現在は入手しづらい状況のようです。個人的な所感ですが、Pi 4は比較的高負荷の作業用に利用することが多いと思うので、1GBはあまり需要がないのかも?

 コストパフォーマンスでいうと、4GBが一番価格とスペックのバランスが良いように感じます。

1GB (入手困難)
  • ¥6,000 (made in UK) Amazon
  • ¥-,--- (在庫切れ) スイッチサイエンス
2GB
4GB
8GB

Raspberry Pi 3 Model B+

  • 発売日:2018年6月29日(国内)
  • CPU:1.4GHz (4Core)
  • メモリ:1GB (LPDDR2 SDRAM)
  • 入出力:USB2.0x4
  • 映像出力:HDMI(1.3/1.4)
  • 有線LAN:Gigabit Ethernet over USB2.0 (max 300Mbps)
  • 無線LAN:802.11 b/g/n/ac, Bluetooth 4.2/BLE
  • 電源:microUSB 2.5A (12.5W)
特徴

 立ち位置的には、Pi 4の前モデルに当たります。Pi 4のスペックのバリエーションに比べると、単一のモデル(Model Aを含めると2種類)のみの販売なので、Pi 3を買うと決めたら、そんなに迷うことなく買えるかなと思います。

 特徴としては、4と比べると若干消費電力が落ちることとUSB3.0を利用できない点が比較したときに目立つ点だと思います。4ほどのスペックが必要でない場合などこのモデルを選択する余地が出てくるのかと思います。

 フルサイズのHDMIのインターフェースがあるので、取り回しが効きやすいのもポイントだと思います。

実売価格

 実売価格的には、Pi 4との差は大きくないのでこだわりがない限りは、Pi 4を選択したほうが無難かもしれません。

  • ¥5,198 Amazon
  • ¥5,775 スイッチサイエンス

Raspberry Pi Zero W/WH

  • 発売日:2018年3月30日<WH>(国内)
  • CPU:1GHz (1Core)
  • メモリ:512MB (LPDDR2 SDRAM)
  • 入出力:micro USB2.0x1 (OTG)
  • 映像出力:mini HDMIx1
  • 有線LAN:なし
  • 無線LAN:802.11 b/g/n (2.4GHz), Bluetooth 4.1, BLE
  • 電源:microUSB 1.2A (6.0W)
特徴

 現行モデルの中で、最軽量でスペックを落としたミニマムなモデルです。大きな利点は、価格の安さと消費電力の低さ。買おうか迷っているなら安価で手に入るので試してみるのには一番良さそうです。

 ちなみに、WとWHの二種類がありますが、WHはGPIOのピンヘッダ付きのバージョンです。Wを購入した場合、あとからGPIOを使いたい場合はハンダ付けの必要があるようです。

 Pi 4やPi 3ではオーバースペックになりすぎてしまう用途の場合に重宝しそうです。

実売価格

 1度限りしか購入することができませんがスイッチサイエンスさんでWを非常にお安く購入できます。定期的に入荷しているようなので、入荷待ちメールを登録してしばらく待つと買えました(実体験)。

 WHは在庫が常にあるようなのでお急ぎの方や、沢山必要な方はWHをオススメ。

Zero W
  • ¥2,980 Amazon
  • ¥1,320 スイッチサイエンス
Zero WH

Raspberry Pi Zero ver1.3

  • 発売日:2017年2月24日 (国内)
  • CPU:1GHz (1Core)
  • メモリ:512MB (LPDDR2 SDRAM)
  • 入出力:micro USB2.0x1 (OTG)
  • 映像出力:mini HDMIx1
  • 有線LAN:なし
  • 無線LAN:なし
  • 電源:microUSB 1.2A (6.0W)
特徴

 Zero W/WHからワイヤレス機能も削ぎ落したモデルになります。(実際に発売された順番からいうとZeroにワイヤレス機能をつけたものがW/WHになるので、因果関係が逆になってますが(^_^;))

 LANやBluetoothを利用しない用途や、インターネット繋がったパソコンと繋いで使う用途や、組み込みの領域に近い用途で使う場合、また学習目的で利用するなら抜群にコスパが良さそうです。

実売価格

 1度限りしか購入することができませんがスイッチサイエンスさんで非常にお安く購入できます。現状、在庫0ですが注文自体はできるようでした。

  • ¥2,980 Amazon
  • ¥660 スイッチサイエンス