読者です 読者をやめる 読者になる 読者になる

Gurunavi Engineers' Life

ぐるなび公式のエンジニアブログです。技術情報やぐるなびエンジニアの日常について発信します。

3Gシールド+SORACOM AirでSMS送信する[ぐるなびIoT部] 

組織開発

こんにちはこんにちは

ぐるなびIoT部 部長の長谷川です。

自分は新潟県出身なのですが、実は新潟は隠れたラーメン王国と呼ばれておりまして、大きく分けると下記の3つに分類されます。

  • 背脂こってり系
  • 生姜醤油系
  • カレーラーメン

3つのうちカレーラーメンは最近のB級グルメブームで紹介されたりしてご存知の方もおられるかと思いますが、背脂こってり・生姜醤油の方が歴史が長く、有名な店舗も多いです。

そんな新潟ラーメンの数ある名店の中の一つ、青島食堂は都内に支店を構えております。

本場新潟の生姜醤油が堪能できますので、秋葉原に行かれる際は是非一度立ち寄ってみてください(行列だけど)。

ぐるなびIoT部について

 さて、ここからが本題となります。弊社では社員同士のコミュニケーション活性化のための部活動が奨励されています。

 我が部もIoTに興味があるエンジニアが「業務時間外で集まって何かしようぜ」という趣旨で2015年の暮に設立した若い部活。総勢で21名が在籍しています(2016年4月現在)。

手の届かなかったパーツが部費で買える

 IoTをやるとなると細かい部品をいくつも買う必要があるんですが、厳しいお小遣い制を敷かれている自分のような既婚サラリーマンだと好きなパーツをホイホイと買うことができません。

 でも部活動として公認を受けると、なんと会社から部費が出るのでパーツが好き放題買えるという素晴らしいメリットがあります(もちろん予算の範囲内で)。

ちなみにこれまでに部費で購入したパーツは下記となります。

  • Raspberry Pi 2 x 10
  • Raspberry Pi スターターキット x 5
  • Arduino Uno 3G Shiled x 1
  • MESHタグ全8種 x 1
  • その他ブレッドボード、配線類

月に1〜2回もくもくと活動

 月に1~2度定時後に、各自が気になるIoT機器を持って集合。全体で目標を決めるというよりは、好きなことをもくもくとやるスタイルを採用しています。

 Linuxを初めて触る新卒エンジニアも多く、Raspberry PiのRaspbianはLinux OSを覚えるのにも役立っています。自分も部長を名乗っていますが、IoTに関してはほとんど素人レベルなので、部活の時間を使って勉強に励んでおります^^;

Arduino Uno + 3Gシールド + SORACOM Air SIMでSMSを飛ばす

 私は主にArduino Unoを使っていて、SORACOMのSIMが登場した時に真っ先に飛びついた口なんですが、Arduinoで3G通信をやろうにもボードが1万円以上するため高くて今まで手が出せずにいました。IoT部が設立してからは部費で3Gモジュールが購入できたので、早速手に入れてSMSを送信する実験を行ってみました。

3Gシールドを選ぶ

 Raspberry Piで3G回線を使う場合、docomoのUSBドングルを使うのがメジャーなやり方ですが、Arduinoでは確立された方法がなさそうです。

2016年4月現在、国内で手に入るのはこの二つくらいでしょうか。

3Gシールド for Arduino Ver1.2

3Gシールド 〈 Arduino関連 〉

 TABRAINの方は技適通過してるので国内で公式に使えますが、部費で購入できる金額ではないですね。。。なので今回はSIM5216シールドを試してみます。

※技適未通過ですので会社に事前に相談して機器に影響がないよう会議室で実験しています

SIM5216E拡張3Gシールドは2大IoTハードウエア対応

f:id:tonton_chin:20160418131214j:plain:w640

 SIM5216E拡張シールドはSIM5216モジュールをArduino専用シールドに搭載したもの。HSDPA/WCDMA/GSM/GPRS/EDG通信が可能です。Arduino専用ですが後述のやり方でRaspberry Piでも使えるようになりますので、とりあえずこれを買っておけば2大IoTハードウエアで3G通信ができます。

※ただし技適未通過ですので検証用としての用途がメインとなります。

  ちなみにこちら、購入時点でシールドにコネクタが取り付けられていないので、ご自身でハンダ付けする必要があります。Arduino Interfaceのところにピンを刺してハンダ付けしてください。

