最近はSORACOMさんのようにIoTに特化した形でのMVNOさんなんかも出てきていますが、クラウドとの通信手段がWiFiだったり、センサー情報の集約先がRaspberry Piだったりという例が多く、Arduino + 3Gという組み合わせは(本当は王道であるべきだと私は思っているのですが)悲しいかな、ほとんど目にしません。
そこで、こんな組み合わせでIoTできたらいいな、ということで以下は私の妄想ベースのフィクションです。フィクションですので技適うんぬんの話はナシということでよろしくお願いします。
環境
今回は3G通信シールドとして、Vstoneロボットショップさんで取り扱いのあるelecfreaks社の3Gシールドを使ってみます。vstoneさんのホームページにも記載がある通り、「技術基準適合を受けておりません」ことに留意が必要です。価格も手ごろ、ATコマンドでRESTfulなウェブサービスにアクセスでき(httpでも、httpsでも)、SMSの送受信もできる優れものです。
うまく行かない例
さて、前述の3Gシールドを購入してもマニュアルがある訳でなし、elecfreaks社のホームページを見ても、シールドのスペックや回路図は丁寧に説明があるものの、Arduinoに乗っけた時にどうする、という話は皆無なので、ハマる人多数かと思われます。
で、Arduino Unoの上に乗っけます。で、やらないといけないのは添付されたジャンパピンを正しく刺すことです。
左上にD0からD7、TX, RX (書かれていませんがGND)ピンがあるので、PCとつないでいるUnoでは唯一のハードウェアシリアルは使えなくなってもいい(スケッチは送り込んだ、デバッグも終わった)、というのであればRXは0番ピンなので、D0のRXと真ん中のピンをショートするように、D1のTXと真ん中のピンをショートするようにジャンパピンをさします。...というのは説明としては正しいのですが、実際にはPC上でシリアルモニタ見ながら動作確認しないと開発がはかどらないので、ソフトウェアシリアルを使うというのであれば、例えば、D2をRX, D3をTXにして、
#include <SoftwareSerial.h>
SoftwareSerial mySerial(2, 3);
void setup() {
mySerial.begin(4800);
mySerial.println("AT");
}
こんな感じでできそうな気がするのですが、結果はダメ。ボーレート115200bpsから9600bpsくらいまであれこれ試してみても、受信データ(とおそらく送信データも)文字化けが半端ない。応答がこの文字列なら次はこうして、みたいな通信プログラムは見事に動作せず、でした。
うまく行った例
そういう訳で、ここらあたりがソフトウェアシリアルの限界だろう、ということで、Arduino Uno(純正)を使うことをあきらめ、Arduino Megaを使うことにします(以下の写真で使っているのは互換機ですが)。
Serial1はピン19がRX、ピン18がTX、以下Serial2、Serial3がそれぞれ用意されているので、ここではSerial1を使ってみるようにします。まずはMega側の18(TX1)にここでは赤いジャンパワイヤを、19(RX1)には白いジャンパワイヤを刺しておきます。
3Gモジュール側はD0からD7のどこでもよいので、先ほどのジャンパワイヤの先(白いジャンパワイヤはRXなのでRXのどれか、赤いジャンパワイヤはTXなのでTXのどれか)に刺しておきます。
ただ、ジャンパワイヤが干渉して、3GシールドをMegaの上に直接載せられないので、ピンソケットを別途用意して、文字通り底上げを図っておきます(下の写真は反対側から撮るべきでした)。
Unoでは思うように動作しなかったスケッチもMegaでは思った通りに動作しました。
最後に
実際にどんなスケッチで動作させたのか、気になる方も少なくないかと思いますが、そちらはまた別途ということで。