Arduinoを使ってOpen Web Boardにインストールされたアプリを電源ONと同時に自動起動する方法

> 最初に断っておきますが原始的な方法なので、Open Web Board以外にも広く使えますw

![Open Web Board](http://img.dfm.lrv.jp/automouse/owb.png)

Open Web BoardはKDDIがFirefox OS関連のハッカソンなどのイベント参加者に配布しているボードです。
このボード、Firefox OSで動いているのですが、ホーム画面に並んでるアプリを起動しようとすると、一旦マウスを繋いでダブルクリックしなければ起動できません。

せっかく小さなボードなので、組み込みで使いたいシーンもあると思うのですがアプリを起動するためにはモニタとマウスが必要に！？この点が使いにくなぁと思っていました。

これはなんとかしたい！
ということで、下記のようにして、電源ONと同時にアプリを自動起動できるようにしました。

1. 電源ONと同時に起動したいアプリをOpen Web Boardのホーム画面の特定の位置に置く
2. 電源ONから30秒後に指定の距離を移動させ（特定のアプリアイコンに到達するよう）てダブルクリックするHIDデバイスを作ってOpen Web BoardのUSBに刺しておく  
3. Open Web Boardの電源ON！

これで、Open Web Boardにマウスとモニタを繋がなくてよくなりますね。

# 用意するもの→Arduino Leonardoっぽいボード

例によってLeonardo系のArduinoを使います。 **（Arduino UNOとかだと出来ないので注意！）**

- [Arduino Leonardo](http://arduino.cc/en/Main/arduinoBoardLeonardo)
- [Arduino Micro](http://arduino.cc/en/Main/ArduinoBoardMicro)
- [Arduino Yún](http://arduino.cc/en/Main/ArduinoBoardYun)

下記でも出来ます。

- [Sparkfun Pro Micro](https://www.sparkfun.com/products/12640)

さらに、上記の互換ボードっぽい下記でも出来ました。（私が実際に使ったのはコレ。小さくてヨイ！）

- [Aliexpressで沢山見つかる安いPro Microのニセモノ](http://www.aliexpress.com/wholesale?catId=0&initiative_id=AS_20150315181218&SearchText=pro+micro+32u4)

# スケッチ

下記のようなスケッチを書いてArduino Leonardoっぽいボードに書き込みます。

```
#include <Serial.h>

void setup() {
  Mouse.begin();
  delay(30000);
  MouseMoveTo(460,70);  
  doubleClick();
}

void loop() {
}

float calib(int cal, int real){
  return (float)cal / real;
}

void MouseReset(void){
  int cnt;
  for(cnt = 0;cnt < 64;cnt ++){
    Mouse.move(-64,-64,0);
  }  
}

#define STEP 80
void MouseMoveTo(int x,int y){
  float cal = calib(100,100);
  int lx = x / cal;
  int ly = y / cal;
  int mx = lx / STEP;
  int dx = lx % STEP;
  int my = ly / STEP;
  int dy = ly % STEP;

  MouseReset();

  for(int cx = 0;cx <  mx; cx++){
    Mouse.move(STEP,0,0);
    delay(20);
    Serial.print("mx:");
    Serial.println(STEP);
  }
  Mouse.move(dx,0,0);
  Serial.print("mx:");
  Serial.println(dx);
  delay(20);
  for(int cy = 0;cy <  my; cy++){
    Mouse.move(0,STEP,0);
    delay(20);
    Serial.print(" my:");
    Serial.println(STEP);
  }
  Mouse.move(0,dy,0);
  Serial.print("my:");
  Serial.println(dy);
  delay(20);
}

void doubleClick(void){
  Mouse.click();
  delay(100);
  Mouse.click();
}
```

マウス操作は、`Mouse.begin()`、`Mouse.move()`、`Mouse.click()`を使えばできます。リファレンスは下記に。

[Mouse and Keyboard libraries](http://arduino.cc/en/Reference/MouseKeyboard)

初めてMouseクラスを使ったのですが、いくつか気づきがあったのでメモ。

### `Mouse.move()`に指定するパラメータわかりにくい

`Mouse.move()`には、x-axis、y-axisで移動する方向と距離を指定する感じ。
この距離というのがくせもので、OSの設定にしたがってかわります。
例えばMacだと、マウスの動きを速くしてたりすると、同じ値を指定しても沢山動きます。
どのくらい動かすかは、簡単に調整できる仕組みを作っておいた方がいいです。

> コード中の`calib()`はそのためのものです。Open Web Boardでは使っていません。

移動距離はピクセル数とかじゃないので、実際に何度かマウスカーソルの到達地点を見ながら調整するしかないと思います。

さらに、斜めに動かそうとすると計算がめんどくさいです。（だれかうまく計算する方法教えてくださいw）
難しいこと考えたくないので、今回は、一旦横に動かしてから縦に動かす、という風につくりました。

### `Mouse.move()`を連続で動かしても動いてくれない

`delay()`を入れながら呼び出すようにしないと、思うように反応しません。
10msくらい間をあけて実行すれば問題なかったです。

# キーボードも併用すればセンサー情報をアプリに伝えることもできるよ

せっかくUSBポートにArduinoを刺すのですから、自動起動のためだけにつかうのはもったいない！
その先にセンサー等を繋ぎたいですよね。

昨日のハッカソンで（発表はWIFIテザリングの回線不調にやられて不発でしたがw）使った下記デバイスはマイクのアナログ入力を判定して、[ここに書いた方法](http://qiita.com/tadfmac/items/f169efa60ca13ef32f3a)で、キーコマンドをOpen Web Boardに送りつけていました。

![昨日ハッカソンで使った謎デバイス（Open Web Board用のアヒルの笛型ウエアラブルコントローラー）](http://img.dfm.lrv.jp/automouse/duck.png)

これなら、Webアプリは普通のキーイベントしか使わないのでホスト型で作ることができるので外部との連携も簡単、というメリットも。

# まとめ

- Arduino Leonardoとかを使えば、マウスエミュレーションできる
- マウスエミュレーションを使えばOpen Web Boardのアプリ自動起動もできる（ボタンを押して起動とかもできる）
- キーボードでセンサー情報を伝えることもできる