SwitchBotのボットもどきの作成 anchor.png

家のアパートのリビングの照明スイッチは古い2個口のスイッチ [worried] これでON/OFFしているのが,これまた古い電球型蛍光灯。

IoTということでちょっと便利になるようにSwitchBotのボットを使ってEcho DotGoogle Home Miniを使ってON/OFFさせてみたいと思ったのだが,SwitchBotのボットを購入する前にとりあえず同様な機能の物を,ありあわせの物で自作してみることにした。

Page Top

もどき作成に使用した物 anchor.png

  • WeMOS D1
    数年前に500円ぐらいで購入した激安のHiLetGo製WeMos D1互換ボード*1があったので使ってみた。このボードには無線LAN機能があるので,Networkに接続できる。
    WeMOS D1 Miniだともっと小さいボードなので小型に作成するには良いかも。
  • Tower Pro SG92R マイクロサーボモーター
    AmazonでTower Pro製 SG92R ラジコン用の小型サーボモーターを500円ぐらいで購入した。
    これを使ってアクチュエーターでスイッチをON/OFF出来るかもしれない。
  • 12VのACアダプター
    ころがっていたACアダプター。WeMos D1互換ボード用の電源として使用した。
Page Top

ハードウェアの作成 anchor.png

以下のように,WeMos D1互換ボードとマイクロサーボモーターSG92Rとを1m程度のワイヤーで接続した。

WeMOS D1         SG92R ServoMotor
   D6 ---------- 黄色
  +5V ---------- 赤色
  GND ---------- 茶色
Page Top

壁のスイッチにマイクロサーボモーターを貼り付ける anchor.png

microservomotor.png マイクロサーボモーターを壁のスイッチの近くに両面テープで固定した。
スイッチは右側を押すとONに左側を押すとOFFになるので,アクチュエーターをだいたい真ん中ぐらいにして貼り付けた。
うまく動作するのに,貼り付ける位置が微妙に影響する。少しでもずれるとスイッチを押せない [worried]

WeMos D1互換ボードとACアダプターは床に置いてある。

しかし,ださいなぁ ;)

Page Top

ソフトウェアの作成 anchor.png

WeMos D1互換ボードに書き込むソフトウェアは,Arduino IDEで作成した。

PCとWeMos D1互換ボードをUSBで接続し,直接作成したプログラムを書き込める。

Page Top

Arduino IDE用のライブラリのインストール anchor.png

  • WeMOS D1ハードウェアパッケージ
    WeMOS D1ハードウェアパッケージをArduino IDEにインストールする
  • FauxmoESPライブラリ
    ESP8266ESP32のボードでPhilips Hue ライトをローカルデバイスとしてエミュレートして,Alexaデバイスと連携出来るようにするライブラリ。
    ここからzipファイルをダウンロードして,Arduino IDEでzipファイルからインストールした。
    Arduino IDEのライブラリマネージャーでfauxmoESPを指定してもインストールできる。
  • ESPAsyncTCPライブラリ
    ESP8266でFauxmoESPライブラリを使う場合は,ESPAsyncTCPライブラリが必要。
    ここからzipファイルをダウンロードして,Arduino IDEでzipファイルからインストールした。
    ESP32を使用したボードを使う場合は,ここからAsyncTCPライブラリのzipファイルをダウンロードして,Arduino IDEでzipファイルからインストールする。

第3世代Echo DotのようなAlexaデバイスと連携する場合は,WEBポートに80番を使用する必要がある。
またESP8266の場合,Arduino IDEの設定でLwIPを"v1.4 Higher Bandwidth"に設定する。

Page Top

プログラム anchor.png

以下のプログラムを作成した。

標準ライブラリのServoライブラリを使ってサーボモーターを動かしている。
write(angle) でangleに角度を指定するとその角度に動く。

Alexaデバイスから使えるようにFauxmoESPライブラリを使用している :)

botswitch.ino

Everything is expanded.Everything is shortened.
-
|
|
|
|
|
|
!
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
-
!
 
 
 
 
 
 
 
 
 
 
-
-
|
|
|
|
|
-
-
|
|
!
|
|
!
 
-
|
|
|
|
-
!
|
|
|
|
|
|
|
|
|
|
|
|
-
|
|
|
-
|
|
-
-
|
-
|
!
!
!
!
 
-
|
|
-
|
|
-
|
|
!
!
 
-
-
|
|
-
!
|
|
|
|
|
|
|
|
|
|
!
 
-
-
|
|
-
!
|
|
|
|
|
|
|
|
|
|
!
// 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

Everything is expanded.Everything is shortened.
 
 
#define WIFI_SSID "WiFiアクセスポイントのSSID"
#define WIFI_PASS "そのパスワード"

Arduino IDEからWeMOS D1ボードにコンパイルして書き込んだ。

Page Top

Echo Dotとの連携 anchor.png

Android端末のAlexaアプリを起動して,以下のようにしてデバイスを追加した。

  • デバイスをクリック
  • 右上の+ボタンをクリック
  • デバイスを追加をクルック
  • その他をクリック
  • デバイスを検出をクリック

しばらくすると作成したスイッチという名前のデバイス(電球タイプ)が検出された。

それにしてもAlexaデバイスはローカルデバイスを直接アクセスできるのが素晴らしいなぁ :)

Page Top

Echo Dotで操作してみる anchor.png

「アレクサ,スイッチオン」と言うと,マイクロサーボモーターが少し回って壁のスイッチをONした。
「アレクサ,スイッチオフ」と言うと,マイクロサーボモーターが少し逆に回って壁のスイッチをOFFした。

スイッチじゃ味気ないんで,「電気つけて/消して」とか「ライトつけて/消して」とかの定形アクションを作成した。

これで,SwitchBotのボットのような事が出来るようになった。

確かに声で操作するのは便利だ。

Page Top

課題 anchor.png

  • 2個のスイッチに対応する
    マイクロサーボモーターを2個使えばいいのだが,1個でなんとかならないかな。
  • 固定方法がなんとかならないか
    両面テープでマイクロサーボモーターを貼り付けているだけなんで,うまくスイッチが押せなくなってしまうことがある。
  • Google Home Miniで使えるようにする
    WEBからON/OFF出来るAPIを用意して,IFTTT(Google Assistant)を使ってWEB APIをアクセスすればいいのかも。
    09/01/2022からGoogle AssistantとIFTTTの連携の仕様が変更になり,数値や文字等のパラメーターをIFTTTに渡せなくなってしまった ;( リモコン等の用途にIFTTTは役立たずになってしまった。
  • SwitchBot ボットを購入する
    やれることは同じなんで,どうしようかな。

*1 HiLetGO製のボードは現在は販売されていない。こちらは似たようなボード

新しくコメントをつける

題名
ゲスト名
投稿本文
より詳細なコメント入力フォームへ

トップ   凍結 差分 バックアップ 複製 名前変更 リロード   ページ新規作成 全ページ一覧 単語検索 最新ページの一覧   ヘルプ   最新ページのRSS 1.0 最新ページのRSS 2.0 最新ページのRSS Atom
Counter: 432, today: 2, yesterday: 2
最終更新: 2022-10-01 (土) 12:41:15 (JST) (573d) by yuji