Help us understand the problem. What is going on with this article?

TWELITEを使ってI2Cセンサーを無線化しよう

More than 1 year has passed since last update.

はじめに

この記事は、mohikanz #2 Advent Calendar 2018の12日目の記事です。

マイコンセンサーを無線化するにあたって、とても便利なTWELITEを使うための手順です。
ざっくり言うと、最初から設定されている標準アプリ(App_Twelite)を、無線タグアプリ (App_Tag)に変更する手順です。
ここで言うアプリとは、マイコンデバイスに搭載されているファームウェアのことを言います。

何が便利なの?

ラズパイなどでセンサーから値を取得している方はご存知かと思いますが、I2Cセンサーから値を取得するためには、それなりのロジックが必要です。
無線タグアプリを使うと、センサー固有の特別なロジックは不要で、値を取得することが可能です。
CSV形式など人が見やすい形にしたり、コンピュータが処理しやすい形式にしたり、とても便利なデバイスです。
また、有線ではなく、無線でやりとりが可能なので、センサーの置き場所問題も解決します。(電源問題はありますが)

公式サイトより

  • 無線タグアプリ(App_Tag)は各種I2Cセンサー用のドライバを内蔵しており、接続するだけで動作させることができます。

作業環境

  • MacBook Pro 2016モデル
  • MacOS Mojave
  • USBポートに変換するアダプタ
  • TWELITE USBスティック高出力タイプ(RED)
  • TWE-Lite-R
  • MicroUSBケーブル
  • ブレッドボード、ジャンパワイヤー

親機の設定

親機から設定します。
子機からやっても問題ありません。

ファームウェアのダウンロード

ファームウェアは、以下のURLにあります。
事前にダウンロードしておいてください。

超簡単!標準アプリ(App_Twelite)ダウンロード
https://mono-wireless.com/jp/products/TWE-APPS/App_Twelite/download.html

無線タグアプリ (App_Tag)ダウンロード
https://mono-wireless.com/jp/products/TWE-APPS/App_Tag/download.html

デバイスの確認

デバイスと接続確認を行います。

$ ls -1 /dev/cu.*
/dev/cu.Bluetooth-Incoming-Port
/dev/cu.MALS
/dev/cu.SOC
/dev/cu.usbserial-MW2HPG7R
/dev/cu.usbserial-MWS47KJ

$ screen /dev/cu.usbserial-MW2HPG7R 115200

インタラクティブモードは、+++ を入力します。

--- CONFIG/MONO WIRELESS TWELITE APP V1-08-1/SID=0x82012487/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 (0x00000020) 
 b: set UART baud (38400) 
 p: set UART parity (N) 
---
 S: save Configuration
 R: reset to Defaults

終了は、CTRL+A -> K -> yです

[screen is terminating]

ファームウェア更新準備

ファームウェアを適当なディレクトリに解凍し、依存するパッケージをインストールします。
すでにインストール済みであれば、作業不要です。

MWSDK$ brew install libusb
MWSDK$ pip3 install --upgrade pip
MWSDK$ pip3 install pyserial
MWSDK$ pip3 install pyftdi

私の環境

$ pip3 list
Package        Version   
-------------- ----------
beautifulsoup4 4.6.3     
bs4            0.0.1     
certifi        2018.10.15
chardet        3.0.4     
idna           2.7       
pip            10.0.1    
pyftdi         0.29.2    
pyserial       3.4       
pyusb          1.0.2     
requests       2.20.0    
setuptools     39.0.1    
urllib3        1.24 

親機のファームウェア更新

FTDIドライバを無効にします。
シリアル通信しているデバイスやアプリがあると、OSがハングアップする場合もあるので、作業するときは注意してください。

$ sudo kextunload -b com.apple.driver.AppleUSBFTDI

/dev/からデバイスが消えていることを確認します。

$ ls -1 /dev/cu.*
/dev/cu.Bluetooth-Incoming-Port
/dev/cu.MALS
/dev/cu.SOC

