Arduinoで作るちょっと頭のいい座布団


## まえがき（あるいは読む価値のない駄文）
日々エンジニアは座っての作業を長時間行っています。設計・コードリーディング・コーディング・テスト・ミーティング（これは立ってやる場合もある）。全て椅子の上に座って行う作業となります。集中して作業を行っているときほど長く椅子に座ることになるでしょう。

長時間椅子に座っていることの不健康さは誰もが知っています。腰は痛くなるし、肩はこる。体重が重い人はおしりに体重がかかるので神経が圧迫されてかなりしんどい思いをすることになります。これで仕事の効率が上がるだろうか？いや、上がらない（反語）

そこで今回は長時間椅子に座ることを防ぐべく、少し頭の良い座布団を制作することにしました。長時間作業を続けないようにするアプローチはポモドーロなどのタイマーを使う方法があるけれど、今回はあえてそれを無視して座布団によるアプローチを試みました。

何故って？作りたかったからに決まっています。

## ゴール

姿勢の悪いであろう状態を検知し、画面に通知する頭の良い座布団の作成。

ただ長時間座ってるだけではなく左右の体重の偏りを検知して通知するようにします。長時間座っていることも問題だが、どちらかというと姿勢が悪い状態なのが問題だと思うのでそうしました。


## 材料

* [サインスマート（SainSmart） Nano 3.0　互換ボード for Arduino](http://www.amazon.co.jp/gp/product/B00761NDHI/ref=oh_aui_detailpage_o05_s00?ie=UTF8&psc=1)
* [XINTE HC-06](http://www.amazon.co.jp/gp/product/B00H07UJL6/ref=oh_aui_detailpage_o05_s00?ie=UTF8&psc=1)
* [圧力センサーＦＳＲ４００](http://akizukidenshi.com/catalog/g/gP-04003/)
* 基板
* ピンソケット
* 抵抗
* 導線

最近はArduinoではなくArduinoの互換機も安く売っているので今回はそれを使いました。サインスマートのやつはピンヘッダも最初からついているのでかなり便利。Arduino純正だと4000円近くするのがサインスマートのにすると1600円ほどになるので、経済的にもうれしい。

XINTE HC-06はBlueToothのスレーブモジュールでペアリングすると特に意識せずに使えるので便利。

圧力センサーFSR400は小さめの圧力センサ。実験してから知ったけど結構圧力かけないと反応しないのでこの選択は失敗だった感がある。

## 作業

### 配線

配線は以下のような感じ。

![sensor_test_ブレッドボード.jpg](https://qiita-image-store.s3.amazonaws.com/0/11510/90e54159-12a3-e745-8ed1-b4d29ad4f050.jpeg "sensor_test_ブレッドボード.jpg")

ものすごく単純に配線しています。

Bluetoothの配線はしてないですがRXとTXのところにクロスで配線すればあとは電源を5VのピンからとってGNDに配線すれば使えるようになります。

### 子機側Arduinoのスケッチ

```arduino:sensor_test.ino
const int vol_pin_0 = 0;
const int vol_pin_1 = 1;

void setup() {
   Serial.begin( 9600 );
}

void loop() {
  int vol_value_0 = analogRead( vol_pin_0 );
  int vol_value_1 = analogRead( vol_pin_1 );
  Serial.print(vol_value_0);
  Serial.print(",");
  Serial.println(vol_value_1);

  delay( 50 );
}
```

カンマで区切った文字列を50msec間隔でシリアルで送っています。

### 母艦側MacのRubyコード

```ruby:
require "serialport"

@serial_port = ARGV[0]
@serial_bps = 9600

sp = SerialPort.new(@serial_port,@serial_bps)
flg = false
count = 0;

loop do
  count += 1
  lineArray = sp.gets("\n").split(',')
  if (lineArray[0].to_i - lineArray[1].to_i).abs > 100
    puts '差が出てる'
    if flg
      count = 0
      system %|osascript -e 'display notification "バランスが悪くなっているよ！"'|
    end
  else
    puts '差が出てない'
  end

  if count > 100
    flg = true
  else
    flg = false
  end
end
```

`serialport`というgemを使っています。これを使うと簡単にシリアル通信ができます。
arduino側から送られてくる値の差が100以上になったら「バランスが悪くなっているよ！」と通知します。
`osascript -e 'display notification "バランスが悪くなっているよ！"'`でmacの通知センターに通知できます。

## 完成形

完成したものはこれ。

![2015-12-01 09.29.25.jpg](https://qiita-image-store.s3.amazonaws.com/0/11510/da90d857-9767-078b-d573-6e4e961b651a.jpeg "2015-12-01 09.29.25.jpg")

電源はダンボーのモバイルバッテリーを使用しています。

実際に使用して左右のバランスを意図的にずらすと。

![スクリーンショット 2015-12-01 14.30.30.png](https://qiita-image-store.s3.amazonaws.com/0/11510/752292dd-fb62-4035-8075-ff41fbf7cb3a.png "スクリーンショット 2015-12-01 14.30.30.png")

こんな感じで通知されて姿勢が悪くなっていることがわかります。これでエンジニアの姿勢の悪い座り方による不健康さが改善されると思われます（そうか？）

ただ、センサーの所でもかるく書きましたが、結構圧力をかけないと通知されません。センサーの選びかたを間違えた気がします。もう少し大きめのセンサーもあったのでそれを利用すればうまくいったかも知れません。それと、椅子のクッションも柔らかいことからうまく圧力がかからなくなたのではないかとも思われます。

それとBlueToothのモジュールが上に張り出しているのですぐに外れてしまいます。基板があることにより落ち着いて座れず余計に姿勢が悪くなりそうな座布団になってしまった感があります。

やはり実際に作ってみないとこういうことはわかりませんね。

## まとめ
今回は姿勢の悪さを伝える少し頭の良いクッションを作成しました。いろいろ問題点は出てきたもののプロトタイプとしてそれなりに動作したので、次やるときはもっとうまくできる気がします。

いつもWebをあいてに仕事をしていますが、たまにはこういった現実世界をハックするプロダクトを作るのもよいですね。

次はArduino用のカメラモジュールを使って自分のオリジナルカメラを作りたいなと密かに思っています。