現: 2022-10-01 (土) 11:41:15 yuji Deleted an attach file: microservomotor.png at 2022-10-01 (土) 11:44:32 |
|||
---|---|---|---|
Line 1: | Line 1: | ||
+ | * SwitchBotのボットもどきの作成 [#x5e89055] | ||
+ | 家のアパートのリビングの照明スイッチは古い2個口のスイッチ &worried; これでON/OFFしているのが,これまた古い電球型蛍光灯。~ | ||
+ | IoTということでちょっと便利になるように[[SwitchBotのボット>https://www.switchbot.jp/pages/switchbot-bot]]を使って[[Echo Dot>https://amzn.to/3MvgsW5]]や[[Google Home Mini>https://store.google.com/jp/product/google_nest_mini?hl=ja&pli=1]]を使ってON/OFFさせてみたいと思ったのだが,[[SwitchBotのボットを購入>https://amzn.to/3e0psW9]]する前にとりあえず同様な機能の物を,ありあわせの物で自作してみることにした。~ | ||
+ | |||
+ | ** もどき作成に使用した物 [#u2dabefb] | ||
+ | - [[WeMOS D1>/開発/WeMos D1]]~ | ||
+ | 数年前に500円ぐらいで購入した激安のHiLetGo製[[WeMos D1互換ボード>https://amzn.to/3Rnozo7]]((HiLetGO製のボードは現在は販売されていない。こちらは似たようなボード))があったので使ってみた。このボードには無線LAN機能があるので,Networkに接続できる。~ | ||
+ | [[WeMOS D1 Mini>https://amzn.to/3UUpHmk]]だともっと小さいボードなので小型に作成するには良いかも。~ | ||
+ | - Tower Pro SG92R マイクロサーボモーター~ | ||
+ | Amazonで[[Tower Pro製 SG92R ラジコン用の小型サーボモーター>https://amzn.to/3SLp3Wg]]を500円ぐらいで購入した。~ | ||
+ | これを使ってアクチュエーターでスイッチをON/OFF出来るかもしれない。~ | ||
+ | - 12VのACアダプター~ | ||
+ | ころがっていたACアダプター。WeMos D1互換ボード用の電源として使用した。~ | ||
+ | |||
+ | ** ハードウェアの作成 [#u8ada48c] | ||
+ | 以下のように,WeMos D1互換ボードとマイクロサーボモーターSG92Rとを1m程度のワイヤーで接続した。~ | ||
+ | WeMOS D1 SG92R ServoMotor | ||
+ | D6 ---------- 黄色 | ||
+ | +5V ---------- 赤色 | ||
+ | GND ---------- 茶色 | ||
+ | |||
+ | ** 壁のスイッチにマイクロサーボモーターを貼り付ける [#qba0abf6] | ||
+ | &ref(microservomotor.png,,40%); マイクロサーボモーターを壁のスイッチの近くに両面テープで固定した。~ | ||
+ | スイッチは右側を押すとONに左側を押すとOFFになるので,アクチュエーターをだいたい真ん中ぐらいにして貼り付けた。~ | ||
+ | うまく動作するのに,貼り付ける位置が微妙に影響する。少しでもずれるとスイッチを押せない &worried; | ||
+ | |||
+ | WeMos D1互換ボードとACアダプターは床に置いてある。~ | ||
+ | |||
+ | しかし,ださいなぁ ;) | ||
+ | |||
+ | ** ソフトウェアの作成 [#c54545bd] | ||
+ | WeMos D1互換ボードに書き込むソフトウェアは,[[Arduino IDE>/開発/WeMos D1#nff0b1a9]]で作成した。~ | ||
+ | |||
+ | PCとWeMos D1互換ボードをUSBで接続し,直接作成したプログラムを書き込める。~ | ||
+ | |||
+ | *** Arduino IDE用のライブラリのインストール [#yd3fe158] | ||
+ | - WeMOS D1ハードウェアパッケージ~ | ||
+ | [[WeMOS D1ハードウェアパッケージをArduino IDEにインストールする>/開発/WeMos D1#l51e57d4]]。~ | ||
+ | - [[FauxmoESP>https://github.com/vintlabs/fauxmoESP/]]ライブラリ~ | ||
+ | [[ESP8266>https://ja.wikipedia.org/wiki/ESP8266]]や[[ESP32>https://ja.wikipedia.org/wiki/ESP32]]のボードで[[Philips Hue ライト>https://www.philips-hue.com/ja-jp/]]をローカルデバイスとしてエミュレートして,Alexaデバイスと連携出来るようにするライブラリ。~ | ||
+ | [[ここ>https://github.com/vintlabs/fauxmoESP/archive/refs/heads/master.zip]]からzipファイルをダウンロードして,Arduino IDEでzipファイルからインストールした。~ | ||
+ | Arduino IDEのライブラリマネージャーでfauxmoESPを指定してもインストールできる。~ | ||
+ | - [[ESPAsyncTCP>https://github.com/me-no-dev/ESPAsyncTCP/]]ライブラリ~ | ||
+ | ESP8266でFauxmoESPライブラリを使う場合は,ESPAsyncTCPライブラリが必要。~ | ||
+ | [[ここ>https://github.com/me-no-dev/ESPAsyncTCP/archive/refs/heads/master.zip]]からzipファイルをダウンロードして,Arduino IDEでzipファイルからインストールした。~ | ||
+ | ESP32を使用したボードを使う場合は,[[ここ>https://github.com/me-no-dev/AsyncTCP/archive/master.zip]]から[[AsyncTCP>https://github.com/me-no-dev/AsyncTCP/]]ライブラリのzipファイルをダウンロードして,Arduino IDEでzipファイルからインストールする。~ | ||
+ | |||
+ | 第3世代Echo DotのようなAlexaデバイスと連携する場合は,WEBポートに80番を使用する必要がある。~ | ||
+ | またESP8266の場合,Arduino IDEの設定でLwIPを"v1.4 Higher Bandwidth"に設定する。~ | ||
+ | |||
+ | *** プログラム [#fd72b460] | ||
+ | 以下のプログラムを作成した。~ | ||
+ | |||
+ | 標準ライブラリのServoライブラリを使ってサーボモーターを動かしている。~ | ||
+ | write(angle) でangleに角度を指定するとその角度に動く。~ | ||
+ | |||
+ | Alexaデバイスから使えるように[[FauxmoESP>https://github.com/vintlabs/fauxmoESP/]]ライブラリを使用している :) ~ | ||
+ | |||
+ | ''botswitch.ino'' | ||
+ | #code(c,nonumber){{ | ||
+ | // botswitch.ino | ||
+ | // SwitchBotもどき | ||
+ | // WeMOS D1にMicro Servoを使ってスイッチをON/OFFさせる | ||
+ | // WeMOS D1 SG92R ServoMotor | ||
+ | // D6 ---------- 黄色 | ||
+ | // +5V ---------- 赤色 | ||
+ | // GND ---------- 茶色 | ||
+ | #include <Arduino.h> | ||
+ | #ifdef ESP32 | ||
+ | #include <WiFi.h> | ||
+ | #else | ||
+ | #include <ESP8266WiFi.h> | ||
+ | #endif | ||
+ | #include "fauxmoESP.h" | ||
+ | |||
+ | #include <Servo.h> | ||
+ | Servo myservo; // Servoオブジェクト | ||
+ | |||
+ | int servoIni = 90; // 通常時角度 | ||
+ | int servoOn = 140; // On角度 | ||
+ | int servoOff = 40; // Off角度 | ||
+ | int servoState = 0; | ||
+ | int flag = 0; | ||
+ | |||
+ | // WLAN接続の設定 | ||
+ | #include "wifisetting.h" | ||
+ | |||
+ | fauxmoESP fauxmo; // fauxmoESPオブジェクト | ||
+ | |||
+ | #define SERIAL_BAUDRATE 115200 // Baurate=115200 | ||
+ | |||
+ | #define ID "スイッチ" // AlexaデバイスID | ||
+ | |||
+ | const int ledPin = D5; // onboard LEDポート | ||
+ | const int motorPin = D6; // ServoMotor用出力ポート | ||
+ | |||
+ | // WLAN設定 | ||
+ | void wifiSetup() { | ||
+ | WiFi.mode(WIFI_STA); // 無線LANをインフラストラクチャモードにする | ||
+ | |||
+ | Serial.printf("[WIFI] Connecting to %s ", WIFI_SSID); | ||
+ | WiFi.begin(WIFI_SSID, WIFI_PASS); // WLANに接続 | ||
+ | |||
+ | // 接続出来るまで待つ | ||
+ | while (WiFi.status() != WL_CONNECTED) { | ||
+ | Serial.print("."); | ||
+ | delay(100); | ||
+ | } | ||
+ | Serial.println(); | ||
+ | Serial.printf("[WIFI] STATION Mode, SSID: %s, IP address: %s\n", WiFi.SSID().c_str(), WiFi.localIP().toString().c_str()); // 接続出来た! | ||
+ | } | ||
+ | |||
+ | void setup() { | ||
+ | Serial.begin(SERIAL_BAUDRATE); // init シリアルポート | ||
+ | Serial.println(); | ||
+ | Serial.println(); | ||
+ | |||
+ | // init onboard LED | ||
+ | pinMode(ledPin, OUTPUT); | ||
+ | delay(10); | ||
+ | digitalWrite(ledPin, HIGH); | ||
+ | |||
+ | wifiSetup(); // init WLAN | ||
+ | |||
+ | fauxmo.createServer(true); // webserverの起動 | ||
+ | fauxmo.setPort(80); // TCP=80にする(第3世代Alexa) | ||
+ | |||
+ | fauxmo.enable(true); // fauxmo起動 | ||
+ | |||
+ | fauxmo.addDevice(ID); // AlexaデバイスIDを追加 | ||
+ | |||
+ | // AlexaからのCallback関数 | ||
+ | // device_idとdevice_nameがAlexaアクションによりセットされる | ||
+ | // StateにON=1/OFF=0,valueに値2-255(例:「ライトを50%にして」=128)がセットされる | ||
+ | // 出来るだけ早くこのcallback関数を抜けるようにする | ||
+ | fauxmo.onSetState([](unsigned char device_id, const char * device_name, bool state, unsigned char value) { | ||
+ | Serial.printf("[MAIN] Device #%d (%s) state: %s value: %d\n", device_id, device_name, state ? "ON" : "OFF", value); | ||
+ | |||
+ | if (strcmp(device_name, ID) == 0) { // デバイス名の確認 | ||
+ | if (state) { | ||
+ | flag = 1; // ON | ||
+ | } else { | ||
+ | flag = 2; // OFF | ||
+ | } | ||
+ | } | ||
+ | }); | ||
+ | } | ||
+ | |||
+ | void loop() { | ||
+ | fauxmo.handle(); // fauxmoESPは非同期TCP serverなのでUDP packetをpollする | ||
+ | |||
+ | if (flag == 1) { | ||
+ | lightOn(); | ||
+ | flag = 0; | ||
+ | } else if (flag == 2) { | ||
+ | lightOff(); | ||
+ | flag = 0; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | // スイッチをONする | ||
+ | void lightOn() { | ||
+ | digitalWrite(ledPin, LOW); // LED on | ||
+ | |||
+ | // Onアクション | ||
+ | myservo.attach(motorPin); | ||
+ | delay(1000); | ||
+ | myservo.write(servoOn); | ||
+ | delay(1000); | ||
+ | myservo.write(servoIni); | ||
+ | delay(1000); | ||
+ | myservo.detach(); | ||
+ | |||
+ | Serial.print("Switch on ...\n"); // シリアル出力 | ||
+ | |||
+ | digitalWrite(ledPin, HIGH); // LED off | ||
+ | } | ||
+ | |||
+ | // スイッチをOFFする | ||
+ | void lightOff() { | ||
+ | digitalWrite(ledPin, LOW); // LED on | ||
+ | |||
+ | // Offアクション | ||
+ | myservo.attach(motorPin); | ||
+ | delay(1000); | ||
+ | myservo.write(servoOff); | ||
+ | delay(1000); | ||
+ | myservo.write(servoIni); | ||
+ | delay(1000); | ||
+ | myservo.detach(); | ||
+ | |||
+ | Serial.print("Switch off ...\n"); // シリアル出力 | ||
+ | |||
+ | digitalWrite(ledPin, HIGH); // LED off | ||
+ | } | ||
+ | }} | ||
+ | |||
+ | ''wifisetting.h''~ | ||
+ | #code(c,nonumber){{ | ||
+ | #define WIFI_SSID "WiFiアクセスポイントのSSID" | ||
+ | #define WIFI_PASS "そのパスワード" | ||
+ | }} | ||
+ | |||
+ | Arduino IDEからWeMOS D1ボードにコンパイルして書き込んだ。~ | ||
+ | |||
+ | * Echo Dotとの連携 [#wd3cda64] | ||
+ | Android端末のAlexaアプリを起動して,以下のようにしてデバイスを追加した。~ | ||
+ | - デバイスをクリック~ | ||
+ | - 右上の+ボタンをクリック~ | ||
+ | - デバイスを追加をクルック~ | ||
+ | - その他をクリック~ | ||
+ | - デバイスを検出をクリック~ | ||
+ | |||
+ | しばらくすると作成したスイッチという名前のデバイス(電球タイプ)が検出された。~ | ||
+ | |||
+ | それにしてもAlexaデバイスはローカルデバイスを直接アクセスできるのが素晴らしいなぁ :) | ||
+ | |||
+ | ** Echo Dotで操作してみる [#faf06fc9] | ||
+ | 「アレクサ,スイッチオン」と言うと,マイクロサーボモーターが少し回って壁のスイッチをONした。~ | ||
+ | 「アレクサ,スイッチオフ」と言うと,マイクロサーボモーターが少し逆に回って壁のスイッチをOFFした。~ | ||
+ | |||
+ | スイッチじゃ味気ないんで,「電気つけて/消して」とか「ライトつけて/消して」とかの定形アクションを作成した。~ | ||
+ | |||
+ | これで,[[SwitchBotのボット>https://www.switchbot.jp/pages/switchbot-bot]]のような事が出来るようになった。~ | ||
+ | |||
+ | 確かに声で操作するのは便利だ。 | ||
+ | |||
+ | * 課題 [#qa78f6c0] | ||
+ | - 2個のスイッチに対応する~ | ||
+ | マイクロサーボモーターを2個使えばいいのだが,1個でなんとかならないかな。~ | ||
+ | - 固定方法がなんとかならないか~ | ||
+ | 両面テープでマイクロサーボモーターを貼り付けているだけなんで,うまくスイッチが押せなくなってしまうことがある。 | ||
+ | - Google Home Miniで使えるようにする~ | ||
+ | WEBからON/OFF出来るAPIを用意して,IFTTT(Google Assistant)を使ってWEB APIをアクセスすればいいのかも。~ | ||
+ | 09/01/2022からGoogle AssistantとIFTTTの連携の仕様が変更になり,数値や文字等のパラメーターをIFTTTに渡せなくなってしまった ;( リモコン等の用途にIFTTTは役立たずになってしまった。 | ||
+ | - [[SwitchBot ボットを購入>https://amzn.to/3VfQlZp]]する~ | ||
+ | やれることは同じなんで,どうしようかな。 |