OpenStickでフォースフィードバックができないか~2~

長い事ほったらかしていたフォースフィードバック(以下FF)の話です。

前回は振動機能付きゲームパッドを購入してディスクリプタ類を調べたけどイマイチわからないという話を書きました。
また並行してPCからFFデバイスを制御する方法も知っておく必要があると考え、MSDNのこのページにC#から制御する例があったので実行してみましたが、下図のエフェクト作成処理でエラーが出ます。
因みにビルド環境はVisualStudio2010Expressです。

FFC#errorr

なんかエラーが出る。

この原因は何でしょう? このまま数カ月止まっていました。

どうしようかなーと思ってたところ、MEDさんからフォースフィードバックどうなってんの?というリクエストもあり、重い腰を上げました。
とりあえず上のサンプルプログラムは一旦置いとく事とし、代わりにDirectXのSDKにFFConstというサンプルが付いていたので、こっちを試してみます。これはC++で書かれた例です。

しかしこのサンプルはビルドすると”afxres.h”が無いと言ってエラーになりました。
ググッてみると”afxres.h”はMFCの関係だそうで、VisualStudioのExpress版には含まれていないので代わりに”windows.h”を使えばいいらしいです。

次に”..\..\DXUT\Optional\directx.ico”が無いと言ってきます。とりあえずここは”.\directx.ico”に変更し、ビルドディレクトリにdirectx.icoをコピーしてきました。
これで無事実行でき、下の様なウィンドウが開きます。そして枠内をマウスでクリックすると確かにゲームパッドが振動しました。

FFconst Sample

DirectX SDK内のフォースフィードバック制御サンプル

 

ほんの少しだけ前進したのですが、OpenStickをFF化するにはまだまだハードルがあります。 エフェクトをデバイスに送る部分はどうやらドライバを書く必要がありそうです(Windowsのドライバなんて書いた事ありません)。

という事で道は遠いです、また「ぼちぼち堂本舗」になると思います。

OpenStick無線化実験~その2~

前回の実験ではTWE-Liteの標準アプリを用い、それなりに動作はしましたが微妙な遅延が気になりました。 そこで今回は最低限の遅延で動作する様、新たにTWE-Liteのアプリを作成してみました。

構想

TWE-Liteにアナログジョイスティックやボタンを接続し、その値を電波で飛ばします。それを受信側のTWE-LiteでUARTの信号に変換してPIC18F14K50に渡します。前回と違うのは受信側のTWE-LiteとPIC18F14K50の間をPWM→AD変換ではなくシリアルで直接伝える点で、無駄をなくした分反応が早くなる事を期待しています。

OpenStickAir-2-

無線には下のデータが流れます。またTWE-LiteとPICマイコン間の通信も全く同じフォーマットが流れます。先頭のR::に続く2桁の16進数はボタンの状態、続く3桁の16進数×4はアナログ軸の状態です。

R:01:3ff:3ff:3ff:3ff
R:00:3ff:3ff:3ff:3ff
R:01:040:0C0:3ff:3ff
R:01:040:0c0:3ff:3ff

 

TWE-Liteのプログラム

TWE-Liteは搭載されたマイコンのプログラムを書き換える事が出来るという特徴がありますが、このプログラムの作り方が結構分かりづらく、一度挫折した事があります。今回はDSAS開発室の部屋の記事を参考にさせて頂きました。このサイトはLチカから始まって基本的なところを説明してあり私でも理解できました。 但し今回の実験ではペアリングの設定処理は省略しており、チャンネルやアプリケーションIDはハードコーディングしています。

PIC18F14K50のプログラム

OensStickLiteのファームを改造しています。OpenStickLiteではマイコン内蔵のADCやGPIOの状態を取り込んでいましたが、これらをUART入力に変更します。
UARTからは上に記したフォーマットでデータを受け取り、これをジョイスティックの状態としてUSBに流します。

実行結果

