紹介

近年のIoTへの注目の高まりとともに、関連産業の急速な発展を駆動して、スマートホームという用語を見かけることが多くなっています。現在スマートホームにおける諸技術の中で、ホームセキュリティはもっとも注目を集めています。傾斜スイッチはホームセキュリティ技術中で重要なアラーム用センサーと言われます。水銀傾斜スイッチとボール傾斜スイッチはその中のよくある2種です。本文はSW520Dボール傾斜スイッチを使用して、外部環境の振動を検知して、LEDを制御します。

必要なパーツ

ラズパイ3 ボード x1

ブレッドボード x1

T拡張ボード x1

40-Pin ケーブルx1

抵抗200Ω  x1

赤LED  x1

SW520D傾斜スイッチ x1

ジャンプワイヤー x若干

作働原理

SW520Dはよくあるボール傾斜スイッチである、2つの導電性電極と2つの金属ボードの構造、電極と金属ボードは金属ケースにパッケージしていた。下記の写真をご参照:

SW520DモジュールとmicroPCBボードを溶接して、傾斜スイッチが作ります。回路はLM393(電圧コンパレータモジュール)の周りに構築しています。この傾斜スイッチは、SW520Dセンサー、増幅器、スタンダード3ピン・ヘッダ、ステータス指示LEDを含みます。

傾斜スイッチが直立すると、電極と金属ボード接触して、回路が接続します。回路が接続したら、D0から低電位を輸出して、ステータス指示LEDが点灯します。傾斜スイッチが続いて傾くになると、一旦チルト角がある値になったら、電極と金属ボードの接触が切断したら、回路も切断して、D0から高電位(5V)を輸出して、ステータス指示LEDが消灯します。下記の画像をご参照:

SW520D原理図

配線図

 

実物接続図

プログラム

C言語とPython言語はラズパイでよく使用のプログラミング言語です。C言語は、1972年にAT&Tベル研究所のデニス・リッチーが主体となって開発したプログラミング言語です。英語圏では単に
C と呼んでおり、日本でも文書や文脈によっては同様に C と呼ぶことがあります。Pythonは、汎用のプログラミング言語です。コードがシンプルで扱いやすく設計されており、C言語などに比べて、さまざまなプログラムを分かりやすく、少ないコード行数で書けるといった特徴があります。この文章では、C言語とPython言語のプログラムを提供いたしますので、ご自由に使用して下さい。

1. C言語を使用の場合、下記の操作をご参照:

1) 下記のコマンドを入力して、経路/home/piに、「sw520d.c」と言うファイルを新規作成

cd  ~

sudo nano sw520d.c

sudo:スーパーユーザ権限で作動。nano:UNIXを中心としたシステムで使われる、cursesを使ったテキストエディタの一種です。nanoの使い方は、コマンド欄にman nanoを入力して下さい。またはnano公式サイトへどうぞ!

2) コード

まず、ヘッダを書き込む、WiringPi.hはRaspberry PiのGPIOを制御するためのC言語ライブラリですが、他の言語、例えばPythonやPHPなどからもこのライブラリにアクセスできるようになっています。stdio.hは、C言語の標準ライブラリに関するヘッダファイルの一つです。printf、scanfなど大量の関数がstdio.hライブラリのサポートが必要です。

#include <wiringPi.h>
#include <stdio.h>

次は、LEDとSW520Dモジュールが使用するのGPIOポートを指定する

#define LedPin    21
#define Sw520dPin 22

LEDがGPIO.21に指定、SW520DがGPIO.22に指定します。「ちょっと待って!回路図と違い?」回路図にLEDとPIN6を接続、SW520DとPIN5の接続していたのに、なぜここで21と22?ラズパイのGPIOポートはBCMとwPi2つのコーディング方法がありますので、BCMはBroadcom会社がラズパイポートに対してのコーディング方法です。wPiはwiringPi.hライブラリがラズパイポートに対してのコーディング方法です。回路図にBCMコーディング方法を使用し、このプログラムはC言語のため、wiringPiライブラリが必要のため、wPiコーディング方法を使用します。コマンド欄にgpio readallを入力したら、BCMとwPiの対照が見えます。

