Digisparkでマウス&キーボード [Arduino]
スーパーファミコンのコントローラーでマウスポインターの操作とマルチメディアキーの操作をしてみる。
調べてみると、同時に使えるライブラリーがあるらしい。
GitHub - adafruitAdafruit-Trinket-USB Arduino libraries allowing Trinket to act as USB devices
https://github.com/adafruit/Adafruit-Trinket-USB/

「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 + ←」で代用は可能かも。
スケッチは以下のとおり。
・TrinketHidComboのライブラリを使用した。
・コントローラーが外れていてもおかしなことにならないようにした。
(DATA1のピンをINPUT_PULLUPにした)
・ボタンの状態を、符号なし16bit整数型をやめて配列に入れた。
(メモリの無駄だけど操作が楽に)
・最後のTrinketHidCombo.poll() (あるいはpressとか)を最低10msecごとに呼び出さないといけないって書いてあった。
調べてみると、同時に使えるライブラリーがあるらしい。
GitHub - adafruitAdafruit-Trinket-USB Arduino libraries allowing Trinket to act as USB devices
https://github.com/adafruit/Adafruit-Trinket-USB/

「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
2022-05-22 02:51
nice!(0)
コメント(0)
コメント 0