前回の標準ファーム使用時よりだいぶ早くなっています。無線を使わないときと比べると微妙な遅延はありますが、まあこんなもんではないでしょうか。
今回は遅延確認だけを目的としているので公開するにはまだ色々と変更が必要です(ペアリングのあたりとか、コンフィグツールとか・・)。

BTLE化

並行してBluetooth化も検討していますが・・・なんか難しいです。先日から写真の本を読んでいますが、これでで基本的な知識を付けた上で公式サイトの資料を読む必要があり、ここでまた英語を頑張る必要があります。いつ完成するかわかりません。

BTLE本

BTLE本

これまたぼちぼちやっていこうと思います。
最近は「ぼちぼち」ばっかりです。「ほいほい堂本舗」ではなく「ぼちぼち堂本舗」にしようかと思います(ウソです)。

OpenStick無線化実験

MEDさんとの会話でOpenStickを無線化できないかという話題が出ました。そこでまずはTWE-Liteを使ったお手軽方式で 試してみました。TWE-Liteという無線モジュールは以前はTOCOS(東京コスモス電機)から出ていたのですが、今は独立したモノワイヤレスという会社になっています。

構想

TWE-Liteの出荷時に書き込まれている標準アプリでは、例えば2点間を接続したとすると、一方の4本のアナログ入力をそのまま相手の4本のアナログ出力(PWM)として、また4本のデジタル入力をそのまま相手のデジタル出力として伝える機能があります。これを利用してジョイスティックの可変抵抗やボタンとOpenStickとの間にTWE-Liteを挿入する感じでやってみます。

実験開始

OpenStickAir1

実験中・・・

ジャンクから外したジョイスティック(可変抵抗)及びボタンを左側のTWE-Liteにつなぎ、右側のTWE-LiteをPIC18F14K50に接続します。PIC18F14K50はOpenStickLiteによりジョイステックとして設定してあります。
要は普通にUSBジョイスティックを構成しておいて可変抵抗やボタンの配線にTWE-Liteを割り込ませただけです。
TWE-LiteのPWM周波数設定はデフォルトの1KHzから64KHzに変更しておきました。

なおTWE-Liteの動作電圧は3.3VなのでPIC18F14K50も3.3Vで動作させています。 これはソフト的には何も変えず単に電圧を変えただけです。
電源は写真には写っていませんが安定化電源から3.3Vを供給しています。TWE-Lite2個とPIC18F14K50は全て共通の電源で動作し信号だけが電波で飛んでいる形です。

 

結果

これでとりあえずは動作するのですが下の問題がありました。

  • 反応が遅い。
    目で見てわかる程度の遅延があります。フライトシミュレータで使う程度なら気になりませんがシューティングゲームの様な速い動きだと 影響が大きいと思われます。
  • アナログ軸の中心が大きくずれる。
    これはTWE-LiteのA/D変換はフルスケールが1.5V程度である為です(設定変更で1.8Vフルスケールにもできる様ですが大きな違いはなさそうなので試していません)。

中心位置のずれは可変抵抗に入れる電圧を落とせば問題ありませんが、反応が遅いのは用途によっては致命的です。 設定を色々といじくってみたのですが大きくは変わりませんでした。
まだ何か方法があるのかもしれませんが、TWE-Lite以外の方法も考えて見ようと思います。

 

ArduinoでPICマイコンに書込む~OpenStickLite(PIC18F14K50)編~

ジョイスティック自作用ツールキットOpenStickは元々PIC18F2550(又は2553)を採用していました。このマイコンは28pinで、DIPパッケージだと結構大きい部類になります。
そこで先日PIC18F14K50を使用したOpenStickLiteをβリリースしました。こちらは20pinなので入力ピン数は少なくなりますが、これでも大抵の用途には事足りると思っています。
価格もこちらの方が大幅に安くてすみます。