MONOSTICKのデバイスIDを確認します。
私は、TWE-Lite-Rも接続しているので、ファームウェアを導入するデバイスIDを確認します。
一旦デバイスを抜くなりして、間違えないようにしてください。

$ ./Tools/tweprog_py/tweterm.py -p ftdi:///?
Available interfaces:
  ftdi://ftdi:232:MW2HPG7R/1   (MONOSTICK)
  ftdi://ftdi:232:MWS47KJ/1    (TWE-Lite-R)

Please specify the USB device

確認できたら、ファームウェアを書き込みます。BlueとRedは、別ファームウェアなので気をつけます。
また、SDKに含まれているバージョンはv2.1.3ですが、v2.1.5が公開されているので、そちらを適用しました。
デバイスIDと書き込みたいファームウェアを再度確認し、コマンドを投入します。
書き込みが完了したら、ts出力(タイムスタンプ)がずらずらっと流れてくるので、Ctrl+Cを2回押して一旦終了します。

$ ./Tools/tweprog_py/tweterm.py -p ftdi://ftdi:232:MW2HPG7R/1 -F ./App_Tag_bin_2_1_5/App_Tag-Parent-RED-MONOSTICK.bin -b 115200

*** TWE Wrting firmware ... ./App_Tag_bin_2_1_5/App_Tag-Parent-RED-MONOSTICK.bin
MODEL: TWEModel.TWELiteRED
SER: 2012487
FILEINFO: 0f 03 000b
0%..10%..20%..30%..40%..50%..60%..70%..80%..90%..done - 10.52 kb/s
Entering minicom mode

*** App_Tag (Parent) 2.01-5 ***
* App ID:67726305 Long Addr:82012487 Short Addr 0487 LID 00
::ts=1
::ts=2
::ts=3
::ts=4
::ts=5
::ts=6
::ts=7
::ts=8
::ts=9
::ts=10
*** r:reset i:+++ A:ASCFMT B:BINFMT x:exit>::ts=11
[Exit]
Bye.

FTDIドライバを有効にします。

$ sudo kextload -b com.apple.driver.AppleUSBFTDI

USBシリアルデバイスが参照できることを確認します。

$ ls -1 /dev/cu.*
/dev/cu.Bluetooth-Incoming-Port
/dev/cu.MALS
/dev/cu.SOC
/dev/cu.usbserial-MW2HPG7R
/dev/cu.usbserial-MWS47KJ

親機の設定変更

::tsが出ている状態で+++を入力し、インタラクティブモードに入ります。

$ screen /dev/cu.usbserial-MW2HPG7R 115200
::ts=10
::ts=11
::ts=12
--- CONFIG/App_Tag V2-01-5/SID=0x82012487/LID=0x00 ---
 a: set Application ID (0x67726305) 
 c: set Channels (15) 
 x: set Tx Power (3) 
 b: set UART baud (38400) 
 B: set UART option (8N1) 
 k: set Enc Key (0xA5A5A5A5) 
 o: set Option Bits (0x00000001) 
---
 S: save Configuration
 R: reset to Defaults

データ処理の都合上、タイムスタンプ出力が不要でしたので、これを変更します。
オプションビットが、0x00000001になっているので、0x00020000に変更します。
他にも設定可能な値があり、公式サイトに記載があります。
処理のしやすい形に変更しましょう。

ビット(16進) 説明
  0x00000001   初期値 
0x00000020 UART出力をセミコロン区切り形式で出力します。
0x00000040 UART出力をカンマ区切り形式で出力します。
0x00000100 UART出力を書式形式のアスキー文字で出力します。
0x00000300 UART出力を書式形式のバイナリ系列で出力します。
0x00001000 暗号化通信を有効にします。(相手側の暗号化設定もしてください。)
0x00020000 標準出力形式、セミコロン区切り形式、カンマ区切り形式時のタイムスタンプの出力を停止します。
0x00040000 シリアルのボーレートやパリティの設定を反映させます。

設定後イメージ

