きよくらの備忘録

「三日坊主と呼ばせない!日記」改め。主にソフトウェア開発関連の話題。

VS2019以前で作成したデータベースの単体テストプロジェクトがVS2022で実行できない場合の対処

Visual Studio 2019(以下VS2019)以前のバージョンで作成したデータベースの単体テストプロジェクト*1をVisual Studio 2022(以下、VS2022)で開いてテスト実行すると、テストが正しく実行できない事象に遭遇しました。 その回避策についてのメモ。

※1年以上前に遭遇してメモしたのだけど、下書きのまま忘れていたので最新の環境で再確認した上で公開しておきます。

*1:SSDT : SQL Server Data Toolsに含まれるデータベース単体テストのこと

続きを読む

約200枚裁断できる裁断機 200DX-W を買ったら子供の問題集の再利用がはかどった

PPC200枚程度に対応した裁断機 Durodex 200DX-W を買いました。古めの業務用機器のマニュアルをタブレットで閲覧できるようPDF化する作業が発生し、また今後も(高頻度ではないものの)継続的に発生する見込みがある……というのが主な理由です。

選択の観点は『A4(長辺)を200枚程度を一度にカットできる性能』と、そんなに頻繁に使う予定もないので『なるべく低価格』という2点でした。 動力式のものも良いなとは思いましたが、想定している対象物や使用頻度ではオーバースペックと言わざるを得ない上に金額の桁が一つ上がるため、今回はスコープ外としました。

なお裁断後の取り込みは、元々所有しているScanSnap iX 1500を利用する前提です。

Durodex 200DX-W の使用感等

配達されて箱を持った第一印象は「思ったより重い」でした。あとでカタログスペックを確認すると9.8kgとなっていました。一般的な成人男性であれば持ち運びには苦労はしないと思いますが、例えば棚の上の方に保管するのは止めた方が無難かもしれません。

消耗品?の付属物として、プラスチック製の「刃受け(カットした時に刃と接触する台になる部分)」と単三乾電池2本が同梱されていました。乾電池はカット位置を投影するLED用です。説明書や注意書き的な印刷物も入っており、それらに従って本体の裏側部分に収納されている「刃受け」をセットするのさえ忘れなければ特に利用で悩むことは無さそうに思いました。

100ページほどの冊子を何冊かカットしてみましたが特に留意がコツが必要というわけでもなく、自然に力をかけるだけで綺麗にカット出来ました。 消耗品の「刃受け」と「刃」も(少なくとも現時点では)容易に入手できそうですし、そもそも自分の想定する仕様頻度だと少なくとも5年くらいは無交換で使えそうです。

現時点では、使用感や価格も含めて総合的に満足のいく買い物だと感じています。

余談:子供の学習用の問題集の自炊に便利だった件

少し話は変わります。

最近、子供が漢字検定の受験のために問題集を買って勉強を始めました。 書き込み式の問題集を購入したのですが(この手の問題集は概ねその方式)、一度やった程度ではなかなか身につくものでもなくやはり繰り返し利用したくなります。こういう場合は「別のノートに回答する」「問題集をコピーして書き込む*1」もしくは「もう一冊、問題集を買う」などが選択肢になると思います。

1つめの選択肢でもよいとは思うのですが、別のノートに回答すると答え合わせが少し面倒と私は感じて出でいます。特に我が子はは字が少々雑で読みにくく*2、仕事や家事の合間に採点する際に無駄にストレスになることが経験上分かってるので可能な限り避けたい。

なので私は普段は大抵は2つ目の選択肢を取っています。カラーレーザー複合機を所有しているので一枚あたりのコピー時間もたいしてかかりませんし、隙間時間に予めまとめてコピーしておけるので諸々のコントロールのしやすさを考えると一つ目の選択肢よりマシ、というのがその理由です(あくまで私としては)。とはいえ、やはりページをめくりながらのコピーがそれなりに手間がかかりますし、うっかり失敗することもありますのでもっと良い方法が何とか改善したいと思ってはいました。

3つ目の選択肢は、1冊数百円のドリル形式ものであったり全体を通して何度もやるような場合はそれでもよいのですが、『苦手なところだけ何度か繰り返す』ような使い方をしたい場合は無駄が多すぎることになります。

そんな状況だったところに、今回裁断機を購入したことで新たな道が開けたわけです。

