fluent-plugin-arduinoを書いてみた。

# ネタどうしよう...

![IMG_2248.jpg](https://qiita-image-store.s3.amazonaws.com/0/3985/2115ba84-3edd-83ae-8a1f-7b8e61121c2d.jpeg)

ネタどうしよう、と考えてて、
今はまってる[Arduino](http://arduino.cc/)と[fluentd](http://fluentd.org/)を組み合わせると
いいのかな〜と思ったのでどぶろく飲みながら書いてみた。

[fluent-plugin-arduino](https://github.com/futoase/fluent-plugin-arduino/commits?author=futoase)

動けばいいやという感じで実装した感じで...
機能が貧弱で、LEDをチカチカさせることしかできない。

# 使うためには

以下の部品が必要。

- [Arduino UNO](http://arduino.cc/en/Main/arduinoBoardUno)
- [LEDいくつか](http://akizukidenshi.com/catalog
/goods/search.aspx?search=x&keyword=LED&image=%8C%9F%8D%F5)
- [ブレッドボード](http://akizukidenshi.com/catalog/g/gP-00313/)
- [ジャンパーコード](http://akizukidenshi.com/catalog/g/gC-05159/)

# 使ってみる

使ってみた動画がこちら。

![gif](https://dl.dropboxusercontent.com/u/614755/qiita/fluent-plugin-arduino/arduino.gif)

# インストールのためには

以下はわかってる人向け... (説明省いてる...)

## Arduino

- [Arduino IDE](http://arduino.cc/en/main/software#toc1)

Arduino IDEを利用し、Arduino側にシリアル通信の受け口となるプログラムをビルドし、転送しないといけない。
転送するためのプログラムは[ここ](https://github.com/futoase/fluent-plugin-arduino/blob/master/src/led.ino)にある。

```c:led.ino
#define UPPER_CASE 65
#define LOWER_CASE 97

void setup() {
  for(int i = 0; i <= 13; i++) {
    pinMode(i, OUTPUT);
  }
  Serial.begin(9600);
  Serial.print("\nSetup...");
}

void loop() {
  if (Serial.available()) {
    char c = Serial.read();
    // LOW
    if (int(c) < 97){
      digitalWrite((int(c) - UPPER_CASE), LOW);
    }
    // HIGH
    else {
      digitalWrite((int(c) - LOWER_CASE), HIGH);
    }
  }
}
```

## PC

PC側ではfluentdを起動しておく必要がある。
んで、Arduinoを接続しているポート(というかデバイスか)
を指定しておく必要がある。

サンプルとなる設定ファイルを[ここ](https://github.com/futoase/fluent-plugin-arduino/blob/master/example/fluent.conf)に置いておいた。

```
<source>
  type forward
  port 24224
</source>

<match arduino.test1.**>
  type  arduino
  key   name
  value kaiki
  pin   13
  port  /dev/cu.usbmodem1431
</match>

<match arduino.test2.**>
  type  arduino
  key   name
  value senjogahara
  pin   12
  port  /dev/cu.usbmodem1431
</match>

<match arduino.test3.**>
  type  arduino
  key   name
  value araragi
  pin   11
  port  /dev/cu.usbmodem1431
</match>

<match arduino.test4.**>
  type  arduino
  key   name
  value sengoku
  pin   10
  port  /dev/cu.usbmodem1431
</match>

<match arduino.test5.**>
  type  arduino
  key   name
  value hanekawa
  pin   9
  port  /dev/cu.usbmodem1431
</match>
```
'
ここの例では```/dev/cu.usbmodem1431``` だが、これは環境によってことなるので
設定方法はがんばってググって欲しい。

# どうやって通信しているの？

[Arduinoのシリアル通信機能](http://arduino.cc/en/reference/serial)を利用してる。
シリアル通信だと、同期とか考えずに何かやりとりしようとすると255バイトまでの情報しか送れない。
自分でプロトコル考えておけばいいのだろうけど、だるい...
どうやって制御しよーかな、と思った結果、ASCII コードを送り付けることで動作するようにしてる。

※ 2013/12/17追記 [Serial.readBytes()](http://arduino.cc/en/Serial/ReadBytes)を使うことで読み込む分を制御できるようだ。

Hashのキーになっている数字がpin番号を表す。
Aとかaとか、PCからArduinoに送り付けるとArduino側が
ASCIIコードを数字に置き換えて、適当に引き算して
特定のpinに対して電流を流したり流さないように制御する(ようにled.inoに書いてる)

```rb
PIN_NUMBER = {
    "0"  => "A",
    "1"  => "B",
    "2"  => "C",
    "3"  => "D",
    "4"  => "E",
    "5"  => "F",
    "6"  => "G",
    "7"  => "H",
    "8"  => "I",
    "9"  => "J",
    "10" => "K",
    "11" => "L",
    "12" => "M",
    "13" => "N"
}
```

fluent-catでfluentdに対してデータを送りつけ、マッチするtagであれば
LEDを点滅させる。

# 今後

サーボとか使って何か動かすとか、
シリアル通信使って文字列をやりとりするライブラリを書いて
LCDモジュールに何か表示するとかそんなことやってみたい。

ただ、やりたいことがあるとその分だけArduino向けのコード(Sketch)を書かないといけないから、だるい。