TWELITE 2525Aで玄関ドアの開閉を検知

今回は、小型加速度センサTWELITE 2525A (以下2525Aと呼ぶ) を玄関のドアに貼り付けることによって、誰かが入ってきたことが検知できるようにする。

環境

  • Raspi3B+
  • MONOSTICK
  • TWELITE 2525A

購入したもの

すべてAmazonで購入することができます。

  • TWELITE 2525A
  • MONOSTICK
  • リチウム電池 (CR2032)

TWELITE 2525Aの確認

2525Aは分割状態で梱包されているので、下記の画像のように、コイン型電池(CR2032)を電池フォルダーに挿入。軽く振ると、緑色のLEDが光る。

MONOSTICKの確認

MONOSTICKをRaspiで使えるようにする。

まずは、MONOSTICKをRaspiに挿入し、以下のコマンドでデバイスの存在を確認。

$ ls -l /dev/ttyUSB*
crw-rw---- 1 root dialout 188, 0  8月  6 21:28 /dev/ttyUSB0

私の環境では、/dev/ttyUSB0として認識されていることがわかった。

MONOSTICKと2525Aを接続

先ほどの手順で、RaspiにMONOSTICKが認識されていることを確認したので、次はMONOSTICKに2525Aを接続してみる。

次に、RaspiからMONOSTICKの操作パネルにアクセスする。

$ sudo apt install cu # 入っていない場合はインストール
$ cu -s 115200 -l /dev/ttyUSB0

ここで、+++ (プラス+を三回入力)し、Enterを押すことによって、以下のような操作パネルにアクセスできる。インタラクティブモードについて詳しく知りたいときは公式ドキュメントを参考にしよう。

--- CONFIG/MONO WIRELESS TWELITE DIP APP V1-08-1/SID=0x810b4600/LID=0x00 ---
 a: set Application ID (0x67720102)*
 i: set Device ID (121=0x79)*
 c: set Channels (18)*
 x: set Tx Power (03)*
 t: set mode4 sleep dur (1000ms)*
 y: set mode7 sleep dur (10s)*
 f: set mode3 fps (32)*
 z: set PWM HZ (1000,1000,1000,1000)*
 o: set Option Bits (0x00000001)*
 b: set UART baud (38400)*
 p: set UART parity (N)*
---
 S: save Configuration
 R: reset to Defaults

次に、この操作パネルを立ち上げた状態で、o (小文字のo)を入力し、Input option bits (HEX)に”00000001″を入力。最後に、ShiftとSを同時押しして、設定を保存。

ここまできたら、2525Aが使えるようになっているはずだ。試しに2525Aを動かし、操作パネル上に以下の出力が出ることを確認してみよう。

--- CONFIG/MONO WIRELESS TWELITE DIP APP V1-08-1/SID=0x810b4600/LID=0x00 ---
 a: set Application ID (0x67720102)*
 i: set Device ID (121=0x79)*
 c: set Channels (18)*
 x: set Tx Power (03)*
 t: set mode4 sleep dur (1000ms)*
 y: set mode7 sleep dur (10s)*
 f: set mode3 fps (32)*
 z: set PWM HZ (1000,1000,1000,1000)*
 o: set Option Bits (0x00000001)*
 b: set UART baud (38400)*
 p: set UART parity (N)*
---
 S: save Configuration
 R: reset to Defaults

!INF FlashWrite Success
!INF RESET SYSTEM...
!INF MONO WIRELESS TWELITE DIP APP V1-08-1, SID=0x810B4600, LID=0x00
!INF DIO --> 00000000000000010000
:788115019F810DA6F5008039000B7D00080F3E3E395B7150
:788115019F810DA6F5008040000B7D00010F3D3D3F5B6D50
:7881150199810DA6F5008047000B7D00000F3F363B5B7254
:788115018A810DA6F500804D000B7D00020F3840285B4895
:78811501BA810DA6F5008054000B7900000F3E3E3A5B4551

下の5行が2525Aから返ってきた値となる。ここまでこれば、正常に接続ができている。だが、加速度に関する情報が返ってきていないので、次の項目で作業を行う。

うまくいかない場合は、2525Aの電池を一旦抜き、MONOSTICKに近づけた状態で、電池を挿入すると認識されることがある。

加速度センサから返ってくる値をRaspiで受け取る

Raspiでファームウェア書き込み (失敗)

