おは代々木ダイアリー

いろいろ試したメモを書きます。このブログはアフィリエイトを使用したプロモーションを含みます

TinkerBoard と Toshiba TC358743 でKVMを作りました

以前からやりたいやりたいと思っていてできていなかったTinkerboardでのKVMですが、Claude Codeを使ったら一発でできてしまったというお話・・・

ohayoyogi.hatenablog.com

そもそも、以前の記事では「USBガジェットモードで使用できない」と思っていたのですが、どうもそれはやはり勘違いだったようです。(普通にClaude Codeはデフォルトのarmbianでやってのけました)

Claude Codeすげえなとなったところ

今回もClaude Codeにほとんどやってもらってしまってすげーぜ!以外の部分が無いのですが・・・

TinkerBoardのHWエンコーダを使えるようにしてくれた

特に使えるようになる算段があったわけではないのですが、 使えるようにしてよ~~ってお願いしたらmainlineに取り込まれていないソースコードを使ったりして使えるようにしてくれました。

しかもISPにあった不具合も検証して起こらないようにしてくれて、映像に入るノイズも抑えてくれた…!

github.com

すげーぜ!

この時点で USBのHDMIキャプチャで得た映像をブラウザ経由で確認することが可能になりました。

CSIを使えるようにしてくれた

TinkerBoardにはRaspberry Piと同じようにCSIでカメラを接続できます。このCSIはUVCなUSBキャプチャとは異なりRawなデータを得られるので少ない遅延で映像を見ることができます。 (結構MJPEGのデコードの遅延が大きい)

そんなCSIなんですが、古いカーネルでしかサポートされていないようで、最近のOSイメージだと認識すらしませんでした。とはいっても同世代のボード用のドライバーのコードはあったりするらしく、それを引っ張ってきて動くようにしてくれました。

いきなり C790 というCSIのHDMIキャプチャを試すのではなく、Raspberry Pi Cameraのような同じCSIでよく知られたデバイスでClaudeに思考してもらうことで不明点を順番に解消しながら進めていくことができたようです。

フロントエンドもばっちり

まぁこの辺は当然って感じになってしまっていますが、まぁKVMのフロントエンドをしっかり書いてくれました・・・

github.com

USBガジェット化も!

冒頭にも書きましたが、TinkerBoardってUSBガジェットにはならないと勘違いしていたようで、 ダメ元で「できる?」ってきいたら平然とやってのけました・・・

終わりに

長年実現できていなかったKVMですが、コーディングエージェントの力を借りて()実現できてしまいました。びっくり

まぁこれにはオチがあって・・・ その話はまた後日・・・

PSVitaでオレオレJava VM (J2ME) が動くようになった・・・!

PSVita上でminiJVMというものを動かしてみる試みです

はじめに

もう3年も前になるんですが、一時期PSVitaでガラケーエミュを動かしたいなと思っていた時期がありました。

ohayoyogi.hatenablog.com

ohayoyogi.hatenablog.com

ohayoyogi.hatenablog.com

記事は上記の通り3記事で途切れているのですが、当時としては

  • miniJVMを動かす
  • SDLを動かす

あたりで力尽きていたようです。

この先の一手としては、JavaベースのJ2MEエミュを移植して・・・ということを考えていたように記憶しています。 ohayoyogi.hatenablog.com

それを実現するためにmidpathというOSSをいじってみたり、 https://github.com/ohayoyogi/midpath

freej2meというJava製J2MEエミュレータにコントリビューションしてみたりしていました。

コーディングエージェントの登場で一気に動くようになった

当時は頑張って手でコードを書いていたので、なかなか作業時間が確保できず、手を動かせばできそうなことはわかるのに実現できませんでした。

しかし、時代も変わり、今となってはコーディングエージェントがこちらのリクエストを受けて仕様を調べ、テストを実装し、成果物を提示してくれるようになってしまいました。

これは不慣れなプラットフォームでの開発においてはとても相性がよく、自分がいちから調べて実装するよりも格段に速く仕上がります。 微妙だなと思ったところもコーディングエージェントが自分で調べて直してくれるのですごい。

できたもの

