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)
ここまで設定できたら、2525AとMONOSTICKの設定は完了だ。
MONOSTICKをWINDOWSからRaspiに挿し変えて、玄関ドアの開閉を検知し、ドアが動いたときにSlackにメッセージを発信するスクリプトを作成。スクリプトは、公式が配布する[Raspberry Pi向けスクリプト](https://mono-wireless.com/jp/products/TWE-Lite-2525A/manual_App_tag_2.html)に少し修正を加えて使わせていただいた。

#!/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の正方向になっている)