Arduino+SoracomでIoT(1/3)

Table of Content

ArduinoとSoracomを使ってセンサデータをクラウドに保存

センサーからの信号を遠隔からモニタリングするために、ArduinoSoracomのSIMカードを使ってIoTを構築しました。データのストレージには無料で使用できるAT&Tが提供しているM2Xを使用しました。


本記事の内容

  • 準備するもの
  • 3GIMのセットアップ
  • Soracomのセットアップ(本記事はここまで)
  • M2Xのセットアップ
  • Arduinoのコード

準備するもの

工具類

  • はんだごて
  • ドライバー

3GIM+アンテナが高価なので、何か代替品がないかは今後期待したいです。


3GIMのセットアップ

Arduino本体の接続やArduino IDEのインストールは完了していることを前提とします。

参考にした資料

  1. 3GIMシールド取扱説明書
  2. 3GIM利用マニュアル
  3. 3Gシールド&3GIM利用のための電源供給について

3GIMとArduino本体を接続するために、3GIMシールドを使用しました。接続用ピンの3GIM側の部分ははんだで固定しましょう。はんだをしないと接触が不十分で3GIMが起動しません。下は、3GIMと3GIMシールド、3GIMシールドとArduino本体を接続した写真です。

電源供給ですが、参考にした資料3(P6)に記載がある通り、USB接続では3GIMの電波状態により電流が足りずに通信できない場合があるとのこと。
そこで今回はVinピン経由の外部電源により供給する方法としました。なお今回の例ではUSB接続でも通信ができることを確認しています。
外部電源供給では、DC7~12Vが必要とのことですが、実際はDC5Vでも可能でした。(AC100V -> DC24V -> DC5Vに変換して供給しました。)



Soracomのセットアップ

Soracomの設定については色々とサイトがありますので、そちらを参考にしてみてください。
第52回 SORACOM Airを使ってArduinoで通信できる?
SORACOM Airの利用方法

Soracomの設定が完了したら、Arduino IDEから次のコードを検証・コンパイルして、Soracomによる通信がうまくいっているかどうかを確認してください。

#include <SoftwareSerial.h>
SoftwareSerial Serial1(4, 5);
const unsigned long baudrate = 9600;
String str;
uint32_t stime = millis();

boolean gim_com(String st) {
  Serial1.println(st);
  uint32_t tim = millis();
  do {
    str =  Serial1.readStringUntil('\n');
    if ( str.indexOf("$PS=NG") == 0 ) {
      Serial1.println(st);  tim = millis();
    } else if ( str.indexOf("$YT=NG") == 0 ) {
      Serial1.println(st); tim = millis();
    }
    //Serial.println(str);
    // Serial.println(str);
  } while (str.indexOf("OK") < 0 && millis() - tim < 25000 );
  if (str.indexOf("OK") < 0) return false;
  Serial.println(str);
  if (str.indexOf("WG") > 0) {
    int ln = str.substring(7).toInt();
    int i = 0;
    do {
      while (!Serial1.available());
      Serial.print(char(Serial1.read())); i++;
    } while (i < ln);
    Serial.println();
  }
  return true;
}
boolean gim_gps() {
  Serial1.flush();
  Serial.print(" GPS test : ");
  delay(100);
  Serial1.println("$YA 5");  delay(5);
  Serial1.println("at+gpsconf=1,0"); delay(5);
  //Serial1.println("at+gpsnmea=1,1,1"); delay(5);
  Serial1.println("at+wppp=2,4,\"\",\"\""); delay(5);
  Serial1.println("at+gpsstart=0"); delay(1);
  do {while (!Serial1.available());
    str = Serial1.readStringUntil('\n');
 //   Serial.println(str);
  } while ( str.indexOf(">") < 0) ;
  Serial.println("set GPS at-command ");
  uint32_t tim = millis();
  do {
    Serial1.println("$LG x 1");
      do {
        while (!Serial1.available());
        str = Serial1.readStringUntil('\n');
      } while (str.indexOf("$LG") < 0 );
  //    Serial.println(str);
    } while ( str.indexOf("$LG=OK") < 0 && millis() - tim < 150000UL);
    if ( str.indexOf("OK") >0 ) {
        Serial.println(str); return true;
      } else {
        Serial.println(" GPS error --------" );
        return false;
      }
}
boolean gim_FW_test() {
  Serial1.println("$YA");
  Serial1.println("at+cgmr");
  do {
    while (!Serial1.available());
    str = Serial1.readStringUntil('\n');
  } while (str.indexOf("201") < 0);
  Serial.println(str);
  if ( str.indexOf("2017") > 0) {
    Serial.println(" FW rewrite OK "); return true;
  } else {
    Serial.println(" FW old  ************** NG"); return false;
  }
}
void setup() {
  while (!Serial);
  Serial.begin(9600);
  delay(100);
  Serial1.begin(baudrate);
  pinMode(7, OUTPUT);
  digitalWrite(7, HIGH); delay(500);
  digitalWrite(7, LOW);
  Serial.println("------------- 3GIM test Start ...(waite 14 sec.)----------- ");
  uint32_t tim = millis();
  do {
    str = Serial1.readStringUntil('\n');
  } while (str.indexOf("3GIM") < 0 && millis() - tim < 18000 );
  if (str.indexOf("3GIM") < 0) {
    Serial.println("******** ERROR 1  : STOP end "); while (1);
  }
  Serial.println(str);
  if ( gim_com("$YI") && gim_com("$YV") && gim_com("$PS \"soracom.io\" \"\" \"\"") && gim_com("$YT") &&
       gim_com("$WG http://tabrain.jp") )
  {
    if ( gim_gps() && gim_FW_test() ) {
      Serial.println("----------------    TEST OK   -------------------");
    } else Serial.println("******** ERROR 2(OS error) STOP end");
  } else {
    Serial.println("******** ERROR 3 : STOP end");
  }
  Serial.println(" TIME : " + String((millis()-stime)/1000.0) + " sec");
}

void loop() {}

本記事はここまで。
次は時系列データストレージサービスM2Xの設定です。

コメントを残す

Scroll to top