Arduino で SORACOM SIM を使ってなるべく安く通信する方法

[追記 2019/09/11]
Wio 3G SORACOM Edition や Wio LTE M1/NB1 といったラインナップも増えて、ますます安くセルラー通信機能付きの Arduino が使えるようになりました。

soracom.jp

soracom.jp

[追記 2019/09/11 おわり]

[追記 2017/10/30, リンク修正 2019/09/11]

SORACOM から Wio LTE JP Versoin が発売されたのでこの記事の内容にしたがって頑張るよりも安く(1万円以下で) Arduino で通信できるようになっちゃいましたね!

soracom.jp

当記事には AT コマンドなど Wio LTE 他のデバイスでも使えたりしそうな情報がまだあると思いますし、Wio LTE では 3G が使えないので SORACOM の Global SIM の LDV を使ったりする場合はまだ当記事の方法で頑張る必要があると思いますのでこのまま残しておきます。

[追記ここまで]


ここで「通信」とは 3G or LTE でのモバイルデータ通信、「なるべく安く」というのは、

の両面で考えていきたいと思います。

といってもランニングコストに関しては、SORACOM SIM を使っている限りはデータ通信量が少なければそんなに高くはならないので、あとは通常の日本向けの SIM を使うか、最近発表された Low Data Volume を使うか、といった感じになると思います。

ということでイニシャルコストの部分ですが、これは概ね、必要なハードウェアを買い揃えるにはいくらかかるか、という問題と等しいと考えて良いでしょう。

Raspberry Pi を使う場合には、Raspberry Pi 本体に USB ドングルを挿せばハードウェア費用はトータルで 1万円〜2万円程度で 3G もしくは LTE で通信できるようになると思います。

しかし Arduino を使う場合は、USB ドングルを単純には使えないので、たとえば 3GIM という製品を使うことになるかと思います。

こちらは便利で使いやすい製品なのですが、お値段のほうもなかなかです。

ハードウェアの部分で悩まずにサクッとプロトタイピングしたいという場合や、本格的な用途で製品化するというような場合は 3GIM は最適な選択肢の一つだと思います。

しかしたとえば予算の制限のある中で少しでも安くプロトタイピングしたいといった要望もあると思います。

そこでなんとかトータルで 1 万円くらいで収まらないかと頑張ってみました。

できればはんだ付けの必要なしに、単純に組み合わせたり接続したりするだけで済ませたかったのですが、どうしてもはんだ付け(しかもとびきり難しいやつ)を回避できませんでしたので、ちょっと一般人向けではなくなってしまいましたが。。。

用意するもの

Arduino M0 ¥3,240(税込み)

Arduino M0

Arduino M0

ハードウェア UART インターフェースを持っていて、なおかつ 3.3V 駆動の Arduino である必要があります。(↓の通信モジュール UC20-G Mini PCIe の UART が 3.3V 駆動なので)
その条件を満たす中で一番安いのが M0 ではないかと思います。

通信モジュール UC20-G Mini PCIe ¥3,980 + 税

https://soracom.jp/products/uc20-g/soracom.jp
Mini PCIe で接続するタイプの通信モジュールです。
ソラコムのコンソールから購入できます。

アンテナ HW-MULTI-GA-RSMA ¥980 + 税

上記モジュールと適合したアンテナです。上記モジュールはこちらのアンテナで技適を取っているのでこのアンテナを使う必要があります。
こちらもソラコムのコンソールから購入できます。

Mini PCIe → USB 変換基板(SIM カードスロット付き) ¥956(税込み)

Arduino は Mini PCIe インターフェースを持っていないので通信モジュールの UART インターフェースを使って通信モジュールを制御したりモバイルデータ通信を行ったりしますが、モジュールへの電源の供給や SIM カードの接続などを考えるとこのような基板を使うと良いと思います。

USB Host Shield ¥2,263(税込)

上記 Mini PCIe → USB 変換基板を Arduino に接続するためのシールドです。単純に USB で電源を供給するだけでは通信モジュールが動作しないようでしたのでこれが必要なようです。

SORACOM Air SIM

