2011年6月25日土曜日

Microsoft Flight Simulator用自動操縦パネルの製作・試作(その7)

どんなパネルにするか決めました。

Boeing,Airbusとか、特定の機体を使うというのではない八方美人タイプなのでどれでもそこそこいけるパネルにしたいと考えました。
で市販品を参考にしようとさがすと、GoflightのGF-MCPというのを見つけました。
宣伝文句を見ると”一般的な航空機に対応”と書いてます!


Goflightは前回紹介したBoeing 737タイプのMCP-PROというのも発売しておりメーカとしてきっと厳選した結果GF-MCPのようなスイッチ・ディスプレイ構成となってるんだろう!とポジティブに考えます。

でありがたくパクら参考にさせてもらいます。
まぁこんなに格好良くは作れないでしょうし、家庭事情にあわせて小さくコンパクトなものにして多少の工夫をしようと思います。


2011年6月24日金曜日

Microsoft Flight Simulator用自動操縦パネルの製作・試作(その6)

試作基板の回路図をまとめました。
簡単だけど時間をあけるとあっぱらぱーになりそうなので…

みなさんeagleでどうやって回路図をビットマップにしてるんだろう、と思っていたらexp2imageというulpが準備されているんですね。


run exp2image color 150 .bmp 91 92 94 95 96


詳しくはeagleのインストールディレクトリの ulp/exp2image.ulpを参照。
91、とかのレイヤーナンバーを覚えるのが少々面倒。

2011年6月21日火曜日

Microsoft Flight Simulator用自動操縦パネルの製作・試作(その5)

ロータリーエンコーダの取りこぼし問題を根本解決しました。

解決方法は前回述べたように、

  1. ロータリエンコーダの回転にあわせたカウンター(1byte)をPCへ送る。
  2. PCではループでそれを受け取り、
    • 増えていれば設定高度増加イベント(EVENT_ALT_INC)を送る。
    • 減っていればその逆、EVENT_ALT_DECを送る。
というものです。

ただ、設定高度増加イベント自体を直接送れないためいったん自前のイベント番号に割り当てる必要がありました。
(このあたりはSDKのサンプルを参考にしました)

FSX自体は上記増減イベントがたくさん積まれてもちゃんと処理してくれるようです。
(カウンタの折り返し処理をミスって、一気に255増えてもちゃんと"25500feet"増えてました…)

プログラムは今のところ無限ループで動かしていますが、sleepを使った負荷軽減を図りました。
ただ、ロータリエンコーダを回す、という操作に対しLED表示の追従が遅れるのでsleep(10)にしています。(前述のように取りこぼす、というわけではない。)

これでフィージビリティスタディ終了(前回終了宣言してたけど…)です。

2011年6月20日月曜日

Microsoft Flight Simulator用自動操縦パネルの製作・試作(その4)

PCからデータを送って表示することに成功しました。
ちょっと感動。


0次試作ということで
・オートパイロットon/off  およびその状態表示(LED)
・高度保持 on/off およびその状態表示(LED)
・設定高度の表示/変更
が出来ることを確認しました。

ムービーを貼っときます。


ロータリースイッチはゲームパッドのボタンとして左回り・右回りに応じてそれぞれ違うボタンを押したていでPCに送信。
ただ、取りこぼすことがあるようで改良が必要っぽい。
くりくり回すと高速でボタンを連打した状態になるのでそもそも速度が成り立っていないのかもしれません。
USBのポーリングインターバルを短くしてみたりしましたがあまり改善しませんでした。
総パルスカウント数を送るようにして、PC側でそのパルスカウントに増減に応じてPC内でFSXで値を増減させる指示をするのが根本解決、かと。

とはいえ、USBでの情報のやりとり、表示の方法についてはフィージビリティスタディができたのでこれを元にして本番のMCPデザインにはいろうと思います。

ファームウェア、PC側のプログラム整理しておこう。

P.S.
EZ-USBのコンパイラが"RAM足りねぇ"と言い始めた… 対策考えなきゃ。

2011年6月18日土曜日

USB HID複合デバイスの作り方

備忘録。

