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」と表示される事で書き込みモードに入ったと判ります。

メモリーマップ

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

OpenStickLiteメモリーマップ

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

MybootOS

ファームやコンフィグの書換えにはスタンダード版と同じMybootOSを使用します。
ファームを書き込む時、「Code Offset」には0x0800番地を指定します(これはスタンダード版と同じです。)。
コンフィグデータを書きこむ場合は「Code Offset」は0x3000番地を指定します。コンフィグデータの先頭は0x3c00じゃないかと疑問に思われるかもしれませんが、実はこの「Code Offset」とは書込み前に行われる消去動作の先頭番地を示すものなのです。 実際の書込み番地はIntelHEX形式のファイルに含まれています。今回、コンフィグの先頭が0x3c00なのでその手前の0x3000からFLASH最終番地までを消去します。なおファームは0x3000未満に収まっているので壊す事もありません。
・・・という事は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版の様にコンフィグデータを0x4000以降に置くことができないので先頭を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のサイズが大きくなる事は恐らく問題ありませんが書き込みツールも変更が必要と思われちょっと面倒です。
ここらはもう少し調べて決定したいと思います。

64bitWindowsでOpenStickへの書込みができなかった件

MakerFaire用に新たなデバイスを作っていたらOpenStickへの書き込みが出来なくなっている事に気づきました。 まずいです。 このままではMakerFaireで胸を張って照会できません。
先日Windows7(32bit)からWindow10(64bit)に変更した事が絡んでいる様です。

OpenStickへの書き込みはMybootOSというツールで行うのですが、これが下の様なエラーになって立ち上がりません。

MybootOS_Error

間違ったフォーマットのプログラムを読み込もうとしました。(HRESULT からの例外 0x8007000B) ・・・というエラーが出る。

MybootOSはC#で書いてありVisualStudio2010でビルドしています。
ググってみると、どうやらビルドする時のCPUの指定がAnyCPUになっていたのが原因だった様です。 AnyCPUってのは実行するOSが32bitでも64bitでも、それぞれに合わせたモードで動いてくれるものだそうです。ところがプログラム内からDLLを読んでいると、DLLが32bitか64bitかというところまでは面倒を見てくれないため、今回の場合アプリケーションは64biitで動作しているのにDLLが32bitだったのでエラーになっていました(Mybootではmpusbapi.dllを使っています)。
そこでVisualStudioでX86としてビルドし直すと32bitのアプリが生成され、これだと最初から32bitとして実行するので無事動作する様になりました。

という事で64bitのOS上で動かす時は32bit版のアプリを実行しなければならないという解り難い状況になっています。
いずれにせよ動作する様になったのでバイナリだけアップしておきます(ソースは変更していないので)。 

で、そもそも何を作っていたのかというと、これです。。。

ヨットシミュレータコントローラMINI

ヨットシミュレータコントローラMINI

今回MakerFaireには実物大コントローラは持って行かないので雰囲気だけでもヨットっぽいコントローラをつくってみました。

MakerFaire TOKYO2016準備

MakerFaireが近づいてきました。
ほいほい堂本舗のブースはG-03-05ですので会場に来られた際は是非お立ち寄りください。

今年は新たな展示物はないのですが、それでもフライトヨークが壊れていないかとか、確認しとかにゃなりません。

今回、OpenStick基板キットの販売を目論んでいるので、これも準備が必要です。

OpenStickRev2 board

基板も届きました。

そしてこんな感じでOpenStickのファームをせっせと書き込んでいきます。
一応、お金を頂いて販売するので静電破壊にも気を使っています。
(普段の工作ではいい加減ですが・・・)

OpenStickKit farm

ファームの書き込み。

抵抗とかも間違えない様に慎重にやります。

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

前々からOpenStickでフォースフィードバックができないかと考えており調べています。
フォースフィードバックが出来るとフライトヨークにグイグイ力を加えたり、ヨットシミュレータで風の強さを手元に感じたりと夢が広がります。

が・・・
単純に入力だけのジョイスティックと比べて格段に難しいです。情報も少ないし、
このあたりを読んでも解らない事だらけです(しかも英語なんです)。

まず、普通のHIDデバイスはUSBのクラスIDは3番ですが、フォースフィードバック(PIDデバイス)の場合はどうなのでしょう?5番という記述も見るのですが、HIDと違う番号でPC側は問題ないのでしょうか?・・・といったところからして解りません。

そもそもウチにあるフォースフィードバックデバイスといえば「SideWinder Force Feedbak Pro」という古いジョイスティックがあるのですが、これはゲームポート&MIDIポートに接続する仕様の為、参考になりません(どこに仕舞ったかわからず写真も取れません)。

そこで何かフォースフィードバックのUSBデバイスが欲しいと思い、これを買ってきました。

BUFFALO BSGP1204

BUFFALO BSGP1204 ¥1980-

