コメを噛め

コメを噛め

rerofumi の電子工作メモ

Archive for the ‘fuwafuwaBlog’ Category


hatena bookmark

USBジョイスティックデバイスが作れるようになったら、是非ともやってみたい事があった。それが、加速度センサーを用いた傾きで操るジョイスティックだ。
てなわけで作ってみた。
実は GW 中には完成していたのだけれども、その後 E3 で Wii や PS3 のコントローラーが脚光を浴びたために今ひとつ新鮮みが無くなってしまった。まあ、新型ゲーム機の売りとなっている傾き制御コントローラーが一足お先に自作で楽しめると、前向きに捉えておこう。

なんで傾きジョイスティックなのかというと、1つアイディアがあったからだ。


これがジョイスティック。
戦闘機のプラモデルにセンサーを取り付けてある。そしてプレイ中はこの飛行機を手に持ち前後左右に傾けながら遊ぶのだ。そう、みんなが一度はやったことのある「きーーーーん、ずばばばばば」というごっこ遊びをインターフェースに取り入れたわけだ。
本当は「ずばばばば」と言うと弾が出るとカッコイイのだが、流石にそんな音声認識まではできないので、普通に基板上のタクトスイッチで発射する。本体にスイッチを付けようと思っていたのだが、タクトスイッチを押し込む際の衝撃を加速度センサーが拾いまくって不都合なので取りやめた。

F/A-18 なのは単に入手性の問題。塗装もデカール張りもせずに素組なのは、まあプラモ作りが本筋ではないということで。(凝るとキリがなさそうだ)


削って端子を取り付け、パテで埋める。
フィギュア作りよりも、プラモ向きだなあと感じたので二度と使うこともないだろうと思っていたアルテコパテがこんなところで大活躍。


裏は穴をあけてケーブルを通してある。

加速度センサーは PIC18F4550 の A/Dコンバータで読み込み、-128〜127 のジョイスティック値としている。傾き具合とプレイ感覚を合わせるために、40度くらい傾けたら方向値 MAX となるようにしているのがミソといえばミソ。


プレイ中の様子。
プレイしているゲームは D.N.A. Software さんの同人ゲーム MASTER BURNER の完全版。

写真だと面白みがないというか、自由自在感がまったく伝わらないのでフラッシュムービーを用意してみました。
普通に遊べている様をごらん頂けます。

なんといっても USB HID デバイスなので、USBジョイスティックであそべる PC ゲームは全部遊べます。アナログ無効でデジタル入力のゲームも、まあ遊べます。
流石に弾幕シューティングをプレイすると「なにその新手の苦行は?」といった風情ですけれども、東方永夜抄の Easy で慧音(3面ボス)くらいまではいけるようにはなります。慣れると。

usbjoystick_16.zip
PIC のプログラムソースコード (for BoostC)


hatena bookmark

アマチュア電子工作で最も重要な事はなにか?
それは部品を揃えることだと思います。
どんなに技術や経験があったとしても、部品を揃えることができないとなにも作れませんから。しかも、この部品が近所のホームセンターで揃うわけでも無し。
おそらくは近所にパーツ屋があったか否かで少年期にラジオ工作を行っていたかどうか、重大な分岐点になっていたのではないでしょうか。
今はインターネット全盛期で、何でもかんでも(ピザ宅配も)ネットで注文して買える事ができるようになりました。
電子工作パーツも、といいたいところですがやっぱりアマチュア向けのお店は多くなかったりします。
そんななかから、私がひいきにしているお店をご紹介。気軽にパーツを揃えて、楽しく工作できますように。

■ 秋月電子通商
何はともあれの秋月電子。
通信販売はゆうぱっくの代引きのみだけれども、それゆえか届くのも早いのでタイミングを見計らえばスムーズに入手できる。
ちょいと癖のあるパーツ群だけれども、それ故に眺めているのが楽しい。ついでにと 100円コーナーをついつい買い足してしまうあたり。

■ 共立エレショップ
普通のパーツが一通り揃えられるので便利しているところ。クレジットカード払いができるので良く利用する。
品揃えのバランスは良いが、意外に深いところまでカバーしていたりする。

