最適な出力のために、Google Chrome(15以降)または Microsoft Edge(79以降)を推奨いたします。
2024-12-02 現在 TWELITE DIP 超簡単!標準アプリを使ってデジタル・アナログ信号を伝送する
超簡単!無線モジュール TWELITE DIP は、TWELITE を 2.54mm ピッチの基板へ搭載した製品です。手作業による配線を容易に行えるため、試作や小規模ロット生産に適しています。
外観
すぐに使用できる無線モジュール 超簡単!標準アプリ 工場出荷時の TWELITE DIP には 超簡単!標準アプリ(App_Twelite)をインストールしています。
超簡単!標準アプリは、デジタル・アナログ信号の伝送を行うファームウェアです。
デジタル アナログ UART I2C 一方のデジタル入力をもう一方のデジタル出力へ 一方のアナログ入力をもう一方の PWM 出力へ 一方のシリアル入力をもう一方のシリアル出力へ 子機のターゲットへ親機からアクセス
デジタル・アナログの基本的な信号伝送は、配線するだけで「超簡単に」実現できます。
クイックマニュアル(PDF)
シンプルな無線通信 TWELITE は、起動直後から通信できます。Bluetooth のようなペアリングを行いません。
周波数チャネルを合わせた端末同士で同報通信を行います。したがって、同一の周波数チャネルでは、同時に複数の端末が送信を行うことはできません。自分宛でないパケットは無視します。トランシーバやインカムの動作をイメージすると分かりやすいかもしれません。
TWELITE は受信を伴わずとも送信できるため、省電力性能に優れた端末を実現できます。
無線通信の規格は? TWELITE は 2.4GHz 帯の電波を使用する無線モジュールですが、Bluetooth (IEEE 802.15.1) とは異なる規格の IEEE 802.15.4 へ準拠しています。
IEEE 802.15.4 へ準拠した他の製品には Zigbee モジュールがありますが、TWELITE は Zigbee モジュールではありません 。Zigbee モジュールは IEEE 802.15.4 の上層に Zigbee プロトコルスタックを採用していますが、TWELITE はシンプルな独自のプロトコルスタックを代わりに実装しています。
データ量の多い通信には適していないものの、単純な信号伝送といった用途には最適です。
ピンの機能 ピン配置表
超簡単!標準アプリで使用するピンの機能には、いくつかの種類があります。
電源入力(3.3V) デジタル・アナログ入出力 シリアル通信 設定入力Mx
動作モード切り替えBPS
代替ボーレート選択 RST
リセット入力x
: 任意の番号
1 - まずは使ってみる 初期設定の超簡単!標準アプリを使ってデジタル・アナログ信号を伝送する
超簡単!標準アプリ(App_Twelite)では、配線するだけで基本的な信号伝送を実現できます。
工場出荷時の TWELITE DIP に書き込まれている超簡単!標準アプリを使って、片方の DIx
/AIx
ポートへ入力した信号をもう片方の DOx
/PWMx
ポートへ反映させてみましょう。
使用する製品
TWELITE DIP は、BLUE シリーズ と RED シリーズのどちらでも構いません。
片方向の信号伝送 親機へ入力された信号を、子機から出力できます。
親機はすべての子機へデータを送信します 複数の子機を用意すると、親機の DIx
で全ての子機の DOx
を同時に制御できます。
デジタル信号 親機へ接続したスイッチを押すと子機へ接続した LED が点灯し、親機へ接続したスイッチを離すと子機へ接続した LED が消灯します。
親機の配線
子機の配線
上記の例では DI1
と DO1
だけを使っていますが、ポートは合計4つあります。他のポートも同様に使用できます。
片側の TWELITE DIP は、M1
ピンを GND
へ接続してください。親機となります。
また、未使用の AIx
ポートは VCC
へ接続してください。無効化されます(インタラクティブモードによる設定変更で省略可)。
出力できる電流の大きさには制限があります 電源電圧 駆動能力 2.7V-3.6V 4mA 2.2V-2.7V 3mA 2.0V-2.2V 2.5mA
駆動能力を超える場合は、MOSFET やトランジスタを使用してください。
アナログ信号 親機へ接続したボリュームを回すと、子機へ接続した LED の明るさが変化します。
親機の配線
子機の配線
上記の例では AI1
と PWM1
だけを使っていますが、ポートは合計4つあります。他のポートも同様に使用できます。
入出力の電圧について アナログ入力は2.0V以下で動作します。
上記の例では、電源電圧をボリューム(10KΩ)と抵抗(10KΩ)で半分に分圧しています。初期状態の超簡単!標準アプリでは、ボリューム用に調節した出力を PWMx
へ適用します。このときのデューティ比を\(duty\)とするとき、入力電圧\(V_{input}\)と電源電圧\(V_{cc}\)を使って表す計算式を次に示します。
\(duty=min(230\frac{V_{input}}{V_{cc}}-5, 100)\)
なお、インタラクティブモードを使ってオプションビット 0x00000040
を設定すると、1.8V 以下の入力に対してフルスケールで出力できます(2.0V以上で未使用扱い)。
\(duty=100\frac{min(V_{input}, 1.8)}{1.8}\)
PWM2
および PWM3
へ何らかの配線をしていると、ファームウェアを書き換えできない場合があります。
これらのピンは、ファームウェア書き換え時に使用するための機能を備えているからです(詳細 )。
双方向の信号伝送 信号伝送は、親機から子機だけではなく、子機から親機へも同様に行えます。
親機はすべての子機からデータを受信します 複数の子機を用意すると、排他的な子機の DIx
で親機の DOx
を平行して制御できます。
(例:ある子機の DI1
を親機の DO1
へ、別の子機の DI2
を親機の DO2
へ反映させる)
デジタル信号の伝送例 を双方向に拡張してみましょう。なおアナログ信号の伝送例 も同様に拡張できます。
親機へ接続したスイッチを押すと子機へ接続した LED が点灯し、親機へ接続したスイッチを離すと子機へ接続した LED が消灯します。
同時に子機へ接続したスイッチを押すと親機へ接続した LED が点灯し、子機へ接続したスイッチを離すと親機へ接続した LED が消灯します。
親機の配線
子機の配線
上記の例では DI1
と DO1
だけを使っていますが、ポートは合計4つあります。他のポートも同様に使用できます。
中継機の設置 中継機として設定したものを親機と子機の間へ設置することで、通信距離を延長できます。最大3段まで中継できます。
中継機の配線
M2
を GND
へ接続します。
2 - インタラクティブモードによるカスタマイズ インタラクティブモードを利用して機能をカスタマイズする
インタラクティブモードを利用すると、ネットワークのグループ分けや低レイテンシモードの有効化といった各種パラメータの変更を行うことができます。
インタラクティブモードとは インタラクティブモードは、TWELITE シリーズを PC へ接続して設定を行う際に利用するモードです。TWELITE シリーズを USBアダプター TWELITE R シリーズを介して PC へ接続することで、UART 通信により各種パラメータの変更を行うことができます。
TWELITE STAGE アプリの使用を推奨します。TWELITE STAGE アプリは、ファームウェアの設定や書き換えに加え、親機との送受信を評価するための機能を備えたツールです。TWELITE STAGE アプリは TWELITE STAGE SDK に含まれています。
TWELITE STAGE アプリの詳細については、TWELITE APPS マニュアル をご覧ください。
カスタム例 目的別に TWELITE DIP のカスタム例を示します。
興味のあるものを選んでお試しください。
ネットワークのグループ分け 初期状態では、すべての TWELITE DIP が相互に通信できる状態にあります。親機と子機のペアを2つ用意した場合、親機の入力は双方の子機へ反映されるほか、子機の入力も双方の親機へ反映されます。
インタラクティブモードによってアプリケーションIDと周波数チャネルを変更し、2つのペアを同時に独立して使用できるようにしましょう。
使用する製品 カスタムの内容 インタラクティブモードの値を次のように設定し、2つのペアをグループAとBに分けます。
アプリケーションIDは論理的に、周波数チャネルは物理的にネットワークを分離します。グループ数が16以下であれば、どちらも変更することを推奨しています。
周波数チャネルは、できる限り間隔を空けるように推奨しています。
カスタム方法 TWELITE DIP を TWELITE R2 へ差し込み、USB-C ケーブルを使って PC と接続する TWELITE STAGE アプリ を立ち上げ、シリアルポート選択 から対象の TWELITE R2 を選択するメインメニュー の「3: インタラクティブモード 」を選択する大文字のR
を押下して、設定を初期状態へ戻す a
を押下したのち、AAAAAAAA
/BBBBBBBB
を入力してEnter
を押下するc
を押下したのち、11
/26
を入力してEnter
を押下する大文字のS
を押下して、設定を適用する(TWELITE はリセットされる) ESC
を何度か押してメインメニュー へ戻り、TWELITE R2 の USB-C ケーブルを抜くTWELITE DIP を取り外し、ブレッドボード等へ差し込み、回路へ接続する 動作確認 グループAとグループBの双方を「まずは使ってみる」の片方向デジタル信号の例 のように配線し、親機へスイッチを、子機へ LED を接続します。
グループAの親機のスイッチを押すと、グループAの子機の LED だけが光ります グループBの親機のスイッチを押すと、グループBの子機の LED だけが光ります グループBの子機のアプリケーションIDを0xAAAAAAAA
へ、周波数チャネルを11
へ変更します。
グループAの親機のスイッチを押すと、2台の子機の LED がどちらも光ります 低レイテンシモードの使用 初期状態では、送信元のDIx
が送信先のDOx
へ反映されるまでに30-70ms程度の遅延が生じます。チャタリングや無線パケットの干渉を避けるための処理が存在するからです。
低レイテンシモード は、これらの処理を簡略化することで遅延を3-10ms程度に短縮します。
インタラクティブモードによって送信側の端末の低レイテンシモードを有効化してみましょう。
低レイテンシモードは、次のような場合に有用です。
ハードウェアにチャタリングの懸念がない場合 入力状態をすばやく変化させる場合 使用する製品 カスタムの内容 インタラクティブモードの値を次のように設定し、送信側(親機)の低レイテンシモードを有効化します。
オプションビットの値は32bitの非不整数です。各ビットのフラグを立てることで対応した設定を有効化できます。
同時に複数の設定を有効化するには、すべての論理和を取ります。
カスタム方法 TWELITE DIP を TWELITE R2 へ差し込み、USB-C ケーブルを使って PC と接続する TWELITE STAGE アプリ を立ち上げ、シリアルポート選択 から対象の TWELITE R2 を選択するメインメニュー の「3: インタラクティブモード 」を選択する大文字のR
を押下して、設定を初期状態へ戻す o
を押下したのち、00000001
を入力してEnter
を押下する大文字のS
を押下して設定を適用する(TWELITE はリセットされる) ESC
を何度か押してメインメニュー へ戻り、TWELITE R2 の USB-C ケーブルを抜くTWELITE DIP を取り外し、ブレッドボード等へ差し込み、回路へ接続する 動作確認 親機と子機を「まずは使ってみる」の片方向デジタル信号の例 のように配線し、親機へスイッチを、子機へ LED を接続します。
親機のスイッチを押すと、子機の LED が光ります 動作は初期状態と変わりませんが、少しレスポンスが向上したことを感じ取れるかもしれません 親機のDO1
と子機のDI1
へオシロスコープを接続して比較すると、その効果を確認できます ボタン押下時のみ送信させる 初期状態では、入力状態が変化したときに送信を行うほか、1秒おきに送信します。
このとき、例えば送信側のボタンを押したまま電源を断つと、受信側の出力は残り続けて しまいます。
ボタン押下時のみ送信 設定では、送信側のDIx
がLowのときに繰り返し送信を行い、Highへ遷移しても1秒間は送信を続けます。受信側のDOx
をLowとしてから受信が途絶えた場合はHighへ戻します。
インタラクティブモードによってボタン押下時のみ送信するように変更してみましょう。
リモコンのボタンを押している間にモータを回転させるといった用途に有用です。
DIx
がLowのときは短い間隔で送信を続けるため、同一の周波数チャネルに送信機を増やすことは推奨しません。このオプションは1:1の通信を行う際に適用してください。
使用する製品 カスタムの内容 インタラクティブモードの値を次のように設定し、送信側(親機)と受信側(子機)のデジタル入出力の振る舞いを変更します。
カスタム方法 TWELITE DIP を TWELITE R2 へ差し込み、USB-C ケーブルを使って PC と接続する TWELITE STAGE アプリ を立ち上げ、シリアルポート選択 から対象の TWELITE R2 を選択するメインメニュー の「3: インタラクティブモード 」を選択する大文字のR
を押下して、設定を初期状態へ戻す o
を押下したのち、00000100
を入力してEnter
を押下する大文字のS
を押下して設定を適用する(TWELITE はリセットされる) ESC
を何度か押してメインメニュー へ戻り、TWELITE R2 の USB-C ケーブルを抜くTWELITE DIP を取り外し、ブレッドボード等へ差し込み、回路へ接続する 動作確認 親機と子機を「まずは使ってみる」の片方向デジタル信号の例 のように配線し、親機へスイッチを、子機へ LED を接続します。
親機のスイッチを押すと、子機の LED が光ります 親機のスイッチを押したまま電源供給を断つと、子機のLEDは消えます(初期状態は消えない) 3 - UART機能によるPCとの連携 親機をPCへ接続して、UARTを通じたデータの受信と送信を行う
UART 通信を利用することで、親機を PC と連携させることができます。
TWELITE STAGE アプリ および Python スクリプトを用いて UART 通信を行い、PC から親機を通じて子機のデータを取得/操作します。
使用する製品 なお、TWELITE DIP と TWELITE R2 のペアは MONOSTICK 単体と同等です。次の組み合わせでも構いません。
TWELITE STAGE アプリの導入 TWELITE STAGE アプリは、ファームウェアの設定や書き換えに加え、親機との送受信を評価するための機能を備えたツールです。
ここでは、TWELITE STAGE アプリを使って TWELITE DIP(超簡単!標準アプリ)の子機のデータを表示、また操作してみましょう。
TWELITE STAGE アプリは、TWELITE STAGE SDK に含まれています。
TWELITE STAGE アプリによる受信 超簡単!標準アプリの子機が送信するデータは、DIx
/AIx
ポートの入力状態や電源電圧、送信元の論理デバイスIDといった情報を含んでいます。
シリアル文字列の表示 親機が子機から受信したデータは、親機がシリアル通信(UART)で出力する文字列を解釈することで取得できます。まずはこの文字列を表示してみましょう。
初期状態におけるシリアル通信の仕様は 115200bps 8-N-1 です。
TWELITE STAGE アプリを立ち上げ、シリアルポート選択 で親機を選択します。メインメニュー の「1: ビューア」 >「1: ターミナル」 を開いてください。
子機のデータを受信すると、次のようなメッセージを表示します。
:78811501C98201015A000391000C2E00810301FFFFFFFFFB
親機が出力するこのような文字列を解釈することで、子機が送信したデータを得ることができます。
上記の文字列は次のデータを表しています # データ 内容 値 :
char
ヘッダ :
78
0 uint8
送信元の論理デバイスID 0x78
81
1 uint8
コマンド番号 0x81
15
2 uint8
パケット識別子 0x15
01
3 uint8
プロトコルバージョン 0x01
C9
4 uint8
LQI 201/255
8201015A
5 uint32
送信元のシリアルID 0x201015A
00
9 uint8
送信先の論理デバイスID 0x00
0391
10 uint16
タイムスタンプ 約14.27
秒 00
12 uint8
中継回数 0
0C2E
13 uint16
電源電圧 3118
mV00
15 int8
- 81
16 uint8
デジタル信号 DI1
L
DI2
H
DI3
H
DI4
H
(定期送信)03
17 uint8
デジタル信号マスク DI1
DI2
01
18 uint8
AI1
の変換値16
mVFF
19 uint8
AI2
の変換値未使用 FF
20 uint8
AI3
の変換値未使用 FF
21 uint8
AI4
の変換値未使用 FF
22 uint8
AIx
の補正値AI1
0x03
FB
uint8
チェックサム 0xFB
char
フッタ \r
char
フッタ \n
なお、TWELITE の親機が出力する文字列は、基本的に次の形式へ従います。
ヘッダ ペイロード チェックサム フッタ :
00
-FF
の繰り返しペイロードのLRC8 CRLF
すべて ASCII 文字※ 先頭は :
(0x3A
) 末端は CRLF (\r\n
/0x0D 0x0A
) ビッグエンディアン ※ シリアル通信アプリのバイナリ書式を除く
標準アプリ ビューア 上記のような形式はコンピュータにやさしいものですが、人間が確認するにはこれを解釈する必要があります。TWELITE STAGE アプリには、超簡単!標準アプリの子機が送信したデータを表す文字列を解釈して表示する機能があります。後述の Python ライブラリはこの解釈を行います。
メインメニュー の「1: ビューア」 へ戻り、「2: 標準アプリ ビューア」 を開いてください。
タイムスタンプと論理デバイスID、シリアルIDとDIx
/AIx
の値を確認できます。
標準アプリ ビューアの画面
TWELITE STAGE アプリによる送信 これまでとは反対に、親機から子機へ無線パケットを送信し、子機の出力状態を変更することもできます。
コマンダー メインメニュー の「1: ビューア」 へ戻り、「5: コマンダー」 を開いてください。
DIx
およびAIx
の入力をシミュレートしたパケットを送信できます。
コマンダーの画面
使い方
コマンダーは、PCから親機へシリアル通信によって文字列を送信しています。すなわち、標準アプリ ビューアとは逆の仕組みです。
この文字列も:
で始まり CRLF で終わります。詳しい書式は超簡単!標準アプリ マニュアル をご覧ください。
Python スクリプト TWELITE STAGE アプリの「標準アプリ ビューア」および「コマンダー」は、どちらもシリアル通信によって文字列をやりとりしているに過ぎません。シリアル通信を利用できる環境であれば、自作のアプリケーションと親機を連携させることができます。
ここでは Python スクリプトを使ってDI1
の入力状態を表示したのち、DO1
の出力を制御してみましょう。
Python スクリプトを応用すれば、受信したデータを加工して保存したり、自作のソフトウェアから出力ポートを操作したりといった仕組みを実現できます。
Python に関する知識と経験のある読者を想定しています。
MWings ライブラリの導入 MWings ライブラリは、TWELITE と Python スクリプトの連携を簡単に実現するためのライブラリです。具体的には、子機から受信したデータを表す文字列の解釈と、子機へ送信するデータの構築を行います。
PyPI からインストールできます。
以降は pyenv と poetry による実行環境を想定しますが、MWings は Python 3.12 以降であれば動作します。お好みの環境があれば読み替えてください。
Python スクリプトによる受信 TWELITE DIP のDI1
へ接続したボタンが押された際にメッセージを表示する Python スクリプトを実装してみます。
サンプルスクリプトの実行 下記の内容のスクリプト dip_show_di1.py
を作成してください。
# -*- coding:utf-8 -*-
# TWELTIE DIP start guide: receiving in python
import mwings as mw
def main ():
twelite = mw. Twelite(mw. utils. ask_user_for_port())
@twelite.on (mw. common. PacketType. APP_TWELITE)
def on_app_twelite (packet):
if packet. di_state[0 ]:
print("DI1 Pressed" )
try :
twelite. daemon = True
twelite. start()
print("Started receiving" )
while True :
twelite. join(0.5 )
except KeyboardInterrupt :
print("Flushing..." )
twelite. stop()
print("Completed" )
if __name__ == "__main__" :
main()
スクリプトを実行すると、子機のDI1
が Low になったときに DI1 Pressed
と出力します。
実行時に複数の TWELITE R シリーズや MONOSTICK シリーズが接続されているときは、親機へ接続されたシリアルポートを選択してください。
poetry run python dip_show_di1.py
Multiple ports detected.
[ 1] /dev/cu.usbserial-R2xxxxxx TWE-Lite-R ( Genuine)
[ 2] /dev/cu.usbserial-R2xxxxxx TWE-Lite-R ( Genuine)
Select [ 1-2] : 2
Selected: /dev/cu.usbserial-R2xxxxxx
Started receiving
DI1 Pressed
DI1 Pressed
^CFlushing...
Completed
上記は macOS における例です。WindowsではCOMポート名を表示します。
サンプルスクリプトの解説 MWings ライブラリのインポート
短縮名 mw
を使って呼び出せるようにしています。pandas as pd
や numpy as np
と同様です。
オブジェクトの作成
twelite = mw. Twelite(mw. utils. ask_user_for_port())
親機をとやりとりするためのインタフェースとなる Twelite
オブジェクトを作成しています。
引数にはシリアルポートを指定しますが、ここでは mw.utils.ask_users_for_port()
ユーティリティを呼び出し、動的に決定しています。この関数はシリアルポートが存在しないときにエラーメッセージを出力し、1つだけ存在する場合はそのポートを、複数存在する場合はユーザが指定したポートを返します。
受信イベントハンドラの登録
@twelite.on (mw. common. PacketType. APP_TWELITE)
def on_app_twelite (packet):
if packet. di_state[0 ]:
print("DI1 Pressed" )
超簡単!標準アプリの子機からのパケットを受信したときに呼び出されるイベントハンドラを登録しています。
イベントハンドラの登録は、Python のデコレータ(? )を使って行います。今回は超簡単!標準アプリ(App_Twelite)のデータを対象とするため、@twelite.on(mw.common.PacketType.APP_TWELITE)
を記述しています。この記述の直後に定義された関数がハンドラとなります。関数名は問いませんが、Twelite
オブジェクトの初期化後に定義する必要があります。
今回は子機のDI1
がLowになったことを検知するため、受信ハンドラが受け取る変数 packet
(mwings.parsers.app_twelite.ParsedPacket
)のうち、DIx
の状態を示す List-like なオブジェクト di_state
(デジタルインタフェースの状態)0番目の真偽値を判定しています。di_state
の各値は、True
のときに Low を示します。
その他のデータの取り扱い packet
変数は、入力状態に加えて送信元の情報や受信側の情報も格納しています。例えばto_json()
を使って次のように改変すると、すべてのデータをJSON形式で出力できます。
@twelite.on (mw. common. PacketType. APP_TWELITE)
def on_app_twelite (packet):
print(packet. to_json(verbose= True , spread= False ))
なお verbose
はシステム情報の省略を、spread
はList-likeなオブジェクトの展開を有効化します。
pandas を導入している場合は、to_df()
を使ってデータフレームを得ることもできます。
@twelite.on (mw. common. PacketType. APP_TWELITE)
def on_app_twelite (packet):
print(packet. to_df(verbose= False ). to_string())
データの待機
twelite. daemon = True
twelite. start()
print("Started receiving" )
while True :
twelite. join(0.5 )
ここでは、別のスレッドで親機からのデータの待機を行っています。
Twelite
のオブジェクトは threading.Thread
のサブクラスであり、ここではその機能によってデーモンスレッドを立ち上げ、スクリプトを終了するまでメインスレッドをブロックしています。
なぜ while
ループおよび join(0.5)
としているのか Ctrl-C を押した際に正常終了できないからです。メインスレッドがシグナルを受け取ることができるようにしなくてはなりません。
終了処理
print("Flushing..." )
twelite. stop()
print("Completed" )
Ctrl-C が押された際には、twelite.stop()
を呼び出すことでサブスレッドを終了しています。
Python スクリプトによる送信 次は、反対に TWELITE DIP のDO1
へ接続された LED をPCから点滅させる Python スクリプトを実装してみます。
サンプルスクリプトの実行 下記の内容のスクリプト dip_blink_led.py
を作成してください。
# -*- coding:utf-8 -*-
# TWELITE DIP start guide: blinking from python
from time import sleep
import mwings as mw
def main ():
twelite = mw. Twelite(mw. utils. ask_user_for_port())
initial = {
"destination_logical_id" : 0x78 ,
"di_to_change" : [True , False , False , False ],
"di_state" : [False , False , False , False ],
}
command = mw. serializers. app_twelite. Command(** initial)
while True :
command. di_state[0 ] = not command. di_state[0 ]
twelite. send(command)
print(f "Flip DO1: { command. di_state[0 ]} " )
sleep(1 )
if __name__ == "__main__" :
try :
main()
except KeyboardInterrupt :
print("...Aborting" )
スクリプトを実行すると、子機のDO1
が一秒おきに点滅します。
実行時に複数の TWELITE R シリーズや MONOSTICK シリーズが接続されているときは、親機へ接続されたシリアルポートを選択してください。
poetry run python dip_blink_led.py
Multiple ports detected.
[ 1] /dev/cu.usbserial-R2xxxxxx TWE-Lite-R ( Genuine)
[ 2] /dev/cu.usbserial-R2xxxxxx TWE-Lite-R ( Genuine)
Select [ 1-2] : 2
Selected: /dev/cu.usbserial-R2xxxxxx
Flip DO1: True
Flip DO1: False
Flip DO1: True
Flip DO1: False
Flip DO1: True
^C...Aborting
サンプルスクリプトの解説 MWings ライブラリのインポート
短縮名 mw
を使って呼び出せるようにしています。pandas as pd
や numpy as np
と同様です。
オブジェクトの作成
twelite = mw. Twelite(mw. utils. ask_user_for_port())
親機をとやりとりするためのインタフェースとなる Twelite
オブジェクトを作成しています。
引数にはシリアルポートを指定しますが、ここでは mw.utils.ask_users_for_port()
ユーティリティを呼び出し、動的に決定しています。この関数はシリアルポートが存在しないときにエラーメッセージを出力し、1つだけ存在する場合はそのポートを、複数存在する場合はユーザが指定したポートを返します。
親機へ送信するコマンドの作成
initial = {
"destination_logical_id" : 0x78 ,
"di_to_change" : [True , False , False , False ],
"di_state" : [False , False , False , False ],
}
command = mw. serializers. app_twelite. Command(** initial)
超簡単!標準アプリの子機へ送信するパケットを生成するためのコマンドを表すデータ command
(mwings.serializers.app_twelite.Command
)を初期化しています。
辞書オブジェクト initial
は、コマンドの初期状態を表しています。ここでは、送信先の論理デバイスIDを 0x78
(全子機)としたうえで、DI1
を変更対象、High 状態としています。
データの送信
while True :
command. di_state[0 ] = not command. di_state[0 ]
twelite. send(command)
print(f "Flip DO1: { command. di_state[0 ]} " )
sleep(1 )
ここでは、コマンドデータの文字列への変換および親機への送信を1秒おきに行っています。
コマンドデータのうち、DOx
の状態を示す List-like なオブジェクト di_state
(デジタルインタフェースの状態)0番目の真偽値を反転させることで、点滅を実現しています。
4 - バイナリデータの伝送 UART通信により任意のバイト列を伝送する
シリアル通信アプリを使うことで、任意のバイナリデータの送受信を行うことができます。
TWELITE をシリアル通信を無線化する装置として利用し、PC間でバイト列のデータを送信してみます。
使用する製品 なお、TWELITE DIP と TWELITE R2 のペアは MONOSTICK 単体と同等です。次の組み合わせでも構いません。
シリアル通信アプリ TWELITE のファームウェアを、シリアル通信の無線化に特化したシリアル通信アプリ(App_Uart)へ書き換えます。超簡単!標準アプリはシリアル通信によるバイナリデータの伝送機能を備えているものの、その機能は非常に限られているからです。
ファームウェアの書き換え 親機と子機、すべての端末を書き換えます。
TWELITE STAGE SDK を導入 し、TWELITE STAGE アプリ を立ち上げるシリアルポート選択 から接続したデバイスを選択する「メインメニュー 」から「2: アプリ書換 」を選択する 「1: BINから選択 」を選び、App_Uart...
を選択する 書き込みが完了するまで、数回Enter
を押す
初期設定では、書き込みが成功すると次のようなインタラクティブモード の画面へ移行します。
--- CONFIG/TWE UART APP V1-04-5/SID=0x82018ca0/LID=0x78 -- ---
a: set Application ID (0x67720103)
i: set Device ID (120=0x78)
c: set Channels (18)
x: set RF Conf (3)
r: set Role (0x0)
l: set Layer (0x1)
b: set UART baud (38400)
B: set UART option (8N1)
m: set UART mode (E)
k: set Tx Trigger (sep=0x0d0a, min_bytes=0 dly=0[ms])
h: set header format [;U;%t;%i;0x%A;%q;%s;<*>;%X;\n]
C: set crypt mode (0)
o: set option bits (0x00000100)
---
S: save Configuration
R: reset to Defaults
通信モードの一覧 シリアル通信アプリには5つの通信モードがあり、用途に応じて使い分けることができます。
初期状態はヘッダ付き透過モードです。
シリアル通信アプリの各通信モードの詳細については、
マニュアル をご覧ください。
ここでは、次の4つのモードを使った通信テストの手順を紹介します。気になるものを選んでお試しください。
ヘッダ付き透過モード 送信側の書式はありません。 受信側の書式から、送信元の論理デバイスIDや受信時の電波通信品質といった情報を得ることができます。 バランスのよいモードです。 透過モード 送受信双方に書式はありません。 送信側の入力と受信側の出力は同等です。 最も簡単ですが、機能は限られています。 書式モード(アスキー) 送受信双方へ書式を適用します。 外部デバイスの対応が必要ですが、送信先の指定や送信元の識別ができます。 バイナリデータは16進数の文字列で表現します。 書式モード(バイナリ) 送受信双方へ書式を適用します。 外部デバイスの対応が必要ですが、送信先の指定や送信元の識別ができます。 バイナリデータはそのまま表現します。 今回は同一のPCへ2台の TWELITE を接続し、データをループバックさせてみましょう。通常は外部デバイス同士を無線経由で接続します。
ヘッダ付き透過モード ヘッダ付き透過モードを使用して、ASCIIデータHello
という文字列を双方から送信してみましょう。
設定方法 シリアル通信アプリの既定のモードはヘッダ付き透過モードです。よって初期設定のまま使用します。
通信テスト 1. TWELITE STAGE アプリを2つ立ち上げる TWELITE STAGE アプリ(TWELITE_Stage.exe/.command/.run
)を2つ立ち上げてください。
必須ではありませんが、実行ファイルを複製しておくことを推奨します(例:TWELITE_Stage_1
とTWELITE_Stage_2
)。
2. ターミナルを表示する 双方の TWELITE STAGE アプリにおいてシリアルポートを選択したのち、「1: ビューア」>「1: ターミナル」を選択します。
3. 片側から送信 片方の画面を選択し、Hello
と入力してEnter
を押します。もう片方の画面へ反映されます。
片側から送信
4. 反対側から送信 もう片方の画面を選択し、Hello
と入力してEnter
を押します。元の画面へ反映されます。
反対側から送信
次の系列は、以下のように解釈できます。
;U;00052;120;0x82036841;255;000;Hello;79;
データ 内容 値 U
char
固定値 U
00052
uint16
出力時のタイムスタンプ 52
秒120
uint8
送信元の論理デバイスID 120
IDなし子機0x82036841
uint32
送信元の拡張アドレス 82036841
255
uint8
LQI(電波通信品質) 255/255
000
uint8
送信元の続き番号 0
Hello
[uint8]
入力データ Hello
79
uint8
XORチェックサム 0x79
書式の詳細はマニュアル をご覧ください。
透過モード 透過モードを使用して、ASCIIデータHello
という文字列を双方から送信してみましょう。
設定方法 m
:通信モード をD
とします。
通信テスト 1. TWELITE STAGE アプリを2つ立ち上げる TWELITE STAGE アプリ(TWELITE_Stage.exe/.command/.run
)を2つ立ち上げてください。
必須ではありませんが、実行ファイルを複製しておくことを推奨します(例:TWELITE_Stage_1
とTWELITE_Stage_2
)。
2. ターミナルを表示する 双方の TWELITE STAGE アプリにおいてシリアルポートを選択したのち、「1: ビューア」>「1: ターミナル」を選択します。
3. 片側から送信 片方の画面を選択し、Hello
と入力してEnter
を押します。もう片方の画面へ反映されます。
片側から送信
エコーバック機能はないため、入力側の端末に入力した文字は表示されません。
4. 反対側から送信 もう片方の画面を選択し、Hello
と入力してEnter
を押します。元の画面へ反映されます。
反対側から送信
入出力のどちらにも書式がないため、入力したデータをそのまま出力します。
書式モード(アスキー) 書式モード(アスキー)を使用して、バイナリデータ 0x5A 0xAB 0x90 0x00
を双方から送信してみましょう。
Saab 9000 CD 2.3
設定方法 m
:通信モード をA
とします。
片方の端末のi
:論理デバイスID を0
(親機)としたうえで、もう片方の端末は1
(子機、ID1
)とします。
通信テスト(簡易形式) まずは、簡易形式のシンプルな書式を試してみましょう。
1. TWELITE STAGE アプリを2つ立ち上げる TWELITE STAGE アプリ(TWELITE_Stage.exe/.command/.run
)を2つ立ち上げてください。
必須ではありませんが、実行ファイルを複製しておくことを推奨します(例:TWELITE_Stage_1
とTWELITE_Stage_2
)。
2. ターミナルを表示する 双方の TWELITE STAGE アプリにおいてシリアルポートを選択したのち、「1: ビューア」>「1: ターミナル」を選択します。
3. 親機側から送信 まず、以下の系列をコピーします。
上記の系列は、次の内容を指します。
データ 内容 値 :
char
ヘッダ(固定値) :
01
uint8
送信先の論理デバイスID 0x01
子機23
uint8
任意のコマンド番号 0x23
5AAB9000
[uint8]
送信するデータ 0x5A 0xAB 0x90 0x00
47
uint8
チェックサム(LRC) 0x47
char
フッタ(改行文字) CR (0x0D
/\r
) char
フッタ(改行文字) LF (0x0A
/\n
)
書式の詳細はマニュアル をご覧ください。
次に、親機側の画面を選択します。
最後に、Alt+V
/⌘+V
を押してペーストし、Enter
を押します。子機側の画面へ反映されます。
親機側から送信
エコーバック機能がないほか、手入力ではタイムアウトしてしまいます。コピー&ペーストを利用してください。
上記における受信側の系列は、以下のように解釈できます。
データ 内容 値 :
char
ヘッダ(固定値) :
00
uint8
送信元の論理デバイスID 0x00
親機23
uint8
コマンド番号 0x23
5AAB9000
[uint8]
送信されたデータ 0x5A 0xAB 0x90 0x00
48
uint8
チェックサム(LRC) 0x48
char
フッタ(改行文字) CR (0x0D
/\r
) char
フッタ(改行文字) LF (0x0A
/\n
)
書式の詳細はマニュアル をご覧ください。
入力側の応答メッセージ
:DBA1...
の書式についても、
マニュアル をご覧ください。
4. 子機側から送信 まず、以下の系列をコピーします。
上記の系列は、次の内容を指します。
データ 内容 値 :
char
ヘッダ(固定値) :
00
uint8
送信先の論理デバイスID 0x00
親機23
uint8
任意のコマンド番号 0x23
5AAB9000
[uint8]
送信するデータ 0x5A 0xAB 0x90 0x00
48
uint8
チェックサム(LRC) 0x48
char
フッタ(改行文字) CR (0x0D
/\r
) char
フッタ(改行文字) LF (0x0A
/\n
)
書式の詳細はマニュアル をご覧ください。
次に、子機側の画面を選択します。
最後に、Alt+V
/⌘+V
を押してペーストし、Enter
を押します。親機側の画面へ反映されます。
子機側から送信
上記における受信側の系列は、以下のように解釈できます。
データ 内容 値 :
char
ヘッダ(固定値) :
01
uint8
送信元の論理デバイスID 0x01
子機23
uint8
コマンド番号 0x23
5AAB9000
[uint8]
送信されたデータ 0x5A 0xAB 0x90 0x00
47
uint8
チェックサム(LRC) 0x47
char
フッタ(改行文字) CR (0x0D
/\r
) char
フッタ(改行文字) LF (0x0A
/\n
)
書式の詳細はマニュアル をご覧ください。
入力側の応答メッセージ
:DBA1...
の書式についても、
マニュアル をご覧ください。
通信テスト(拡張形式) 次に、拡張形式の高度な書式を試してみましょう。
1. TWELITE STAGE アプリを2つ立ち上げる TWELITE STAGE アプリ(TWELITE_Stage.exe/.command/.run
)を2つ立ち上げてください。
必須ではありませんが、実行ファイルを複製しておくことを推奨します(例:TWELITE_Stage_1
とTWELITE_Stage_2
)。
2. ターミナルを表示する 双方の TWELITE STAGE アプリにおいてシリアルポートを選択したのち、「1: ビューア」>「1: ターミナル」を選択します。
3. 親機側から送信 まず、以下の系列をコピーします。
上記の系列は、次の内容を指します。
データ 内容 値 :
char
ヘッダ(固定値) :
01
uint8
送信先の論理デバイスID 0x01
子機A0
uint8
コマンド番号(固定値) 0xA0
CD
uint8
任意の応答ID 0xCD
FF
uint8
オプション なし0xFF
5AAB9000
[uint8]
送信するデータ 0x5A 0xAB 0x90 0x00
FE
uint8
チェックサム(LRC) 0xFE
char
フッタ(改行文字) CR (0x0D
/\r
) char
フッタ(改行文字) LF (0x0A
/\n
)
書式の詳細はマニュアル をご覧ください。
次に、親機側の画面を選択します。
最後に、Alt+V
/⌘+V
を押してペーストし、Enter
を押します。子機側の画面へ反映されます。
親機側から送信
エコーバック機能がないほか、手入力ではタイムアウトしてしまいます。コピー&ペーストを利用してください。
上記における受信側の系列は、以下のように解釈できます。
:00A0CD82036841FFFFFFFFFF00045AAB9000D1
データ 内容 値 :
char
ヘッダ(固定値) :
00
uint8
送信元の論理デバイスID 0x00
親機A0
uint8
コマンド番号(固定値) 0xA0
CD
uint8
応答ID 0xCD
82036841
uint32
送信元の拡張アドレス 0x82036841
FFFFFFFF
uint32
送信先の拡張アドレス 0xFFFFFFFF
なしFF
uint8
LQI 255/255
0004
uint16
続くデータの長さ 4
バイト5AAB9000
[uint8]
送信されたデータ 0x5A 0xAB 0x90 0x00
D1
uint8
チェックサム(LRC) 0xD1
char
フッタ(改行文字) CR (0x0D
/\r
) char
フッタ(改行文字) LF (0x0A
/\n
)
書式の詳細はマニュアル をご覧ください。
入力側の応答メッセージ
:DBA1...
の書式についても、
マニュアル をご覧ください。
4. 子機側から送信 まず、以下の系列をコピーします。
上記の系列は、次の内容を指します。
データ 内容 値 :
char
ヘッダ(固定値) :
00
uint8
送信先の論理デバイスID 0x00
親機A0
uint8
コマンド番号(固定値) 0xA0
CD
uint8
任意の応答ID 0xCD
FF
uint8
オプション なし0xFF
5AAB9000
[uint8]
送信するデータ 0x5A 0xAB 0x90 0x00
FF
uint8
チェックサム(LRC) 0xFF
char
フッタ(改行文字) CR (0x0D
/\r
) char
フッタ(改行文字) LF (0x0A
/\n
)
書式の詳細はマニュアル をご覧ください。
次に、子機側の画面を選択します。
最後に、Alt+V
/⌘+V
を押してペーストし、Enter
を押します。親機側の画面へ反映されます。
子機側から送信
上記における受信側の系列は、以下のように解釈できます。
:01A0CD820163B2FFFFFFFFFF00045AAB900066
データ 内容 値 :
char
ヘッダ(固定値) :
01
uint8
送信元の論理デバイスID 0x01
子機A0
uint8
コマンド番号(固定値) 0xA0
CD
uint8
応答ID 0xCD
820163B2
uint32
送信元の拡張アドレス 0x820163B2
FFFFFFFF
uint32
送信先の拡張アドレス 0xFFFFFFFF
なしFF
uint8
LQI 255/255
0004
uint16
続くデータの長さ 4
バイト5AAB9000
[uint8]
送信されたデータ 0x5A 0xAB 0x90 0x00
66
uint8
チェックサム(LRC) 0x66
char
フッタ(改行文字) CR (0x0D
/\r
) char
フッタ(改行文字) LF (0x0A
/\n
)
書式の詳細はマニュアル をご覧ください。
入力側の応答メッセージ
:DBA1...
の書式についても、
マニュアル をご覧ください。
書式モード(バイナリ) 書式モード(バイナリ)を使用して、バイナリデータ 0x5A 0xAB 0x90 0x00
を双方から送信してみましょう。
Saab 9000 CD 2.3
以降、バイナリデータ表現の 0x
を省略します。
例えば、0x5A 0xAB 0x90 0x00
は 5A AB 90 00
と表します。
設定方法 m
:通信モード をB
とします。
片方の端末のi
:論理デバイスID を0
(親機)としたうえで、もう片方の端末は1
(子機、ID1
)とします。
バイナリへ対応した環境を用意 TWELITE STAGE アプリのターミナル機能や TeraTerm はバイナリデータの扱いに対応していないため、バイナリ形式に対応したターミナルソフトを導入する必要があります。
ここでは、一例としてCoolTermを使用します。
通信テスト(簡易形式) まずは、簡易形式のシンプルな書式を試してみましょう。
1. CoolTerm の画面を2つ開く CoolTerm の画面を2つ開き、それぞれのデバイスへ接続します。
設定について Options
> Terminal
> Terminal Mode
を Raw Mode
としたうえで、Options
> Transmit
> Send String Options
> Terminate 'Send String' Data
のチェックを外してください。
設定の詳細については、STAGEアプリを使わずにUART通信する のページをご覧ください。
受信したデータを16進数で表示するために、View
> View Hex
を選択しておきます。Connect
を押して接続します。
2つの画面を開いた様子
2. 親機側から送信 親機側の画面を選択し、Connection
> Send String...
を選択して送信画面を開き、ラジオボタンのHex
を選んでおきます。
送信画面を開いた様子
次の内容を入力し、Send
を押して親機へ送信します。
A5 5A 80 06 01 23 5A AB 90 00 43 04
上記の系列は、次の内容を指します。
データ 内容 値 A5
uint8
ヘッダ(固定値) 0xA5
5A
uint8
ヘッダ(固定値) 0x5A
8006
uint16
データ長 6
バイト01
uint8
送信先の論理デバイスID 0x01
子機23
uint8
任意のコマンド番号 0x23
5AAB9000
[uint8]
送信するデータ 5A AB 90 00
43
uint8
チェックサム(XOR) 0x43
04
uint8
フッタ EOT (0x04
)
書式の詳細はマニュアル をご覧ください。
親機側から送信
上記における受信側の系列は、以下のように解釈できます。
A5 5A 80 06 00 23 5A AB 90 00 42 04
データ 内容 値 A5
uint8
ヘッダ(固定値) 0xA5
5A
uint8
ヘッダ(固定値) 0x5A
8006
uint16
データ長 6
バイト00
uint8
送信元の論理デバイスID 0x00
親機23
uint8
コマンド番号 0x23
5AAB9000
[uint8]
送信されたデータ 5A AB 90 00
42
uint8
チェックサム(XOR) 0x42
04
uint8
フッタ EOT (0x04
)
書式の詳細はマニュアル をご覧ください。
入力側の応答メッセージ
A5 5A 80 04 DBA1...
の書式についても、
マニュアル をご覧ください。
3. 子機側から送信 親機と同様に子機側の画面を選択し、Connection
> Send String...
を選択して送信画面を開き、ラジオボタンのHex
を選んでおきます。
次の内容を入力し、Send
を押して親機へ送信します。
A5 5A 80 06 00 23 5A AB 90 00 42 04
上記の系列は、次の内容を指します。
データ 内容 値 A5
uint8
ヘッダ(固定値) 0xA5
5A
uint8
ヘッダ(固定値) 0x5A
8006
uint16
データ長 6
バイト00
uint8
送信先の論理デバイスID 0x00
親機23
uint8
任意のコマンド番号 0x23
5AAB9000
[uint8]
送信するデータ 5A AB 90 00
42
uint8
チェックサム(XOR) 0x42
04
uint8
フッタ EOT (0x04
)
書式の詳細はマニュアル をご覧ください。
子機側から送信
上記における受信側の系列は、以下のように解釈できます。
A5 5A 80 06 01 23 5A AB 90 00 43 04
データ 内容 値 A5
uint8
ヘッダ(固定値) 0xA5
5A
uint8
ヘッダ(固定値) 0x5A
8006
uint16
データ長 6
バイト01
uint8
送信元の論理デバイスID 0x01
子機23
uint8
コマンド番号 0x23
5AAB9000
[uint8]
送信されたデータ 5A AB 90 00
43
uint8
チェックサム(XOR) 0x43
04
uint8
フッタ EOT (0x04
)
書式の詳細はマニュアル をご覧ください。
入力側の応答メッセージ
A5 5A 80 04 DB A1...
の書式についても、
マニュアル をご覧ください。
通信テスト(拡張形式) 次に、拡張形式の高度な書式を試してみましょう。
1. CoolTerm の画面を2つ開く CoolTerm の画面を2つ開き、それぞれのデバイスへ接続します。
設定について Options
> Terminal
> Terminal Mode
を Raw Mode
としたうえで、Options
> Transmit
> Send String Options
> Terminate 'Send String' Data
のチェックを外してください。
設定の詳細については、STAGEアプリを使わずにUART通信する のページをご覧ください。
受信したデータを16進数で表示するために、View
> View Hex
を選択しておきます。Connect
を押して接続します。
2つの画面を開いた様子
2. 親機側から送信 親機側の画面を選択し、Connection
> Send String...
を選択して送信画面を開き、ラジオボタンのHex
を選んでおきます。
送信画面を開いた様子
次の内容を入力し、Send
を押して子機へ送信します。
A5 5A 80 08 01 A0 CD FF 5A AB 90 00 F2 04
上記の系列は、次の内容を指します。
データ 内容 値 A5
uint8
ヘッダ(固定値) 0xA5
5A
uint8
ヘッダ(固定値) 0x5A
8008
uint16
データ長 8
バイト01
uint8
送信先の論理デバイスID 0x01
子機A0
uint8
コマンド番号(固定値) 0xA0
CD
uint8
任意の応答ID 0xCD
FF
uint8
オプション なし0xFF
5AAB9000
[uint8]
送信するデータ 0x5A 0xAB 0x90 0x00
F2
uint8
チェックサム(XOR) 0xF2
04
uint8
フッタ EOT (0x04
)
書式の詳細はマニュアル をご覧ください。
親機側から送信
上記における受信側の系列は、以下のように解釈できます。
A5 5A 80 12 00 A0 CD 81 0E 0E 23 FF FF FF FF BA 00 04 5A AB 90 00 10 04
データ 内容 値 A5
uint8
ヘッダ(固定値) 0xA5
5A
uint8
ヘッダ(固定値) 0x5A
8012
uint16
データ長 18
バイト00
uint8
送信元の論理デバイスID 0x00
親機A0
uint8
コマンド番号(固定値) 0xA0
CD
uint8
応答ID 0xCD
810E0E23
uint32
送信元の拡張アドレス 0x810E0E23
FFFFFFFF
uint32
送信先の拡張アドレス 0xFFFFFFFF
なしBA
uint8
LQI 186/255
0004
uint16
続くデータの長さ 4
バイト5AAB9000
[uint8]
送信されたデータ 0x5A 0xAB 0x90 0x00
10
uint8
チェックサム(XOR) 0x10
04
uint8
フッタ EOT (0x04
)
書式の詳細はマニュアル をご覧ください。
入力側の応答メッセージ
A5 5A 80 04 DB A1...
の書式についても、
マニュアル をご覧ください。
3. 子機側から送信 親機と同様に子機側の画面を選択し、Connection
> Send String...
を選択して送信画面を開き、ラジオボタンのHex
を選んでおきます。
次の内容を入力し、Send
を押して親機へ送信します。
A5 5A 80 08 00 A0 CD FF 5A AB 90 00 F3 04
上記の系列は、次の内容を指します。
データ 内容 値 A5
uint8
ヘッダ(固定値) 0xA5
5A
uint8
ヘッダ(固定値) 0x5A
8008
uint16
データ長 8
バイト00
uint8
送信先の論理デバイスID 0x00
親機A0
uint8
コマンド番号(固定値) 0xA0
CD
uint8
任意の応答ID 0xCD
FF
uint8
オプション なし0xFF
5AAB9000
[uint8]
送信するデータ 0x5A 0xAB 0x90 0x00
F3
uint8
チェックサム(XOR) 0xF3
04
uint8
フッタ EOT (0x04
)
書式の詳細はマニュアル をご覧ください。
子機側から送信
上記における受信側の系列は、以下のように解釈できます。
A5 5A 80 12 01 A0 CD 81 0E 00 92 FF FF FF FF BA 00 04 5A AB 90 00 AE 04
データ 内容 値 A5
uint8
ヘッダ(固定値) 0xA5
5A
uint8
ヘッダ(固定値) 0x5A
8012
uint16
データ長 18
バイト01
uint8
送信元の論理デバイスID 0x01
子機A0
uint8
コマンド番号(固定値) 0xA0
CD
uint8
応答ID 0xCD
810E0092
uint32
送信元の拡張アドレス 0x820163B2
FFFFFFFF
uint32
送信先の拡張アドレス 0xFFFFFFFF
なしBA
uint8
LQI 186/255
0004
uint16
続くデータの長さ 4
バイト5AAB9000
[uint8]
送信されたデータ 0x5A 0xAB 0x90 0x00
AE
uint8
チェックサム(XOR) 0xAE
04
uint8
フッタ EOT (0x04
)
書式の詳細はマニュアル をご覧ください。
入力側の応答メッセージ
A5 5A 80 04 DB A1...
の書式についても、
マニュアル をご覧ください。
5 - リモコンアプリによる高度なデジタル伝送 リモコンアプリを使用して、デジタル信号に特化した高度な機能を使用する
ファームウェアを超簡単!標準アプリ(App_Twelite)からリモコンアプリ(App_IO)へ書き換えることで、デジタル信号に特化した高度な機能を使用することができます。
リモコンアプリを使用して、デジタル信号の伝送に特化した高度な機能を利用します。例えば、子機の入力を12系統へ増やします。
使用する製品 リモコンアプリ TWELITE のファームウェアを、デジタル信号の伝送に特化したリモコンアプリ(App_IO)へ書き換えます。超簡単!標準アプリはデジタル信号の伝送機能を備えているものの、入出力は4本に限られています。リモコンアプリは入出力を増やし、その組み合わせを切り替えることができます。
ファームウェアの書き換え 親機と子機、すべての端末を書き換えます。
TWELITE STAGE SDK を導入 し、TWELITE STAGE アプリ を立ち上げるシリアルポート選択 から接続したデバイスを選択する「メインメニュー 」から「2: アプリ書換 」を選択する 「1: BINから選択 」を選び、App_IO...
を選択する 書き込みが完了するまで、数回Enter
を押す
初期設定では、書き込みが成功すると次のようなインタラクティブモード の画面へ移行します。
--- CONFIG/APP_IO V1-03-2/SID=0x86300001/LID=0x00 ---
a: set Application ID (0x67720107)
i: set Device ID (--)
c: set Channels (16)
x: set Tx Power (3)
t: set mode4 sleep dur (1000ms)
y: set mode7 sleep dur (0s)
f: set mode3 fps (16)
d: set hold mask (000000000000)
D: set hold dur (1000ms)
o: set Option Bits (0x00000000)
b: set UART baud (38400)
p: set UART parity (N)
C: set crypt mode (0)
K: set crypt key []
---
S: save Configuration
R: reset to Defaults
まずは使ってみる 初期状態のリモコンアプリは、次のように子機が12本のデジタル入力ポートを、親機が12本のデジタル出力ポートを備えた片方向伝送の設定 としています。まずは配線してみましょう。
名称 子機 親機 標準 DIP # I1
/O5
I1
O5
DI1
15 I2
/O6
I2
O6
DI2
16 I3
/O7
I3
O7
DI3
17 I4
/O8
I4
O8
DI4
18 I5
/O1
I5
O1
DO1
5 I6
/O2
I6
O2
DO2
8 I7
/O3
I7
O3
DO3
9 I8
/O4
I8
O4
DO4
12 I9
/O9
I9
O9
SCL
2 I10
/O10
I10
O10
SDA
19 I11
/O11
I11
O11
PWM1
4 I12
/O12
I12
O12
PWM4
11
親機の配線 初期状態のとき、親機は最大12本のデジタル信号を受信できます。
親機の配線図
上図では DIP 9番 O3
ピンを出力として使用していますが、他のOx
ピンも同様に使用できます。また、超簡単!標準アプリにはないチャネル上書き機能 を検証するため、DIP 23番 C1
ピンへタクトスイッチを接続しています。
子機の配線 初期状態のとき、子機は最大12本のデジタル信号を送信できます。
子機の配線図
上図では DIP 17番 I3
ピンを入力として使用していますが、他のIx
ピンも同様に使用できます。また、こちらも同様にチャネル上書き機能 を検証するため、DIP 23番 C1
ピンへタクトスイッチを接続しています。
動作確認 子機のI3
へ接続したボタンを押したり離したりします親機のO3
へ接続した LED が点灯したり消灯したりします。 子機のC1
へ接続したボタンを押しながら、I3
のボタンを押したり離したりします 親機と子機のC1
へ接続したボタンを押しながら、子機のI3
へ接続したボタンを押したり離したりします親機と子機の周波数チャネルを両方とも上書きするため、再び通信できるようになります。
C1
/C2
ピンは、次のように周波数チャネルを上書きします。
ボタンと LED に余りがあれば、入出力を増やしてみましょう。
12系統あるため、例えば 7セグメント LED を使用できます。
高度な機能を使ってみる 次のようなシチュエーションを想定して、インタラクティブモードによる設定変更を行ってみましょう。
子機と親機の入出力の割り当てを変更し、双方とも6入力6出力とする 子機の入力を最短で親機へ反映する パケットが断絶した際に出力信号を復帰させる 子機を省電力リモコンとする 子機を長押しによる連続送信へ対応した省電力リモコンとする 子機と親機を6入力6出力とする インタラクティブモードからオプションビット の値を変更することで、入出力の割り当てを下記のなかから選ぶことができます。
ここでは、双方とも6入力6出力としてみましょう。
TWELITE STAGE アプリ を立ち上げるシリアルポート選択 から接続したデバイスを選択する「メインメニュー 」から「3: インタラクティブモード 」を選択する Enter
を押し、設定項目 が表示されることを確認するo
(小文字)を入力し、オプションビットの値 00002000
を入力してEnter
を押下するS
(大文字)を入力して保存し、ESC
を押下して終了これで次のように、子機と親機がともに6本の入出力をもつ割り当て となります。
名称 子機 親機 標準 DIP # I1
/O5
I1
I1
DI1
15 I2
/O6
I2
I2
DI2
16 I3
/O7
I3
I3
DI3
17 I4
/O8
I4
I4
DI4
18 I5
/O1
O1
O1
DO1
5 I6
/O2
O2
O2
DO2
8 I7
/O3
O3
O3
DO3
9 I8
/O4
O4
O4
DO4
12 I9
/O9
O5
I5
SCL
2 I10
/O10
O6
I6
SDA
19 I11
/O11
I5
O5
PWM1
4 I12
/O12
I6
O6
PWM4
11
超簡単!標準アプリと比較して、2本ずつデジタル信号を多く扱えます!
子機の入力を最短で親機へ反映する 子機の連続モード を使用するとき、子機の入力から親機の出力までに通常は 30-70ms 程度の遅延が発生します。すばやい応答が必要とされる場面では、この遅延を小さくするためにインタラクティブモードからオプションビット0x00000001
:低レイテンシモード を設定します。
子機の設定 TWELITE STAGE アプリ を立ち上げるシリアルポート選択 から接続したデバイスを選択する「メインメニュー 」から「3: インタラクティブモード 」を選択する Enter
を押し、設定項目 が表示されることを確認するo
(小文字)を入力し、オプションビットの値 00000001
を入力してEnter
を押下するS
(大文字)を入力して保存し、ESC
を押下して終了
ほぼ同時に複数の入力が変化した際は、順番に送信します。そのため、次に処理される入力は遅延してしまうことに注意してください。
また、入力にチャタリングが発生した場合、そのまま出力へ反映されてしまう場合があることにも注意してください。
低レイテンシモードを子機の間欠モード へ適用したときの振る舞いは、連続モードと異なります。
割り込みから起床した際は、対象の割り込みポートの値だけを送信します あるポートを割り込み起床ピンとして利用し、起床した際に他のポートの状態を同時に読むことはできません スリープから復帰した際は、IOポートの状態を通常の1/4の時間で確定させます
チャタリングのあるボタンではなく、センサのデジタル出力を送信する用途に適しています!
パケットの断絶時に信号を復帰させる いずれかの入力がLoの状態のまま電波が途切れた場合には、実際の入力がLoからHiへ戻っても出力はLoを維持します。
パケットが断絶した際に信号を元の状態へ戻すには、リモコン長押しモード を適用します。リモコン長押しモードでは、送信側の入力が変化してからしばらくの間、継続的に信号を送信します。受信側では、Lo 状態を示すパケットが断絶してから一定の時間が経過すると、タイムアウトして出力を Hi へ戻します。
子機の設定 M1
/M2
/M3
を開放し、子機:連続モード を設定するTWELITE STAGE アプリ を立ち上げるシリアルポート選択 から接続したデバイスを選択する「メインメニュー 」から「3: インタラクティブモード 」を選択する Enter
を押し、設定項目 が表示されることを確認するo
(小文字)を入力し、オプションビットの値 00000100
を入力してEnter
を押下するd
(小文字)を入力し、ホールド/長押しモードの対象 (000000001010
ならI2
とI4
、長押し時に連続送信するポート)を入力してEnter
を押下するD
(大文字)を入力し、ホールド/長押しモードの時間 (すべての入力がLoからHiへ戻ったあとに送信を続ける時間)を入力してEnter
を押下するS
(大文字)を入力して保存し、ESC
を押下して終了親機の設定 M1
/M2
/M3
を開放し、子機:連続モード を設定するTWELITE STAGE アプリ を立ち上げるシリアルポート選択 から接続したデバイスを選択する「メインメニュー 」から「3: インタラクティブモード 」を選択する Enter
を押し、設定項目 が表示されることを確認するo
(小文字)を入力し、オプションビットの値 00000100
を入力してEnter
を押下するd
(小文字)を入力し、ホールド/長押しモードの対象 (000000001010
ならO2
とO4
、断絶時にタイムアウトするポート)を入力してEnter
を押下するD
(大文字)を入力し、ホールド/長押しモードの時間 (Loの信号が途切れてからHiへ戻すまでの時間)を入力してEnter
を押下するS
(大文字)を入力して保存し、ESC
を押下して終了
リモコンからモータを遠隔制御するような用途に適しています!
子機を省電力リモコンとする 子機を電池で駆動させる場合には、スリープと起床を繰り返す間欠モード が有効です。低レイテンシモード およびホールドモード を併用することで、子機のボタンを押した際に親機の出力を設定した時間にわたって維持する動作を実現できます。
子機の設定 M1
/M2
/M3
をGND
へ接続し、子機:間欠10秒モード を設定するTWELITE STAGE アプリ を立ち上げるシリアルポート選択 から接続したデバイスを選択する「メインメニュー 」から「3: インタラクティブモード 」を選択する Enter
を押し、設定項目 が表示されることを確認するo
(小文字)を入力し、オプションビットの値 00000001
を入力してEnter
を押下するS
(大文字)を入力して保存し、ESC
を押下して終了親機の設定 M1
/M2
/M3
を開放し、子機:連続モード を設定するTWELITE STAGE アプリ を立ち上げるシリアルポート選択 から接続したデバイスを選択する「メインメニュー 」から「3: インタラクティブモード 」を選択する Enter
を押し、設定項目 が表示されることを確認するd
(小文字)を入力し、ホールド/長押しモードの対象 (000000001010
ならO2
とO4
、ホールドするポート)を入力してEnter
を押下するD
(大文字)を入力し、ホールド/長押しモードの時間 (ホールドする時間)を入力してEnter
を押下するS
(大文字)を入力して保存し、ESC
を押下して終了
ホールド/長押しモードの時間 は、リモコンの要件に合わせてください。例えば、ボタンが押されたときにランプを一定時間光らせるなら3000ミリ秒といった長めの時間、頻繁にボタンを操作する場合は50ミリ秒といったの短めの時間がよいでしょう。
省電力性能に優れたリモコンから LED を遠隔制御するような用途に適しています!
子機を長押し省電力リモコンとする 子機を電池で駆動させる場合には、スリープと起床を繰り返す間欠モード が有効です。低レイテンシモード およびリモコン長押しモード を併用することで、子機のボタンを押している間に親機への送信を連続的に行うことができます。また、子機のボタンを離したあとに一定の時間にわたって送信を続け、親機側では子機のボタンを押した状態の電波が途切れてから一定の時間が経過した場合に出力を元に戻します。このため、省電力性能に優れた子機の入力をより確実に親機へ届けることができます。
子機の設定 M1
/M2
/M3
をGND
へ接続し、子機:間欠10秒モード を設定するTWELITE STAGE アプリ を立ち上げるシリアルポート選択 から接続したデバイスを選択する「メインメニュー 」から「3: インタラクティブモード 」を選択する Enter
を押し、設定項目 が表示されることを確認するo
(小文字)を入力し、オプションビットの値 00000103
(00000100
+00000001
+00000002
) を入力してEnter
を押下するd
(小文字)を入力し、ホールド/長押しモードの対象 (000000001010
ならI2
とI4
、長押し時に連続送信するポート)を入力してEnter
を押下するD
(大文字)を入力し、ホールド/長押しモードの時間 (すべての入力がLoからHiへ戻ったあとに送信を続ける時間)を入力してEnter
を押下するS
(大文字)を入力して保存し、ESC
を押下して終了親機の設定 M1
/M2
/M3
を開放し、子機:連続モード を設定するTWELITE STAGE アプリ を立ち上げるシリアルポート選択 から接続したデバイスを選択する「メインメニュー 」から「3: インタラクティブモード 」を選択する Enter
を押し、設定項目 が表示されることを確認するo
(小文字)を入力し、オプションビットの値 00000100
を入力してEnter
を押下するd
(小文字)を入力し、ホールド/長押しモードの対象 (000000001010
ならO2
とO4
、断絶時にタイムアウトするポート)を入力してEnter
を押下するD
(大文字)を入力し、ホールド/長押しモードの時間 (Loの信号が途切れてからHiへ戻すまでの時間)を入力してEnter
を押下するS
(大文字)を入力して保存し、ESC
を押下して終了
省電力性能に優れたリモコンからモータを遠隔制御するような用途に適しています!