LoginSignup
7

More than 3 years have passed since last update.

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

Posted at

はじめに

この記事は、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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
7