Petit4Send

Last modified on Jun 17 2019.

任天堂SWITCH用ソフトプチコン4へ、 Arduino(Pro Micro)を用いてファイルを転送するソフトです。

概要

PCからプチコン4へ、 ファイルを転送するためのソフトウェアです。 240byte/sec(1920bps)程度で転送できます。 動作には「Pro Micro」(Arduino互換機)が2台必要です。

また、プチコン4からPCへ画像を経由してファイルを転送したり、 接続されたPCのキーボードからプチコン4を制御する機能があります。

動作イメージ

動作イメージ
動作イメージ

動作環境

仕様

ダウンロード

プチコン4

4BKXWKAE

PC

  1. Ver. 1.1.0
  2. Ver. 1.0.0

ライセンス・利用料・寄付

ライセンス

このソフトは無料で利用して構いません。 今後有料化の予定もありません。 ご自由にお使いください。

2次配布、商用利用、改造、リバースエンジニアリングなどもご自由にどうぞ。

寄付

BitCoin、gumroadPayPalによる寄付を受け付けております。

サーバー維持費、証明書取得・維持費、開発環境構築・維持費等に用います。 明細を公表する予定はありません。 必要を上回った場合は公益機関に寄付し、その旨をサイト内で報告します。

BitCoin

BitCoin アドレス:16NMv1dX4hNpjvnqvRYgXS4neqHHpa6P3Y
16NMv1dX4hNpjvnqvRYgXS4neqHHpa6P3Y

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のパケット番号とします。 合計で同期に2bit消費されます。

キーボードを用いて転送するため、送る際のコードが「Ctrl+C」だったり「F5」だとプログラムが止まってしまいます。 他のサブプログラムを起動するようなキーでもダメです。 こういった制限を避けるのに、「Ctrlキー」および「ファンクションキー」を回避します。 これで3~4ビット程度の情報が減ります。 合計すると、送れる情報は35+4-2-3 = 34bitになります。

プチコン4側では、伝統通り、入力の情報はVSYNC≒16.7msec単位でしか更新されません。 またSwitchとの通信は8msec間隔なので、タイミングを制御する必要があります。

エラー検出はCRC16を用いました。 私の測定では、適切な条件を選べばパケット抜けは1/10000以下で、 3連続抜ける確率はほぼ考慮する必要がなく、 更にCRC16でのエラー見逃し率は1/60000以下です。 ですので、正常に転送された場合はほぼ間違いなくデータは破損していません。

また、転送レートが遅いのでLZSSによる圧縮をいれています。

画像転送

PetitModemと同様に、画像によるファイル転送を実装しました。 十分な解像度があるので、2bit/pixel、白黒のみとしています。

キーボードリレー・自動タイプ

PCと同時にプチコン4をいじるとキーボードがいくつもあって混乱するので、 PCのキーボード入力をそのままプチコン4用に送る、リレー機能を搭載しています。

また、コピペや短いテキストの転送がしやすいよう、自動タイピング機能があります。

作り方

Pro Micro2台を用いて、UARTインタフェースも自作する手順を記します。

  1. 部品の購入。

    下記の部品を購入。値段は全て購入時点のもの。

    • Pro Micro 5V/16MHz 2つ

      互換機でOK。1つ590円。一つはUARTインタフェース用。一つはUSBキーボードのエミュレート用。

      5V/16MHzを選ぶこと。

      ProMicroの写真
    • ブレッドボード一つ、ジャンパーピン 3本

      600円程度?

      ブレッドボードの写真
    • 「USB typeA オス←→ USB microB オス」変換ケーブル2つ

      600円

    • 「USB typeC オス←→ USB typeA メス」変換ケーブル

      659円。OTG対応のもの。

      OTGケーブル
  2. 組み立て
    • ProMicroのピンヘッダーがはんだ付けされていない場合ははんだ付けする。2枚とも。
    • ブレッドボードに2枚(Switch側、PC側と呼ぶ)とも挿す。
    • 下の表のように、3本のジャンパーピンを使って2枚のPro MicroのTXO、RXI、GNDを接続する。TXOとRXIは互い違いになるように。
      Pro Micro(Switch側)Pro Micro(PC側)
      TXORXI
      RXITXO
      GNDGND
      ProMicroのピンアサイン
  3. ProMicroのドライバをPCにインストール
    • Windows10の場合
      1. USBケーブルでどちらか一方のProMicroをさす
    • Windows7の場合
      1. SparkFunのサイトにあるドライバをダウンロード
      2. 展開して、「sparkfun\avr\signed_driver」にあるドライバをインストール。
      3. どちらか一方のProMicroを挿す。
      4. ちょっと待つ。ダメなら上記ドライバを指定してインストール。
  4. Petit4SendのファームウェアをPro Microに書き込む
    • Pro Micro(Switch側)をUSBでPCに接続。
    • Petit4Sendを起動。
    • [File]→[Write Firmware]を押して[Write Firmware for Pro Micro]ダイアログを出す。
    • Pro Microのつながったポートを指定し、「Petit4Send.ino.promicro.hex」を選ぶ。
    • [Write]を押す。
    • 「Success」と出たら成功。出ない場合は一度抜いてもう一回。
    • 書き込み終わったらPCから外すこと。
    Firm書き込みの写真
  5. UARTのファームウェアをPro Microに書き込む
    • Pro Micro(PC側)をUSBでPCに接続。
    • Petit4Sendを起動。
    • [File]→[Write Firmware]を押して[Write Firmware for Pro Micro]ダイアログを出す。
    • Pro Microのつながったポートを指定し、「USBUART.ino.promicro.hex」を選ぶ。
    • [Write]を押す。
    • 「Success」と出たら成功。出ない場合は一度抜いてもう一回。
  6. 完成
    ProMicroの写真