というわけで自分が Claude Code の力を借りて作成したものがコチラ:

Vita上で動くJ2MEエミュができたぞ

技術スタック(?)としては以下:

  • VitaSDK: Vitaで自作アプリを書くなら必須のSDK
  • libretro: RetroArchというクロスプラットフォームなエミュレータ実行環境に載せるためのライブラリ
  • miniJVM: Cで実装された小さなJava VM
  • midpath: Java VM上で動作可能な MIDP(ガラケー版Java)実装

キー入力や映像出力、エクスプローラー(コンテンツ読み込みのため)をlibretro(RetroArch)が担ってくれるため、フロントエンドを開発する手間を大幅に削減することができました。が、Claude Codeにお願いすればその辺も実装してくれそうな勢いだったので、スタンドアロンのアプリにすることもできそうだなと思ったり思わなかったり・・・

とまぁそんなこんなでゲームが起動できるようになり、メインループとキー入力が受け付けられるところまではいけました。

が、「VitaのRetroArchでガラケーエミュで遊べる!」というのはあまりにニッチすぎるので、 今回のテーマはコーディングエージェントをオタメシする上では面白いテーマだったかもしれませんが、実用性は皆無ですね・・・

終わりに

今回の試みの中で面白かったのは下調べフェーズで「miniJVMを使うのは無謀」だとエージェントに言われても突き進んだらうまくいったこと。 これは自分の中でPoCというか各要素要素について動くことは確信していて、繋ぎのコーディング作業量だけが問題であるという確信があったため 「まあまあやってみてよ」的な感じでやらせてみたらできちゃったという感じです。

そして驚きなのは速さ。週間セッション上限に達しつつも2週間で動作するところまで来たということです。 これは時間の問題であきらめていた趣味の実装を、あきらめず完成まで持っていけるようにしてくれる夢のようなツールだなぁと思う一方で、 「時間の問題で誰もが取り組まなかったことを気合で突破する系」が意味を持たなくなってしまうのでちょっと悲しくもなるのでした。

Claude Codeで結構コーディングエージェントは楽しいなあという感想を抱いたので、 最近は ChatGPT にも課金しています笑

それでは~~~~

WSL2にSSHで乗り込む方法(netcatを使う)

netcat (nc コマンド)を使用するとWindowsのポートを転送する必要とかなくなってうれしいので、ぼくはこの方法をよく使ってます。

はじめに

WSL2上で開発するときに結構困るのが、意外とvscodeの Remote - WSL が素のLinuxでの開発と勝手が違う問題。

自分はこれをWSL2への接続であえて「Remote - SSH」を使用しているんですが、それについては以下の記事で書きました。

ohayoyogi.hatenablog.com

(このタイトルは、やたら長いタイトルを付けるのが面白いと思ってつけたんだと思う。今見ると何言ってるかわからん)

やりかた

まずは前提条件として、 WSL2上に sshサーバー (Ubuntuならopenssh-server)が導入されている必要があります。

そのうえで、やり方としてはProxyCommandで wsl nc %h %p を指定するだけです。

自分の場合は ~/.ssh/config に以下のように記載しています。

Host WSL
    HostName localhost
    User USERNAME
    ProxyCommand wsl nc %h %p
    ForwardAgent yes
    IdentityFile ~/.ssh/id_rsa

こうすることで、ssh WSL とするだけでWSL2に乗り込むことができます。

いいところ

ポートフォワーディングをする必要がない

Windowsの特定のポートをWSL2のIPアドレスのSSHポートに転送する必要がありません。

この面倒さがないのはいいです。WSL2はIPアドレス変わったりするので・・・

めんどいところ

SSHのサービスを起動させる必要がある

これちょっとよくわかっていないんですが、netcat経由での通信だと Socket Activation が効かないんでしょうか? localhostからの通信だから???

なので、めんどいですが起動するたびに sudo service ssh start してます。

今試してみたところ、Socket Activationが効いているようで、sudo service ssh start しなくても、netcat経由で22番ポートにアクセスすれば勝手にsshdが起動します

よって、Windows側からアクセスする場合でも ssh WSL とするだけ(VSCodeでSSHリモートで繋ぎに行くだけ)でWSL2にssh経由でアクセスすることができます。

