TWELITE UARTとマイコンで無線通信

# 概要
TWELITE UARTをマイコンでシンプルに使う方法を紹介します。

# 用意するもの
* [MONOSTICK](https://mono-wireless.com/jp/products/MoNoStick/index.html)
* [TWELITE UART](https://mono-wireless.com/jp/products/twelite-uart/index.html)
* [TWELITE R](https://mono-wireless.com/jp/products/TWE-LITE-R/twelite-r1/index.html)
* UARTが使えるテキトウなマイコン (今回は[M5Stack]()を使用)
* レベル変換基板(5V-3.3V変換)
* [TWELITE_Stage.exe](https://stage.twelite.info/install) (アプリ)

[TWELITE R](https://mono-wireless.com/jp/products/TWE-LITE-R/twelite-r1/index.html)は用意できるなら、[TWELITE R2](https://mono-wireless.com/jp/products/TWE-LITE-R/index.html)の方がよいと思います。

# セッティング
MONOSTICKとTWELITE UARTのファームウェアをUART通信用のものに書き換える必要があるので、TWELITE Rを使用して書き換えます。

### MONOSTICKのファームウェア書き換え
1. MONOSTICKをPCに接続する
1. TWELITE_Stage.exeを起動する
1. MONOSTICKを選択する
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370593/cb3e9073-42bc-bfc7-5ba9-418d9db49b3b.png)
1. アプリ書換を選択する
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370593/8b88c542-1616-d5f1-680b-ec6518469ecc.png)
1. BINから選択を選択する
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370593/a28f6813-bdf2-6373-7fea-a0e17956a732.png)
1. App_Uart_RED_L1305_V1-4-7を選択する (BLUEの場合はBLUEの方を選択)
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370593/a2b75d7e-badb-e101-01b8-32c22327c636.png)
1. 書き換えが成功すれば、インタラクティブモードに遷移する

### MONOSTICKの設定 (インタラクティブモード)
1. インタラクティブモードで以下のように設定する
    * ボーレートを115200に変更 (他の値でもよい)
    * UART modeを透過モード(D)に変更
    * オプションビットを0x0010100に変更 
        (0x0010000のビットを1にしないとボーレートが115200固定になるらしい)
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370593/e0f4a9f0-466f-ed89-b89b-ff34787dd7db.png)

:::note warn
ボーレートを115200以外に設定した場合、TWELITE Stageのボーレートを合わせないと再度インタラクティブモードに入ることができないので注意してください。
[TWELITE STAGEの設定] -> [共通設定] -> [ボーレート]で設定できます。 
:::

1. 設定を保存するために大文字のSを入力して保存する
1. これでMONOSTICKの設定は完了

### TWELITE UARTのファームウェアの書き換え
1. TWELITE UARTとTWELITE Rを接続する
    (TWELITE Rは3.3VをTWELITE UARTへ供給できないので、無理やり3.3Vを供給している)
    ![PXL_20241017_061113034.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370593/01519869-8ed1-52f6-3170-a697598b29b6.jpeg)
1. TWELITE RをPCに接続する
1. TWELITE_Stage.exeを起動する
1. TWELITE Rを選択する
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370593/e9728c8c-9e6c-b846-1209-ec7fd0ed6db0.png)
1. 以降はMONOSTICKと同様にファームウェアの書き換えを行う (ファームウェアはMONOSTICKと同じものに書き換える)

### TWELITE UARTの設定 (インタラクティブモード)
1. MONOSTICKと同様に、インタラクティブモードで以下のように設定する
    * ボーレートを115200に変更 (他の値でもよい。MONOSTICKと合わせる必要もない)
    * UART modeを透過モード(D)に変更
    * オプションビットを0x0010100に変更 
        (0x0010000のビットを1にしないとボーレートが115200固定になるらしい)
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370593/e0f4a9f0-466f-ed89-b89b-ff34787dd7db.png)
1. 設定を保存するために大文字のSを入力して保存する
1. これでTWELITE UARTの設定は完了