使い方

PCからプチコンへの転送

  1. ProMicro(PC側)とPCをつなぐ。
  2. ProMicro(Switch側)とSwitchをつなぐ。
  3. プチコン4でPetit4Sendを起動。
  4. PCでPetit4Sendを起動。
  5. 初回のみ
    1. プチコン4で[DETECT SYNC KEY]を選ぶ。
    2. PCで[Send]タブにある[DETECT]ボタンを押す。
    3. 10秒くらい待つ。
    4. プチコン4に[SYNC KEY]が表示されるので、それをPC側の[Sync Key]に入力する。
  6. 送りたいファイル、ファイルの種類を選んで「Send」を押す。
  7. 5秒ほどすると送受信が始まる。Switch側でファイル名やサイズ、ファイルタイプを確認して待つ。
  8. 転送が終わるとコントローラー入力待ちになるのでコントローラーの「A」を押す。
  9. 保存して終了。

プチコンからの画像転送

  1. プチコン4でPetit4Sendを起動。
  2. [SCREENSHOT SEND]を選ぶ。
  3. ファイルを選ぶ。(プロジェクト内にないと読めません
  4. 画像が表示されるので保存する。複数枚ある場合はすべて保存する。
  5. PCに送る。
  6. PCでPetit4Sendを起動。
  7. [Decode Image]タブに画像をドロップする。
  8. 保存先フォルダを選ぶ。
  9. [Convert]を押す

キーボードリレー

  1. [Keyboard]タブを開く。
  2. [Start]を押す。
  3. Petit4Sendがフォーカスを持っている間、キーボード入力がそのままプチコン4に送られ、キーボード入力になる。

自動タイプ

  1. [Typing Send]タブを開く。
  2. テキストボックスに送りたい内容を書く
  3. [Start]を押す。
  4. テキストボックスの内容がそのままプチコン4に送られ、キーボード入力になる。

注意点

添付のコンパイル済みファームウェアは「Pro Micro 5V 16MHz」用です。「3V 8MHz」には使えません。 速度的には足りるはずなので、「Pro Micro 3V 8MHz」を買ってしまった人は添付のソースファイルからコンパイルして利用してください。

[Sync Key]が間違っていると正常に転送できません。 [Sync Key]として-1を入力するといつでも通信できますが、160Bytes/secまでの速度しか出ません。 [Sync Key]はUSBを挿しなおしたり、SwitchがSleepするまで有効です。

USB MicroBのコネクタは非常に壊れやすいので、USBケーブルは挿しっぱなしの方が良さげです。

既知の問題と今後の改良予定

PC側で、転送を強制終了するとプログラムが落ちることがある。
.Netのバグです。 めんどうなので放置。
速度の向上
マウス・ジョイスティックなど他のデバイスの同時利用、 ビットストリームの最大効率化、 圧縮の順で改良していきたい。 あと1割は高速化のめどが立ってるけど、それ以上はきつい。
マウス・ジョイスティック等を使いたい
マウスはボタンを利用して5bit転送は出来ているのですが、 遅延に対応するためキーボードの半分の更新レートしかでないこと、 マウスを入れると多少キーボードの更新レートが遅くなること、 ライブラリに改造が必要でソースを配布しづらいこと等から見送っています。
圧縮
画像やデータ類が多いので、あるとだいぶ違いそう。ほしい。 実装した。
PCをキーボードとして使いたい。
USBケーブルを挿しなおすのが面倒で、HUBを使うと速度がおちるので、 そのままPCのキーボードをプチコン用に使いたい。 簡単にできるはず。 実装した。
逆向きの転送が欲しい

ほしい。リアルタイムの奴。 そしたらネットにもつなげられるのに。 また音声ってのはつらいなぁ…

キーボード側へ流れてくる情報は 「Caps Lock」や「Scroll Lock」のランプ用のものがある。 合計で5bit程度の情報があるんだが…プチコンからそれを制御する方法がない。

とりあえず画像転送を実装した。

よくある質問とよくある回答

なにこれ?

PCからプチコン4へファイルを転送したりするソフトです。

なんでUSBを使うの?

プチコン4にはそれしかないので。

遅いんだけど…

我慢で。

Arduinoって何?Pro Microって何?

自分で命令を組んで、送って、動作させられる小型のマイコンボードです。 USB機能がついてるものは特に便利です。 自作キーボードなどにも使われています。

Pro MicroはSparkFunという会社が出しているArduino互換のマイコンボードです。 USB機能がついていて、小型で便利です。

技術的な質問と回答

まだ質問はきていません。(2019/6/9)

更新履歴

2019/6/9 Ver. 1.0.0
  • 公開。

参考資料

プチコン4

プチコン4 ホーム

プチコン4のサイト

USB

HID Usage Tables 1.12

HID Usage Tables 1.12

Device Class Definition for HID 1.11

Device Class Definition for HID 1.11

Arduino

Arduino - Home

Arduino公式。

GitHub NicoHood/HID

Hid-Project。BootKeyboardなど、標準では対応していないHIDをサポートする際に使います。

SparkFun Pro Micro

Pro Microのページ。

Universal Asynchronous Receiver/Transmitter(UART)のWikipedia

シリアル通信の仕組みの一つ。

プチコン4用の他の転送ソフト

PCからプチコン4

今のところ見つけられていません(2019/6/17)

プチコン4からPC

ギターやんよ氏によるSRC2PIC

未評価。公開キーは【44A45D3Q3】