PICに内蔵されているUSB機能の実験パート6
(HIDクラスのマウスとジョイスティック関連メモ)

〔パート1〕 〔パート2〕 〔パート3〕 〔パート4〕 〔パート5〕 〔マイコンのトップに戻る〕


前頁のパート5でHIDクラスのキーボードについて記載しました。
ここのパート6で、マウスジョイスティックについてのメモを記載して置きます、
なのでその他基本の話はパート5をまず読んで下さい。
尚、ここの記述内容での実験は行っていないです、間違いがあるかもね。

"v2016-11-07"バージョンのUSBフレームワークではXC8に対応しました。 *1)

《マウス》

"v2016-11-07"バージョンのデモプログラムのプロジェクトフォルダーは、
"C:\microchip\mla\v2016_11_07\apps\usb\device\hid_mouse\firmware\ low_pin_count_usb_development_kit_pic18f14k50.x"に有るのでMPLAB Xでプロジェクトを開きましょう。
尚、PIC16F1459用は"low_pin_count_usb_development_kit_pic16f1459.x"に有ります。 *1)


ここのマウスメモは、[microchip_solutions_v2013-02-15]ライブラリの中の
USB”フォルダー内に有る”Device - HID - Mouse\Firmware\USB Device - HID - Mouse
- C18 - Low Pin Count USB Development Kit.mcp
”のプロジェクトファイル内容で書いています。

マウスデータを送る場合

記述して有るファイルは"mouse.c"です
     unsigned char hid_report_in[3] ;

     hid_report_in[0] = 0 ;   // bite[0][0][0][0][0][Button3][Button2(右)][Button1(左)]
     hid_report_in[1] = 0 ;   // X-Vector -127〜127 X軸(左→右へ移動すると報告値は正で逆は負)
     hid_report_in[2] = 0 ;   // Y-Vector -127〜127 Y軸(上→下へ移動すると報告値は正で逆は負)

     // データの送信(3バイト)
     lastINTransmission = HIDTxPacket(HID_EP, (BYTE*)hid_report_in, 3);
 X軸/Y軸のデータは、前回の送信したデータからの変化分を報告します。
 それは、レポートディスクリプタで
  0x81, 0x06, /* Input (Data, Variable, Relative) */
 と3ビット目が"Relative(相対)"となっている為です。

 マウスが動作していない時でもデータを送らないとダメみたいです。


ディスクリプタ

これは全てのUSB機器が必ず持っていないとならない情報で、機器のクラス情報やベンダー情報に
通信する為の情報などです、接続時にホストから問い合わせ(GET_DESCRIPTOR)が有ります。

ここのプログラムでディスクリプタを記述してあるファイルは、"usb_descriptors.c"です。
内容については、「SyncHackのUSB/Descriptor」や こちらのPDF「4.USBデバイスの論理的構造とディスクリプタ 9頁」を見て下さい。
また、キーボードやマウス関連のディスクリプタは、「人と電子工房」さんのこちらも参照下さい。

ディスクリプタ構成図(マウス)

[レポートディスクリプタ]

下記の様に記述すればX軸/Y軸の移動量を12ビットで行う事も出来ます。

    0x05, 0x01,       /*      Usage Page (Generic Desktop)        */
    0x09, 0x30,       /*      Usage (X)                           */
    0x09, 0x31,       /*      Usage (Y)                           */
    0x16, 0x01, 0xF8, /*      Logical Minimum (-2047)             */
    0x26, 0xFF, 0x07, /*      Logical Maximum (2047)              */
    0x75, 0x0C,       /*      Report Size (12)                    */
    0x95, 0x02,       /*      Report Count (2)                    */
    0x81, 0x06,       /*      Input (Data, Variable, Relative)    */
また、ホイールを使用する場合は、
    0x05, 0x01, /*      Usage Page (Generic Desktop)        */
    0x09, 0x30, /*      Usage (X)                           */
    0x09, 0x31, /*      Usage (Y)                           */
    0x09, 0x38, /*      Usage (Wheel)                       */
    0x15, 0x81, /*      Logical Minimum (-127)              */
    0x25, 0x7F, /*      Logical Maximum (127)               */
    0x75, 0x08, /*      Report Size (8)                     */
    0x95, 0x03, /*      Report Count (3)                    */
    0x81, 0x06, /*      Input (Data, Variable, Relative)    */

と記述を変更して
     hid_report_in[3] = 0 ;   // Wheel -127〜127 ホイール(遠→近へ移動すると報告値は負で逆は正)
