PR

PICマイコンで壁スイッチをタイマー制御

電子工作

マイコン(マイクロコントローラ)とサーボモーターを使って、壁スイッチをタイマー動作させてみました。気軽に見てください。

就寝前、お風呂やトイレの換気扇スイッチを入れた時に「一晩中つけっぱなしにするのもったいないなぁ」と思うことありませんか?

以下のようなスイッチボックスに埋め込むタイプが市販されていますが電気工事士の資格がないと取り替えができません。

電気工事なしで取り付けられるものがないか探したら以下のような製品がありました。これと同じようなものが作れないか挑戦してみました。

主な部材

サーボモーター(RCサーボ)

動力としてラジコンなどで使われるサーボモーター(SG92R)を使用しました。
これを動作させるためのPWM信号は周期20ms(周波数50Hz)でパルス幅0.5~2.4msに変化することで角度を制御角0~180°の範囲で制御できます。

PICマイコン(ハードウェア)

今回はPICマイコンでRCサーボを制御して、タッチペンを回転させることで壁スイッチのON/OFFを動作させます。RCサーボを制御するにはPWM出力の機能が必要になるため今回は手持ちPICの中からPIC16F1778を使用しました。

OLED(有機ELディスプレイ)モジュール

現在時刻とタイマーセット時刻の確認用に使用します。
液晶タイプではなく表示が鮮明でコンパクトなOLEDを選びました。

RTC(リアルタイムクロック)モジュール

指定時刻にタイマー動作させたいので正確な時間が取得できてアラーム機能を持っているこちらのモジュールを秋月電子で購入。

制御基板の回路

回路図は上記になります。

PICのI2C機能を使ってRTCモジュール(RX-8025V)および有機ELディスプレイ(OLED128x64)と通信します。

押しボタンスイッチ(SW2~5)のON/OFF状態をPICに読み取らせることによって各種設定を行います。

RTCモジュールの/INTA信号をPICのRB0ピン(21番ピン)で受けることでタイマー動作させています。

サーボモーターを駆動する電源はPICマイコンと周辺回路の電源とは独立させていますが、GNDは共通です。

基板外観

ブレッドボード上に上記回路を実装した状態です。

サーボモーターの固定

サーボモーターはスイッチボックスのパネルに金具で固定しました。

金具はホームセンターで物色したのですが適当なものが見つからず、自作したのであまりきれいではありません。

今回製作したものはサーボモーターを2個取り付けて制御できるようになっていますが、動作確認に使用した壁スイッチが1個タイプなのでサーボモーターも1個のみ取り付けしました。

PICマイコンのソフトウェア

PICのソフトウェアはMPLAB X IDEのMCC機能を使用して作成しました。
プロジェクトを作る際、DeviceにPIC16F1778を選びます。

MCC設定

MCCを起動し、ProjectResourcesに「MSSP」「PWM6」「PWM11」「TMR2」を追加します。

Pin Manager

PinManagerで以下の設定を行います。
・押しボタンスイッチのON信号を受信するため2,3,16,17番ピンをinputに設定
・RTCモジュールからのアラーム信号を受信するために21番ピンをinputに設定
・サーボモーター制御のためのPWM信号を出力するため7,11番ピンをoutputに設定

System Module

SystemModuleの設定画面で System Clock Selectを「FOSC」、Internal Clockを「16MHz_HF」を選択。

MSSP

OLEDモジュールやRTCモジュールと通信するためMSSPを設定します。
「I2C」「Master」を選択し、割り込み「Interrupt Driven」をチェックします。

PWM6/PWM11

サーボモーターを制御するためPWM機能を使用します。
サーボモーターのPWMサイクルが20msなので、Periodに20msを指定できるようClockの分周を調整します。DutyCycleを5.5%にすることでデフォルト値が2200になるように調整しています。

TMR2

0.1s毎に動作するタイマーを作成します。この周期で条件を判断し装置の動きを決めます。

入力のしくみ

RTCモジュールに対する時刻合わせやタイマー起動時間の設定、2つのサーボモーターのうちタイマー動作させるサーボモーターの指定と回転方向の指定を4個の押しボタンを使って行っています。

2つのボタンの同時押しで「時刻表示」「時間設定(時刻合わせ)」「アラーム設定」の切り替えを行い、1つのボタンを押すことで「設定項目の移動」と「設定値の増減」を行っています。

PICのコード

PICのソースコードはGitHubで公開しています。
手作業でプログラムを編集するのは main.c という名前のファイルです。

rarao89/SwitchBot2.X(GitHub)

学んだこと

製作中、以下のような動作不安定なところが見られましたが、押しボタンを接続しているPICの入力ピンをプルアップすることで動作が安定しました。
・押しボタンを押していない時に勝手に設定値が増減する
・押しボタンを押すとフリーズする

振り返り

今回は動作確認レベルなので、実用に耐えるものにしようとすると以下のような課題を解決する必要がありますね。
省電力化をして乾電池でも動作できるようにする
・部品の集積度を上げて装置を小型化する
・サーボモーターの固定方法を簡便化する

この辺ができたらまた記事にしようと思います。