WoT開発

Read Article

壁スイッチコントローラを作る

遠隔操作で家庭の照明スイッチをON/OFFするデバイスです。
家庭用の照明をスマートフォンのリモコン機能を使ってON/OFFできたら便利になると思います。最近ではリモコン付きのLEDランプが売っていますがとても高価で手がでません。今回は一般家庭についている壁スイッチをスマートフォンからON/OFFする壁スイッチコントローラ(壁コン)を作ってみました。応用すればタイマーなどを使って照明スイッチをON/OFFできるようになります。

ブロック図
20150323_switch3
スマートフォンから壁コンの操作を行い、壁コンに接続されているサーボモーターを駆動します。そのサーボモーターは照明スイッチの化粧板に貼り付けていて実際のスイッチをON/OFFをするという仕組みです。照明スイッチ自体にこのような仕組みが入っているのが一番シンプルになると思いましたが、壁スイッチ自体を交換するには電気工事士の資格が必要なので化粧板以外は分解しないようにしましょう。

サーボモーターは入手性が高いラジコン用のものを使用します。一般市販しているラジコン用のサーボモーターであれば与える信号が同じなので大体のものが利用可能です。ただしデジタルサーボモータは信号が違って動作しないので購入時にご注意ください。

サーボモーターのコネクタは、電源(赤色)、グランド(黒色)、信号線(橙色)の三本で構成されています。電源は5Vが必要になります。サーボモーターは起電力に数百mA必要となるので、昇圧回路等で動作させる場合は注意が必要です。今回はACアダプタからの給電とします。

サーボの角度指定はPWMのパルス幅で行います。一般的なラジコン用サーボのパルス幅は、1ms~2msです。1.5ms付近が中立になります。パルス出力周期は20msecです。
纏めると以下のような図になります。
palse
ハードウェア
今回はSG-90というサーボモーターを使用します。
このサーボモーターのピンアサインは以下のようになっています。
茶色 GND
赤茶 Vcc(+電源)
オレンジ信号線
手元にあるSG90のパルス幅を計測したところ、600usec2200usec間で左右に最大動作するようでした。また中心の位置(中立位置)のパルス幅は1400usecでした。
SG-90の電源は4.8VですがHRM1017では3.3Vの出力しかなくコントロールできないのでSG-90用に5Vのスイッチング電源を使います。
また、グランドを共通にするため、DC電源のグランドと、SG-90のグランドと、HRM1017のグランドを接続します。
HRM1017のPWM出力LED2(P0_19)をSG-90に信号線に接続します。
スマホアプリケーションとBLEの接続を確認するためにLEDを接続します。 HRM1017のPWM出力LED1(P0_18)に抵抗100Ωを挟んでLEDのアノード側を接続し、反対側はグランドに落とします。

回路
上記に内容を回路図にすると以下のようになります。
また、サーボモーターの電源はDCジャックと接続し外部供給できるようにします。
knockdevice_ブレッドボード
ソフトウェア
スマートフォン側のアプリはRCBControllerを使用します。このアプリに対応したmbedのアプリがリリースされているのでこちらを元にソフトウェアを作ります。
http://developer.mbed.org/users/jksoft/notebook/langjambed-hrm1017_rcbcontroller_sample/
BLEの部分はそのまま流用させていただきます。

ソフトウェアの主な内容について解説します。

スマートフォンアプリのXボタンでスイッチオン(左回転)、Bボタンでスイッチオフ(右回転)となります。 それぞれ45度回転させます。 どちらのボタンも押されていないときは、中立位置に戻ります。
if (controller.data[0] == 0x01) {   //X Button
   SetServoDegree(-45);
}
else if (controller.data[1] == 0x40){  //B Button
   SetServoDegree(45);
}
else if (controller.data[0] == 0x0 && controller.data[1] == 0x0){
   SetServoDegree(0);
}

サーボ出力用ピンは元のソフトウェアと同じLED2(P0_19)を使用します。mbedのPWM出力を利用してサーボ駆動に必要なパルスを作り出します。
PwmOut servo1(LED2); 

パルス出力周期は20ms(=50Hz)です。 また初期化時に中立位置に戻します。
servo1.period_ms(20);
SetServoDegree(0);

スイッチON/OFF時の動作はサーボモーターを一定角度分(45度)だけ回転させて元の位置に戻します。
左右の最大回転角のパルス幅から指定角度回転させるには 、以下のような関数となります。
const int deg0usec = 600; // usec.
const int deg180usec = 2200; // usec.

//In float degree -90 to +90
void SetServoDegree(float degree)
{
	float range = (float)(deg180msec - deg0msec) / 180;
    float pwitdh = (float)((degree+90)*range)+(float)deg0msec;
    servo1.pulsewidth(pwitdh/1000000);
} 

今回作成したソフトウェアはこちらにおいておきます。

とりつけ
サーボーモーターを両面テープで化粧板に貼り付けます。
壁スイッチコントローラと電池も貼り付けます。ちょっと大きくなりすぎかもしれません。。
IMG_0332
スマホからコントロールすると。。。ON/OFFできました。

超小型化すれば製品になるかもしれませんね

Return Top