4バイトデータにしてホストに送信すればOKと思います。

《ジョイスティック》

"v2016-11-07"バージョンのデモプログラムのプロジェクトフォルダーは、
"C:\microchip\mla\v2016_11_07\apps\usb\device\hid_joystick\firmware\ low_pin_count_usb_development_kit_pic18f14k50.x"に有るのでMPLAB Xでプロジェクトを開きましょう。
尚、PIC16F1459用は"low_pin_count_usb_development_kit_pic16f1459.x"に有ります。 *1)


ここのジョイスティックメモは、[microchip_solutions_v2013-02-15]ライブラリの中の
USB”フォルダー内に有る”Device - HID - Joystick\Firmware\USB Device - HID - Joystick
- C18 - Low Pin Count USB Development Kit.mcp
”のプロジェクトファイル内容で書いています。

ジョイスティックデータを送る場合

記述して有るファイルは"main.c"です
     typedef union _INTPUT_CONTROLS_TYPEDEF {
         struct {
             struct {
                 BYTE square:1;         // Button1(1 bit  0 or 1)
                 BYTE x:1;
                 BYTE o:1;
                 BYTE triangle:1;
                 BYTE L1:1;
                 BYTE R1:1;
                 BYTE L2:1;
                 BYTE R2:1;
                 BYTE select:1;
                 BYTE start:1;
                 BYTE left_stick:1;
                 BYTE right_stick:1;
                 BYTE home:1;           // Button13
                 BYTE :3;               // 予備
             } buttons ;                // ボタンの構造体(2 Byte)
             struct {
                 BYTE hat_switch:4;     // (7-315)
                 BYTE :4;               // 予備
             } hat_switch;              // ハットスイッチの構造体(1 Byte)
             struct {
                 BYTE X;                // X方向の線形変換(0-255:左→右へ移動すると報告値が増加する)
                 BYTE Y;                // Y方向の線形変換(0-255:遠→近へ移動すると報告値が増加する)
                 BYTE Z;                // Z方向の線形変換(0-255:高→低へ移動すると報告値が増加する)
                 BYTE Rz;               // Z軸周りの回転を制御する(0-255)
             } analog_stick;            // スティックの構造体(4 Byte)
         } members;
         BYTE val[7];
     } INPUT_CONTROLS joystick_input ;

     // ボタンデータ(ON=1 OFF=0)
     joystick_input.members.buttons.square = 0;
     joystick_input.members.buttons.x = 0;
     joystick_input.members.buttons.o = 0;
     joystick_input.members.buttons.triangle = 0;
     joystick_input.members.buttons.L1 = 0;
     joystick_input.members.buttons.R1 = 0;
     joystick_input.members.buttons.L2 = 0;
     joystick_input.members.buttons.R2 = 0;
     joystick_input.members.buttons.select = 0;
     joystick_input.members.buttons.start = 0;
     joystick_input.members.buttons.left_stick = 0;
     joystick_input.members.buttons.right_stick = 0;
     joystick_input.members.buttons.home = 0;

     // ハットスイッチ(0:北 1:北東 2:東 3:南東 4:南 5:南西 6:西 7:北西 8:デフォルト)
     joystick_input.members.hat_switch.hat_switch = 0x2 ;   // 東

     // スティックデータ(0-255で0x80が真ん中のデフォルト)
     joystick_input.members.analog_stick.X = 0;
     joystick_input.members.analog_stick.Y = 0;

     // データの送信(7バイト)
     lastTransmission = HIDTxPacket(HID_EP, (BYTE*)&joystick_input, sizeof(joystick_input));

ディスクリプタ

ディスクリプタ構成図(ジョイスティック)

このディスクリプタにはEP1 OUTのエンドポイントが作成されているが、"Device - HID - Joystick"では
使用されていない、ジョイスティックでホストから報告を受ける場合って....ん、思い浮かばない。
尚、フォースフィードバック機能はHIDクラスではなく[Physical Interface Device (PID)]クラスの
ジョイスティックの様で有る。

《その他》

USB仕様はUSBインプリメンターズ・フォーラム(USB-IF)のこちらを参照下さい。
各デバイスクラスのドキュメントはUSB−IFのこちらを参照下さい。 *1)



"v2016-11-07"用記事とリンク切れ見直し(*1) 2017/01/22


【きむ茶工房ガレージハウス】
Copyright (C) 2006-2017 Shigehiro Kimura All Rights Reserved.