ひとつのUSB機器に複数(composite)のHIDデバイスを作る方法。
市販品のイメージでは、キーボードの横にトラックボールが付いているがUSBコネクタはひとつしかないやつ。
PCにつなぐとトラックボールもキーボードも別に認識される。
  • USB機器側
    • デスクリプタの作り方。
      • デバイスデスクリプタはそのままでいい。
      • コンフィグレーションデスクリプタのなかのインターフェースの数(bNumInterface)を必要な数に増やす。普通は1になっているためひとつの機器(マウスだけ、とか)を示している。
      • インターフェースディスクリプタ、エンドポイントディスクリプタは必要な数分、用意する。普通は一組(エンドポイントは複数あるかもしれないが)
        • で、インターフェースディスクリプタのインターフェース番号bInterfaceNumberを一つ目は0,二つ目は1…というように割り振る。
      • レポートディスクリプタも同様に必要な数用意する。
    • ファームウェアの作り方
      • PCは上記のコンフィグレーションディスクリプタの数を見てインターフェースディスクリプタをくれ、と要求してくる。
      • ひとつしかないときは"0"番をくれ、というのみ。
      • 複数の時は"0"番を頂戴、のあと"1"番をくれ、など要求が複数回になる(ここで"0","1"は上記ディスクリプタで指定したとおり)
      • なので、その要求に応えるようにインターフェースディスクリプタを返す。
        • ※EZ-USBのサンプルは下記参考のアプリケーションノートを参照。
      • エンドポイントの取扱い方は今まで通りでいい。
  • PCからのアクセス方法。
    • 上記でちゃんとディスクリプタを設定・返答するようにしておけば、HIDデバイスなので標準デバイスドライバが各機器用にロードされる。
    • 特に特別なプログラムでアクセスするのでないかぎり、そのままでOK。
      キーボードをキーボードのままで使う、とかマウスをマウスのままで使うとか。
    • 自作プログラムでそいつをアクセスしてる時は下記に注意。
      • デバイスパスの中に"mi_00"のようにインターフェース番号に応じて認識されている状態になる。普通はひとつなのでmi_00しかないが、二つの場合はVID,PIDは同じだけどmi_01のように異なる番号(インターフェースディスクリプタで指定したように)になっているものが認識される状態になる。
      • 普通のサンプルでは、VID,PID一致したときに”デバイスがあった”とオープンしてしまう。これはmi_00のひとつのデバイスしかないため実用上は問題ないが(たぶん)厳密にはよくない。
      • なのでさらにVID,PIDが一致したデバイスパスのなかに所望の"mi_??"があるかをcontainsなどで調べてそれも含めて一致したらそのデバイスパスをオープンする。
      • デバイスパスの例
        • \\?\hid#vid_ffff&pid_0001&mi_01#7&26461c5c&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}"), 
参考にしたもの。
・http://www.cypress.com/?rID=12932 のアプリケーションノート
・USB2.0インターフェース設計術

※正しい用語を使っていないかも。

ゲームコントローラの設定保存場所

必至に探した。旧い名称でゲームコントローラの設定画面に出てきちゃう。


上のダイアログで"JOYSTICK"って表示名をEZ-USB側で変更しているにも関わらず…出てくる。
ベンダIDとかを変えれば別物として認識されるのでそれはそれでいいんだけど、
名前を変えるたびにベンダIDを変える、というサイクルは気に入らない。

デバイスインストールログとかからさがしたけど見つからず。
registryを検索するとそれらしいところを発見。

HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\MediaProperties\PrivateProperties\Joystick\OEM

の下にベンダID,プロダクトIDごとに名前とかの情報が入っているみたい。

ちゃんと見ていないけど
HKEY_CURRENT_USER\System\CurrentControlSet\Control\MediaResources\Joystick\
DINPUT.DLL\JoystickSettings
にも範囲情報とかを記録しているのかもしれない。

困ったときは、レジストリをベンダIDで検索するのが早いかもね。

2011年6月17日金曜日

Microsoft Flight Simulator用自動操縦パネルの製作・試作(その3)