書籍を自炊する習慣のある人/あった人ならとっくに思いついていそうですが、私は読書はそれなりに好きで電子書籍も読むものの『本を裁断しての自炊』は心理的な抵抗が大きく、今までやっていなかったこともあり全く思いつきませんでした。

大変勝手なもので、私の心理的抵抗は問題集に対しては働かないようで*3これらの作業は抵抗なく終えることができました。

取り込み後の印刷も、元々所有しているレーザー複合機でサクサク印刷できますしトータルで効率化・ストレス減を達成できました。 繰り返しやりたいところだけ印刷することも簡単ですし、両面印刷と多ページ割付が容易に行えるので手で1ページづつコピーするよりも、手間がかからない上に低コストで印刷できます。またページめくり方向などを工夫することで元の冊子の状態より使いやすいものにすることもでき、一石三鳥以上の効果を実感できています。

ということで、裁断機+スキャナによる自炊は、繰り返し学習に利用する問題集に適用すると色々と捗るのでお勧め、というメモでした。

*1:家庭内利用なのでこのコピーは著作権的にも合法という理解

*2:それはそれで直していこうと思ってはいますが

*3:おそらくですが、私はそもそも通常の書籍は『廃棄』はせず処分する場合は基本的には古本屋さんに売却や値が付かなくても引き取ってもらいます。しかし『参考書』のように解説が主のものは別として、所謂『問題集』特に書き込んで使うようなものは使い終わったら古紙回収などで廃棄してきました。この辺りの扱いの習慣が心理的抵抗感の差異なのかな、とぼんやり思ったりします

GP2040-CEで最強のSNESパッド to USBコンバーターを作った

スーパーファミコン(SFC/SNES)のコントローラーをUSBに変換するアダプタを作成したのでメモ。 ”最強”についてはあくまで主観です。異論は認める。

なお以前にもArduinoを利用してSNESコントローラーを(XInput)に変換するものを作成して使用していたのですが遅延が多少気になったのとNintendo Switchでも使いたくなったのでそのあたりを解消できるもの作ることにしました。

 

GP2040-CEにはSNESコントローラー・コンバーター機能がある

Raspberry Pi Pico(およびRP2040搭載の互換マイコン)を多機能・高性能USBゲームコントローラーにするOSSファームウェア GP2040-CEは、SNES(SFC)コントローラーの信号線をGPIOに接続することでコンバーターとして動作する機能を有しています。この機能を利用するとGP2040-CEの機能と性能をフルに近い*1形で享受できる高性能なSNESパッド to USBコンバーターを容易に作成することが可能になります。 ボタンのアサインは固定ですが、ごく直感的なものになっているので基本的に困ることは無いと思います*2

GP2040-CEのSNESパッドコンバーター機能についてのオフィシャルドキュメントは以下です。 gp2040-ce.info

GP2040-CEが対応している機種は現在のv0.7.11では以下です。つまりは現行のプラットホームでUSB刺さるやつなら大体OK、という感じになります。

  • XInput
  • DirectInput
  • Xbox One(要認証ドングル)
  • Xbox 360(要認証ドングル)
  • Nintendo Switch
  • PS3
  • PS4(PS3モードのしてレガシーコントローラーとして or 認証ドングルを使用してPS4 Native)
  • PS5(認証ドングルを使用してPS4互換モード)
  • NEOGEO mini
  • イーグレットツー mini
  • アストロシティー mini
  • メガドライブmini
  • PCエンジンmini
  • Playstation Classic
  • キーボード エミュレ―ション

任意のキーを割り付けできるキーボードエミュレーションもあるので、PC用のゲームやアプリケーションでゲームコントローラーに対応していないものでも、JoyToKey のようなソフトウェア無しでコントローラーで操作できるようになります。例えば最近だとscratchはゲームパッドに対応していませんが、GP2040-CEのキーボードモードを使用すればscratchで作成したゲームをゲームコントローラーで操作できるようになります。

またGP2040-CEは入力遅延についても現在存在するもののなかでも最低クラスですので*3、少なくともSNESコントローラーコンバーターとしては ”最強” を名乗ってもバチは当たらない筈です。

 

作ってみた

というわけで作ってみました。

試作1号機

ますは試作1号機(v1.0)です。

試作一号機