OpenStickもOpenStickLiteもUSBからプログラムを書き込む為のブートローダを使用しています。 電源投入時(またはリセット時)の条件設定によりブートローダが書き込みモードで立ち上がります。この状態で書き込みツール「MybootOS」を使うとUSBポート経由でプログラムを書き込める訳です。

この種の話題でいつも問題になるのがブートローダ自体はどうやって書き込むかという事です。 ブートローダでブートローダを書き込む事はできないので、通常はそのマイコン専用のライター(PICKit3など)を使用します。
しかし皆がライターを持っているわけではありません。 そこでArduinoを使ってPIC18F2550にブートローダを書き込む実験を過去に行い、問題なく書きこむ事ができました(下記を参照ください)。

今回はArduinoからPIC18F14K50にブートローダを書き込んでみます。これが可能になればOpenStickLiteを安価に使用できます。

まずここの資料でPIC18F14K50の書き込み仕様を調べます。 大体はPIC18F2550と同じですが微妙に違うところがあります。一番問題なのはPGD,PGC端子が耐圧3.3Vという記述です。 PIC18F2550の時はArduinoUNOを用いて5Vで駆動していました。特にPGDは双方向なのでレベル変換は面倒です。 よって今回は3.3V版ArduionoProMiniを用いることにします。
またスケッチには若干のWAITタイムの変更と書き込みイネーブルONのコードを追加しました。
スケッチ→PICWrite18F14K50.ino

書込み電圧は006Pの積層乾電池(9Vの四角いやつ)を用いる事にします。先の資料によると書込み電圧の上限は9Vという事なので、新品の電池だと定格を超える可能性がありダイオード一本で電圧を下げました(使い古した電池だとそのまま繋いで大丈夫です)。

回路

ArduinoProMiniはUSBシリアル変換回路を内蔵していないので、外部にFT232RLの変換回路を接続し、Arduino/PIC18F14K50に供給する3.3V電源もFT232RL内臓のレギュレータから取っています。
PIC18F14K50の電源-GND間のコンデンサは当初0.47μFを使いましたが、PIC18F14K50に電源を投入した瞬間にArduinoProMiniから反応が無くなる事がありました。恐らくFT232RLの3.3V出力が瞬間的にダウンする為と思われ0.22μF(実際には0.1μ×2本)に変更しました。 

PIC14K50WriteByArduinoProMiniSch

PIC18F14K50へArduinoProMiniで書き込む回路図。

参考までにUSBシリアル変換は次の回路です(最近の電子工作には何かと登場しますね。一家に一台FT232RLです)。
FT232RLは3.3Vのレギュレータを内蔵しており、これをVCCIO端子に入力する事で3.3Vレベルで使用できます。この回路ではスイッチを設けて5Vと3.3Vを切り替える様にしています。
但しレギュレータから取れるのは50mAまでなのであまり大きくはありません。

USBSerial

FT232RLによるUSBシリアルインターフェース

PIC18F14K50WriteByArduinoProMini

Arduino ProMiniで書き込み中。
横のFRISKケースはUSBシリアル変換です。

書込み手順

PIC18F2550の時に書いた内容とほぼ同じです。
※前回同様TeraTermの「貼り付けの行間遅延設定」を50mS程度にしておく必要があります(書込み時間待ちの為です)。

