以前
ラダーペダルや
フライトヨークを作成した際、
参考になる情報を求めてWeb上を探した事があります。
しかし昔のゲームポートを使った製作例はありましたがUSBをつかった例はあまり見当たりませんでした。
USBになってから、アマチュアの自作としては敷居が高くなってしまったのではないでしょうか。
そこでいくつかのソフトウェアで構成するジョイスティック製作用ツールキットを作成してみました。これらをまとめてOpenStickと名付ける事にします。
マイコンについては、本サイトではおなじみのPIC18F2550を使用します。
このマイコン、これを書いている時点では
秋月電子で350円程度です。
(最近はもっと安価な18F14K50がで出ており、いずれはこれも試したいと思いますが今のところ18F2550だけが対象です。)
メモリーマップ
OpenStickではPIC18F2550のFLASHメモリーを下図の様に使用します。
ブートローダは次の働きをします。
- 通常モードでマイコンを起動した場合はファームウェア本体に実行を移し、ジョイスティックとして動作する。
- 書換えモードでマイコンを起動した場合はPC上の書き換えプログラム「MybootOS」と通信し、指定されたFLASH領域を書換える。
- このブートローダはUBWというシステムの一部を流用しています。UBWについてはこちらの千秋ゼミさんで大変詳しく説明されています。
ファームウェア本体は次の働きをする事でジョイスティックとして動作します。
- コンフィグデータを読む。
- コンフィグに従いUSBインターフェースを初期化する。
- ボタンやアナログ入力からデータを取り込みUSBで通信する。
コンフィグデータには次の内容を記載しています。
- USBベンダID、デバイスID、プロダクトID他
- HIDリポートディスクリプタ
- マイコンの端子に対する、ボタンや軸の対応データ
FLASHメモリーへの書込み
ブートローダだけはPICライタを使用して書き込む必要があります。
一旦ブートローダを書込んでしまえば後はPICライタを使用する必要はなく、PC上のソフトウェア
MybootOSを使用してファームウェアとコンフィグ領域を書き換える事ができます。
実際のところブートローダとファームウェアは殆ど変更する必要はありません。
なのでPICライタでブートローダを書込む際、ファームウェアも一気に書込んでしまう事もできるので、この方法を主体に説明します。
コンフィグファイルの作成
コンフィグファイルの実体はFLASHメモリの0x4000〜0x423F番地の内容をインテルHEX形式で表したテキストファイルです。
インテルHEX形式については
こちらのサイトが詳しく説明されています。
コンフィグファイルを手軽に作成するツールがOpenStickConfigです。
回路図
- 入力端子はIN1〜IN18までの計18本です
- この内IN1〜IN10までの10本はアナログ/デジタル兼用ですのでボリュームやボタン、どちらでも接続可能です。
アナログ入力の場合は0〜5Vの入力電圧を0〜255または-128〜+127の値に変換してPCに渡します。
- IN11〜18までの8本はデジタル専用ですのでボタンやスイッチのみ接続可能です。
ハットスイッチ(POVとも呼ばれる方向スイッチで、45度〜360度まで、45度間隔の方向を表す)は4本のデジタル入力を使用します。
- デジタル入力はGNDとの間にスイッチを接続しますが、100KΩ程度のプルアップ抵抗が必要です。
IN11〜15(RC*ポート)には本回路図内でプルアップを接続済です。
またIN6〜10およびIN16〜18(RB*ポート)はPIC18F2550内臓プルアップをONにしていますので外部に接続は不要です。
結局、IN1〜5(RA*ポート)をボタンやハットスイッチ入力に使用する場合のみプルアップを追加する必要があります。
- IN12のみ510Ωの抵抗を入れている理由は、ブートモードで動作する際LED出力端子に割当てられているからです。
実際にはこの端子にLEDは取付けていませんが、ボタンを押した場合の短絡を防ぐ為に抵抗を入れています。
入力端子の割当について。
OpenStickConfigは次のルールで入力端子を割り当てます。
- アナログ入力端子をIN1〜順に割り当てて行く。
アナログ入力端子同士での順序は、X,Y,Z,Rx,Ry,Rz,Slider,Dial.Wheel,Throttle,Rudderの順です。
- 次のINxxにPOV(ハットスイッチ)を割り当てる。
- その次のINxxにボタンをを割り当てる。
この順序で割当てるので、入力信号が少ないとアナログ/デジタル兼用端子のみ使用する事になります。
なおIN13(RC2:PIC18F2550の13ピン)はモード切替スイッチを兼ねており、何らかのボタンスイッチを取付ける必要があります(ジョイスティックのボタンと兼用する事も可能)。
OpenStickConfigでは、ピン割り当ては「ShowPin」ボタンを押す事で表示します。
またHEXファイルを生成した場合や設定ファイルをロードした場合にも表示します。
ボタンやボリュームを取付けた回路図
例としてX,Y,Z軸とボタン8個で構成した場合の回路は次の様になります。
念のため、アナログ入力にはコンデンサを入れています。
PIC18F2550の端子の割当について。
OpenStickConfigはPIC18F2550の端子を表の割当てで使用します。
IN1〜10がアナログ/デジタル兼用入力、IN11〜18はデジタル専用入力です。
1.必要なファイルをダウンロード
まず準備として以下のファイルをダウンロードします。
次に
千秋ゼミさんへのリンクを開き、
ページ中程にある「UBW開発ツールアーカイブ」から次のファイルをダウンロードします。
MybootOSは上記サイトにあるMybootを私が改造したものです。
MybootはCode Offset設定は無視され、書込み開始番地が0x800固定なのですが、OpenStickでは0x4000番地から書込む必要がありました。
そこでCode Offsetが無視されず有効になる様に改造したものがMybootOSです。Code Offsetを0x800に設定しておけばMybootと同じ働きをします。
2016-07-26
MybootOS(64bitOS用)を追加しました。今までのMybootOSは64bitWindowsではエラーがでます。この64bit用はX86用としビルドしてあります。64bitOSで使うためにX86用としてビルドするという一見おかしなことになっている理由は
こちらのブログに書きました。なおこれはバイナリのみです。もしソースが必要な場合は
MybootOS.zipをダウンロードしてください。
2.ファームウェアつきブートローダの書込み
ブートローダを書きこむには
PICkit3や、
JDMライター等のPICライタが必要です。
ブートローダは先程ダウンロードした「UBW_B_HEX8.zip」に含まれる「20M-18f2550.hex」というファイルですが、
「OpenStickBL.zip」を解凍して現れる「OpenStickBL.hex」にもブートローダを含んでいます。
よってこのファイルを書き込めばブートローダとファームウェア両方を書き込んだ事になります。
一旦ブートローダさえ書いてしまえばあとはライターは不要です。
PICライターの替りにArduinoを使う方法を
ブログにアップしました。
Arduino-UNOと9V電池があればPICライター不要です
3.OpenStickConfigを使用してコンフィグデータを作成する。
先にダウンロードしたOpenStickConfig.zipを解凍します。この中のパスOpenStickConfig\OpenStickConfig\bin\ReleaseにあるOpenStickConfig.exe
を実行すると右のウィンドウが現れます。
- VID,PID,RevはUSB機器が何であるかを表すもので、VID,PIDは4桁の16進数、Revは4桁のBCDコードで設定します。
- VID(ベンダーID)は本来はUSBフォーラムに申し込んで割当てられるものですが、費用が$2000ぐらいするそうです。
ここでは実験という事で、自己責任で適当なIDを設定しています。勿論、正式なIDを取得すればここに設定できます(でも個人では普通は無理ですよね)。
- PID(プロダクトID)、Rev(レビジョンナンバー)は各ベンダーが自由に設定するものです。
- Manufacture stringはベンダー名を最大31文字で設定します。
- Produce Stringは機器名を最大31文字で設定します。
- Component内のANALOGとPOVには必要とする入力信号にチェックを入れます。
- BUTTON COUNTには必要なボタン数をプルダウンで選択します。
※文字入力値をOpenStickConfig内ではあまり厳密にはチェックしていません。たとえばRevはBCDコードという決まりですが普通に16進が入力できてしまいます。
以上を入力し、MakeHEXボタンを押すと出力ファイル名を聞いてくるので適当に設定します。
ここで生成されるのがコンフィグファイル(インテルHEX形式)です。
なおSAVE、LOADボタンにより設定状態を保存/読込みができます。拡張子を「osc」としていますが、中身はテキストファイルです。
4.コンフィグファイルの書込み
コンフィグファイルの書込みにはMybootOSを使用しますが、その準備としてPCにドライバをインストールする必要があります。
まずOpenStickのハードウェアをUSBケーブルでPCと接続します。次にMODEボタンを押しながらRESETボタンを押し、RESET→MODEの順で指を離します。
するとドライバーインストール画面になるので先にダウンロードした「MCHP-USB.zip」内のMCHP-USB\Driver\Release下にあるmchpusb.infを指定します。
(もしドライバーインストール画面にならない場合は手動でもインストールできると思います)
その後MybootOSを起動すると次のウィンドウが現れます。
ここで「Open HEX」ボタンを押して、先にOpenStickConfigで作成したHEXファイルを選択します。
次に「Code Offset」のプルダウンメニューを0x4000に変更します(コンフィグファイルは0x4000に置く)。
その後「Write Verify」ボタンを押すと書込みを開始します。
もし「Write Verify」ボタンが押せない状態になっている場合はマイコンとPCの接続が上手く行っていません。
マイコン周辺回路の異常や、ブートローダの書込みミス、ケーブルやドライバの問題等を確認する必要があります。
書込みが完了するとウィンドウ右上に「Write Complete」の文字が現れます。
「Restart Target」ボタンを押すとマイコンが再起動し、ジョイスティックとして動作を開始します。
コンフィグファイルを書込むつもりで「Code Offset」が0x800のままライトしてしまうとファームウェアを壊してしまいます。
その場合でもPICライタのところまでやり直す必要はありません。
先にダウンロードしたOpenStick.zipを解凍し、その中のOpenStick.hexファイルを0x800から書込む事でファームウェアのみ復元できます。
(なおMybootOSがブート領域まで壊してしまう事はありません)。
5.コンフィグファイルの構造
コンフィグデータはPIC18F2550のフラッシュメモリ0x4000番地以降に読み込みます。
そしてコンフィグファイルはこれらをインテルHex形式で表したテキストファイルで、OpenStickConfigで生成するのが簡単なのですが、
手作業で修正する事による自由なピン配置に変更する事もできます。
ただしPIC18F2550の仕様による制約があり、IN1〜IN10にアナログとデジタルを混在する場合、アナログで指定するIN番号よりも小さいIN番号にデジタルを指定する事はできません。
0x4000からのコンフィグデータは次の配置になっています。
この中で2バイトのデータは、PIC18F2550がリトルエンディアンである関係上、0x1234というデータならば先頭番地に0x34、次の番地に0x12が格納されます。
またテキストデータはUTF-16コードで表します。
なお0x4200番地からはピンコンフィグレーション設定を記述しています。
これはPIC18F2550のどの端子をアナログ入力として使い、どの端子をデジタル値入力として使うかを指定するもので、以下のコードで表します。
POVを除き2バイトで一組で、POVのみ5バイトで表します(デジタル入力を4本指定するため)。
ここに記載する順序がリポートディスクリプタに登場するデータ順に一致している必要があります。
特殊用途としてLEDのON/OFF指定があります。これはPIC18F2550の11ピンに接続するLEDを点けるか消すかを指定します。
ピンコンフィグは起動時に一度読むだけなので動作中にLEDを変化させるような機能はありません。
ピンコンフィグの最後には0xffを二つ書いて終了です。
コンフィグファイルの例を下に示します。
:020000040000FA
:104000000000FFFF05000000500000000403090449 ←ID類ほか
:10401000120348004F004900480049004F00440087 ┐
:104020004F00000000000000000000000000000041 │製造元文字列
:104030000000000000000000000000000000000080 │
:104040000000000000000000000000000000000070 ┘
:1040500012034A0059004F00530054004900430026 ┐
:104060004B00000000000000000000000000000005 │製品文字列
:104070000000000000000000000000000000000040 │
:104080000000000000000000000000000000000030 ┘
:1040900005010904A1010901A100150026FF007511 ┐
:1040A00008950809300931093209330934093509FD │リポートディスクリプタ
:1040B0003609378102150025073500463B01651496 │
:1040C000550075089501093981020509150025017A │
:1040D0001901290675019506810295028103C0C068 ┘
:1040E00000000000000000000000000000000000D0 ┐
:1040F00000000000000000000000000000000000C0 │
:1041000000000000000000000000000000000000AF │
:10411000000000000000000000000000000000009F │
:10412000000000000000000000000000000000008F │空白
:10413000000000000000000000000000000000007F │
:10414000000000000000000000000000000000006F │
:10415000000000000000000000000000000000005F │
:10416000000000000000000000000000000000004F │
:10417000000000000000000000000000000000003F │
:10418000000000000000000000000000000000002F │
:10419000000000000000000000000000000000001F │
:1041A000000000000000000000000000000000000F │
:1041B00000000000000000000000000000000000FF │
:1041C00000000000000000000000000000000000EF │
:1041D00000000000000000000000000000000000DF │
:1041E00000000000000000000000000000000000CF │
:1041F00000000000000000000000000000000000BF ┘
:10420000FE01020102020203020402050206020785 ┐
:10421000020803090A0B0C000D000E000F0010002D │ピンコンフィグ
:10422000110012FFFF00000000000000000000006D ┘
:10423000000000000000000000000000000000007E
:00000001FF
Created by ez-HTML
トップページへ
ほいほい堂本舗