f:id:tonton_chin:20160418125312j:plain:w640

http://www.elecfreaks.com/wiki/index.php?title=3G_shield

Arduino Unoで3Gシールドを試す

 ハンダ付けが完了したら3Gシールドに早速SORACOMのSIMを刺しましょう。

f:id:hasegawa-ma:20160409220232j:plain:w640

SIMを刺したらArduino Unoに取り付けます。 f:id:hasegawa-ma:20160409220629j:plain:w640

 Arduino Unoの通常電圧は5Vですが、3G Shiledの推奨電圧は9Vとなっているため、9V電圧が供給できるアダプターを購入する必要があります。アダプタは新品で1000~2000円程度、ハードオフで探すと500円程度で入手できます。

オーム電機 OHM AV-DSW9 汎用電源アダプター スイッチング式 出力9V

 5V電源で試したところ、PWRランプは点くのですがNETランプが点かず、3Gに接続できませんでした。9V電源をArduino Unoに挿入し、PWRランプを長押しすると10秒程度でNETランプが点滅し、3Gネットワークが使用可能になります。

f:id:hasegawa-ma:20160409221840j:plain:w640

 あとはPCとArduino UnoをUSBで接続し、スケッチを流し込みます。

int8_t SendATCommand(char *ATcommand,char *expected_answer,unsigned int timeout)
{
  uint8_t x=0,answer=0;
  char response[200];
  unsigned long previous;
  memset(response,'\0',sizeof(response));
  delay(100);
  while(Serial.available() > 0) Serial.read();
  Serial.println(ATcommand);
  x=0;
  previous = millis();
  do
  {
    if(Serial.available() != 0)
    {
      response[x] = Serial.read();
      x++;
      if(strstr(response,expected_answer) != NULL)
      {
        answer = 1;
      }
    }
  }while((answer == 0)&&((millis() - previous) < timeout));
  return answer;
}

int8_t answer;
char aux_str[30];
char phone_number[] = "自分の携帯電話番号";

void setup()
{
  Serial.begin(9600);
  Serial.println("Starting.....");
  delay(3000);
  Serial.println("Connecting to the network...");
  while(SendATCommand("AT+CREG?","+CREG: 0,1",500) ||
        SendATCommand("AT+CREG?","+CREG: 0,5",500));
  Serial.println("Seting SMS mode....");
  SendATCommand("AT+CMGS=?","OK",3000);
  Serial.println("Sending SMS");
  sprintf(aux_str,"AT+CMGS=\"%s\"",phone_number);
  SendATCommand(aux_str,">",2000);
  Serial.println("Message from Arduino Uno Yeah!!!");
  Serial.write(0x1A);
}

void loop()
{
}

 これでSMSが指定した携帯の番号に届けば成功です。しかしArduino Unoのソフトウェアシリアルではハードウェアのスペック不足のため、プログラム上は成功しててもSMSが送信できません。 なので、スケッチを流し込んだ後にハードウェアシリアル用PINを刺します。 f:id:tonton_chin:20160418125912j:plain:w640

ハードウェアシリアルPINを刺したところ

 ハードウェアシリアルを使うとArduinoのスケッチエディタに下記のエラーが表示されますが無視します。

f:id:hasegawa-ma:20160409224346p:plain:W640

 再コンパイルしてSMSを送信すると・・・

f:id:hasegawa-ma:20160409224407p:plain:w640

f:id:tonton_chin:20160418131342p:plain:W640

届いたよ!

画像はWindows Phone 10のSMS受信画面ですが、iPhoneでもAndroidでも届きます。

3GシールドをWindowsで試す

 実はこの3Gシールド、基板上にマイクロUSBポートがついていてUSB経由で3Gモデムとしても使えるというスグレモノ。ですのでWindowsから直接COMポートに接続してSMSを送信することができます。

 まずはUSBポート経由でWindowsと接続します。

f:id:tonton_chin:20160418131401j:plain:w640

ドライバが必要になりますので、ここから落としてインストール。正常にドライバがインストールされるとデバイスマネージャに登録されます。