<PIC18F14K50にブートローダを書込む手順>

  1. まずPIC18F14K50の3.3V電源と9V電池は切り離しておく。
  2. Arduino IDEを立ち上げこのスケッチを書込む。
  3. TeraTermをシリアルモードにしてArduinoに接続する。
    シリアル設定:9600bps,8bit,パリティ無し,stop=1,フロー制御=none
    改行コードは送信・受信共にCRにする。
    また、「設定」→「その他設定」メニューの「コピーと貼り付け」タグを選び、「貼り付けの行間遅延」を50mS程度にしておく。
  4. 接続するとTeraTerm上に以下のメニューが表示される。
    r  <start address> <count>: read from PIC
    e : all erase
    w : write to PIC
    v : verify
  5. ここでPIC18F14K50に3.3V電源→9V電池の順で供給する。
  6. 必要に応じ’r’コマンドで現在書かれている内容を確認する。たとえば・・・
    r 0 0×100<CR>
    と入力すると、FLASHメモリの0番地から0FF番地の内容を表示する。
    消去済ならCODEエリア全ての内容がFFになっているはずである。
    (消去チェック機能はないので、どちらにしても次の消去コマンドを実行しておくべきです)
  7. 消去済みでない場合はeコマンドで消去する。
    ALL Erase <y/n>?と効いてくるのでyを入力する。
    このコマンドはチップ全体を消去する(一瞬で終わります)。
  8. ‘w’コマンドで書込む。w <cr>を入力すると’Send me intelhex text’と表示されるので、ここでIntelHEXファイルを送る。この際、上に書いた理由でコピペで貼り付ける方法で送る。 たとえばブートローダのHEXファイルである’Bootloader18F14K50.hex’をメモ帳等で開いて全域をコピーした後、Teratermの画面上に貼り付ける。
    (前に書いた様に「ファイル」→「ファイル転送」メニューからの送信だと取りこぼしが発生する)
  9. エラーなく書き込みが完了したら’v’コマンドでベリファイを行う。方法は’w’コマンドと同じで、v<cr>入力後IntelHEXテキストを貼付けるとFlashメモリを読出して比較する。  エラーが出なければ正常に書き込めた筈である。
  10. 9V電池→3.3V電源の順で切り離し、TeraTermの接続を切りArduinoのUSBケーブルを抜く。

やっぱりArduinoUNOでやってみる。

と、ここまでで書き込みが出来たのですが、やっぱり3.3V版Arduinoは少数派で手元にない場合もあると思われ、メジャーなArduino UNO等でも書けると何かと便利です。 この場合5Vで動作するArduinoと3.3Vで動作するPIC18F14K50の間をどう繋ぐかが問題です。ArduinoからPIC18F14K50へ一方的に入力するPGC信号は単に抵抗分割で問題ありません。一方PGD信号は双方向なのでまじめにレベル変換器を入れると結構面倒な事になります。しかし3.3VのHレベルはArduinoはHと認識してくれる筈と期待しPGDも単純抵抗分割で試してみました。

PIC14K50WriteByUNOsch

ArduinoUNOでPIC18F14K50に書き込んでみる回路図。

実験風景・・・

ArduinoUNOで書き込み

ArduinoUNOで書き込み。UNOは直接USBケーブルを繋げるのですっきりします。

特に問題なく書けました。これが手っ取り早いです。
気をよくしてFritzingでも回路を書いてみました。

PIC14K50WriteByUNO_ブレッドボード

Fritzingでも描いてみた。

 

各ファイル 

※PIC18F14K50用ブートローダは上記バイナリセットかソースのどちらにも収録しています。※言うまでもないとは思いますが、同様の実験をされて万一デバイスが壊れたりしても責任は持てませんので、そこんとこはよろしくお願いいたします。

 

FRISKのケース

電子工作界で話題のFRISKのケースサイズ変更、熊本ではまだ見かけないと昨日書きましたが、今日発見したので早速購入しました。

FRISKcase

FRISKケース新旧

長辺は同じですが短辺が約5mm、厚みが約0.4mm増えていました(ノギスでの実測)。
ちょっと前のMake:のブログでRaspberryPi ZEROがFRISKのケースにギリギリ納まらないという話題が載っていましたが、新規格では納まるんじゃないでしょうか。

でも旧規格の小型ケースは今後入手困難になるんでしょうね。

 

FRISKサイズのUSBジョイスティック

OpenStickLiteが使える様になったので、Laser加工機用に小型のジョイスティックを製作しました。