■ マルツパーツ館
萌え一色の秋葉原に最近果敢に出店してきたマルツ。本社は福井らしい。
通常パーツが一通り並んでいる感じ。どっちかというと電子工作初心者にお勧めてきなラインナップ。
最近はマイコン系に力を入れようとしているので、ここがお勧めする入門ボードあたりから入るのが良い?

■ ストロベリー・リナックス
なかなかに興味深いデバイスを小売りしてくれる嬉しいところ。
USBシリアル変換ボードは TTL レベルシリアル出力でレベルコンバータなしのマイコン接続が可能なので、利用価値高し。複数買っておけって感じ。
他は、ぶらぶら眺めて「あー、これがあったらアレが作れるかなー」とミートしたら心強い。

■ W-FIELD.com
PSoCデバイスを小売りしてくれている数少ないお店。
8ピンでありつつ中身は 27443 と同等な CY8C27143 は面白いぞー。ここぐらいでしか買えないっぽい?
他にもおもしろかっこいい LCD 表示デバイス系のラインナップが蝶オススメ。LCD表示ユニットはマイコン工作の基本なので、ここで差をつけるのだ。
緑ネガの奴を買ってみた。

選外として、Microchip のオンライン販売。
海外なので送料+関税が結構かかるけれども、個人向けオッケーだし、チップも通販してくれるので好印象。
Cypress は開発キットや評価ボードは売ってくれるけれども、チップは扱っていないのです。

秋葉原の店舗で買うときはもっぱら千石中心なのだけれども、通販の時はあんまり利用しない。カード不可な割りに、特殊なメリットがないからかもしれない。
—–


hatena bookmark

先日のボタンだけジョイスティックを発展させてちゃんとした 2軸+ボタン 8個なジョイスティックとして動作するディスクリプタを作成。
こないだのボタンテストよりちゃんとしたリポート構造になっているはず。

char ReportDescriptor[52] = {
0x05, 0x01, // USAGE_PAGE (Generic Desktop)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x09, 0x04, // USAGE (Joystick)
0xa1, 0x01, // COLLECTION (Application)
0x75, 0x08, // REPORT_SIZE (8)
0x15, 0x80, // LOGICAL_MINIMUM (-128)
0x25, 0x7f, // LOGICAL_MAXIMUM (127)
0x35, 0x80, // PHYSICAL_MINIMUM (-128)
0x45, 0x7f, // PHYSICAL_MAXIMUM (127)
0x05, 0x01, // USAGE_PAGE (Generic Desktop)
0x09, 0x01, // USAGE (Pointer)
0xa1, 0x00, // COLLECTION (Physical)
0x95, 0x02, // REPORT_COUNT (2)
0x05, 0x01, // USAGE_PAGE (Generic Desktop)
0x09, 0x30, // USAGE (X)
0x09, 0x31, // USAGE (Y)
0x81, 0x02, // INPUT (Data,Var,Abs)
0xc0, // END_COLLECTION
0x75, 0x01, // REPORT_SIZE (1)
0x95, 0x08, // REPORT_COUNT (8)
0x05, 0x09, // USAGE_PAGE (Button)
0x19, 0x01, // USAGE_MINIMUM (Button 1)
0x29, 0x08, // USAGE_MAXIMUM (Button 8)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x25, 0x01, // LOGICAL_MAXIMUM (1)
0x81, 0x02, // INPUT (Data,Var,Abs)
0xc0 // END_COLLECTION
};

ジョイスティックのひな形ソース。(for Boost-C compiler)
pic_usb_joystick.zip
main.c の中の buffer[0]〜buffer[2] の中に値を入れるとジョイスティックの出力となる。

どんな値をインターフェースから読み込んで、加工して、buffer[0]〜buffer[2] に納めるかというのは PIC マイコンの得意技であり、ここを自由に創造するのがお楽しみなのですよん。
—–


hatena bookmark

Mouse が八の字を描くサンプルコードは PIC USB 界(?)ではメジャーなので、あちこちで見受けられる。HID の入門としては手頃だけれども、ここから HID Joystick へと改造するにはどうしたら良いのだろうか?
調べてみたけれども、そのものズバリな解を WEB 上で発見することはできなかった。

