ArduinoのGSMシールドをセルラーネットワークに接続する
Published: 2024-01-12 10:26:49

**アーカイブのこのブログで説明されている原則は現在でも有効ですが、この記事で使用している具体例はGPRSを対象としており、GPRSはすべての国で利用できるわけではありません。 このチュートリアルのステップに従う場合は、この点に留意してください。**

過去にCESやその他のカンファレンスでPubNub Arduinoコントロールのスマートホームを紹介したことがありますが、その時によく聞かれた質問がPubNubがGSM/GPRSネットワークで動作するかということでした。ArduinoのGSM/GPRSシールドをインターネットに接続して、[双方向にデータをストリーム](https://www.pubnub.com/solutions/data-streaming/)することはできますか？私たちはそれが機能することはわかっていましたが、実際に自分たちで実装したことはありませんでした。

今までは...

このブログではGSM/GPRSを使ったPubNubの簡単なデモンストレーションを紹介します。言い換えれば、Arduinoをモバイル・セル・ネットワークに簡単に接続することができます。これは非常にエキサイティングなことで、コネクテッド・カーやドローンのようなモバイル[IoTアプリケーション](https://www.pubnub.com/solutions/iot-device-control/)、あるいはウェザーステーションやスプリンクラー・システムのようなWiFiシグナルにアクセスできないアプリケーションへの扉を開くものです。

さあ、始めよう！

[![GRPS SLD_04](https://images.ctfassets.net/3prze68gbwl1/asset-17suaysk1qa1hpg/748bdd937c0bc4de3db714a44c5d7c84/GRPS-SLD_04.jpg "GRPS SLD_04")](https://images.ctfassets.net/3prze68gbwl1/asset-17suaysk1qa1hpg/748bdd937c0bc4de3db714a44c5d7c84/GRPS-SLD_04.jpg)

### Arduino GSM/GPRSパーツリスト

使用した部品は以下の通り：

-   Arduino UNO Rev3
-   Seeed Studio GPRSシールド V2.0
-   SIMカード（単体）
-   Cサイズ電池 (x5)
-   Cサイズバッテリーホルダー (x5)
-   物理的なSIMが使えるスマートフォン
-   ノートパソコン

GPRSシールドとAT&T SIMカードはAmazonで購入した。他の小売店では単体のSIMカードを見つけるのは難しいかもしれません。

### SIMカードのセットアップ

まず、SIMカードのロックを解除し、データプランを付ける必要がある。スマートフォンがパーツリストに入っているのはこのためだ。

SIMカードを携帯電話に入れ、パッケージに含まれる説明書を読む。私が購入したAT&TのSIMの場合、携帯電話で一連の番号をダイヤルしてカードをアクティベートし、オンラインでプランを設定した。モバイルプランが通話とテキストだけでなく、データ転送にも対応していることを確認する。

SIMカードをアクティベートしたら、携帯電話でウェブサイトに接続してみる。成功すれば、データ通信が可能になり、Arduino内で動作するようになります。

### Arduino GPRSセットアップ

Arduino GPRSシールドを持って、SIMカードを差し込みます。この方法はSeeed Studioに[素晴らしいチュートリアルが](https://wiki.seeedstudio.com/GPRS_Shield_V2.0/)あります。そのチュートリアルに従いますが、"Test Setup "でコードをアップロードする前に一旦中断して、ここに戻ってください。

[![Arduino GPRS GSM](https://images.ctfassets.net/3prze68gbwl1/asset-17suaysk1qa1hph/9cb2b3cc0d462bd0ccce25f4696c360c/Arduino-GPRS-GSM.png "Arduino GPRS GSM")](https://images.ctfassets.net/3prze68gbwl1/asset-17suaysk1qa1hph/9cb2b3cc0d462bd0ccce25f4696c360c/Arduino-GPRS-GSM.png)

### Arduinoライブラリ

Arduinoでセットアップするには、たくさんのライブラリーが必要です。私は自分でライブラリを書いてみた！

[Seeed Studio GPRS Shield V2](https://github.com/Seeed-Studio/GPRS_Shield_Suli)用のライブラリはここで見つけることができます。ドキュメントに注意してください。この製品を動かすには3つのライブラリが必要です：

-   [GPRS\_Shield\_Suli](https://github.com/Seeed-Studio/GPRS_Shield_Suli)\- GPRSモジュールライブラリ、
-   SoftwareSerial - GPRSモジュールと通信するためにソフトウェアシリアルを使います。
-   [Suli\_Arduino](https://github.com/Seeed-Studio/Suli)\- Seeed統一ライブラリインターフェース

これら3つのライブラリをArduinoのセットアップにインポートします。

### ソフトウェアシリアル

さて、ここからが楽しいところだ。シールドとArduinoの環境はすべてセットアップできた。では、セル・ネットワークで遊んでみよう。

まず、ArduinoのSIM900チップと話す方法が必要です。ハードウェアシリアルを使って直接話しかけることもできますが、それは難しいので、Arduinoのソフトウェアシリアルを使いましょう。

Arduinoのexamplesフォルダから'SIM\_900\_Serial\_Debug'exampleを開きます。

[![
Connect Arduino GSM/GPRS](https://images.ctfassets.net/3prze68gbwl1/asset-17suaysk1qa1hpi/0b0470d16b584924954410e4fe312d6e/687474703a2f2f692e696d6775722e636f6d2f3658483531466f2e706e67.png "
Connect Arduino GSM/GPRS")](https://images.ctfassets.net/3prze68gbwl1/asset-17suaysk1qa1hpi/0b0470d16b584924954410e4fe312d6e/687474703a2f2f692e696d6775722e636f6d2f3658483531466f2e706e67.png)

このサンプルはシンプルで、ArduinoのシリアルポートからSIM900のシリアルポートにシリアルデータをプロキシするだけです。これにより、Arduinoに内蔵されているシリアルデバッグツールを使ってSIM900とやり取りできるようになります。

```js
void loop(){
  if(gprs.available()){
    Serial.write(gprs.read());
  }
  if(Serial.available()){     
    gprs.write(Serial.read()); 
  }
}
```

### 自分自身を呼び出す

Arduino GSMシールドを使って、自分自身を呼び出してみましょう。 ArduinoにSoftware Serial exampleをロードし、シリアルデバッガを開きます。側面のボタンを使ってArduino GPRSシールドのSIMカードの電源をオンにしてください。

_電源ボタンを約2秒間押し込んでSIM900の電源を入れます。赤いLEDが点灯します。その横の緑のLEDが点滅します。シールドがネットワークに正常に参加すると、緑のLEDが3秒ごとに点滅します。_

Arduino SIMのテストが終わったら、古いSMSカードを携帯電話に戻してください！

Arduinoのシリアルウィンドウに次のように入力します：

```js
AT
```

シリアル出力には次のようなものが表示されるはずです：

```js
RDY
+CFUN: 1
+CPIN: READY
+PACSP: 0
Call Ready
```

シリアルモニターにメッセージが表示されない場合は、ATコマンドの最後にキャリッジリターンを追加する "send new "オプションをクリックし、SIM900のボーレートを設定するATコマンド "AT+IPR=19200 "を送信してください。

今度は自分自身に電話をかけてみてください。1\*\*\*8675309」を自分の番号に置き換えて、次のコマンドを入力します。

```js
ATD1***8675309;
```

成功すれば、下の図のように「ATH OK」と表示される。そうでない場合は、代わりに「No CARRIER」と表示されます。電話番号が存在しないか、コマンドの形式が間違っていることが原因かもしれません。

### インターネットに接続する

ArduinoプロジェクトがGSMで動作するように設定できました。では、インターネットに接続してみましょう。

_SIM900のボーレートが9600であることを確認してください！ATコマンド(AT+IPR=9600)を使ってSerialDebugで設定できます。_

GPRS\_Shield\_SuliのGPRS\_TCPConnectionのサンプルをロードします。この例では、'mbed.org/media/uploads/mbed\_official/hello.txt HTTP/1.0'に簡単なリクエストをします。  
  

しかし、おそらくArduinoにロードしても実行されないだろう。これは、特定の携帯電話ネットワークで動作するように設定されていないからだ。

私の場合はAT&Tを使っているので、gprs接続を設定するために以下の行を変更する必要があった：

```js
GPRS gprs(PIN_TX, PIN_RX, BAUDRATE,"cmnet");
```

ほとんどの場合、この行だけでは十分ではありません。APN、ユーザー名、パスワードも必要です。これらのパラメータは例では省略されているが、自分で指定することもできる。関連するコードは[ここに](https://github.com/Seeed-Studio/GPRS_Shield_Suli/blob/master/GPRS_Shield_Arduino.h)ある。

```js
GPRS(int tx, int rx, uint32_t baudRate = 9600, const char* apn = NULL, const char* userName = NULL, const char *passWord = NULL);
```

AT&Tに接続するには、以下の設定を使用する：

```js
GPRS gprs(PIN_TX, PIN_RX, BAUDRATE, "wap.cingular", "WAP@CINGULARGPRS.COM", "CINGULAR1");
```

コードを実行してください。IPを取得し、リクエストを発行できるはずです。しかし、リクエストが発行されると、アプリはおそらくクラッシュする（SIMがオフになる）。これは混乱するかもしれませんが、簡単に解決できます。

### バッテリー

Seeed Studioや他の様々なシールドはArduinoと "plug and play "できると宣伝しているが、必ずしもそうではない。特にこのシールドは、TCPリクエストを正常に完了するのに十分な電力を5VのUSB電源から供給していない。

しかし、これを修正するのは簡単だ！オンライン・フォーラムでは、GSMチップに電力を供給するために5C電池を追加することを勧めている。

[![Connect Arduino GSM/GPRS](https://images.ctfassets.net/3prze68gbwl1/asset-17suaysk1qa1hpk/229a1ccaccf1df92b657be3c095b068f/687474703a2f2f692e696d6775722e636f6d2f45486a7942684b2e6a7067-1024x681.jpg "Connect Arduino GSM/GPRS")](https://images.ctfassets.net/3prze68gbwl1/asset-17suaysk1qa1hpj/523b7d13b8c3b81ff0c49733d501b432/687474703a2f2f692e696d6775722e636f6d2f45486a7942684b2e6a7067.jpg)

電池は直列に配線し、プラス側をVIN入力に、マイナス側をGNDに配線する。

電池を追加したら、サンプルをもう一度試してください。うまく接続できるはずです。

素晴らしい！これでPubNubでシグナルを送る準備ができた。

### PubNubを使ったシグナルの実装

さて、完全にパワーアップしたので、楽しい部分に行きましょう。以下のサンプルをボードにロードし、前述のように'GPRS gprs()'設定を変更します。

```js
#include <GPRS_Shield_Arduino.h>
  #include <SoftwareSerial.h>
  #include <Wire.h>
  #include <Suli.h>
  #define PIN_TX    7
  #define PIN_RX    8
  //make sure that the baud rate of SIM900 is 9600!
  //you can use the AT Command(AT+IPR=9600) to set it through SerialDebug
  #define BAUDRATE  9600
  GPRS gprs(PIN_TX, PIN_RX, BAUDRATE, "wap.cingular", "WAP@CINGULARGPRS.COM", "CINGULAR1");
  void publishData(String data) {
    Serial.println("attempting to publish");
    while (false == gprs.join()) {
      Serial.println("gprs join network error");
      delay(2000);
    }
    String str = "GET /publish/demo/demo/0/pubnub_gprs/0/\"" + data + "\" HTTP/1.0\r\n\r\n";
    // Length (with one extra character for the null terminator)
    int str_len = str.length() + 1; 
    // Prepare the character array (the buffer) 
    char http_cmd[str_len];
    // Copy it over 
    str.toCharArray(http_cmd, str_len);
    char buffer[512];
    if (false == gprs.connect(TCP, "pubsub.pubnub.com", 80)) {
      Serial.println("connect error");
    } else {
      Serial.println("publish success");
      Serial.println(data);
    }
    gprs.send(http_cmd, sizeof(http_cmd) - 1);
    gprs.close();
  }
  int counter = 0;
  void setup() {
    Serial.println("starting");
    Serial.begin(9600);
    // use DHCP
    gprs.init();
    // attempt DHCP
    while(true){
      publishData(String(counter));
      counter++;
      delay(1000);
    }
    gprs.disconnect();
  }
  void loop() {
  }
```

[](https://www.pubnub.com/docs/general/basics/initialize-pubnub)

[最初は混乱するかもしれませんが、分解してみましょう。urlは](https://www.pubnub.com/docs/general/basics/initialize-pubnub) [PubNub REST Push APIに従って](https://pubnub.com/docs/rest-api)[フォーマットされて](https://www.pubnub.com/docs/general/basics/initialize-pubnub) います。

```js
http://pubsub.pubnub.com
/publish
/pub-key
/sub-key
/signature
/channel
/callback
/message
```

ドメイン 'pubsub.pubnub.com' は関数の後半で定義します。publish'キーはpubnubコマンドを指します（購読することもできます）。pub-key'と'sub-key'は自分の[PubNubアカウントから](https://www.pubnub.com/docs/general/basics/set-up-your-account)取得しますが、今のところ'demo'キーを使うことができます。署名については心配しないでください。

チャンネル'は本当に重要です。これはPubNubデバイス同士が会話するためのIRCチャンネルのようなものです。

### データを見せてください

Arduinoからのメッセージをリッスンしている他のデバイスがないので、[PubNubコンソールを使って](https://www.pubnub.com/docs/console/)チャンネルのアクティビティを観察してみましょう。

デモが実行されていれば、"message "ペインに1, 2, 3, 4のようなカウントが表示されるはずです。

[![Connect Arduino GSM/GPRS](https://images.ctfassets.net/3prze68gbwl1/asset-17suaysk1qa1hpm/f98dab6173290ad076b29dc1c0b1ad48/687474703a2f2f692e696d6775722e636f6d2f77474c463865652e706e67-1024x468.png "Connect Arduino GSM/GPRS")](https://images.ctfassets.net/3prze68gbwl1/asset-17suaysk1qa1hpl/938e26e4848e88a0f3e2aaeb114f7589/687474703a2f2f692e696d6775722e636f6d2f77474c463865652e706e67.png)

Arduinoから出力されるデータを見ることができるのは、Arduinoと同じようにPubNubコンソールにpublishキーとsubscribeキーを差し込んでいるからだ。我々は'demo'キーを使っているのでチャンネルは公開されて共有されているが、自分のアカウントを作ればデータは非公開になる。

PubNubはどのようにあなたの役に立ちますか？
========================

この記事は[PubNub.comに](https://www.pubnub.com/blog/connect-arduino-gsm-shield-with-cellular-networks/)掲載されたものです。

PubNubのプラットフォームは、開発者がWebアプリ、モバイルアプリ、IoTデバイス向けにリアルタイムのインタラクティブ機能を構築、提供、管理できるように支援します。

私たちのプラットフォームの基盤は、業界最大かつ最もスケーラブルなリアルタイムエッジメッセージングネットワークです。世界15か所以上で8億人の月間アクティブユーザーをサポートし、99.999%の信頼性を誇るため、停電や同時実行数の制限、トラフィックの急増による遅延の問題を心配する必要はありません。

PubNubを体験
---------

[ライブツアーを](https://www.pubnub.com/tour/introduction/)チェックして、5分以内にすべてのPubNub搭載アプリの背後にある本質的な概念を理解する

セットアップ
------

[PubNubアカウントに](https://admin.pubnub.com/signup/)サインアップすると、PubNubキーに無料ですぐにアクセスできます。

始める
---

[PubNubのドキュメントは](https://www.pubnub.com/docs)、ユースケースや[SDKに](https://www.pubnub.com/docs)関係なく、あなたを立ち上げ、実行することができます。