編集履歴一覧に戻る
wayabiのアイコン画像

wayabi が 2021年01月04日12時29分45秒 に編集

初版

タイトルの変更

+

部屋まるごと電源ON・OFF リモートスイッチ

タグの変更

+

RaspberryPi

+

ESP8266

+

BLE

+

スマートスイッチ

+

IoT

+

Arduino

+

サーボモーター

+

秋葉原2021

本文の変更

+

# つくったもの https://twitter.com/wayabi3/status/1345933871213203461 <blockquote class="twitter-tweet"><p lang="ja" dir="ltr">冬休みに部屋まるごとリモートスイッチ作った <a href="https://t.co/AFzCAKEiT6">pic.twitter.com/AFzCAKEiT6</a></p>&mdash; wayabi@accacc (@wayabi3) <a href="https://twitter.com/wayabi3/status/1345933871213203461?ref_src=twsrc%5Etfw">January 4, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> # 動機 筆者は10年ほど1人暮らしをしており、PCに向かっての作業・飲食を同じ机の上で行ってきた。生活の全てがその部屋・机で完結していたため電子機器の電源を切ることは寝るときを除き、ほぼ無かった。 1か月ほど前に生活が変わり、ありがたいことにご飯を作ってくれる同居人ができた。 作業部屋でのPC作業中に、食事を採るためリビングに呼び出されることが常となった。 作業部屋から出る際に下記の工程を行わないと同居人に怒られる様になった。 - PCディスプレイの電源を切る(本体スリープでも可) - スピーカの電源を切る(音が鳴っていなくても電力を消費する) - デスクライトの電源を切る - 部屋の照明電源を切る 筆者にとって、(たかが)食事をするためだけに上記工程を行うことはストレスである。 照明スイッチがなぜか部屋の奥にあり、夜間に消灯しようとすると、真っ暗な(足元が散らかった)部屋を横断して外にでなければならない問題もある。 転倒の危険を排し、家庭内平和の(筆者が怒られないようにする)ために、リモートで部屋の電子機器の電源を一括オフ・オンできる仕組みが必要となった。 # 設計 ## 操作対象デバイス RaspberryPiを中心にし、各デバイスをスイッチ操作できるようにする。 | デバイス | スイッチ対象 | 対応 | |:---: | :---: | :---: | | PCディスプレイ | 100V AC | tp-linkスマートスイッチ | | スピーカ | 100V AC | tp-linkスマートスイッチ | | デスクライト| 100V AC | tp-linkスマートスイッチ | | 部屋照明 | 壁の片切スイッチ | esp8266 + サーボで自作| ![tp-link スマートスイッチ](https://camo.elchika.com/7941259ac0a841cf30c76bcb42a8e8ef073e6162/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f33653431316561642d323634362d343365662d626336632d3639633832333332353862352f39643637656236372d376233312d346534632d613039372d346266653530303338636235/) ![照明スイッチ](https://camo.elchika.com/fc30241cfc71399f7c1003a489db66e676d186a3/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f33653431316561642d323634362d343365662d626336632d3639633832333332353862352f61616236633064342d666164352d343130362d393835352d643663653161323238663238/) ## 構成 - Raspberrypi 3 Model B+ Bluetoothとwifiが使える。メインマシンとして使用。 照明スイッチ用のHTTPサーバとしても使用する。 - ダイソーのリモートシャッター スイッチにはダイソーのリモートシャッター(BLE 300円 ボタン電池で6か月ほど稼働するらしい)を採用。 作業部屋とリビングに設置し、どちらからでもオン・オフできるようにする。 ![ダイソー リモートシャッター](https://camo.elchika.com/36e084d0e5c6d75b5fcfd5ed5dc51139de51329c/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f33653431316561642d323634362d343365662d626336632d3639633832333332353862352f34643334383661302d336239352d343663622d616633342d643030386463636665356235/) - ESP WROOM 02 wifiが使える。Arduinoとして動かす。サーボを駆動し照明スイッチをオン・オフする。 サーボはSG92Rを使用。ESP-WROOM-02は3.3V サーボは5V駆動なので、5V->3.3Vレギュレータを使用する。 - tp-link スマートプラグ https://www.amazon.co.jp/dp/B078HSBNMT wifiで100Vプラグをスイッチできる。 ### 構成全体図 ![ハードウェア構成](https://camo.elchika.com/00fcad0fe1a382568bee71627264a354bbb84340/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f33653431316561642d323634362d343365662d626336632d3639633832333332353862352f64326266313862372d656136302d343339322d623436312d316338656238383233666437/) # 実装 ### Raspberry Pi リポジトリ:https://github.com/wayabi/room_iot ```shell:/etc/rc.local # ESP-WROOM-02 照明スイッチ情報用のサーバ cd /home/pi/room_iot/server (./server.sh &) # ラズパイのBluetoothを常時ONにしておく sudo systemctl start bluetooth sleep 1 (/home/pi/room_iot//script/bluetooth_loop.sh &) # ダイソーリモートシャッターの入力を検出 # /dev/input/event0を監視する cd /home/pi/room_iot//event_read/bin (./event_read_loop.sh 0 &) ``` ### ESP-WROOM-02 先人がプログラムの書き込み方法等を残してくれているのでその部分は省力。 ↓など分かりやすい。 http://marchan.e5.valueserver.jp/cabin/comp/jbox/arc201/doc20101.html 5秒おきにHTTP GETして、1か2が返ってくればサーボモータを動かすArduinoプログラム。サーボ信号はGPIO16から出力。 ```arduino:esp8266 #include <ESP8266WiFi.h> #include <WiFiClientSecure.h> #include <Servo.h> const char* ssid = "あなたの家のSSID"; const char* password = "あなたの家のパスワード"; Servo servo_; int pin_servo_ = 16; int angle_servo_ = 16; String http_get(String host, String url){ while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } WiFiClient client; client.setTimeout(500); const int httpPort = 12345; const char* host2 = host.c_str(); if (!client.connect(host2, httpPort)) { Serial.println("connection failed"); return ""; } client.print(String("GET ") + url + " HTTP/1.1\r\n" + "Host: " + host + "\r\n" + "User-Agent: ESP8266/1.0\r\n" + "Connection: close\r\n\r\n"); unsigned long timeout = micros(); while (client.available() == 0) { if ( micros() - timeout > 5000000) { Serial.println(">>> Client Timeout !"); client.stop(); return ""; } } String content = ""; bool flag_content = false; while(client.available()){ String line = client.readStringUntil('\r'); if(flag_content){ return line.substring(1); } //\r\n\r\n. \r \n <-(check this) \r \n<content> <-(next len = content+1) if(line == "\n") flag_content = true; //Serial.println(line); //Serial.println(String(line.length())); } return ""; } void setup() { Serial.begin(115200); WiFi.begin(ssid, password); } int state_old = 0; void loop() { //RaspberryPiのIPアドレス String res = http_get("192.168.1.1", "/a"); int state = res.toInt(); Serial.println(state); if(state == 1 && state_old != 1){ servo_.attach(pin_servo_); state_old = state; servo_.write(90-angle_servo_); delay(1000); servo_.write(90); delay(200); servo_.detach(); }else if(state == 2 && state_old != 2){ servo_.attach(pin_servo_); state_old = state; servo_.write(90+angle_servo_); delay(1000); servo_.write(90); delay(200); servo_.detach(); } delay(5000); } ``` #### 構成部品 - ESP-WROOM-02 - 3端子レギュレータ 3.3V - 10Kオーム抵抗 4つ - 適当な電解コンデンサ (100μFを使用した。3.3V出力個所に設置してサーボ駆動時にESP-WROOM-02が落ちないようにする保険) ![構成部品](https://camo.elchika.com/e26195e30b51809ac96a587e7c8e90e146506cbc/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f33653431316561642d323634362d343365662d626336632d3639633832333332353862352f37393933373961632d353361352d346633312d616362332d316163363761316563303236/) ![実装裏面](https://camo.elchika.com/8d7beacfbe0b07ce59525b8b58f99aef0245e9de/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f33653431316561642d323634362d343365662d626336632d3639633832333332353862352f33393039393964332d393637662d346134662d613036622d373536306339656266326137/) ![実装表面](https://camo.elchika.com/b0d87843f360030a3fe8e59840be998a6e0c92e3/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f33653431316561642d323634362d343365662d626336632d3639633832333332353862352f36303934626331322d373435352d343961382d626664622d656630383639383937313135/) ### サーボ・照明スイッチ 賃貸なので、部屋についているスイッチカバーと同タイプのものを購入し、それを加工する。 ![スイッチカバー加工](https://camo.elchika.com/a78e19f238e8ed89681a36e39bad7aacd3fd14b0/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f33653431316561642d323634362d343365662d626336632d3639633832333332353862352f38373239623330302d343035332d343663372d386132322d633432396334343735346264/) ![サーボ取り付け](https://camo.elchika.com/ba25079e121f201d1cc2662999f4f7e329adaff8/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f33653431316561642d323634362d343365662d626336632d3639633832333332353862352f66323662656637302d653964622d346338622d383836352d396634663138353530333733/) ### tp-link スマートプラグ 下記を参考にRaspberryPiにAPIをインストールし、wifi経由で操作できるようにする。 https://qiita.com/c60evaporator/items/74fe4234d9ed5eb713d3 ```shell:room_iot/tp-link/switch.sh #!/bin/sh ip=$1 flag=$2 tplink-smarthome-api -D send ${ip}:9999 '{"system":{"set_relay_state":{"state":'${flag}'}}}' ``` スマートプラグのIPの取り方が分からなかったので、総当たりで(家のルータはIPをカウントアップで割り振っていくようで、10回試さないうちに見つかった)探し出した。 ### ダイソーリモートシャッター https://japanese.engadget.com/jp-2017-10-26-bluetooth.html ↑のリンクの改造を施すことで、[VolumeUp]と[VolumeDown]の2種類のキーボードデバイスとして動作する。 今回は[VolumeUp]で部屋の機器の電源をオン、[VolumeDown]でオフとなるようにする。 Bluetoothペアリングは下記のように行った。 ```shell:RaspberryPi #ラズパイとリモートシャッターのペアリング sudo bluetoothctl [bluetooth] power on [bluetooth] scan on [NEW] Device XX:XX:XX:XX:XX:XX AB Shutter3 [bluetooth] trust XX:XX:XX:XX:XX:XX [bluetooth] pair XX:XX:XX:XX:XX:XX ``` 複数のリモートシャッターをペアリングすると、/dev/input/event0, /dev/input/event2, /dev/input/event4 ...と偶数番のeventが追加される。 下記プログラムでeventをチェックし、シャッターボタン押下時に room_iot/event_read/bin/button0.sh room_iot/event_read/bin/button1.shを呼び出している。 ```shell:RaspberryPi git clone https://github.com/wayabi/room_iot cd room_iot/event_read make ./a.out <event番号, 0 or 2 or 4 or...> ``` # 使ってみて ダイソーリモートシャッターは最後にボタンを押してから30秒経つと電源が自動で切れる。 部屋の電源を落とそうとした場合、1度ダイソーシャッターのいずれかのボタンを押しBluetoothペアリングが完了するまで5秒程度待ち、その後にボタンを押すことで信号がRaspberryPiに伝わる。 シャッターの信号が上手く伝わらないことがあり、tplink-apiの伝達にも数秒のラグ、ESP-WROOM-02のHTTP GETポーリング間隔があるため、ボタンを押してから10秒ほど経った後に全ての操作が完了する。 機能的には問題なく満足しているが、テンポ感、気持ち良さが足りない気がする。 # おわりに ダイソーリモートシャッター 300円 6か月動作は素晴らしい。 RaspberryPiでBLEを扱うためにBlueZを試していたが、Raspi3B+内臓のBluetoothに問題があり、scanでデバイス取得できなかった。ハマった。/dev/input/eventを読むことで対応した。 サーボで照明スイッチを操作するには、サーボとスイッチの距離調整がシビアだった。写真では見づらいが、サーボとスイッチカバーの間に1mm程度のゴムシートを挟んでいる。 同居人にこのシステムをドヤ顔で見せたらあまり反応がなかった。 作業部屋の消灯めんどくさい問題は解決できたが、部屋のドアを閉め忘れてリビングに来ると同居人が「寒い」と怒ることが判明した。 今度は、作業部屋ドアの自動開閉化を検討している。 # 免責事項 この記事の内容を模倣することを筆者は推奨しておりません。 電気、工作に関する専門的な知識がない者が模倣した場合に、感電、火災、電気工事士法に触れる等の事故が容易に起こる可能性がある為です。 この記事の内容を模倣・参考にして起きたあらゆる事故、怪我、不利益等についての責任を筆者は一切負いません。 (↑怖いので一応書いておきます。)