これは実は、KiCadでのPCB設計の練習と基板発注のお試し目的で作ったものでもあります。 そのため、機能面ではさほど問題はなかったのですが、下記の不満が残りました。

  • 基板のフットプリントが無駄にデカい
    • KiCadによる初めてのPCB設計だったので勝手もよくわからず出来上がりなどもうまく想像できてなかった
  • OLEDモジュールのピン配列に柔軟性が欠ける
    • 実は2台目を実装しようと思ったら手持ちのOLEDがピン配列違うのばかりだった...
    • 世の中のI2C OLEDモジュールは案外ピン配列がバラバラっぽい

試作2号機

そこで次に作成したのがこちらの試作2号機(v3.0)です*4

試作一号機での不満を解消しつつ、GP2040-CE v0.7.11で実装されたMini Menuを有効活用する方向性も狙って作成したものになります。フットプリントのサイズについては二階建てにすることで解消を考えました。OLEDのピン配置についても力技で対応しやすいようにしてみました。

これ以降は、は試作2号機についてのメモとなります。

 

仕様

ざっくり以下の仕様としました。

  • firmware : GP2040-CE v0.7.11
  • BOARD : Waveshare RP2040-Zero(互換ボード)
  • SNESコントローラー用コネクタを実装
  • OLEDを実装
  • パススルー認証用USBコネクタを実装
  • 以下のボタンをコンバーター基板上に実装
    • S2(Startボタン相当/Webコンフィギュレータモード遷移用)
    • A1 (Homeボタン、PSボタン相当)
    • A2 (Captureボタン、タッチパッド相当)
    • L2
    • R2
    • L3
    • R3
    • Turbo
    • Function (主に他のボタンと組み合わせでOLEDのMiniメニューを操作するホットキーとして使用)

MCU

MCUは実装サイズを重視してWaveshare RP2040-Zeroを利用することにしました*5

OLED

v0.7.11から搭載されたMini Menuが使えるとモード切り替えなどとても便利なのでOLEDも実装することにしました。部品代として~400円程度で入手できますし。 Mini Menuでは、Web Configを使用することなくコントローラー単体で動作モード(Xinput/PS4/Switch/DirectInput/XBOX/各種miniコンソール等々)の切り替えや十字キーの動作モード(D-PAD,L-Stick,R-Stick)切り替えもできるため利便性が上がります*6

Mini Menuについてはこちらも参照ください。

試作一号基板で問題になった『OLEDモジュールのピン配列が製品によって一定しない』件に対しては、パターンカットとジャンパで対応し易くしてみました。私の手元にあるものだけでも三パターンありましたし*7、今後もECサイトで買う場合は写真と実際に届くもので配列が違う可能性も否めません(特にAliexpressとかAmazonのマーケットプレースとかだと)。

アサインが異なる場合は白線の部分を必要に応じてパターンカットし適切にジャンパしてやればよい

各種ボタン

SNESパッドには存在しない、現代コンソールゲーム機が通常備えるL2/R2/L3/R3とA1(Home/PS等相当)、A2(CaptureやTachpad等相当)ボタンを基板上に配置しました。

足りないボタンをコンバーター上に配置

SNESパッドが適するようなゲームにおいて通常のゲーム操作で必要になることはあまりないかもしれませんが、ゲーム外の部分*8などで困る事が予想できるためです。また、前述のMini Menu操作にも使用できるという利点もあります。

S2ボタンは言わゆるStartボタン相当のボタンです。StartボタンはSNESパッド上に存在するのですが、ファームウェアの書き換えやリセットした直後等はSNESパッドがまた使用できない状態でWeb Configuratorに入る際にあると便利なのでえて配置しています*9 。 またこの理由から、firmwareの初期導入直後でもWeb Configモードに容易に入れるようにするためにS2ボタン対するGPIOのピンアサインは規定値のままとしています。

その他のボタンとして、連射機能のOn/Offを切り替えるTurboボタンと他のキーと組み合わせでホットキーを構成することでMini Menuの操作などを行うためのFunctionボタンを配置しています。 Functionキーを利用したホットキーのアサインは別途後述します。

USBコネクタ

パススルー認証用のUSBコネクタも実装しておくことにしました。 XBOXやPS4/5で利用する予定は現状ないのですが、USBコネクタは部品代としては安いので負担になりませんしGPIOも余裕がありまた基板上のスーペースも空いているので…という程度の理由です。将来的に使いたくなる可能性も十分ありますし。