終わりに

WSL2の便利なところの一つとして、WindowsからLinuxのプロセスの標準入力に直接データを流し込めることがあると思います。ふつうはWSL2上で動くプログラムに対して何らかの入力を与えるときに使うのが主な使い方だとは思いますが、、、

今回は、その機能を使って正規(?)のポートフォワード手順とは違った方法でWSL2に乗り込む方法を紹介しました。

Windows側でポート転送設定書くの面倒くさいよ~~というときに使ってみてはいかがでしょうか。

LIFEBOOK U9310が安くなっていたので買ってしまった

ヤフオクにてLIFEBOOK U9310が大量出品されており、ジャンクながら1万円を切る価格で入手できるようになっていたので思わず購入しました。

はじめに

以前LIFEBOOK U9313/MX というパソコンを買ったという記事を書きました。

ohayoyogi.hatenablog.com

LIFEBOOK Uシリーズは圧倒的な携帯性の高さ(薄い・軽い)でとてもいいマシンです。

今回はそんなLIFEBOOK UシリーズでIntel 第10世代のCPUを搭載したモデルが大量出品されているという噂を聞いたので購入してみました。

購入にあたって、いろいろと情報不足で失敗したなぁと思った点もあるので、読んで興味を持った人が同じ失敗をしないよう記事にしたいと思います。

今回購入したもの

今回購入したのは U9310/E というモデル。

今回購入した U9310/E

(スクショは自分が買ったものと同一ではありません。もっと高く買った・・・ )

DとかEとかよくわかってなくて大して変わらんだろうと思って適当に買いました(失敗)

OSを入れる

購入した商品はSSDの内容が消去されていて「OS無し」として売られていたので、最初にやることはOSを入れることです。

こういうWindows 11がプリインストールされているモデルって、個体ごとにマザボにライセンスキーが記録されていることが多いので、どうせ使えるだろうとは思っていましたが、 実際クリーンインストールするだけでライセンス認証が通るようになりました。

Windows 11のインストールUSBは以下のサイトから作ることができます。LIFEBOOK UはWindows 10が搭載されて出荷されているのでもしかするとWindows 10じゃないと駄目なケースもあるかも。

https://www.microsoft.com/ja-jp/software-download/windows11

SSDチェック

CrystalDiskInfoで搭載されているSSDの情報をチェックしました。

SSDはそこそこ使い込まれていた

まぁそこそこ使い込まれている気もしますが、1時間あたり平均で15GB書き込みということで非常識的な使い方をされていたわけではなさそう。

バッテリー

バッテリーは公式の「バッテリーユーティリティ」を使用することで状態を確認することができます。

https://azby.fmworld.net/app/customer/driversearch/pc/drvdownload?driverNumber=E1034760

こんな感じ。

一応確認してみましたが、「良好」とは出るものの、充電やめたら1時間程度で切れる状態で良いのか悪いのかという感じです。

まぁバッテリーは軽量モデルでは容量が少なかったりしますし、バッテリーでどの程度運用できるかは実際に試してみないとわからない部分が多そうです。

ボディ

実測で 753g でした。指でつまんで持てる軽さ!

筐体はどういう使い方していたのかわかりませんが、背面がボッコボコになっていてゴム足がとれていたり結構ひどいです。その辺は購入する前に商品画像をチェックして確認すべきです。

失敗したこと

今回 U9310 を購入するにあたって失敗したなと思った点・・・

オークションで思ったより高くなってしまった

今回はオークション形式で買ったのですが、相場をよく調べずに入札したため、結構高くついたな というのが率直な感想です。

結局、相場より2000~3000円高く買っていたり、安いからといって買ったはずが結果的には安くなかったみたいなオチになってしまいました・・・

これについてはオークションに不慣れだったというのが主な原因ですね。

型番による違いが結構あった

商品説明に出てくる「U9310/D」だとか「U9310/E」という型番ですが、調べてみてもカスタマイズの幅が広すぎて何の参考にもなりません。

富士通 ノートパソコン(PC) LIFEBOOK U9310/D 製品詳細 - FMWORLD(法人):富士通

