Leonardoでリモコンを流用する

[以下の話はatmega32u4ベースのArduino Leonardo限定で他のArduinoでは使えません]
Arduino LeonardoにはHID キーボード、マウスの機能が追加されたので、自動で絵を書くものとか面白い使い方がある。
Mac miniではapple remoteが使えるが、MacBookAirでは使えないことにふと気付いた。
まず家電のリモコンをArduinoとかでまとめたいと思って、赤外線のデコードについて調べていたのだが、
プレゼンとかで次に進むのをリモコンでやりたいなと思ったところ、Leonardoを使えば簡単にできることに気付いた。
IRremoteというライブラリのおかげもあって30分くらいでやりたいことのプロトタイプはできた。

赤外線リモコンコードの解析

そもそも赤外線リモコンは何をしているかというと、赤外線LEDをチカチカさせているだけだ。
ただ、自然光で誤動作しないために38kHzのキャリア周波数に乗せている。
以下に方式の解説がある。
http://www.256byte.com/remocon.htm

普通の赤外線LEDにリモコンを向けて信号を送っても起電力が生じて波形を見ることはできる。


これをバンドパスフィルターに通すことで復号することもできるが、
秋月で復号モジュールが100円以下で買えるのでこれを使う。
http://akizukidenshi.com/catalog/g/gI-00622/
1: 5V
2: GND
3: VOUT
で3の電圧を見ればON/OFFのシーケンスになっている。

IRremoteライブラリの完成度が高いので、もう自分で書くのはやめてしまったが、
自分で最初から理解しようと思ったら、AdafruitのLearning Systemがおすすめ。
http://learn.adafruit.com/ir-sensor/overview

IRremote library

https://github.com/shirriff/Arduino-IRremote
ダウンロードしてlibrariesフォルダに入れる。
コードを調べるにはexamples/IRrecvDumpを動かすとシリアルモニタに
方式と復号化されたコードを表示する。
自分の家にあるリモコンのコードの多くはNEC方式だったが、たまに変なものもあった。

既存のリモコンを使ってPCの特定の機能をこれで動かせる。
あとはどのボタンを押したかを判別して、それに応じたキーシーケンスをLeonardoにしゃべらせればよい。

LeonardoのHID Keyboard

Leonardoでのキーボードのキーコード一覧は
http://arduino.cc/en/Reference/KeyboardModifiers
にあり、ファイルとしては
hardware/arduino/cores/arduino/USBAPI.h
に定義がある。

Preview.appでフルスクリーンにするためには
^+cmd+F を押せばよいので、

Keyboard.press(KEY_LEFT_CTRL);
Keyboard.press(KEY_LEFT_GUI);
Keyboard.press('f');
delay(100);
Keyboard.releaseAll();

とする。releaseしない限り同時押しとなる。

プレゼン用リモコンにする



最初にやりたかったことは、
1. Preview.appをフルスクリーンにする
2. 前に進む
3. 後ろに戻る
の3つだけで、apple remoteの
1. PLAY/PAUSE
2. next
3. back
に割り振った。
まだボタンが余っているので、PowerPointでも使えるように、
+ : 始めからスライドショー
– : ここからスライドショー
menu: ESCでスライドショーを中止
とした。
たまたまapple remoteがあったので、これにしたが、
家庭用の他のリモコンも使える。
DEBUGを1にしてシリアルコンソールを起動し、リモコンのボタンを押すと、
キーコードが表示される。
そのコードを自分が使いたい機能 CODE_UPなどに割り振るだけ。
パナソニックの家庭用シーリングライトのリモコンでも同じことができることを確かめた。

追加したい機能があれば、キーボードショートカットを調べ、
そのための関数を作って、リモコンのコードと対応させてやればよい。

ここでは特殊な目的に特化したが、矢印キーなどキーボードのキーそのものであればWindowsでも使えるが、
ショートカットなどはOSに依存してしまう。