USB デバイスは接続時の enumulation で自分はどういった機器でどういった事ができますよというのをホストに宣言する。この宣言の内容をデスクリプタと呼ぶ。
つまりコレまでは「HIDのマウスですよ」と宣言していたものを「HIDのジョイスティックですよ」と宣言するように描き直せば、まずはジョイスティックとして認識してくれるに違いない。
結局色々探して usb.org の HID document まで眺めるはめになってしまった。
結果 HID であればクラスディスクリプタとかは同じで、マウスかキーボードかジョイスティックか(もしくはその他か複合か)は “Report descriptor” が違うだけということがわかった。Report descriptor というのは、その機器がどのような入出力を持っているかをホストへと伝えるリポート。マウスだったら「座標が 2つ X と Y にボタンが 5つですよ」と伝えるし、ジョイスティックだったら「座標が 3つ X と Y と Z にボタンが 8つですよ」とかになる。

Report descriptor の書式は複雑なので、これを記述する補助ツールが “HID Descriptor Tool” として usb.org から提供されているけれどもコレがまたわかりづらい。
色んなリポートサンプルを読みながら理解していくしか無い。

取り敢えず最初はスティック無しでボタンが 8個あるだけのジョイスティック(それをジョイスティックと呼ぶのか?)を作成してみた。

char ReportDescriptor[25] = {
0x05, 0x01, // USAGE_PAGE (Generic Desktop)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x09, 0x04, // USAGE (Joystick)
0xa1, 0x01, // COLLECTION (Application)
0x05, 0x09, // USAGE_PAGE (Button)
0x19, 0x01, // USAGE_MINIMUM (Button 1)
0x29, 0x08, // USAGE_MAXIMUM (Button 8)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x25, 0x01, // LOGICAL_MAXIMUM (1)
0x75, 0x01, // REPORT_SIZE (1)
0x95, 0x08, // REPORT_COUNT (8)
0x81, 0x02, // INPUT (Data,Var,Abs)
0xc0 // END_COLLECTION
};

ジョイスティックで、ボタンが Button1〜8 の 8個あります、ボタンが取りうる値は 0〜1 の二値で、ボタン 1つあたり 1ビット、それを 8個分通知します、という宣言。
合計で 8bit = 1Byte のデータがホスト宛に送信される事になり、この 1Byte は EndPoint1(最大8Byteくらい) の先頭 1Byte に書き込んでおいて送信(正確にはホストが読み取り)される事となる。

先の HID Mouse サンプルの Report descriptor を上記の物に差し替えると無事ボタン 8個のジョイスティックとして認識された。
ただ、ベンダーIDとデバイスIDが同じままだと、前の(Mouseの時の)デバイス情報が残っているため上手くいかない。デバイス情報を削除するか、デバイスIDを変更する必要がある。

これまでなんとなく避けてきたがディスクリプタの中にはベンダーIDというものがあって「誰が作った物か」という情報を示さないとならない。
このIDは USB.org から貰うのだけれども、個人では取得できないしできたとしても年数十万円の費用がかかる。
なので個人工作の範囲ではここは適当に設定して、できたデバイスは個人の責任において個人利用の範囲でとどめる必要がある。注意。


Windows のコンソールパネルからジョイスティックとして確認できている所。

8button_joystick.zip
8ボタンジョイスティックのテストコード。
起動してジョイスティックと認識された後はボタン1〜4 をぱたぱたと叩く。先のコンソールパネルではその様が確認できる。
—–


hatena bookmark

そもそもで PIC 工作を始めたのは、センサー計測の結果を PC に取り込むために PIC をコントロール&通信インターフェースにしようというのが発端であった。PC へ取り込む手段としてはシリアルがお手軽かつ着実なのだけれども、今時ならばやっぱり USB で繋ぎたいじゃんということで USB 搭載 PIC には熱い眼差しを向けていたのですよ。
結局当初の目的としてはシリアルで満足しちゃっているのだけれども、いつかは「俺 USB機器」が作りたいという願いが捨てきれない次第。
そのために PIC18F4550 が手元にあるわけだし。

てなわけで USB 作成プロジェクト始動。
USB デバイスや USB搭載PIC についての詳しい情報としては「PICと言えば後閑さん」の「PICで楽しむ USB機器自作のすすめ」という本が出ている。
取り敢えずそちらをどうぞと勧めておいて、ここではそれらに因らず適当な知識で行き当たりばったりに進行させていきまする。(おい)