富士通 ノートパソコン(PC) LIFEBOOK U9310/E 製品詳細 - FMWORLD(法人):富士通

実際に気にすべきは、FMVU から始まる型番(例: FMVU32021, FMVU28018)の方です。 (これについては商品ページに書いてくれている人もいれば、商品画像からバックパネルに書かれているラベルから判読する必要があるケースもありました)

この型番がわかればLIFEBOOKのカタログから標準構成を調べることができ、同じ「i5-10310U, 8GB, 256GBなU9310」でもLTE搭載だったり、バッテリー容量、生体認証に関してどういう仕様かを確認することができます。とはいえ、ここからさらにカスタマイズすることができるので、型番がすべてというわけでもないのですが。

FMVU32021

FMVU28018

今回はこの辺を疎かにしてしまったため、後から「やっぱりLTEモデルが欲しかったな~」みたいな後悔をしました。

使い道

晴れて軽いパソコンを手に入れたわけですが、8GBメモリですし使い道は限られると思っています。

個人的にはこの端末はLinuxネイティブの端末として使っていこうと考えています。必要最低限のインタフェース(TypeC)はそろっていますし、SDカードスロットを持っているのもポイント高いです。

適当にSSDガチャでゲットしたSSDでも入れて使おうかな、とか。

終わりに

購入してからしばらく使ってみていますが、やはり安定のLIFEBOOK Uシリーズでした。

気になるのは

  • 画面が狭い(フルHD)
  • バッテリーが弱っている(個体差あり)
  • RAMが8GBしかない

あたりですが、これを許容できる人なら「繋ぎ」や「サブ端末」としてとてもアリな選択肢だと思います。画面の広さについては好みの問題ですし、バッテリーもPD対応なのでモバイルバッテリーで何とかするという方法もあると思います。

Windows10のサポートが終わってしまって、どうしよう!!とかなっている人にもオススメですね。

USBポートがついたRaspberry Pi Pico2互換ボードを試す【Waveshare RP2350A USB Mini Development Board】

Raspberry Pi PicoにはPIOという機能があって、USBポートを増設できるのですが、そのUSBポートを増設して1基板にまとめた開発ボードが存在するらしいのでそれを買ってみました。

はじめに

マイコンボードをHIDとして振舞わらせるというのはよくあるテーマですが、メインのUSBポートはプログラムを書き込むのに使ったりするので、できれば別のポートを使いたいですね。

Raspberry Pi Picoには、PIOという機能があり、GPIOを使用して高速に通信を行えるため、USBとして使用可能なポートを増設することができます。

しかし、かといって、USBポートを増設するのはハード的にも壁があります。こういう2.54mmピッチに変換してくれるボードとかもあるにはあるのですが、、、

ブレッドボード上で検証したい時などは重宝するとは思うのですが、実際の稼働をさせるときに固定はどうするだとか、どうしても1基板にしたくなってしまいそうな気がします。

そこで見つけたのが すでに1ポート増設済みの状態で基板になっている開発ボード

www.waveshare.com

今回はそれを見ていきたいと思います。

買ったもの

というわけで、商品があることを発見してすぐにAliExpressで購入しました。コイン割+遅延クーポンで1枚あたり2ドル程度で買えたので安い安い!

waveshare RP2350-USB-A

購入したのはおなじみ「SpotPear Electronics」というストア。

購入したのは SpotPear Electronics というストアから

動作確認

RP2350-USB-A 届いた・・・!!

というわけで、さっそく動作確認をしていきます。

github.com

・・・と、ソースコードをビルドする気満々でいたんですが、どうも初期出荷状態でHIDマウスとして振る舞うプログラムが書き込まれているようで、USB-A to Aのケーブルでつないだところマウスが勝手に動き始めました・・・

使ったのはUGREENのケーブル。Softbank Air3で遊んだ時に買った記憶(懐かしい)

というわけでアッサリ動いてしまい、このボードの有用性が確認できました。いいのかこれで・・・?

(さすがにいきなりUSBポートに突っ込むのは不用心すぎた・・・?)

長所

