「IoT スターターキット for Arduino」セットアップ時にハマったポイント

### はじめに

こちらは [SORACOM Advent Calendar 2020](https://qiita.com/advent-calendar/2020/soracom) 9 日目の記事です。

このブログでは本日発売の [IoT スターターキット for Arduino](https://soracom.jp/products/kit/iotstarter_kit_for_arduino/) のセットアップ時にハマってしまったポイントを書きます。当初はセットアップからソラコム提供の[サンプルスケッチ(※)](https://dev.soracom.io/jp/start/iotstarter_kit_for_arduino_sample_sketch/)を動かすところまでを解説する予定だったのですが、[セットアップガイド](https://dev.soracom.io/jp/start/iotstarter_kit_for_arduino/) と内容が重複してしまうこともあり、ハマったポイントを重点的にご紹介しようと思った次第です。初歩的なことでつまずいているので公開するのが恥ずかしいのですが、同じポイントでハマる人もいるかと思うので（多分）少しでもそういった方々の参考になれば幸いです。

※ Arduino におけるプログラムのことをスケッチと呼びます。

### IoT スターターキット for Arduino とは

Arduino UNO 互換マイコンとセンサー 10 種がセットになった 「Grove Beginner Kit」 と、Arduino UNO で LTE-M 通信が可能となる拡張ボード 「LTE-M Shield for Arduino」 がワンパッケージになったキットです。

こんな感じです。microUSB ケーブルで PC と接続して給電及びスケッチの書き込みをします。
![Connecting_Devices.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556409/2b176d8c-5075-3b4e-3d2d-0bca3e9659b6.jpeg)

「Grove Beginner Kit」 にはマイコンと同一基板上にセンサーがついていてケーブル接続が不要なため、とても簡単にセンサーデータを取得できます。

### やりたいこと

Grove Beginner Kit 上の温湿度センサーを使用して、部屋の温度・湿度を定期的に SORACOM Harvest Data 上にアップロードします。なお、[SORACOM Harvest Data](https://soracom.jp/services/harvest/) は SORACOM プラットフォームのサービスの 1 つで、IoT デバイスからのデータを保存、可視化できるクラウドストレージです。

上記を実現するためにのサンプルスケッチは[こちら](https://dev.soracom.io/jp/start/iotstarter_kit_for_arduino_sample_sketch#send_temp_and_humi_with_soracom) です。

前述のとおりこのブログではハマったポイントを重点的にご紹介するため、セットアップ手順は所々(というかほとんど)省略しています。セットアップ手順の詳細はソラコムが用意した以下のセットアップガイドを参照ください。

(参考)[IoT スターターキット for Arduino をセットアップする](https://dev.soracom.io/jp/start/iotstarter_kit_for_arduino/)

さて、今回主に以下の 3 つのポイントでつまずきました。

 1. SIM の挿入方向違い
 2. ボーレートの不一致（Arduino 〜 PC間）
 3. ボーレートの不一致（Arduino 〜 モデム間）

コレだけで分かってしまう方も多いと思いますが、特に IoT 初心者の方はハマりやすいポイントなのかなと思います。以下、詳解します。

### 1. SIM の挿入方向違い

まぁ書いているとおりですが（汗）、BG96 が実装されているモジュールに SIM を挿入する方向が間違っていて写真のとおりスロットからはみ出ております。

![Image from iOS.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556409/ffeb6fcf-292f-0881-6471-54328542f452.jpeg)

当然ながらスケッチも想定どおり動作せずしばし時間が経過した後に気がつきました。正しい方向に挿入すると以下のようになります。（こちらもスロットからややはみ出しているのですが汗、合っています。）

![Image from iOS (1).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556409/0b29470e-df11-9021-7550-ce5a467bdfd2.jpeg)

因みに、非常にわかりづらいのですがスロットに挿入する向きが印字されています。下の写真の赤丸部分をご覧ください。スロットの凹みに見えなくもないのですが、確かに SIM の形をしていてこの方向だと奥まで挿した時にカチッと音がします。

![Image from iOS (3).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556409/0707cdfb-1370-5041-6913-98bb194a5b74.jpeg)

### 2. ボーレートの不一致（Arduino 〜 PC間）

さて、2 つ目です。スケッチを実行した際に以下のように文字化けをしてしまいました。

![スクリーンショット 2020-12-09 1.38.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556409/1d74e0c1-53b1-d3a1-6473-04db3e394e0a.png)

原因は上記のとおりで、Arduino 側のボーレートと PC 側のボーレートの不一致が原因です。ボーレート (baudrate) とはシリアル通信のデータ転送速度です。例えば、ボーレートが 9600bps の場合はシリアルポートが 1 秒に 9600 ビットを送信することを意味します。そして、ボーレートは送信側と受信側で一致させる必要があり、そうでない場合は上記のように文字化けしてしまうのです。

今回は Arduino 側(写真上)が 115,200bps で PC 側(写真下)が 9,600bps だったため、文字化けが発生していました。

![スクリーンショット 2020-12-09 1.43.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556409/3c9189dc-299b-eece-eb48-3532faa75985.png)

![スクリーンショット 2020-12-09 1.43.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556409/76d8ec18-4ff9-fd31-d81b-5d8f06f398d0.png)

文字化けというと文字コードを疑ってしまいがちですが、シリアル通信においてはボーレートをまずは疑うべきだということが今回分かりました。

### 3. ボーレートの不一致（Arduino 〜 モデム間）

3 つめのハマりポイントもまさかのボーレートの不一致です。。。上記でボーレートでハマっているにも関わらず、ここでもハマってしまいました。ただ、事象としては文字化けではなく AT コマンドが実行できないというものでした。

さて、この先の説明にうつる前に「AT コマンド」とはなんぞや？何故 AT コマンドを実行する必要があったのか？というところからお話しできればと思います。
まず AT コマンドについてですが、これはざっくり言うとモデムの制御や設定変更などができるコマンドです。コマンドの文字列が、 “AT” で始まるので日本語ではよく「AT(エーティー) コマンド」と呼ばれています。AT コマンドについての詳細を知りたい方は以下のブログを参照してください。

(参考)[やさしさあふれるATコマンド入門](https://qiita.com/kazntree/items/b2bc92508b789a47506f)
(参考)[SORACOM を使って学ぶ AT コマンド - 1.入門編](https://bearmini.hatenablog.com/entry/at-command1)

では何故僕が AT コマンドを実行したかというと、前述の SIM の挿入方向を誤った際にモデム上から SIM が認識できているかどうかを確認するために実行しました。`AT+CIMI` という AT コマンドを実行するとモデムが SIM を認識している場合は SIM の IMSI(回線の識別番号)が返されます。

なお、モデムに対してシリアルコンソール上から AT コマンドを実行した際のスケッチは以下です。


```c
/* BG96 */
#define CONSOLE Serial

/* for LTE-M Shield for Arduino */
#define RX 10
#define TX 11
#define BAUDRATE 9600
#include <SoftwareSerial.h>
SoftwareSerial MODEM(RX, TX);

void setup() {
  CONSOLE.begin(115200);
  CONSOLE.println();
  CONSOLE.println(F("Welcome to Serial bridge"));
  MODEM.begin(BAUDRATE);
  MODEM.write("ATE1"); // echo back ON
  MODEM.write(0x0d);   // and send CR
  CONSOLE.println(F(">> Waiting for your AT command"));
}
void loop() {
  while (MODEM.available()) CONSOLE.write(MODEM.read());
  while (CONSOLE.available()) MODEM.write(CONSOLE.read());
}
```

ところが、 `AT+CIMI` を実行しようとすると、何故か `AT+` の部分のみが実行されて `CIMI` の部分が欠落してしまいました。

![スクリーンショット 2020-12-09 2.10.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556409/d55d5512-e42b-bd03-74fb-4eb6313aa095.png)

これも Arduino 側(PC→Arduino)が 115,200bps で モデムに設定している値が 9,600bps だったため、AT コマンドがモデムに届いてないことが原因でした。

![スクリーンショット 2020-12-09 2.23.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556409/164cf59a-f01b-163e-2ae8-c0480d1f5c66.png)

上記のスケッチの `CONSOLE.begin(115200);` を `CONSOLE.begin(9600);` にして、シリアルコンソール側も同様に 9600 に変更したところ、無事 AT コマンドが実行できました。

修正後のスケッチ

```c
/* BG96 */
#define CONSOLE Serial

/* for LTE-M Shield for Arduino */
#define RX 10
#define TX 11
#define BAUDRATE 9600
#include <SoftwareSerial.h>
SoftwareSerial MODEM(RX, TX);

void setup() {
  CONSOLE.begin(9600);
  CONSOLE.println();
  CONSOLE.println(F("Welcome to Serial bridge"));
  MODEM.begin(BAUDRATE);
  MODEM.write("ATE1"); // echo back ON
  MODEM.write(0x0d);   // and send CR
  CONSOLE.println(F(">> Waiting for your AT command"));
}
void loop() {
  while (MODEM.available()) CONSOLE.write(MODEM.read());
  while (CONSOLE.available()) MODEM.write(CONSOLE.read());
}
```


![スクリーンショット 2020-12-09 8.59.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556409/9309ddd4-96cb-7d98-9e02-f76824a3cd46.png)


因みに、今回実行したサンプルスケッチの LTE-M も入れた通信速度の関係は以下です。

PC <--(115,200bps)--> Arduino <--(9,600bps)--> BG96 <--(最大 375,000bps)--> LTE-M

LTE-M 通信自体はスペック的には 375Kbps 出ることになっているのですが、マイコン側にボトルネックがあることが分かります。(マイコンを使用する場合は 115Kbps でもデータの取りこぼしが発生する可能性がある。)

### 最後に

セットアップ時にハマったポイントをご説明してきましたが、逆に上記以外はスムーズにセットアップできました。ほとんど手順を説明していないのでアレですが、一応サンプルスケッチ（部屋の温湿度を SORACOM Harvest Data に上げる）の実行結果を貼っておきます。

![スクリーンショット 2020-12-09 2.32.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556409/20ddc8cd-9719-ee01-f1b7-145035caec88.png)

この他にも様々なサンプルスケッチがあるので、是非これらを活用して遊んでみてください！