任天堂SWITCH用ソフトプチコン4へ、 Arduino(Pro Micro)を用いてファイルを転送するソフトです。
PCからプチコン4へ、 ファイルを転送するためのソフトウェアです。 296byte/sec程度で転送できます。 また、プチコン4からPCへ画像を経由してファイルを転送したり、 接続されたPCのキーボードからプチコン4を制御する機能があります。
動作には「Pro Micro」(Arduino互換機)等のデバイスが必要です。 デバイスの作成方法もこのページで述べますが、組み立てるだけで使えるキットも頒布しています。
このソフトは無料で利用して構いません。 今後有料化の予定もありません。 ご自由にお使いください。
2次配布、商用利用、改造、リバースエンジニアリングなどもご自由にどうぞ。
BitCoin、gumroad、PayPalによる寄付を受け付けております。
サーバー維持費、証明書取得・維持費、開発環境構築・維持費等に用います。 明細を公表する予定はありません。 必要を上回った場合は公益機関に寄付し、その旨をサイト内で報告します。
プチコンは4になっても相変わらず外部ファイルが読めないので、 データを読み込むためのプログラムを作りました。
プチコン4は音声入力がないため、残念ながら音声転送は使えません。 検討した結果、USBのHIDデバイスを自作して、USBキーボードをエミュレートし、 地道に転送するのが一番よさげということになりました。 なので、残念ながらハードウェアが必要になります。
なるべく安く、お手軽に、ということで、 簡単にUSBデバイスを自作できる「Pro Micro」を用いました。 2019年5月現在、amazonで互換機が最安600円程度で入手できます。 これだけでUSBデバイスが作れるのですが、Pro Microにデータを送る手段が必要です。 UARTという簡単なシリアル通信手法があるので、これを使います。 が、PCからUARTで出力するのに、UARTインターフェースが必要になります。 私はこれもPro Microで作りましたが、専用のハードでも構いません。 このページの使用方法などは2台のProMicroをそれぞれ「USBキーボード」「UARTインタフェース」として使うことを前提に書いています。
Pro MicroをSwitchにつないだ際、エミュレートされたUSBキーボードはInterrupt転送を行っており、 Switchからは8msec毎に情報の送信要請がきます。 USBキーボードは要請があるたびにその時点でのキーの押下情報やマウスの移動量をSwitchに送っています。 USBキーボードは同時に6キーの押下+8つの修飾キー(左右のSHIFT、CTRL、ALT、APP(WIN))が判定できます。 キーコードは1バイトですが、一部の値は使えず、また押下データの6つに重複した値は使えません。 プチコン4ではおおよそ180種のキーコードが使え、また修飾キーは4つまで使えます。 押下キー情報は、「180種の内から6つ選ぶ組み合わせ」だけあるので180C6=43424719800通り、おおよそ35bit。 修飾キーは4つで4bit。合計で39bitの情報があります。
SWITCHのクロックとProMicroのクロックとは正確に同期していないため、データを送る際には同期をとる必要があります。 1つのbitをON/OFFすることで同期をとります。 また、同期の「抜け」を確認するために、更に1bitを追加し、2bitのパケット番号としています。
キーボードを用いて転送するため、送る際のコードが「Ctrl+C」だったり「F5」だとプログラムが止まってしまいます。 他のサブプログラムを起動するようなキーでもダメです。 こういった制限を避けるのに、「Ctrlキー」「ファンクションキー」等を回避します。
Ver.1.2.0からはマウスのボタンの情報を追加しました。 チャタリング防止の為か、高速でオンオフすると正常に取得できないので、VSync2回に5bit分の情報を送っています。
プチコン4側では、伝統通り、入力の情報はVSYNC≒16.7msec単位でしか更新されません。 またSwitchとの通信は8msec間隔なので、24msec単位で転送するか、タイミングを制御して転送する必要があります。
以上のようなことから、Ver.1.2.0現在は、 1転送にかかる時間は16.7msec(高速モード)もしくは24msec(低速モード)で、 1転送あたり39.5bit転送しています。
エラー検出はCRC16を用いました。 私の測定では、適切な条件を選べばパケット抜けは1/10000以下で、 3連続抜ける確率はほぼ考慮する必要がなく、 更にCRC16でのエラー見逃し率は1/60000以下です。 ですので、正常に転送された場合はほぼ間違いなくデータは破損していません。
また、転送レートが遅いのでLZSSによる圧縮を適用できるようにしています。
PetitModemと同様に、画像によるファイル転送を実装しました。
十分な解像度があるので、2bit/pixel、白黒のみとしています。
いろいろな制限を考慮して1画像あたり181kByte程度転送できるようにしています。
PCと同時にプチコン4をいじるとキーボードがいくつもあって混乱するので、 PCのキーボード入力をそのままプチコン4用に送る、リレー機能を搭載しています。
また、コピペや短いテキストの転送がしやすいよう、自動タイピング機能があります。
Pro Micro2台を用いて、UARTインタフェースも自作する手順を記します。
下記の部品を購入。値段は全て購入時点のもの。
互換機でOK。1つ590円。一つはUARTインタフェース用。一つはUSBキーボードのエミュレート用。
5V/16MHzを選ぶこと。
600円程度?
600円
659円。OTG対応のもの。
Pro Micro(Switch側) | Pro Micro(PC側) |
---|---|
TXO | RXI |
RXI | TXO |
GND | GND |
添付のコンパイル済みファームウェアは「Pro Micro 5V 16MHz」用です。「3V 8MHz」や「Arduino Leonardo」には使えません。 速度的には足りるはずなので、「Pro Micro 3V 8MHz」を買ってしまった人は添付のソースファイルからコンパイルして利用してください。
[Sync Key]が間違っていると正常に転送できません。 [Sync Key]として-1を入力すると低速モードになります。 安定して通信できますが、206Bytes/secまでの速度しか出ません。 [Sync Key]はUSBを挿しなおしたり、SwitchがSleepするまで有効です。
Switchのドックに接続して充電していたり、他のUSB機器がつながっていると転送に失敗する場合があります。 その場合は直接挿すか、低速モード(SyncKey=-1)で転送してください。
Ver.1.2.0からマウスのボタンも転送に使っています。 転送中に押すとファイルが壊れます。
USB MicroBのコネクタは非常に壊れやすいので、USBケーブルは挿しっぱなしの方が良さげです。
PCが遅いと転送レートが下がることがあります。
ほしい。リアルタイムの奴。
そしたらネットにもつなげられるのに。
また音声ってのはつらいなぁ…
キーボード側へ流れてくる情報は
「Caps Lock」や「Scroll Lock」のランプ用のものがある。
合計で5bit程度の情報があるんだが…プチコンからそれを制御する方法がない。
とりあえず画像転送を実装した。
PCからプチコン4へファイルを転送したりするソフトです。
プチコン4にはそれしかないので。
我慢で。
クレードルなどUSBハブの類が繋がっているとタイミングがずれるため転送ができません。 SyncKeyに-1を入れると転送できる場合がありますが、転送レートが40%ほど下がります。
自分で命令を組んで、送って、動作させられる小型のマイコンボードです。 USB機能がついてるものは特に便利です。 自作キーボードなどにも使われています。
Pro MicroはSparkFunという会社が出しているArduino互換のマイコンボードです。 USB機能がついていて、小型で便利です。
ファームウェアのソースは添付してあるのでそちらをコンパイルしたらできるかもしれません。 HID-Projectというライブラリを修正して使っているので、 ソースの中にかかれている注意書きを読んで修正してください。
ジャンパワイヤーを挿すだけの組み立てキットをBoothで販売しています。 が、自分で部品を一つずつ注文して作るほうが安くて早くて楽しいのでそちらをオススメします。
プチコン4用のマインスイーパとPetit4Sendの使い方。
風に吹かれて氏によるプチコン4用のPC8801エミュレーターで使うために Petit4Sendでデータを送る方法の説明。
プチコン4のサイト
HID Usage Tables 1.12
Device Class Definition for HID 1.11
Arduino公式。
Hid-Project。BootKeyboardなど、標準では対応していないHIDをサポートする際に使います。
Pro Microのページ。
シリアル通信の仕組みの一つ。
今のところ見つけられていません(2019/6/17)
未評価。公開キーは【44A45D3Q3】
個人創作物がメインの販売サイト