最終更新: 2022/12/19(Mon)21:22

自作と修理を愛するブログ。トイラジ、電子工作、ボルティー、NucleusCMS 、いろいろゴソゴソやってます
3Dプリンター / 3Dスキャナーも -kyu-

Home > Raspberry pi

ラズパイ Alexa で部屋の照明を操作する

  • カテゴリ: Raspberry pi

部屋の照明を点けたり消したりするのを音声コマンドでできると便利です。いわゆるスマートホームってやつです。
LED 照明そのものにその手の機能が内蔵されているものも市販されてますし、あと付けで壁スイッチの配線に割り込ませるタイプのものもあります。
電気工事士の資格がないと壁スイッチの中をいじることはできません。なので壁スイッチを物理的に操作する、いわゆる指ロボット的なものが流行っています。代表的なのがこれら。

でも市販品はどれもこれもみな高いんですよね。ってことで例によって自作することにしました。

まずは構想設計から。

壁スイッチは旧松下電工のワイド21:ほたるスイッチの旧モデル品です。一般的なシーソータイプのスイッチではなく、プッシュオンプッシュオフのトグル切り替え。同じ場所を押す離すという動作をするだけでオンオフ切り替えられます。なのでなにかしらの電動アクチュエータで壁スイッチの一点を押せばいいんですね。操作したい壁スイッチは ラズパイアレクサから直線距離で 3m 程度のところにあります。
ラズパイからワイヤードで直接つなぐのもありっちゃありですが、意外と配線の取り回しに苦労しそうです。なので独立した制御系を設けることにします。Arduino とか。
壁スイッチ近辺まで配線を這わせていかないとならないので、給電のための AC アダプタは使いたくないですね。なので乾電池駆動がよいかな。
乾電池で 5V をつくるのはかなり面倒くさいです。体積も大きくなるし。なのでなんとか電池二本、3V 近辺で動くようにしたいです。

マイコンの選定。
Arduino Pro mini を 3V 駆動するようにしたことはありますが、今回は無線で接続したいのでそのままではダメ。Arduino に無線シールドとかつければよいのかなと調べていたら、ESP-WROOM-02 というモジュールの存在を知りました。
なんとこのモジュール、モデムとして Arduino に取り付けられるばかりでなく、単独で Arduino として動作させることができるとのこと。これだけあれば別途マイコンは不要。日本国内で使用するための技適も取得済み。給電は 3.3V。すばらしい。早速 Aliexpress で検索し発注しました。買ったときは送料無料で 1.83USD でした。

ちなみに、外付けで最低限必要な抵抗やコンデンサとレギュレータなどがセットになって、一般的な 2.54 ピッチ変換までされている開発ボードというのを使うと楽ちんですが、労力でカバーできるところには金をかけない主義なので、単体モジュールと自分ではんだ付けする変換基板を買いました。

さて、制御系が届くまでには時間があるので、そのあいだにメカまわりをつくります。

動力源として使えそうなのはソレノイドかモータ。奇をてらって最初はソレノイドを使ってみました。

★試作その1 ソレノイド
見たまんまの構成。ソレノイドの引込力でそのまま壁スイッチを押すという魂胆でしたが大きな落とし穴が。
世の中に流通しているソレノイドの大半は定格電圧 12V なんですね。低電圧駆動のソレノイドもなくはないのですが結構お高い。たまたま持っていたジャンクソレノイドもご多分に漏れず 12V 品でした。
試しに 3V で駆動してみましたがまったくの力不足で壁スイッチは動きませんでした。こりゃダメです。

続いてモータ。ぱっと思い浮かぶのはいわゆる 130 モータ。ミニ四駆に使われているアレです。トルクのバリエーションも豊富だし自宅在庫はたくさんあります。都合の悪いところといえば回転数が 9000rpm と高いこと。なんとかして減速しないと使い物になりません。

★モジュール 0.5 平ギヤ
3D プリンタでモジュール 0.5 の歯車がつくれるのか試作してみました。意外といけそう。


で、適当にギヤボックス化してみました。動くことは動きますね。でもコレでもまだ減速が足りない感じ。動きが速すぎるのと力が足りません。

★試作その2 130モータ
さらに減速を増やしてガワをつくってカムを駆動してなんてやってたら、たいそうなものになってしまいました。カムは壁スイッチを押すのと原点検出用のマイクロスイッチを押すのと両方に使います。

これでも目的の動作は可能なんですがここにも落とし穴。なにしろうるさい。3D プリンタ製の歯車は精度がイマイチなので盛大な音がします。かみ合わせが悪いのでバックラッシを大きめに取らないと動かないというのも理由のひとつ。

★ESP-WROOM-02 と SG90
そうこうしている間に ESP-WROOM-02 が到着してしまいました。ピンピッチ変換基板も買ったんですが品番間違えたらしくて使えず。トホホ。
で、アクチュエータの保険として同時購入していたマイクロサーボ SG90 ( の互換品 ) を使うことにしました。世の中の作例でよく出てくるアレです。

