JavaScriptを有効にすると、ここにメニューを表示します。
FM77AV実機再稼働支援プロジェクト
Windows + Arduinoによる富士通FM77AV/AV40実機用赤外線ワイヤレスキーボードエミュレータ

ysflight.com

はじめに

このプログラムは、FM77AVおよびFM77AV40のワイヤレスキーボードをWindows上でエミュレートして、実機でのタイピングを可能にするものです。

必要なデバイスとして、Arduino UNO + 赤外線発光基板が必要です。部品点数が少ないのでハンダ不要ブレッドボードでも簡単に製作できます。なお、いくつか作ってときどき知り合いに頼んでヤフオクに出してもらうので良かったら買ってください。

あるいは、IRToy (http://dangerousprototypes.com/docs/USB_Infrared_Toy) も対応しています。なお、Amazon.comでも買えます(アメリカAmazonのリンク→SeeedStudio - USB Infrared Toy v2 - Dangerous Prototypes - DIY Maker Open Source BOOOLE)。残念ながら日本では販売している代理店は存在しない模様です。IRToyは、誤って'$' (0x49)を送信すると自殺してしまうという問題を抱えていますが、アメリカから輸入できる人は割と手軽に手に入ると思います。

↓一応、Amazon.comリンク。日本に発送してくれるかどうか不明だけどAffiliate復活させたんでよかったら買ってください。

ヤフオクなどで割と頻繁にFM77AVやFM77AV40を見かけて、多分結構な確率で実際起動できるユニットが手に入りますが(二つ買って二つとも動いた)、なぜか、大半の出品ではキーボードがついてません。クラシックPC研究会さんのFM77シリーズにUSBキーボードを接続するアダプターを使うという手もありますが、僕はPCからUSB接続の赤外線トランシーバーで赤外線接続をエミュレートしてキーボードタイプを実現することに成功しました。メリットとしては、ソフトウェアでキーボード信号をコントロールできるので、キーボードなのに連射機能あったり、ローマ字タイプするとカナを出す、みたいな機能も実現できました。もちろん、PCが必要なのでやや場所を取ります。

手元にあるのがFM77AV2とFM77AV40だけなので、試すことはできませんが、FM77AV20でも多分使えると思います。が、動かなかったとしても、ごめんなさい。とりあえず、こちらのテスト機では両方とも完璧に動作していて、このプログラムを使ってXanadu Sceinario 2をクリアしてエンディングを見ることができました。自作チートデータでしたが。

なお、FM77AV40EX以降の機種では赤外線センサーが無いため使えません。 また、この手のプログラムではありがちなオートストップ機能(テンキーを放したときに5を押したことにする)や、キーを押した瞬間からリピートが効き続ける連射機能、ボタン一発でFM77AVキーボードエンコーダの隠しメッセージを出す機能などあります。

ついでに、アメリカに住んでるもので、日本語キーボードが無いので日本語キーボードのバインディングが正しくできてるか確認する方法は一切ないのですが、タイプしたキーではなく文字を元に対応するキーコードを発生させる機能 (TRANSLATIONモード)があります。例えば、うちのキーボードはUS101ですが、普通にタイプすればその通りFM77AV上に字が出ます。また、ローマ字タイプするとカナに変換してタイプしてくれる機能(RKANAモード)なども搭載してみました。30年前、アドベンチャーゲームでカナタイプができなくて苦しんだ恨みを(まだソフト持ってたら)今こそ晴らすことができます。FM77AV用ゲームをするときなどは、DIRECTモードがいいと思います。

 

[ダウンロード (Windows用)]

[ダウンロード (Windows XP 32bit用)]

ソースコード -> https://github.com/captainys/FM/tree/master/7

(* ソースコードのURLが変わりました)

なお、Windows XP 32bitで実行するには、Visual Studio Runtimeのインストールが必要。詳しくは、下のリンク参照。

https://www.microsoft.com/en-US/download/details.aspx?id=48145

 

自動タイピング機能について

テキストファイルを自動的にタイプしてもらうことができます。カナ未対応ですが、エスケープ文字でキーコードを直接生成できるので、例えば、

\\\BREAK

とかテキストに書いておくとBreakキーを押すことができ、

\\\KANA

とか書くとカナキーをオン・オフできるので、がんばればカナキーもタイプできます。また、

\\WAIT

と書くと20ms待ちます。例えばコマンドをタイプしてからReadyが出るまでの間ちょっと待たせるために使えます。

最近新しくなったオフィスのデスクトップ機だとボリュームが上がらないのかFM-7/77AV側でカセットI/Fからの流し込みができなくなったのと、短いプログラムをAV/AV20/AV40に転送するときいちいち.WAVファイルを生成してカセットI/Fで流し込むのが面倒になったので作ってみました。

更新履歴

2019/08/05

2019/07/21

2019/07/17

2019/04/05

2019/01/29

2019/01/15

2018/11/17 (R1541)

2018/03/09 (R1345)

2018/02/04 (R7497)

2018/02/04 (R7488)

2018/01/31 (R7479)

2018/01/26

2018/01/23 (R7470)


スクリーンショット

使い方

まず、IRToyをUSB経由で接続します。ここで、IRToyのLEDが消灯していることを確認してください。

IRToyを接続したら、FM77AV Keyboard Emulatorを起動します。インストーラを作るのがむなしくなってきたので、そんなもの無いので、実行ファイルを直接実行してください。なお、ウイルスとセキュリティとか心配な人は、ソースコードがついているので、一通り読んだ上でそれでも不安なら使わないでください。

うまくいくと、FM77AV Keyboard EmulatorはCOMポートをスキャンしてIRToyを探します。

あとは、FM77AVまたはFM77AV40本体の赤外線ポートの近くにIRToyの赤外線LEDを置いて、FM77AV Keyboard Emulatorにキーをタイプすると、コードが本体に送られます。


IRToyでFM77AVキーボードをエミュレートしているところ


有名な隠れメッセージもこの通り

なお、IRToy v2を使ってテストしています。v1だと多分動きません。また、ファームウェアバージョンはv22を使ってますが、結局v20以降特有の機能は使わなかったので、多分v07でも動くんじゃないかとおもいますが、確認してません。一応、Windows XPがあればファームウェアアップデートできるらしいです。Windows 7があると50%の確立でファームウェアアップデートができるようです。なお、50%の確立でも2度やったら成功するということではなくて、失敗する場合は同じPCで何度やっても失敗すると思います。僕の場合は、運よく最後に残ったWindows 7機でv22にアップデートできましたが、できなかったらIRToyが危うく使えなくなるところでした。というか、誰か別の人のXP機を貸してもらうとか、Linux機を使うといいらしいんですがね。

謝辞

このプログラムを開発するにあたって、Apolloさん(http://www.retropc.net/apollo/)にかなりの助言をいただきました。とくに、FM77AVキーボードの赤外線信号を計測して100usパルスらしいという情報をいただいたのは助かりました。また、クラシックPC研究会(http://classicpc.org/index.html)の小林さんには、有線接続の場合のパルス情報とキーリリースコードの計算方法の助言をいただきました。このおかげで、キーリリースコードを送らないまま接続が途切れたときFM77AVが抗議して「ピッ」とビープを鳴らすのを止めることができました。また、ですくまさん(http://d.hatena.ne.jp/deskuma/20110425/1303694255)のキーボードのパルス計測データを参考にさせていただきました。 お礼を書き込もうと思いましたが、Blogのキャプチャに正しい文字を入力しても必ず文字が違うと言われてしまうためお礼を書き込むことができませんでしたが、貴重なデータを公開していただいたことを感謝しています。

開発について

当初の予定では、IRToyの受信機能を使って、FM77AV40のキーボードの信号をキャプチャして、それをそのまま送信してやろう。と思っていたんです。ところが、IRToyのセンサーだと、FM77AV40キーボードからの信号はパルス間の消灯がはっきり認識できないらしく、キーを押すと約40usの間、赤外線が出っぱなしと見えるようでした。Apolloさんが計測してくださった波形を見ると、確かに、オフパルスの間も完全に消灯していないようでした。

だったら、赤外線の強度は距離の二乗で減衰するんだから、キーボードを遠くに置いてやろう、ということをトライすると、ときどきパルス間のオフを検出するようになりましたが、ですくまさんの計測結果にあるようなビット数はとても検出できず、せいぜいパルスのオン/オフが数回程度に検出されました。

これはだめかもしれない、と、思ったものの、小林さんから、オンオフをそのまま送って見たら認識するかも、という助言をいただいて、試しにそのまま'q'のコードを送って見たところ、最初画面をよく見て無くて「やっぱりだめか」と思ったのですが、よく見ると画面に小文字の'q'が。もう一度テスト送信キーを押すと、もう一つ'q'が。そのままテスト送信キーを連打するとどんどん'q'が増えていく!!!!「うおおおおおおお!!!!でええきたあああああ!!!!」と、ガッツポーズが出ました。

その後、スピーカーから音を出してみたら、キーを押すたびに「ピッ」というビープ音が鳴っていて、ちょっと実用に耐えない、という問題が発生したものの、次の日には小林さんからキーリリースコードの計算方法を送っていただいて、キーを放したときリリースコードを送るようにしたら、まったく問題なくタイプできるようになりました。

あとはGUIをつけたりなんだりして、とりあえず必要な機能は実装できたので公開しました。


チートデータを使ったけど、キーボードエミュレータでXanadu Scenario IIのエンディングも見れた!

IRToyについて

日本ではまだ売ってないみたいだけど、IRToyには強力な強みがあります。一般的な似たようなUSB赤外線デバイスは、38kHzクロックを使っているらしく、1/38ミリ秒が最高の赤外線パルス解像度らしいです。これは26マイクロ秒(us)に対応します。FM77AVのキーボードをエミュレートするには100usのパルスが必要ですが、一般的なデバイスが生成できる最も近いパルスは104usで、4%も誤差があります。これに対して、IRToyの解像度はなんと0.17us。100.13usのパルスを生成することが可能で、これによりFM77AVがほとんどデータを取りこぼさないエミュレータを作ることができました。また、IRToyはCOMポートとしてコンピュータに見えるので、簡単にプログラムすることができます。ソースを公開してるので、興味のある人は見てください。そして、がんばってアメリカから輸入してください。

しかし、IRToyを何かの目的に使おうとしている人は、ひとつだけ注意が必要です。何があっても、絶対まったく100% 0x24 を送信してはダメです。もしもパルスデータに0x24が含まれてしまったら、0x23か0x25に置き換えましょう。1/36の誤差をデバイスが許容してくれることを祈って。とにかく、絶対0x24は送信したらだめです。

IRToyのデフォルトの動作モードでは、0x24を送るとデバイスは、ファームウェアアップデートモード(ブートローダモード)に入ります。いったんファームウェアアップデートモードに入ったら、ファームウェアをアップデートするまでデバイスは他の何も受け付けなくなります。ところが、Windows 10ではファームウェアアップデートができません。Windows 7でも、結構失敗の報告があるようですが、幸運なことに僕の最後に残っていたWindows 7 PCは成功しました。しかし、一台もWindows 7 PCが残っていなかったり、残っていてもそのPCがIRToyと相性が悪かったりすると、IRToyは二度と復活しません。

ついでに、公式ページのファームウェアアップデートのインストラクションにもエラーが多く入っています。また、'-reset'オプションをつけてfw_update.exeを実行すれば、ファームウェアを更新せずに、IRToyを元のモードに戻せることになっていますが、それも機能しません。

0x24で自殺してしまうのは、デフォルトの動作モードだけなので、IR Sampling Modeというモードに入っていることを確認すれば0x24を送っても大丈夫なことになっています。が、問題は、IR Sampling Modeに入っていることを確認する方法が無い点です。デフォルトモードで'S'を送ると、"S01"が返ってきて、IR Samping Modeに切り替わったことはわかるのですが、問題は、ときどき不慮のリセットが起きてデフォルトモードに戻ってしまう場合があるようです。デフォルトモードで 0x02 を送ると "1ALS"と返ってくるのですが、これはIR Samplingモードでは起こらないはずにもかかわらず、あるとき突然 "1ALS" が送られてきて焦ったことが何度もあります。多分、パルスデータに含まれていた0x02に反応したのでしょう。

不慮のリセットは、外部からの赤外線入力が多すぎて飽和攻撃を受けたようなときリセットが起こるようですが、リセットが起きたことをプログラムが知る方法がありません。パルスを送る前に'V'を送って、バージョンナンバーが返ってこないことを確認する手もありますが、タイムアウトするまで待たないとバージョンナンバーが返ってこないとは言い切れないので、この手も使えないですね。それに、バージョンナンバーを返した直後にリセットが起きないとは言い切れないし。一応、パルス送信にハンドシェークモードというのがあるはずで、IRToyから0x3Eが返ってきたら62バイトを送って次の0x3Eを待ち次の62バイトを、、、、と送るモードがあることになっています。0x26コマンドを送ればそうなるはずですが、それもウソでした。IRToyは、WinLIRC対応ということになっていますが、対応してません。「送信」ボタンを押すとWinLIRCは二度と応答しなくなります。多分0x3Eを待っているのでしょう。

ちなみに、実際プログラムのテスト中にIRToyが自殺モードに入ってしまったことがあって、どうやら蛍光灯からの赤外線に対応しきれなくなってリセットしたところに僕のプログラムが0x24を送ったようでした。たまたまWindows 7 PCで復活させることができましたが、以後、Send関数に次のフィルターを追加して、それ以来IRToyを自殺に追い込むことはなくなりました。

for(int i=0; i<nByte; ++i)
{
    if(dat[i]=='$')
    {
        printf("Danger! '$' detected! Not going to send it!\n");
        return;
    }
}

ということで、IRToyは非常に強力で、実際FM77AVキーボードエミュレータに成功しましたが、ひとつ買って自分のプロジェクトに使ってみようと思ったら、絶対0x24を送信したらだめです。でも、0x24さえ送信しなければ多分大丈夫でしょう。

ああ、あと、ターミナルソフトからIRToyを制御したり状態をチェックしたりしない方がいいですね。間違って'$'を押した瞬間にデバイスを殺してしまうので。もちろん、Firmwareをアップデートするには、いったん殺す必要がありますが、確実にWindows XP機が一台あることを確認してからにしましょう。

Comments are welcome.  Send E-Mail to: 

Back to http://www.ysflight.com