### TWELITE UARTとマイコンの結線
TWELITE UARTは3.3V駆動なので、5V駆動のマイコンと直接接続することができません。そのため、レベル変換を行う必要があります。今回は以下のような接続で行いました。
左側のコネクタをマイコンに接続し、マイコンから5Vを供給してDC/DCコンバータで3.3Vへ降圧してTWELITE UARTへ給電しています。レベル変換は、中央のAE-LCNV4-MOSFETという製品で行っています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370593/221144a4-c4fb-3093-49fc-0a1322595a12.png)

:::note warn
TWELITE UARTの電源ピンや通信ピンに5Vを入力しないでください。一瞬接続したからといってすぐ壊れるわけではないかもしれませんが、故障の原因になります。
:::

# 実際に通信してみる
1. MONOSTICKをPCに接続する
1. TWELITE UARTとマイコンを接続する
    今回はこんな感じでM5Stackと接続しました。(Serial2をTWELITE UARTに接続)
    ![PXL_20241019_053923636.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370593/0544a147-bb57-4282-9ca1-1b84fc8e27db.jpeg)
1. マイコンにテキトウなプログラムを書き込む
    マイコンがUART通信するように以下のようなプログラムを書き込みました。
    このプログラムはUARTで受信した文字列をLCDに出力して、送り返すプログラムです。
    ```cpp
    #include <Arduino.h>
    #include <M5Unified.h>
    #include "Core.h"
    
    String buf;
    
    void setup()
    {
        M5.begin();
    
        M5.Display.setTextSize(2);
    
        Serial.begin(115200, SERIAL_8N1);
        Serial2.begin(115200, SERIAL_8N1, G16, G17);
    }
    
    void loop()
    {
        M5.update();
    
        while (0 < Serial2.available())
        {
            char c = Serial2.read();
            buf += c;
    
            const int res = buf.compareTo("clear\r\n");
            // Serial.printf("%s : %d\n", buf, res);
            if (0 == res)
            {
                M5.Display.clear();
                M5.Display.setCursor(0, 0);
                buf.clear();
            }
            else if (c == '\n')
            {
                Serial2.printf("%s", buf);
                M5.Display.printf("%s", buf);
                buf.clear();
            }
        }
    
        delay(50);
    }
    ```
1. PCでTeratermなどを起動してMONOSTICKと接続する
    TeratermなどのCOMポートを開くことができるツールを使用してください。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370593/3e5cd8bb-ce37-0bf7-a728-939a322f1ff4.png)

1. Teraterm上で何か文字を打ってEnterキーを押す
    Enterキーを押すと文字列が送信されてLCD上に表示されると思います。
    LCDとTeratermに同じ文字列が表示されれば、双方向に通信ができています。
    ![名称未設定ファイル.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370593/1f0f5826-d37d-d167-5e79-bb87dc4e6ba2.png)



:::note warn
改行コードのCRLFを認識してTWELITE UARTは文字列を送信しているので、Teratermの改行コードがCRLFになっていない場合は設定を変更する必要があります。[設定] -> [端末]から設定できます。
(TWELITE UART側でLFを認識して送信するようにも設定可能です)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370593/ee51959c-bdb4-2b5d-acd8-997090ae1438.png)
:::

# TWELITE UARTの透過モードについて
TWELITE UARTの透過モードを今回使用しましたが、このモードは有線UARTを無線にそのまま置き換えることができるモードとなっています。何もプログラムを変更する必要がないという利点はありますが、TWELITE Stageのインタラクティブモードの設定にあったApp IDとChannelの設定が同じTWELITE製品を近くで使用している場合、お互いに混線するという欠点があります。送信元IDなどは付加されていないので、送信元も判別できないという問題点もあります。
このような欠点があるとはいえ、デバッグなどのための便利ツールとしてTWELITEを使用する場合はこの欠点もほとんど気にならないと思うので、透過モードを使えばよいと思います。

# まとめ
今回はTWELITE UARTを使用してUART通信を無線に置き換えてみました。UARTでデバッグする機会は多いので、これが無線化できるのは非常に便利だと思います。TWELITE製品は多機能なため、使用するための設定が多く、わかりにくい部分があるのでこの記事が参考になれば幸いです。