2525Aには標準で信号を受信するアプリがインストールされているが、最低限の機能しか持たないので、Raspiで加速度センサからの値を受け取る場合、最新のファームウェアの書き換えが必要だ。

ここではファームウェアの書き換えをRaspiで行うために、公式サイトで用意されているtweterm.pyを利用して書き換えを行う。そしてtweterm.pyはTWELITE SDKに含まれているので以下からダウンロード。

https://mono-wireless.com/jp/products/TWE-NET/index.html からTWELITE SDKのLinux版をダウンロードし解凍。

tar zxvf MWSDK_MWX_Linux64_201912-4.tgz

ここでは、TWELITE SDKをホームディレクトリに置き、そのディレクトリが${TWELITESDK}だとして話を進める。

私の場合、Raspiにインストールしたので、該当のスクリプトは以下にある。

/home/pi/MWSDK/Tools/tweprog_py/tweterm.py

スクリプトに実行許可を与える

chmod +x /home/pi/MWSDK/Tools/tweprog_py/tweterm.py

環境変数に追加するなら、以下を打ち込む

PATH=/home/pi/MWSDK/Tools/tweprog_py/:$PATH

MONOSTICKがリストされているかを確認

tweterm.py -p ftdi:///?

以下が確認できれば成功

Available interfaces:
  ftdi://ftdi:232:MW4P7MIF/1   (MONOSTICK)

https://mono-wireless.com/jp/products/TWE-APPS/App_Tag/download.html の「親機・子機・中継機用」の最新バージョンから、「App_Tag_bin_2_1_5.zip」のような名前のファイルをダウンロード。

そして次のコマンドでファイル書き込みができるはずなのだが、Pythonのコーディングエラーがでて進めない。

python tweterm.py -p ftdi://ftdi:232:MW4P7MIF/1 -b 115200 -F ./App_Tag_bin_2_1_5/App_Tag-Parent-BLUE-MONOSTICK.bin

コードを見直すのは面倒なので、windowsでのファイル書き込みを試す。

Windowsでファームウェア書き込み (成功)

https://mono-wireless.com/jp/products/TWE-Lite-2525A/manual_App_tag.html の手順に従って、windowsで2525Aに対してファームウェアの書き込みを行う。

まず、ファームウェア書き込みソフトのTWELITEプログラマをインストール。

さらに、2525A用のファームウェア(“App_Tag-Parent-BLUE-OTA.bin”か”App_Tag-Parent-RED-OTA.bin”)を以下からダウンロードする。TWELITEの製品は高出力版(RED)かノーマル版(BLUE)で分かれている。このとき、最新のバージョンをダウンロードしておくこと。

https://mono-wireless.com/jp/products/TWE-APPS/App_Tag/download.html

インストール後、MONOSTICKをPCに挿し、TWELITEプログラマを起動する。

GUIに従って、先ほどダウンロードしたbinファイル(“App_Tag-Parent-BLUE-OTA.bin”か”App_Tag-Parent-RED-OTA.bin”)を書き込む。

書き込み後、

--- CONFIG/App_Tag V2-01-5/SID=0x8100474f/LID=0x00/RC=10000/ST=0 ---
 a: set Application ID (0x67726305)
 i: set Device ID (--)
 c: set Channels (15)
 x: set Tx Power (13)
 b: set UART baud (38400)
 B: set UART option (8N1)
 k: set Enc Key (0xA5A5A5A5)
 o: set Option Bits (0x00000001)*
 d: set Sleep Dur (1000)*
 w: set Sensor Wait Dur (0)
 m: set Sensor Mode (0x35)
 p: set Sensor Parameter (0)*
 P: set Sensor Parameter2 ( )
---
 S: save Configuration
 R: reset to Defaults
 *** POWER ON END DEVICE NEAR THIS CONFIGURATOR ***

のような画面が表示されるので、
o -> 1
d -> 1000
p -> 0
にパラメータを設定する。

次に、MONOSTICKから10cmくらい離れた距離で2525Aの電池を入れる。

このとき、MONOSTICKのLEDがすべて点灯することを確認

そして、TWELITE プログラマ上のターミナルに以下が表示されることを確認する。

 a: set Application ID (0x67726305) 
 i: set Device ID (--) 
 c: set Channels (15) 
 x: set Tx Power (13) 
 b: set UART baud (38400) 
 B: set UART option (8N1) 
 k: set Enc Key (0xA5A5A5A5) 
 o: set Option Bits (0x00000001) 
 d: set Sleep Dur (1000) 
 w: set Sensor Wait Dur (0) 
 m: set Sensor Mode (0x35) 
 p: set Sensor Parameter (0) 
 P: set Sensor Parameter2 ( ) 