これまでLaser加工機のジョグ制御には、下の様なジョイスティックを使用していました。見覚えがある方もいらっしゃるかもしれませんが、MakerFaireではラジコンシミュレータのコントローラに使用しているものです。
今回、OpenStickLiteを使って場所を取らない小型のものを作ろうと思います。

LaserCutterController

これまでのLaser加工機のコントローラ。
ちょっと大きくて邪魔になる。

 

X-Y軸入力のスティックはジャンクのゲームコントローラーから外したものです。HardOFFで108円で買ってきたコントローラをバラしてストックしています。
これはX-Yのアナログ制御に加えスティック自体を押し込む事でボタンをON/OFFできます。今回入力デバイスはこれ一つだけで、
X-Y軸とボタン1個だけにしました。

JoysticksFromPS

PlayStation用コントローラから外したジョイスティック

 

簡単に回路を描いて・・・

LaserStickSchematic

Laser制御用ジョイスティック回路図

 

基板切削CNCで削って・・・ 

LaserStickPCB

LaserStick基板
(実は一部パターンをミスっており、この後手配線で修正しました)

 

FRISKのケースに入れました。
FRISKはケースサイズが変わるという話ですが熊本ではまだ従来サイズしか見かけません。今回使用したのも従来サイズです。

LaserStick2

フリスクケースに収納。

 

中身はこんな感じです。
PIC18F14K50はフリスクケースにピッタリ。
部品がとっても少ないです。

LaserStick3

水晶発振子周りのスペースが厳しくなってしまったので、水晶を少し浮かして取付け、更にショート防止のためカプトンテープで保護しました。

LaserStick4

斜めからみたところ

 

コンフィグはこれを書き込みました。

LaserStick Configuration

今回のOpenStickConfigLiteの設定。
入力信号はX-Y軸とボタン1個だけ。

 

またLaser加工機に取付ける為、3Dプリンタでホルダーを製作しました。

LaserStick with Holder

ホルダーと小型ジョイスティック

そして加工機に取り付け!!

LaserStick6

ホルダーと共に加工機に取付けた図。

PIC18F14K50採用で小型機器が作り易くなりました。
SOP版を使うともっと小型化できそうです。

 

動画にしてみました。 2016-10-25

 

OpenStick Lite ~その4~(β版アップ)

PIC18F14K50を使用したOpenStickのLite版、今のところ大きな問題はなさそうなので一旦リリースしようと思います。
本当はピン割り当てをドラッグ&ドロップで自由に変更可能にしようと思っていたのですが、GUIを作るのがなかなか面倒なので今後ボチボチやろうと思います。とりあえず現行版ではOpenStickConfigLiteから一旦テキストに書き出し、メモ帳などで変更後に再読み込みする事でピン割り当てを変更可能です。

ファイル類

今回アップしたのは次のファイルです。一番上のバイナリセットがあればまずは動作させる事ができます。例によってソースは汚いので改造したりする際の参考程度にお考え下さい。

その他、書き込みツール(MybootOS)や書込みに必要なドライバ(MCHP-USB)はスタンダード版から変わっておらずOpenStickのページからダウンロードできます。
 バイナリセットには次のファイルが含まれています。
  • Bootloader18F14K50.hex・・・・・・・・・・・・・・・・・PIC18F14K50用ブートローダ
  • OpenStickLite.hex・・・・・・・・・・・・・・・・・・・・・・・OpenStickLiteファーム
  • Bootloader18F14K50+OpenStickLite.hex・・・ブートローダ+ファーム
  • OpenStickConfigLite.exe・・・・・・・・・・・・・・・・・Lite版コンフィグツール
基本的な事はPIC18F2550/2553を用いたOpenStickスタンダード版と同じです。
以下、主な違いを書きます。

回路