// When initialize wiring failed, print messageto screen
  if(wiringPiSetup() == -1){
    printf("setup wiringPi failed !");
    return 1; 
  }
  
  pinMode(LedPin, OUTPUT);
  pinMode(Sw520dPin,INPUT);

LedPinはOUTPUTモードに指定します。Sw520dPinは輸入モードに指定します。

  printf("\n");
  printf("\n");
  printf("========================================\n");
  printf("|              LED alarm               |\n");
  printf("|    ------------------------------    |\n");
  printf("|        If SW520D tilt                |\n");
  printf("|                                      |\n");
  printf("|        LED will Blink                |\n");
  printf("|                                      |\n");
  printf("|                                OSOYOO|\n");
  printf("========================================");
  printf("\n");
  printf("\n");
  
  while(1){
    if(!(digitalRead(Sw520dPin))){
    // LED off
    digitalWrite(LedPin, HIGH);
    printf("\n");
    printf("-------------------|\n");
    printf("|     Not tilt...  |\n");
    printf("-------------------|\n");
    delay(1000);
    }
    else{
    // LED blink
    digitalWrite(LedPin, LOW);
    delay(500);
    digitalWrite(LedPin,HIGH);
    delay(500);
    printf("\n");
    printf("===================|\n");
    printf("|     tilting!     |\n");
    printf("===================|\n");
    }
  }

上記のコードを注釈:

まず、スクリーンで情報を表示する、続いてwhileループを開始して、Sw520dPinの電位信号を読み取れ、もしSw520dPinから低電位信号が獲得したら(SW520Dが直立姿勢)、スクリーンに”Not tilt…”と表示する、LED灯も消灯の状態です。もしSw520dPinから高電位信号が獲得したら(SW520Dが傾い姿勢)、スクリーンに”tilting!”を表示、LEDも500ミリ秒1回に点滅します。コードを編集完了したら、キーボードのctrlとXボーダーを押して、Yを入力して、Enterボーダーを押して、sw520d.cファイルを保存します。サンプルコードはここ!

3) プログラムをコンパイルする

C言語は高級言語のため、作動前にコンパイルの必要です。下記のコマンドを作動して下さい:

gcc   -Wall  -o  sw520d  sw520d.c  -lwiringPi

-Wall:コンパイルする時、より詳細なエラ情報を表示する

-o:コンパイルした後のプログラム名を指定する、任意です。ここには「sw520d」を指定しました。

sw520d.c:コンパイル必要なソースファイル

-lwiringPi:コンパイル必要なライブラリ ファイル

4) プログラムを作動

コンパイル完了したら、コマンド欄に下記のコマンドを入力、作動して下さい:sudo ./sw520d

5)結果確認

プログラムを作動したら、スクリーンに情報を表示します。続いてSw520dPinからの電位信号を読み取れ、SW520Dが直立姿勢になったら、低電位信号が獲得して、スクリーンに”Not tilt…”と表示する、LED灯も消灯の状態です。もしSW520Dが傾い姿勢になったら、Sw520dPinから高電位信号が獲得して、スクリーンに”tilting!”を表示、LEDも500ミリ秒1回に点滅します。

2. Python言語を使用の場合、次の内容をご参照:

ここでは、sshを通じで、Piと接続している時、Pythonコードの編集方法をご紹介します:

1)下記のコマンドを入力、作動して、/home/piフォルダに「sw520d.py」ファイルを新規作成作成して下さい。

cd ~

sudo nano sw520d.py

2) プログラム

import RPi.GPIO as GPIO
import time