---
 S: save Configuration
 R: reset to Defaults
 *** POWER ON END DEVICE NEAR THIS CONFIGURATOR ***


!INF REQUEST CONF FROM 810DA6F5 FW_VER:2.1.5
>>> TxCmp Ok(tick=52163,req=#0) <<<
!INF ACK CONF FROM 810DA6F5
SUCCESS 810DA6F5

SUCCESSの文字が表示されれば無事成功。確認出来たら、2525Aから電池を抜く。

次に、MONOSTICKへのファームウェア書き込みを行う。

先ほどと同じ以下のリンクからファームウェア(“App_Tag-Parent-BLUE-MONOSTICK.bin”か”App_Tag-Parent-RED-MONOSTICK.bin”)をダウンロード。

https://mono-wireless.com/jp/products/TWE-APPS/App_Tag/download.html

先ほどと同様に、TWELITEプログラマを用いてファームウェア(“App_Tag-Parent-BLUE-MONOSTICK.bin”か”App_Tag-Parent-RED-MONOSTICK.bin”)をMONOSTICKに書き込む。

ここで、2525Aに電池を入れる。すると、TWELITEプログラマのターミナルに一秒ごとに以下のような表示がでるはずだ。

::ts=3676
::rc=80000000:lq=159:ct=0379:ed=810DA6F5:id=0:ba=2940:a1=1278:a2=0651:x=0002:y=\
-010:z=-115
::ts=3677
::rc=80000000:lq=156:ct=037A:ed=810DA6F5:id=0:ba=2940:a1=1278:a2=0653:x=0002:y=\
-010:z=-115
::ts=3678
::rc=80000000:lq=156:ct=037B:ed=810DA6F5:id=0:ba=2940:a1=1278:a2=0653:x=0000:y=\
-009:z=-115
::ts=3679
::rc=80000000:lq=156:ct=037C:ed=810DA6F5:id=0:ba=2940:a1=1280:a2=0651:x=0001:y=\
-009:z=-115
::ts=3680
::rc=80000000:lq=150:ct=037D:ed=810DA6F5:id=0:ba=2940:a1=1278:a2=0651:x=0002:y=\
-010:z=-115
::ts=3681
::ts=3682
::rc=80000000:lq=147:ct=037F:ed=810DA6F5:id=0:ba=2940:a1=1280:a2=0651:x=0002:y=\
-009:z=-116
::ts=3683
::rc=80000000:lq=153:ct=0380:ed=810DA6F5:id=0:ba=2940:a1=1276:a2=0651:x=0001:y=\
-009:z=-116

文字列末尾のx, y, zが加速度センサの出力である。

2525Aからの信号をPythonで受け取る

WINDOWSで2525AとMONOSTICKへのファームウェアインストールが済んだので、MONOSTICKをRaspiに差し替えて作業の続きを行う。

次の作業は、加速度センサの値をPythonで受け取れるようにすることだ。

2525AをPythonで制御するために、必要パッケージをインストールする。

$ sudo apt-get install libusb-dev
$ sudo apt-get install python3-pip
$ pip3 install pyserial
$ pip3 install pyftdi

次に、公式サイトからサンプルスクリプトをダウンロード。リンク先のを右クリックし、「リンク先を保存」を選択することにより、スクリプトをテキストファイルとして保存。

実行までの手順を以下に貼る。

# TXTをPythonスクリプトに変換
$ mv twelite_read_write.txt twelite_read_write.py
# 実行
$ python twelite_read_write.py /dev/ttyUSB0

実行後、サスペンド状態になる。このとき2525Aを動かすことによって、センサからの以下のような値が返ってくる。

b'::ts=1372'
...skip (b'::ts=1372')

b'::rc=80000000:lq=123:ct=0AEA:ed=810DA6F5:id=0:ba=2930:a1=1276:a2=0646:x=0002:y=-010:z=-115'
...skip (b'::rc=80000000:lq=123:ct=0AEA:ed=810DA6F5:id=0:ba=2930:a1=1276:a2=0646:x=0002:y=-010:z=-115')

b'::ts=1373'
...skip (b'::ts=1373')

b'::rc=80000000:lq=117:ct=0AEB:ed=810DA6F5:id=0:ba=2930:a1=1276:a2=0646:x=0001:y=-010:z=-116'
...skip (b'::rc=80000000:lq=117:ct=0AEB:ed=810DA6F5:id=0:ba=2930:a1=1276:a2=0646:x=0001:y=-010:z=-116')

b'::ts=1374'
...skip (b'::ts=1374')

b'::rc=80000000:lq=117:ct=0AEC:ed=810DA6F5:id=0:ba=2930:a1=1273:a2=0646:x=0001:y=-010:z=-115'
...skip (b'::rc=80000000:lq=117:ct=0AEC:ed=810DA6F5:id=0:ba=2930:a1=1273:a2=0646:x=0001:y=-010:z=-115')

加速度センサの情報が返ってくることは確認できたが、1秒ごとに常に位置情報を返してくる設定だと、ドアの開閉を検知する上で、少し扱いにくいので、MONOSTICKの設定を書き換える。

Raspiに挿したMONOSTICKを再度、WINDOWSマシンに差し替える。

TWELITEプログラマを立ち上げ、GUIの左下の+++ボタンをおし、設定画面へと移行する。

前述で行った、ファームウェア(“App_Tag-Parent-BLUE-OTA.bin”か”App_Tag-Parent-RED-OTA.bin”)のインストールを再度実施。

設定画面で、
p -> 8

を設定し、Shiftとsを同時押しして保存する。

pを8に設定することによって、2525Aを動かしたときだけ、発信する設定になる。その他の設定についてはこのサイトの下の部分を参考にされたし。

次に、MONOSTICKの近くで、2525Aに電池を入れ、SUCCESSの文字が表示されることを確認。

TWELITEプログラマを一旦終了し、再度TWELITEプログラマを起動。

MONOSTICKファームウェア(“App_Tag-Parent-BLUE-MONOSTICK.bin”か”App_Tag-Parent-RED-MONOSTICK.bin”)をインストール。

インストール後、TWELITEプログラマのターミナルを確認してみると以下の表示がでているはずだ。2525Aが静止しているときはts=…の文字列しか出力されないが、動かすと、情報が返ってくる。

::ts=42
::ts=43
::rc=80000000:lq=153:ct=000E:ed=810DA6F5:id=0:ba=2930:a1=1039:a2=0557:x=0004:y=\
-021:z=-112
::ts=44
::ts=45
::ts=46
::rc=80000000:lq=153:ct=000F:ed=810DA6F5:id=0:ba=2930:a1=1256:a2=0639:x=0001:y=\
-010:z=-116
::ts=47
::ts=48
::ts=49
::ts=50
::ts=51
::ts=52
::ts=53
::ts=54
::ts=55
::ts=56

この出力の末尾の部分が位置情報で、x, y, zの値が返ってきていることがわかる。

ちなみに、向きは以下のとおりである。

ここまで設定できたら、2525AとMONOSTICKの設定は完了だ。

MONOSTICKをWINDOWSからRaspiに挿し変えて、玄関ドアの開閉を検知し、ドアが動いたときにSlackにメッセージを発信するスクリプトを作成。スクリプトは、公式が配布するRaspberry Pi向けスクリプトに少し修正を加えて使わせていただいた。

#!/usr/bin/env python
#encoding=utf-8

import serial
import datetime
import oauth2 as oauth
import sys
import threading
import time
# from urllib import urlencode
import requests
import time
from urllib.parse import urlencode

TOKEN = "xxxx"
CHANNEL = "XXXX"

if __name__ == "__main__":

	while True:
		ser = serial.Serial( "/dev/ttyUSB0", 115200, timeout=1)
		#	UARTを読み込んでリスト化(配列に代入)
		line = ser.readline()
		# print(line)
		field = str(line.strip())
		sline = field.split(':')
		length = len(sline)

		#	加速度データであればこの中の処理
		print("---------")
		print(sline)

		if length == 13:
			x = float(sline[10][2:])/100.0
			y = float(sline[11][2:])/100.0
			z = float(sline[12][2:-1])/100.0
			message = "X=%f Y=%f Z=%f" % (x, y, z)
			print(message)

			param = {
			"token":TOKEN,
			"channel":CHANNEL,
			"text":message
			}

			requests.post(url="https://slack.com/api/chat.postMessage",\
				headers={'Content-Type': 'application/json'},\
				params=param)

		time.sleep(0.1)
玄関ドアに貼り付けた2525A
(右方向がyの正方向、上方向がxの正方向、外の方向がzの正方向になっている)
Pocket