SORACOM Air SIMカード(データ通信のみ) (ナノ)

SORACOM Air SIMカード(データ通信のみ) (ナノ)

SORACOM SIM もまだ持っていなければ別途購入する必要があります。Amazon.co.jp で買えば 1,300円ほどです。

データ通信量が少ない方は、Low Data Volume 版を購入すると良いかもしれません。
blog.soracom.jp
こちらはソラコムのコンソールで購入します。(1枚5ドルですが、税と送料を合わせると 12ドルくらいになりますので、初期費用は普通の SIM とそれほど変わらないかもしれません)

(価格はいずれも 2017 年 6 月 1 日現在)

はんだ付けに自信のある方なら、これらを揃えることで Arduino で 3G で通信ができるようになります。
はんだ付けをどうしても回避したいという場合には、USB Host Shield 用のライブラリ*1 に、UC20-G を USB ポート経由で制御できるようになるコードを追加するという方法も考えられます。

ここまでで合計 1 万 2,000 円くらいかと思います。(送料別・消費税は一部別)
Arduino M0(もしくは M0 Pro などの条件を満たすもの) や SORACOM SIM を最初から持っていればその分安くなります。

なお、上記の商品の他に、Arduino を PC に接続したり電源を供給するための USB ケーブルや、ジャンパー線やはんだ付け用の道具一式、もし外で使うならモバイルバッテリーなども必要です。
それらはすでに持っているという場合が多いと思いますのでここでは割愛します。

それから、もし 3G ではなく LTE で通信したければ、UC20-G Mini PCIe の代わりに EC21-J Mini PCIe をご購入ください。あとアンテナももう一本追加する必要があります。合計1,300円ほど高くなりますが、3G の代わりに LTE 対応にできるはずです。

準備(はんだ付け)

さて、モノが揃ったら準備を始めましょう。準備と言っても、メインははんだ付けをすることです。

以下、ちょっと長くなりますが、まず「なぜはんだ付けが必要なのか」を説明します。

Arduino で 3G/LTE 通信モジュールを使おうと思ったら、何らかのインターフェースで Arduino と通信モジュールを接続しなければいけません。
通信モジュールは大抵、USB や UART などのインターフェースを持っています。

今回使おうとしている UC20-G Mini PCIe に搭載されているチップ(UC20-G)の ハードウェアデザイン を見ると、このチップも USB と UART のインターフェースを持っています。

USB インターフェース経由でこのモジュールを使おうと思うと、Arduino の場合は USB Host Shield を用いて接続し、さらにドライバのコードを書かなければいけません。USB Host Shield 用のライブラリには、UC20-G に適合するドライバが標準では含まれていないように思われるためです。(4種類くらい入っているドライバを試しましたが、いずれも動作しませんでした)
ソフトウェアエンジニアとしては UC20-G 用のドライバを書く方向で解決したかったのですが、ドライバを書くための各種情報が少なく、いったん断念しました。

ということで USB インターフェースを使うのは難しそうなので、UART インターフェースを使うことを考えます。

UC20-G の UART インターフェースは、デフォルトでは 115200 bps のボーレートで通信するようです。
一方、Arduino の GPIO ピンを用いて SoftwareSerial で通信しようと思うと、最大通信速度は 115200 bps に対応していない模様です。
AT コマンドを送ればこの設定を変更してもっと低い速度でも通信できるようになるようですが、そもそも接続できなければ設定変更のしようもありません。
他の手段で(たとえば PC などに接続して)AT コマンドを送って UART の速度を変更してから Arduino につなぎ直しても良いのですが、万が一デフォルト値の 115200bps にリセットされてしまった場合などに再度設定し直すという面倒なことをしなければいけなくなります。

それであれば、最初からハードウェア UART インターフェースを搭載していて 115200bps にも問題なく対応できる Arduino を使ったほうが良いだろう、という判断です。

また、UC20-G の UART は 3.3V 駆動なので、いずれにせよ私の持っていた 5V 駆動の Arduino ではレベルシフタなどを使って 3.3V に降圧する必要があります。