サーボは制御がめんどくさいと敬遠してたんですが、Arduino 標準ライブラリの servo.h を使えばめっちゃ簡単でした。ただし SG90 は定格 5V なので 3V で動かすのは結構不安ではあります。

★ピンピッチ変換
ESP-WROOM-02 のピンピッチ変換基板を間違えたので、ユニバーサル基板で自作しました。結構しんどかったです。赤いワイヤーはなにかのモータをばらしてとったエナメル線です。

ここからは ESP-WROOM-02 のお話。参考にさせていただいたのはこちらです。
ESP-WROOM-02にArduinoのスケッチを書き込む [配線図/GPIO] - プチモンテ
スマホでLEDを点灯させる (Webサーバー版) - プチモンテ

★ESP-WROOM-02 ピン配
ESP-WROOM-02 のピン配です。IO0、IO2、IO15 は起動モードを設定するピンです。
図のとおりプルアップ / プルダウンするんですが、IO0 だけはスケッチ書き込み時は Lo、実行時は Hi にしないといけません。
プルアップ / プルダウンは 10kΩ の抵抗で。セラコンは電源安定化のためのもの。

★L チカ
ブレッドボードでひとまず L チカ。特に問題なく Arduino として使用できます。こりゃ便利だわ。IO0 はジャンパワイヤを抜き差しして書き込みと実行のモード切替しました。RST も同様。
なおプルアップ / プルダウン抵抗が 1k ですが単純に間違えただけですので気にしないように。

★基板
基板は mbe でお絵かきしたものを見ながらユニバーサル基板で作成。IO0はジャンパピン、RST はタクトスイッチとしました。実行時はジャンパピンを Hi 、書き込み時は Lo にします。

★モデリング
基板のサイズが出たので、SG90 やら電池ボックスやらを配置して全体レイアウトを決定。
Fusion360 で、空間の特定の場所にパーツを配置して拘束する方法ってあるんでしょうか? パーツとパーツのジョイントはできるんですが、構想設計の段階ではどうやるのがベストなのかよくわかってません。ひとまずスケッチ上の点をめがけて移動コマンドかまして、後でパーツにしてからジョイントしてますが… そもそも考え方が違うのかな。

★3D プリント
ベース部分を 3D プリント。まあいつもどおりの出来栄えです。ヒーテッドベッドから上に 5mm くらいまでが荒れてるのもいつもどおり。設定の不備かメカ起因か。深く追っかけてません。いつかやろうと思いつつほったらかしてます。

★組み立て
組み立て。特に問題なし。

肝心のスケッチはプチモンテさんの「スマホでLEDを点灯させる (Webサーバー版)」にサーボ関係を加筆した程度のものです。


#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <Servo.h>

const char* ssid     = "your-ssid";
const char* password = "your-password";
IPAddress ip(192, 168, 0, 215);
IPAddress gateway(192, 168, 0, 1);
IPAddress netmask(255, 255, 255, 0);
String html = "";
ESP8266WebServer server(80);

Servo myservo;  // create servo object to control a servo

void setup(void){
  html = "<!DOCTYPE html>\
<html>\
<head>\
<meta charset=\"UTF-8\">\
<meta name=\"viewport\" content=\"width=device-width,initial-scale=1,minimum-scale=1\">\
</head>\
<body>\
<input type=\"button\" value=\"切替\" style=\"font-size:32px;\" onclick=\"location.href='/switch';\">\
</body>\
</html>";

 
  myservo.attach(5); // attaches the servo on GIO5 to the servo object
  myservo.write(0);  // move to position "0"
  delay(500);
  myservo.detach();  // detaches the servo

  WiFi.mode(WIFI_STA); // station mode
  WiFi.config(ip, gateway, netmask);    
  WiFi.begin(ssid, password);
 
  // Waiting Wi-fi connection
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
  }
  
  // ./
  server.on("/", [](){
    server.send(200, "text/html", html);     
  });
  
  // ./switch
  server.on("/switch", [](){
    myservo.attach(5);
    myservo.write(40);
    delay(500);
    myservo.write(0);
    delay(500);
    myservo.detach();
    server.send(200, "text/html", html);      
  });
 
  // Not found
  server.onNotFound([](){
    server.send(404, "text/plain", "404");
  });
 
  server.begin();
}
 
void loop(void){  
  server.handleClient();
}

Web ブラウザで http://192.168.0.215/switch にアクセスすると、サーボホーンが 0°→40°→0° と動きます。これでスマホや PC から壁スイッチが操作できるようになりました。

最後にラズパイ側。 原理的には前の記事の PC を起動するのと変わりません。http で Webにアクセスするスクリプトをつくっておいて、Node-RED でこれを叩きます。スクリプトは python で作成しました。参考にさせていただいたのはこちら。

Raspberry Pi making HTTP requests using Python - Learn2Crack