マイコンをPIC18F14K50に変更したので当然ながら回路も変わっています。
前回の投稿に書いた通りLEDはなくしてしまいました。
MCLR端子もリセットではなくIOポートとして使います。これにより入力ピンとして使えるのは13本です。ブートモードに入るにはMCLR 端子をLに下げた状態で電源を投入します。
水晶は12MHzです(スタンダード版は20MHzだったので要注意)。
PIC18F14K50にもウィークプルアップ機能があり、これを使える端子をデジタルピンとして使用する場合は内臓プルアップをONにするので回路上のプルアップは省いています。
秋月電子のAE-PIC18F14K50がほぼ同じ回路なのでこちらを使っても簡単に作れそうです。

ピンの用途

各端子は表の機能に割り当てています。IN4~6,IN9~13はアナログ入力可能端子、その他はデジタル専用端子です。 Wpup欄はウィークプルアップ機能がある端子を示します。

ピン用途

各端子の用途

 

ブートローダ

PIC18F4550用を改造しました。「Bootloader18F14K50.hex」をPICライターで書込みます。
このときだけはPICライター(PICkit3等)が必要です(いずれArduinoによる書込みも試したいと思っています)。
ブートローダが書込めればその後のファームやコンフィグデータは直接USBで書き込む事ができます。また「Bootloader18F14K50+OpenStickLite.hex」はブートローダとファームを一本にまとめたファイルなので、これを使えばファームを書く手間が省けます。

ブートローダを書き込みモードにするにはMODEボタンを押しながら電源を投入します。
スタンダード版では書き込みモードになるとLEDが点滅していましたがLiteではLEDがありません。しかし書込みツールMybootOSの左上に「PIC detected in BOOT mode」と表示される事で書き込みモードに入ったと判ります。

メモリーマップ

コンフィグデータの位置を変更しました。
スタンダード版は0×4000が先頭でしたがPIC18F14K50はFLASHメモリが0x3FFFまでしか無いので0x3C00を先頭にしています。

OpenStickLiteメモリーマップ

コンフィグ先頭を0x3c00に変更した。

MybootOS

ファームやコンフィグの書換えにはスタンダード版と同じMybootOSを使用します。
ファームを書き込む時、「Code Offset」には0×0800番地を指定します(これはスタンダード版と同じです。)。
コンフィグデータを書きこむ場合は「Code Offset」は0×3000番地を指定します。コンフィグデータの先頭は0x3c00じゃないかと疑問に思われるかもしれませんが、実はこの「Code Offset」とは書込み前に行われる消去動作の先頭番地を示すものなのです。 実際の書込み番地はIntelHEX形式のファイルに含まれています。今回、コンフィグの先頭が0x3c00なのでその手前の0×3000からFLASH最終番地までを消去します。なおファームは0×3000未満に収まっているので壊す事もありません。
・・・という事はIntelHEXに含まれる書込み番地を見て必要なところだけ消去する機能があればいいんですよね(またいずれ)。

MybootOS_Lite

MybootOSで接続。

 

コンフィグツール

Lite版のコンフィグツールはスタンダード版と見分けをつきやすくするため色を黄色にしました。

OpenStickConfigLite

スタンダードと見分けがつく様に色を変えました。
いずれ一本化したいのですが。

入力端子の任意割り当てに対応するため内部構造を大きく変更しています。
任意割り当てを行うGUIはまだできていませんが「SAVE」ボタンで一旦設定を保存し、それをテキストエディタで変更して「LOAD」で読み込ませるとピン割り当てを変更できます。
設定ファイルには下記の端子割り当てを追加しており、’=’の右の数字が入力端子番号で、これを書き換えます。LOAD時のルールチェックは厳密にできていないので書き換える際は注意してください。

#Pin asign
PIN:ANALOG(X) =4
PIN:ANALOG(Y) =5
PIN:ANALOG(Slider) =6
PIN:HatSwitch(UP) =10
PIN:HatSwitch(RIGHT) =11
PIN:HatSwitch(DOWN) =12
PIN:HatSwitch(LEFT) =13
PIN:BUTTON(1) =1
PIN:BUTTON(2) =2
PIN:BUTTON(3) =3
PIN:BUTTON(4) =7
PIN:BUTTON(5) =8
PIN:BUTTON(6) =9

 