下記を行うことができました。

1.HIDジョイスティックとHID準拠デバイスを作れた
HID準拠デバイスは7segLEDの表示内容をPCから出力指示するためのもの。
2.HIDジョイスティックではロータリエンコーダの左右の回転でオートパイロットの設定高度が変えられることを確認した。
3.LEDのダイナミック表示ができるようになった(PCからの通信で値を送るまでにはいたらず)
4.1.でHID複合デバイスとして作ることができた。
これで、一台でジョイスティック、LED表示デバイスを扱えるようになりハンドリングが楽になると思います。

PCからの通信が今までに経験がなく、サンプルプログラムがどれも微妙に旧い、ずれてる、というったものなので読みといていく作業が大変そう。

とりあえず7segLEDでお約束の?カウンタが動作しています。

複合デバイス(Composite Device)でゲームコントローラ、
HID準拠デバイスが同居

今回はまったところ。
・デスクリプタのWordAlignがずれていると微妙な動きになることがある。
→例えば、デバイスの名前がおかしくなるとか。
・サイプレスのサンプルが参考になった。
http://japan.cypress.com/?rID=12932
でも、微妙に製造元文字列が設定されないとかのバグ(仕様?)なぞが散りばめられている。
しかし、コンパイルすれば、キーボード、マウス、バルクデバイスが同居する。
・なんども抜き差ししているうちにはまった感じになり、デバイス削除だのベンダーIDだの変更をしたがそのうち認識してた・・・
・認識したのが開発機のみか、と疑いEEPROMに焼いて他のPCでも試した。ちゃんとうまくいった。
・最初、サイプレスのANなんどかデバイスの削除とかをやったり、ベンダIDを変えたりプロダクトIDを変えたりしてるうちになーんとなく治った。原因の分からない、もやもやした幕切れ

2011年6月16日木曜日

Microsoft Flight Simulator用自動操縦パネルの製作・試作(その2)

PIC18を使って、と思っていましたが家に眠っているEZ-USBを有効活用することにします。
PIC18が安く入手が容易な昨今、EZ-USBの出る幕はないのかなぁ。

使ったのはEZ-USB FX2ボードbyストロベリーリナックス製。


パネルの電気的な仕様を決めるための試作基板。


LEDつきスイッチ、ロータリーエンコーダ、7セグLEDを載せました。
MCPの動作をさせるために必要な基本的なアイテムです。
これらをうまく動作させることができれば本格的に製作しようと思います。

ひとまず、
自動操縦のOn/Offおよびそれを示すインジケータ
オートスロットルOn/Offおよびそれを示すインジケータ
オートスロットル設定変更(ロータリーエンコーダ)
オートスロットル設定値ディスプレイ(7セグ)
ってとこですかね。

2011年6月11日土曜日

Webラジオ(BB-Shout)ケース完成

基板むき出しで使う(ほったらかす)こと一年、ケースに納めるも文字なしの無地パネルで使うこと6ヶ月。
買ったCNCフライス盤を少しでも活用するためCNC文字切削に挑戦。
G-Codeミスによる、切削終了位置からホーム位置へ戻るまでエンドミル引きずり事故、切削深さ浅く文字スミ入れ難航(すぐ”スミ”が取れる…)などを経て完成。
なんかパネル傷々だな…。



液晶のバックライト色がエロイ。
あ、ファームのバージョンアップしなきゃ。でも書込の環境つくるのめんどくさいな。

2011年6月10日金曜日

DDSコントローラの製作

キーボードをつけた。ロータリーエンコーダの取り付けはまだ。
キースキャン(単キー)して取り込むところまでOK.
あ、機能の規模を大きくしようと思ったのでPICを16F873に変更。
外部からシリアル経由で周波数の調整をしたいから。

とはいえ、まずキー入力で周波数直打ちできるようにしてみてそれからUIの機能再検討しよう。

2011年6月8日水曜日

Microsoft Flight Simulator用自動操縦パネルの製作・試作(その1)

Microsoft Flight Simulator(FSX)で遊び中。最新版。