やはりこのボードの長所は基板上に実装されていることによるコンパクトさでしょうね。USB接続の周辺機器とつなぎたいときもブレッドボードなど不要でこれ単体で完結できるという。

基板をデザインして発注できちゃう人にとってはあんまり美味しくないのかもしれませんが、自分みたいな初心者にとってはこういうものが存在するのは非常にありがたいですね。

短所

そしてこのボードの短所を上げます。

それは USBポートがTypeAなところ でしょうか。RP2350に周辺機器を接続して使いたいときはこのポートも重宝するのでしょうが、「周辺機器を作りたい」というケースではオス-オスみたいな脱法ケーブルが必要になってきます。

ここがmicroUSBなりUSB-Cなりになっていると、ああいう脱法ケーブルを使わなくてもよくなるので、ぜひ対応してほしいなぁと思う次第です。

まぁ単純にUSBで他の機器に接続する周辺機器を作りたい、というだけであれば、RP2350側はケーブルを抜き差しできる必要はないわけですしUSBケーブルを直接はんだ付けしてしまうという手があるわけで、ニーズがないのかもしれませんが。

おわりに

というわけで、AliExpressで買ったRaspberry Pi Pico互換ボードの亜種、「Waveshare RP2350-USB-A」を買ってみたという記事でした。なにげ RP2350 デビューです。

次はプログラムを書くぞ

オマケ: これが MIT License のパワーか

面白そうだったのであんまりよく確認せず購入してしまったのですが、これ、公式サイトとかよく見てみると sekigon-gonnoc さんのリポジトリをベースに基板化しているようですね。

「The demo is modified based on sekigon-gonnoc Pico-PIO-USB」の文言が

USBポート周辺の回路図も Pico-PIO-USB に記載されているとおり。

USBポート部の回路図

これってつまり Pico-PIO-USB を試すのにバッチリな基板というわけで、利用者としてはありがたいですが・・・。これって作者さんも関与してたりするのかな?

まぁいずれにせよ、ソースコードを書いた人以外でも基板に起こして販売できる、それがオープンソースの利点でもあるわけで、こんなに便利なものをMIT Licenseで公開してくださっている作者さんには頭が上がらないですね。自分もOSSでバンバン貢献できるような人間になりたいです。

【はんだ付け練習】AliExpressでハンドスピナー自作キットを購入して組み立てました

またAliExpressで変わったものを見かけたので買ってしまいました。それも「DIY フィジェットトップキット LED ライト付き指先ジャイロ DIY はんだ付けプロジェクト練習用はんだアセンブリ DIY 電子キット」

要は「光るハンドスピナー自作キット」です

買った商品

購入した商品はこちら。「よりどり」で500円程度でした。

今回購入した光るハンドスピナー自作キット

ストアは「All Great Store」というストア。電子パーツを多種取り扱っているようです。

AllGreatStoreで購入しました

セット内容

セットの内容(一部)

セット内容としては、

  • チップLED(赤・青・緑)
  • チップ抵抗
  • チップコンデンサ
  • 謎のIC
  • スイッチ
  • 電池(CR1620)ソケット
  • ベアリング

といった具合です。確かにこれだけ部品があれば表面実装を練習できそうです。

実際に作ってみた

買ったまましばらく放置していたこのキットですが、ちょっと空き時間ができたので組んでみることにしました。使用したのはFNIRSIのUSB PDで使えるはんだごてと、 gootの鉛フリーはんだを使用しました。

ohayoyogi.hatenablog.com

表面実装はすごく久しぶりなのでうまくできるかドキドキです。失敗するとうまく表面にピタッと実装できなくなったり汚くなるので、はんだ吸い取り線も重宝しました。

チップダイオード(LED)の実装

チップダイオードを実装していく

手順書に従って、LEDからはんだ付けしていきました。向きを間違えないよう、入念にチェックをしながら実装していきました。早速ミスってチップダイオードを破壊したりしてしまいましたが、はんだ吸い取り線で何度もやり直して全LEDをつけることができました。

後述しますが、この時点でははんだごての適切な温度がわからずなかなか溶けなかったり、流れていかなかったりで苦労しました。