とりあえずPC(Windows7)に挿してみます。しかし暫く待っても認識されませんでした。ジョイスティックはドライバなぞ要らないもんだと思っていましたが、これは駄目なようです。そこで付属のCDからドライバを入れました(ドライバを入れた後も認識に暫くかかっていたので、もしかするとそのまま待っていれば認識したのかもしれません)。
OpenStickでフォースフィードバックデバイスを実現できたとして、PC側に何らかのドライバを書く必要があるのでしょうか?

コントロールパネルの「デバイスとプリンター」からデバイスの設定画面を出してみると下の様な派手なのが出ました。

BSGP1204Setting

セッティング画面

「バイブレーション」タブを押すと次の様な画面に変わります。

BSGP1204Setting2

バイブレーション設定画面

ここで「左側が振動」とか「右側が振動」とかをクリックするとゲームパッドがぶるぶると震えるので動作はしている様です。

次にこのデバイスのディスクリプタ類を見てみます。以前やったのと同様にLinuxマシンに挿して・・・

まずlsusbコマンドでベンダID,プロダクトIDを見ます。

$ lsusb
     : 
     : 
Bus 001 Device 005: ID 1dd8:000f

IDは「1dd8:000f」の様です。次に-v,-dオプションをつけてディスクリプタを見ます。
-vは詳細情報出力の意味、-dは指定デバイスのみ表示するオプションです。

$ lsusb -v -d 1dd8:000f

Bus 001 Device 005: ID 1dd8:000f
Device Descriptor:
  bLength                18
  bDescriptorType         1
  bcdUSB               1.10
  bDeviceClass            0 (Defined at Interface level)
  bDeviceSubClass         0
  bDeviceProtocol         0
  bMaxPacketSize0         8
  idVendor           0x1dd8
  idProduct          0x000f
  bcdDevice            1.00
  iManufacturer           0
  iProduct                2
  iSerial                 0
  bNumConfigurations      1
  Configuration Descriptor:
    bLength                 9
    bDescriptorType         2
    wTotalLength           34
    bNumInterfaces          1
    bConfigurationValue     1
    iConfiguration          0
    bmAttributes         0x80
      (Bus Powered)
    MaxPower              300mA
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        0
      bAlternateSetting       0
      bNumEndpoints           1
      bInterfaceClass         3 Human Interface Device
      bInterfaceSubClass      0 No Subclass
      bInterfaceProtocol      0 None
      iInterface              0
        HID Device Descriptor:
          bLength                 9
          bDescriptorType        33
          bcdHID               1.10
          bCountryCode            0 Not supported
          bNumDescriptors         1
          bDescriptorType        34 Report
          wDescriptorLength      94
         Report Descriptors:
           ** UNAVAILABLE **
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x81  EP 1 IN
        bmAttributes            3
          Transfer Type            Interrupt
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0008  1x 8 bytes
        bInterval              10
cannot read device status, Operation not permitted (1)

見たかったのはInterface Descriptor:内のbInterfaceClassです。
これは上に書いたクラスIDを示すものですが5番ではなく、やはり3番になっている様です。
また、良くわからないのはEndpointが入力用の1つだけである事です。想像では出力用にもう一つEndpointがあるものと思っていました。

余計にわからなくなってきました。
一旦これは置いときます。

いづれにせよPCからフォースフィードバック機器がどの様に見えるのかを知っておく必要があると思い、まずは振動を送るプログラムを書いてみようしてこちらもハマっています。

道は遠そうなのでぼちぼちやります。
どなたか詳しい方にアドバイスを頂けるとうれしいのですが・・。

 

山口ミニメイカーフェア終了

終わってしまいました、山口ミニメイカーフェア

YMMF2015

YMMF2015
ほいほい堂ブースの風景

今回、OpenStickとRaspberryPiモータードライバをキット化して販売しました。結果は二日間でOpenStickは6セット買って頂けましたが、モータードライバは残念ながら一つも売れませんでした。コマーシャルメイカーの出展費用が¥10800なので全く元が取れていません。予測ではマニアックなOpenStickよりもモータードライバの方が買ってもらえるかなと思っていたけど逆でした。

ほいほい堂本舗のブースは毎回、子供のたまり場と化すのですが今回も同様でした。特にフライトシミュレータは奪い合いで、これまたいつも通りフライトヨークの根元が壊れては修理を繰り返しています。今回は少し丈夫にしてきたつもりでしたが、やはり何度か修理が必要でした。

ところで初日にヨットシミュレータに妙に大喜びの子供(幼稚園児ぐらい?)がいて、それを中国新聞の記者さんが写真に撮って行かれ、翌10月20日の朝刊に掲載されました。そのお陰か二日目は結構ヨットシミュレータが人気になりました。
中国新聞の記事ネット版(「技術の結晶」は言い過ぎかと・・・)

今日は熊本に戻ってきてヨークを修理中・・・。

Yoke

ここをもう少し強化する必要がある。

YMMF2015キット販売

来週の山口ミニメイカーフェアで販売を予定しているキットの取説ページを作ってみました。

OpenStick基板キット

OpenStickPCB

OpenStickの基板キット

RaspberryPi用モータードライバキット

RaspiMDKit

RaspberryPi用モータードライバキット

どちらも価格は未定です。
その他、小物の販売も検討しています。