--- CONFIG/App_Tag V2-01-5/SID=0x82012487/LID=0x00 ---
 a: set Application ID (0x67726305) 
 c: set Channels (15) 
 x: set Tx Power (3) 
 b: set UART baud (38400) 
 B: set UART option (8N1) 
 k: set Enc Key (0xA5A5A5A5) 
 o: set Option Bits (0x00020000)*
---
 S: save Configuration
 R: reset to Defaults

!INF FlashWrite Success
!INF RESET SYSTEM...
*** App_Tag (Parent) 2.01-5 ***
* App ID:67726305 Long Addr:82012487 Short Addr 0487 LID 00

TWE-Lite-R で繋がっている親機設定

他にも親機がいるので、設定値を確認しました。
参考資料ですが。
同じApplication ID?だと、複数親機がいても受信できるみたいですね。

$screen /dev/tty.usbserial-MWS47KJ 115200

--- CONFIG/App_Tag V2-01-5/SID=0x8102e282/LID=0x00 ---
 a: set Application ID (0x67726305) 
 c: set Channels (15) 
 x: set Tx Power (3) 
 b: set UART baud (38400) 
 B: set UART option (8N1) 
 k: set Enc Key (0xA5A5A5A5) 
 o: set Option Bits (0x00020000) 
---
 S: save Configuration
 R: reset to Defaults

子機からのデータ受信

子機から受信したデータのイメージです。

::rc=80000000:lq=84:ct=34BC:ed=8102E338:id=1:ba=2960:a1=0921:a2=0508:te=2450

子機の設定

子機は、TWE-Lite-Rを使って書き込みを行います。

子機のファームウェア更新

FTDIドライバを無効にします。

$ sudo kextunload -b com.apple.driver.AppleUSBFTDI

/dev/からデバイスが消えていることを確認します。

$ ls -1 /dev/cu.*
/dev/cu.Bluetooth-Incoming-Port
/dev/cu.MALS
/dev/cu.SOC

TWE-Lite-RのデバイスIDを確認します。

$ ./Tools/tweprog_py/tweterm.py -p ftdi:///?
Available interfaces:
  ftdi://ftdi:232:MW2HPG7R/1   (MONOSTICK)
  ftdi://ftdi:232:MWS47KJ/1    (TWE-Lite-R)

Please specify the USB device

無線タグ子機アプリのバイナリを確認し、書き込みを行います。

$ ./Tools/tweprog_py/tweterm.py -p ftdi://ftdi:232:MWS47KJ/1 -F ./App_Tag_bin_2_1_5/App_Tag-EndDevice-BLUE.bin -b 115200

書き込みが完了したら、親機と同じようにCtrl+Cを2回押して抜けます。

FTDIドライバを有効にします。

$ sudo kextload -b com.apple.driver.AppleUSBFTDI

USBシリアルデバイスが参照できることを確認します。

$ ls -1 /dev/cu.*
/dev/cu.Bluetooth-Incoming-Port
/dev/cu.MALS
/dev/cu.SOC
/dev/cu.usbserial-MW2HPG7R
/dev/cu.usbserial-MWS47KJ

子機の設定変更

子機は間欠駆動しているので、親機のように+を3回入力してインタラクティブモードへの移行が出来ません。
インタラクティブモードに入るには、M2をGNDに接続し、電源を投入します。
ちょっと強引ですが、ブレッドボードに押し付ければ、うまく繋がります。

スクリーンショット 2018-12-10 14.54.23.png

公式サイトに書いてあるので、その通りにやってみます。
接続しても、何も表示されないので、TWE-Lite-Rの「RSTボタン」を押します。
基盤の右端にありますので、押してみましょう。

公式サイトはこちらです。
https://mono-wireless.com/jp/products/TWE-APPS/App_Tag/interactive.html#enddevice

$ screen /dev/tty.usbserial-MWS47KJ 115200

--- CONFIG/App_Tag V2-01-5/SID=0x8102e338/LID=0x01/RC=9101/ST=0 ---
 a: set Application ID (0x67726305) 
 i: set Device ID (1=0x01) 
 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 (120000) 
 w: set Sensor Wait Dur (30) 
 m: set Sensor Mode (0x32) 
 p: set Sensor Parameter (0) 
 P: set Sensor Parameter2 (  ) 
