TWE-LiteをArduinoIDEで使う

- 2018/9/4更新
    -  [ArduinoのReferenceページ](https://www.arduino.cc/reference/en/) のAPI全部インプリできたっぽいので、リリース版を作成しました。「多分動くと思うからリリースしようぜ」ってやつです。
- 2017/9/21更新
    -  Pinout図追加, 未実装機能からpulseIn(), tone(), noTone()を削除
- 2017/9/13更新:
    -  [TWELITE NET SDK](https://mono-wireless.com/jp/products/TWE-NET/TWESDK.html)を使用するよう記載を変更。(NXPからJN516xのSDK持ってくる必要なくなりました。)
    -  最新の環境で動作するようサンプルの図を修正
- 2016/2/29追記:
    -  [続き書きました。](http://qiita.com/soburi/items/b07c314d33ef71a10001)

[soburi/JN516x-arduino-package](https://github.com/soburi/JN516x-arduino-package)

[TWE-Lite DIP](https://mono-wireless.com/jp/products/TWE-Lite-DIP/) を Arduino化するパッケージを作成したのでステマに来ました。


これはなに？
----------------
TWE-LiteのプログラムをArduino IDEを使って書けるようにするためのArduinoのパッケージです。
TWE-LiteはC言語向けの[開発環境](https://mono-wireless.com/jp/products/TWE-NET/TWESDK.html)が提供されていますが、
組み込み開発のスキルをベースとしたもので慣れてないとかなり難解な構成になっています。
提供元のモノワイヤレスさんからは、無改造でUARTのワイヤレス化を行うようなデフォルトのファームウェアが提供されていますが、Arduinoと組み合わせて使うと、そもそもTWE-Liteが比較的リッチな機能を搭載したマイコンであるため、冗長な感じが否めません。
この「難しい、金かかる、複雑」を解消すべく、TWE-Lite自体を「無線機能付きArduino」として使えるようにすることを目的としています。


必要なモノ
-------------

- [TWE-Lite DIP](https://mono-wireless.com/jp/products/TWE-Lite-DIP/index.html)
- [TWE-Lite R](https://mono-wireless.com/jp/products/TWE-LITE-R/index.html)
- LED, 抵抗, 半固定抵抗, ジャンプワイヤ(サンプルプログラム動作確認用)
- MicroUSBケーブル


インストール
----------------

~~チップ依存のSDKについてはライセンスの関係から自由に配布できないので、TWE-LiteのSDKをインストールします。~~
~~TWE-Liteの中身のチップであるNXP JN5164向けのSDKをチップの開発元のNXPのサイトからダウンロードできます。~~

~~- [JN-SW-4065-JN516x-JenNet-IP-SDK-v979](http://www.nxp.com/documents/other/JN-SW-4065.zip)~~

~~インストーラのデフォルトでインストールしてください。~~

- 2017/9/12追記
モノワイヤレスさんのSDKが新しくなったので、こちらを利用するようにしました。
- 2018/6/15追記
Linux/MacOSXで動作するようにしました。
モノワイヤレスさんのSDKの2018/5版で動作するようにしました。

[TWELITE NET SDKのページ](https://mono-wireless.com/jp/products/TWE-NET/TWESDK.html)から、
[TWELITE NET SDK](https://mono-wireless.com/download/SDK/MWSDK_201805/MWSDK_201805.zip)をCドライブ直下(`C:/MWSDK`)に展開してください。
Linux/MacOSXの場合、それぞれのSDKを`/opt/MWSDK`に展開します。



~~

ArduinoのパッケージのインストールはArduinoのBoardsManager経由で行います。
`[環境設定]` → `[Additional Boards Manager URLs:]` に
<http://soburi.github.io/JN516x-arduino-package/package_soburi_intiki_index.json>
を設定します。

その後、`[ツール]` → `[ボード]`→`[BoardsManager...]` を開いてJN516x Boards をインストールします。
インストールが完了したら、`[ツール]` → `[ボード]` から`Mono Wireless TWE-Lite` を選択します

TWE-Lite Rの接続
---------------------------

TWE-Lite DIP単体ではプログラムのアップロードができないので、TWE-Lite Rに接続して
アップロードを行います。TWE-Lite Rを接続し、[ツール]の[ポート]からTWE-Lite Rに対応する
ポートを選択します。

TWE-Lite R はTWE-Lite DIPに向けて電源を供給していますが、
足の方から電源を出していないので、単体で動作させる場合には下図のように基板上のピンから電源を取り出します。

![TWE-LiteR-VCC_ブレッドボード.png](https://qiita-image-store.s3.amazonaws.com/0/90349/55c91858-ffa0-f575-cd6e-e0bb4ee69f8f.png)

当然、外部から電源供給する場合は必要ありません。
TWE-Lite Rに載っているFT232の供給できる電流は50mA程度の微々たるものなので、あまり無理はできません。



試してみる
-------------

Arduinoの移植なので、当然Arduinoのスケッチがそのまま使えます。
ただ、ピンの名称や配置が異なる場合があるので、その場合は修正が必要です。

### Blink

いわゆるLチカ。 Arduinoでは[スケッチの例]の[01.Basics]に入っています。
ソースコードはそのままで、配線は下図のように。
`LED_BUILTIN`は2番ピンに割り当たっています。

![twe-blink2_bb.png](https://qiita-image-store.s3.amazonaws.com/0/90349/8a013e62-21e9-6bba-f98c-77a59ba41a3b.png)



### Button

入力の一番シンプルなサンプル。[02.Digital]に入っています。
ボタン押している時だけLEDが点灯します。

![twe-button2_bb.png](https://qiita-image-store.s3.amazonaws.com/0/90349/96129d1e-8a83-6d90-eb62-bb5ee2addc34.png)

### attachInterrupt

Buttonのサンプルと同じ回路図を使って、`attachInterrupt()`の
割り込み試します。
TWE-Liteでサポートする割り込みの種別は、割り込みは`RISING`(L→H)か`FALLING`(H→L)の2種類
のみです。`LOW`, `HIGH`, `CHANGING`は`RISING`として扱っています。
以下のサンプルでボタンを押すたびに点灯・消灯が切り替わります。

```
const byte ledPin = 13;
const byte interruptPin = 2;
volatile byte state = LOW;

void setup() {
  pinMode(ledPin, OUTPUT);
  pinMode(interruptPin, INPUT);
  attachInterrupt(interruptPin, blink, FALLING);
}

void loop() {
  digitalWrite(ledPin, state);
}

void blink() {
  state = !state;
}
```

### AnalogInput

アナログ入力(ADC)のサンプル。[03.Analog]に入っています。
半固定抵抗を動かすと入力の電圧が変わって、点滅の周期が変わります。

![twe-analoginput2_bb.png](https://qiita-image-store.s3.amazonaws.com/0/90349/7b7658aa-d5b3-0b4b-827e-2be34b91ffa5.png)


### Fade
アナログ出力(PWM)のサンプル。[01.Basics]にあります。
Lチカではなくて、ゆっくり明滅するサンプルです。
これについては、PWMに割り当てられるピンが異なるので、

```
int ledPin = 9;    // LED connected to digital pin 9
```

を

```
int ledPin = 12;
```

と修正して、配線は以下の図のように。

![twe-fade2_bb.png](https://qiita-image-store.s3.amazonaws.com/0/90349/e6eab7eb-fef2-99cf-745a-2d912b778f52.png)



よくありそうな質問
-------------------------

Q1. ちゃんと動きますか？
A1. 以前よりかなりマシになりましたが、まだまだ人柱募集中です。まだ品質的にアレなんで生暖かく見守っていただけると有難いです。

Q2. ちゃんと動作確認してる？
A2. Windows10ではとりあえず動いてます…

Q2. 無線機能は使えますか？
A2. ContikiOS由来の6LoWPAN(IPv6)が使えます。[続きの記事を参照ください。](http://qiita.com/soburi/items/b07c314d33ef71a10001)
   
Q3. 未実装機能はありますか？
A3. [ArduinoのReferenceページ](https://www.arduino.cc/reference/en/) のAPIは一通り実装されています。

PinOut
------

![TWE-Lite DIP_pinout.svg](https://cdn.rawgit.com/soburi/070a59eda54328948735a4b19997ccbe/raw/9a23fe91c9ffea4906ba3364fbf879f0e9322382/TWE-Lite_pinout.svg)



リソース
----------
<https://github.com/soburi/JN516x-arduino-package> 本記事で紹介したTWE-LiteをArduino化するパッケージのソース
<https://mono-wireless.com/download/SDK/MWSDK_201708-RED/MWSDK_2017-08.zip> モノワイヤレス提供のTWELITE NET SDK
~~<http://www.nxp.com/documents/other/JN-SW-4065.zip> NXPから出ているJN5164(TWE-Liteの中身)のSDK~~
<https://github.com/soburi/jn5164-twelite-guided-tour-resources> 本記事の図に使用した[fritzing](http://fritzing.org)のデータ