[C#]DirectInputでジョイスティック(ゲームパッド)を使用する

B002B9XB0E
Windowsにはゲーム用のコントローラとしてジョイスティック(ゲームパッドとも呼ばれます)を使用することが出来ます。

ジョイスティックを使用することでPCに不慣れな人でも、直感的な操作で入力を行う事が可能です。ジョイスティックを制御するプログラムを書くにはDirectXを使用することが多いのですが、残念ながらC#(というか.Net Framework)を使用したジョイスティック制御プログラムの情報は少ないです。

そこで今回は、VisualStudio 2010で、C#からDirectXのDirectInputの機能を使用して、ジョイスティックを利用できるようにします。


開発環境

確認に使用した環境は以下の通りです。

OS:
Windows7 x64

IDE:
VisualStidio 2010 Professional

DirectX SDK:
DirectX SDK(Jun 2010)

ジョイスティック(ゲームパッド);
今回は手元に有った,エレコム製のスーファミ風コントローラを利用
B000G1T662
ELECOM i-revo推奨レトロ風USBゲームパッド ホワイト JC-U1608TWH



作業手順

大まかな作業の流れは以下の通りです。

DirectX SDKをインストールする
VisualStudioでプロジェクトを作成する
DirectInputのDLLを参照設定する
プログラムを作成する



DirectX SDKをインストールする

まずは、以下のURLよりDirectXのSDKをダウンロードし、インストールします。
(DirectX Runteimeではないので注意してください)
Download: DirectX SDK – (June 2010) – Microsoft Download Center – Download Details

64bit環境で開発している場合、SDKのインストールでエラーが出る場合があります。
この際は、以下の記事を参考にしてください。
 → DirectX SDKインストール時に”S1023エラー”が出る時の対処法


VisualStudioでプロジェクトを作成する

SDKがインストールできたら、Visual Studio2010でプロジェクトを作成します。
Windowsフォームアプリケーションを指定します。。
また、.Net Frameworkのバージョンが4.0になっていたら3.5にしてください。
(詳細は後述しますが、4.0だと実行時にエラーが発生します)



DirectInputのDLLを参照設定する

プロジェクトの参照設定を右クリックして、参照の追加を選択します。


一覧より、以下のコンポーネントを追加してください。

Microsoft.DirectX
Microsoft.DirectX.DirectInput




もし、参照設定の画面にMicrosoft.DirectXが表示されない場合はファイルから以下のDLLを直接指定します。これらは、フォルダ名からも分かるようにDirectXのマネージドコード用DLLです。

C:\Windows\Microsoft.NET\DirectX for Managed Code\1.0.2902.0\Microsoft.DirectX.dll
C:\Windows\Microsoft.NET\DirectX for Managed Code\1.0.2902.0\Microsoft.DirectX.DirectInput.dll



設定後、参照設定の中に項目が追加されればOKです。



プログラムを作成する

次にプログラムを作成します。
今回はWinFormsによるGUI画面で、以下のレイアウトにしました。


最近のゲーム用ジョイスティックはアナログスティックや、スライダ、POVハット、フォースフィードバックなど色々な機能がありますが、今回はサンプルなのでシンプルに十字キーとボタンの押下状態を取れるだけのプログラムとします。

他の入出力デバイスと同様に、ジョイスティックを使用するには、1:初期設定と,2:データの取得という2ステップが必要です。

まずは、初期設定です。
元にお約束として、以下のusing定義を追加します。

using Microsoft.DirectX.DirectInput;


ここでエラーが出る場合は、参照設定が行えているか再確認してください。


次にデバイスの初期化を行います。

Device joystick = null;
 
private void button1_Click( object sender, EventArgs e ) {
    DeviceList devList;
 
    // ゲームコントローラのデバイス一覧を取得
    devList = Manager.GetDevices( DeviceClass.GameControl, EnumDevicesFlags.AttachedOnly );
 
    // 全てのコントローラを列挙
    foreach( DeviceInstance dev in devList ) {
        joystick = new Device( dev.InstanceGuid );
        joystick.SetCooperativeLevel( this, CooperativeLevelFlags.Background | CooperativeLevelFlags.NonExclusive );
 
        // 最初に見つかったジョイスティックを操作対象とする
        break;
    }
 
    joystick.SetDataFormat(DeviceDataFormat.Joystick); 
 
    // デバイスに対するアクセス権をとる
    joystick.Acquire();
 
    txtLog.AppendText( "名称: "          + joystick.DeviceInformation.ProductName + Environment.NewLine );
    // コントローラの軸の数
    txtLog.AppendText( "軸の数: "        + joystick.Caps.NumberAxes + Environment.NewLine );
    // コントローラに有るボタンの数
    txtLog.AppendText( "ボタンの数: "    + joystick.Caps.NumberButtons + Environment.NewLine  );
    // PoV hatの数
    txtLog.AppendText( "PoVハットの数: " + joystick.Caps.NumberPointOfViews + Environment.NewLine  );
}



PCに接続されているジョイスティックのデバイスはMicrosoft.DirectX.DirectInput名前空間に有るManagerクラスのGetDevices()メソッドを使用します。戻り値でデバイス一覧が手に入るので、この値をforeachで繰り返します。今回は最初に検出したデバイスを使用します。

生成されたDeviceオブジェクトに対して、SetCooperativeLevel()で、このデバイスに対する権限を取得します。
今回は2つの指定が行われており、それぞれ以下の意味を持っています。

CooperativeLevelFlags.Background
    ウィンドウがアクティブでなくても(=裏に隠れていても)、ジョイスティックの状態を取得可能にします。
 
CooperativeLevelFlags.NonExclusive
    ジョイスティックに対して、排他的ではないアクセスを行います。
    これを指定すると、同一のデバイスにアクセスしているほかのアプリの動作を妨げません。



その後、Acquire()でアクセス権の取得を行い、アクセス出来るようになったら各種情報を取得します。
NumberAxesで返される軸の数は、例えば十字キーなら上下/左右の2軸となります。

PoVハットというのは、8方向のスイッチで、よくフライトシミュレーター用のジョイスティックの先っちょについているモノです。”POV”はPoint Of Viewの略でこの装置が主にゲームの視点操作に使われていることが由来となっています。


初期化が終わったら、キー入力状態の取得です。
今回はTimerコントロールを利用して、一定時間周期でポーリングする方式で作成しました。

private void timer1_Tick( object sender, EventArgs e ) {
    // デバイス未決定時は何もしない
    if ( joystick == null ) {
        return;
    }
 
    try {
        // コントローラの状態をポーリングで取得
        joystick.Poll();
        JoystickState state = joystick.CurrentJoystickState;
 
        //-----------------------
        //十字キーの状態を出力
        //-----------------------
        txtState.Text  = "X=" + state.X + " Y=" + state.Y;
 
        //-----------------------
        // ボタンの状態を出力
        //-----------------------
        int count = 0;
        StringBuilder tmpBuff = new StringBuilder();
        foreach ( byte button in state.GetButtons() ) {
            if ( count++ >= joystick.Caps.NumberButtons ) {
                break;  // ボタンの数分だけ状態を取得したら終了
            }
            tmpBuff.Append( button.ToString() + ", " );
        }
        txtButton.Text = tmpBuff.ToString();
 
    } catch ( Exception ex ) {
        txtLog.AppendText( ex.Message + Environment.NewLine );
    }
}



ボタンの状態は、初期化処理で取得したDeviceオブジェクトから取得します。
十字キーの状態はCurrentJoystickStateプロパティから、ボタンはGetButtons()メソッドの戻り値から判断できます。
今回は説明しませんが、他の入力スイッチやフォースフィードバック機能についても、対応するプロパティ/メソッドがあります。詳細はクラス仕様を確認して下さい。

十字キーの状態はCurrentJoystickStateのX,Yから取得でき、値は0から65535でとなります。デジタル式のOn/Off十字キーなら0,32768,65535のどれかの値が返されます。
ボタンに関しては、ジョイスティックによってボタンの数が異なるため、配列として値が返されます。返される配列のサイズは128ですが、有効な値が入っているのは配列内の最初のjoystick.Caps.NumberButtons個分のみです。取得した値が0だったらボタンが押されておらず、128だったら押されていると判定できます。

あと、おまけ機能として、コントロールパネルの画面を表示させるボタンを追加します。

private void button2_Click( object sender, EventArgs e ) {
    // デバイス未決定時は何もしない
    if ( joystick == null ) {
        return;
    }
 
    // コントロールパネルを開く
    joystick.RunControlPanel();
}


RunControlPanel()メソッドをコールする事で、コントロールパネルのウィンドウを表示できます。


実行結果は以下の通りです。


プログラムの実行時、以下のようにFileLoadExceptionが出る場合は、.NetrFrameworkのバージョンを4.0から3.5に落としてください。


B002B9XB0E
iBUFFALO USBゲームパッド 8ボタン スーパーファミコン風 グレー BSGP801GY

DirectX SDKインストール時に”S1023エラー”が出る時の対処法

DirectXのSDKをインストールしようとすると、「S1023エラー」が出る場合があります。


セットアップが失敗しました。
再配布可能なパッケージのインストール中にエラーが発生しました。
開いているすべてのプログラムを閉じて、セットアップをもう一度実行してください。
それでも問題が解決しなければ、DirectX開発者サポートにお問い合わせ下さい。




このS1023エラーですが、これは”インストーラが他のプロセスの起動に失敗した”という意味です。
エラーメッセージだけでは、何のプロセスの起動に失敗したかは表記されていないのですが、原因はDirectXのセットアップ作業中に実施される”Visual C++ 2010 再頒布可能パッケージ”(Visual C++ 2010 Redistributable Package)のインストールで問題が起きている場合がほとんどです。
※DirectXのインストーラーは、セットアップ中に裏でVC++の再頒布可能パッケージをインストールしています。


S1023エラーは常に起きるわけではなく、以下の条件を満たしている場合に発生するようです。

DirectX SQKのバージョンがJune 2010のものをインストールしている。
 
64bit版のWindowsを使用している。
  (32bit版でも起きるかも...? 環境が無いので詳細不明)
 
Microsoft Visual C++ 2010 再頒布可能パッケージをインストールしている。




問題が発生する理由

そもそも、なぜ”VC++の再頒布可能パッケージが入っているとDirectX SDKのインストールに失敗するのか?”という話ですが、これはJune 2010版SDKのインストーラにバグがあって、DirectXがインストールしようとする再頒布可能パッケージより”新しい”バージョンの「Visual C++ 2010 再頒布可能パッケージ」が既に入っていると問題が発生するようです。

再頒布可能パッケージは、あまり明示的にインストールする事は有りませんが、後者は、例えばVisual Stdio 2010をインストールすると依存コンポーネントとして自動で入ります。


対処法

対処法としては、以下の手順を踏んで作業すれば正常にインストール出来るようになります。

ざっくりとした作業フロー

Step1: 既にインストールされている最新の「Visual C++ 2010 再頒布可能パッケージ」を一旦削除する
Step2: DirectXのSDKをインストールする。
Step3: SDKインストール時に入った古い「Visual C++ 2010 再頒布可能パッケージ」をアンインストールする。
Step4: 改めて、最新の「Visual C++ 2010 再頒布可能パッケージ」を単独でインストールする。



という訳で、各ステップの具体的な作業手順を紹介していきます。

既にインストールされている最新の「Visual C++ 2010 再頒布可能パッケージ」を一旦削除


コントロールパネル -> プログラムの機能を選択します。(WinXPの場合は”コントロールパネル -> アプリケーションの追加と削除”です)


一覧から「Visual C++ 2010 Redistributable Package」をアンインストールします。


64bitOSの場合は、x64とx86の2つあるかもしれませんが、両方アンインストールします。また、消すのはC++ 2010だけで、C++ 2008や2005はそのまま放置でOKです。
※念のため、バージョン番号を控えておいてください。


DirectX SDKをインストールする

次にDirectX SDKのインストールを行います。

SDKを以下のURLからダウンロードし、セットアップを起動します。
Download: DirectX SDK – (June 2010) – Microsoft Download Center – Download Details



最初の画面で一部文字化けしてますが、気にしなくてOKです。


同意しますを選択して、次へをクリック


性能向上のため,ハードの情報をマイクロソフトに送信するかの確認です。
特に送る義務も無いので”No”を選択して次へをクリック(送りたい人は別にYesでもOKです。)


お好みのコンポーネントを選択して、次へをクリック。
(今回の確認では、デフォルトのままにしました)


インストールが開始されます。


暫くすると正常終了されます。




SDKインストール時に入った古い「再頒布可能パッケージ」をアンインストール


再度コントロールパネルから確認すると、古いバージョンの「Visual C++ 2010 再頒布可能パッケージ」が入っている事が分かります。
(下の画像だと10.0.30319に戻っています。)


これを右クリックして、アンインストールします。


はいをクリックすれば、削除完了です。



改めて、最新の再頒布可能パッケージを単独インストール


最新版の「Visual C++ 2010 再頒布可能パッケージ」を下記のURLからダウンロードします。
Download: Microsoft Visual C++ 2010 再頒布可能パッケージ (x64)



同意するを選択して、インストールボタンをクリックすれば、最新のモノが入ります。


その後、KB2467173に対応するパッチを適用してください(WindowsUpdateからも更新可能です)
[MS11-025] Visual C++ 2010 再頒布可能パッケージ セキュリティ更新プログラム (2011 年 4 月 12 日) について

これで作業は完了です。
再度コントロールパネルより、バージョンが上がっている事を確認してください。

補足:
「Visual C++ 2010 再頒布可能パッケージ」のバージョンについてですが、10.0.30319は、VC++ 2010のService Pack1導入前で、10.0.40219はService Pack1導入後のものです。SP1ではsecurity fixとか行われてるので、必ず最新版にしておいてください。


ゲームプログラマになる前に覚えておきたい技術
はじめての3Dゲーム開発


4797338954
アクションゲームアルゴリズムマニアックス

小さいハンダ吸取器は、GS-108がお勧め

最近新しい半田吸取器を購入したのですが、これが思いのほか便利だったので紹介ておきます。
今回購入したのは、goot製のGS-108という商品です。
B0016V5KHU
goot はんだ吸取器 GS-108


実際に購入した商品がこれです。


パッケージの紹介文をスキャンしたので貼っておきます(クリックで拡大します)。





この吸取器の、主なメリットは以下の3点です。


小さい&軽い

GS-108は他の吸取器と比べて、かなり大きさもコンパクトで、シャーペンよりちょっと大きい程度です。ものさしで測ったところ19cmでした。
ですので手が小さい人にもお勧めですし、片付けておく時も場所をとりません。


また、重量も非常に軽いです。
キッチン用のスケールで重さを測ってみたところ27gしか有りませんでした。


軽いのは重量だけではなくシャフトを押すのに必要な力も軽いです。大きな吸取器だとシャフトを押すのに苦労しますが、この子は軽く押すだけでOKです。
シャフトを押すのは軽いですが、吸引力は強力なので安かろう悪かろうというわけでは有りません。


吸い取ったハンダの掃除が不要

吸取ったハンダですが、次に使用するとき(シャフトを押した時)に自動で排出してくれます。
商品によっては、吸取ったハンダが吸取器内部に蓄積され、定期的にクリーニングをする必要が有るのですが、このGS-108は使っているうちに自動で排出されるのでクリーニングの手間が軽減されます。(完全メンテナンスフリーというわけでは有りませんが手間が激減します)

このあたりの使い勝手については、YouTubeでGS-108を使っている人の動画が有ったので、これを見ると分かりやすいです。




安い

GS-108は比較的安価で1000円強で購入可能です。たかが吸取器といえども大きなものだと2000円を超えるものも有り、業務用ならプロユースのより高価で使いやすいものを買うのも良いかもしれませんが、趣味程度での利用ならコストパフォーマンスも大事です。

探せば、これより安い海外製のモノもあったりしますが、吸取器は吸取先のノズルが消耗品なので交換部品が手に入らないと本体ごと買い替えとなってしまいコストがかさみます。

その点gootは国内メーカーなので、保守部品が手に入りやすいです。替え部品はマルツなどでも売っていますが、近くに店舗が無い場合でもamazonでも購入でき価格も安価です(ちなみにGS-108用替えノズルの型番はGS-108Nです)。
B0036RQHN8
goot 替ノズル GS-108N




注意点

この製品に限らないのですが、手動式のハンダ吸取器は、上手く吸取るにはちょっと慣れがいります。
上手く吸取れない理由には、吸取りのスイッチを押す時に吸取り先がずれてしまう、基板に吸取り器の先を当てる角度が悪くで上手く吸えない等が多いです。これに関しては何度か練習すれば上手に出来るようになるので、初めての場合は不要な基板で練習するのも良いです。


また、GS-108は静電対策品では有りません。静電対策のものが欲しい場合は500円ほど高くなりますが、GS-158がお勧めです。GS-158は今回紹介したGS-108と見比べてみると分かるのですが、見た目・重さが全く同じで、静電対策の有無だけが異なっています。

ちなみに、替えノズルはGS-108とGS-158で同じ形状らしいので、間違えて購入してしまった場合は、ノズルだけ静電対策用のものを購入するというのも手かもしれません。

静電対策用ノズルの型番は、GS-158Nです。

goot はんだ吸取器 GS-108
B0016V5KHU


小規模な店舗にお勧めな、会員向け一斉メール配信ソフト

先日、比較的小さな店舗で、顧客向けにメルマガなどを送りたい場合にお勧めなソフトが無いか、聞かれたので調べてみました。
せっかく調査したので、その結果をメモ代わりに残しておきます。

今回は”小規模向け”という事だったので、判定基準は以下の通りです。大企業向けだと、また要件が変わってくる(自社のシステムとの連携機能など)のですが、その辺は余り考慮していません。

数千名程度のユーザへのメール配信が可能。
パッケージ品で数万円(3万程度)で購入可能。
月々の利用費用が掛からない。
一斉メールの配信ソフトとして基本的に必要な機能が備わっている。



判定基準の最後にある”一斉メールの配信ソフト向けな機能”というのは、たとえば以下の様なものです。これは、全てのソフトがこれらの機能を満たしているというわけではなく、あくまで目安です。

特定の属性を持つ人だけに送信できる
	3ヶ月以内に購入した女性のみに送信など
 
メール本文に可変部を作って差込送信ができる。
	文頭の "○○様"の所を、各顧客名にできるなど
 
メールサーバの負荷対策として、分割送信が出来る
	1分単位で100件づつ順次送信するなど




調べたところ、有力な候補は以下の3つでした。

同報@メール5 /R.2 通常版

B0073XYAEY
価格は高いけど、ATOKで有名なジャストシステム製なので安心感がある。
Amazonで購入できるので便利。
突出した機能は無いが、基本機能が全て収まっていて、見た感じも使いやすそう。
ケータイ絵文字対応している

メーカーサイト:メール一斉送信・メルマガ配信ソフト「同報@メール5 /R.2」


かんたん一斉メール配信3

B004HB3D1G
株式会社アイアールティー 製のソフト。
ジャストシステム製のものに比べると、半額程度で購入できる。
地図リンク機能有り。
こちらもAmazonで購入可能
基本機能はそろっているので、マイナーメーカーでよいからとにかく安く欲しい人にはお勧め。

メーカーサイト:かんたん一斉メール配信



メールマジックプロフェッショナル


株式会社インフィニシスが販売
HTMLメールが送信可能(文字に色をつけたり、文字の大きさを変更、画像の挿入等ができる)
動画の添付も可能(…でも,サイズが大きくなるので受信者には嫌われるかも)
マニュアルを購入前に閲覧できる
画像挿入のための画像など、テンプレートが豊富に用意されている。(けど、全体的にデザインが古臭いので使えないかも…?)
メーカーサイト:メールマジックプロフェッショナル for Windows



2万程度の費用が負担できるなら、ジャストシステムの製品が良いかなという印象です。
価格を抑えたい場合のチョイスは、かんたん一斉メール配信3ですが、それ程価格差があるわけではないので、商売目的なら少々高くても使いやすいほうが良いように思います。



4478014450
女性客がどんどん集まる「携帯メルマガ」活用術

書籍”Make: Electronics”の実験で必要なパーツリスト

4873114772
Make: Electronics ―作ってわかる電気と電子回路の基礎 ((Make:PROJECTS))


以前Make: Electronicsという本を読んだのですが、、書籍中に書かれていた実験を行うためのパーツリストです。

自分で購入する時用のメモだったので、書籍に書かれているものと同じ数量とは限りません。
ものによっては予備として大目に買ったパーツもありますし、実際にやるまでも無さそうな実験については、購入を止めたパーツも有ります。


電磁リレーは沢山の電圧のものを多めに買ったのですが、この実験の後に使う場面が無いのでリレーは予備なしでも良かったかもしれません…。一旦動作原理が理解できたら、実際の回路では、ほぼトランジスタを使うので、替わりに2SC1814のトランジスタを多めに用意したほうが後々便利です。

あと555タイマーも、将来PIC,Arduinoなどのマイコンを使う予定ならマイコン制御で同等のことが行えるので、こちらも予備は不要です。

--------------------------------------------------------
1章で用意するもの
 
単三電池1本用の電池ボックス
    1個
 
単三電池4本用の電池ボックス
    1個
 
ワニグチクリップ
    6個
 
ヒューズ(3A)
    自動車用の平型
    3個
 
可変抵抗
    パネルマウント,シングルターン,2KオームBカーブ(リニア), 0.1ワット以上
    2個
 
抵抗
    1/4W以上の詰め合わせ(470,1K,2Kが入っていること) 
    100個入りセット
 
LEC(お好みのもの)
    10個



--------------------------------------------------------
2章で用意するもの
 
電源用の汎用ACアダプタ
ブレッドボード
ワイヤストリッパー
 
配線
    AWG22番 単芯線, 赤/黒/緑の被覆があるもの
    8m以上
 
テストリード
    無くてもよいがあると便利
    3個ぐらい
 
押しボタンスイッチ
    モーメンタリ ONのSPST(押すとONになるもの)
 
 
トグルスイッチ
    SPDTのON-ONタイプ
 
リレー
    DPDT(双極双投)、ノンラッチ,DC12V
    2個
    (FTR-F1CA012V,FTRF1CD012V,G2RL-24-DC12,OMI-SH-212D推奨)
 
可変抵抗
    1MΩ,Bカーブ(リニア)
    1個
 
トランジスタ
    汎用NPNトランジスタ
    2N2222,PN2222,2SC1815推奨
    4個
 
プログラマブルユニジャンクショントランジスタ
    2N6027
    4個
 
コンデンサ
    電解コンデンサ各種
    25V耐圧以上
    1000uFが1つ以上必要
 
    セラミックコンデンサ各種
    0.0047uFが1つ以上必要
 
スピーカ
    8Ωで1インチのもの
    1個



--------------------------------------------------------
3章で用意するもの
 
15Wの半田ごて
30Wの半田ごて
ヘルピングバンド
ICクリップ形のテストリード
ヒートガン
ハンダ吸取器
ハンダ吸取線
ミニバイス
小さい12V鉛バッテリー
 
ミニチュアハンドソー
    先が細いもの
 
整流用ダイオード
    1N4001 (50Vまで使えるもの?)
    10本
 
etc.



--------------------------------------------------------
4章で用意するもの
 
555タイマー
    SA555N,NE555D,TLC555など
    CMOSのもの、高精細形は避ける
    10個
 
ロジックチップ
    74HC00
    74HC02
    74HC04
    74HC08
    74HC32
    74HC86
    を各4個
 
    4026十進カウンタ
    4個
 
    74LS92,74LS06,74LS27
    (HCでは無く、LSを買う)
    各2個
 
ICソケット    
    8,14,16ピン
    各5個
 
ローパワーLEC
    10個
 
 
7セグLED
    3桁表示、カソードコモン、できるだけ低消費電力のもの
    BC56-11EWA等
    1個
 
ラッチングリレー
    デュアルコイル,5V,スイッチ能力1A以上,2FormCパッケージ
    1個
 
可変抵抗
    5K,10K,100KのBカーブ
    各1個
 
    10KΩ,半固定抵抗
    1個
 
レギュレータ
    5V、出力1A以上推奨
    LM7805
    ヒートシンクもあれば一緒に買っておく
    1個 
 
タクトスイッチ
    SPST,4ピン
    SKHHAKA010かその類似品
 
12キーの数字パッド
    ピン数が13のもの



4873114772
Make: Electronics ―作ってわかる電気と電子回路の基礎 ((Make:PROJECTS))

Amazonマーケットプレースの出品情報を抽出する(GreaseMonkey使用)




Amazonには、マーケットプレース(通称マケプレ)という中古の商品を購入出来るシステムがあります。マーケットプレースを使用すると欲しい商品を安価で手に入れることが出来るので、非常にお得です。


ですが、マーケットプレースの出品者一覧ページが非常に見づらく不便です。
出品者情報は、価格が安い順に1ページ当たり15件の情報が表示されるのですが、例えばある商品の出品一覧ページを見てみると、こんなに長くなっています。


個人的には、古本なんてそこそこの品質のものが安く手に入ればよいだけなので、この情報量は親切を通り越して却って分かり辛くなっています。

というわけで、今回はマケプレの出品者一覧を加工して見やすくしてみます。

方針を決める


必要なデータだけ抽出したいならスクレイピングすればよいのですがAmazonの規約上、スクレイピングすることはダメだと明記してあるので、この方法は取れません。

というわけで、今回はhtmlデータはブラウザからそのまま取得します。
その上で、ブラウザ側のユーザ定義スクリプトで不要なデータを削除したり見た目を変えることで情報を整理します。

ブラウザに表示されているデータを加工するのに便利なツールといえばGreaseMonkeyです。
GreaseMonkeyはFirefoxのプラグインですが、特定のサイトを訪れた時に指定したjavascriptを走らせる事が出来ます。

今回はGreaseMonkeyプラグインを使って、javascriptからサイトのデザインを調整する事にします。

元ネタとして使用するページを決める

元ネタとしてPCサイトを使用すると、余計な情報が多すぎて加工の手間が増えます。
という訳で今回はケータイ用のサイトを元に加工する事にしました。

amazonのケータイサイトは、URLさえ指定すればパソコンのブラウザからも閲覧できます。
デフォルトでは、以下の様な表示になります。

ケータイサイトだとPC用サイトよりずいぶんシンプルになりますが、これでもまだ長すぎます。
これを、1ページの内容が1画面に収まるところまで持ってい行きます。


ケータイ版マケプレのURL構造

表示デザインを加工する前に、アマゾンのURL体系を確認しておく必要があります。
これに関しては以前調べたので、興味がある場合は、下記のページを参照してください。
携帯サイトで,マケプレの出品情報をチェックする


GreaseMonkeyのスクリプトのダウンロードと解説

という訳で作ったスクリプトは以下の通りです。
(プログラムに興味が無い人は下のほうまで読み飛ばしてください)

下記のリンクをクリックすると、ソースが閲覧できます。
amazon.co.jp_mobile_MarketPlace_.user.js

ちょっと長めのスクリプトですが、大きく分けると2つの関数で構成されています。

(function( d, onLoadProc ) {
	...
})(document, function($) {
	...
});



最初の関数はjQueryのライブラリを読み込んだ上で、2つ目の関数を実行しています。
jQueryをロードしているのは、今回のスクリプトはDOM操作が多く、素のjavascriptだとちょっと面倒だったのが理由です。

2つ目の関数が、実際の加工処理になります。
ケータイサイトは、タグがシンプルで余り構造化されておらず、idやclassの指定もほとんど有りません。


ですので、まずは各出品者情報の切れ目を作るところからはじめます。

    //------------------------------------
    // "カートに入れるボタン"を線に変える
    //  (ここがアイテムの変わり目)
    //------------------------------------
    console.log( "replace center tag" );
    $( "center" ).after( '<hr class="item-end" />' );
    $( 'hr.item-end' ).css( 'height', '1px' )
                      .css( 'border', 'none' )
                      .css( 'margin', '1px 0px' )
                      .css( 'border-top', '1px #fcc solid' );
 
    // centerタグを外す
    $('center').each( function() {
        $(this).replaceWith( $(this).html() );
    });
    $('input.cartButton').parent().css( 'display', 'inline' );


ページを見ると、丁度”カートに入れる”ボタンが切れ目になりそうだったので、これを目印にします。
このボタンはcenterタグで囲まれているので、その後ろにhrタグを入れます。ほかのhrタグと混ざらないようにclass指定もしておきます。ついでに、ボタンのcenterタグを外した上で改行を抑制します。


各明細の切れ目が印がついたら、各明細データを集めます

    //-------------------------------------
    // 出品情報を含むノードの一覧を取得
    //-------------------------------------
    console.log( "collect body children tag" );
    $("body").contents().each( function() {
        itemContents.push( $(this) );
 
        // 商品の変わり目に到達したかチェック
        if ( $(this).is( 'hr.item-end') ) {
            console.log( '  contents len:' + itemContents.length );
            console.log( itemContents );
 
            items.push( itemContents );
            itemContents = new Array();
        }
    });


区切りの目印を入れたので、一旦この単位でデータを集めて配列に入れておきます。
通常だったら、ここでタグのidやclassを指定して対象データを特定するところなのですが、id/classの指定が無いので全部取得してしまいます。また、テキストノードも欲しいのでcontents()メソッドを使用します。


次は、集めたタグに対して意味が特定できるようにします。

    //-------------------------------------
    // 商品情報をマークアップする
    //-------------------------------------
    console.log( "markup item info len=" + items.length );
    for ( loop = 0; loop < items.length; loop++ ) {
        console.log( "  item[" + loop + "]" );
 
        var curContents = items[ loop ];
 
        // 先頭は書籍タイトルなので無視
        if ( loop == 0 ) {
            continue;
        }
 
        // (たぶん)1明細目 -> 先頭に有るページ表示を切り詰める
        while( curContents.length > 21 ) {
            //console.log( "omit contents↓" );
            //console.log( curContents[0] );
            curContents.shift();
        }
 
        console.log( "  itemContents len=" + curContents.length );
 
        // 改行
        curContents[ 1 ].addClass( 'br1' );
 
		// ...中略...
 
        // コンディション+屋号
        curContents[ 6 ].wrap( '<span class="cond_marchant"></span>' );
 
        // 改行
        curContents[ 7 ].addClass( 'br3' );
 
        // コンディション説明
        curContents[ 8 ].wrap( '<span class="conditionDesc"></span>' );
 
		// ...中略...
    }


出品の明細データは同じデータ構造の繰り返しになります。
先ほど配列に入れたデータの中身を見ながら、addClass()メソッドでマーキングします。
テキストノードにはclass指定が行えないため、spanタグで括っておきます。


次はいよいよ見た目の変更です。

    //--------------------------------------------------
    // マークアップされたコンテンツのスタイルを改変する
    //--------------------------------------------------
    console.log( "change style" );
    $( '.br1' ).hide();
    $( '.br2' ).hide();
    $( '.br3' ).hide();
    $( '.br4' ).hide();
    $( '.price'             ).css( 'color', '#990000' ).css( 'font-size', '14pt' );
    $( 'span.cond_marchant' ).css( 'color', '#999999' );
    $( 'span.rating'        ).css( 'color', '#999999' );
    $( '.conditionDesc'     ).hide();
//  $( '.conditionDesc'     ).css( 'color', '#999' ).css( 'font-size', '9pt' );
    $( '.shipInfoLink'      ).hide();
    $( '.detailInfoLink'    ).hide();


付与したclass名指定でcssの適用を行います。また不要なデータはここでhide()指定します。
今回は該当項目がありませんが、テキストノードを直接隠したい場合はhide()ではなくdelete()をコールする必要があります。


コンディション表記と屋号は同じタグ内にスペース区切りで表示されているだけなので、両者の区別を行います。

    //-------------------------------------------------------
    // コンディションと屋号が同じタグに混ざっているのを分離
    //-------------------------------------------------------
    console.log( "split condition information" );
    $( 'span.cond_marchant' ).each( function(){
        var marchantText = $( this ).text();
        marchantText = String( $.trim( marchantText ) );
 
        // コンディションと屋号を切り分ける
        var splitPos = marchantText.indexOf( '\xa0' );
        var cond  = marchantText.substring( 0, splitPos );
        var title = marchantText.substring( splitPos+1 );
 
        if ( title.length > 15 ) {
            title = title.substring( 0, 15 ) + "...";
        }
 
        // 別々のタグに分ける
        $( this ).replaceWith( '<p class="cond">' + cond + '</p>' + 
                               '<p class="marchant">' + title + '</p>' );
    });
 
    // 分離した各タグにスタイルを適用
    console.log( "change style2" );
    $( 'p.cond'     ).css( 'margin',   '0px' )
                     .css( 'display',  'inline-block' )
                     .css( 'width',    '90px' );
 
    $( 'p.marchant' ).css( 'margin',   '0px' )
                     .css( 'display',  'inline-block' )
                     .css( 'width',    '200px' )
                     .css( 'font-size', '9pt' )
                     .css( 'color', '#999999' );


該当データのテキストを取得した上で改めてタグ付けした後、replaceWith()で新しい値をセットしなおしています。2つの項目はスペースではなくnbspで区切られていたため、区切り文字の検出に、indexOf( ‘\xa0’ );を指定します。


最後に、細々とした調整をします。

    //---------------------------
    // ヘッダ部を見やすくする
    //---------------------------
    console.log( "change header style" );
    $( 'a[name="Used"]' ).after( "<br />" );
    $( 'font:contains("-----------")' ).remove();






ここまで加工した後のレイアウトは以下の通りです。


サイズは横が500pxで、縦が400pxぐらいになりました。
ここまで小さくなれば、楽勝で1画面に収まってくれます。


ここまで省略するのは極端だという場合は、css適用を変えることで表示項目を調整できます。
例えば下の例では、コンディションコメントを表示させたままにしていますが、これでも元のレイアウトよりはずいぶん一覧性が良くなっています。

javascriptで&nbsp;の空白がマッチしない

htmlで、文字中で改行させて欲しくないスペースとして&nbsp;というものがあります。
このnbspは文字コードだと160になります。

という事は16進だと0xA0,二進数だと”1010 0000″です。
一方普通のスペースは,0x20です。


両者の二進数表記を比べると最上位ビットが違うだけという事が分かります。

二進表記     内容
----------  -------------
10100000    nbsp
00100000    普通のスペース



また、htmlでは文字コード指定での指定も出来るので、&nbsp;は&160;とも表記可能です。


ちなみに、nbspによる空白はブラウザで見ると普通の空白に見えます(当たり前の事ですが…)。
ですが、前述のように文字コードが空白とは異なっているため、javascriptで以下の様なコードを書いてもマッチしてくれません。

data.indexOf( ' ' );



javasciptでは、先頭に”\x”をつけることで文字を16進表記できるため、このような場合は下記のコードでマッチさせる事が出来ます。

data.indexOf( '\xa0' );




firebugで見ても、普通のスペースにしか見えず、分かり辛いバグになりがちなので注意が必要です。

文字コード「超」研究

[JavaScript]VBのInStr()相当の処理を,JavaScriptで使用するには?

VBでは、文字列中に指定した文字があるかを調べる関数として、InStr()というものが有ります。
JavaScriptで同等の処理を行いたい場合は、indexOf()メソッドを使用します。

object.indexOf( string keyStr );




例えば、以下のコードではiに2が入ります。

var data = 'testdata';
var i    = data.indexOf( 'st' );
console.log( i );



indexOfの戻り値は最初の文字にマッチする場合0が返るので、2が入るという事は3文字目からという意味です。また、マッチする文字が無い場合は-1が返されます。

[jQuery]タグのnodeTypeで比較可能な値とその意味の一覧


jQueryを使うと以下の様な感じで、タグのnodetypeを取得/比較することがあります。

textNodes = $('div.main').contents()
                         .filter(function(){return this.nodeType === 3});



NodeTypeとして指定できる値とその意味の一覧です。

NodeType一覧

ELEMENT_NODE == 1
    HTMLタグ
 
ATTRIBUTE_NODE == 2
    HTMLタグの属性
 
TEXT_NODE == 3
    タグ内の普通のテキスト
CDATA_SECTION_NODE == 4
    CDATA
 
ENTITY_REFERENCE_NODE == 5
 
ENTITY_NODE == 6
    DOCUMENT_TYPE_NODEの子として存在する
 
PROCESSING_INSTRUCTION_NODE == 7
    ドキュメントの処理命令(PI)
COMMENT_NODE == 8
    コメント
 
DOCUMENT_NODE == 9
    ドキュメント全体のルート
 
DOCUMENT_TYPE_NODE == 10
    DOCTYPE宣言
 
DOCUMENT_FRAGMENT_NODE == 11
 
NOTATION_NODE == 12
    DOCTYPE宣言内に書かれた表記規則

GreaseMonkey本体のソースを入手する

下記の内容は、ユーザスクリプトではなくGreaseMonkey本体についての話です。


GreaseMonkeyのソースは、githubで管理されている。
ソースのライセンスは、MIT/X11 License。
greasemonkey/greasemonkey · GitHub

GreaseMonkeyのオフィシャルサイト
Greasespot

バグ一覧
Issues · greasemonkey/greasemonkey · GitHub




新しいスクリプトを作るときの、雛形生成処理
greasemonkey/content/newscript.js

ユーザスクリプトのロード/parse処理
greasemonkey/modules/parseScript.js

[HI-TECH C]__CONFIG()でundefined identifier “CP_OFF”エラーが出る場合

出力されるエラーの例

[192] C:\project\pic\16F84A_Ctest\main.c; 16.12 undefined identifier "FOSC_HS"Error   
[192] C:\project\pic\16F84A_Ctest\main.c; 16.22 undefined identifier "WDTE_OFF"Error   
[192] C:\project\pic\16F84A_Ctest\main.c; 16.33 undefined identifier "PWRTE_ON"Error   
[192] C:\project\pic\16F84A_Ctest\main.c; 16.44 undefined identifier "CP_OFF"Error   
[192] C:\project\pic\16F84A_Ctest\main.c; 17.1 undefined identifier "TRISB"Error   
[192] C:\project\pic\16F84A_Ctest\main.c; 21.1 undefined identifier "TMR0"Error   
[192] C:\project\pic\16F84A_Ctest\main.c; 23.1 undefined identifier "OPTION_REGbits"
[311] C:\project\pic\16F84A_Ctest\main.c; 16.49 closing quote expectedError   
[194] C:\project\pic\16F84A_Ctest\main.c; 18.1 ")" expectedError   
[312] C:\project\pic\16F84A_Ctest\main.c; 18.1 ";" expected



対処法は、プログラムの先頭に以下の一文を入れてください。

#include <htc.h>



また、特定の設定内容だけがエラーになる場合は、使用しているPIC該当の設定が使えないからです。
Cコンパイラのインストール先フォルダにあるincludeを開いて、その下の該当する.hファイルをチェックして、使える設定項目を確認します。


__CONFIG()についての詳細はこちらを参照してください。
[PIC]HI-TECH Cでコンフィギュレーションビットを指定する

[Amazon]携帯サイトで,マケプレの出品情報をチェックする

AmazonはPC向けサイトだと余計な情報が多いけど、携帯サイトは欲しいネタだけ簡潔にまとまっている。
携帯サイトはURLさえ指定すればPCからも閲覧可能。

URLの仕組み

まずは、マケプレの出品情報に関連するケータイサイトのURLを幾つか確認してみる。

商品ページ
http://www.amazon.co.jp/gp/aw/d/4094082190?qid=1348310068
※”gp/aw/d”をdpに変えると、pcサイトのページが閲覧できる。

マケプレの出品情報、新品+中古品
http://www.amazon.co.jp/gp/aw/d/4094082190?o=All&op=1

マケプレの出品情報、中古品:全てを見る
http://www.amazon.co.jp/gp/aw/d/4094082190?o=Used&op=1

マケプレの出品情報、中古品:全てを見る の2ページ目
http://www.amazon.co.jp/gp/aw/d/4094082190?o=Used&op=2


というわけで,ケータイサイトでマケプレの出品情報URLの規則は以下の通りになる

ベースURL
    "http://www.amazon.co.jp/gp/aw/d/" + asin
オプション
    o  :表示対象
        All :新品+中古品
        Used:中古品のみ
 
    op :ページ番号



ページネーション

“中古品:全てを見る”だと、10件/ページでページ分割される。

ページ中に以下の様なリンクがあれば、次ページ有り

<a href="/gp/aw/d/4094082190?o=Used&op=2">次へ</a>



あと、各ページのトップに以下のタグが有るので、総ページ数もここから分かる

<a name="Used">中古  11 - 20 / 354 </a>



HTMLの構造


ケータイサイトなので、タグの構造は非常にシンプル。
下記のキャプチャはfirebugで確認したもので、赤枠内のデータに対応するHTMLが下に枠で囲んである。

[Amazon MWS]GetLowestOfferListingsForASINオペレーションのFAQ

Amazon MWSの、商品APIセクションとして用意されているGetLowestOfferListingsForASINというAPIについての良くある質問とその回答です。

GetLowestOfferListingsForASINは何の情報を返すのか?


指定した商品のコンディション単位で、出品されている商品の最低価格を取得する
(コンディションを省略すると、全コンディションの情報が手に入る)

このAPIを使っても、出品者単位での情報を検索するは出来ない。

“商品のコンディション単位で”というのは、以下のカテゴリで分類される
コンディション,サブコンディション,出荷元,発送元の国,出荷までの時間,高評価の割合


上記カテゴリの高評価の割合というのはは、以下の7カテゴリに分類されている。

98-100%
95-97%
90-94%
80-89%
70-79%
70%未満
新規出品者



分類されたカテゴリ内に最低価格以外の出品者も存在するかどうかは、応答データのAllOfferListingsConsideredタグを見ると分かる(他の価格で出している人が有る場合はfalseになる)。


分類されたカテゴリ内に、何件の出品が有ったかは、NumberOfOfferListingsConsideredタグを見ると分かる。

同一価格の出品が複数有る場合は、MultipleOfferListingsAtLowestPriceタグの値がTrueになる

データは送料込みの総額が低い順でソートされている。

このAPIの呼び出し回数制限は?

最大リクエストクォータは、20リクエストで、回復レートは10商品/秒となっている。
また、一回のリクエストで10商品まで同時に検索可能です。


GetLowestOfferListingsForSKUの違いは?

以下の2点が違うだけで、ほかは同じ

MarketplaceIdとASI を指定する必要がある
SKUIdentifierの情報を返さない




GetLowestOfferListingsForASINで帰ってくる件数は?

最大20件の可変個


自己出品の情報(価格、出品数)を取るためには?

GetMyPriceForASINのAPIをコールする
※検索結果は基本的に自己出品データも含めて返される。自分を含めて欲しくない場合はExcludeMeオプションを付ける

Programmable XBee ProをX-CTUで設定する

XBeeのプログラム可能バージョンである”Programmable XBee Pro”を、X-CTUで設定しようとすると、手順どおり操作しようとしても正しく設定する事が出来ません。

X-CTUのテストボタンをクリックしても、以下のように文字化けしてしまいます。
ModemTypeすら取得できていません。


これは、Programmable版のXBeeには、プログラム可能なFreescaleのCPUと、無線通信を行うEmberのチップの2つが搭載されており、初期状態だとFreescaleに搭載されたブートローダが反応してしまうためです(Programmable版じゃない方はEmberのチップしか搭載されていません)。

XBeeの設定はEmberのチップに対して行うのですが、X-CTUはFreescaleのCPUが返事してくる事を想定していないため、工夫が必要になります。

Programmable XBee ProをX-CTUで使う

Programmable XBee Proを、X-CTUで使うには以下の手順で操作します。

まず、TeraTermなどの他のソフトが立ち上がってない事を確認します。

X-CTUを起動します(手元の環境ではVer5.2.7.5でした)。


デフォルトでは通信速度(Baud)が9600になっているので、115200に変更します。
(115200にするのは初回のみで、一度でも設定をwriteしたら、次からはSerial Interfacing->BaudRateで指定した値を指定します)


Terminalタブに移動し、AssrtからRTSのチェックを外します。


下にある白いエリアでEnterを押すと、以下の様なブートローダメニューが表示されます。


B-Bypass Mode
F-Update App
T-Timeout
V-BL Version
A-App Version
R-Reset
>



ここで”B”を入力した後、Enterを押します。
これで、FreescaleのCPUは反応しなくなり、EmberのRF制御用チップと対話出来る様になります。



PC Settingタブに戻り、Test/Queryボタンをクリックします。


以下のようにModem typeが表示されればOKです。



Modem Configrationタブに移り、Readボタンを押します。
ウィンドウの下部にXBeeの設定に内容が表示されます。



データを書き換えてWriteを行い、値が書き換わる事を確認します。
※設定を変更する前に、一旦ProfileのSaveを押して、現在の設定値をファイルに保存します。
※テスト的に書き換えるなら、Addressing->Desctination Address High辺りが無難です(通信相手のID指定です)。



購入したXBeeはデフォルトだとAPIモードでした。
Webの情報や入門書だと、ATモードである事を前提に書かれていることも多いので、ATモードに変更してみます。Function Setを”ZIGBEE ROUTER AT”に変更後,Writeをクリックします。
書き込みには時間が掛かるのでしばらく待ちます。


書き換えが終わるとATモードになるので、Terminalで”+++”を入力するとOKが返ってくるようになります。




一旦Bypassを選ぶと、その後はずっとEmberのチップとの対話になります。
再度FreescaleのBootloaderを操作したい場合は、XBeeをリセットすればOKです。リセットするにはピン5をLowにします(ピンピッチ変換基板にリセットスイッチがある場合はスイッチを押すだけです)。

これは逆に言うと、Programmer版XBeeは、起動するたびに”B”コマンドの入力が必要だということを意味しています。

以下の画像は、リセットをかけた後、BootloaderからBypassを選択し、ATコマンドで自分のIDを表示させたものです。


XBee設定ソフトの「X-CTU」をインストールする

前回の作業で、XBeeとシリアル通信できるところまで確認しました。
PCからXBeeへ接続をXBeeエクスプローラ無しで行う


XBeeは買った状態では使用できず、初期設定を行う必要があります。
初期設定はATコマンドで行う事も可能なのですが、最初は製造元のdigi社が提供しているGUIツールのX-CTUを使うと楽チンです。

というわけで、今回はX-CTUのインストールと動作確認を行います。

X-CTUのインストール


下記のページにアクセスします。
X-CTU Software – Drivers – Digi International


ページ下部の”Diagnostics, Utilities and MIBs”をクリックし、表示されたメニューから、”XCTU 32-bit ver. 5.x.x.x installer”ををダウンロードします。
説明には、64bitのOSはサポートしないと書かれていますが、Win7のx64で確認したところ問題なく使用できました。



ダウンロードしたらセットアップのプログラムを実行します。
ウィザードが表示されるのでNextをクリックします。


ライセンス表示です。I Agreeを選択後Nextをクリックします。


必要があればインストール先を変更し、Nextをクリックします。



最終確認画面です。Nextをクリックするとインストールが始まります。


暫く待ちます…



すると、最新のファームウェアをダウンロードするかという確認が出るので、はいをクリックします。


最新ファームのダウンロード中です。かなり時間が掛かるので気長に待ちます。



完了すると、ダウンロードされたファームの一覧が表示されるので、OKをクリックします。


Closeをクリックします。

これで、インストールは完了です。


X-CTUの動作確認

次に簡単な動作確認を行います。
デスクトップにX-CTUというアイコンが追加されれるので、起動します。

PC SettingsタブのTest/Queryボタンをクリックします。


以下のように、ModemTypeが表示されればOKです。



※Programmable XBee Proを購入した場合は、ここでエラーが出ます。
 この場合の対処法は、下記のページを参考にしてください。
 Programmable XBee ProをX-CTUで設定する

X-CTU:トラブルシューティング

X-CTUのTest/Queryで、ありがちなエラーとその対処法です。

Action Requiredのダイアログが出る
リセットボタンがあれば押してください。無ければPin5を1秒ほどGNDに直結します。
これでもダメなら、USBケーブルを刺したままXBeeを外し再度接続してみます。


Unable to open portと出る
ケーブルが刺さっているか確認してください。


Programmable XBee Proで、確認メッセージのModemTypeがunnknownになる
追加の作業が必要です。こちらの記事を参考にしてください。



「Ctrl+Maj+Gauche」は、Ctrl+Shift+左矢印の意味(フランス語キーボード)

とあるソフトを使ってたら、Ctrl+Maj+Gaucheの謎のショートカットキーが出てきました。


フランス製のソフトらしく、調べたらCtrl+Shift+左矢印のフランス語表記らしいです。


調べていて驚いたのは、フランスではキーボード配列がqwertyじゃなくってazrty配列がスタンダードらしいです。実際のキーは以下のようになっており、Q/WのキーがAZと入れ替わってます。 あとMのキーもLの右に移動してます。

この配列は他に、ベルギーと、カナダのケベック州(の内フランス語を話す人)で採用されています。
カナダはなぜケベック州だけかというと、ケベックは昔フランスの植民地だったことが影響していて、カナダ内でもケベック州だけがフランス語のみを公用語としています。


気になったついでに、せっかくなんで他のキーが何と表記されているのかを調べてみました。

フランス語	   対応するキー
-----------    --------------
Echap          Esc
Tabulation     Tab
Alt            Alt
Controle       Ctrl
Gauche         Shift
Entree         Enter
Ret.Arr.       BackSpace
Verr.Maj.      Caps Lock
 
Gauche         左矢印
Droite         右矢印
Haut           上矢印
Bas            下矢印
 
Impr Ecran     PrintScreen
Arret defil    ScrollLock
Pause Attn     Pause
 
Inser          Insert
Suppr          Delete
Début          Home
Fin            End
PgePréc        Page Up
PgeSuiv.       Page Down
 
Verr Num       NumLock



こっちはダイアログのボタンです。

Oui            はい
Non            いいえ



キーボード配列QWERTYの謎

PCからXBeeへ接続をXBeeエクスプローラ無しで行う

前回書いたようにXBeeを購入したのですが、XBeeエクスプローラが在庫無しだった為に手に入れることが出来ませんでした。

XBeeだけでは何の意味も無いし、在庫が戻るまで待つのも時間が勿体ないところです。
という事で、手持ちのアイテムで何とか乗り切ってみました。


まずはXBeeがどうやってPCと通信しているか、データシートでチェックします。

2章のRF Module Operationを見ると設定はシリアルで行うらしいです。
また、XBee側は2.8~3.4Vな必要がある事が分かります。


USB接続のRS-232Cケーブルが有るのですが、これは-15V~15Vと電圧レベルが違うので使えません。
B007SI18YO


シリアル関係だと、他には秋月のFT2232キットを持っています。
こちらも利用出来るのだろうかと調べてみたら、どうやら使えそうです。

このキットは5V駆動なのですが、ジャンパを設定した上で3.3Vの外部電源を入れると、3.3V動作させることが可能です。
FT2232D USB-シリアル2ch変換モジュール: 組み立てキット



というわけで、早速使ってみます。
手元のデバイスは、チャンネルB側を232UARTモードとして設定済みです。

まずはJP2Bのジャンパを外します。外すと、ピン17のVCCIOBへ電源が供給されなくなります。
VCCIOBのピンは,チャンネルB側の電源供給です

USBからの+5Vがピン16のVCCSWに来ているので、レギュレータで3.3Vに落とした後、ピン17に3.3Vを供給します。
すると、チャンネルBのTxD,RxD(それぞれピン13,14)が3.3V駆動になります。



ここまで出来たら、一旦単体でテストしてみます。
まずピン13と14をショートさせます。
ハイパーターミナルやTeraTermなどのターミナルで、COMポートにアクセスし、入力文字がエコーバックされてくるのを確認します(TXDで送ったデータをRXD経由でそのまま受信しています)。
ピン13と14の接続を切ると、エコーバックがなくなればOKです。

確認できたら、ピン13と14をショートさせていた線を外します。



次はいよいよXBeeとの接続です。
以下のように、FT2232からXBeeへの接続を行います。

XBeeのピン	FT2232のピン
 1:Vcc		17:VCIOB(3.3V)
 2:TxD		12:RxD
 3:RxD		13:TxD
10:GND		15:GND


見づらいですが、ブレッドボードだと以下の様な感じになります。


上から見た全体図はこんな感じ




これで再度ターミナルより確認を行います。

“+++”と入力してから、2秒ほど待って”AT”と入力します。
手元の環境だとAを入力した時点で、Unknownというエラーが返って来ましたが、XBeeより反応は有るので一旦OKとします。Unknownとなる理由は後で確認します。


追記:Unknownとなる理由について
Programmable XBee Proの場合は、最初にアルファベットの”B”を入力する必要があるようです。理由はこちらの記事に書いたので参考にして下さい。本問題はProgrammableなXBeeだけで発生します。



ここまで出来たら、次はXBeeの設定ツールを使って作業します。

エラー:”名前空間マネージャまたは XsltContext が必要です” が出た時の対処法

表示されたエラーメッセージ

名前空間マネージャまたは XsltContext が必要です。
このクエリには、プレフィックス、変数、またはユーザー定義の関数があります




Namespace Manager or XsltContext needed. 
This query has a prefix, variable, or user-defined function.




エラーが発生したプログラム

XmlNamespaceManager xmlnsManager;
XmlDocument         xmlDoc = new XmlDocument();
 
xmlDoc.Load( "test.xml" );
 
xmlnsManager = new XmlNamespaceManager( xmlDoc.NameTable );
xmlnsManager.AddNamespace("ns", "http://mws.amazonservices.com/schema/Products/2011-10-01");
 
// ここで例外が発生する
XmlNodeList offerNodeList = xmlDoc.SelectNodes( "/ns:Product/ns:Price" );



理由
xpathのクエリにネームスペースを付与しているが、NamespaceManagerが指定されていない


対処方法
SelectNodes()メソッド実行時に、XmlNamespaceManagerを引数で渡す

XmlNodeList offerNodeList = xmlDoc.SelectNodes( "/ns:Product/ns:Price" );
    ↓
XmlNodeList offerNodeList = xmlDoc.SelectNodes( "/ns:Product/ns:Price", xmlnsManager );

XBee用のピッチ変換基板を組み立てる

今回購入したXBeeピッチ変換基板は、ピンの半田付けが必要なものなので早速取り付けていきます。
ピッチ変換の基板は、スイッチサイエンスから販売しているSparkFun製のもので、型番は”SSCI-KIT-XBSOCKET”です。


購入した商品は、基板のほかにXBeeからのソケットと、ブレッドボードに刺す為のヘッダピンが同梱されています。


まずは、上側のソケットを付けていきます。
ソケットをつけた状態で裏返して半田付けします。

ソケットが浮いてしまうとXBeeが刺さらなくなってしまうので注意します。
まず、赤枠で囲んだ両端のピンを先に半田付けしておき、ソケットが浮いていないか確認します。浮いている場合は、半田を溶かしながらソケットを押し込んで修正してください。

ちゃんと並行になったら他のピンも全部半田付けします。


次は、ブレッドボードに指すヘッダピンを半田付けします。
ヘッダピンは多めに用意されているので、10ピンを2つニッパーで切り分けます。


10ピンのヘッダを作ったらソケットと同様に半田付けします。


全てのピンをつけ終わったら、ソケットにXBeeが刺さるかと、ピンヘッダがブレッドボードに刺さるかをチェックします。




ちなみにブレッドボードに刺した時の隙間は5マス(0.5inch)でした。



この変換基板ですが、ほかにコンデンサ、LED、抵抗を刺す為の穴が開いています。
(作業前に写真を撮り忘れてしまったので、コンデンサだけ取り付け済みです)

これらの部品は同梱されていませんが、コンデンサは取り付けが必須で、インジケータ用のLEDと抵抗はお好みで取り付けます(省略する事も可能)。


コンデンサはノイズ除去用です。
容量が0.1uF(104と印字されたもの)のコンデンサをつけます。0.1uFのコンデンサはよく使用するので、電子工作をするならまとめ買いしておいたほうが良いです。


コンデンサの足が曲がった状態だと幅が広すぎるので、ニッパーでまっすぐにしてしまいます。




LEDは、上から見て左側がpin13,右側がpin16につながっています。
pin13はON/SLEEPに接続されて折り、電源ONの時に点灯します。
pin15はASSOC/DIO5で、XBeeがネットワークと接続している時に点滅、それ以外の時は点灯します。

LEDはスペース的には5φものでも刺さりますが、基板に対して大きすぎるので不恰好になります。
出来れば3φのを用意しておいた方が良いです。

5φをつけた状態。かなり大きいです。


3φをつけた状態。これなら何とか許せるレベル。


手元にあった一番小さいLED


3つの大きさ比較です。


LEDの足には向きがあります。
上側(基板の端側)がGNDなので、足が短いほうのカソード側になります。



LEDをつけるたら、コンデンサの下に抵抗を付けます。
抵抗値は、3.3V駆動なので470Ωぐらいのモノをつけておけば良いでしょう(470Ωで7mAです)。小さいLEDをつけた場合は流せる最大電流が小さくなるので、データシートを確認して大き目の抵抗値にします。

物理的なサイズは1/4Wのものだとに大きすぎるので、もっと小さいのが必要です。
1/4Wを基板に置いてサイズ比較してみました。

抵抗をつけたら、下にあるパターンをショートさせるとpin13/15からLEDまでの回路がつながります。

前述したように抵抗とLEDは接続しなくても動作しますが、有ると状態が分かるので便利です。


ここまで作業したら完成です。




おまけ。
同じのを2つ作るのですが、2つ目で失敗してしまいました…
ソケットの両端だけ半田してXBeeが刺さるか確認した後、XBeeを抜いたらピンが折れてしまいました。

2mmのピッチのソケットの予備は手元に無かったので、スズめっき線を挟み込んで応急処置しました。半田付け後テスタで確認したのですが、ちゃんと通電しているみたいなので一旦この状態で様子を見る事にしておきます。


目で見てわかるはんだ付け作業


組み立てが終わったら、PCとXBeeをシリアルで接続し対話が出来る事を確認します。
XBeeエクスプローラがあればUSB接続するだけなのですが、今回XBeeエクスプローラが在庫切れで変えなかったので、ひと工夫をします。
PCからXBeeへ接続をXBeeエクスプローラ無しで行う « nanoblog

XBee-PRO ZBを購入しました

前回調べたXBeeを実際にAmazonで購入しました。

購入したのは以下の商品です。
XBeeピッチ変換基板とソケットのセット × 2個
Programmable XBee-PRO ZB / ワイヤアンテナ型 × 2個

本体のXBee方は、”Programmable” XBee-PRO ZBだと基板内にプログラムも書き込めるらしく、将来遊べそうなのでこちらを購入しました。純粋にワイヤレス通信がしたいだけならProgrammableじゃないほうを買えば500円安いです。

変換基板の方はAmazonで見ると送料180円と書いてありますが、合計で3000円以上買うと送料無料になるそうで、合計金額は 3300*2+400*2の計7400円でした。


本当はUSBエクスプローラも一緒に買いたかったのですが、こちらは在庫が無く購入できませんでした。
B0079DM572
XBeeエクスプローラUSB

マーケットプレースでの購入になるので、商品はスイッチサイエンスからの配送です。
13日の夜に注文したら、メール便速達で15日に届きました。
メール便で配送可能な上限である2cm厚の箱で梱包されています。


箱を開けた状態です。
写真では分かりませんが、両面テープで動かないように固定されています。
XBeeのアンテナが折れ曲がってますが、アンテナはしっかりしたつくりなので問題ありません。



変換基板は半田付けが必要なので、早速こちらから作っていきます。
 XBee用のピッチ変換基板を組み立てる


ZigBeeセンサーネットワーク
Excelを用いた計測制御入門 ZigBeeによる無線制御の基礎