2013年2月20日水曜日

Arduino Leonardo から PS3 を操作する

今回の内容はLeonardo系限定のお話である。
Leonardoでの新機能である汎用HIDでPS3を操作しようというもの。
使用部品点数を極限まで減らすため、最低ジャンプワイヤー(4束or4本)のみで動きます。おまけでLEDあればピカピカするかもしれない(何

今回の使用パーツは下記の通り。

  • プログラミング用の開発環境 with Arduino IDE
  • Arduino Leonardo もしくは互換品(今回はFreaduino Leonardo使用)
  • オス-オスのジャンプワイヤー 4本(今回は4本束のものを使用)
  • 多分あると思うのでLED(無くても動作可能)

以上である。なんという少なさ。どうやって操作するんだという疑問は下記の通り。

操作方法は、『ジャンプワイヤーに触れると動く』、簡単。
ただし、生体電気(静電容量)を扱う為、気温や環境、人によって動作はまちまちになる可能性が高い。必要であれば調整すべし。適当に…。
※ちなみに3.3V駆動で試したため、5Vの場合リファレンスが変わるので弄る必要性高。

配線は、D13ピンと隣のGNDにいつものようにLED。A0からA3までをジャンプワイヤーで繋げ、反対側は未接続にする。ここを人が触れると反応する。A0が上、A1が下、A2が左、A3が右に矢印キーが押される。同時には操作不可。

以下ソースコード。物凄く見づらくて酷いが気にしない。

int e0, e1, e2, e3;
unsigned int c0, c1, c2, c3, count;

void setup()
{
//  Serial.begin(9600);
  c0 = c1 = c2 = c3 = 0;
  count = 8;
}

void loop()
{
  e0 = analogRead(0);
  e1 = analogRead(1);
  e2 = analogRead(2);
  e3 = analogRead(3);
  
  if (e0 == 0x3FF) c0++; else c0 = 0;
  if (e1 == 0x3FF) c1++; else c1 = 0;
  if (e2 == 0x3FF) c2++; else c2 = 0;
  if (e3 == 0x3FF) c3++; else c3 = 0;
  
  if (count++ >= 6) {
    if (c0 % 10 == 9) {
//      Serial.println("A0 hit! 0");
      Keyboard.press(KEY_UP_ARROW);
      count = 0;
    } else if (c1 % 10 == 9) {
//      Serial.println("A1 hit!  1");
      Keyboard.press(KEY_DOWN_ARROW);
      count = 0;
    } else if (c2 % 10 == 9) {
//      Serial.println("A2 hit!   2");
      Keyboard.press(KEY_LEFT_ARROW);
      count = 0;
    } else if (c3 % 10 == 9) {
//      Serial.println("A3 hit!    3");
      Keyboard.press(KEY_RIGHT_ARROW);
      count = 0;
    }
    if (count == 0) digitalWrite(13,HIGH);
    delay(20);
  } else if (count == 4) {
    Keyboard.releaseAll();
    digitalWrite(13,LOW);
    delay(20);
  } else delay(20);
}

コメントアウトされている部分を外すと、触れて反応したときにシリアル通信でデバッグができる。というかデバッグ時の名残。(Leonardo以外でもここは動作可能)

基本的な手法としては、一定以上の電圧が検出され、維持されると「操作した」と認識する。そうすると、Leonardoの新機能であるKeyboardクラスを用いて、USB接続先のホストに矢印キーの操作が渡る。

Keyboardクラスは汎用ヒューマンインタフェースと呼ばれる一般的なキーボードと同じ扱いが可能であるため、PS3やXbox360、その他USBでキーボード接続できる多くの機器で動作可能と思われる。試したのはMacBook AirとPS3のみ。

他の人にも試してもらったが、同じ環境下ではたいてい動く模様。
ちなみにだが、0V(GND)になる伝導体に体が触れていてはいけない。例えばMBAはアルミで覆われているが、GNDになっているため、触れた状態だと操作できない。

またもや画像の少ない…むしろ存在しないという記事で分かりづらい…。
ひとまず以上。多分そこまで興味ある人は少ない…?入手性の問題もあって。

そのうちUnoとかでのHIDのやり方とかも書くかも。(ATtinyとか)

0 件のコメント:

コメントを投稿