MayFlash MagicBoots FPS PS4 V1.1でPS4の認証OKを確認

 

ピンアサイン

想定するGPIOのアサインは以下の通りです。

GPIO Assign GPIO Assign
00 Function 11 SNES Data
01 S2 12 SNES Latch
02 Turbo 13 SNEC Clock
03 Turbo LED 14 A1
04 OLED SDA 15 A2
05 OLED SCL 16 (on board RGB LED)
06 [N/A] 17-25 [N/A]
07 [N/A] 26 L3
08 R2 27 R3
09 L2 28 USB D+
10 [N/A] 29 USB D-

RP2040-ZEROではGP16はオンボードのRGB LEDに接続されているので今回使用しません。 またGP17~25は裏面の小さなパッドでアクセスできますが今回は足りていることもあって使用しません。

なおUSBコネクタへの配線ですが、詳細は後述しますが少なくとも現時点のv0.7.11とRP2040-ZEROの組み合わせでは、 GP28 -> D-GP29 -> D+ の組み合わせは設定できませんでした。留意が必要かと思います。

 

GP2040-CE Configuration

GP2040-CE のWeb Configurationで設定した内容のメモです。

  • RP2040-ZERO用のfirmwareを書き込んだあと、'S2'でWeb Configuratorモードに入って設定
  • 各ページで都度都度 Save すること(重要)

Pin Mapping

  • ピンアサイン通りにマッピングする
  • SFCコントローラー関連、USB関連、OLED関連、TURBO LEDは別のところで設定する

Peripheral Mapping

  • I2C0を有効、SDAを4 SCLを 5 に設定
  • USBを有効、D+を28 に設定(Pin Orderは規定値のまま)

Display Configuration

  • Enabledに設定

Add-Ons Configuration : Turbo

  • Enabledに設定
  • Trubo Led Pin を 03

SNES Input

  • Enabledに設定
  • Clock Pin : 13
  • Latch Pin : 12
  • Data Pin : 11

Settings : Hotkey Settings

  • 既存の設定を全削除
  • 以下の表のとおりの設定
キー 機能 意味
Fn + S2 Mini Menu Toggle OLEDでMini Menuを表示
Fn + R2 Mini Menu Up Mini Menuで上キー操作
Fn + R3 Mini Menu Down Mini Menuで下キー操作
Fn + L2 Mini Menu Right Mini Menuで右キー操作
Fn + L3 Mini Menu Left Mini Menuで左キー操作
Fn + A1 Mini Menu Select Mini Menuで選択操作
Fn + A2 Mini Menu Back Mini Menuで戻る操作

Settings : Input Mode Settings : Additional PS4 Settings

  • Input Mode Settings で Current ModePS4を選択
  • Authentication Settings で USB HOST を選択
  • Saveすること

Settings : Input Mode Settings : Additional PS5 Settings

  • Input Mode Settings で Current ModePS5を選択
  • Authentication Settings で USB HOST を選択
  • Saveすること

 

PCBの設計と実装

基板は、マイコン基板・SFCコントローラーコネクタ・OLED・ボタン類をなるべく無駄なく最小のフットプリントにするために、基板を二階建てにすることにしました。 二枚の基板をスペーサーを挟んでビスで固定する方式です。

ただしOLEDや追加ボタンが不要な場合や、それらをこれらを別途ケースに取り付けて配置して利用するような組み込み方も考ええ、

  • 1枚目(下段):MCUとSNESコントローラーコネクタ、USBコネクタを1階に配置
  • 2枚目(上代):ボタン類とOLED、ターボLED

として下段だけでも機能する設計にしました。 (ケースにボタンやOLEDを組み込む場合はピンヘッダからそれぞれに必要な配線は取れる)

また1枚のみで使用する場合、Turbo用のLEDインジケータとしてRP2040-ZEROのオンボードLEDを利用するのもありかもしれません*10

P2040-ZEROを実装するパターンは、ピンヘッダ等の足無しで直接基板にはんだ付けできるよう設計しました。単純な長方形以外のPCBを発注してみるテストも兼ねて。

OLEDの項でも書きましたが、上段のOLEDの配線はパターンカットとジャンパで色んな配列に対応できるようにしています。

PCBの設計はKiCad 9を使用しました。 製造はJLCPCBを利用しました。KiCadにJLCPCB用のアドオンを入れると必要な出力を勝手に生成してくれるのですごく楽ですね。