また、LEDは実装する際に向きにも注意しなければならないので、気を使いました。手順書にはLEDの実装から書かれていますが、もしかすると抵抗の実装からやった方が難易度的にはよかったかもしれません。

チップ抵抗の実装

続いてチップ抵抗を実装していきます。LEDよりはサクサクはんだ付けできましたが、LEDに比べて厚みがなかったり、ピンセットでつかむのも大変でした・・・

チップ抵抗を実装しました(汚い・・・)

表面実装大変すぎ~~~~~

謎のICチップ(LEDコントローラ?)の実装

14pinのICチップをはんだ付けしました。12本のGPIO(11個のLEDと1個のスイッチ)+GND+電源という感じで、フルにピンを活用していますが、いったい何というチップなんでしょうか。

ピン間にはんだが流れて短絡してしまって一瞬焦りましたが、吸い取り線で吸い取ることで短絡を解消することができました。セーフ。

ここで学んだことは高めの温度設定(結果400度ぐらいまで設定値上げた)で手早く作業するのがよさそうですね。なかなかピンの間に流れ込んだはんだを溶かすことができず、苦労しましたが、温度上げてはんだを追加して、追加したはんだごと吸い取るようにすればリカバリーすることができました。

電池のソケット、本体の組み立て

1時間ほどではんだ付けは完了しました。あとは本体を組み立てるだけです。

完成!

光るハンドスピナーの完成!

完成しました。自作の光るハンドスピナーです。

一見、ただLEDが光るだけかと思っていましたが、実は一定間隔で点滅したりしているようで、回すと幾何学模様が見えるようになるという楽しいおもちゃでした。

一定時間ごとに切り替わる模様

終わりに

「よりどり」を眺めていて気になったので買ってみましたが、はんだごての練習にもなりましたし、回しても楽しいハンドスピナーができたので結構有意義でした。

よりどりでどうしても一品足したいって時にみなさんも試してみてはいかがでしょうか?

RP2040で外部制御可能なHIDを作ろう(PIKVM Pico HID)

USBガジェットモードになれないシングルボードコンピューターでもKVMをDIYしたい!

はじめに

というわけで、前回の続きです。

ohayoyogi.hatenablog.com

ぼくはTinkerBoardが大好きなんですが(色とか)、TinkerBoardの唯一の弱点はmicroSD端子をUSBホストとして使うことができず、ガジェットモードにもなれないという点です。

今回はそんな欠点を補うべく、Raspberry Pi Picoで知られるRP2040を使用して、マウスキーボードの操作を行えるようにしてみようという内容になります。

目論見

もくろみも何も、pikvm公式が提供している方法です。

Pico HID (USB, PS/2) - PiKVM Handbook

その名も 「pico HID」 。HIDとして振舞えないデバイス用に CDC, UART, SPI などの通信でHIDとして振舞っているRP2040を制御してしまおうという内容です。

単純に発想がすごい。ちなみに Arduino HID というのもあるらしい。

やったこと

ひとまず、お手軽なUART通信で、RP2040経由でキーをタイプしてみるというのをやってみます。(基本的にビルドするだけ)

普通にRaspberry Pi Picoを使ったのでは面白くないので、Raspberry Pi Picoと同様RP2040を搭載していて小型の「RP2040-Zero」を使ってみます。

RP2040-Zeroという小さいRaspberry Pi Picoもどき

ohayoyogi.hatenablog.com

自分はAliExpressで買いましたが、Amazonでも売ってるみたい

手順

というわけで早速、手順を紹介します。使用するソースは以下。 kvmdリポジトリの hid/pico というフォルダになります。

https://github.com/pikvm/kvmd/tree/master/hid/pico

開発環境としては、今回は手軽に試したかったので「GitHub codespaces」を使ってみました。手元にビルド用の環境を持っていないときに重宝しますね

結構Makefileが親切に書いてあるので、以下の手順程度でビルドできます。

sudo apt install cmake gcc-arm-none-eabi build-essential 
cd ~/dev/kvmd/hid/pico
make

依存ツールを入れて、makeするだけ。すごいぜ

ソースコードの変更