また自動ピン配置も残すため「AutoAsgn」ボタンを追加しました。
(「ShowPin」ボタンと機能の差があまりなくなっており、いずれこのあたりは整理したいと思います)

 

OpenStick Lite ~その3~

先日から取り組んでいるPIC18F14K50を使ったOpenStick Liteですが、最低限の動作をする様になってきました。

前回の投稿で書いたブートローダの「部分書込み問題」は、 非HID版(MCHPUSB版)ブートローダをPIC14K50用にビルドしてみたら案外あっさりと動作しました。 よってこちらを用いる事でまずは解決です。

ブートローダを書き込みモードに投入する方法はPIC18F2550版とは少し変えています。
PIC18F2550版ではRC2をLに落としながらリセットまたは電源投入をしていましたが、PIC18F14K50ではピン数を節約するためコンフィグビットの設定でMCLR端子を入力ポートに割り当ててしまいました。ブートモードに入れるにはMCLR/RA3端子をLに落としながら電源を投入します。
またブートモードを表すLEDもなくした事で入力ピンは13本確保できました。LEDがないのは少しわかりずらいのですがMyBootOS上に接続した旨の表示がでるのでいいかなと思っています。
もしLEDは必須じゃ!と思われる方がおられたら、このブログに(なるべく早めに)書き込んでくださいな。

 

入力ピン全13本を使ったジョイスティックを生成してみました。
このあたりがLite版での最大規模ですが、今まで私が作成した中ではフライトヨーク以外は事足ります。

Joystick mini by OpenStickLite

全13ピン使用のジョイスティック

 

書き込みツールはMybootOSをそのまま使用しています。微妙なところがPIC18F2550用のままですが書き込み自体は問題ありません。

MybootOS_Lite

MybootOSで接続。

 

コントローラとしての機能を設定するOpenStickConfigについてはLite版を作成中です。まだピン設定の表示が未対応ですがデータは生成できています。 今は原版とLite版は別ツールになっており、できれば一つに統一したいところです。
またPIC18F2550には、アナログピンより小さい番号の入力ピンをデジタルピンに割り当てられないといった制約があり、このあたりが面倒でピン割り当ては固定的に生成していました。
しかしPIC18F14K50にこの制限はないのでピン割り当てを自由に設定できるツールにしたいなと考えています。

OpinStickConfigLite

ピンアサイン表示がPIC18F2550版のまま・・・

 

・・・こんな感じで取りあえず動き始めたのですが、もう少し細かいところを修正/確認してから公開したいと思います。

OpenStick Lite ~その2~

OpenStickのLite版としてPIC18F14K50への対応作業を続けております。
まずはPIC18F2550版で何をやっていたかを思い出すところから始める必要があります。何年か経っているのでほとんど忘れているのです。
PIC18FマイコンはROM(FLASH)とRAMが別のアドレス空間になっているあたりが面倒だったはず・・・確かにこのあたりで苦労の跡が見られます。何種類かあるUSBのディスクリプターをROM上に置くものとRAM上に置くものとでそれぞれの対応が必要でした。・・・少しずつ思い出してきました。まあ大体で良しとしましょう。(おいおい!)

とりあえずファーム載せ換え開始
ブートローダはとりあえず手に入るHID版で進めています。このマイコンのFLASH容量16KBの内、HID版ブートローダは4Kバイトを喰いますが今のところOpenStickファームも含めて納まっています。
またFLASHが16KBという事は最大番地が0x3FFFです。という事はPIC18F2550版の様にコンフィグデータを0×4000以降に置くことができないので先頭を0x3C00に移動しました
むしろ問題はRAM容量で、元々768バイトしか無いところにUSBのバッファが256バイトを使うので残りは512バイトです。 色々と節約して何とか納まっていますが余裕が全くありません。

