2918/05/09 内容が曖昧な箇所や、よりbetterな方法を現在は知っている部分を修正
あらまし
splatoon2(以下イカ)の「投稿」でドット絵描くの面倒だからコントローラ作って自動的に打ち込ませようぜ!って動きがあるようで、試してみた。
先行記事で存在を知ったのだが、先行記事では「オリジナルリポジトリを勘違いしている」「必要な依存関係に関して記載がない」など、情報の間違いや抜けが見られる。何より非常に高価な上に入手がしにくいteensy++2.0を選択している。 ArduinoUNOは入手性がよいが、3000-3500円程度で安価ではない。また、廉価品ではCH340が搭載されていることが多いため、動作するかがわからない。
手元のpro microで行けそうだったので動作確認し、どうせ自分用にまとめるつもりだったからまとめた。
#Splatoon2 #スプラトゥーン2 #NintendoSwitch pic.twitter.com/lSnKleVpcj
— たかしすきー (@takashiski) 2017年9月9日
環境
今回の動作OSはWindows10で、bash on windowsを使う。
マイコンボードはatmega32u4を積んだpro microを使う。
書き込みにはArduinoIDEのavrdudeを使う。
先行記事にあるteensy++2.0やArduinoUNOは使わないので注意されたい。 特にArduinoUNOは下記手順では動かない。 teensy++2.0はもしかしたら動くかもしれないが、金銭的余裕がないので検証する予定はない。
- あらまし
- 環境
- 先行記事
- 必要なハードウェア・予算
- ダウンロード/インストールしておくもの
- 大まかな手順
- 画像の用意
- 画像をソースコードに変換する(bash on windows上)
- makeコマンドでhexファイルを生成する(bash on windows上)
- 書き込みコマンドを準備する
- 書き込む(powershell上)
- Nitendo Switchに接続する
- 最後に
先行記事
必要なハードウェア・予算
以下のものが必要である。
- AVRマイコンボード
- マイコンボードのコネクタに対応したUSBケーブル(mini, microなど)
- [オプション] USB typeA メス - USB typeC オスの変換アダプタ
- [オプション] ブザー
AVRマイコンボード
発案者のリポジトリのREADME.mdには以下の三つのマイコンボードが書かれていて、このプログラムはいずれもが使える。
teensy++2.0とArduino UNOに関しては先行記事で紹介されている。
atmega32u4
この記事では、atmega32u4を積んだ、「pro micro」というマイコンボードを使う。 これはArduino microやArduino Leonardoと同等の機能を備えたマイコンボードである pro microは国内入手の安値はおそらくaitendoである。しかし、秋葉原が近所にない場合は入手コストが大きい。
amazonが最速で届いてかつぼちぼちの価格であるので購入先として適当である。 amazonから購入するときに気を付ける点は、いくら安くともprimeマークがついていないものは中国から発送されて受け取るまでにおおよそ2週間以上かかるということだ。 以下はprimeのうち最安値で出品されていたものである(9/12調べ)。
余談だが、独自ブランドとして出品されていても、写真で明らかな違いがないものはシルク程度の独自要素すらあった試しがないので安いものを買えばよいと思う。
Arduino UNO
Arduino UNOを使った方法はこの記事では取り扱わないが、「Arduino UNOクローンでは動かないことがある」ということに関して先行記事で十分な説明がなされていないように感じたので知ってることを書く。
ArduinoUNOではメインのマイコンであるatmega328pではなく、前段のシリアル変換器と呼ばれる部分のチップを使っている。オリジナルではatmega16u2というAVRマイコンを使っているのだが、安価なクローンではAVRマイコンではなくCH340というシリアル変換チップを使っているケースがある。これはそもそもプログラマブルなマイコンではないので当然動かない。
区別は割と簡単で、USB付近に四角いチップが載っていたら大体atmega16u2である。USB付近に長方形の両側に足が出ているatmega16u2より大きい部品がついていたらそれはCH340が載っている。部品には部品名の刻印があるので写真を拡大してみたり、実機を見てみるとちゃんと書いてある。
また、オリジナルはatmega328pが大きく長方形で長辺に足が出ている部品なのに対し、CH340を使ったクローンは半分以下の大きさのチップのatmega328pを使っていることも異なる。
以下にamazonで適当に見つけた三つ並べておくので見比べてみてほしい。
- Switch Science販売の本物
- オリジナルとほぼ同じ部品構成のクローン
- より安価な部品を使ったクローン
- 出版社/メーカー: スイッチサイエンス
- メディア: Personal Computers
- 購入: 2人 クリック: 15回
- この商品を含むブログを見る
サインスマート UNO R3 ATmega328P 互換ボード + USBケーブル(Arduino UNO R3 Mega 2560 に対応)オリジナルバージョン
- 出版社/メーカー: サインスマート(SainSmart)
- メディア: Personal Computers
- この商品を含むブログを見る
KKHMF UNO R3開発ボード USBケーブル付属 Arduinoと互換
- 出版社/メーカー: Apple Trees E-commerce co., LT
- メディア: その他
- この商品を含むブログ (1件) を見る
USBケーブル
大体mini USBかmicro USBなので、マイコンボードの端子を確認して、持っていなかったら買おう。
iBUFFALO USB2.0ケーブル (A to miniB) スリムタイプ ブラック 1m BSUAMNSM210BK
- 出版社/メーカー: バッファロー
- 発売日: 2012/05/31
- メディア: Personal Computers
- この商品を含むブログを見る
基板上に実装されている micro USBコネクタは、抜き差し方向以外に力を加えると簡単にもげてしまうので、特に抜き差しするときはしっかりコネクタを抑えて抜き差ししてほしい。 以下のような先端がとれて磁気とくっつくようなケーブルを使うと、コネクタに負担がかからなくてよいかもしれない。ただし、たまにUSBデバイスの認識を失敗する。
[オプション] USB typeA メス-USB typeC オスの変換アダプタ
先行記事では何故か「本体のUSBポートに刺すので必須!」と書かれている。 しかし、switchのドックのUSBポートに刺せば認識される。 家でしか使わないならば、買わなくても問題ないのではないかと思う。
[オプション] ブザー
マイコンボードに接続することで、終わったら音で教えてくれるらしい(未確認)。
ダウンロード/インストールしておくもの
Switch-Fightstick(のイカ特化のforkプロジェクト)
shinyquagsire23
氏による Switch-Fightstick
の splatoon-2-printer
ブランチをベースとしてイカのドット打ち専用に改造されたリポジトリ。 master
ブランチはWiiU向けコントローラをSwitchで使うためのプロジェクトである。
フォーク元はWiiU向けの「Pokken Tournament Pro Pad」をSwitchで使うためのプログラムのようである。
完全に特化用途の別物なのに名前変えてないので非常に紛らわしい。
追記・修正[9/13]
EsProgram氏による先行記事の参照先を勘違いしていたので修正。
progmem
氏の リポジトリに splatoon-2-printer
branchが存在したのでそちらをフォーク・修正していたよう。
ただし、フォーク元は更新が一月程度されていなく、また先行記事の通り参照先が滅茶苦茶になっている恐れがある。
一方 shinyquagsire23
によるリポジトリではマイコン名を変更する程度で動かすことができ、かつ描画速度の2倍の高速化がなされている。
以下はフォーク元リポジトリの splatoon-2-printer
ブランチへの参照である。
LUFA
The Lightweight USB Framework for AVRs。
名前のまま、AVR向けの軽量USBフレームワーク。Switch-Fightstickが依存してる。
プロジェクト内の LUFAフォルダ
を参照するので適当な場所に配置すること。Switch-Fightstick
の makefile
からはデフォルトで ../LUFA/LUFA/
を参照している。
このパスは、 Switch-Fightstick
と同じ場所で git clone
するか、解凍することで満たされる。
Arduino IDE
これがなんであるかの説明は、流石に不要かと思う。bash on windowsはシリアルポートを認識しないので、Powershellからマイコンへのプログラム書き込みをするために使用する。
bash on windows(WSL)
powershell開いてbashって打って実行できたらOK。 だめだったらググってなんとかしていれて。
bash on windows上で入れるもの
画像のソースコード変換のためにpython2.Xおよびpillowが必要である。ただし、後述の一部行を変更することでpython3.Xでも動いた。
bash on windows上で以下のコマンド実行することで追加可能である。上記以外のパッケージは、上記パッケージの依存先である。 末尾のechoは全部終わった後にbeep音鳴らすコマンドなので必要に応じて削除していただきたい。
sudo apt-get install -y python-minimal sudo apt-get install -y python-pip sudo apt-get install -y zlib1g-dev sudo apt-get install -y gcc-avr sudo apt-get install -y avr-libc pip install --upgrade pip pip install pillow echo -e '\a'
大まかな手順
- 320x120のpngまたはraw画像を用意する(mspaint, GIMPなど)
- 画像をソースコードに埋め込むためのツールを使って変換する(python2.X, bash on windows)
- makeコマンドでコンパイル・hexファイルを生成する(avr-gcc, bash on windows)
- avrdudeコマンドでマイコンへ書き込む(Arduino IDE, powershell)
- Switchに接続する
画像の用意
320x120の画像を適当に用意すること。一応Switch-Fightstickにテストパターンが用意されている。
画像をソースコードに変換する(bash on windows上)
bash on windows上で実行する。
raw画像の場合は bin2c.py
, png画像の場合は png2c.py
の引数に画像のパスを入れて実行する。
python bin2c.py your_raw_path python png2c.py your_png_path
なお、python2.Xと指定されているが、python3.Xでも、以下の個所でエラーがでるだけなので、定数に置き換えれば動いた。
#変更前 for i in range(0, 320*120) / 8):
#変更後 for i in range(0, 4800):
makeコマンドでhexファイルを生成する(bash on windows上)
bash on windows上で実行する。 makeコマンドを叩く前に、makefile内に変更が必要なパラメータがいくつかあるので修正すること。
#MCU = at90usb1286 コメントアウトする MCU = atmega32u4 #追加する
以下はLUFAをmakefileの場所に対して ../LUFA/LUFA
以外に置いた場合に変更する
#LUFA_PATH = ../LUFA/LUFA コメントアウトする LUFA_PATH = your_LUFA_path #追加する
以上の2か所を変更した上で make
をたたけば、 Joystick.hex
が生成される。
書き込みコマンドを準備する
これ以降はPowershell上で行うのでexitするなりなんなりでbash on windowsから抜ける。
書き込みには以下のコマンドをhexファイルがあるフォルダで実行する。ただし、以下のコマンドは不完全である。
avrdude -c avrdude.conf -v -patmega32u4 -cavr109 -PCOMX -Uflash:w:Joystick.hex:i
どこが不完全かというと-Pオプションで指定するCOMポート番号が数値ではなくXとなっている。COMポート番号は環境によって異なるので調査する必要がある。
COMポートの番号はデバイスマネージャの「ポート(COMとLPT)」から確認できる。
何も書き込みをしていないpromicroは接続するだけでポートが表示されるが、これはpromicro上で動いているプログラムとやり取りするためのポートで書き込み用のポートではない。書き込み用のポートはpromicroにリセットを書けることで数秒間だけ表示される。リセットはRSTと書かれている穴とGNDと書かれている穴を繋ぐことでできる。金属で電気的な接続をすればよく、幸いにも隣通しなので、例えば金属のピンセットで抓むことでリセットを書けることができる。正直めんどくさいので適当なタクトスイッチをはんだ付けするか、ブレッドボード上でスイッチを取り付けたい。
デバイスマネージャー上に私の環境では「Arduino micro bootloader」と表示されるが、書き込まれているブートローダによって表示が異なる。名前が異なったとしても、promicroを接続していないとき、接続したとき、接続したままリセットを掛けたときの3回確認することで内容の差分から推測できるはずである。
前述のコマンドに、書き込み用のCOMポート番号を埋め込んだら書き込みコマンドの準備は完了である。
リセットに関するあれこれ
初期状態でプログラム領域にブートローダもどきが書き込まれている個体がまれに存在するらしい。その場合はリセットをかけてもブートローダもどきで止まってしまうので、さらにもう一回リセットを掛けてブートローラもどきを抜けてブートローダへたどり着く必要がある。つまりリセットを2回かける必要があるのだ。
書き込む(powershell上)
Powershell上で前項で作成した書き込みコマンドを実行する。promicroをリセットした直後に実行すること。
リセット直後以外の書き込みモードに切り替わっていないタイミングで実行すると、COMポート検出中の表示ののちに、検出失敗・COMポートが開けなかったとエラーがでる。
一度avrdudeコマンドで書き換えたあとは、常にUSBデバイスとしてふるまうようになるので接続してもそれまでとは違うデバイスとして認識される。リセットを書ければ、それまでと同様書き込み用ポートを見ることができる。
Nitendo Switchに接続する
まずイカを起動し、ポストから投稿の準備画面へ移動する。 ペンサイズは最小にする。
次に、PCからUSBケーブルを引き抜く。引き抜いたケーブルはドックのUSBポートに刺すか、USB type Cへの変換コネクタをつかって本体に接続する。
あとは自動的にSwitchコンとして認識・接続され、全消去、原点遷移を行った後にドット打ちが行われる。
注意点は、自動操作をさせているだけなので、本体の画面やボタンに触れないこと。ペンサイズが変わったり、座標がずれてもそのまま続行されるので、時間を無駄にする。
最後に
ちゃんと動くように、かつ可能な限り正確な情報を書くの、いろんなこと調べないといけないからめんどくさくてもうまとめたくないなっておもった。 てきとーに最低限の再現性を用意できるだけの記事を書けるようになりたい人生だった。