スクリプト必要なRPi.GPIOとtimeモジュールを導入。RPi.GPIOは、Raspbianに標準でインストールされている Python ライブラリです。RPi.GPIO を利用すると、Raspberry Pi のGPIOピン (GPIO : General Purpose Input/Output : 汎用入出力)を簡単に操作することができます。timeは、時間関連の情報や関数を集めたライブラリです。遅延関数の取得はこのライブラリが必要です。

# set #5 as LED pin
LedPin = 5
# set #6 as SW520D Pin
Sw520dPin = 6

LEDとSW520Dモジュールが使用するのGPIOポートを指定する、BCMコーディング方法使用のため、回路図のPIN番号と一緒です。コマンド欄にgpio readallを作動したら、GPIO対照が見えます。

#print message at the begining ---custom function
def print_message():
    print ('==================================')
    print ('|            LED Alarm           |')
    print ('|        ----------------        |')
    print ('|        If SW520D Tilt          |')
    print ('|                                |')
    print ('|        LED Will Blink          |')
    print ('|        ----------------        |')
    print ('|                                |')
    print ('|                          OSOYOO|')
    print ('==================================\n')
    print ('Program is running...')
    print ('Please press Ctrl+C to end the program...')

print_message()はカスタム関数です。終端に情報を表示するの機能がありますね。この関数の説明はこちら~ どうぞ!

#setup function for some setup---custom function
def setup():
    GPIO.setwarnings(False)
    #set the gpio modes to BCM numbering
    GPIO.setmode(GPIO.BCM)
    #set LedPin's mode to output,and initial level to HIGH(3.3V)
    GPIO.setup(LedPin,GPIO.OUT,initial=GPIO.HIGH)
    GPIO.setup(Sw520dPin,GPIO.IN)

GPIO.setmode(GPIO.BCM)関数はGPIOポートをBCM方式に指定しました。GPIO.setup(LedPin,GPIO.OUT,initial=GPIO.HIGH)関数はLedPinを輸出モード、初期値は高電位として、指定しました。GPIO.setup(Sw520dPin,GPIO.IN)関数はSw520dを輸入モードに設定しました。

#main function
def main():
    #print info
    print_message()
    while True:
        #read Sw520dPin's level
        if(GPIO.input(Sw520dPin)):
            GPIO.output(LedPin,GPIO.LOW)
            time.sleep(0.5)
            GPIO.output(LedPin,GPIO.HIGH)
            time.sleep(0.5)
            print ('********************')
            print ('*     tilting!     *')
            print ('********************')
            print ('\n')
        else:
            GPIO.output(LedPin,GPIO.HIGH)
            print ('====================')
            print ('=     Not tilt...  =')
            print ('====================')
            print ('\n')
            time.sleep(1)

メイン関数main()はまず、print_message()関数を獲得し、terminalに情報をプリントして、続いてwhileループを開始して、Sw520dPinの電位信号を読み取れ、もしSw520dPinから高電位信号が獲得したら(SW520Dが傾い姿勢)、スクリーンに”tilting!”を表示、LEDも500ミリ秒1回に点滅します。もしSw520dPinから低電位信号が獲得したら(SW520Dが直立姿勢)、LedPINのポートを高電位に制御して、スクリーンに”Not tilt…”と表示する、LED灯も消灯の状態です。

書き込み完了したら、キーボードのctrlと Xボーダーを押して、Yを入力したら、Enterボーダーを押して、sw520d.pyファイルを保存します。サンプルコードはこちら~

4) プログラムを作動する

python言語はスクリプト言語のため、直接に作動できます。コマンド欄に:sudo   ./sw520d.pyを入力したら、作動できます。

5)結果の確認

プログラムが作動したら、terminalに情報をプリントして、続いてwhileループを開始して、Sw520dPinの電位信号を読み取れます。もしSw520dPinが直立の状態でしたら、Sw520dPinから低電位信号が獲得し、スクリーンに”Not tilt…”と表示する、LED灯も消灯の状態です。SW520Dが傾くになると、SW520Dから高電位信号が獲得し、スクリーンに”tilting!”を表示、LEDも500ミリ秒1回に点滅します。