現: 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]]する~
 +やれることは同じなんで,どうしようかな。
  

  • 開発/SwitchBotのボットもどきの作成 のバックアップ差分(No. All)
    • 現: 2022-10-01 (土) 11:41:15 yuji
      • Deleted an attach file: microservomotor.png at 2022-10-01 (土) 11:44:32

トップ   差分 バックアップ 複製 名前変更 リロード   ページ新規作成 全ページ一覧 単語検索 最新ページの一覧   ヘルプ   最新ページのRSS 1.0 最新ページのRSS 2.0 最新ページのRSS Atom
Counter: 444, today: 1, yesterday: 1