ブートローダ付きファームウェアが古いままだったので最新版OpenStickBL150722.zipに変更しました。単体ファームウェアOpenStick150722.zipにブートローダをくっつけたものです。持吉技研様から頂いたマイクロチップ社のVID,PIDサブライセンスに関する情報を追記しました。64bitWindowsでMybootOSがエラーを出して実行できなかったので対策版MybootX86-bin-160725.zipをアップしました。Arduinoでブートローダを書込む方法へのリンクを追加しました。OpenStickファームウェア更新。従来のPIC18F2550に加えPIC18F2553もサポートしました。前にブログに書いたのですがジョイスティックには入力が変化した時だけ値を更新するタイプと変化がなくても常に更新するタイプがある様です。これまでOpenStickは後者でしたが、今回から前者に変更しました。OpenStickConfig更新。ピンアサイン表示で、なぜか25ピンを常にRESETと表示していたのを修正しました。OpenStickConfig更新。String」が反映されない問題を修正。OpenStickファームウェア更新。USBフレームワークの最新版(v2013-02-15)でコンパイルするとエラーになったので修正しました。OpenStickConfigを更新しました。ShowPinボタンを追加し、ピンアサインを表示する様にしました。今までのExecボタンは意味が判りにくかったのMakeHEXに名前を変更しました。割り当て表と、コンフィグファイルの情報を追記しました。2013-02-19にアップしたファームのソースがデバッグ途中のものと間違っていたので修正しました。OpenStickConfigを更新しました。アナログ軸にRx,Ry,Rzを追加しています。LOAD,SAVEボタンが動作する様になりました。拡張子を「.osc」にしていますが、中身はテキストですこれまでX,Y,Zは-128〜+127の値をPCに送っていましたが、全てのアナログ軸を0〜255に変更しました。Viewの略だそうです)。2/11にバイナリだけ公開していたファームウェアのソースをアップしました。アナログ入力を6つ以上使用した場合、6番目だけ無視され7番目以降がピン順を詰めて割当てられる問題修正。(ブートローダつきファームウェアのみ修正しています。参考になる情報を求めてWeb上を探した事があります。昔のゲームポートを使った製作例はありましたがUSBをつかった例はあまり見当たりませんでした。USBになってから、アマチュアの自作としては敷居が高くなってしまったのではないでしょうか。そこでいくつかのソフトウェアで構成するジョイスティック製作用ツールキットを作成してみました。これらをまとめてOpenStickと名付ける事にします。OpenStickでできることボタン一つから多数のアナログ軸まで、ジョイスティックのコントロールソフトウェアを、プログラム言語を駆使せずに作成する事ができます。構成マイコンについては、本サイトではおなじみのPIC18F2550を使用します。このマイコン、これを書いている時点では秋月電子で350円程度です。(最近はもっと安価な18F14K50がで出ており、いずれはこれも試したいと思いますが今のところ18F2550だけが対象です。)メモリーマップOpenStickではPIC18F2550のFLASHメモリーを下図の様に使用します。ブートローダは次の働きをします。通常モードでマイコンを起動した場合はファームウェア本体に実行を移し、ジョイスティックとして動作する。書換えモードでマイコンを起動した場合はPC上の書き換えプログラム「MybootOS」と通信し、指定されたFLASH領域を書換える。このブートローダはUBWというシステムの一部を流用しています。UBWについてはこちらの千秋ゼミさんで大変詳しく説明されています。ファームウェア本体は次の働きをする事でジョイスティックとして動作します。コンフィグデータを読む。コンフィグに従いUSBインターフェースを初期化する。ボタンやアナログ入力からデータを取り込みUSBで通信する。コンフィグデータには次の内容を記載しています。USBベンダID、デバイスID、プロダクトID他HIDリポートディスクリプタマイコンの端子に対する、ボタンや軸の対応データFLASHメモリーへの書込みブートローダだけはPICライタを使用して書き込む必要があります。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開発ツールアーカイブ」から次のファイルをダウンロードします。MCHP-USB.zipMybootOSは上記サイトにあるMybootを私が改造したものです。Offset設定は無視され、書込み開始番地が0x800固定なのですが、OpenStickでは0x4000番地から書込む必要がありました。Offsetが無視されず有効になる様に改造したものがMybootOSです。Offsetを0x800に設定しておけばMybootと同じ働きをします。2016-07-26MybootOS(64bitOS用)を追加しました。今までのMybootOSは64bitWindowsではエラーがでます。この64bit用はX86用としビルドしてあります。64bitOSで使うためにX86用としてビルドするという一見おかしなことになっている理由はこちらのブログに書きました。これはバイナリのみです。ソースが必要な場合はMybootOS.zipをダウンロードしてください。JDMライター等のPICライタが必要です。「OpenStickBL.zip」を解凍して現れる「OpenStickBL.hex」にもブートローダを含んでいます。よってこのファイルを書き込めばブートローダとファームウェア両方を書き込んだ事になります。ブートローダさえ書いてしまえばあとはライターは不要です。PICライターの替りにArduinoを使う方法をブログにアップしました。Arduino-UNOと9V電池があればPICライター不要です3.OpenStickConfigを使用してコンフィグデータを作成する。先にダウンロードしたOpenStickConfig.zipを解凍します。実行すると右のウィンドウが現れます。VID,PID,RevはUSB機器が何であるかを表すもので、VID,PIDは4桁の16進数、Revは4桁のBCDコードで設定します。VID(ベンダーID)は本来はUSBフォーラムに申し込んで割当てられるものですが、費用が$2000ぐらいするそうです。ここでは実験という事で、自己責任で適当なIDを設定しています。正式なIDを取得すればここに設定できます(でも個人では普通は無理ですよね)。PID(プロダクトID)、Rev(レビジョンナンバー)は各ベンダーが自由に設定するものです。stringはベンダー名を最大31文字で設定します。Stringは機器名を最大31文字で設定します。Component内のANALOGとPOVには必要とする入力信号にチェックを入れます。COUNTには必要なボタン数をプルダウンで選択します。※文字入力値をOpenStickConfig内ではあまり厳密にはチェックしていません。RevはBCDコードという決まりですが普通に16進が入力できてしまいます。以上を入力し、MakeHEXボタンを押すと出力ファイル名を聞いてくるので適当に設定します。ここで生成されるのがコンフィグファイル(インテルHEX形式)です。SAVE、LOADボタンにより設定状態を保存/読込みができます。拡張子を「osc」としていますが、中身はテキストファイルです。2016-08-10持吉技研様より下記の情報を頂きました。マイクロチップ社のマイコンを使用する場合、マイクロチップ社からVID,PIDのサブライセンスを提供頂ける様です。生産量が10000ユニットまで等の制約はありますが正規のVID,PIDを使用できます。詳細はこちらをご参照ください。http://www.microchip.co.jp/support/faq_usb.html4.コンフィグファイルの書込みコンフィグファイルの書込みにはMybootOSを使用しますが、その準備としてPCにドライバをインストールする必要があります。OpenStickのハードウェアをUSBケーブルでPCと接続します。次にMODEボタンを押しながらRESETボタンを押し、RESET→MODEの順で指を離します。するとドライバーインストール画面になるので先にダウンロードした「MCHP-USB.zip」内のMCHP-USB\Driver\Release下にあるmchpusb.infを指定します。(もしドライバーインストール画面にならない場合は手動でもインストールできると思います)その後MybootOSを起動すると次のウィンドウが現れます。HEX」ボタンを押して、先にOpenStickConfigで作成したHEXファイルを選択します。Offset」のプルダウンメニューを0x4000に変更します(コンフィグファイルは0x4000に置く)。Verify」ボタンを押すと書込みを開始します。Verify」ボタンが押せない状態になっている場合はマイコンとPCの接続が上手く行っていません。マイコン周辺回路の異常や、ブートローダの書込みミス、ケーブルやドライバの問題等を確認する必要があります。Complete」の文字が現れます。Target」ボタンを押すとマイコンが再起動し、ジョイスティックとして動作を開始します。Offset」が0x800のままライトしてしまうとファームウェアを壊してしまいます。その場合でもPICライタのところまでやり直す必要はありません。先にダウンロードしたOpenStick.zipを解凍し、その中のOpenStick.hexファイルを0x800から書込む事でファームウェアのみ復元できます。(なおMybootOSがブート領域まで壊してしまう事はありません)。5.コンフィグファイルの構造コンフィグデータはPIC18F2550のフラッシュメモリ0x4000番地以降に読み込みます。手作業で修正する事による自由なピン配置に変更する事もできます。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を二つ書いて終了です。コンフィグファイルの例を下に示します。ez-HTMLトップページへほいほい。