LTE-M Shield for Arduinoを使用してArduino UNO R4 Minimaでセルラー通信を行う方法

みなさん、こんにちは！株式会社ソラコムのayumuです。
Arduino UNOの最新モデルであるArduino UNO R4 Minimaに、[LTE-M Shield for Arduino](https://soracom.jp/store/5303/)を組み合わせて通信機能を拡張させることを試してみました。今回は、その具体的な方法について紹介していきます。
また、その通信機能を利用したデモとしてArduino側からデバイス稼働時間をSORACOM Harvest Dataへ送信し、パソコンなどのブラウザ上で確認できるようにしてみました。様々な開発の参考に、ぜひこちらもご覧ください！

<br>

# LTE-M Shield for Arduino とは？
Arduino UNO等と組み合わせることで、LTE-M通信機能を提供してくれるシールド（拡張ボード）です。セルラーLPWAに対応したQuectel社製通信モジュールBG96が搭載されており、NB-IoT Shield QG96をソラコム向けにカスタマイズしています。通信機能を扱ったプロトタイピングにオススメです。
Arduino UNOの最新モデルであるArduino UNO R4 Minimaでは、ボード側の仕様変更によりそのままの状態で使用することは出来ませんが、以下で紹介する手順によってLTE-M Shield for Arduinoを用いたセルラー通信を実現することが出来ます。
![48181499-F979-4D10-A31F-46BD9B0D6E9B.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3526878/24d763dd-9673-c2bf-483f-df97b013efeb.png)

<br>

# 今回必要となるもの一覧
- LTE-M Shield for Arduino
- Arduino UNO R4 Minima
- パソコン　　※私はMacBook Proを利用しました
- Arduino（Type-C）とパソコンを繋ぐケーブル
- ジャンパー線（オス-メス）1本

<br>

# Arduino UNO R4 Minimaに通信機能を拡張させる方法
それでは、具体的な手順を紹介していきます。

## 1. Arduino UNO R4 MinimaとLTE-M Shieldを組み合わせる
#### 1.1. SIMをQuectel BG96モジュール搭載基板に挿し込みます。
![6F75B355-3FC9-4DFC-B7B4-6A3601B4D572.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3526878/c1ef8ead-00fd-d2e0-e308-cfbc2c1addf8.jpeg)

#### 1.2. アンテナを取り付けます。
![C32C03F4-F105-4CAF-A8AD-068EE6897000.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3526878/3362ab88-2c10-9ca3-9e36-d2f07fe6c79e.jpeg)

#### 1.3. Quectel BG96モジュール搭載基板をLTE-M Shield for Arduinoに取り付けます。
![48CE9303-FD4E-4DEC-98C8-8239E87B1481.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3526878/4380b050-45e8-a543-a849-433af4d3e9db.jpeg)

#### 1.4. LTE-M Shield for ArduinoをArduino UNO R4 Minimaに取り付けます。
![08BFB802-16DD-4C59-97C7-5349306251E4_1_201_a.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3526878/f97ac090-a9cb-3a1c-14ee-4082ef3a642f.jpeg)

#### 1.5. Arduino UNO R4 Minimaをパソコンに接続します。
USB/Type-Cケーブルなどを利用してください。

<br>

## 2. パソコン側で開発環境を準備する
#### 2.1. CP2102 USB Driverをパソコンにインストールします。

> ただし以下の場合では、CP2102 USB Driverのインストールは必要ありません。この手順はスキップしてください。
> - macOS Big Sur以降を利用している場合
> - LTE-M Shield for Arduino単体を利用している場合

Arduino IDEで開発したスケッチを書き込む際に必要なドライバーです。
[CP210x USB to UART Bridge VCP Drivers](https://www.silabs.com/developers/usb-to-uart-bridge-vcp-drivers?tab=downloads)を開き、利用しているOSに対応したUSBドライバーをダウンロード、インストールしてください。
![8D87CAC2-0FB8-4CE7-AFCD-D9A27212B03D.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3526878/568036cb-eaf7-c4c0-863f-d0c1f4e29cec.png)

#### 2.2. Arduino IDE2をパソコンにインストールします。
Arduino IDEを利用します。インストール方法について詳しくは、[Downloading and installing the Arduino IDE 2](https://docs.arduino.cc/software/ide-v2/tutorials/getting-started/ide-v2-downloading-and-installing)（公式）や [Arduino IDE 2 をインストールする](https://users.soracom.io/ja-jp/tools/arduino-library-for-lorawan-device/setup-ide/)（SORACOM Users）をご参照ください。

#### 2.3. ボードマネージャから[Arduino UNO R4 Boards]をインストールします。
Arduino IDEを開き、ボードマネージャで[Arduino UNO R4 Boards]と検索します。最新バージョンをインストールしてください。
![447E9EA1-A195-4B67-82BC-2F212C7950C5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3526878/badf2ce1-a912-294c-5080-1ae99e2a6d96.png)

#### 2.4. ボードを選択します。
Arduino IDEで、[ツール]→[ボード]→[Arduino UNO R4 Boards]→[Arduino UNO R4 Minima]の順に選択します。
![4BC61ECF-40BE-4D1F-AD82-03869BBAED97.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3526878/69c6368f-f615-1453-e3e2-1378943100fe.png)

#### 2.5. ポートを選択します。
私が利用している環境（MacBook Pro）では、[ツール]→[ポート]→[/dev/cu.usbmodem***(Arduino UNO R4 Minima)]の順に選択しました。
![147368C7-81A3-49E4-A448-CCDA67BD29A8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3526878/5020b131-807a-8c76-705f-e072511a2aee.png)

> - Windowsの場合
> [マイコンピュータ]を開き、[プロパティ]→[ハードウェア]→[デバイスマネージャ]の順に辿っていってください。そこでArduinoに対応したポートを確認した後、Arduino IDEで、[ツール]→[ポート]→[*確認したポート]の順に選択してください。

#### 2.6. 開発に必要なライブラリ[TinyGSM]をインストールします。
ライブラリマネージャーで[TinyGSM]と検索し、最新バージョンをインストールしてください。
![FE251FB4-DFB6-40FC-AE19-D3C0A9BD0BFE.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3526878/a13b21cf-59ca-7de4-109e-f2df83e010ff.png)

<br>

## 3. LTE-M Shield for Arduinoの初期設定と接続確認を行う
#### 3.1. ジャンパー線を繋ぎ、D3ピンをRXに指定します。
ジャンパー線（オス-メス）を1本用意してください。
![FCC4236D-2855-4EC3-B075-920D5B561E66.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3526878/7d36409e-606f-73f3-1480-c6dc868104d0.jpeg)
以下の写真を参考に、ジャンパー線を繋いでください。
![上部のコピー.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3526878/e3167aaa-7a4f-cb5b-ef10-b2d0643d5500.jpeg)
![1076DBC4-A7DA-448E-9E06-B4C0CE2A51BF.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3526878/33d1a988-af83-0976-d129-0d1f4a71f963.jpeg)
![IMG_4991.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3526878/d3d1b216-d0e5-e2ad-11c2-76241a49fbf2.jpeg)
> D3以外のピンをRXに指定することも出来ます。RXピンの指定について、詳しくは下記【補足】欄をご確認ください。

#### 3.2. LTE-M Shield for Arduinoの電源をONにします。
シールド基板裏面の刻印と下図を参考に、「電源 ON」の状態にしてください。
![5833B584-543A-4076-86D8-B49D0AC77A5B.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3526878/96260c7c-9ea1-923e-1e11-0c6568815850.png)

#### 3.3. 初期設定・接続確認用スケッチを開きます。
初期設定・接続確認用スケッチ（[connectivity_diagnostics_for_lte_m_shield.ino](https://github.com/soracom-labs/arduino-dragino-unified/blob/main/connectivity_diagnostics_for_lte_m_shield/connectivity_diagnostics_for_lte_m_shield.ino)）をコピーし、Arduino IDEに貼り付けます。

#### 3.4. スケッチの一部を書き換えます。
4箇所に変更点があります。
① スケッチ11行目
```diff_c
- #define BG96_RX 10
+ #define BG96_RX 3
```

②③ スケッチ124行目と146行目
```diff_c
- if (strlen(buf) <= 0) return;
+ if (strlen(buf) <= 0) return -1;
```

④ スケッチ190行目
```diff_c
+ delay(5000);
```

#### 3.5. 編集したスケッチをコンパイルして、Arduino UNO R4 Minimaに書き込みます。
    
#### 3.6. シリアルモニタで接続結果を確認します。
書き込みが完了したら、Arduino IDEの右上にあるシリアルモニタボタンをクリックし、シリアルモニタを開きます。
> シリアルモニタは以下の設定とします。
> - ボーレート: 9600 bps
> - 改行コード: CR および LF
> ※「自動スクロール」「タイムスタンプを表示」は、お好みで有効化してください。

以下のような結果が表示されれば、成功です！無事、LTE-M Shield for ArduinoとArduino UNO R4 Minimaを組み合わせることが出来ています。
![C920A1F1-96B0-4EC1-88DD-99D2488203DF.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3526878/e566321c-cdb1-a4c7-acf7-d5512655ce8d.png)

> エラーが表示される場合は、以下のことをもう一度確認してみてください。
> - LTE-M Shieldのジャンパー線が適切に繋がれているか
> - LTE-M ShieldのスイッチがONになっているか
> - LTE-M ShieldとArduino UNO R4 Minimaが正しく接続されているか
> - SIMカードの挿入状態やSIMカード自体に異常はないか
> - [TinyGSM]ライブラリが最新のバージョンであるか
> - アンテナが正しく取り付けられ、通信可能な環境に設置されているか
> 
> また上記事項を確認した後、スケッチを再度実行する前に**LTE-M Shield for Arduinoの電源を入れ直してリセットする**ことを推奨します。

<br>

# 通信機能を利用したデモ
最後にデモとして、Arduino側からデバイス稼働時間をSORACOM Harvest Dataへ送信し、パソコンなどのブラウザ上でそのデータを確認してみます。

#### 1. SORACOMユーザーコンソールでSIMグループを作成します。
[グループを作成する](https://users.soracom.io/ja-jp/docs/group-configuration/create-group/)を参考に、SORACOMユーザーコンソール上で作業を進めてください。

#### 2. SIMカードを、SIMグループに所属させます。
今回利用しているSIMカードを、先ほど作成したSIMグループに所属させます。
[IoT SIM、LoRaWAN デバイス、Sigfox デバイスが所属するグループを切り替える](https://users.soracom.io/ja-jp/docs/group-configuration/set-group/)を参考に、SORACOMユーザーコンソール上で作業を進めてください。

#### 3. SORACOM Harvest Dataを有効化します。
SIMカードを所属させたグループのSORACOM Harvest Data機能を有効化します。
[SORACOM Harvest Data を有効化する](https://users.soracom.io/ja-jp/docs/harvest/enable-data/)を参考に、SORACOMユーザーコンソール上で作業を進めてください。

#### 4. Arduino IDEを起動し、稼働時間送信用スケッチを開きます。
Arduino IDEを開きます。稼働時間送信用スケッチ（[send_uptime_with_soracom.ino](https://raw.githubusercontent.com/soracom-labs/arduino-dragino-unified/main/send_uptime_with_soracom/send_uptime_with_soracom.ino)）をコピーし、Arduino IDEに貼り付けます。

#### 5. スケッチの一部を書き換えます。
3箇所に変更点があります。
① スケッチ18行目
```diff_c
- #define BG96_RX 10
+ #define BG96_RX 3
```

② スケッチ33行目
```diff_c
-     asm volatile ("  jmp 0");
+     // asm volatile ("  jmp 0");
```

③ スケッチ38行目
```diff_c
+ delay(5000);
```

#### 6. 編集したスケッチをコンパイルして、Arduino UNO R4 Minimaに書き込みます。

#### 7. SORACOM Harvest上で、送信されたデータを確認します。
SORACOMユーザーコンソールの[SORACOM Harvest Data]を開き、以下のような結果が表示されていれば成功です！
![B9473772-76B0-4E8E-9CB0-A9AD0FFCD4BD.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3526878/2599bf3e-111a-4001-6c20-0abe48264852.png)

<br>

# 【補足】Arduino UNO R4 MinimaでRXに指定できるピン
手順3.1.で設定したRXについて補足します。

最新モデルArduino UNO R4 Minimaでは、新機能が追加されたり、従来モデルR3から変更が加えられたりしました。そして、そのアップデートの1つに**RXの仕様変更**があります。
[GitHub: ArduinoCore-renesas](https://github.com/arduino/ArduinoCore-renesas/blob/a086f96acef69189224f84eafce160acff6b01c4/libraries/SoftwareSerial/examples/SerialEcho/SerialEcho.ino#L3-L5) を参照したところ、以下のような記述がありました。
> // Note any pin can be used for TX, but only the following pins
> // can be used for RX:
> // D0, D1, D2, D3, D8, D14, D15, A1, A2, A3, A4, A5

つまり、R4では
**D0, D1, D2, D3, D8, A0(D14), A1(D15), A2(D16), A3(D17), A4(D18), A5(D19)**
のみがRXピンとして指定できるみたいです。

私も実際に手元にあるデバイスでこのことを確認してみましたが、やはりRXに指定できるピンは限定されているようです。
ただし、私の検証では
**D12, D13**
もRXピンに指定でき、逆に
**A0(D14)**
はRXピンに指定できなかったです。

また、どのピンをRXに指定するかによってパフォーマンス（エラーの発生頻度）が異なることも検証から分かりました。LTE-M Shield for ArduinoとArduino UNO R4 Minimaを組み合わせる場合では、D3（またはA5）ピンをRXに指定すると正常に動作しますが、それ以外のピンを指定した際はエラーが発生することがありました。
※ピンによりパフォーマンスが異なることに関しては、各デバイスで個体差があるかもしれません。

<br>

# 終わりに
今回は、LTE-M Shield for Arduinoを組み合わせ、Arduino UNO R4 Minimaに通信機能を拡張させる方法について紹介してきました。
最新モデルArduino UNO R4 Minimaが通信機能を持つことで、IoT分野における開発がさらに進んでいくことを願っています。みなさん、ぜひお試しください！