Arduinoとサーボモーターで壁の照明スイッチを操作

Google Home を買った． 部屋の照明の壁スイッチは椅子から遠いので， "Ok, Google 照明を点けて" などと声で操作したい．しかし， Arduino 等のプログラマブルなデバイスを使って壁スイッチを電気的にあれこれするには，電気工事士の資格が必要であるそうだ．一方，壁スイッチを **サーボモーター** で機械的に操作してオンオフする方法がいくつか紹介されている．

私もやってみた．同僚，というか大先輩が，生々しい経験をブログに投稿すると良いのではとおっしゃり，雑多な経験を記録しておく．プログラミングは簡単で，むしろ機械系統・電気系統が話題の中心になる．

参考にされる方は at your own risk でお願いします．

(この記事はところどころ更新しています)

# どうなった

<blockquote class="twitter-tweet" data-lang="en-gb"><p lang="ja" dir="ltr">今日の進捗です <a href="https://t.co/3NMxa8FruO">pic.twitter.com/3NMxa8FruO</a></p>&mdash; Keigo Imai (@keigoi) <a href="https://twitter.com/keigoi/status/935819513144082432?ref_src=twsrc%5Etfw">29 November 2017</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" data-lang="en-gb"><p lang="ja" dir="ltr">れいのやつ ver. 2 <a href="https://t.co/hP9pKIf59P">pic.twitter.com/hP9pKIf59P</a></p>&mdash; Keigo Imai (@keigoi) <a href="https://twitter.com/keigoi/status/943087098894065664?ref_src=twsrc%5Etfw">19 December 2017</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" data-lang="en-gb"><p lang="ja" dir="ltr">サーボホーンにハンマー代わりの円盤を取り付けてある <a href="https://t.co/1bNC7lQjhP">pic.twitter.com/1bNC7lQjhP</a></p>&mdash; Keigo Imai (@keigoi) <a href="https://twitter.com/keigoi/status/943087520983609344?ref_src=twsrc%5Etfw">19 December 2017</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" data-lang="en-gb"><p lang="ja" dir="ltr">れいのやつ ver. 3 <a href="https://t.co/ULDy2uIeBC">pic.twitter.com/ULDy2uIeBC</a></p>&mdash; Keigo Imai (@keigoi) <a href="https://twitter.com/keigoi/status/943806053585633281?ref_src=twsrc%5Etfw">21 December 2017</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" data-lang="en-gb"><p lang="ja" dir="ltr">れいのやつ ver. 4<br>ネジが不要になってサーボを上下に取り付けられるようになった。これでおしまい！ <a href="https://t.co/8aoYDZPyNK">pic.twitter.com/8aoYDZPyNK</a></p>&mdash; Keigo Imai (@keigoi) <a href="https://twitter.com/keigoi/status/945472609700818944?ref_src=twsrc%5Etfw">26 December 2017</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
最後のやつは使っているうちにサーボが板から浮いてしまってスイッチが入らなくなってしまった。残念。

# Web上の関連記事