また初回限定クーポンなどもあったので、おそらく今回に限ってになるとは思いますがすごく安く発注出来ました。 レジストの色は無駄に紫とか選んでみましたが、なかなかいい色で気に入っています。

 

使用部品

以前購入して在庫している手持ちの部品の利用がおおいので、正確ではないですが概ね以下です。

  • MCU:Waveshare RP2040-Zero互換ボード(Aliexpressで以前まとめて購入。1枚あたり換算すると250円程度?)
  • OLED:128*96 I2C OLED(Aliexpressで以前まとめて購入。1枚あたり換算すると250円程度?)
  • SFCコントローラーコネクタ:(Aliexpressで購入。200円程度)
  • USB TYPE-A雌コネクタ:(秋月電子で購入。5075AR-04-WH、1個50円)
  • タクトスイッチ:6mm*6mm(秋月電子で以前購入。ボタン部分が直径4mmくらいで長さが10mmくらいのやつ。30円くらい?)
  • LED(Turbo用):3.3v前後で動作する適当なLED
  • 抵抗(Turbo用LED保護抵抗):LEDに合わせて適当に
  • スペーサーとビス類:適当に手持ちのもの
  • ケーブル:14芯フラットケーブル 10cm、2*7ピンのメスヘッダ圧着済み(1本150円程度?)
  • 保護用アクリル板:3mm厚のものをカット販売しているサイトに発注

仕上げとして保護目的で3mm厚の透明アクリルで挟んでみました。 アクリルは穴あけを頼むとそこそこコストが上がるので(穴一個につき100円とかになることも)、今回は自分であけました。地味に面倒でしたし適当にやったので精度が微妙ですが、まあ自分で使うためのDIYだし問題ない範囲に仕上がったと思っています。

 

反省点

全体的にPCB設計のノウハウが無さ過ぎるので、わかってる人から見るとおそらくよくない実装になっているのでないかと思います。が、そもそもユニバーサル基板で雑に実装しても実用上全く支障がないようなレベルの回路ですし、とりあえず気にしないことにします。趣味の自作ですし。

ただそんな中でも2点だけ、もう少し考えればよかった&実験してから決めればよかったな……となった点があります。

反省点その1

USBパススルー端子のアサインにfirmwareの制限?問題?があり*11、予定していたアサインにできない という事象が発生しました。

実はPCBの設計時点では、USB端子のD+をGP29、D-をGP28に振る設計にしていました。

PCB上はGP28をD-にするつもりで書いていたが…

所が実際にそのように設定してみると、firmwareがフリーズすることがわかりました。いくつか実験をしてみましたがどうも解消しそうにないので、基板をパターンカットしてGP28をD+にGP29をD-にジャンパで配線しなおすことで対応することにしました。

GP28とGP29を入れ替えるようにパターンカットしてジャンパ配線
事前に全部想定するアサインで機能が実装できるか確認してからPCBを発注すべきでしたので、大いに反省してます。

反省点その2

上側の基板上の、基板と基板を接続するためのケーブルを配線がちょっと面倒でした。 手癖でなんとなく2.54mmのピンヘッダ用のフットプリントを適用したのですが、接続に市販の2*4の14ピンコネクタが圧着されたフラットケーブルを使用するであれば1mmピッチにしておいた方が多少配線が楽だったように思います。

もしくは、フレキで接続するように両端ともフレキ用のコネクタにするべきだったかもしれません。 これについては次回なにか作るときに活かせられるといいなと思ってます。

 

雑感

使用感は最高で、自分の中では決定版と言えるSNES to USBコンバーターが出来上がったと思っています(自画自賛)。 アスキーグリップを使用して、左手でゲーム操作&右手でマッピング のスタイルでダンジョンRPGのプレイも大変捗ります。最高。

片手プレイの友、アスキーグリップと共に。

*1:SNESパッド上のボタンがHOTKEYに使用できないとかOLEDの表示に一部対応していない等細かいところはあるものの実用上問題はないレベル

*2:どうしてもアサインを変更したい場合はソースコードを修正して自分でビルドする方法もある

*3:https://github.com/OpenStickCommunity/GP2040-CE?tab=readme-ov-file#performance

*4:v2.0は机上の設計案の時点で没になりv3.0に移行したためこの世に試作機は存在してません