■ USBで何を作るか
何を作るのかは意外と重要です。デバイスが PIC なのでプログラム次第でどんな USB デバイスも作れるという夢の環境なのですが、デバイスを作ったら当然ホスト(PC)側でもデバイスドライバーを作成しなければならない。
なのでデバイスドライバーが既に存在していてそれを利用できる “HID” (Human Interface Device)がお勧め。キーボードとかマウスとかジョイスティックですな。それ以外の HID だと自分でオープン・リンクを行うプログラムを作成する必要があるが、まあデバイスドライバを作らないだけ楽なもんである。

■ USB搭載PICの開発環境
USB をコントロールするスタックを一から自分で書くのは大変過ぎるので Microchip 社がサンプルとして提供しているコードが存在している。最近はマスストレージのサンプルも追加された模様。
これをベースにしていくので、深淵なる USB の知識がなくてもまあなんとかなるかなという次第。流石に開発者として最低限の知識は必要だけれども、私個人が既に知っていることはここに書いていかないので注意。
でまあ、このサンプルが当然というか C言語で書かれており、MPLAB C18 COMPILER が利用されている。
C18 compiler は $495.00 もするのでちと困るところ。物の本には「お試し版が1〜2ヶ月使えるからそれでコンパイルすればオッケー」的な事が書かれているけれども、それもどうかと。
今私が所有しているのはSourceBoostの安価な CコンパイラBoost C なんだよな。個人使用限定の Full バージョンで $69.95 ほど。
USB のサンプルコードが Boost C でコンパイルできるかといえば、これが見事に出来なかった orz
エラーを眺めていると決定的に色々違っているので細かい手直しとかでは済みそうもない感じで。
でも、そこはそれ、Microchip の HID Mouse デモを Boost C に移植(というか作り直しに近いけど)している御仁がいて、SourceBoost のページからダウンロードできる
この Boost C 版サンプルは流石にあっさりとコンパイル完了。

できあがった HEX ファイルを PIC にプログラムしようといつも通り SPWriter を立ち上げて書き込み作業。……失敗。あれ?
色々試すけれどもコンフィギュエリアでエラーとか言われて止まってしまう。デバイスリストをいじったり確認するも今ひとつ駄目。SPWriter では(今すぐ) PIC18F4550 に書き込みできないのかしらん。
そんな理由と他の理由が積み重なって、ついに買ってしまいました。


丸くてニクイあいつ。MPLAB ICD2。満を持しての投入。
ちなみに Microchip 直販経由で購入。


チップに USBコネクタと ICSP 用の最低限配線だけを行ったテスト基板を作成。こいつを使ってプログラミングする。
ICD2 は MPLAB からしかプログラミング&デバッグできないので、SourceBoost IDE から使えない様子。うーむ、せっかくお気に入りだったのだけれども、しかたないので MPLAB に戻ってくる。
MPLAB から Boost C を利用することは可能。SourceBoost IDE をインストールするとき、先に MPLAB がインストールされていたら「コンパイラを MPLAB に登録しますかえ?」と聞いてくるのでそこで「くるしゅうない」と承諾しておけば、以後コンパイラスイーツから Boost C が選択できるようになる。

そんなこんなを経てようやく、Boost C 版 HID Mouse デモがチップに焼き込まれた。
テストボードに USB ケーブルを繋いで PC に接続。デバイスが認識されて……、おおマウスカーソルがくるくると八の字を描き始めた。(そういう動作をするデモなのです)
自作 USB 機器の第一歩完了なのです。

■ まずは下ごしらえ
さて、これからサンプルコードに手を入れて改造したり実験したりするわけだけれども、ここでちょっとソースコードの整理をしておきたいところ。
というのも usbtestCC.c というサンプルコードは、1つのファイルに全てが詰め込まれている上に、私の目から見て少々汚いソースコードになっているのだ。私自身が理解し、手を入れやすくするためにもちょっと細かい単位でファイル分割を行いたい。
関数の役割毎に分割し、一部冗長で見づらいところを整理したソースコード。
usbtestCC_restruct.zip
この作業を行うことで、コードの理解も深まるので一石二鳥。

いつもなら自身のコードで描き起こし直すところだけれども、それをしないあたりが USB デバイスコードのめんどくささを物語っていたりいなかったり。
単に手を抜きたいだけかもしらんが。
—–


hatena bookmark