自動操縦で飛ぶときにいちいち画面の中のパネルのスイッチをマウスでやると面倒くさいし、興ざめ。

自動操縦用のパネルの売り物もあったりする。

売り物はこんなの。Goflightのやつ。

カッコいい。けど4万円ぐらいする。

欲しいけど、飽きちゃうとまた悲惨なので作ることにする。

課題は二つ
1.FSXから現在の自動操縦の設定高度とかを読みだして表示する。
2.スイッチ入力をFSXに送る。

で、まずサーベイがてら
1.FSXから値を読みだしてコマンドプロンプトに表示する
2.キーボードであるキーを押すとFSXの自動操縦の設定高度をインクリメントする
の二つのプログラムを作った。

はじめはSDKのことがよくわからず、VisualStudioの設定もよくわからずイライラしたけど、なんとかできた。

あとは物理的なパネルを作ることにする。
PIC18のUSB付きのでHID+GPIOみたいなのを作って、上記のプログラムと結合するつもり。

USB、ちゃんと出来るかな。

2011年6月7日火曜日

FPGAスターターキット到着 from USA

digilentに注文していた、FPGAスターターキット、xilinxのUSB書き込みケーブル、CoolRunnerの載った小さなボード、の3つが届きました。

注文から4日で届きました。
fedexでの荷物の追跡状況を見ると、丸一日通関に要しているようで。
とはいえ、地球は小さくなりました。
送料は40ドルほど、約3,200円なり。
国内400キロ輸送で600円、と考えると地球半周10,000キロで3,200円は安いなぁ。

秋月DDS組み立て&コントローラ作成

長ーいあいだ寝かせていたDDSを取り出す。
ウェルパインってとこの石を使っていて、パラレル、シリアルでコントロールできる。

まず、DDS部を作る。フィルタはまたあとで検討。パラレル、シリアルごとで制御の方法、回路が一部ちがい、迷いながら組む。

コントロールはPICにしたいので、パラレル26本を生成するのはほぼ不可能なのでシリアルでさくっと作ることにする。
秋月PICキャリーボードで試食。
マチュピチュの空中都市状態。

3線式のシリアルでビット長が33bit連続を送らなきゃいけない。
クロックをおくりつつ、チップセレクト 3bit + コマンド 4bit + 指定周波数 26bit を送信、
最後にSTRBで肩を叩いて完了。

この石はシリアルバスに複数つながることも想定しているらしくチップセレクトで
ちゃんと特定の石を指定してやらなきゃならない。

吊るしでつくると3bitオールHの0x7になるので、ここは固定で。

とりあえず付いてきた仕様書に基づき、16F84を使ったテストボードで動作を確認。
はじめ、”出力する”とされているコマンドを実行するも、出力せず焦る。

初期化が出来ていないだけか?と思ったが初期化のタイミングで消費電流が少し増えていることから
何かしら動いていると判断。

DDSのチップから汎用4bit出力ができるコマンドを用いてこの出力が行われていることを確認できたため、”発振してない” ”組み立てチョンボ” を追う。
原発は67Mhzで発振してた。組み立てチョンボを追うのはめんどいなぁ、とふと”出力ON”コマンドがあるのに気づく。
で、これを送ってみたところ、正弦波発生。
とりあえず、やったね。

使い道は普段の実験用の汎用正弦波発振器にするつもり。
だけど、フィルタをどのあたりで妥協するかを考えなきゃ。しばらくはあんまり高周波使わなさそうな気もするのでオーディオ帯+αぐらいかなぁ。

次回はGUIを考えよう。

2011年6月6日月曜日

始めてみるよ。

なんでも作るよ。の倉田さん、なんでも作っちゃうかもに触発されて何かつくっていこうと思います。
長続きしないかも。

なんでも作るよ。は、図書館で”タタキツクルコト”という本を読んで知りました。
でかい物、を作る技量と勇気に脱帽です。
”とにかく走りはじめてみよう”という姿勢に乾杯。

その後”タタキツクルコト”は買ってしまいました。

なんでも作っちゃうかもはバラエティに富んだ、また深い内容に敬服します。
こんなふうに作れたらいいな。