ということで、ハードウェア UART インターフェース搭載かつ 3.3V 駆動の Arduino を使い、UC20-G の UART インターフェースに接続することにしました。

あとは、Arduino のハードウェア UART のピンと、UC20-G の UART のピンを接続するだけです。UC20-G のチップは下の図のようなピン配置になっています。
f:id:bearmini:20170601195259p:plain

しかし、実物のモジュールを見ていただくとわかると思うのですが、ピンの露出している部分が非常に小さく、はんだ付けが難しそうに感じました。

一方、Mini PCIe のピン配置は以下のようになっています。
f:id:bearmini:20170601200019p:plain

こちらは Mini PCIe → USB 変換基板のコネクタに嵌合させる部分なのでここにはんだ付けはできません。
したがって Mini PCIe → USB 変換基板のコネクタ側にはんだ付けをすることを考えます。

こちらはピンのピッチが非常に狭く、手作業ではんだ付けするのは至難の業に思われました(実際にとても難しく、何度か挑戦してやっと成功しました)が、万が一失敗して壊してしまうようなことがあっても1,000円程度で買い直すことができるということで多少精神的な障壁が低かったのでこちらにはんだ付けすることにしました。

f:id:bearmini:20170601200404j:plain

決してきれいなはんだ付けではありませんが😅、これでもなんとか動いています。ホットボンドなどで固定&絶縁したほうがよいかもしれません。

すべて組み合わせるとこのような感じになります。

f:id:bearmini:20170601201421j:plain

AT コマンド投入!

さて、これで実際にソフトウェアを動かしてみましょう。

PC で ArduinoIDE を立ち上げて、以下のコードを入力します。

#define UC20UART (Serial1)

void setup() {
  SerialUSB.begin(9600);
  delay(3000);
  SerialUSB.println("Connecting ... ");
  UC20UART.begin(115200);
  while (!UC20UART) {
    ;
  }
  UC20UART.println("AT");

}

void loop() {
  if (UC20UART.available()) {
    SerialUSB.write(UC20UART.read());
  }
  if (SerialUSB.available()) {
    UC20UART.write(SerialUSB.read());
  }
}

これをコンパイルしてアップロードします。
このコードは、PC 側との接続に使っているシリアルポートと、UC20-G との接続に使っているシリアルポートを相互に接続しているようなイメージです。つまり、Arudino IDE の Serial Monitor で入力した文字列は UC20-G に送られ、UC20-G からの応答は Serial Monitor に表示されます。

アップロードが完了したら、Serial Monitor を立ち上げます。

Connecting ...
AT
OK

と表示されていたら成功です!

改行コードを CR+LF を送るように変更し(Both NL & CR を選択)、入力欄から AT コマンドを送るようにしてみましょう。

SORACOM の Global 向けの Plan 01 Low Data Volume の SIM を用いる前提で、以下のようにコマンドを入力すると良いでしょう。

AT+QCFG="roamservice",2,1
AT+COPS=1,2,"44010"2
AT+QICSGP=1,1,"soracom.io","sora","sora",0
AT+QIACT=1

ここまで実行し、すべて OK というレスポンスが返ってきたとすると、コンソール画面上で SIM がオンラインになっているはずです!

f:id:bearmini:20170601203104p:plain

あとは

AT+QIOPEN=1,0,"TCP","harvest.soracom.io",8514
AT+QISEND=0
{"a":1,"b":2}
(Ctrl-z)
AT+QICLOSE=0

とかをスケッチから送信するようにすれば、Harvest にデータを送ることができます。
(Ctrl-z を Serial Monitor から送る方法がわからなかったのでスケッチの中に UC20UART.write(0x1a) と書きました)

Harvest にデータが届いた様子:

f:id:bearmini:20170601203426p:plain

同様に Beam や Funnel も使えそうですね。

AT コマンドのリファレンスは、Quectel のサイトからダウンロードできますので、それぞれどういう意味か確認してみてください。


ということで駆け足になりましたが Arduino で SORACOM SIM をなるべく安く使う方法(ただしはんだ付けができる人に限る)でした!

はんだ付け基礎編

はんだ付け基礎編