使用方法 usage
TWELITE UARTの使用方法を3つのステップに分けて説明します。
1. 動作確認をする
MONOSTICKやTWELITE UARTを使って、PCで動作確認を行うための流れを説明します。
動作確認をする 2. 出力書式を変更する
シリアル通信アプリでは、出力の書式を自由に変更することができ、処理しやすい形式にしたり、欲しい付加情報だけを得ることができます。
書式の変更方法を実例を交えて説明します。
出力書式 3. マイコンに接続する
Arduino Unoと接続して通信を行う例をご紹介します。
マイコンと接続する 動作確認をする Check Operation
TWELITE UARTやMONOSTICKを使って通信してみましょう。
必要なもの
MONOSTICKとTWELITE UARTを使用する場合
TWELITE UARTを2つ使用する場合
TWELITE STAGE SDKの準備
まず最初にTWELITE STAGE SDK の最新版をパソコンにインストールします。
MONOSTICKの準備
TWELITE UARTを2つ使用して動作確認をする場合は、ここを読み飛ばしてください。
TWELITE STAGE APPを起動する
1. MONOSTICKをパソコンのUSBポートに接続します。
2. インストールしたTWELITE STAGE SDKのMWSTAGEフォルダ内の以下のファイルをダブルクリックしてください。
・TWELITE_stage.exe(Windows)
・TWELITE_stage.command(macOS)
・TWELITE_stage.run(Linux)
起動するとUSBに接続されたMONOSTICKが画面上に表示されます。
3. シリアルポート選択画面から 1: MONOSTICK を選択してください。
4. デバイスを選択するとTWELITE STAGE APPのトップメニュー画面が表示されます。
シリアル通信アプリを書き込む
通信相手としてMONOSTCK - モノスティック を使用することができます。
以下の手順でシリアル通信アプリをMONOSTICK - モノスティックに書き込んでください。
1. トップメニューから 2:アプリの書換 > 1:BINから選択を選択してください。
2. MONOSTICK BLUE を使用している場合はApp_Uart_BLUE... を選択し、 MONOSTICK RED を使用している場合は App_Uart_RED... を選択してください。
3. 書き込み完了後はインタラクティブモードに入らずにESCキーを長押ししてトップメニューに戻ってください。
4. トップメニューから 1:ビューア> 1: ターミナル を選択します。
TWELITE UARTの準備
TWELITE UARTを32つ使用する場合は、ここを2回行ってください。
TWELITE R2と接続する
図のようにTWELITE R2とTWELITE UARTを接続します。
接続できたら、TWELITE R2のUSBコネクターに通信ができるUSBケーブルを接続してください。
TWELITE STAGE APPを起動する
1. TWELITE R2に接続されているUSBケーブルをパソコンのUSBポートに接続します。
2. インストールしたTWELITE STAGE SDKのMWSTAGEフォルダ内の以下のファイルをダブルクリックしてください。
・TWELITE_stage.exe(Windows)
・TWELITE_stage.command(macOS)
・TWELITE_stage.run(Linux)
起動するとUSBに接続されたTWELITE R2が画面上に表示されます。
3. シリアルポート選択画面から1: TWELITE R2を選択してください。
4. デバイスを選択するとTWELITE STAGE APPのトップメニュー画面が表示されます。
5. トップメニューから 1:ビューア> 1: ターミナル を選択します。
通信を確認する
TWELITE UARTにHELLO<Enter>
と入力すると、MONOSTICKに補助情報が含まれた形でHELLO
が表示されます。TWELITE UARTにも出力が出ますが、これは送信完了を示すメッセージです。
MONOSTICKからも同様にメッセージを送信できます。
コピー [送信側]
HELLO <- 入力
;U;00818;219;0x81025A17;000;013;13,1,HEL...;55; <- 出力
[受信側]
;U;00777;120;0x81025A17;120;013;HELLO;26; <-出力
出力書式 output format
初期設定
初期モードではインタラクティブモードのh: set header format
を設定することで書式を自由に設定できます。
初期設定では、書式が以下のように設定されています。
コピー ;U;%t;%i;0x%A;%q;%s;<*>;%X;\n
この設定の意味は以下の通りです。
メッセージの送り主の8bit論理アドレス
0-100,120
: 子機から
219
: 自身から(起動時や送信完了メッセージの場合)
メッセージの送り主のアドレス(32bitロングアドレス、シリアル番号)
チェックサム計算開始位置を設定する(設定しない場合は出力の先頭)
例えば送信側からHELLO<Enter>
と入力した場合、出力側からは以下のように出力され、それぞれのデータの意味は下表の通りです。
コピー ;U;00777;120;0x81025A17;120;013;HELLO;79;
;1;2----;3--;4---------;5--;6--;7----;8-;
送信機のシリアル番号が1025A17(先頭の8は通常、読み飛ばします。)
HELLO; のチェックサム (0x48 xor 0x45 xor 0x4C xor 0x4C xor 0x4F xor 0x3B)
出力の設定の詳細については出力のカスタマイズ をご覧ください。
出力のカスタマイズ 出力の変更例
実際に設定を変更してみましょう。
例えば、Excelで取り扱いやすくするためにカンマ(,)でデータを区切り、付加情報を送信機のシリアル番号と電波強度、続き番号のみにすると設定は以下のようになります。
コピー --- CONFIG/TWE UART APP V1-04-5/SID=0x82018ca0/LID=0x78 -- ---
...
h: set header format [%A,%q,%s,*\n]
...
---
S: save Configuration
R: reset to Defaults
この設定をし、送信側からHELLO<Enter>
と入力した場合、出力側からは以下のように出力されます。
コピー 81025A17,120,013,HELLO
マイコンと接続する Connect to microcontroller
実際にArduinoを使用してマイコンの無線化を行います。
シリアル通信を行う
PCからArudinoに入力したシリアルデータをTWELITE UARTを介して、もう一台のArduinoに無線で送信し、そのデータを解釈するサンプルです。
用意する電子部品
以下のものを2セット用意してください。
配線
設定
TWELITE UARTをTWELITE R2などを使用して、以下のような設定にしてください。
コピー --- 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 [;%A;%q;*;\n] <- ここを変更(書式の変更)
C: set crypt mode (0)
o: set option bits (0x00010100) <- ここを変更(ボーレートの変更)
---
S: save Configuration
R: reset to Defaults
サンプルSketch
Arduino IDEを起動させ、以下のプログラムをコピー&ペーストし、Arduinoに書き込んでください。
コピー #include <SoftwareSerial.h>
SoftwareSerial MWSerial(2, 3); // RX, TX
#define BLOCK_MAX 10
char *p;
char buf[256];
// データ列を区切り文字で分割してString型の配列に入れる。
int split( char* source, char delimiter, String* result ){
char* p = source;
char tmp[81];
memset(tmp, 0, sizeof(tmp));
int n = 0;
int block = 0;
// ヌル文字が来るか分けたブロック数がBLOCK_MAXになったらやめる。
while( *p != 0 && block < BLOCK_MAX ){
// 区切り文字が来たら、String型に変換する。
if( *p == delimiter ){
// 分割したデータが0バイトの時は何もしない。
if( n > 0 ){
// 念のためヌル文字を末尾に代入。
tmp[n] = 0;
result[block] = String(tmp);
block++;
n = 0;
memset(tmp, 0, sizeof(tmp));
}
}else{
tmp[n] = *p;
n++;
}
p++;
}
return block;
}
void setup() {
Serial.begin(38400);
MWSerial.begin(38400);
p = buf;
memset(buf, 0, sizeof(buf));
}
void loop() {
while (MWSerial.available()) {
char before = *p;
*p = MWSerial.read();
if( before=='\r' && *p=='\n' ){
*p = 0; // 末尾をNull文字にする
String str[BLOCK_MAX]; // 区切り文字で分割した文字列を入れる
int len = p-buf; // シリアルで読み込んだデータ量の計算
int block = split( buf, ';', str ); // データの分割
if( block == 3 ){
Serial.print("Message: ");
Serial.println(buf);
Serial.print("Serial No.: ");
Serial.println(str[0]);
Serial.print("LQI: ");
Serial.println(str[1]);
Serial.print("Data: ");
Serial.println(str[2]);
Serial.println();
}
p = buf;
memset(buf, 0, sizeof(buf));
}else{
if( *p >= 0x20 ){
p++;
}
}
}
while(Serial.available()){
MWSerial.write(Serial.read());
}
}
使用方法
Arduino IDE のシリアルモニターなどを使用して、送信側のArduinoにメッセージを入力(ここではHELLO
)すると受信側のArduinoから以下のようなメッセージがシリアル出力されます。
送信するメッセージには必ず最後に改行コード(CR+LF)をつけてください。
改行コードをつけないとデータが送信されません。
コピー [送信側]
HELLO <- 入力
Message: ;820109F1;000;12,1,HEL...; <- 出力
Serial No.: 820109F1 <- 出力
LQI: 000 <- 出力
Data: 12,1,HEL... <- 出力
[受信側]
Message: ;820109F1;177;HELLO; <- 出力
Serial No.: 820109F1 <- 出力
LQI: 177 <- 出力
Data: HELLO <- 出力
Sketchの解説
メインループ
下記の関数がシリアル通信の処理を記述したメインループ関数です。
2~30行目ではTWELITEからのシリアル出力を読み込む処理を行っております。
TWELITEからCR+LFが来るまでは内部のバッファに受信したシリアル電文をためておき、CR+LFが来たらsplit()関数で保持していたデータを分割し、PCにシリアル出力します。
32~34行目はPCから来たシリアルデータをそのままTWELITEに送ります。
コピー void loop() {
while (MWSerial.available()) {
char before = *p;
*p = MWSerial.read();
if( before=='\r' && *p=='\n' ){
*p = 0; // 末尾をNull文字にする
String str[BLOCK_MAX]; // 区切り文字で分割した文字列を入れる
int len = p-buf; // シリアルで読み込んだデータ量の計算
int block = split( buf, ';', str ); // データの分割
if( block == 3 ){
Serial.println(buf);
Serial.print("Serial No.: ");
Serial.println(str[0]);
Serial.print("LQI: ");
Serial.println(str[1]);
Serial.print("Data: ");
Serial.println(str[2]);
Serial.println();
}
p = buf;
memset(buf, 0, sizeof(buf));
}else{
if( *p >= 0x20 ){
p++;
}
}
}
while(Serial.available()){
MWSerial.write(Serial.read());
}
}
文字列を分割する関数
split()は保持しているシリアルデータを区切り文字ごとに分割する関数です。
引数の配列を前から順番に中を確認し、区切り文字になったらそこまでの配列をString型に変換してて保管します。
分割が終わったら、分割した数を戻します。
もとのシリアルデータはString型ではなくchar型の配列で、分割後はString型になりますので、変数の方の取り扱いをご注意ください。
コピー int split( char* source, char delimiter, String* result ){
char* p = source;
char tmp[81];
memset(tmp, 0, sizeof(tmp));
int n = 0;
int block = 0;
// ヌル文字が来るか分けたブロック数がBLOCK_MAXになったらやめる。
while( *p != 0 && block < BLOCK_MAX ){
// 区切り文字が来たら、String型に変換する。
if( *p == delimiter ){
// 分割したデータが0バイトの時は何もしない。
if( n > 0 ){
// 念のためヌル文字を末尾に代入。
tmp[n] = 0;
result[block] = String(tmp);
block++;
n = 0;
memset(tmp, 0, sizeof(tmp));
}
}else{
tmp[n] = *p;
n++;
}
p++;
}
return block;
}