今回は本家 Raspberry Pi Pico ではなく RP2040-Zero というボードを使用するため、ピンの割り当てを変更しました。オプションで変えられるようにとかはなっていないので、ソースコードを直接いじります。

使えるピンなどはボードのピン配置のドキュメントを眺めたり、pico-sdkのヘッダを参照するといいのかなと思います。

https://github.com/raspberrypi/pico-sdk/blob/master/src/rp2_common/hardware_gpio/include/hardware/gpio.h

今回は「UART1」を使用する&使いやすそうなピン位置ということで、「ピン4(UART1_TX)」「ピン5(UART1_RX)」を使用することにしました。

というわけで、まずは hid/pico/src/ph_com_uart.c をいじります。

#define _RX_PIN     5
#define _TX_PIN        4

としてUARTにpin4, 5を使用するようにします。

またSPIで制御するかUARTで制御するかは排他となっていて、SPI制御を無効(UART制御を有効)にするには22ピンをLOWにしなければならないのですが、RP2040-Zeroでは22ピンへのアクセスが悪いので、(クソ修正ですが)HIGHで無効になるようにします。

https://github.com/pikvm/kvmd/blob/b3d12910395ec9785b1d86a46c902885b107718b/hid/pico/src/ph_com.c#L57

 _use_spi = !gpio_get(_USE_SPI_PIN);

また、4ピン 5ピン はすでに _PS2_SET_MOUSE_PIN _BRIDGE_MODE_PIN で使用されているので、ここら辺をいじります。

https://github.com/pikvm/kvmd/blob/b3d12910395ec9785b1d86a46c902885b107718b/hid/pico/src/ph_outputs.c#L34-L38

それぞれ 19ピン 18ピン を使用するようにしました。

RP2040-Zeroで(とりあえず)使用できるようにするための変更はこのあたり。ここを使用するボードに応じて変更できると便利かなと思いますが・・・

変更したら make でビルドしてできあがった hid.uf2 を RP2040-Zero に転送して書き込み。

RP2040-Zeroから20ピン 21ピンを引っ張り出すのが楽か、ビルドしなおすのが楽かはみなさんの判断に任せます。

配線

変更したピンアサインの通りにRP2040-ZeroとUARTアダプタを配線しました。

RP2040-Zeroを配線

UART-USBアダプタももちろんAliExpressで購入しました。3.3Vでも5Vでも使えるみたいなので便利な商品です。Amazonでも結構安く売ってるけどこんなに個数いらない・・・

試しにUARTで制御してみた

できあがったpico(RP2040-Zero) hidに、実際にUARTで入力してキーを打ってみるコードを書きました。

import serial
    
def crc16(data : bytearray, offset , length):
    polinom = 0xA001
    crc = 0xFFFF
    for i in range(0, length):
        crc ^= data[offset + i]
        for j in range(0,8):
            if (crc & 0x0001) == 0:
                crc = crc >> 1
            else:
                crc = crc >> 1
                crc ^= polinom
    return bytearray([(crc & 0xFF00) >> 8, crc & 0xFF])

def create_keypress_bytes(key, state):
    send_bytes = [0x33, 0x11, key, state, 0xff, 0xff]
    crc16_bytes =  crc16(send_bytes, 0, 6)
    send_bytes += crc16_bytes
    return send_bytes

serial_port = serial.Serial(port='COM4', baudrate=115200)

serial_port.write(create_keypress_bytes(1,1))
print(serial_port.read(8).hex())

serial_port.write(create_keypress_bytes(1,0))
print(serial_port.read(8).hex())

create_keypress_bytes の第一引数の値を変えることでキーを変えることができます。今回は a(1) を打ちました。

→ 打てました(完)

終わりに

久しぶりのC言語だったのでいじり方思い出したりするのに時間がかかりましたが、ほぼほぼコードを修正せずとも動かせました。

これを作った後に発見したんですが、「UARTで制御してHIDでキー入力する」ことについては CH9329 という製品がすでにあるようですね。

kvmdとはUART経由の制御方法が異なるので、そのまま利用することはできないと思いますが、同じようなことは結構考えられているようですね。

次はTinkerBoardからこれを経由してパソコンをネットワーク越しに操作する、というのをやってみたいと思います。