*5:実際には手元にダブついていた互換ボードを使用

*6:正直なところショートカットを覚えてられないというのもある

*7:左から『VCC/GND/SCL/SDA』と『GND/VCC/SCL/SDA』と『GND/VCC/SDA/SCL』があった

*8:例えばNitendo Switchの場合Homeボタンが無いとゲームを終了し難いです。

*9:ジャンパ線などでショートさせるなど他にもやりようはありますが

*10:RP2040-ZEROのオンボードLEDはRGB LEDだが、v0.7.11以降ではTurbo LEDとしてRGB LEDも使用できるようになっている

*11:一応githubにissueを作成しましたが現時点ではレスポンスなどないので詳細は不明

GP2040-CE v0.7.11 でMini Menuが実装されてかなり便利

※ 2025.05.01 不具合と思える挙動がありましたので、最後に追記しています

※ 2025.04.30 大きく誤解していた部分があったので修正しました(操作方法の設定回り)

2025年4月にリリースされたGP2040-CE v0.7.11にMini Menu機能が搭載されました。 オフィシャルドキュメントはこちら。 gp2040-ce.info

おおざっぱに言えば、名前から想像できる通りOLEDディスプレイにミニメニューを表示し(PCとの接続無しの)アケコン単体でいくつか機能についての設定変更が可能になる機能です。

何が設定できるようになるのか

現時点で設定できるのは以下のようでした:

  • Input Mode
    • Xinput / Nitendo Switch / PS4 ... 等の動作モードの切り替え
    • USB挿入時のホットキー気切り替えと同様 Current Input Mode の切り替えのみ可能で、PS4/5やXBOXの認証関連などの細かな設定は操作は変更できない模様
  • D-Pad Mode
    • D-PadのLeft Analog Stick D-Pad Right Analog Stickの切り替え
  • SOCD Mode
    • SOCDモードの切り替え
  • Focus Mode
    • Focus Modeの切り替え(ON/OFFの切り替えのみ?)
  • Turbo Mode
    • Turbo ModeのON/OFF切り替え

Input Mode など設定変更を有効にするためにリブートの必要があるものは、Menuを閉じる際に保存と再起動を確認されます。

Mini Menuを呼び出すために必要な設定

Mini Menuを利用するには以下が必要です。

  1. OLED ディスプレイの実装
  2. Mini Menuを呼び出す操作の設定
  3. Mini Menu機能の有効化

1. OLED ディスプレイの実装

なにはともあれOLEDディスプレイの実装が必要です。 SSD1306, SH1106, SH1107 などを実装した128x64のI2C接続のOLEDディスプレイモジュールを実装しましょう。 (国内の電子部品屋さんだと1個600円前後、Aliexpressなどで探せば1個あたり250円前後くらいから見つけられると思います)