- [お家の照明をリモコンで操作できるようにしよう](https://qiita.com/narikei/items/ff2d53d902e701cb1d13 ) (多謝！)
- ほか多数．
  - [https://www.google.co.jp/search?q=サーボモーター+壁スイッチ](https://www.google.co.jp/search?q=%E3%82%B5%E3%83%BC%E3%83%9C%E3%83%A2%E3%83%BC%E3%82%BF%E3%83%BC+%E5%A3%81%E3%82%B9%E3%82%A4%E3%83%83%E3%83%81)

# やりたいこと

- 縦に並んだ 2つの壁の照明スイッチを操作したい.
- 手でもオンオフできる余地を残したい．

壁スイッチは結構硬くできているので，素人工作で平易に作れるか不安だったが，部分的にはできた．

# 私

35歳．Arduino 触ったことない． 組込みソフトウェアは過去の職場で耳学問＋α． Web周りチョットワカル． C++ チョットワカル．電子回路あんまりわからない．機械系や工作もあまり経験がない．

# 現状

<blockquote class="twitter-tweet" data-lang="en-gb"><p lang="ja" dir="ltr">今日の進捗です <a href="https://t.co/3NMxa8FruO">pic.twitter.com/3NMxa8FruO</a></p>&mdash; Keigo Imai (@keigoi) <a href="https://twitter.com/keigoi/status/935819513144082432?ref_src=twsrc%5Etfw">29 November 2017</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

- Arduino からサーボモーターを制御してスイッチのオンオフを実現している．
- 今のところ Google Home とは繋がっておらず，3秒おきに点けたり消したりを繰り返す．
- できているのは 1つのスイッチの操作のみ． 
  - 2つのスイッチを操作するには少し工夫が必要だ （後述）．

# 材料・道具

- Arduino UNO R3 https://store.arduino.cc/usa/arduino-uno-rev3
  - ESPr® One（Arduino Uno同一形状 ESP-WROOM-02開発ボード）に替える予定 (Wifi につながるらしい.)
 https://www.switch-science.com/catalog/2620/
- サーボモーター SG90 http://akizukidenshi.com/catalog/g/gM-08761/
  - (うろ覚え) サーボホーン フタバ S3156専用 Vタイプ - サーボホーンを垂直に配置して上下のスイッチをオフにする場合、腕の長さが SG90 よりこちらのほうが長いのでちょうどよい。
- ブレッドボード （下の画像参照）
- ピンヘッダ (サーボをブレッドボードに刺すのに必要) こういうの http://akizukidenshi.com/catalog/g/gC-09055/
- ジャンパワイヤ 3本 (下の画像参照)
- アクリル板 厚さ2mm
- アクリサンデーカッター (アクリル版カッター) https://www.amazon.co.jp/dp/B00GWBQRTY
- 3M スコッチ超強力両面テーププレミアゴールドスーパー多用途 幅19mm 厚さ
 1.1mm https://www.amazon.co.jp/dp/B002YMNKA4?th=1

# 機械系統・電気系統

こうなった． Arduino との接続は，以下の記事の前半「サーボモーターを動かす」の通りに接続した．サーボ SG90 は，どこかで調べたら茶色が GND, 赤色が 5V だった．

- https://qiita.com/narikei/items/ff2d53d902e701cb1d13


![pic.png](https://qiita-image-store.s3.amazonaws.com/0/8163/c688f18f-fd60-504f-e8bc-ab6308d8b526.png)


上に書いたように，手でオンオフできる余地を残すため，少しサーボモーターをスイッチから離した（浮かせた）状態で固定したい．このため，サーボとスイッチ盤面の間に 2mm のアクリル板を挟んで厚さを稼ぐ （上の写真中，スイッチ盤の中央を横に渡した板．粘着テープで固定）．

![servo.png](https://qiita-image-store.s3.amazonaws.com/0/8163/e9acce86-1234-0f8b-4db3-4cd9311fb77a.png)

このためのアクリル板をカッターで適当なサイズに切り出した．切り方は，カッターで板に溝を掘り（アクリルの細い削りカスが出る），その溝に沿ってパキっと割る感じ．できた板を盤面中央に超強力テープで貼る．（二度と剥がさない決意のもとでやったほうが良い．あとでもう1枚貼ったのだが，ある理由のため剥がすことになった．結構苦労した）

![FullSizeRender 2.jpg](https://qiita-image-store.s3.amazonaws.com/0/8163/541fb200-68df-2eab-81a0-5bff180eabfa.jpeg)

最後にサーボモーターを貼る．

- 軸がスイッチの中央を縦断するように．
- 羽（サーボホーン）がスイッチの上 1/3 あたりを水平に横切るように．
- モーターを事前に Arduino に接続し， ``servo.write(90)`` した状態で，サーボホーンを水平にセットした．
- モーターの向きも重要だった気がする．サーボは180度しか回転しなかったような気がする．

# ソフトウェア (Arduino)

プログラムも，ほぼ上記の記事のコピペ． 
Arduino については全くの初心者だが，ブラウザ上で動作する Arduino Create https://create.arduino.cc/editor で以下のコードを Arduino に書き込んで実行したらすぐ動いた．
言語は C++． コンパイラは何を使っているのだろうか（調べたらわかる）．

```c++
#include<Servo.h>
#define SERVO_PIN 5

Servo servo;

void setup() {
    servo.attach(SERVO_PIN);
}

void loop() {
  servo.write(60);
  delay(1000);
  servo.write(90);
  delay(3000);
  servo.write(120);  
  delay(1000);
  servo.write(90);
  delay(3000);
}
```

- やってみたら 0-180 の範囲で動く感じだった．本来なら仕様を調べてみるべきだが，今は深追いしない．
- サーボホーンがスイッチに触っていない状態（手でコントロールできる状態）を 90度としてサーボホーンを水平にセット
- オン，オフでそれぞれ 30度ずつ動かす．どっち向きがオンかよくわかっていないが，また必要な時に実際にやってみればすぐわかるのでまあいいだろう．
- オンを押す状態，オフを押す状態はそれぞれ 1秒にした．スイッチはやや硬いので短すぎると駄目だろうと思う．その一方で，多分これ以上長くしてもしょうがない．


再掲．

<blockquote class="twitter-tweet" data-lang="en-gb"><p lang="ja" dir="ltr">今日の進捗です <a href="https://t.co/3NMxa8FruO">pic.twitter.com/3NMxa8FruO</a></p>&mdash; Keigo Imai (@keigoi) <a href="https://twitter.com/keigoi/status/935819513144082432?ref_src=twsrc%5Etfw">29 November 2017</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


# 失敗

動画のとおり，下のスイッチのオンオフには完全に成功した．が，同様の方法で上のスイッチを叩くサーボを貼ると，盤面を壁に固定するための上のネジ穴を完全に塞いでしまう． 

ネジを締めてしまい，その上からアクリル板＋超強力テープを貼ってしまうと壁から外せなくなる．ネジを締めずにアクリル板を貼ってみたところ…


![wall-sw-1.png](https://qiita-image-store.s3.amazonaws.com/0/8163/83bef19c-bc3f-c432-86bc-0099fbf35d00.png)
![wall-sw-2.png](https://qiita-image-store.s3.amazonaws.com/0/8163/a13a4741-61e9-69cc-e41a-f42658a33125.png)

サーボの力で盤面が持ち上がってしまう．失敗．
結局，アクリル板を剥がす羽目になってしまった．やや本末転倒感がある．

# TODO

- Google Home (あるいは他のスマートスピーカ) と繋ぐ． 
  - 手元のサーバーに web api を生やして IFTTT で叩く
  - Arduino UNO は辞めて ESPr One (WROOM-02 開発ボード) に乗り換える
    - このボードなら サーボの電圧 5 V を供給できるはず
    - https://qiita.com/oohira/items/55347aa9a66613a37830
  - web api から WROOM-02 の Wifi にリーチする方法が謎． 
    - まともな TCP 接続はできるのだろうか (調べればすぐ分かるはずだ．インターネット万歳，先人の皆さん万歳．)
- 上のスイッチをどう操作するか．
  - スイッチの両脇に，オン用・オフ用の 2つのサーボを貼ってサーボホーンで叩く．
  - あわよくば 1つのサーボで上下二つのスイッチを叩きたいが，サーボホーンの腕の長さが足りない． ← いまここ
- ブレッドボード要らない説
  - 適当なコネクタ-ピンを買う？

# 他の失敗談

行き当たりばったりにも程があるけれど恥を忍んで書いておく．

- 千石通商で ESP-WROOM-02 のチップ https://www.switch-science.com/catalog/2346/ を買ったがどう基盤にハンダ付けするのかわからなくて終わってしまうということがあった
  - [ＥＳＰ－ＷＲＯＯＭ－０２用２．５４ｍｍピッチ変換基板](http://akizukidenshi.com/catalog/g/gP-09715/) にはんだ付けすれば使えなくもないが，そもそも [DIP化キット](http://akizukidenshi.com/catalog/g/gK-09758) を使えば楽という事だった． 大先輩談．
  - 結局、WROOM-02 開発ボードを使う事になりそう
- 帰路のラジコン屋さんで腕の長いサーボホーンを雑に買ってきたが SG-90 のシャフト (ギア?) よりも穴の径が大きくて使えない．
  - SG-90 (手元に複数個ある…) で使える 腕の長いサーボホーンが欲しい．
  - あるいはアームが合う他のサーボに替える(あるのか?)．SG-90 は安さが魅力のように思った