// apple remote for MacBookAir(MacOSX)                                          
// 1) play/pause button to fullscreen                                           
// 2) >>| button to next page                                                   
// 3) <<| button to previous page                                               

// decoded code for apple remote                                                
#define CODE_UP   (0x77E1D0D4)
#define CODE_DOWN (0x77E1B0D4)

#define CODE_NEXT (0x77E1E0D4)
#define CODE_BACK (0x77E110D4)
#define CODE_PLAY (0x77E120D4)
#define CODE_MENU (0x77E140D4)

// panasonic ceilling light remote controller                                   
//#define CODE_NEXT (0xF6B92168)                                                
//#define CODE_BACK (0xA2768C92)                                                
//#define CODE_PLAY (0xCA21A230)                                                
//#define CODE_MENU (0x1B9C2A92)                                                

#define DEBUG (1) // set 1 to Serial debug                                      

#include <IRremote.h>

int RECV_PIN = 11;
IRrecv irrecv(RECV_PIN);
decode_results results;

// keycodes are defined in hardware/cores/arduino/USBAPI.h                      
char cmdKey   = KEY_LEFT_GUI; // COMMAND KEY for macosx                         
char ctrlKey  = KEY_LEFT_CTRL;
char leftKey =  KEY_LEFT_ARROW;
char rightKey = KEY_RIGHT_ARROW;
char shiftKey = KEY_LEFT_SHIFT;
char enterKey = KEY_RETURN;
char escKey   = KEY_ESC;

void setup()
{
  irrecv.enableIRIn();// start the IRreceiver                                   

  if (DEBUG) {
    Serial.begin(9600);
    delay(1000);
    Serial.println("IR sensor start");
  }
  Keyboard.begin();
}

void ppt_slideshow()
{
  // to use with PowerPoint                                                     
  // shift+cmd+enter: slideshow from the begininng                              
  Keyboard.press(shiftKey);
  Keyboard.press(cmdKey);
  Keyboard.press(enterKey);
  delay(100);
  Keyboard.releaseAll();
}

void ppt_slideshow_here()
{
  // to use with PowerPoint                                                     
  // cmd+enter      : slideshow from this page                                  
  Keyboard.press(cmdKey);
  Keyboard.press(enterKey);
  delay(100);
  Keyboard.releaseAll();
}
void fullscreen()
{
  // fullscreen for Preview.app                                                 
  Keyboard.press(cmdKey);
  Keyboard.press(ctrlKey);
  Keyboard.press('f');
  delay(100);
  Keyboard.releaseAll();
}

void escape()
{
  Keyboard.press(escKey);
  delay(100);
  Keyboard.releaseAll();
}

void nextpage()
{
  Keyboard.press(rightKey);
  delay(100);
  Keyboard.releaseAll();
}

void backpage()
{
  Keyboard.press(leftKey);
  delay(100);
  Keyboard.releaseAll();
}
void loop()
{
  if (irrecv.decode(&results)) {
    if (DEBUG) {
      // shows decoded IR codes                                                 
      Serial.println(results.value, HEX);
    }

    switch (results.value) {
    case CODE_NEXT:
      if (DEBUG) Serial.println("next page");
      nextpage();
      break;

    case CODE_BACK:
      if (DEBUG) Serial.println("back page");
      backpage();
      break;

    case CODE_PLAY:
      if (DEBUG) Serial.println("full screen");
      fullscreen();
      break;

    case CODE_MENU:
      if (DEBUG) Serial.println("escape");
      escape();
      break;

    case CODE_UP:
      ppt_slideshow();
      break;

    case CODE_DOWN:
      ppt_slideshow_here();
      break;

    default:
      break;
    }
    irrecv.resume();
  }
}
広告
カテゴリー: Arduino

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

カテゴリー
2012年10月
« 7月   11月 »
1234567
891011121314
15161718192021
22232425262728
293031  
%d人のブロガーが「いいね」をつけました。