こんな感じですがまずはファームウェアが動作するところまでは漕ぎつけました。

しかしここで問題発生。
HID版ブートローダはFLASHの部分書き込みに対応しておらず、書込む前に一旦全アドレスが消去されてしまう様です。
OpenStickは下図の様にジョイスティックの定義部分だけ後から書込む事によって機能を自由に定義できるのがウリな訳ですが、これにはFLASHの部分書込みが必須です。

OpenStickMemorymap

FLASHメモリーマップ(PIC18F2550版)

PIC18F2550版で使っていた非HID版ブートローダ(MCHPUSB版と呼ぶのかも)の場合、書込みツールを対応させれば部分書込みが出来ていましたがHID版はファーム自体が対応しておらず消去の時は気前よく全消ししてしまい元のプログラムが残っていません。 対策にはファームと書込みツールの両方を変更する必要がありそうです。
非HID版なら書き込みツール側から消去ブロックを指定して消す仕組みになっているので問題ありませんが前回書いた様にPIC18F14K50版がありません。

これはどうしましょう。ブートローダを何とかする必要があるのですが、HID版と非HID版、どちらから攻めるべきでしょうか?

何でも実際にやり始めると最初に思っていた程簡単にはいきませんねぇ。

OpenStick Lite

MakerFaire Tokyo 2016も終わり、一段落したところで次に作りたいものが色々とあります。
書きだしてみると何年かかるかわからない程ありました。
とりあえずその中でいちばん気になっているのはOpenStickのPIC18F14K50対応です。

OpenStickは元々PIC18F2550を対象にしていました。 このマイコン、当時は秋月電子で¥350ほどでしたが現時点は¥500に値上がりしています。しかし代わりにPIC18F2553というのが出ており、これは現在¥420です。そこでOpenStickは昨年PIC18F2553に対応しました。
PIC18F2550と2553は殆ど同じですがA/Dコンバータの分解能が10bit→12bitになっています(なぜ高機能の方が安いのでしょう?)。

もう少し低価格のUSBマイコンとしてPIC18F14K50があり、こちらは¥220でかなり安めです。ピン数は20pinなので、入力デバイスを作った場合チャンネル数は少なくなりますが、それでも12CH程度は使えそうで多くの場合これで十分でしょう。 SOP版を使うとかなり小型のコントローラができそうです。

とりあえずPIC18F14K50を動かしてみました。

OpenStickLite1

まずはLチカ。

OpenStickLite2

次にMicrochipのデモからジョイスティックを書込んでみた。

OpenStickLite3

ちゃんとジョイスティックとして動作している様です。

ここまでは順調です(既にあるものを使っているので当たり前ですが)。・
この後OpenStickとしてはブートローダで動作させコンフィグで機能を設定する様にしなければなりません。

ブートローダについてはちょっと迷っています。
マイクロチップ・テクノロジー社がPICマイコン用に出しているUSBのブートローダには2種類あります。
・HIDブートローダ
・HIDではないブートローダ(正しくは何と呼ぶのでしょう?)

HIDbootloaderはプログラム書込み時、HIDデバイスとして動作するのでPC側にドライバを必要としません。しかしbootloaderのサイズが少し大きくなります(4KB)。
非HIDのブートローダはPC側にドライバが必要ですがにbootloaderのサイズが小さくて済みます(2KB)。
今までOpenStickではHIDではない方を使っていました。ところがPIC14K50用はHIDタイプしか見つからないのです。 このサイトには移植した旨の記載がありますが現在リンク切れでダウンロードできません。
HID版に変更した場合、bootloaderのサイズが大きくなる事は恐らく問題ありませんが書き込みツールも変更が必要と思われちょっと面倒です。
ここらはもう少し調べて決定したいと思います。