実装したらWeb Configuratorの Configuration->Peripheral MappingI2C0`でSDAとSCLとして使用するGPIOのピン番号を設定します。

2. Mini Menuを呼び出す操作の決定と設定

Mini Menuを呼び出す操作を以下のいずれか*1決定し、設定します。

  • GPIO(に繋げたボタン)にアサイン
    • Configuration -> GPIO Pin Mapping でピンに Menu Toggle を割り当て
      • 例:GPIO 0 に割り当て →
  • ホットキーにアサイン
    • Settings -> Hotkey Settings で任意の組み合わせのHotkeyにアクション Menu Toggle を割り当て
      • 例:1 + A2 + に割り当て →

3. Mini Menuでの操作方法の決定と設定

Mini Menuでのカーソル操作と決定/キャンセル操作をどのように行うか決めて設定します。 3パターンの方法があります。

  • GPIOに割り当てる
    • GPIOにぞれぞれMenu Up,Menu Down,Menu Left,Menu Right,Menu Select,Menu Backを割り当てる
  • ホットキーに割り当てる
    • HotkeyにぞれぞれMenu Up,Menu Down,Menu Left,Menu Right,Menu Select,Menu Backを割り当てる
  • ゲームコントローラー操作に割り当てる
    • コントローラーのUp, Down, Left, Right, B1, B2でメニュー操作ができるようにします。
    • Web Configuratorの Settings -> Gamepad SettingsUse Gamepad Input for Display Mini Menu を ONにします。
      • SNES Extensionを有効にして接続したSNESパッドでも問題なく操作出来ました*2
    • Mini Menu表示中の操作もそのままPCやコンソールに反映される点に注意が必要

GPIOの消費(節約)と起動中のゲームへの影響を考えてか、 公式ドキュメントではGPIOにFunctionを割り当てFunction(fn) を絡めたHotkeyへのアサインが推奨 されているようです。

Mini Menuの表示(使用)方法

普段通りGP2040-CE実装のコントローラーをデバイス(PCやゲームコンソール)に接続したあと、前段で設定した Menu Toggle操作を行えばOLEDにMini Menuが表示されます。 USB挿入時の限定されたタイミングではなく、コントローラー使用中にいつでも呼び出せます

とても便利(for me)

自分としてはInput ModeとD-Pad Mode、Profileの切り替えだけでも超便利です。 特にInput Modeは色々な環境で利用しようと思うと割り振れるホットキーだけでは足りないので、Web Configuratorを介さず変更できるのは超絶便利と感じています。 そもそも今まではアサインした各種Hotkeyもどれに何を設定したか忘れたりごっちゃになったりすることが多々ありましたし。 D-Pad Modeも今までスライドスイッチなどで実装してきたのですが、そうしょっちゅう切り替えるものでもないので今度からは諸々Menu Toggleボタンだけでいいのではないかと思ってしまいます。

恐らく私は、今後はOLEDを実装する場合はMini Menuで操作できるものはもうそれ前提にしてHotkeyは極力使わない方向で考えるようになりそうだと思っています。

バグ?(2025.05.01 v0.7.11)

どうも少しバグがあるようです。 私の環境ではミニメニューの Input Mode -> Web Config でWeb Configurator モードにした場合、設定画面の Settings ( http://192.168.7.1/settings ) にアクセスするとweb画面がホワイトアウトして設定をいじることができなくなりました。 『B1を押しながら接続』などの方法でInput Modeを別のものに切り替えたうえで改めて『S2を押しながら接続』でWeb Configurator に入ると正常に動作しますが、Focus Modeの設定でInput ModeとWeb ConfigをOFFにしている場合は再度nukeして書き直すしか復帰方法が無いかもしれません。Focus Modeを使用されるかたは特に注意した方が良いかと思います。

*1:もちろん両方でも良い

*2:Web Configurator時のOLEDメニューではSNESパッド上のボタンでは操作できないのに(笑)

LM1881Nの入力やRGBの同期信号回りについて誤解していた

『いい加減に一回くらいはLM1881Nを使用した同期信号分離回路を自分で一から作ってみたいな*1』などと思い、まずはLM1881Nのデータシートを眺めはじめました。

LM1881N Typical Connection Diagram(データシートより抜粋)

SNLS384 Data sheet | TI.com

そこで長年ずっと勘違いしていたことがあることに気が付きました。

LM1881Nの機能は

『C-Video(コンポジット映像信号)から C-Sync(複合期信号)とV-Sync(垂直同期信号)を分離する』

だったのですね。

私はいままでずっと『C-Sync(複合同期信号)を H-Sync(水平同期信号)とV-Sync(垂直同期信号)に分離する』だと思い込んでいました。 思い込みって怖い。

で、ようやく理解した(と思っている)のが大まかに以下です。

  • C-Sync は H-Sync をベースに V-Syncを載せた信号であり(レベルさえ合っていれば)はC-SyncはH-Syncとして使用できる
  • C-VideoはC-Syncをベースにさらに色信号も載せたものでありC-Sync信号として概ね利用できる
  • LM1881NにC-Videoを通すとC-SyncとV-Syncを取り出せ、VGAのH-SyncにC-Sync、V-SyncにV-Syncを入力すれば一般的には映ることが期待できる
  • LM1881NにC-Cyncを通してもC-SyncとV-Syncを取り出る(C-Syncはそのままもしくはレベルを補正できる)

そういえばSFC(SNES)のRGBケーブルの初期ロット以外はRGB21JPコネクタのC-Syncピンに本体から出力されているC-Syncではなくコンポジット映像信号を接続しているのは有名ですが、その理由もようやくわかった気がしました。

*1:バッ活の記事を見ながら適当に組み込んだりはしたことがあるものの、ちゃんとした仕組みや各部品の値の意味などについて深く考えることなくただ部品表と配線図を見ながらプラモデル感覚で組んだだけだった