「ドリルで穴開けるん」
プリント基板自作で、みんなが根をあげるのが穴開け作業。
リューター(2.34mm軸)に 0.8mm のドリル歯をつけていざ。

穴を開けたいところには、キリかなんかをぐっと押しつけあらかじめへこみを付けておくとドリル歯がずれなくて確実に開けられる(センターポンチ)。
けど、鉛筆持ちのリューターを低速回転で使っているからかいきなりで穴を開けてもそんなにずれなかった。思っていたよりも楽かつ綺麗に終了。(そりゃまずれることはあるけれどもさ)
ただ、手持ちでざくざく開けているので穴が垂直じゃないんだよね。ちと気を抜くと斜めの穴になってしまう。
でもま、特に問題となるほどでないので良しとする。

後は切断が残っているけれども、ひとまず自作プリント基板プロジェクトはこれにて完結。
上手くいって良かった。昔は出来なかったことが今なら出来るというのは嬉しいもんだね。
—–


hatena bookmark

「後加工の巻」
エッチングが終わった基板はまだパターンの上に感光レジストがついたままである。これを落とす。
再度全露光して、現像液で落とすという手もあるけれども、今回は近所のスーパーで買った台所スポンジとクリームクレンザーでこすり落としてみる。
大きな基板だとちと大変なのと、銅の表面が細かい傷が付くので仕上げの際は磨く方向を考えないといけないといったあたりがデメリットか。
まあ、別に事もなく。

銅表面が酸化しないようにフラックスを塗布。
綿にフラックスをしみこませて薄くのばすように塗りつける。


一通りできあがり。
ぴかぴか。
—–


hatena bookmark

「エッチング廃液処理」
廃液処理までがプリント基板作成ですよ!

サンハヤトの基板作成スターターキットには廃液処理のためのプラスチックバッグが付いてくるけれども、この先作り続ける時のことを考えてスーパーで買ってきたジップロックで廃液処理。
水で冷やしながら、A剤を入れてもみもみ、B剤を入れてもみもみ。おしまい。


モノが銅なんで緑色になるところが気色悪し。

反応熱が下がり、冷たくなってきたところでセメント投入。
一応完了ということで、袋は放置。(セメントが落ち着くのに半日くらいかかる)
—–


hatena bookmark

「本番行ってみよう」
ここまで試験が上手いこといったので、大きな基板(150x100mm)で本番と行きましょ。
今回作りたい基板はそんなに大きな物じゃないので、タイルパターンで繰り返し描いておき、沢山取れる様にする。いくつか予備が出来るというのもあるけれども、その中から条件の良いのを抽出したり、このあとの穴開け作業の練習台にするというのが意図。

感光基板現像でちと失敗。


はじっこの方がぼけて溶けた。
ライトテーブルといっても蛍光灯が入っているだけだが、その蛍光灯の真下はくっきりはっきり仕上がったもののそこから離れるにつれ斜めからの入射になるのでおかしくなったと思われ。
そいや蛍光灯で露光するときは、10分置きくらいに位置を動かすのがよいんだっけ。失念していた。
でもそもそもで使わない予備領域がぼけていただけなので特に問題なし。

エッチングも終了。
ちと面積が広いのと現像ムラがあったことからエッチング時間が難しく、一部 0.1mm 線(パターンじゃないけど)が溶けかけている感じ。
感光現像をバッチリ決めると相当細いパターンも作れるという手応えは得た。
—–


hatena bookmark

「エッチングで銅を溶かせ」
さて、いよいよエッチングですな。
なんせ金属を溶かすわけですから、滅多なところに付着させてひどい目に遭いかねません。なのでキッチンシンクなどは避けて、プラスチックで覆われた風呂場(ユニットバス)にて作業を行います。お湯も手を伸ばせばすぐに出てくるし。


作業の様子。
大きさの違う台所用プラスチックシールケース(俗に言うタッパー)を用意、大きな方に熱いお湯を入れ小さい方はその中で湯煎。
手や服に付くと全然落ちなくて泣きたくなるのをよく知っているので飛び跳ね注意で慎重に扱う。といっても、そもそもではねるほど乱暴に扱わないものなんだけれどもね。


エッチング完了。
おお、トラウマになっていた割りにはあっさりと成功。
必要なラインが溶けたりもしていないしかなり良い感じだ。
—–