switch.py

import urllib2
import urllib

query_args = { 'RPI':'Active' }
url = 'http://192.168.0.215/switch'
data = urllib.urlencode(query_args)
request = urllib2.Request(url, data)
response = urllib2.urlopen(request).read()
print response

★Node-RED
Node-RED はこんな感じ。「部屋の電気」という名前にしましたwww

つくってみてわかったこと。なにげに便利なんですよこれ。休日の昼間になにか作業していて、気づくと夕暮れなんてことがままあるわけですが、席を立たずに照明が点けられるんですんですね。足の踏み場もないくらい椅子の周りがとっちらかっていても灯りが点けられる。マジ便利ですわ。
心配事といえば電池の持ちですかね。定格 5V のマイクロサーボを電池 2 本で駆動してて、あっという間に電池が終わっちゃいそう。待機時には消費電力を抑える工夫とか必要かもしれないです。

ってことで翌日。

「アレクサ、部屋の電気を点けて」
「はい」

返事はあれど電灯は点かず。サーボが動く音もしません。電池の電圧をあたってみると一本あたり 1.1V を下回っています。やっぱりダメか。仕方ないので AC アダプタ化します。
手持ちの部材をあたってみましたが、3V 付近の AC アダプタは見つからず。9V と 5V ならたくさんあるんだけどなぁ。なので 5V から 3.3V を作ります。いろいろ部品買うのも面倒なので、Amazon で見つけたこれを使うことにしました。

5 コセットで 290 円の激安品。一個あたり 59 円ですよ。すごいなぁ。ただし到着まで二週間かかりました。
ちなみに抵抗の分圧で 3.3V つくればいいんじゃね? と試してみて失敗したのは内緒です。当たり前ですが負荷がかかると電圧が変動します。
あと、サーボに 5V 給電して信号入力は 3.3V でもいいかななんて考えてましたがこれもダメ。やるなら信号をレベルシフトして 3.3V → 5V にする必要があります。一石のトランジスタで簡単に組めますが今回は見送り。

★DC-DC コンバータ実装
ESP-WROOM-02 のゲタ下の部分が空いてますのでここに実装。電圧の調整は半固定抵抗で。事前に合わせておきます。この半固定抵抗を回せるドライバを持っていないのもありますが、調整自体がかなりシビアでした。ちょっと回すとドカンと値が変化します。これを固定抵抗に置き換えて使う人が多いようです。特に車載用途など振動のある環境ではなおのこと。

★筐体の作り直し
電池ボックスがなくなったのでベース部分を再デザイン。ついでに簡単なカバーもつくりました。カバーの肉厚は 1.6mm としましたがちょっと厚すぎたみたい。1.2mm もあれば充分ですね。

★完成
ってことでやっと完成です。
結局は給電がワイヤードになってしまいましたが、初めてのマイコンとかいろいろ楽しかったです。

コメント

2件のコメントがあります

遂にESP-WROOMにも手を出したんですね。
WROOM-32の方を使ってECUを作れないかと考えているので、ESPの使い方が参考にならないかと興味を以て読ませてもらいました。

ところで電灯のスイッチがプッシュオン、プッシュオフタイプという事は、点灯、消灯何れの場合でも機械的動作は同じですよね。
ESP(或いはアレクサ?)は点灯、消灯の状態をどうやって認識しているのでしょうか?

  • マハル

マハルさんこんにちは。
おっしゃる通りでして、機械的動作は同じなので実行すると今の状態を反転するだけです。
照明がついている時に「アレクサ、部屋の電気点けて」とお願いすると、しれっと電気を消してくれますwww NODE-RED でもオンオフで呼び出す py は同じです。
ちょっと気持ち悪いですが支障はないのでこういう仕様です。

  • kyu

コメントを投稿

( *は必須項目です )

%3c%69%6e%70%75%74%20%74%79%70%65%3d%22%68%69%64%64%65%6e%22%20%6e%61%6d%65%3d%22%6e%70%5f%70%72%6f%74%65%63%74%62%79%6d%64%35%22%20%76%61%6c%75%65%3d%22%63%63%30%63%35%61%31%64%61%62%63%30%39%32%38%63%64%38%63%37%30%38%66%65%32%61%35%35%62%66%38%37%22%3e %3c%69%6e%70%75%74%20%74%79%70%65%3d%22%68%69%64%64%65%6e%22%20%6e%61%6d%65%3d%22%6e%70%5f%70%72%6f%74%65%63%74%62%79%6d%64%35%5f%68%61%73%68%22%20%76%61%6c%75%65%3d%22%63%62%65%39%33%31%64%30%38%32%35%36%63%32%35%34%33%61%66%37%33%32%36%31%65%66%66%62%33%38%64%36%22%3e

サイト内検索

↑ページ先頭へ

2385970 [Mode]
Copyright © kyu-weblog All Rights Reserved. Powered by Nucleus CMS v3.71 管理