f:id:hasegawa-ma:20160409224143p:plain:w640

 ほかのデバイスのところにSimTech SIM5216が表示されていますが、こちらは無視しても問題ありませんでした。ドライバがインストールされたら、あとはTeraTermのCOMポートに接続可能な端末エミュレータを起動して接続します。

f:id:hasegawa-ma:20160409224526p:plain:w640

 TeraTermでCOMポートに接続する場合、ローカルエコーのチェックボックスをONにしておかないと自分の入力がエコーバックされませんので必ずチェックを入れておきましょう。

f:id:hasegawa-ma:20160409224701p:plain:w640

 接続に成功したら、ATコマンドでモデムに直接SMS送信コマンドを入力します。まずはATでモデムが認識されていることを確認。

at
OK

 次にat+creg?でネットワーク登録を行います。

at+creg?
+CREG: 0,1 <- 戻り値に1が入ってればOK

 cmgf=1で、テキストモードでSMS送信を行うことを機器に伝えます。ちなみにデフォルトは0で、0の場合はバイナリモードになります。

at+cmgf=1
OK

あとはat+cmgsで送信先を指定し、メッセージを送信します。

at+cmgs="送信先の携帯電話番号"
> 入力待ちになるので、送信したい好きなメッセージを入力

 入力が完了したらCtrl+Zで終端コードをモデムに伝えます。at+cmgf=1にしておかないと終端コードを認識してくれないので要注意です。

f:id:hasegawa-ma:20160409225816p:plain:w640

OKが返ってくるとSMS送信成功です。

携帯の画面を見ると・・・

f:id:tonton_chin:20160418131446p:plain:w640

キタ━━━━(゚∀゚)━━━━!!

Raspberry Piで3Gシールドを試す

 さて、ここまで来ればもうこちらのもの。Raspbianは中身は普通のLinuxですのでUSBモデムを使った3Gネットワークに対応しています。USBモデムをRaspberry Piに接続し、dmesgで認識されていることをチェック。

$:/etc$ dmesg
generic-usb XXXX:XXXX:XXXX.XXXX: hiddev96,hidraw2: USB HID v1.10 Device
[SimTech, Incorporated SimTech SIM5216] on usb-0000:00:1d.1-1/input0

lstabを実行し、デバイスIDとプロダクトIDを確認します。

$:/etc$ lsusb
Bus 00X Device 00X: ID 1234:5678 Qualcomm, Inc. 

lstabで確認したIDの左がベンダー、右がプロダクトIDとなり、それぞれ0xを先頭に付与したものを/etc/mdulesに追記します。

$ vi /etc/modules

usbserial vendor=0x1234 product=0x5678

 ここで一度マシンを再起動。

$ reboot

 再起動したら、ATコマンドを入力するためにcutecomをインストールします。

$ apt-get install cutecom

dmesgを実行し、接続先のデバイスを確認します。

f:id:hasegawa-ma:20160409232221j:plain:w640

cutecomを起動し、USBモデムに接続します。

# cutecom

f:id:hasegawa-ma:20160409232631j:plain:w640

 Arduino Uno + 3G Shiledはキャリッジリターンが「crlf」なので、改行コードを変更しておきます。接続先に「先ほどdmesgで確認したデバイス名を入力し、「open device」をクリックしてデバイスと接続します。

f:id:hasegawa-ma:20160409232431j:plain:w640

 接続できたらあとはWindowsの時と同様にATコマンドを入力していきます。

 Raspberryの場合はCtrl+Zによる終了コードが認識されないので、終了コードを入力する際は入力タイプを「Hex input」に変更した後、「0x1A1D0D」を入力して完了させます。

f:id:hasegawa-ma:20160409233004j:plain:w640

 OKが返ってきたら成功です!あとはClose deviceを押して、USBモデムとの接続を切りましょう。

f:id:hasegawa-ma:20160420123459j:plain:w640

さて、携帯電話を見てみると・・・

f:id:tonton_chin:20160418131530p:plain:W640

スペルミスしたSMSキタ━━━━(゚∀゚)━━━━!!

まとめ

 この方法だと比較的安く3G回線を試すことができますが、技適を通ってないためあくまで実験導入となります。 格安でSIMモジュールをご提供いただける業者をぐるなびIoT部は心よりお待ち申し上げております。

参考URL

ElecFreaks - Wiki

jeanbritz/ArduinoTestScripts: Test scripts for Arduino Uno

3G_modem_tutorial