---
 S: save Configuration
 R: reset to Defaults

データは、120秒間隔で親機へ送信するようにしました。
あまり多いと電池の消耗も激しくなるので、状況に応じて使い分けてください。

d: set Sleep Dur (120000)

以下のメッセージが表示される場合は、通常モードで起動しているので、おそらくM2とGNDがうまく接続されていません。回路を確認してください。

*** App_Tag (ED_Inp) 2.01-5 ***
* App ID:67726405 Long Addr:8102e338 Short Adr 0078 LID 01 Calib=9102

*** Entering Config Mode ***
>>> TxCmp Ng(tick=33,req=#0) <<<
!INF:OTA TIME OUT
!INF:OTA SKIPPED. START NORMALLY. 01

ラズパイで動作確認

4つあるポートのどこでも良いので、親機を接続します。

$ ls -1 /dev/ttyUSB0
/dev/ttyUSB0

cuコマンドで確認

MONOSTICKがRaspberry Piで認識できたら、cuコマンドを使ってシリアル通信を行ってみます。

$ sudo apt install cu

$ cu -s 115200 -l /dev/ttyUSB0
Connected.

::rc=80000000:lq=159:ct=004D:ed=8102E338:id=1:ba=2960:a1=0921:a2=0506:te=2700

~.(チルダ ピリオド)を入力するとプログラムが終了します。

Pythonで確認

シリアル通信で定評のある?、Pythonを使います。
個人的にNode.jsでも良かったのですが、ラズパイだと色々ありまして、Pythonにしました。

シリアル通信に必要なモジュールをインストールします。

$ pip3 install pyserial
Collecting pyserial
  Downloading https://files.pythonhosted.org/packages/0d/e4/2a744dd9e3be04a0c0907414e2a01a7c88bb3915cbe3c8cc06e209f59c30/pyserial-3.4-py2.py3-none-any.whl (193kB)
    100% |████████████████████████████████| 194kB 1.2MB/s 
Installing collected packages: pyserial
Successfully installed pyserial-3.4

動作確認用のソースは、以下のサイトからお借りしました。

TWE-Lite DIPをRaspberry Pi上のToCoStickとPythonプログラム経由で通信しLチカ
https://www.skyarch.net/blog/?p=4941

index.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import serial
import sys

argv = sys.argv
argc = len(argv)

def read_serial(s):
        while True:
                line = s.readline()
                print line.strip()

# USBデバイスの指定
if argc != 2:
        s = serial.Serial("/dev/ttyUSB0", 115200, timeout=130)
else :
        s = serial.Serial(argv[1], 115200, timeout=130)

while True:
        try:
                read_serial(s)
        except KeyboardInterrupt:
                break
        except:
                continue

s.close()

実行結果です。あとはご自由にどうぞ。
Python3で実行すると、エラーが出ますので、適切に修正してください。
(めちゃくちゃハマった...)

$ python index.py /dev/ttyUSB0
::rc=80000000:lq=147:ct=0061:ed=8102E338:id=1:ba=2960:a1=0926:a2=0511:te=2743

回路

回路図はここにありますので、参考に作成してください。
https://mono-wireless.com/jp/products/TWE-APPS/App_Tag/mode_ADT7410.html

そんなに部品もないので、簡単に作れます。
こんな感じで作ってみました。
もうちょっと小さく出来るんじゃない?回路が美しくない!
などなど、色々思うことはあります(汗)
親機は、この記事を書いたあとで、USBスティックの方に切り替えました。

子機
スクリーンショット 2018-12-10 14.52.42.png

親機 (TWE-Lite-R)
スクリーンショット 2018-12-10 14.52.04.png

参考にさせていただいたサイト

TWELITEの無線タグアプリを試す
https://qiita.com/miminashi/items/453f7f3e31c8c009e486

TWE-Lite DIPをRaspberry Pi上のToCoStickとPythonプログラム経由で通信しLチカ
https://www.skyarch.net/blog/?p=4941

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした