SSブログ

Digisparkでマウス&キーボード [Arduino]

スーパーファミコンのコントローラーでマウスポインターの操作とマルチメディアキーの操作をしてみる。

調べてみると、同時に使えるライブラリーがあるらしい。

GitHub - adafruitAdafruit-Trinket-USB Arduino libraries allowing Trinket to act as USB devices
https://github.com/adafruit/Adafruit-Trinket-USB/

adatriusblib.png

「Code ▼」をクリックして「Download ZIP」で保存。
その中の「TrinketHidCombo」というフォルダをフォルダごと、スケッチブックの保存場所(環境設定で指定のところ)にある「libraries」というフォルダ内にコピーするだけらしい。

環境設定をいじってなければ、以下のフォルダ。
%userprofile%\Documents\Arduino\libraries

十字キーでマウスのカーソル操作。Y, Bボタンでクリック。
X, Aボタンでの音量の操作もできるようになりました。
ブラウザ等の「戻る」ボタンも欲しいと思って調べてみると、

HID Usages and Descriptions - hut1_3_0.pdf
https://www.usb.org/sites/default/files/hut1_3_0.pdf

これ(↑)の p.130 の 「0x0224 AC(Application Control) Back」っぽい。
でも、pressMultimediaKey()関数の引数が「uint8_t (符号なし8bit整数型)」なので無理。
ただ、「Alt + ←」で代用は可能かも。

スケッチは以下のとおり。
// SFC(SNES) controller to HID            //     _______________+----- GND   (Brown)
//   digispark(USB 16.5MHz) Trinket Lib.  //    |_O_O_O_O_|_O_O_O_)          connector
#define DAT   0                           //      | | | +------------> DATA1 (Red)
#define PS    1                           //      | | +--------------< P/S   (Orange)
#define CLK   2                           //      | +----------------< CLK   (Yellow)
#include "TrinketHidCombo.h"              //      +------------------- VCC   (White)

void setup() {
    pinMode( DAT, INPUT_PULLUP );
    pinMode( PS , OUTPUT );
    pinMode( CLK, OUTPUT );
    digitalWrite( CLK, HIGH );
    TrinketHidCombo.begin();
}

void loop() {
    uint8_t sfc[12];
    digitalWrite( PS , HIGH );
    digitalWrite( PS , LOW  );
    for(uint8_t i=0; i<12; i++) {
        sfc[i] = digitalRead( DAT )^1;
        digitalWrite( CLK, LOW  );
        digitalWrite( CLK, HIGH );
    }   // 0:B, 1:Y, 2:SEL, 3:STA, 4:UP, 5:DOWN, 6:LEFT, 7:RIGHT, 8:A, 9:X, 10:L, 11:R
    TrinketHidCombo.mouseMove(
      ( sfc[ 7] - sfc[ 6] ) <<2 ,  ( sfc[ 5] - sfc[ 4] ) <<2 ,          // cross key:mouse cursor
        sfc[ 0] * MOUSEBTN_RIGHT_MASK + sfc[1] * MOUSEBTN_LEFT_MASK  ); // Y:left, B:right click
    if( sfc[ 8] ) TrinketHidCombo.pressMultimediaKey( MMKEY_VOL_DOWN ); // A:Volume Down
    if( sfc[ 9] ) TrinketHidCombo.pressMultimediaKey( MMKEY_VOL_UP   ); // X:Volume Up
    delay(10);
    TrinketHidCombo.poll();         // do nothing, check if USB needs anything done
    delay(10);
}

・TrinketHidComboのライブラリを使用した。
・コントローラーが外れていてもおかしなことにならないようにした。
  (DATA1のピンをINPUT_PULLUPにした)
・ボタンの状態を、符号なし16bit整数型をやめて配列に入れた。
  (メモリの無駄だけど操作が楽に)
・最後のTrinketHidCombo.poll() (あるいはpressとか)を最低10msecごとに呼び出さないといけないって書いてあった。
タグ:Digispark
nice!(0)  コメント(0) 

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。