世界最小クラス・省エネタイプ
３G通信モジュール（ボード）本マニュアルは、３G IoT Module V2.0 のご利用に当たっての説明資料です。
一部の機能詳細においては、既に販売しています３GIM版３Gシールドの資料等をご参照ください。
従来品３GIM V1.0との相違点は、最終補足ページに記載しています。
以下の開発事例/技術資料もご参考ください。
１）技術情報①：開発事例
２）技術情報②：遠隔制御・遠隔モニタリング（メール送信）３）技術情報③：ツイート連携４）技術情報④：クラウド連携
５）技術情報⑤：アシストGPS
６）Arduinoライブラリ利用マニュアル
７）エラーコード一覧表

３GIM（3G IoT Module） V2.0
利用マニュアル株式会社 タブレイン
３GIM-V2.0R01

20161022

３GIM V2.0 の優位性
３GIM V2.0は、他の通信モジュールに比べ多くの優れた点を持っています。ここにご紹介いたします。
1）3GIMのメインインタフェースはUARTで簡単（別途USB接続も利用可能）
2）分かりやすいマニュアルと豊富なサンプル付き
3）世界最小クラスでコンパクト4）省エネモードの取り入れが簡単
5）デバイスに組み込むためのカスタマイズが容易
6）超安価なSIMカードも利用可能（0円も可能）
7）位置情報測位が速いアシストGPS利用可能
8）豊富な開発事例及び安定稼働
9）試作から実運用まで幅広く利用可能10）Arduinoの開発環境や豊富な資産が利用可能
11）IoT試作環境として技術情報が豊富
12）ATコマンドを隠蔽した中学生でも分かる仕様実現などなどまだまだ挙げられます。
この他、３GIM V2.0 の保守サポートは、以下のWikiページにて対応しています。
http://a3gs.wiki.fc2.com/
またFacebookにて、最新情報を掲載しています。
https://www.facebook.com/tabrain1

もくじ
第１章 ３GIM V2.0 の概要
１．はじめに
２．3GIM V2.0 の外観
３．3GIM V2.0 の機能概要
４．3GIM V2.0 の仕様概要
５．3GIM V2.0 のピンコネクタ配置
６．3GIM を利用するソフトウェアについて
７．ご利用上の注意点【ご参考】Arduinoで動かす配線・接続
第２章 ＄コマンドインタフェース
１．UART送受信インタフェースの概要
２．３GIM V2.0 コマンド一覧
３．３GIMのインタフェース形式（共通事項）
４．３GIMのインタフェース形式（補足事項）
５．＄コマンドの送信・受信の処理方法
第３章 ３GIMコマンド・応答（レスポン）
１．System関連
２．SMS関連
３．GPS関連
４．Web関連
５．TCP/IP関連
６．Profile関連
第４章 応用事例プログラミング
１．Arduinoでのシリアルモニタ操作
２．３GIMでのツイッター連携使用例
３．３GIMでのクラウド連携使用例（１）４．３GIMでのクラウド連携利用例（２）５．３GIMでのクラウド連携利用例（３）６．GPS機能を使った応用例
７．Arduino関連ライブラリ（a3gim2）
８．サンプルツール群

2

p.3

p.12

第５章 Arduino用a3gimライブラリ群
１．a3gimライブラリとは
２．a3gimライブラリ関数群
３．コントロール関連関数
４．ショートメッセージ関連関数
５．Web関連関数
６．現在位置取得（GPS）関連関数
７．通信その他機能関数
８．TCP/IP関連関数
９．プロファイル関連ほか関数
１０．サンプルスケッチ群の実行例

P.121

補足資料

P.194

【補足資料1】３GIMコマンド・応答一覧表

P.19【補足資料2】５Vから3.3Vを作り出す回路例【補足資料3】トラブルシューティング【補足資料4】３GIM V2.0 外形寸法
【補足資料5】３GIM サポートサイト【補足資料6】３GIM関連商品のご紹介【補足資料7】３GIM V1 との相違点

P.72【補足資料8】 ラズベリーパイでの３GIM利用

もくじ
１．はじめに
２．3GIM V2.0 の外観
３．3GIM V2.0 の機能概要
４．3GIM V2.0 の仕様概要
５．3GIM V2.0 のピンコネクタ配置
６．3GIM を利用するソフトウェアについて
７．ご利用上の注意点【ご参考】Arduinoで動かす配線・接続

第1章
３GIM V2.0 の概要

3

１．はじめに

３GIMは、M2MやIoTシステム開発での試作やプロトタイプから、量産化に向けた３G通信モジュールとなります。



今後の新しいモノづくりにおいて、広域ワイヤレス（３G通信）を誰もが、高度な技術を、簡単に、短時間で、利用し、応用できるようにしたものが３GIMとなります。



3GIM（３G IoT Module）は、様々なマイコンを使って、簡単にインターネット接続することができるSDカードサ
イズの超小型3G通信モジュールです。



3GIMは、マイコンボード(mbed,GR-Sakura,PIC,Intel Edisoni等)やコンピュータボード（RaspberryPiなど）からUART経由またはUSB経由で簡単に利用することができます。



Arduino関連互換機などでお使いの場合には、別途３Gシールド関連ドキュメント類も参考にしながら開発を進められることをお薦め致します。



本製品の技術サポートおよび今後のマニュアル更新につきましては、以下のWikiページをご覧ください。
http://a3gs.wiki.fc2.com/
３GIM V2.0は、従来の３GIM V1.1とほぼ互換品としてもご利用頂けます。



4

マイクロ
SIMの
挿入方向

２．3GIM V2.0の外観※マイクロSIMにテープを付けて出し入れできるような工夫があると便利です■3GIMの外観写真およびその説明
6ピン
コネクタ

USB※1
コネクタ

取付穴

マイクロSIM
ソケット
GPSアンテナ
コネクタ

３Gアンテナコネクタ
※アンテナ取り付けは、コネ
クタの真上から押し込みます

３Gフレキ
アンテナ※2

LPC812
マイコン

取付穴

【表側】

【裏側】

6ピン
コネクタ

３GIM
V2.0

【提供製品群】

表側には、通信モジュール（HL8548-G）、マイクロUSBコネクタ、電源LED、シリアル番号シール等が配置されています。またシール上の脇には、6ピンコネクタがあります。
裏側には、マイクロSIM(ミニSIM)ソケットおよびマイコン（LPC812）があります。
（SIMカード挿し込む時、裏表・上下を間違わないようにしてください）

３GおよびGPS用のアンテナは、専用のアンテナをご利用ください。
（アンテナのコネクタ部分は、特に扱いに注意が必要となります）※１：マイクロUSBコネクタは力を入れ過ぎると剥がれますので、ご注意ください。剥がれた場合には有償交換いたします。
※２：３Gフレキアンテナは、日本の技適を取得したものです。

5

細ピン
（８ピン）

３．３GIM 2.0 の機能概要
3GIM V2.0は、下記の機能が提供されます。(gw3gアプリの機能）

1.

3Gを介したインターネット接続（TCP/IPおよびHTTP、HTTPS※1）

2.

3Gネットワークからの時刻取得

3.

GNSS（GPS/GLONASS）を使った位置情報の取得（Assisted GPS機能あり）

4.

SMSの送受信（※2）

5.

プレーン（機内）モード機能（省エネモード利用）

6.

その他機能（電波強度の取得、日時情報取得、ボーレートの変更※3、APN※3の切り替え等）

7.

HL8548-GのATコマンドパススルー機能※1：対応できるSSL証明書には一部制約があります。すべてのサーバに対してHTTPS通信ができることを保証する訳ではありません。
※2：ご利用頂けるSIMカードは、SMS対応のものとなります。
※3：ボーレートやAPN情報は、一度設定すると不揮発性メモリに保存されます。
３GIM V2.0
３G通信モジュール
HL8548-G
マイコン（gw3g)
LPC812

6

UART

マイコンボード
ArduinoRaspberryPi
mbed
EdisonGR-SAKURA
ほか

４．3GIM V2.0 の仕様概要
項 目

仕

様

補

足

外形寸法

幅25mm × 奥行35mm × 高さ7mm

取付穴はø2.6(1ヶ所)、重さ7.5ｇ

電源電圧

電源コネクタ部 3.3～4.2V（注意：5Vは使用不可）

安定したDC電源または3.7Vリチウムポリ
マ電池※1を推奨

10～900mA（最大）利用状況や電波状態に依存（エアプレーンモード時10ｍA 程度）

消費電流（HL8548-Gのエアープレーンモード時はMax1.5ｍA)

通信規格・対応周波数

HL8548（シエラワイヤレス製）対応

800/850/900/1900/2100MHz

マイコンとのインタフェース

UARTを介したコマンド・レスポンス方式 仕様書は別途公開予定(ただし、USBモデ
またはUSBモデム
ムは規格のみ公開※2)

使用アンテナフレキアンテナやポールアンテナ多種

ロジック電圧

任意のロジック電圧で利用可能(3GIMにIO電圧を供給)

UART

9600～115200bps/8データビット/パリ
ティなし/1ストップビット※３

取付用コネクタおよび基板を標準で添付

初期設定 9600 bps※１：USBコネクタ経由で充電は可能ですが、製品機能としてはサポート外・保証外とさせていただきます。
※２：USBモデムとしてのご利用に関しては、技術サポートは行っていません。
※３：ソフトシリアル通信では、9600、19200、38400bps（推奨）まで、ハードシリアル通信では、さらに57600、115200bpsまで可能

7

５．３GIM V2.0 のピンコネクタ配置
ピン番号

名称

機能など

＃1

PWR_ON

電源のON/OFF制御(開放または0:LOWでON、1:HIGHでOFF)＃2

RX

UARTインタフェース(RX)：相手方のTxに接続＃3

TX

UARTインタフェース(TX)：相手方のRxに接続

＃4

IOREF

ロジック電圧(任意、通常は1.8V～5V間で利用）＃5

VCC（＋）

電源電圧(3.３～4.2V) ※瞬間的に3.2V以下にならないこと＃6

GND（－）

グラウンド【補足説明】
 #1ピンは「1」とシルク印刷されている側のピンです。
 #1ピンの「HIGH」は、ロジック電圧(IOREF)とします。
 「VCC(+)」ピンから電源を供給する場合は、 PWR_ONの状態によらず、常にONとなります
注意：VCCを間違
わないように推奨：3.7Vリチウ
ムイオン電池推奨＃１ピン※ #5（VCC）から電源供給必要
電源電圧（3.3~4.2V：200ｍA以上）＜#1で電源ON/OFF制御＞【注意】Arduinoの外部出力電源の3.3Vでテストしましたが、一部のArduinoでは稼働しないことが分かりました。
供給電流が低いために通信できないものと思われます。
（補足：場合によってはPC側の電源供給不足問題もあります）

8

＃６ピン

GND（－）VCC（＋）

６．３GIMを利用するソフトウェアについて
3G(W-CDMA)
Band 1/6/19

3GIM V2.0
HL8548-G（通信モジュール）Arduino以外＄コマンド利用

アプリケーション<gw3g(V3.1)>

第２章・第3章・第4章 参照

IoTAB シールド V3.0など利用
UART

Power

Arduino(UNO, 101, Zero, Pro, Mega, DUE..)
Arduino アプリケーション
USB or
外部電源

Arduino ライブラリ <a3gim(R4.0)>

SoftwareSerial ライブラリ

Arduinoの場合
ライブラリ関数利用
第５章参照

Arduino ブートローダ
9７．ご利用上の留意点
1.

NTTドコモ様のFOMA回線を利用します。そのため、NTTドコモ様あるいはそのネットワークを利用するMVNO様が提供するマイクロSIMが利用できます（ただし、これらの条件を満たす全てのSIMカードでの利用を保証する訳ではありません。ご利用においては、SIMカードのAPN情報、ユーザ情報、パスワードが必要となります。）
http://a3gs.wiki.fc2.com/※提供されている以外のNTTドコモ製のSIMカードご利用されたい場合には、別途info@tabrain.jpへご連絡ださい。

2.

日本国内のみでの利用をお願いします。海外では、各国の法律により現状ではご利用いただけません。詳細はタブレ
インまでご相談ください。

3.

USBモデムとして利用する場合でも、電源供給（3.3~4.2V）は必要です。

4.

回路図は、オープンソースとして公開します。将来的にはプリインストールしているファームウェアも公開する予定
でいます。

5.

GPS取得は、電波障害が少ない屋外などで行ってください。また初回GPS取得時では、特にPCなどの電波障害を避けて、ご利用ください。（USBケーブルを長いものを使ってPC本体から離してご利用頂くなど）（初回のGPS取得には、数分時間が掛かります。Assisted GPS機能を使うと野外で30秒前後で取得できます）

10

【参考】Arduinoで動かす配線・接続


Arduino（マイコンボード）などとの接続方法例
注意：VCCを間違
わないように推奨：3.7Vリチウ
ムイオン電池推奨

Arduino
などの
マイコン
ボード

1.8V ～５V
Dn

IOREF#4

VCC#5
3.3～4.2V

PWR_ON #1

TXｎ

RX#2

RXｎ

TX#3

外部電源

３GIM
GND#6

#1

外部電源
＃５

【補足説明】
 デジタル出力Dn（#1接続）をLOWにすることで、3GIMの電源をオンにします。なお、3GIMの電源供給後の立ち上げ時間は約15秒となります。立ち上げ時に、緑LEDが点滅します。またDn（#1接続）を解放していると、
常に通信モジュールに電源が供給された状態となります。
※一度電源を入れると、初期立上げ以降、コマンド操作での待機時間は不要となります。

 IOREFピンには、1.8V～5Vの範囲ですので、Arduinoのロジック電圧(3.3V or 5V)が接続できます。
（Arduino の3.3Vから直接 電源＃5に取る事で稼動できますが、一部電流不足で動かない場合もあります）
 UARTはクロスで接続します（TX/RXを交差させて接続します）＜Genuino101では、ハードウェアシリアル通信のSerial1での通信を推奨します。高速な通信が可能です＞

11

もくじ
１．UART送受信インタフェースの概要
２．３GIM V2.0 コマンド一覧
３．３GIMのインタフェース形式（共通事項）
４．３GIMのインタフェース形式（補足事項）
５．＄コマンドの送信・受信の処理方法

第２章＄コマンドインタフェース

12

１．UART送受信インタフェースの概要■UARTによる送信（＄コマンド）と受信（応答：レスポンス）との関係
外部(マイコン側)と３GIMとの通信は、UARTを通じて行います。



マイコン側から＄コマンドを送信し、３GIM側で受信します。



つぎに３GIM側から応答（レスポンス）を送信し、マイコン側で受信して、コマンド制御を終了します。



つまりUART送受信の一連の処理は、マイコン側から３GIM側へのコマンド送信と、３GIM側からマイコン側への応答（レスポンス）送信で、１つのシーケンスとして完結します。


コマンドおよび応答（レスポンス）は、改行コード('¥n')で終端します。

（Arduino IDEのシリアルモニタ画面で直接やりとりされる場合には、改行選択メニューで「CRおよびLF」を選択してください）TX① コマンドマイコン

３GIM② 応答（レスポンス）
RX

ArduinoRaspberryPi
mbedIntel Edison など
13

RX（＃２）

TX（＃３）

通信ボーレートは、
9600bps, 19200pbs、38400bps、57600bps、115200pbsから選択できます。
ただし、115200bpsは、ハードウェアシリアル通信時のみ正常に通信可能です。
ソフトウェアシリアル通信は、57600bpsでは文字化けが起きる場合もあり、高速利用では38400bpsを推奨します。

２．３GIM V2.0 コマンド一覧
3GIM V2.0 のUART経由で利用できるコマンドを下表に示します
No
分類
1
2
3
4
5
System
6
7
8
9
10
11
12 SMS
13
14 GPS
15
Web
16
17
18
19
20 TCP/IP
21
22
23
24 Profile

機能
Version
RSSI
Service
IMEI
LED
Baudrate
Reset
Time
Airplane mode
ATcommand
Send
ReceiveCheck
get Location
Get
Post
Read
Write
Connect
Disconnect
StatusGet sockname
Write2
Set

コマンド
$YV
$YR
$YS
$YI
$YL
$YB
$YE
$YT
$YP
$YA
$SS
$SR
$SC
$LG
$WG
$WP
$TR
$TW
$TC
$TD
$TS
$TN
$TT
$PS

頁
P.20
P.22
P.24
P.27
P.28
P.30
P.32
P.34
P.36
P.38
P.41
P.43
P.45
P.48
P.53
P.55
P.58
P.59
P.60
P.61
P.62
P.63
P.64
P.69

機能概要
gw3gアプリのバージョン情報の取得
電波受信強度(RSSI)の取得
利用可能サービスの取得
IMEIの取得
LED（RUN）の状態の取得、設定
UARTの通信速度の変更
リセット（初期化）
日時の取得
エアプレーン（機内）モードの切り替え
ATコマンドパススルーモード切換え
SMSの送信SMSの受信SMS着信の有無チェック
位置情報の取得、ロケーションサービスの停止
GETリクエストの送出、レスポンスの取得
POSTリクエストの送出、レスポンスの取得
TCP/IPコネクションからのデータからの読み出し
TCP/IPコネクションへのデータの書き込み
TCP/IPコネクションの接続
TCP/IPコネクションの切断
TCP/IPコネクションの状態の取得、設定
ソケットのIPアドレスとポート番号を取得
現在のコネクションへダイレクトにデータ書出し
デフォルトプロファイル番号の設定※３GIMからの応答（レスポンス）は、各コマンドの機能紹介にて説明していきます。
＄コマンドのエラー一覧は、こちらからダウンロードできます。

14

補足（V1.0との比較）【拡張】リセット後に有効

【新規】
【拡張】
【拡張】
【拡張】GPS/GLONASS利用
ヘッダ指定可(R2.0から)バイナリデータも取扱可
同上【変更】
接続時のみ有効【新規】【拡張】

３．３GIMのインタフェース形式（共通事項）■コマンドの指定表示形式$XX 引数1 引数2 …¥n※ここでの「XX」はコマンド名です。

引数は1つ以上の半角スペースで区切る。引数には制御コードは含まないでください。
（制御文字を含む引数の指定では、$文字エスケープシーケンスを使用してダブルクォートで囲む）¥n は 改行コードとなります。
注意： [ ] （カギ括弧）表記は、オプション（省略可）のもので、実際には記述は不要です。
【補足1】３GIMに電源供給して約15秒ほど経たないと■応答（レスポンス）結果表示形式$XX=OK 【結果】¥n

ファームウェアが立ち上がりません。立ち上げ時の最初に※ここでの「XX」はコマンド名です。

【結果】が複数行になる場合は結果部分全体を"で囲みます。

$XX=NG エラーコード 【付加情報】¥n
エラーコードは別途定義する1～3桁の数字となります。
※ 【結果】と【付加情報】はオプションです。

は、以下の応答（レスポンス）が返信されます。これらは読み飛ば（無視）して処理してください。
Welcome to 3GIM(v2)【補足2】コマンドが間違った場合の応答（レスポンス）
は、以下のようになります。
$=NG Unknown■コマンドパラメータの特殊文字の表現形式‘$’ 文字に引き続く文字を使って、特殊な文字（コード）を表現します。具体的には下記の通りとなります。
$t：TAB(0x09)$r：CR(0x0d)$n：NL(0x0a)$"："そのもの$$：$そのもの$xhh または $Xhh：16進数hh

15

例えば、下記のように使用する：
HTTPヘッダの例"Content-Type: text/csv$r$n"

４．３GIMのインタフェース形式（補足事項①）■初期起動時について
３GIM の１番ピン（#1）を電源OFFの状態か、一度電源ONにした後OFFにすることで、ファームウェアが起動しはじめ、約１3
秒後に３GIM上の緑LEDが点滅します。その後、シリアル通信（UART）の3番ピン（#３）から以下のメッセージが送信されます。
この状態で３GIMと接続できたことになります。
Welcome to 3GIM(v2)※下線部は、3GIMのファームウェアのバージョンを示す■コマンドの応答（レスポン）の出力について「＄」で始まるコマンド群では、ほとんどのものが１行で応答が返ってきます。しかしながらHTTP/GETやHTTP/POSTそれに
TCP/IP機能群では、ヘッダー部とボディ部が返ってきますので、そのための処理がプログラミングで必要となります。
$WG http://tabrain.jp/$WG=OK 1023

※応答（レスポンス）結果だけを知りたい場合は、途中ステータス行を無視するプログラムが必要です。
つまり、結果表示「$」で始まる行以外は読み捨てるなどが必要です。
※特に応答までの時間が掛る「＄LG」による初回のGPS取得の場合には、何度かコマンドを実行してみる必要もあります。

16

４．３GIMのインタフェース形式（補足事項②）■３GIMの接続サンプル・スケッチ（起動プログラム）について
3GIMに電源を供給した約13秒後、ボード上の緑LEDが点滅し、その後の応答（レスポンス）メッセージが３GIMから返ってくることを前頁で紹介しました。
３GIMの起動プログラムについてご紹介します。以下の関数がtrueで返ってくる場合は、正常に接続できたことになります。falseの場合には、異常があったことで、主に通信速度の設定が間違ったことによります。
boolean _3G_SETUP() {String str;
uint32_t tim = millis();do {while (!Serial3g.available()) {if (millis() - tim > 15000) return false;}
str = Serial3g.readStringUntil('¥n');} while (str.indexOf(“3GIM")<0);
return true;}

補足・注意：
緑LEDは点滅するが、応答が無い場合
もしくは、応答した文字が化けている場合→ シリアル通信速度が、間違っていることによります。
工場出荷時のシリアル通信速度は、すべて9600bpsとなっています。
もし、変更された場合には、メモをしておく必要があります。

ここでは、Arduino IDEを使った参考事例となります。

■応答（レスポンス）がない場合についての処理
正常な実行中に、応答（レスポンス）がない場合は、異常時（例えば、ハングアップした等）となります。 通常は起こりえませんが、ハングアップした時などの異常時への対応として、電源のOFFやタイムアウト処理などが必要となります。

■エラーコードについて＄コマンドのエラーコード一覧は、こちらからダウンロードできます。

17

５．＄コマンドの送信・受信の処理方法＄コマンドを発行（シリアル通信から送信）した場合、その処理受付は全てLPC812側で行い、LPC812側のファームウェアから、HL8538Gへ「ATコマンド」を使って処理が移ります。

①

この場合（正しく通信HL8548-Gが通信できている場合）
１）一つの＄コマンドに対して、必ず応答があります
２）応答は、１行もしくは複数行（文字列）となります
３）応答の１行目は、コマンド実行の真偽を返します
４）＄コマンドの連続発行は、応答を待つことなくできます
以上のことを理解し、＄コマンドを連続して発行した場合、どの順で応答が返ってくるかを認識したプログラミングが必要となります。
一般的には、＄コマンドを発行した場合には、必ず応答を待って、次の処理に移ることが分かり易いプログラミングとなります。
しかし、応答が待てない場合には、連続し発行した＄コマンドを把握しておく必要があ
ります。

①
送
信

①

＄コマンド①
送信②＄コマンド②
送信①

右の図の場合、②の応答が複数行ある場合には、③の応答があった直前の応答が最終応答行となります。

Serial3g.println( "$WG " + str);do { str = Serial3g.readStringUntil('¥n'); }while (str.indexOf("$WG") < 0);■応答値を使わない場合
Serial3g.println("$YL " + String((int)sw));
while (Serial3g.readStringUntil('¥n').indexOf("$YL") < 0);18＄コマンド①応答②②

以下のサンプルスケッチは、送信後、応答を待つ２つのケースです。

■応答値を使う場合

応
答＄コマンド③送信③＄コマンド②応答②＄コマンド③応答③＄コマンド送信と応答の関係（事例）もくじ
１．システム関連
２．SMS（ショートメッセージ）関連
３．位置情報取得（GPS）関連
４．Web関連
５．TCP/IP関連
６．プロファイル関連

第３章
３GIMコマンド・応答（レスポン）

19

１．システム関連

20

１．SYSTEM VERSION ①■ ３GIM V2.0（通信）モジュールに設定されたファームウェアのバージョン取得
通信モジュールに設定されているファームウェア（gw3g）のバージョンを取得する
項目
機能分類
機能名
コマンド形式
引数
応答値

値など
SystemVERSION

説明【正常時】
version【エラー時】
errno

ファームウェア（gw3g）のバージョンを取得する$YV¥n$YV=OK version¥n"9.9"形式のバージョン（整数桁がメジャ番号、小数以下がマイナ番号）※$YV=NG errno ¥n
141：コマンドの形式に誤りがある

前提条件
補足事項
※バージョンは、2016年4月時点の出荷時点「３.1」となる。

21

補足

１．SYSTEM VERSION ②■事例：バージョン取得サンプルプログラム■Arduinoでのサンプルスケッチ#include <SoftwareSerial.h>SoftwareSerial Serial3g(4,5);
void setup() {Serial.begin(9600);
通信速度設定Serial3g.begin(9600);
Serial.println("begin System version");pinMode(7,OUTPUT);
digitalWrite(7,HIGH);delay(5);digitalWrite(7,LOW);
delay(14000);
while(Serial3g.available()) Serial3g.read();Serial3g.println("$YV");
while(!Serial3g.available());
Serial.println(Serial3g.readStringUntil('¥n'));Serial.println("end");pinMode(7,OUTPUT);digitalWrite(7,HIGH);}■実行モニタ画面（サンプル）
begin System Version$YV=OK 3.1
応答受信
end

void loop() {}【補足】ここでの呼出し関数群について・SoftwareSerial は、ソフトシリアル通信利用宣言
・Serial3g.begin(通信速度)は、 ボーレート宣言
・delay(num)は、 numミリ秒の待機時間
・Serial3g.listen()は、受信状態占有関数
・Serial3g.available()は、受信バイト数を返す
・Serial3g.readStringUntil(‘¥n’)は、リターン値までの文字列読込み関数22

返信が無い場合は、以下のようなことが考えられる
１）通信モジュールに電源（橙色LED点灯）が入ってない
２）通信ボーレートが間違っている
３）配線（特にUARTのTxとRxの接続）が間違っている
４）電源電力が不足している

２．SYSTEM RSSI ①■電波受信強度（RSSI）の取得
項目
機能分類
機能名
コマンド形式
引数

応答値

値など
System
RSSI
【正常時】
rssi
【エラー時】
errno

前提条件

①

説明

補足

現在のRSSI値を取得する$YR¥n$YR=OK rssi¥n
電波強度（-51～-113）[dBm]rssiは常にマイナス値$YR=NG errno¥n102：コマンド形式に誤りがある
101：電波強度が取得できない
あらかじめ３G用のアンテナが正しく装着され
ていること

補足事項

RSSIとは、無線通信機器が受信する信号の強度を測定するための回路または信号のこと。Received
Signal Strength Indication, Received Signal Strength Indicator 別名：受信信号強度のこと。
RSSI値は常にマイナスで、目安は下記の通りである：-113の場合には、アンテナが接続されていないとき-112～-90 の場合は、電波受信状態が悪い状況-89～-51 の場合は、電波受信状態が良い状況

23

２．SYSTEM RSSI ②■事例：電波受信強度（RSSI）を取得サンプルプログラム■Arduinoでのサンプルスケッチ#include <SoftwareSerial.h>SoftwareSerial Serial3g(4,5);
void setup() {Serial.begin(9600);
Serial3g.begin(9600);
Serial.println("begin System version");delay(14000);
while (Serial3g.available()) Serial3g.read();Serial3g.println("$YR");
while (!Serial3g.available()) ;Serial.println(Serial3g.readStringUntil('¥n'));Serial.println("end");}void loop() {}■実行モニタ画面（アンテナ正常接続）
begin SYSTEM RSSI$YR=OK -86
応答受信
end

■実行モニタ画面（アンテナ未接続）
begin SYSTEM RSSI$YR=OK -113
応答受信
end

RSSIの感度が悪い場合
１）通信モジュールとアンテナのコネクタが正しく接続されていない
２）アンテナとケーブル・コネクタのネジ部が緩んでいる
３）電波状態が悪い屋内の壁・天井・床などで閉ざされたところにある
４）SIMカードが正しく挿入されていないか、APN情報が正しく設定されていない

24

３．SYSTEM SERVICE ①■SIMカードによる通信サービス状況を取得
項目
機能分類
機能名
コマンド形式
引数

応答値

前提条件
補足事項

値など
SystemSERVICE
【正常時】

説明

補足

現在利用できる通信サービスを取得する$YS¥n$YS=OK serice¥n0：サービス利用不可
service
1：パケット通信(PS)のみ利用可【エラー時】 $YS=NG errono¥n
SIMカードやアンテナが無い時
131：コマンドの形式に誤りがある
error
132：内部エラー（サービス種別を取得できない）①
あらかじめSIMカードが装着されていること
SIMカードがないと常に結果としてNGが返る
3GIM(Ver2)では音声通信の利用可否を取得できないため、音①
声通信SIMとしての値は返却しない。
３GIM V2.0で利用できるSIMカードは、NTTドコモおよびドコモFOMA回線を使ったMVNO提供のSIMに限ります。

25

３．SYSTEM SERVICE ②■事例：SIMカードによる通信サービス状況を取得サンプルプログラム■Arduinoでのサンプルスケッチ#include <SoftwareSerial.h>SoftwareSerial Serial3g(4,5);
void setup() {Serial.begin(9600);
Serial.println("begin System service");
Serial3g.begin(9600);
通信速度設定delay(14000);
while(Serial3g.available()) Serial3g.read();Serial3g.println("$YS");
コマンド送信while(!Serial3g.available()) ;Serial.println(Serial3g.readStringUntil('¥n'));Serial.println("end");}void loop() {}26■実行モニタ画面（パケット通信のみの利用の場合）
begin SYSTEM Service$YS=OK 1
応答受信
end４．SYSTEM IMEI ①■通信モジュールのID（固有）番号（IMEI）を取得
項目
機能分類
機能名
コマンド形式
引数

応答値

値など
System
IMEI
【正常時】
imei
【エラー時】
errno

説明

補足

IMEIを取得する$YI¥n$YI=OK imei¥n
15桁の数字$YI=NG errno¥n143：IMEIを取得できない
146：コマンドの形式に誤りがある

前提条件
補足事項

IMEIは「国際移動体装置識別番号（端末識別番号）」を意味する英語"International Mobile Equipment Identifier"の略称

IMEI番号

27

４．SYSTEM IMEI ②■事例：通信モジュールのID（固有）番号（IMEI）を取得サンプルプログラム■Arduinoでのサンプルスケッチ#include <SoftwareSerial.h>SoftwareSerial Serial3g(4,5);
void setup() {Serial.begin(9600);
Serial.println("begin System IMEI");
Serial3g.begin(9600);
通信速度設定delay(14000);
while (Serial3g.available()) Serial3g.read();Serial3g.println("$YI");
コマンド送信while (!Serial3g.available()) ;Serial.println(Serial3g.readStringUntil('¥n'));Serial.println("end");}void loop() {}28■実行モニタ画面（正常時）
begin SYSTEM IMEI$YI=OK 359516050164625
end

応答値

※このID番号の数値はサンプルです

IMEI番号■実行モニタ画面（エラー時）
begin SYSTEM IMEI$=NG 10
end※コマンドが正しく読み込め
なかった場合５．SYSTEM LED ①■３GIM上の緑LEDの点滅設定および状態取得
項目
機能分類
機能名
コマンド形式
引数
応答値

値など
SystemLED
取得
設定
status
【正常時】

説明

補足

status緑LED（RUN）ピンの状態取得・設定を行う$YL¥n$YL status¥nONにするか(1の時)、OFFにするか(0の時)$YL=OK status¥n
本コマンド実行後のLED状態（0:OFF／1:ON）【エラー時】errno$YL=NG errno¥n191：コマンド形式または引数statusがおかしい

前提条件
補足事項

①

本機能で扱うLEDは、1番ピン脇に配置されている緑色
LEDである（基板上に「LED2」と記載）

ここのLEDが点灯

29

状態取得
１：点灯、０：消灯

５．SYSTEM LED ②■事例：LED状態取得とLEDの点滅１０回繰り返しのサンプルプログラム■Arduinoでのサンプルスケッチ#include <SoftwareSerial.h>SoftwareSerial Serial3g(4,5);
void setup(){
Serial.begin(9600);
Serial3g.begin(9600);
delay(35000);
Serial.println("begin SYSTEM LED");
Serial3g.println("$YL");
while (!Serial3g.available()) ;String rt = Serial3g.readStringUntil('¥n');
Serial.print(rt);for (int i=0; i<10; i++) {Serial3g.println("$YL 1");delay(500);
点滅を10回繰り返す
Serial3g.println("$YL 0");delay(500);}
Serial.print("¥r¥nend");}void loop() {}30■実行モニタ画面（正常時）
begin SYSTEM LED$YL=OK 0
end

６．SYSTEM BAUDRATE ①■３GIMのUART（通信ポート）の通信速度（ボーレート）取得確認と設定
項目
機能分類
機能名
コマンド形式
引数

応答値

前提条件
補足事項

値など
SystemBAUDRATE
取得
設定
baudrate【正常時】
baudrate【エラー時】
errno
①
①
②

説明

UARTの通信速度(ボーレート)の取得・設定を行う$YB¥n$YB baudrate¥n
設定するボーレート(9600/19200/38400/57600/115200)

補足

ご購入時は9600bps$YB=OK baudrate¥n
本コマンド実行後のボーレート$YB=NG errno¥n111：コマンド形式または引数baudrateがおかしい
指定するボーレートで正しく動作することを確認しておくこと
ボーレートの目安を参照のこと
本コマンドで設定した新しいボーレートは直ちに反映される
本コマンドで設定したボーレートは電源の再投入やリセットしても維持される。

【注意事項】① 現状のボーレートと、変更後のボーレートは、常に把握した上でこのコマンドを使うこと（現在のボーレートが分からくなる/通信できなくなると、一つ一つボーレートを試して探り当てる必要がある）② Arduinoのソフトウェアシリアルを利用する場合は、ハードウェアシリアルを使った場合よりも低いボーレートでしか利用できない（ソフトウェアシリアルの場合は38400bps以下での利用を推奨）

31

６．SYSTEM BAUDRATE ②■事例：３GIMのUARTのボーレート取得確認サンプルプログラム■Arduinoでのサンプルスケッチ#include <SoftwareSerial.h>SoftwareSerial Serial3g(4,5);#define NOWBAUDRATE 9600
#define NEWBAUDRATE 38400■実行モニタ画面（正常時）

この通信速度にする

void setup() {Serial.begin(115200);
pinMode(7,OUTPUT);
Serial.println("begin System Baudrate");Serial3g.begin(NOWBAUDRATE);
delay(14000);
while (Serial3g.available()) Serial3g.read();Serial3g.println("$YB " + String(NEWBAUDRATE));
delay(5);Serial3g.begin(NEWBAUDRATE);
String str;
do{while (!Serial3g.available()) ;str=Serial3g.readStringUntil('¥n');} while (str.indexOf("¥YB") < 0);Serial.println(str);
Serial.println("end");}

begin SYSTEM Baudrate$YB=OK 38400
end

ボーレート設定での注意点
１）ボーレート設定を変更すると、改めてシリアル通信速度も変更が必要となります。
２）ボーレート変更設定した場合には、その情報は控えておいてください。

void loop() {}ボーレートを9600bpsから38400bpsに変更するサンプルです。

32

ボーレート変更によって起こる問題
１）文字化けが起きることがあります。特にスクリーンモニタ画面に出す場合には、なるべく、通信速度を合わせるようにお願いいたします。
２）処理の待機時間が関係してきますので、同じソフトウェアでも調整が必要となります。

７．SYSTEM RESET ①■ ３GIMをリセットするコマンド

項目
機能分類
機能名

値など
SystemRESET
ソフトリセット
指定リセット

３GIMをリセットする$YE¥n$YE level¥n

引数

level

リセットのレベル（0: ソフトリセット、1:ハードリセット）

応答値

【正常時】
level
【エラー時】errno$YE=OK level¥n
引数と同じ$YE=OK errno¥n191:コマンドの形式に誤りがある
リセット後、復帰までには14秒程度の時間が掛かる。再起動するまで３GIMは利用できない。
実装上の理由で、ハードリセットはソフトリセットと同じ動作となっている。

コマンド形式

補足事項

①

②

説明

ハードウェアリセットは、#1ピンをHIGHにすることで電源OFFにできます。
この場合３GIM上の橙LEDが消灯します。

33

補足

levelの内容に拘らず常に再起動する

７．SYSTEM RESET ②■事例：リセットのサンプルプログラム■Arduinoでのサンプルスケッチ#include <SoftwareSerial.h>SoftwareSerial Serial3g(4,5);
void setup(){
Serial.begin(38400);
Serial3g.begin(38400);
delay(14000);
Serial.println("SYSTEM Reset");Serial3g.println("$YE");
while (!Serial3g.available()) ;String rt = Serial3g.readStringUntil('¥n');
Serial.print(rt);Serial.print("¥r¥nend");}void loop() {}34■実行モニタ画面（正常時）
SYSTEM Reset$YE=OK
end

８．SYSTEM TIME ①■通信モジュールの取得した時間取得
項目
機能分類
機能名
コマンド形式

値など
SystemSystem Time
時刻取得

説明

補足

日時の取得
$YT¥n

時刻取得(2)$YT 1¥n【正常時】$YT=OK datetime¥n
出力例として$YT=OK 2016/05/14 15:52:23などのように「年（4バイト）‘/’月（2バイト）‘/’日（2バイト）‘ ’（ス 日時はJST
ペース1バイト）時（2バイト）’:’分（2バイト）’:’秒（2バイト）」でリ
ターン値が返ってくる。
$YT=NG errno¥n121:コマンドの形式に誤りがある
errnoの後にエラー情報を出
122:内部エラー（日時の取得に失敗した）
力する場合ありアンテナ接続と正しいSIMカードの設定で正確な時刻が取得できる
本コマンドの最初の実行時にインターネット上の時刻サーバから正しい日時を取得して、HL8548-Gのリアルタイムクロック(RTC)に設定して保持する。2回目以降の実行では、RTCから時刻を読み出す。

時刻サーバから日時を取得しなおす

引数

datetime
応答値【エラー時】
errno
前提条件

①

補足事項

①

ファームウェア起動後に「＄YT」を起動すると初回のみ5秒ほど掛って時間を取得する。
その後２回目以降は、瞬時に取得できる。

35

８．SYSTEM TIME ②■ 事例：日時取得表示のサンプルプログラム■Arduinoでのサンプルスケッチ#include <SoftwareSerial.h>SoftwareSerial Serial3g(4,5);
void setup() {Serial.begin(38400);
Serial3g.begin(38400);
delay(30000);
Serial.println("begin System Time");Serial3g.println("$YT");
while (!Serial3g.available()) ;String rt = Serial3g.readStringUntil('¥n');
Serial.print(rt);Serial.print("¥r¥nend");}void loop() {}【補足】取得した時間が間違っている場合
１）正しいSIMカードが設定されているかを確認
２）アンテナ接続が正しく接続されているかを確認
３）アンテナ感度が良い環境かどうかを確認（参照：＄YR)
４）正しい時間取得までに5 秒ほど掛る※2回目以降の取得は瞬時となる

36■実行モニタ画面（正常時）
begin System Time
$YT=OK 2016/05/13 15:50:53
end■時間取得関数（例）String datetime() {String dtime;
uint32_t tim=millis();do {Serial3g.println("$YT");
while (!Serial3g.available()) ;dtime = Serial3g.readStringUntil('¥n');if (millis() – tim > 60000) return “”;} while (dtime.indexOf("20") < 0);return dtime.substring(7);}※注意：正しいSIMカードやアンテナ接続がされていないと時間取得ができません。

９．AIRPLANE MODE ①■ エアプレーンモード（機内モード：省エネモード）の取得・設定
項目
機能分類
機能名
コマンド形式
引数値など
System
Airplane mode
モード取得
モード切替
mode
【正常時】
mode

応答値
【エラー時】
errno
前提条件

補足事項

①

説明

補足

３GIMのエアプレーン（機内）モードを切り替える$YP¥n$YP mode¥n
設定するモード（0: 通常モード、1:エアプレーンモード）$YP=OK mode¥n
設定後のモードを返す
０：通常モード
１：エアプレーン（機内）モード$YP=NG errno¥n181：コマンド形式またはモードの値がおかしい
182：内部エラー（エアプレーンモードの変更ができない）
gw3gのバージョンがR1.3以降のみで利用できる①

エアプレーンモードでは、＄YBおよび＄YP、＄YEコマンド以外のコ
マンドは利用できない。

②

エアプレーンモード時の消費電流は実測値で約10ｍAである。

③

エアプレーンモード中でも、SMSの受信は可能である。

SMSが利用できるSIMの場合

補足：本エアプレーンモード時は、３GIMの消費電流を数ミリAほどに抑えることができます。
完全に消費電力をゼロにするには、３GIMの＃１ピンをHIGHにすることで、電源をOFFにできます。

37

９．AIRPLANE MODE ②■ 事例：エアプレーンモード値の取得サンプルプログラム■Arduinoでのサンプルスケッチ#include <SoftwareSerial.h>SoftwareSerial Serial3g(4,5);
void setup(){
Serial.begin(38400);
Serial3g.begin(38400);
delay(30000);
Serial.println("begin AirPlane Mode");Serial3g.print("$YP¥n");while(!Serial3g.available());
String rt = Serial3g.readStringUntil('¥n');
Serial.print(rt);Serial.print("¥r¥nend");}void loop() {}38■実行モニタ画面（正常時）
begin AirPlane Mode
$YP=OK 0
end

１０．AT COMMAND ①■ ATコマンドモードへの切り替え
項目
機能分類
機能名
コマンド形式
引数
応答値
前提条件

値など
SystemAT Pass Through
モード取得
time
【正常時】
①
①

②

補足事項

③

説明

ATコマンドパススルーモードに入る$YA 【time】¥n
待機時間：単位100ミリ秒；（例： time=300 は 30秒間だけモード切替え）$YA=OK¥nATコマンドの機能を理解した上で使用のこと。
利用できるATコマンドの詳細は「AT Commands Interface Guide Sierra Wireless社のサイAirPrime HL6 and HL8 Series」を参照のこと。
トで公開
例えば、ATコマンドでプATコマンドの使用に制限はないため、HL8548-Gの設定を任意に変更するこロファイルの設定等を変えとができる。しかし、変更した設定等によっては、gw3gファームウェアの動てしまうと、3G通信がで作に支障を来たす場合があるので、十分の留意すること。
きなくなる可能性がある。
ATコマンドパススルーモードから抜けるには、以下のいずれかの方法を使用①・②共に初期起動時に戻する：る。「Welcome to①PWR_ONピンを制御して、3GIMの電源を入れなおす。
3GIM(v*)」応答②「AT+CPOF」コマンドを実行して3GIMをリセットする。

事例：アシストGPSを使う場合、以下のようなATコマンド設定を行います。
(以下の「$YA 1」で100ミリ秒間だけATコマンドパススルーモード）
Serial3g.println(“$YA 1”);delay(10);Serial3g.println(“at+wppp=2,4,¥”username¥”,¥”password¥””);※usernameとpasswordは、SIMカードのAPN情報のユーザ名とパスワード＜本マニュアルP.50参照＞

39

補足

１０．AT COMMAND ②
HL8548-GのATコマンドは、シエラワイヤレスサイトから以下の資料をダウンロードできます。
ドキュメント名（AirPrime_HL6_and_HL8_Series_AT_Commands_Interface_Guide_Rev12_0.pdf）【注意点】
ATコマンドでHL8548Gの特殊な設定を行った場合には、LPC812から制御不能となることがあり、３GIMが利用できなくなる場合がございます。
ATコマンドで操作する場合には、充分な知識を得た上で、ご利用頂く事お薦めいたします。

LPC812（gw3g）$YA「$YA 300」だと30秒後に、「>>」でATコマンドモードが終了してgw3gモードに戻る

40

at+cpofまたは＃1ピンをHIGH/LOW切換え

HL8548-G（ATコマンド）

２．SMS（ショートメッセージ）関連〈注意〉 ショートメッセージは、SIMカードがショートメッセージ対応でないとご利用いただけません。

41

１．SMS SEND ①■SMS(ショートメッセージ）の送信
項目
機能分類
機能名
コマンド形式

値など
SMS
SEND
msn

引数

messageencode【正常時】【エラー時】

応答値

errno
①

前提条件

②
①

補足事項
②

42

説明

補足

SMSを送信する$SS msn "message" [encode]¥n
encode=ASCII と同じ送信先の電話番号（ハイフォン無しの数字のみで指定）送信するメッセージ（制御文字は使用不可、UNICODEはサポー 「"」は「¥"」として記述、最大120バ
トしない）
イトまで
"ASCII" または "UNICODE"のいずれか$SS=OK¥n$SS=NG errno ..¥n または $SS=NG errcode¥n401：引数指定エラー
402：BUSYエラー（既にSMS送信中、送信エラー等）
409：encodeでUNICODEは指定できない
3GIM(V2)ではASCIIのみ利用可能
音声サービス(SMS含む)が利用できる状態であること。
通常・SMSは従量課金制であるので、送信回数には留意が必要 データ通信専用SIMでは利用できないである。
ケースが多い点も注意が必要である。
文字コードがASCIIの場合でも、SMSとして利用できない文字が存在する。
送信できるメッセージの最大長は120バイト以内であるが、送信先の携帯事業者によっては文字数の制限がより厳しい場合がある。その場合は、メッセージの一部しか届かない場合もある。

１．SMS SEND ②■事例：SMS(ショートメッセージ）送信のプログラム■Arduinoでのサンプルスケッチ■実行モニタ画面（正常時）#include <SoftwareSerial.h>begin SMS Send
SoftwareSerial Serial3g(4,5);$SS=OK
void setup(){end
Serial.begin(38400);
Serial3g.begin(38400);
delay(23000);
Serial.println("begin SMS Send ");Serial3g.print("$SS 08012345678 ¥"Hello! SMS Send¥" ASCII¥n");
String rt="";do{while (!Serial3g.available()) ;＄SS=OKまたは＄SS=NGでない場合繰り返し
rt = Serial3g.readStringUntil('¥n');
Serial.print(rt);
スマホに送られてきたSMS} while (! rt.startsWith("$SS="));
Serial.print("¥r¥nend");}void loop() {}※ SMS（ショートメッセージ）の送信の応答性は、必ずしもリアルタイム性・即時性があるとは限りません。（タブレインの調査による）※ SMS （ショートメッセージ）は、NTTドコモでは1件あたり3円（税別）となっていますので、大量送信では気を付けるようにしてください。

43

２．SMS RECEIVE ①■SMS(ショートメッセージ）の受信
項目e
機能分類
機能名

値など
SMS
RECEIVE

index
option【正常時】
msn

受信したSMSを読み出す$SR¥n$SR index [option] ¥n
SMSの格納スロット番号（1～20）
日時出力の有無：1で出力あり、指定なし時は出力なし$SR=OK msn "message"¥n
受信したSMSの送信元の電話番号（ハイフォン無し）

message

受信したSMSのメッセージ【正常時２】
date【エラー時】$SR=OK msn date "message"¥n
SMSの受信日時$SR=NG errno¥n412：SMSを受信していない
413：内部エラー
401：コマンド形式のまちがい
SIMカードがSMSオプション利用できること
通常、複数のSMSを同時に受信しない場合は、特にindexを指定しない「$SR」でSMSを読み出すことができる。
受信したSMSは、20個ある格納スロットのいずれかに格納される。
「$SC」コマンドで受信したSMSがある場合は、通常はindex=1のス
ロットに格納されるが、そこにすでにSMSが格納されている場合は別の空いているスロットに格納される。そのため、index=1～20を順に指定して、各スロットにSMSが格納されているかどうかを調べる処理が必要となる。

コマンド形式
引数

応答値

errno
前提条件

①
①

補足事項
②

44

説明

補足

省略時は1
「"」は「¥"」として記述
最大11バイトASCIIまたはUNICODE、最大100バイトoption=1指定時
日時の形式は$YTと同一

２．SMS RECEIVE ②■事例：SMS（ショートメッセージ）の受信サンプルプログラム■Arduinoでのサンプルスケッチ#include <SoftwareSerial.h>SoftwareSerial Serial3g(4,5);
void setup(){
Serial.begin(38400);
Serial3g.begin(38400);
delay(23000);
Serial.println("begin SMS Receive ");Serial3g.println("$SR");
String rt="";while (!Serial3g.available()) ;rt = Serial3g.readStringUntil('¥n');
Serial.print(rt);Serial.print("¥r¥nend");}void loop() {}■実行モニタ画面（正常時）
begin SMS Receive$SR=OK 08012345678 " Hello! SMS Send "end※ エアプレーンモード時でも、SMS（ショートメッセージ）は受信できます。

45

３．SMS CHECK ①■SMS（ショートメッセージ）の受信確認
項目
機能分類
機能名
コマンド形式
引数
応答値

値など
SMS
CHECK
チェック

SMSを受信しているかどうかをチェックする
$SC¥n

SMS削除

$SC 1¥n

－
【正常時】
exist

説明

補足

すでに受信しているSMSすべてを削除する$SC=OK exist¥n0： SMSをまったく受信していない時
1： SMSを1つ以上受信している時

前提条件
補足事項

①

SMS配送遅延や電波状態等によりSMSの再送が発生した場合、
左記のようなSMSの受信状態を$SCコマンドで受信したSMSがあるにも関わらず、$SRコマンド 避けるには、SMSは一度に一つで受信したSMSをうまく読み出せないケースが発生する。このよ ずつ送信・受信を行い、3GIM側
うな場合は、「$SC 1」を実行することでおかしくなったSMSの に複数のSMSを溜めないような受信状態をクリアすることができる。
利用方法を推奨する。

【SMS全般の留意事項】
１）受信したSMSは、$SRで読み出さない限り、HL8548-G内の不揮発性メモリ（電源を切っても内容が保持されるメモリ）に記録される。そのため、3GIM(V2)を利用するアプリケーションにて、適当なタイミング（例えば初期化時）で溜まっているSMSを適宜読み捨てる処理が必要となる。溜まっているSMSをすべて読み捨てるには、「$SC 1」を実行する。
２）SMSの受信では、3GIMの電波状態や電源状態等により、あるいは通信事業者側の配信遅延等により、受信できなかったSMSを後で受け取る場合があるため即時性が要求されるような利用方法では十分に留意する必要がある。

46

３．SMS CHECK ②■事例：SMS（ショートメッセージ）受信サンプルプログラム■Arduinoでのサンプルスケッチ#include <SoftwareSerial.h>SoftwareSerial Serial3g(4,5);
void setup() {Serial.begin(38400);
Serial3g.begin(38400);
delay(23000);
Serial.println("begin SMS Check ");Serial3g.println("$SC");
while (! Serial3g.available()) ;String rt = Serial3g.readStringUntil('¥n');
Serial.print(rt);Serial.print("¥r¥nend");}void loop() {}47■実行モニタ画面（正常時）
begin SMS Check$SC=OK ０
未受信
endbegin SMS Check$SC=OK １
受信end※ SMS受信は、即時性がないため、しばらく何回か受信確認が必要となる場合があります。

３．GPS関連
GPS利用時は、GPS専用アンテナが必要です。
（別売のGPSフレキアンテナをご利用ください）48

１．LOCATION GPS ①■ GPS(全地球測位システム）の取得コマンド（次頁につづく）
項目
機能分類
機能名
コマンド形式値など
GPS
LOCATE

method引数
optionrepeatCount

説明

補足

測位を行う。
$LG method [option [repeatCount]]¥n
測位の方法（下記のいずれかを指定：現時点任意文字受付可）
任意文字入力時はMSBASED: GPSで測位、GPSが利用できない時は3Gネットワークを利用
MSBASEDとなる（本文字列は
MSASSISTED: 3Gネットワークを利用して測位（A-GPS）
３GIM V1.0用）
STANDALONE: GPS単体で測位測位のオプション
0: 緯度・経度を表示（V1.0と同じ）
1: 緯度・経度の他にUTC、品質、捕捉衛星数、高度を出力
省略時は０2:＄GPGGAセンテンスの生データを出力（ダブルクォート付）
3: NMEAフォーマット（各NMEAセンテンス）出力※
9:ロケーションサービスを停止（SLEEP）させる（methodは任意文字/’x’などでも可）
測位・出力の回数（opthion=0,1,2の場合）または行数（option=3の場合）
省略値は１
１~100までの回数を指定（出力間隔は測位状況によるが1秒間隔以上）
次頁につづく※NMEAフォーマットは、GPSの出力フォーマットで、主に以下の様なセンテンスとなっています。（以下参考）
センテンス

NMEAセンテンス内容（概要）

備考＄GPGGA

UTC,緯度,N,経度,E,品質,使用衛星数,水平精度低下率,海抜高さ,M,ジオイド高さ,M, 差動基準地点ID,チェックサム

at+gpsnmea=1,,1＄GPGSA

モード,特定タイプ,衛星番号,位置精度低下率,水平精度低下率,垂直精度低下率,チェックサム

at+gpsnmea=1,,2＄GPRMC

UTC,A,緯度,N,経度,E,移動の速度,移動の真方位,日付,磁北と真北の間の角度の差,方向,モード,チェックサム

at+gpsnmea=1,,449

１．LOCATION GPS ②■ GPS(全地球測位システム）の取得コマンド（つづき）
項目

値など
【正常時】
latitudelongitude
utc
quality

応答値

numberheightgpgga
nmea_sen【エラー時】
errno

前提条件
補足事項

①
①
②
③

説明
補足
option=0の時$LG=OK latitude longitude¥noption=1の時$LG=OK latitude longitude utc quality number height¥noption=2の時$LG=OK “gpgga”¥noption=3の時$LG=OK ¥nnmea_sen¥n・・・
緯度（北緯、9.99999形式、ただし桁数は場合により可変）
option=0の時
経度（東経、9.99999形式、ただし桁数は場合により可変）
世界標準時間（協定世界時） 日本は9時間プラスする必要がある
位置特定品質。０：位置特定できない、１：GPS（標準測位サービス）モード、２：
option=1の時
differencetial GPS（干渉測位方式）モードの何れか
上記含む
捕捉衛星数
GPSアンテナの海抜高さ（ｍ）
NMEAで規定されている＄GPGGAセンテンスの生データ（ただし末尾の改行は削除）
option=2の時
各NMEAフォーマット出力
option=3の時$LG=NG errno¥n501：引数指定エラー
508：GPS測位エラー（タイムアウトエラー：３分間）
509：BUSYエラー（すでに測位中）
GPSアンテナが正しく装着されてること
測位には、初回には数分以上の時間がかかる場合がある。
AGPSサーバとして、Googleのロケーションサーバを利用する。
repeatCountを2以上で指定した場合は、指定回数の出力が終わるまでは制御は戻らない（次のコ
マンドは受け付けない）※ 短時間でGPS取得するには、Assisted GPS をご利用ください。Assisted GPSについては、50

前頁よりつづく１．LOCATION GPS ②■事例：GPS取得プログラム■Arduinoでのサンプルスケッチ#include <SoftwareSerial.h>SoftwareSerial Serial3g(4, 5);const unsigned long baudrate = 38400;
void setup() {Serial.begin(baudrate);
Serial3g.begin(baudrate);
pinMode(7,OUTPUT);
digitalWrite(7,HIGH);
Serial.println("begin Location GPS");
delay(35000);}
void loop() {static boolean sw=true;if(sw) {Serial3g.write("$LG MSBASED¥n");
Serial.println("$LG MSBASED");}
sw=false;
while(!Serial3g.available());
String rt = Serial3g.readStringUntil('¥n');
Serial.println(rt);if(rt.startsWith("$LG=NG 508")){ sw=true;}else if ( rt.startsWith("$LG=OK")) {Serial.println("end "); while(1);}if(rt.startsWith("$LG=NG 509")) sw=false;}

51■シリアルモニタ画面（正常時応答）
begin Location GPS$LG MSBASED$LG=OK 35.62212345 139.5912345
end

begin Location GPS$LG x 9
$LG=OK
end■GPS取得関数
String GPSget() {Serial3g.println("$LG MSBASED");
String rstr;
unsigned long tim = millis(); // time set(ms)do{ while(!Serial3g.isListening());
rstr=Serial3g.readStringUntil('¥n');if(rstr.length()>0) Serial.println(rstr); //debug print....
if(rstr.indexOf("$LG=NG 508")==0) Serial3g.println("$LG MSBASED");}while(!(rstr.indexOf("$LG=OK")==0));
return(rstr.substring(7));}

【補足説明：初回のGPS取得できない理由】※ ＄LG=NG 508 (T/O)が時間オーバで返ってくるとき
１）屋内などのGPS衛星がとらえられない→ なるべく屋外などで電波状態が良い環境で実行
２）数分でGPS取得できない→ 初回は３分以上ほどかかる場合もあるので何度か実行
３）アンテナや電源の不備
・GPSアンテナが正しく接続されていない
・GPSアンテナの向きが悪い
・外部電源供給が不足している
４）パソコンなどの近くでは電波障害でGPS取得しにくい→ パソコン本体などから３GIMを離して実行する

２．LOCATION GPS（Assisted GPS）
本Assisted GPSは、衛星の情報を３G通信基地局から受信し、いち早く位置情報を取得する技術です。

■Arduinoでのサンプルスケッチ

本３GIMでは、ATコマンドモードでのAssisted GSP機能を実行させるための以下の２行を実行しておくことで、切り替えることができます。

#include <SoftwareSerial.h>SoftwareSerial Serial3g(4, 5);#define BAUDRATE 38400$YA １
at+wppp=2,4,”ユーザ名”,“パスワード”

ここで「$YA １」は、ATコマンドモードに0.01秒間入ることになります。
次の「at+wppp=…」でのユーザ名とパスワードは、利用しているSIMカードのプロファイル情報となります。

52

void setup() {Serial.begin(BAUDRATE);
Serial3g.begin(BAUDRATE);
pinMode(7,OUTPUT);
digitalWrite(7,HIGH); delay(100);
digitalWrite(7,LOW);
Serial.println(" Start");delay(14000);
Serial3g.println("$YA 1");delay(5);Serial3g.println(“at+wppp=2,4,¥“ユーザ名¥”,¥”パスワード¥"");
delay(100);
Serial3g.println("$LG x 1 3");}
void loop() {if (Serial3g.available() > 0)
Serial.println(Serial3g.readStringUntil('¥n'));if (Serial.available() > 0)
Serial3g.println(Serial.readStringUntil('¥n'));}４．Web関連

53

１．HTTP GET ①■HTTP GETによるネット接続
項目
値など
機能分類
Web
機能名
GET
コマンド形式説明HTTP/GETを指定されたURLへ送信して、レスポンスを取得する$WG url ["header"]¥nurl

GETリクエストを送信するURL（例えば、"http://www.google.co.jp/"等）

headerヘッダ情報（例えば、"Authorization: Basic QWxhZGRpblc2FtZQ=="等)

引数

応答値

前提条件

補足事項

54

【正常時】
$WG=OK nbytes¥nresponse¥nnbytes
レスポンス文字列のバイト数（末尾の'¥n'は含まず）
response
レスポンスの文字列【エラー時】 $WG=NG errno¥n301：コマンド形式または引数指定エラー（urlの指定間違いも含む）
errno
303～308：タイムアウトまたは内部エラー
マイナス値：HTTPステータスコードの符号をマイナスにした値①
パケット通信サービスが利用できる状態であること。
②
ヘッダ情報の指定は、gw3g R2.0以降のみで利用できる①
レスポンスにはヘッダ情報は含まれず、ボディ情報のみが含まれる。
②
レスポンスの文字コードは、urlで指定されたサーバに依存する。
③
HTTPのバージョンは「1.1」としてGETまたはPOSTする。
④
ヘッダにはUserAgentプロパティは含まれない。
本コマンドでは、レスポンスボディが大きい場合は、先頭の一部しか取得でき⑤ない。ボディが大きい場合でもすべてを取得したい場合には、TCP機能を利用する。
urlの長さとheaderの長さを合わせて、最大1024バイトまでとする。ただし、⑥
urlに含まれるホスト名は最大96バイトまでとする。

補足

ボディ部のみ取得できる
カギ括弧［］は、実際は不要
URLエンコードされていること
先頭に"http://"または"https://"を含むこと$エンコードされていること。
Hostプロパティは省略可
最大1023
バイナリデータも取得可能

タイムアウトは30秒設定
値の範囲はｰ400～-599
プロファイル設定が正しい事

HTTP/GETのレスポンスボディが大きい場合、本コマンドの実行には最大35秒程度の時間がかかる１．HTTP GET ②■事例：ネット接続サンプルプログラム■シリアルモニタ画面（正常時応答）■Arduinoサンプルプログラム#include <SoftwareSerial.h>SoftwareSerial Serial3g(4,5);
void setup() {Serial.begin(38400);
Serial3g.begin(38400);
delay(23000);
Serial.println("begin HTTP GET");delay(1000);
Serial3g.println(" ("$WG http://tabrain.jp/demo/httpGET_test.txt");
delay(1000);
unsigned long tm = millis();while (millis() - tm < 35000) {while (Serial3g.available()) {char c= Serial3g.read();Serial.print(c);}}Serial.print("¥r¥nend");}void loop() {}begin HTTP GET$WG=OK 44
Tabrain Web site
Complete access from 3GIM

end

■www.tabrain.jp/demo/httpGET_test.txtのファイル内容
Tabrain Web site
Complete access from 3GIM

サンプルデータ

URLコードの変換が必要が文字（５文字）
!

文字
コード
文字
コード

55

"

#

$

%

&

'

(

)

*

+

,

-

.

/

%20 %21 %22 %23 %24 %25 %26 %27 %28 %29 %2A %2B %2C %2D %2E %2F
:

;

<

=

>

?

@

[

¥

]

^

_

`

{

|

}

~

%3A %3B %3C %3D %3E %3F %40 %5B %5C %5D %5E %5F %60 %7B %7C %7D %7E

２．HTTP POST ①■HTTP POSTによるネット接続
項目
機能分類
機能名
コマンド形式
引数

応答値

値など
Web
POST

補足事項

HTTP/POSTを指定されたURLへ送信して、レスポンスを取得する$WP url "body" ["header"]¥nurl

POSTリクエストを送信するURL

bodyheader【正常時】
nbytesresponse【エラー時】POSTするボディ
ヘッダ情報$WP=OK nbytes¥nresponse¥n
レスポンス文字列のバイト数（デコード前のサイズ）
レスポンスの文字列（エンコードされた文字列）$WP=NG errno ..¥n301：コマンド形式または引数指定エラー（urlの指定間違いも含む）
303～308：タイムアウトまたは内部エラー
マイナス値：HTTPステータスコードの符号をマイナスにした値
パケット通信サービスが利用できる状態であること。
全ての引数の長さの合計は改行'¥n'を含み1088バイト以下であること。
レスポンスにはヘッダ部は含まれず、ボディ部のみが含まれる。
レスポンスの文字コードは、urlで指定されたサーバの実装に依存する。
HTTP GETの補足事項を参照のこと

errno※

前提条件

説明

①
②
①
②
③~⑥

※「errono」は、WiKiページなどで補足説明していきます。

56

補足

カギ括弧［］は、実際は不要
最大256バイト（$エンコードされていること）
最大1024バイト（〃）
最大256バイト（〃）、省略可
最大1023バイト
バイナリデータも取得可能

値の範囲はｰ400～-599
プロファイル設定が正しいこと

２．HTTP POST ②■事例：HTTP POSTによるツイート参照
本事例は、後述しています「3GIMでのツイッター連携使用例」
を参考にしてください。

■本関数は、$WG または ＄WPを含んだコマンド文字列を引数として送る関数//============== $WG & $WP command ==============
boolean _3G_WGP(String command) {Serial3g.println(command);
String rstr;
unsigned long tim = millis(); // time set(ms)do{while(!Serial3g.available ());
rstr=Serial3g.readStringUntil('¥n');} while (rstr.indexOf("$W") != 0 && (millis() - tim) < LIMITTIME);
return (rstr.indexOf("$W") == 0);}//==========================================

ここで Serial3g は、シリアル通信ポート
LIMITTIMEは、制限時間（14000msec）を設定のこと

57

５．TCP/IP関連58

１．TCP/IP READ
■コネクションからのデータ読み込み
項目
機能分類
機能名
コマンド形式
引数

値など
TCP/IP
READ
maxbytes【正常時】
nbytesdata

応答値【エラー時】

errno

前提条件

補足事項

①
②
①
②

③

59

説明

補足

現在のコネクションからデータを読み出す
ノンブロッキングで動作する$TR maxbytes¥n
読み出すデータの最大長（バイト）最大1024$TR=OK nbytes¥ndata¥n
読み出したデータのバイト数（≦maxbytes）、このバイト数
指定バイト数以下の場合もあるには末尾の¥nは含まない
gw3g R2.0からバイナリデータも取扱読み出したデータ
可$TR=NG errno ..¥n631：コマンドの指定、または引数に誤りがある
633：READエラー
635：コネクションがない（未接続）
636、637：コネクションのステータスのエラー
639：タイムアウトエラー
タイムアウト時間は60秒
パケット通信サービスが利用できる状態であること。
プロファイル設定が正しいこと
TCP/IPコネクションが確立されていること
相手から受信したデータをそのまま加工せずに取得する
呼び出された時に３GIMに届いているデータを、最大
msxbytes分まで読み出す。
R2.0から常にノンブロッキングで動作
常にブロッキングはせず、データがない時は nbytes=0 で直ちに戻る。
読み出す前にコネクションの状態チェックを行うため、コネクションが切断されている場合には直ちに制御が戻る。

２．TCP/IP WRITE■コネクションへのデータ書き出し
項目
機能分類

値など
TCP/IP

機能名

WRITE

コマンド形式
引数

前提条件

書き出すデータ【正常時】 $TW=OK nbytes¥nnbytes
書き出したデータのバイト数（実際に相手に書き出したサイズ）【エラー時】 $TW=NG errno ..¥n621：コマンドの指定、または引数に誤りがある
623：WRITEエラー
errno
625：コネクションがない（未接続）629：タイムアウトエラー①
パケット通信サービスが利用できる状態であること。
②
TCP/IPコネクションが確立されていること
①

補足事項

②

③

60

補足

現在のコネクションへデータを書き出す$TW "data"¥n

data

応答値

説明

ダブルクォートを省略することもできるが、推奨しない。
最大1080バイトまで。ダブルクォートで囲む場合は$エンコードされていること。
最大1024バイト

タイムアウト時間は60
プロファイル設定が正しいこと

バイナリデータを送りたい場合は、最低限、dataとして指定できるデータは$エスケープシーケンスにてエンコー 0x00(ヌル)、0x0a(LF)、0x22(")、
ドされている必要がある。
0x24($)の4つのバイト値を＄でエスケー
プすればよい。
dataとして指定できるデータは、エンコード前の生データのサイズが1024バイト以下であること。ただし、指定できるデータdataの長さ
は、コマンド文字列やダブルクォート等を含みコマンド行の最大長(改行を含み1088バイト)以下であること。
書き出す前にコネクションの状態チェックは行わない。そのため、相性能を優先するために、コネクションの存手方がコネクションを切断している場合は、タイムアウト時間が経過
在チェックを毎回行わない仕様としている。
した後にエラーとなって制御が戻る。

３．TCP/IP CONNECT■コネクション接続
項目
機能分類
機能名
コマンド形式
引数

値など
TCP/IPCONNECT
host_or_ip
port
【正常時】
【エラー時】

応答値
errno

前提条件

①
②

補足事項

①

説明

補足

TCP/IPコネクションを接続する$TC host_or_ip port¥n
接続するホスト名またはIPアドレス
接続するポート番号
1～65535の範囲$TC=OK¥n$TC=NG errno ..¥n
601：引数がおかしい
603：すでに接続済み
604：コネクションエラー(ホストやポートが間違っている場合
タイムアウト時間は60秒を含む)
パケット通信サービスが利用できる状態であること。
プロファイル設定が正しいこと
TCP/IPコネクションが確立されていること
TCP/IPコネクションは一度に一つだけ使用できる。コネクショ 例えば、TCP機能であるサーバとコンはWeb機能とは独立しているため、Web機能と同時に利用す ネクションをつないだままで、Webることができる。
機能を利用できる

GET / HTTP/1.1
Accept: image/gif, image/jpeg, */*Accept-Language: ja Accept-Encoding: gzip, deflate User-Agent: Mozilla/4.0 (Compatible; MSIE 6.0; Windows NT 5.1;) Host: www.xxx.zzz
Connection: Keep-Alive61

４．TCP/IP DISCONNECT■コネクション切断
項目
機能分類

値など
TCP/IP

機能名

DISCONNECT

コマンド形式
引数

応答値
errno

補足事項

62

補足

現在のTCP/IPコネクションを切断する
$TD¥n

【正常時】
【エラー時】

前提条件

説明

①
②
③

$TD=OK¥n$TD=NG errno ..¥n611：コマンドの形式に誤りがある
614：内部エラー(Close)
615：接続されていない
パケット通信サービスが利用できる状態であること。
TCP/IPコネクションが確立されていること
read中あるいはwrite中ではないこと

プロファイル設定が正しいこと

５．TCP/IP STATUS■コネクション状態の取得および状態設定
項目
機能分類
機能名
コマンド形式
引数

値など
TCP/IPSTATUS
取得
option【正常時】
status

応答値

tcpnotif

説明
現在のTCPコネクションの状態を取得する$TS [option]¥n1：付加情報を出力する$TS=OK status¥n$TS=OK status tcpnotif remainedBytes receivedBytes¥n0：CLOSED（接続なし）
1：DISCONNECTING
2：DISCONNECTED（接続待ち）
3：CONNECTING
4：CONNECTED（送受信待ち）
下記の【TCP機能全般の留意点】を参照

remainedBytes 未送信状態のデータのバイト数
受信状態のデータのバイト数（$TRコマンドでの読み出し可能なバ
receivedBytes
イト数）【エラー時】$TS=NG errno ..¥n641：引数がおかしい
errno
642：ステータス取得エラー
前提条件
補足事項

63

①

本コマンド実行時にTCPコネクションの状態を取得して結果を返却するため、正確な情報が得られる。

補足

省略時は詳細情報は出力しない
option省略時
option=1の時

オプション(1)が指定された時のみ出力される
同上
同上

６．TCP/IP GETSOCKNAME■コネクション状態のIPアドレスとポート番号取得
項目
機能分類

値など
TCP/IP

機能名

Get Sockname

自分のIPアドレスを取得する

コマンド形式
引数

取得

$TN¥n

【正常時】
ipAddr【エラー時】$TN=OK ipAddr ¥n
自分のIPアドレス(IP v4のみサポート)$TN=NG errno ..¥n663：コマンドの形式に誤りがある
662：接続していない
661：IPアドレス取得エラー
パケット通信サービスが利用できる状態であること。 プロファイル設定が正しいこと
TCP/IPコネクションが確立されていること

応答値

errno
前提条件
補足事項

64

①
②

説明

補足
ポート番号は取得できない

７．TCP/IP TUNNEL WRITE■現在のコネクションにダイレクトにデータ書き出し
項目
機能分類
機能名
コマンド形式
引数

返却値

前提条件

補足事項

65

値など
TCP/IP
TUNNEL
WRITE

説明
現在のコネクションへダイレクトにデータを書き出す

nbytes$TT nbytes¥ndata
書き出すデータのバイト数

data

書き出すデータ

補足
サイズの大きいバイナリデータをサーバへ送信する手段として最適である。
dataの後に改行は不要である
最大32000バイト$エンコードは不要、バイナリデータもそのままでOK【正常時】$TT=OK nbytes¥nnbytes
書き出したデータのバイト数【エラー時】 $TT=NG errno ..¥n621：コマンドの指定、または引数に誤りがある
errno
623：WRITEエラー
625：コネクションがない（未接続）①
パケット通信サービスが利用できる状態であること。
プロファイル設定が正しいこと②
TCP/IPコネクションが確立されていること
dataとして指定できるデータの内容はバイナリデータでもよい。$エン①
コードの必要はなく、ヌルデータ(0x00)を含めてそのまま書き出すことができる。
最初に指定したデータサイズ(バイト数)分を必ず書き出す必要がある。
②
書き出すデータのサイズが最初に指定したサイズに満たない場合は、タ
イムアウト後に半角スペースが自動で補填される。
書き出す前にコネクションの状態チェックは行わない。そのため、相手 性能を優先するために、コネクションの③方がコネクションを切断している場合は、タイムアウト時間が経過した 存在チェックを毎回行わない仕様として後にエラーとなって制御が戻る。
いる。
ボーレートを115200bpsに設定している場合に限り、概ね1024バイト④を送信するたびに10ミリ秒程度のディレイ時間を設けることを推奨する。

８．TCP/IP 利用サンプルプログラム ①■事例：TCP/IP関連一覧のコマンドを使ったサンプルプログラム■Arduinoサンプルプログラム#include <SoftwareSerial.h>SoftwareSerial Serial3g(4,5);
void setup() {pinMode(7,OUTPUT);
digitalWrite(7,LOW); delay(100); digitalWrite(7,HIGH);
Serial.begin(38400); Serial3g.begin(38400);
Serial.println("Ready...");
while (true) {unsigned long tim=millis();while (!Serial3g.available() && (millis() - tim) < 15000) ;String st=Serial3g.readStringUntil('¥n');
Serial.println(st);if (st.indexOf(“3GIM")>0)
break;
else if ((millis()-tim) > 15000) {Serial.println("connect error");
while(1) ;}}Serial.println("Start...");
Serial.println("begin TCP/IP sample"); delay(100);
while (!tcpprintln("$TC www.tabrain.jp 80")) ;tcpprintln("$TW ¥"GET / HTTP/1.0$r$n¥"");
tcpprintln("$TW ¥"HOST: www.tabrain.jp$r$n$r$n¥"");
tcpprintln("$TR 200");
tcpprintln("$TD");
Serial.print("end");}void loop() {}66

boolean tcpprintln(String ttc) {String rts="";uint32_t tm=millis();Serial3g.println(ttc);
do {while (!Serial3g.available() && (millis()-tm<30000)) ;rts=Serial3g.readStringUntil('¥n');
Serial.println( rts );} while (rts.indexOf("$T") < 0);char ch;do {ch=Serial3g.read();if (0x20<ch && ch<0x80 ) Serial.print(ch);} while (Serial3g.available());
return (rts.indexOf("=OK") > 0);}９．TCP/IP 利用サンプルプログラム ②■事例：TCP/IP関連一覧のコマンドを使ったサンプルプログラムの出力結果■シリアルモニタ画面（正常時応答）
Ready...
Welcome to 3GIM(v2)
Start...
begin TCP/IP sample$TC=OK$TW=OK 16$TW=OK 24$TR=OK 200
HTTP/1.1 200 OK
Date: Su,14Feb201622:07:39GMTServer:Apache/2.2.23(Unix)mod_ssl/2.2.3
OpnSSL/10.1mLas-Modifed:ri,1Fe2010551:22MTTag:"384595-1172b8c1cadc3"Acce$TD=NG 614
end67

読込みバッファの出力結果（ここでは200バイト出力）

10．TCP/IP 機能の留意点【TCP機能全般の留意点】
1)$TR/$TW/$TT/$TN/$TSでコマンド形式エラー以外のエラーが発生した場合は、一旦、$TDでコネクションを切断して、$TCからやり直すこと。

2) $TSコマンドで取得できるtcpnotifの値の意味は下記の通り：
0 Network error
1 No more sockets available; max. number already reached
2 Memory problem
3 DNS error
4 TCP disconnection by the server or remote client
5 TCP connection error
6 Generic error
7 Fail to accept client request’s
8 Data sending is OK but KTCPSND was waiting more or less characters
9 Bad session ID
10 Session is already running
11 All sessions are used68

６．Profile関連

69

１．PROFILE SET/GET①■SIMカードのプロファイル情報の設定・取得
項目
機能分類
機能名
コマンド形式

引数

値など
PROFILE
SET
設定
取得
apn
user
password

前提条件

①
①

apnの長さ、userの長さ、passwordの長さの合計は、最大51文字まで

補足事項

②

デフォルトプロファイルは、一つだけ保持することができる。本機能で設定したプロファイルは、電源を切っても3GIM内に保持される。

③

出荷時のデフォルト状態では、iijmioのプロファイルが設定されている。

【エラー時】
errno※：例えば「$PS iijmio.jp mio@iij iij¥n」と設定する（特にダブルクォートで囲む必要はないが、囲んでもよい）
一部、ユーザ名やパスワードが無いSIMカードもあり、その場合には設定する必要はありません。
補足：SIMカードのプロファイル情報は、内部メモリに保存されますので、電源を切っても保存されたままとなります。

70

補足

デフォルトのプロファイル情報を設定・取得する$PS apn user password¥n$PS¥n
APN情報（例えば： iijmio.jp)
ユーザ名 （例えば：mio@iij)
認証用パスワード（例えば：iij)$PS=OK¥n$PS=OK ”apn”,“user”,”password”¥n$PS=NG errno¥n211：コマンドの形式に誤りがある
212：内部エラーまたはSIMカード・アンテナなし
有効なSIMカード（利用可能なSIMカード）を装着しておく必要がある。

【正常時】
応答値

説明

※

設定時
取得時

１．PROFILE SET/GET②■SIMカードのプロファイル情報の設定■Arduinoサンプルプログラム#include <SoftwareSerial.h>SoftwareSerial Serial3g(4,5);
void setup(){
Serial.begin(38400);
Serial3g.begin(38400);
delay(35000);
Serial.println("begin Profaile Set");Serial3g.println("$PS iijmio.jp mio@iij iij");
while(!Serial3g.available());
String rt = Serial3g.readStringUntil('¥n');
Serial.print(rt);Serial.print("¥r¥nend");}void loop() {}71■シリアルモニタ画面（正常終了の場合）
begin Profaile Set$PS=OKend■プロファイル設定サンプル（他MVNO製品も同様に設定）
SIMメーカ製品名

設定方法

DOCOMO mopera$PS mopera.net

iijmio$PS iijmio.jp mio@iij iij

iijmobile$PS iijmobile.jp mobile@iij iij

SONET$PS so-net.jp nuro nuro

SORACOM$PS soracom.io sora sora

EXCITE$PS vmobile.jp bb@excite.co.jp excite

HI-HO$PS vmobile.jp lte@hi-ho hi-ho

BMOBILE$PS bmobile.ne.jp bmobile@u300 bmobile

DTI$PS dream.jp user@dream.jp dti

MMT$PS mmtcom.jp mmt@mmt mmt

もくじ
１．Arduinoでのシリアルモニタ操作
２．３GIMでのツイッター連携使用例
３．３GIMでのクラウド連携使用例（１）４．３GIMでのクラウド連携利用例（２）５．３GIMでのクラウド連携利用例（３）６．GPS機能を使った応用例
７．Arduino関連ライブラリ（a3gim2）
８．サンプルツール群

第４章
応用事例プログラミング72

１．Arduinoでのシリアルモニタ操作

73

１．Genuino 101 との接続例
#3
D４

#2
D5

GND
#6

3.3V
#4＆#5
#4
3.3V
#5
3.3V

D4
#3

接続
D5
#2

#6
GND

D7
#1

※Genuino 101の3.3V出力が１Aあるとのことで３GIMと接続してみました。
【注意】場合によっては、外部電源を取る必要があるかもしれません。

74

#1
D7

P.74 のサンプルスケッチを動かしてみてください。簡単に動くはずです。

２．Arduino上での簡単な利用例■ソフトウェア（次頁のmonitor3gim.ino ）をコンパイルし、Genuino101に書き込んで動かしてみてください。

■必要な部品：① Genuino101 （IDEは、「arduino.cc」からダウンロードしてください）② ジャンパワイヤおよびブレッドボード③ マイクロSIMカード■簡単な稼動テスト状況① Arduino IDEのモニタ画面上に立上げメッセージ「Welcome to 3GIM(v2)」が表示された時点で立ち上がった段階です。
② ３GIMの各＄コマンドを入力して応答値を確認してみてください。

75

３．Arduinoシリアルモニタ画面操作スケッチArduinoUNO+3GIMシールド＋３GIM V2.0を接続し、シリアルモニタ画面上でコマンド入力して、その結果を見てみることにしてみましょう。

Arduinoのスケッチは以下のとおりです。

■ シリアルモニタ画面での３GIM入出力プログラム(monitor3gim.ino：*3Gシールド＋Arduinoで利用可能）#include <SoftwareSerial.h>SoftwareSerial Serial3g(4, 5);const unsigned long baudrate = 38400;
void setup() {Serial.begin(baudrate);
Serial3g.begin(baudrate);
pinMode(7,OUTPUT);
digitalWrite(7,HIGH); delay(5);digitalWrite(7,LOW); //3GIMシールド電源ON
Serial.println("Ready.");}void loop() {if (Serial3g.available() > 0) {char c = Serial3g.read();Serial.print(c);}if (Serial.available() > 0) {char c = Serial.read();Serial.print(c); // Echo back
Serial3g.print(c);}}76

本サンプルスケッチは、
シリアルモニタ画面で、コマンドをキー入力することで、応答（レスポンス）を表示確認できるもので、マニュアル操作
でのコマンド/レスポンスが即座に見ることができます。

■ シリアルモニタ画面での操作例
Ready.
赤字：入力
$YV
青字：出力
$YV=OK 2.0$YI$YI=OK 359516050164625$YR$YR=OK -68$YT$YT=OK 2016/02/06 17:55:11$LG MSBASED$LG=OK 35.64189613 139.6041995$WG http://tabrain.jp/demo/httpGET_test.txt$WG=OK 44
Tabrain Web site
Complete access from 3GIM

補足：Arduino IDEのシリアル
モニタ画面の改行モードは「CRおよびLF」に設定のこと

２．3GIMでのツイッター連携使用例（Arduinoの事例）

77

１．３GIMを使ったツイッタ―連携の利用イメージ■TLAの利用
Tweet Library for Arduino【TLA】を利用し、３GIMからツイッタ―にセンサ値をツイートしてみる。

$WP
コマンド

arduinotweet.appspot.com【TLAの機能】

各種 センサ値
無償でアップ78

twitterの認証を、トークンで代行してくれる
http/POSTにより、twitterへ簡単に投稿できる

２．TLA利用手順①①ブラウザで、下記のサイトにアクセスする
http://arduino-tweet.appspot.com/

こちらを選択79

２．TLA利用手順②② ツイッターのアカウント情報を入力する（既にツイッタ―ID登録済の場合には次に進んでください）

ユーザ名かメールアドレス とパスワードを入力（こちらが今後のID/PW）

次に選択

80

３．TLA利用手順③③ トークンを記録しておく（コピー＆ペースト）

カット＆ペーストで選択・複写こちらが必要なトークン

81

４．３GIMでのツイッタ―連携使用例■事例：ツイッタ―にメッセージアップのプログラム#include <SoftwareSerial.h>SoftwareSerial Serial3g(4,5);
const char *server = "http://arduino-tweet.appspot.com:80/update";
const char *token = "YOUR＿TOKEN";
void setup() {Serial.begin(38400);
Serial3g.begin(38400);
Serial.print(" Plsese waite");delay(35000);
Serial.println("Ready");}

Plsese waite
Ready$WP ************$WP=OK 2
wait 1min

ツイートのトークン

void loop() {char msgBuff[300];
char msg[]="Twitter test";
static int no = 0;// 番号のカウントアップ
sprintf(msgBuff,"$WP %s ¥"token=%s&status=%s %d¥"¥n",server,token,msg,no++);Serial.println(msgBuff);
Serial3g.println(msgBuff);
String rt;
do{while(!Serial3g.available());
rt = Serial3g.readStringUntil('¥n');
Serial.println(rt);} while(!rt.startsWith("$WP"));
Serial.println("wait 1min");delay(60000);// ツイートは1分毎とする（制限事項）}

82■実行モニタ画面（正常時）

ツイートされた画面

５．ツイートの読込み①■ツイートされた内容（値や文章）をクライアント側（３G端末側）に読込むサンプル■次頁のサンプルスケッチで実行した結果

ツイートされた内容を読むには、以下のアクセスで可能
http://twansform.appspot.com/ツイッタ―名/text/5＜ブラウザでキー入力すると以下のような表示が返る＞

ツイート数

こちらがツイッタ―結果■今度は、３G通信を使ってツイートされた内容（値や文章）を読み込むには、以下のスケッチなどで行う。

$WG http://twansform.appspot.com/ツイッタ―名/text/行数※ここで ツイッター名は、＠で始まるツイッター名で、＠を取り除
いた後ろの名前。行数は、最新版から取得するツイッター数

83

５．ツイートの読込み②■ツイートされたデータの読込み（３GIMの電源信号（ピン番号＃１）は、Arduino側のD7ピンに接続）#include <SoftwareSerial.h>SoftwareSerial Serial3g(4,5);
SoftwareSerial D300(8,9);
const unsigned long baudrate = 38400;#define LIMITTIME 15000 // ms (3G module start time)
String command = “$WG http://twansform.appspot.com/ツイッタ名/text/5";//============================================
void setup() {Serial.begin(baudrate);
Serial.println(">Ready. ¥r¥n Initilaizing...");
if( _3Gsetup() ) {Serial.println("start");} else {成功するまで実行
Serial.println(" Connect Error ... Stop");while(1);}while(! _3G_WG(command));
Serial.println("end ----");}//============================================
void loop () {}■応用例
ツイートしたことで遠隔制御も可能

84//============== 3G setup =================
３Gシールドの場合
boolean _3Gsetup() {pinMode(7,OUTPUT);
digitalWrite(7,HIGH); delay(1000);// 3Gshield --> digitalWrie(7,LOW);
digitalWrite(7,LOW); delay(100); // 3G shield --> digitalWrite(7,HIGH);
Serial3g.begin(baudrate);//------- 3G module begin & connect --------String str;
unsigned long tim = millis();do{ while(!Serial3g.isListening());
str=Serial3g.readStringUntil('¥n');}while(!(str.indexOf(“3GIM")>0) && (millis() - tim) <LIMITTIME);
if( millis() -tim >= LIMITTIME) {return false;} else return true;}//============== $WG command =================
boolean _3G_WG(String command) {Serial3g.println(command); Serial.println(command); // debug
String rstr;
unsigned long tim = millis(); // time set(ms)do{ while(!Serial3g.isListening());
rstr=Serial3g.readStringUntil('¥n');
Serial.println(rstr); //debug print....
}while(!(rstr.indexOf("$WG=")==0));// $WP return checkif(rstr.indexOf("$WG=OK")==0) {rstr=rstr.substring(7); int N=rstr.toInt();
Serial.println(" Twitter text :" + rstr);
for(int i=0; i<200; i++) {while(!Serial3g.available());
char c=Serial3g.read();Serial.print(c);}return (true);}
こちらを一部追加
return(false);}

３．3GIMでのクラウド連携使用例①（xibely.com ＆ Arduinoの事例）

85

１．xively.comの利用イメージ
無償クラウドxivey.comにデータを蓄積

Trigger

Web/ POST$WP
コマンド
Storage

xively.com
公開

共有
xively.comへアクセス

３GIMを使ってセンサ値などをxively.comにアップ

各種センサ

86

https
(Web API)

スマホ・タブレット・PCなどで、どこからでも閲覧２．xivey.comの利用手順
xively.comは、実績が豊富な無償のクラウドで、日本でも広く利用されています。
まだ、英語版しかありませんが、グラフ表示
やデータのアップやダウンロードだけの利用と考えると、問題なく簡単に使うことができます。
ここでは、本３GIMとセンサなどを使い、このxively.comにデータをアップしていくサンプルをご紹介します。
先ずは、xively.comでの①ユーザ登録が必要で、その後各設定（②deviceの追加と③channelの追加）を行い、それら設定された値（④Feed IDとAPI Keyの確認）を使うことで、プログラミングしていきます。

【利用に当たっての注意点】
xively.comでは、無償の範囲での利用は、制限があります。特にデータのアップは、1分間に数回程度でしかできません。
1秒毎とか頻繁にデータをアップしたりすると、利用できなくなることがあります。
充分に気を付けてプログラミングしてください。

87

注意：最近、新規登録に長期間掛る状況にある① ユーザの登録② deviceの追加③ channelの追加④ Feed IDとAPI Keyの確認

３．xively.com ①ユーザ登録

Login名Password

http://xively.com/ にアクセス

予めユーザ登録しておいてください。

88４．xively.com ②deviceの追加

デバイス名(英数字記号)を入力
ここをクリックして次へ説明文を入力デバイスを追加してくだい89

機密性は無いのでPublicを選択

５．xively.com ③chenellの追加

ID(英数字・記号)を入力
ここをクリックして次へ
タグ、単位、記号を入力

初期値を入力つぎにチャネルを追加

90

６．xively.com ④Feed IDとAPI Keyの確認

FEED_ID

CHANNEL_ID

API_KEY91

７．温度を測って定期的にxively.comへアップ

準備するもの

Arduino UNO R3 など



温度センサ（LM61BIZ）など



ブレッドボード

ジャンパ線（やわらかい線）



3GIM（あらかじめピンヘッダを半田付けしておく）



マイクロSIMカード（3GIMで使えるもの）



3.7Vリチウムポリマ電池（充電してあるもの）、または3.7V出力可能なDC電源

接続方法


3GIMにマイクロSIMを挿入して、ブレッドボードにピンヘッダを刺す。

#6(GND)を電源（リチウムポリマ電池）のGNDとArduinoのGNDに接続、

#5(VCC)を電源（リチウムポリマ電池）の「＋」に接続



#4(IOREF)をArduinoの5V、#3(TX)をArduinoのD4、#2(RX)をArduinoのD5、#1(PWR_ON)をD7に、それぞれジャンパ線で接続する。



温度センサをブレッドボードに刺して、センサのGNDをArduinoのGND、VddをArduinoの5V、Voutを
ArduinoのA0に、それぞれジャンパ線で接続する。
（※ここで、D4,D5,D7およびA0は、Arduino I/Oポート入出力番号）92

８．温度を測って定期的にxively.comへアップ

サンプルスケッチ// Sample sketch for 3GIM
赤文字の箇所は、実際のxively.comの登録内容に沿って修正すること！

#include <SoftwareSerial.h>const int PowerPin = 7; // D7
const int tmpPin = 0; // A0
const char *PostCmd = "$WP https://api.xively.com/v2/feeds/FEED_ID/datastreams/ CHANNEL_ID?_method=put ";const char *Header = "¥"X-ApiKey: API-KEY$r$nContent-Type: text/csv$r$n¥"";// Global variables
uint32_t interval = 60000; // Interval time [mS]
SoftwareSerial Serial3g(4, 5);char body[20];// setup() -- set up device
void setup() {pinMode(PowerPin, OUTPUT);
digitalWrite(PowerPin, LOW); // 3GIM on
Serial3g.begin(38400);
delay(35000); // wait for start up 3gim}
void loop() {// Sense temperature
int tX10 = getTemperature() * 10;// upload sensing data to the xively.com
uploadToCloud(tX10);// sleep a while
delay(interval);
}

93

1min

float getTemperature() {int mV = analogRead(tmpPin) * 4.88;
return ((float)(mV - 600) / 10.0);}
void uploadToCloud(int temp) {// upload temperature
Serial3g.print(PostCmd);
sprintf(body, "¥"%d.%d¥" ", (temp / 10), abs(temp % 10));
Serial3g.print(body);
Serial3g.println(Header);Serial3g.flush();}４．3GIMでのクラウド連携使用例②（M2X ＆ Arduinoの事例）

94

１．M2X（AT&T IoTサービス）の利用イメージ
無償クラウドm2x.att.comにデータを蓄積

Trigger

Web/ POST$WP
コマンド

Storagem2x.att.com
公開共有
m2x.att.comへアクセス

３GIMを使ってセンサ値などをm2x.att.comにアップ

各種センサ

95

https
(Web API)

スマホ・タブレット・PCなどで、どこからでも閲覧２． M2X（AT&T IoTサービス）の利用手順
M2X（AT&T IoTサービス）は、2013年から米国通信事業最大手のAT&Tが、M2MおよびIoTビジネスに向けたサービスを開始したものです。
ArduinoやRasberryPi、Mbedなど、多くのオープンソースハードウェアで利用できる環境を提供したものとなっています。
フリーで使え、センサデータの蓄積・グラフ
表示、データのダウンロードなどができるよ
うになっています。
ただ、時間設定が、世界標準のみで行なっていて、日本時間での表示や日本語表記が可能となりました。
グラフ表示やデータのアップやダウンロード
だけの利用と考えると、問題なく簡単に使うことができます。
その他、トリガー機能が使え、センサ値が閾値を超えたときなどメールやツイッタ―を飛ばすことができます。
ここでは、本３Gシールドとセンサを使い、このm2x.att.comにデータをアップしていくサンプルをご紹介します。
詳細な規約等は、m2x関連の公開情報等をご参照ください。

96① ユーザの登録② device の追加③ stream の追加④ x-m2x-keyの確認

３． M2X（AT&T IoTサービス）のID登録

ID登録へ

http://m2x.att.com/ にアクセス

ID登録
メールアドレス（ユーザID）
およびパスワード97

４．デバイス（Device）の作成登録
デバイス画面へ

デバイス名登録（日本語可）

新しいデバイス
登録画面へ※ deviceIDは、英数文字のキーワードとして自動的に設定されます。

98

非公開：個人利用

公開：共有利用

５．ストリーム（StreamID）の作成登録＜StreamID＞
新しいStream
登録画面へ

Stream表示名（日本語可）
数文字系・非数文字系選択
単位設定※ StreamIDは、入力した名前が設定されます99

６． デバイスIDとスキームIDの登録
デバイス名<deviceID>

デバイス作成画面
でデバイス作成<x-m2x-key>

デバイス作成登録名称

Stream表示名（日本語可）<streamID>100

７．M2Xへのデータアップの書式要件
M2Xへのセンサ値アップは、＄WPコマンドを使って行います。

$WPコマンドを使って、以下の書式の例のような URL と body 、それに header を使って、M2Xクラウドにアップする。
$WP http://api-m2x.att.com/v2/devices/<deviceID>/updates/"{$"values$" : {$" <streamID>$" : [{ $"timestamp$" : $"<date-time>$" , $"value$" : $" <val>$"}]}} ""X-M2X-KEY:<x-m2x-key>$r$nContent-Type:application/json$r$n"※ 以下変数の説明<deviceID>: デバイスID<streamID>: ストリームID<x-m2x-key>: M2Xキー<val><date-time>: データアップするセンサ値: 日時（文字列） 例 “2015-09-20T23:55:36$+09:00”（$+は特殊文字）※ 日時は、日本時間を登録（ただしM2Xでの表示は、グリニッジ標準時となる）

101

８．サンプルプログラム①#include <SoftwareSerial.h>SoftwareSerial Serial3g(4,5);
const unsigned long baudrate = 38400;#define LIMITTIME 35000 // ms (3G module start time)

url,header,bodyの設定

String url = "http://api-m2x.att.com/v2/devices/<deviceID>/updates/ ";String header = "¥"X-M2X-KEY:<x-m2x-key> $r$nContent-Type:application/json$r$n¥"";String body = "¥"{¥$¥"values¥$¥" : {¥$¥"<streamID>¥$¥" : [{ ¥$¥"timestamp¥$¥" : ¥$¥"";//============================================
void setup() {setupSerial.begin(baudrate);
３G初期化
Serial.println(">Ready. ¥r¥n Initilaizing...");
if( _3Gsetup() ) {Serial.println("start");} else {Serial.println(" Connect Error ... Stop");while(1);
温度センサ値を3分間隔}空けてM2Xにアップ}
void loop () {String dtime = datetime(); // Serial.println(dtime); //debug
float temp = analogRead(A1)*0.488 - 60.0; // TABshield temp sensor
if(_3G_WP("$WP " + url + body + dtime + "¥$¥" , ¥$¥"value¥$¥" : ¥$¥"" + String(temp) +"¥$¥"}]}}¥" " +header)){
Serial.println("Data Update complete:" + Serial3g.readStringUntil('¥n')); }else Serial.println("Data Update false...");
delay(180000); //waiting 3min}102

８．サンプルプログラム②103//============== 3G setup =================
boolean _3Gsetup() {3Gシールド用
pinMode(7,OUTPUT);（電源ON)
digitalWrite(7,LOW); delay(1000);
digitalWrite(7,HIGH); delay(100);
Serial3g.begin(baudrate);//------- 3G module begin & connect --------電源On状態から3GIM文字が返却されるまで待機
String str;
unsigned long tim = millis();do{ while(!Serial3g.isListening());
str=Serial3g.readStringUntil('¥n');}while(!(str.indexOf(“3GIM")>0) && (millis() - tim) <LIMITTIME);
if( millis() -tim >= LIMITTIME) {return false;
３G接続状態返却} else return true;}//============== $WP command =================
boolean _3G_WP(String command) {Serial.println(command); // debug ３G POST処理
Serial3g.println(command);$WPコマンド
返却処理
String rstr;
unsigned long tim = millis(); // time set(ms)do{ while(!Serial3g.isListening());
rstr=Serial3g.readStringUntil('¥n');
Serial.println(rstr); //debug print....
}while(!(rstr.indexOf("$WP=")==0) && (millis() - tim) <LIMITTIME);// $WP return check
return (rstr.indexOf("$WP=")==0);}// Get Date & Time (3GIM command)// return --> string "2015-12-23T01:23:45%2B09:00"
String datetime() {$YTによる時間取得
Serial3g.println("$YT");
設定機能
while(!Serial3g.available());
String dtime = Serial3g.readStringUntil('¥n');dtime.replace(" ","T"); dtime.replace("/","-");
return(dtime.substring(7) + "$+09:00");}

９．M2Xにデータアップした事例

104

１０． M2Xからトリガーでツイートする方法
M2Xにアップしているセンサの値をトリガーにして、ツイートする方法を紹介
ツイートするURLは、以下の通り
http://arduino-tweet.appspot.com/update?token=トークン&status=ツイート文

トリガーの設定

トリガー設定の選択

トリガー名（任意）

比較演算

ストリーム（センサ値）

トリガー値

ツイートするURL

トリガーは、M2Xに送られてきたセンサ値の変化を捉え、アクションを起こすものです。
この場合、センサ値がある値より大きいか、小さいかで、URLを起動します。
ここでは、センサ値を見て、ツイッターにツイートするも
のです。

105

変化した際1回のみ変化した際時間間隔ごと設定終了したら「Save」

５．3GIMでのクラウド連携使用例③（Ambient ＆ Arduinoの事例）

106

１．Ambientの利用イメージ
無償クラウドAmbientにデータを蓄積$WP
コマンド

StorageAmbient

https(Web API)

https://ambidata.io

データ送信

閲覧
Ambientへアクセス

３GIMを使ってセンサ値などをAmbientにアップ

各種センサ

107

スマホ・タブレット・PCなどで、どこからでも閲覧２． Ambientの利用手順
AmbientはArduino、mbedなどのオープン
ソースハードウェアから利用できるIoT用のクラウドサービスです。無料で使え、センサ
データの蓄積・グラフ表示などができるようになっています。
チャネル生成後、データを送信すると、煩雑な設定をしなくても自動的にデータがグラフ表示されます。ユーザ登録からグラフ表示までが非常に簡単に行えることが特長の一つです。一方でグラフ種類、2軸表示、表示件数設定などグラフのカスタマイズも強力に行えます。
日本で開発されたサービスで、ユーザインタ
フェースだけでなく、チュートリアルや事例などもすべて日本語で用意されているのも安心です。
ここでは、本３GIMとセンサなどを使い、このAmbientにデータをアップしていくサンプ
ルをご紹介します。
詳細な規約等は、Ambient関連の公開情報等をご参照ください。

108① ユーザの登録② チャネルの作成③ データ送信④ データ確認

３． Ambientのユーザ登録

ユーザ登録へhttps://ambidata.io/ にアクセス

確認メール

109

メールアドレス（ユーザID）
およびパスワード４．チャネル作成

チャネル生成ボタンクリック

チャネルが生成され、チャネルID、
ライトキーが設定される

110

5．Ambient へのデータ送信ライブラリ
Ambientへのセンサ値アップには、ライブラリが用意されています。

Ambient::begin(チャネルID, ライトキー, SoftwareSerial *s);
初期化関数。チャネルID, ライトキー, ソフトウェアシリアルへのポインターを指定します。

Ambient::set(フィールド, データ);
データをパケットにセットする関数。1～8のフィールド番号とデータを指定します。
データーは予め文字列に変換しておきます。
Ambient::send();
データをAmbientに送信する関数。

111

６．サンプルプログラム①#include <SoftwareSerial.h>#include "Ambient3GIM.h"

３GIM用Ambientライブラリ
ヘッダーファイル

SoftwareSerial iemSerial(4,5);
const unsigned long baudrate = 38400;#define LIMITTIME 35000 // ms (3G module start time)
unsigned int channelId = 100;
const char* writeKey = "...writeKey...";
Ambient ambient;

チャネルID、ライトキー定義
Ambientオブジェクト//============== 3G setup =================
boolean _3Gsetup() {3Gシールド用
pinMode(7,OUTPUT);（電源ON)
digitalWrite(7,HIGH); delay(100);
digitalWrite(7,LOW); delay(100); // 3G shield --> digitalWrite(7,HIGH);//------- 3G module begin & connect --------String str="";unsigned long tim = millis();do{ str=iemSerial.readStringUntil('¥n');
電源On状態から3GIM文字が返却されるまで待機}while(!(str.indexOf("3GIM")>0) && (millis() - tim) <LIMITTIME);
delay(1000);
Serial.println(str);if( millis() -tim >= LIMITTIME) {return false;
３G接続状態返却} else return true;}112６．サンプルプログラム②
void setup() {Serial.begin(baudrate);
iemSerial.begin(baudrate);
setup
Serial.println(">Ready. ¥r¥n Initilaizing...");
3G初期化
if( _3Gsetup() ) {Serial.println("start");} else {Serial.println(" Connect Error ... Stop");while(1) { digitalWrite(7,LOW); delay(500); digitalWrite(7,HIGH); delay(500); }; // エラーアラーム}
ambient.begin(channelId, writeKey, &iemSerial);
Ambient初期化
delay(1000);}
void loop () {char tempbuf[8], lightbuf[8];float temp = 207.26 - 0.594 * analogRead(A1);
int light = analogRead(A0);

温度、明るさセンサー値を読み込み

sprintf(tempbuf, "%2d.%1d", (int)temp, (int)(temp*10)%10);
sprintf(lightbuf,"%3d", light);
Serial.print("temp: "); Serial.print(tempbuf);
Serial.print(", light: "); Serial.println(lightbuf);
ambient.set(1, tempbuf);
ambient.set(2, lightbuf);
ambient.send();delay(300000UL);}

113

データを文字列に変換

データをパケットにセットし、送信７．Ambientにデータアップした事例

114

８．チャネルとグラフをカスタマイズした事例
チャネル名設定
チャネル概要設定

温度を左軸、明るさを右軸にして一つのグラフに表示

115

６．GPS機能を使ってGoogleマップに表示

116

１．GPSによる位置情報取得
GPSを使って位置情報の取得を行い、その情報をインターネット上のサーバにアップし、さらにGoogleマップ上にプロットすることを行ってみましょう。

GPSによる位置情報の初回取得には3分以上掛る場合があります。（３G通信とは無関
係に位置情報取得可能※）

GPSアンテナコネクタ部分（GPSアンテナは別売です）

参考： P.72のmonitor3gim.ino を使って、Arduino+
３GIMでのマニュアル操作で、GPSによる位置情報を取得してみましょう。

■GPS機能による位置情報取得

P.72参照monitor３gim.ino
で稼動した場合

Ready.
Welcome to 3GIM(v2)$LG MSBASED$LG=OK 35.64186394 139.6041566取得した緯度・経度をGoogleマップにプロットしてみましょう。

注意：初回のGPS取得では、数分から3分以上時
間が掛りますが、2回目以降でのGPS取得は短時
間になります。

117

２．GPS機能による位置情報群をサーバにアップ
GPS機能を使って、位置情報を定期的にアップするプロ
グラムを紹介しましょう。

３Gアンテナ＋GPSアンテナ
を取り付け

118

GPSアンテナは、タブレインで販売しているもの、または市販のものをご利用ください。

GPS側プログラム＜gps_3gup.ino＞用意
Arduino側組込み

GPSで取得した位置情報と取得した時間を一緒にサーバにアップするスケッチとなります。

サーバ側プログラム＜makefile.php＞用意
サーバに保管GPSで取得した位置情報と取得した時間を一緒にサーバにアップするスケッチとなります。

3.GPS機能による位置情報アッププログラム#include <SoftwareSerial.h>SoftwareSerial Serial3g(4,5);
const unsigned long baudrate = 38400;

クライアント側プログラム＜gps_3gup.ino①＞#define LIMITTIME 35000 // ms (3G module start time)
String URL = “ http://<サーバ・アドレス>/makefile.php?file=";String fname;
String dtime;
String gps;// ---------------- setup ---------------void setup() {Serial.begin(baudrate);
Serial.println(">Ready. ¥r¥n Initilaizing...");
delay(10);while( !_3G_setup() ) {Serial.println(" Connect Error ... Stop");}
Serial.println("Connected");Serial3g.println("$YL 1"); delay(100);
dtime = datetime(); // Serial.println(dtime); //debug
fname=dtime.substring(2,10) + ".dat";
Serial.println("Fname = " + fname);delay(1000);}// ------------------ loop --------------------void loop () {unsigned long tim = millis();gps = GPSget();gps.replace(" ",",");
Serial.println("gps= " + gps);
dtime = datetime(); // Serial.println(dtime); //debug
Serial.println("dtime= " + dtime); delay(1);//----- make file -----if(gps!="") {Serial3g.println("$YL 1");
_3G_WGP("$WG " + URL + fname + "&data=" + dtime + "G" + gps + "¥r¥n");while(millis()-tim<60000);} else if(Serial3g.println("$YL 0")); delay(100);
}
１

119

クライアント側プログラム// ========================================＜gps_3gup.ino②＞// Get Date & Time (3GIM command)// return --> string "2015-12-23T01:23:45"
String datetime() {String dtim;
do {Serial3g.println("$YT");
while(!Serial3g.available());
dtim = Serial3g.readStringUntil('¥n');delay(10);} while ( !(dtim.indexOf("201") ==7) );dtim.replace(" ","T"); dtim.replace("/","-");
return(dtim.substring(7));}//============== 3G setup =================
boolean _3G_setup() {String str;
uint32_t tim = millis();do {while (!Serial3g.available()) {if (millis() - tim > 40000) return false;}
str = Serial3g.readStringUntil('¥n');} while (str.indexOf("Hello") != 0);
return true;}//============== $WG command =================
boolean _3G_WGP(String command) {delay(10);Serial.println(command); // debug
delay(10);Serial3g.println(command);
String rstr;
unsigned long tim = millis(); // time set(ms)do{ while(!Serial3g.isListening());
rstr=Serial3g.readStringUntil('¥n');
Serial.println(rstr); //debug print....
}while(!(rstr.indexOf("$W")==0) && (millis() - tim) <LIMITTIME);
return (rstr.indexOf("$W")==0);}２

ここではAssisted GPSは利用していません。
利用する場合には、P.50を参照ください４．プログラム続き＆実行サンプル
クライアント側プログラム//============================================＜gps_3gup.ino③＞
String GPSget() {delay(10);Serial.println("GPS getting...");
Serial3g.println("$LG MSBASED");
String rstr;
unsigned long tim = millis(); // time set(ms)do{ while(!Serial3g.isListening());
rstr=Serial3g.readStringUntil('¥n');if(rstr.length()>0) Serial.println(rstr); //debug print....
if(rstr.indexOf("$LG=NG 508")==0) Serial3g.println("$LG MSBASED");}while(!(rstr.indexOf("$LG=OK")==0) && (millis() - tim) < 180000);// waite 3min checkif(rstr.indexOf("$LG=OK")==0) return(rstr.substring(7));
else return ""; // time over.
}

３

<?php
$file=$_GET["file"];$data=$_GET["data"] . "¥r¥n";$fp=fopen($file,'a');fwrite($fp, $data);
fclose($fp);?>

サーバ側プログラム＜makefile.php＞

Googl MAPS APIを使って出図120

もくじ
１．a3gimライブラリとは
２．a3gimライブラリ関数群
３．コントロール関連関数
４．ショートメッセージ関連関数
５．Web関連関数
６．現在位置取得（GPS）関連関数
７． 通信その他機能関数
８． TCP/IP関連関数
９． プロファイル関連ほか関数

第５章
Arduino用a3gimライブラリ群

121

１．a3gimライブラリとは122

１．a3gimとは
a3gimとは、Arduinoやその互換上の拡張ボード上で、３GIM V2.0を簡単に利用できるようにした関数群となります。（参照図）
これらのライブラリ群は、上述したさまざまな「＄コマンド」の利用・設定を一括した関数群で、これらが中学生でも通信技術が利用できるものとしています。
具体的には、Arduino IDE上で利用できる３GIM関連のライブラリ関数群となります。
このライブラリ群は、次のページに記載しているように、ネット上からダウンロードし、Arduino
IDE上にコピーして利用できように環境設定します。

123２．ライブラリ群a3gim.zipのダウンロード
このZIPファイルを、Arduino IDE環境下の「･･¥libraries」配下にコピーしてください。
コピーした後、Arduino IDEを起動すると、メニュー「ファイル」⇒「スケッチの例」に、「a3gim」が表示されます。
ダウンロード先：Arduino UNO/Pro用： http://a3gs.wiki.fc2.com/ref/a3gim_R4.1.zip
Arduino Mega/Due/101用： http://a3gs.wiki.fc2.com/ref/a3gim2_R4.2.zip

a3gimを「libralies」配下にコピーする。

a3gimの内容

124

a3gim_R*.*.zipを解凍すると「a3gim」のフォルダがあります。

３．a3gimライブラリを利用する方法


概要





互いのライブラリの違い

提供するa3gimライブラリ機能は、3Gシールドの提供ライブラリとほぼ同等です。
そのため、Arduinoと3GIMとの接続を工夫することで、3Gシールド用の下記のライブラリを使用することができま
す：

a3gim
UNO/Pro用（SoftwreSerialを使用）：３GIM専用に改訂
a3gim2
Mega/Due/101用（Serial1を使用）：３GIM専用に改訂
a3gs
UNO/Pro用（SoftwreSerialを使用）：３Gシールド専用a3gs2
Mega/Due/Leonardo用（Serial3gまたは3を使用）

3GIMとArduinoとの接続方法


UNOの場合

#6をGND、#4を5V、#3をD4、#2をD5、#1を開放(何も接続しない：常時電源ON)、に接続する【補足】３GIMのボーレートを
57600bpsまで高速設定可能※環境が良ければ115200pbsも可能#6をGND、#4を5V、#3をRX3、#2をTX3、#1を開放(何も接続しない：常時電源ON)、に接続する

Leonardoの場合（ハードウェアシリアル通信利用）
【補足】ハードウェアシリアル
利用のため高速設定可能

Mega/Dueの場合（ハードウェアシリアル通信利用）
#6をGND、#4を5V、#3をRX1、#2をTX1、#1を開放(何も接続しない：常時電源ON)、に接続する

Genuino101の場合（ソフトウェアシリアル通信利用）125【注意】３GIMの出荷時は、ヘッダファイル(デフォルトのボーレートの違い）
9600bpsとしています。
a3gim.hのシンボル a3gsBAUDRATE の定義は、「9600」となっています。
a3gim2.hのシンボル a3gsBAUDRATEの定義は、「9600」となっています。
a3gs.hのシンボル a3gsBAUDRATE の定義は、以前「4800」で、最新では「9600」としています。
a3gs2.hのシンボル a3gsBAUDRATE の定義は、「57600」となっています。

＃6をGND、#4、#5をV3.3に、#2をD０、#3をD1、#1を開発（何も接続しない：常時電源ON）、に接続する。

２．a3gimライブラリ関数群126

１．ライブラリを利用するハードウェア
Arduinoから3GIMを簡単に利用できるようにするために、ライブラリa3gimが提供されています。
a3gimライブラリは、Arduino UNO/Pro等でソフトウェアシリアルで3GIMを利用する際に使用します。

a3gim2ライブラリは、Arduino Mega/Due/Leonardo/101/Zero等でハードウェアシリアル3GIMを利用する際に使用します。提供される機能は、a3gimと同等です。



Geunino101 は、一部



以下では、a3gim/a3gim2を総称してa3gimと呼びます。

このライブラリを利用することで、関数の呼び出しという形で3GIMの各機能を利用することができます。

本ライブラリ群は、タブレイン製の「IoTABシールド」または「３GIMシールド 」を利用し、Arduino UNO、Genuino101、ArduinoMEGAなどの上で稼働できます。

IoTABシールドV3.0

IoTABシールドV2.0

２．ライブラリ概要
a3gimライブラリを使用する方法

ライブラリは、スケッチの中で以下の順序でコントロール用のメソッド（関数）を呼び出す
ことにより利用できます。
a3gim.h を宣言#include "a3gim.h"void setup(){...
if (a3gs.start() == 0) {// 3Gシールドの電源ONに失敗した}
if (a3gs.begin() == 0) {// ライブラリの初期化に失敗した}// 3Gシールドが使用できるようになった...
}

a3gimの状態を検査※ このようなスケッチでも可能

while( a3gs.start() == 0 && a3gs.begin() ==0 );128

３．ライブラリ機能一覧 ライブラリが提供する関数(1/3)
分類

メソッド名※1

コントロール（Control）

ショート
メッセージ
（SMS）＊※＊

129

getStatus※
begin※
end※
restart※start※
shutdown※
getIMEI
setLED
setBaudrate
setAirplaneMode
getResult
sendSMS※availableSMS※
readSMS※onSMSReceived

機能概要
3Gシールドの状態取得
ライブラリの初期化
ライブラリの終了
3Gシールドのリセット
3Gシールドの電源ON
3Gシールドの電源OFF
IMEI-IDの取得
LED1のON/OFFUARTの通信速度の設定
エアプレーンモードのON/OFF
通信結果を取得
SMSの送信SMSの受信状態チェック
SMSの読出しSMS着信時のコールバック設定

Arduino GSM/GPRSシールド用ライブラリと互換性がある関数です。
利用するSIMカードによって使えない場合があります。

補足

初期は9600bps
※追加
※仕様変更

V4.0では何もしない３．ライブラリ機能一覧 ライブラリが提供する関数(2/3)
分類
Web機能
現在位置取得（GSP)

通信機能その他

メソッド名
httpGET※
httpPOST
tweet※
getLocation
getLocation2
getServices
getRSSI
getTimegetTime2
getVersion

機能概要
GETメソッドの要求
POSTメソッドの要求
Twitterへの投稿
現在位置の取得
現在位置の取得２
利用可能サービスの取得
電波強度の取得
現在時刻の取得
現在時刻の取得
3Gシールドのバージョンの取得※ Arduino GSM/GPRSシールド用ライブラリと互換性がある関数＊ 無償サービス「http://arduino-tweet.appspot.com/」を利用（要登録）130

補足http/httpsを利用可
同上＊
緯度経度情報緯度経度他情報 ※追加

日付・時刻形式
通算秒形式

３．ライブラリ機能一覧 ライブラリが提供する関数(3/3)
分類

メソッド名

TCP/IP機能

プロファイルATコマンド
※

131

機能概要

補足

connectTCP※

TCPコネクションを接続

disconnectTCP※

TCPコネクションを切断

getStatusTCP

TCPコネクション最新状況取得※追加

writeBegin

シリアル通信で直接書込み

※追加

read※

データの読込み

2つのﾊﾞﾘｴｰｼｮﾝ有write※

データの書出し3つのﾊﾞﾘｴｰｼｮﾝ有setDefaultProfile

デフォルトプロファイルを設定※仕様変更

getDefaultProfile

デフォルトプロファイルを取得※仕様変更

enterAT

ATコマンドパススルーモード※追加

Arduino GSM/GPRSシールド用ライブラリと互換性がある関数

４．ライブラリ定数一覧 ライブラリが定義している主な定数

各ライブリを利用する上で、留意すべき定数（主に最大値の定義）を下表に示す。これらは、ヘッダファイル"a3gim.h"で定義されている。
分類
SMS

Web

TCP/IP

定数名

意味

設定

a3gimMAX_SMS_LENGTH

SMSメッセージの最大バイト数120

a3gimMAX_MSN_LENGTH

電話番号の最大バイト数(最大桁数)

11

a3gimMAX_URL_LENGTH

URLの最大バイト数

256

※1

a3gimMAX_HEADER_LENGTHPOSTのヘッダの最大バイト数

512

※1

a3gimMAX_BODY_LENGTHPOSTのボディの最大バイト数

1024

※1

a3gimMAX_RESULT_LENGTH

GET/POSTのレスポンスの取得可能な最大バイト数

192

※1

a3gimMAX_TWEET_LENGTH

ツイートメッセージの最大バイト数60※1

a3gimMAX_HOST_LENGTH

ホスト名の最大バイト数

96※1

a3gimMAX_DATA_LENGTH

一度に読み書きできるデータの最大バイト数

1024

※2

※1 これらの定数は、ATmega328*/32U*（Unoなど）を利用したArduinoではSRAMのサイズが小さいことからかなり制約が厳しい。ATmega2560/1280（Megaなど）またはADKを利用することで、これらの最大値を大きくすることができる。
※2 大きなデータを読み書きする場合は、複数回に分けてread/writeを実行する。

132

補足

３．コントロール関連関数

133

コントロール関連の関数


提供関数ライブラリ

コントロール（Control）

getStatus※
begin※
end※
restart※start※
shutdown※
getIMEI
setLED
setBaudrate
setAirplaneMode
getResult※

初期は9600bps※追加

Arduino GSM/GPRSシールド用ライブラリと互換性がある関数

概要




3Gシールドの状態取得
ライブラリの初期化
ライブラリの終了
3Gシールドのリセット
3Gシールドの電源ON
3Gシールドの電源OFF
IMEI-IDの取得
LED1のON/OFFUARTの通信速度の設定
エアプレーンモードのON/OFF
通信結果を取得

a3gimライブラリの初期化・終了、ライブラリの状態の取得、3GIMシールドのリセット、電源ON/OFF、IMEIの取得、
LED1のON/OFF、UARTの通信速度の設定を行う

留意点


電源ONには、15秒程度の時間が掛かる。リセットには、5秒程の時間が掛かる。



電源OFFには、1秒ほどの時間が掛かる

setBaudrateによる通信速度の変更には、十分留意すること

134１. コントロール関連の関数

getStatus※

int getStatus(void)
機能概要
現在のライブラリの状態を取得
引数

なし

戻り値

現在の状態（ERROR, IDLE, READY, TCPCONNECTEDCLIENT のいずれか）

補足

各状態の意味は下記の通り：
a3gim::ERROR：エラーが発生した
a3gim::IDLE：空いている（機能の実行が可能）
a3gim::READY：同上
a3gim::TCPCONNECTEDCLIENT：TCPコネクションが接続した【利用例】
int status;
status = a3gs.getStatus();Serial.print("Status is ");switch (status) {case a3gim::ERROR :Serial.println("ERROR");case a3gim::IDLE :Serial.println("IDLE");case a3gim::READY :Serial.println ("READY");
case a3gim::TCPCONNECTEDCLIENT :Serial.println("TCPCONNECTEDCLIENT");
default : Serial.println("Unknown"); break;135

break;
break;
break;
break;【出力結果例】
Status is IDLE

２. コントロール関連の関数

begin※

 バリエーション1
int begin(char* pin)
機能概要

ライブラリを初期化する

引数

pin：未使用(指定は不要)
0：正常に初期化を実行できた時

戻り値

1：エラーが発生した時（ライブラリは使用不可）
2：IEM上のgw3gアプリのバージョンが古い（ライブラリは使用不可）

補足

3Gシールドの電源がONの状態で、本ライブラリの使用に先立って一度だけ本関数を呼び出す必要がある。
初期化に失敗した場合は、end()関数を呼び出して、時間をおいて何度かリトライすることで成功する場合がある。
終了関数end()を呼び出した後は、再度、本関数を呼び出すことができる。
本関数の中では、デフォルトの通信速度で標準ライブラリ「SoftwareSerial」を初期化(begin)する。
【使い方の例】
if (a3gs.begin() == 0)
Serial.println("Succeeded.");136

３. コントロール関連の関数

begin※

 バリエーション2
int begin(char* pin, uint32_t baudrate)
機能概要

ライブラリを初期化する
pin：未使用(指定は不要)

引数

baudrate：設定する通信速度 (1200/2400/4800/9600/19200/38400/
57600/115200)
0：正常に初期化を実行できた時

戻り値

1：エラーが発生した時（ライブラリは使用不可）
2：IEM上のgw3gアプリのバージョンが古い（ライブラリは使用不可）

補足

3Gシールドの電源がONの状態で、本ライブラリの使用に先立って一度だけ本関数を呼び出す必要がある。
初期化に失敗した場合は、end()関数を呼び出して、時間をおいて何度かリトライすることで成功する場合がある。
終了関数end()を呼び出した後は、再度、本関数を呼び出すことができる。
本関数の中では、指定された通信速度で標準ライブラリ「SoftwareSerial」を初期化(begin)する。
通信速度の変更は、setBaudrate()関数を使って事前に行っておく必要がある。
【使い方の例】

137

if (a3gs.begin(0, 9600) == 0)
Serial.println("Succeeded.");４. コントロール関連の関数

end※

int end(void)
機能概要

ライブラリの使用を終了する

引数

なし

戻り値
補足

0：正常に終了処理を実行できた時
0以外：エラーが発生した時
本関数の中では、標準ライブラリであるSoftwareSerialを終了(end)する。

【使い方の例】
・次頁参照

138

５. コントロール関連の関数

restart※int restart(char* pin)
機能概要

3Gシールドを再起動（リセット）する

引数

pin：未使用(指定は不要)

戻り値

補足

0：正常にリセットを実行できた時
0以外：エラーが発生した時（リセットできない時）

IEM全体をリセットする。
通常、本関数を呼び出してから10秒程度でIEMはリセット処理を開始し、40秒程
度で利用可能な状態となる。
本関数によるリセット後に再度ライブラリを利用する場合は、一旦、終了関数
end()を呼び出した後に、初期化関数begin()を呼び出すこと。

【使い方の例】
if (a3gs.restart() == 0) {Serial.println("Restarting..");
a3gs.end();if (a3gs.begin() == 0)
Serial.println("I'm OK.");}
else
Serial.println("Restart Failed.");139

６. コントロール関連の関数

start※

int start(char* pin)
機能概要

3Gシールドの電源をONにする

引数

pin：未使用(指定は不要)

戻り値

補足

0：正常に電源ONを実行できた時
0以外：エラーが発生した時（電源ONできない時）
本関数を呼び出しには、40秒程度掛かる（本関数の呼び出しが完了した時点で、3Gシールドが利用可能な状態となっている）。その後、初期化関数begin()を呼び出すことで本ライブラリを利用することができる。

【使い方の例】
if (a3gs.start() == 0 && a3gs.begin()) {Serial.println("Succeeded.");// 成功処理}else
Serial.println("Restart Failed.");140

７. コントロール関連の関数

shutdown※

int shutdown(void)
機能概要

3Gシールドの電源をOFFにする

引数

なし

戻り値

補足

0：正常に電源OFFを実行できた時
0以外：エラーが発生した時（電源OFFできない時）

本関数を呼び出しには、15秒程度掛かる
本関数を呼び出した後は、再度、電源ON関数start()を呼び出すことで3Gシール
ドを利用することができる。
【使い方の例】
a3gs.end();a3gs.shutdown();141

８. コントロール関連の関数

getIMEI

int getIMEI(char* imei)
機能概要

3Gシールドに装着されているIEMのIMEIを取得する

引数

imei : 取得したIMEI（サイズは a3gimIMEI_SIZE バイト）

戻り値

0：正常に取得できた時
0以外：エラーが発生した時（取得できない時）

IMEIとは３G通信モジュール(IEM)の識別IDである（電話番号とは無関係）
引数imeiが指す結果格納場所のスペース（a3gimIMEI_SIZEバイト＝16桁）は、あらかじめ呼び出し側で確保しておくこと。

補足【使い方の例】
char imei[a3gimIMEI_SIZE];
if (a3gs.begin() == 0) {a3gs.getIEI(imei);
Serial.println(imei);}

142【出力結果例】
354563020267950

IMEI番号
このIMEIの中に、IEMモ
ジュールに記載されたIDが含まれています。

９. コントロール関連の関数

setLED

int setLED(boolean sw)
機能概要

3Gシールドに搭載されているLED1を制御する

引数

sw : ONにする時はTRUE、OFFにする時はFALSEを指定する

戻り値
補足

0：正常に設定できた時
0以外：エラーが発生した時
LED1(緑色のLED)が3Gシールドのどこの位置に配置されているか等は、「取扱説明書」を参照のこと。

【使い方の例】
if (aFlag) {a3gs.setLED(TRUE);
led1_status = TRUE;
Serial.println("LED1 is turned on.");}143

ここのLEDが点灯

１０. コントロール関連の関数

setBaudrate

int setBaudrate(int baudrate)
機能概要

Arduinoと3Gシールドを仲介するUARTの通信速度を設定する

引数

baudrate : 設定する通信速度(9600/19200/38400/57600/115200の
いずれか)

戻り値

補足

0：正常に変更できた時
0以外：エラーが発生した時
本関数の利用には十分留意すること。不適切な値を設定した場合は、3Gシールドを利用することができなくなる可能性がある。
工場出荷時の通信速度は、安定動作が可能な 9600(bps) となっている。
通信速度をデフォルトの設定値よりも高くするには、ハードウェアシリアルの利用を推奨する。
本関数による通信速度の変更は、直ちに有効となる。
デフォルトの通信速度と異なる通信速度を設定した場合は、次回の初期化の際には通信速度を指定してbegin()を呼び出すこと（詳細はbegin()の項を参照）【使い方の例】
if (a3gs.setBaudrate(9600) == 0) {Serial.println("Baudrate was changed.");Serial.println("Please reset me now.");}144

注意：設定した通信速度をスケッチ内で呼び出す必要があります。
a3gim.h のスケッチ内の「a3gimBAUDRATE」の設定となります。
間違った場合には、サンプルスケッチの「 check_baudrate.ino」
で確認してみてください。

１１. コントロール関連の関数

setAirplaneModeint setAirplaneMode(boolean sw)
機能概要

3Gシールドのエアプレーン（機内）モードを制御する

引数

sw : ONにする時はTRUE（=1）、OFFにする時はFALSE（=0）を指定する

戻り値

補足

0：正常に設定できた時
0以外：エラーが発生した時
エアプレーンモードがONの時は、3G通信は実行できないが、SMSの受信のみ可能
である（ただし、受信したSMSの読み出しやSMSの送信はできない）
エアプレーンモードをONにすることで、消費電力を大幅に節約することができる。
リセットまたは電源のOFF/ONで、デフォルトの設定(OFF)に戻る。

【使い方の例】
if (aFlag) {a3gs.setAirplaneMode(true);
airplaneMode = true;
Serial.println("Airplane mode on");}145

４．ショートメッセージ関連関数〈注意〉 ショートメッセージは、SIMカードがショートメッセージ対応でないとご利用いただけません。

146

ショートメッセージ関連の関数


提供関数ライブラリ
分類
ショート
メッセージ
（SMS）





メソッド名※1
sendSMS※availableSMS※
readSMS※onSMSReceived

機能概要

補足

SMSの送信SMSの受信状態チェック
SMSの読出しSMS着信時に呼び出す関数を設定

V4.0では何もしない

概要


3GのSMS（Short Message Service：120文字程度までの簡易メッセージングサービス）を利用する



SMSは、通信キャリアにまたがって送受信できる

留意すべき点

使用するSIMカード（通信サービス）により、SMSが利用できない場合がある

通信料金（送信側に課金、一般には定額プランの範囲外）に注意すること

通信回線の状態によっては、SMSの配送遅延が起こる場合がある（常に即時配送できるとは限らない）



3Gネットワークとの相性により、何度も同一のSMSを受信してしまう現象が発生する場合がある



SMSが届かない場合は、受信側のSMS受信拒否設定にも注意すること



SMSのメッセージの中に利用できない文字が存在することに注意すること（例えば、"@"文字等は使えない）

147

１．ショートメッセージ関連の関数

sendSMS※int sendSMS (const char* to, const char* msg, int encode)
機能概要

SMS（ショートメッセージ）を指定した宛先へ送信する
to : 送付先の電話番号（ハイフォンなしの10ケタの半角数字）

引数

戻り値

補足

148

msg : 送信するメッセージ（最大a3gimMAX_SMS_LENGTH文字）
encode : メッセージに使用するエンコード方法（a3gimCS_*で指定）。省略可（省略時はASCIIエンコードと解釈）
0：正常に送信できた時
0以外：送信できなかった時
本機能を利用するためには、SMSが利用できる通信サービス(SIMカード)を利用する必要がある。
関数getServices()にて、a3gimSRV_CSまたはa3gimSRV_BOTHのいずれかの返却値が取得できる場合にはSMSは利用できる。
３GIM(V2.0)では、日本語のSMSは取り扱いできない。

２．ショートメッセージ関連の関数

availableSMS※

boolean availableSMS (void)

機能概要

SMSが届いているかをチェックする

引数

なし

戻り値

true：SMSが届いている時
false：SMSが届いていない時

補足【使い方の例】
char msg[a3gimMAX_SMS_LENGTH+1], msn[a3gimMAX_MSN_SIZE+1];
void loop() {if (a3gs.availableSMS()) {int msgLen = sizeof(msg);
int msnLen = sizeof(msn);
a3gs.readSMS(msg, msgLen, msn, msnLen);// 受信したSMSの処理}
delay(1000);}

149

３．ショートメッセージ関連の関数

readSMS※boolean readSMS (char* msg, int msglength, char* number, int nlength)
機能概要

受信したSMSを読み出す
msg : [OUT] 読み出したメッセージ（最大a3gimMAX_SMS_LENGTH文字）
msglength : msgのサイズ（バイト数）

引数

number : [OUT] SMSの送信元の電話番号
nlength : numberのサイズ（バイト数）（通常、a3gimMAX_MSN_LENGTH文字を確保）

戻り値

補足

150

true：正常に読み出した時
false：読み出し不可の時（SMSを未受信、SMS使用不可 等）
正常に読み出せた場合は、msgおよびnumberは'¥0'文字で終端される。
メッセージはASCIIで読み出すことができる。
上記以外は、sendSMS()を参照

４．ショートメッセージ関連の関数

onSMSReceived

int onSMSReceived (void (*handler)(void))
機能概要

SMSが着信した時に呼び出される関数を設定する（V4.0では何もしない）

引数

handler : 呼び出される関数（戻り値・引数は無）へのポインタ

戻り値

補足

151

0：正常に設定できた時
0以外：設定できなかった時
本関数は互換性を維持するために残しているものである。実際には何もしない。

５．Web関連関数

152

５．Web関連の関数


提供関数ライブラリ
分類
Web機能
※
＊



機能概要
GETメソッドの要求
POSTメソッドの要求
Twitterへの投稿

補足
http/httpsを利用可＊

Arduino GSM/GPRSシールド用ライブラリと互換性がある関数
無償サービス「http://arduino-tweet.appspot.com/」を利用（要Twitterの登録）概要

http/httpsを簡単に利用できる。



GET/POSTメソッドを利用できる。



Web機能の関数は、すべて同期処理である。そのため、レスポンスが取得できるまで、あるいは通信がタイムアウト(30秒程度)するまで呼び出し元には制御は戻らない。



tweetは、サードパーティのフリーサービスを利用することで使用できる（ユーザ登録が必要、利用条件はそのサービスに従う）。




メソッド名
httpGET※
httpPOST
tweet※

詳細は http://arduino-tweet.appspot.com/ （3Gシールドアライアンスとは関係のないサービス）

留意点


使用するSIMカードで、3Gパケット通信が利用できること

通信料金（http/https通信の利用は、通常、定額プランの範囲内）に留意すること

日本語の取り扱いにはご注意ください。リクエストを送る相手サーバにより、日本語の文字コードが決まりま
すが、Arduinoでは日本語の処理を簡単に記述することができません。英語のみを取り扱うことを推奨します。

153

１．Web関連の関数

httpGET ※int httpGET (const char* server, uint16_t port, const char* path, char* result, int
resultlength, boolean ssled=false, const char* header=NULL)
機能概要

指定したサーバ、ポート、パスに対して、httpまたはhttps/GETリクエストを発行して、そのレスポンスを返却する
server : サーバのドメイン名またはIPアドレス
port : サーバのポート番号（通常は80を指定）
path : URLのパス

引数

result : [OUT] レスポンスの格納先（スペースは呼び出し側で確保）
resultlength : resultのサイズを指定
ssled：httpsを利用する場合はtrue、httpを利用する場合はfalseを指定（省略可能で、省略時はfalseと同じ）
header : 特殊なヘッダの指定(最大a3gimMAX_HEADER_LENGTHバイト)

戻り値

補足
154

0：正常にGETできた時
0以外：GETできなかった時
本関数の実行時間は、状況によって最大30秒程度掛かる。
サーバからのレスポンスのサイズが大きい場合は、resultlength以降のデータは破棄される。
resultは、'¥0'文字で終端される。文字コードは、接続先のサーバに依存する。
また、レスポンスにはヘッダは含まれない（ボディ部分のみ）

１．Web関連の関数


httpGET ※補足

特にヘッダの指定がない場合は、リクエストのヘッダは下記の通りである：
Host: server:port

ヘッダを指定する場合は、下記のように指定する。2つ以上のヘッダを指定する場合は、それらの間を「$r$n」で区切り、末尾も「$r$n」 で終わる（終端の改行は省略可能）。
char *header = "Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==$r$nX-Myheder: XYZ$r$n"

155

path引数にはクエリー文字列を含めることができるが、事前にURLエンコードを施しておく必要がある。また、httpGET()関数では'$'文字を特殊扱いするため、'$'文字を文字列に含める時は、httpPOST()で解説しているようなエスケープシーケンスに従うこと。

２．Web関連の関数

httpPOST

int httpPOST (const char* server, uint16_t port, const char* path, const char*header, const char* body, char* result, int* resultlength, boolean ssled=false)
機能概要

引数

指定したサーバ、ポート、パスに対して、httpまたはhttps/POSTリクエストを発行して、そのレスポンスを返却する
server : サーバのドメイン名またはIPアドレス
port : サーバのポート番号（通常は80を指定）
path : URLのパス
header : HTTPのヘッダ文字列(最大a3gimMAX_HEADER_LENGTHバイト)
body : HTTPのボディ文字列(最大a3gimMAX_BODY_LENGTHバイト)
result : [OUT] レスポンスの格納先（スペースは呼び出し側で確保）
resultlength : [IN/OUT] resultのサイズを指定、呼び出し結果のサイズが返却

戻り値

ssled：httpsを利用する場合はtrue、httpを利用する場合はfalseを指定（省略可能で、省略時はfalseと同じ）
0：正常にPOSTできた時
0以外：POSTできなかった時
次ページ
へ続く

156

２．Web関連の関数

httpPOST

前ページ
から続く

int httpPOST (const char* server, uint16_t port, const char* path, const char*header, const char* body, char* result, int* resultlength)

補足

157

引数headerでは、HostとContent-Lengthの指定は不要である。
引数bodyでは、最後の空行は指定不要である。
本関数の実行時間は、状況によって最大30秒程度掛かる。
サーバからのレスポンスのサイズが大きい場合は、resultlength以降のデータは破棄される。
resultは'¥0'文字で終端される。文字コードは、接続先のサーバに依存する。
レスポンスには、ヘッダは含まれない（ボディ部分のみ）
引数headerおよびbodyでは、下記の'$'文字を使ったエスケープシーケンスをサポートする。直接、制御文字を指定することはできないので注意すること：$t：TAB(0x09)$r：CR(0x0d)$n：NL(0x0a)$"："そのもの$$：$そのもの$xhh または $Xhh：16進数hh(スケッチでの文字列における"0xhh"と同義)
引数headerやbodyでは、バイナリデータをそのまま取り扱うことはできない。また、レスポンスは文字列として返却するため、'¥0'文字を含むことはできない。バ
イナリデータを透過的に扱った通信を行いたい場合は、TCPIP関数を利用する。

３．Web関連の関数

tweet ※

int tweet (const char* token, const char* msg)
機能概要
引数
戻り値

Twitterへ投稿する
token : アクセスに必要なトークン（認証情報）
msg : 投稿するメッセージ（最大a3gimMAX_TWEET_LENGTHバイト）
0：正常に投稿できた時
0以外：投稿できなかった時
tweetは、下記のフリーサービスを利用することで使用できる。ユーザ登録が必要
で、利用条件はこのサービスに従う。
詳細は http://arduino-tweet.appspot.com/ を参照のこと。

補足

158

【注意】上記サービスの制限により、同一メッセージを連続して投稿することはできない。また、一定時間内に投稿できるメッセージ数に制限がある(2012/10時点の制限では、１分間に1回の投稿まで)。この制限を守らない場合は、正しく引数を指定している場合でも本関数はエラーを返却する。

６．現在位置取得（GPS）関連関数

159

現在位置取得（GPS）関連の関数


提供関数ライブラリ
分類
現在位置取得（GPS)機能

機能概要
現在位置の取得
現在位置の取得２

補足
内蔵GPSを使用

概要
HL8548-G内蔵GPSや3Gネットワークを利用して位置を測位



引数の指定により、下記のいずれかの測位方法を選択できる：


MPBASED

GPSを利用して現在位置を測位する。GPSが利用できない場合は、3Gネットワークを利用する。

MPASSISTED

3Gネットワーク上のロケーションサーバを利用して現在位置を測位する。

MPSTANDALONE




メソッド名
getLocation
getLocation2

GPSのみを利用して現在位置を測位する。

留意点

通信サービス（例えば、IIJmio等）によっては、3Gネットワーク上のロケーションサーバを利用することができない。その場合は、GPS単独の測位のみが利用できる。



測位方法としてa3gimMPSTANDALONEを指定した場合は、通信料金（通常、定額プランの範囲内だが、SIMカードの通信サービスによる）が発生する



屋内や都心等のように、上空にある衛星の電波がGPSアンテナで補足できない場所では、正しく測位できな
い場合がある。

160

１．現在位置取得（GPS）関連の関数 getLocation
int getLocation(int method, char* latitude, char* longitude)
機能概要

引数

現在位置を取得する
method : 測位方法（a3gimMPBASED / a3gimMPASSISTED /a3gimMPSTANDALONE のいずれか）を指定
latitude : [OUT] 緯度(北緯) dd.dddddd形式、ただし桁数は場合により可変
longitude : [OUT] 経度(東経) ddd.dddddd形式、同上

戻り値

補足

161

0：正常に取得できた時
0以外：取得できなかった時（latitude, longitudeの値は不定）
本関数の実行には、数十秒～3分程度の時間が掛かる。
AGPSサーバは、３GIM(V2.0)ではGoogleのサーバを利用する（今後変更となる可能性がある）本関数は、同期処理である。そのため、測位処理が完了するまで、あるいは測位が失敗するまで呼び出し元には制御は戻らない。

２．現在位置取得（GPS）関連の関数 getLocation2
int getLocation2(char* latitude, char* longitude, char *height, char *utc, int*quality, int *number)
機能概要

現在位置を取得する
latitude :[OUT] 緯度(北緯：度) dd.dddddd形式、ただし桁数は場合により可変
longitude : [OUT] 経度(東経：度) ddd.dddddd 同上
height : [OUT] アンテナの海抜高さ（単位：ｍ）

引数

utc : [OUT] 協定世界時での時刻（hhmmss）
quality : [OUT] 位置特定品質。0 = 位置特定できない、1 = SPS（標準測位サービス）モード、2 = differenctial GPS（干渉測位方式）モード
number : [OUT] 使用GPS衛星数

戻り値

補足

162

0：正常に取得できた時
0以外：取得できなかった時（latitude, longitudeの値は不定）
本関数の実行には、数十秒～3分程度の時間が掛かる。
AGPSサーバは、３GIM(V2.0)ではGoogleのサーバを利用する（今後変更となる可能性がある）本関数は、同期処理である。そのため、測位処理が完了するまで、あるいは測位が失敗するまで呼び出し元には制御は戻らない。

７．通信その他機能関数

163

通信その他機能の関数


提供関数ライブラリ
分類

通信その他機能

メソッド名
getServices
getRSSI
getTimegetTime2
getVersion

機能概要
利用可能サービスの取得
電波強度の取得
現在時刻の取得
現在時刻の取得
3Gシールドのバージョンの取得

補足

日付・時刻形式
通算秒形式

留意点


164

時刻は、使用している3Gネットワークを介してインターネット上のサーバから取得する（タイムゾーンや時刻精度は利用するネットワークに依存する）

１．通信その他機能の関数

getServices

int getServices(int& status)
機能概要

現在利用できるネットワークサービスを取得する

引数

status : [OUT] 利用できるネットワークサービス（下記のいずれか）
a3gimSRV_NO（＝０）：サービス利用不可
a3gimSRV_PS（＝１）：パケット通信サービスのみ
a3gimSRV_CS（＝２）：音声通信(+SMS)サービスのみ
a3gimSRV_BOTH（＝３）：パケット通信、音声通信(SMS)いずれも可戻り値
補足

0：正常に取得できた時
0以外：取得できなかった時（statusの値は不定）
3GIM(V2.0)では、a3gimSRV_CSとa3gimSRV_BOTHは返却しない。つまり、
SMSが利用できるかどうかは判断できない。
【使い方事例】
int status;
if (a3gim.getServices(status) == 0)
Serial.println(status);

165

SIMカードによる提供サー
ビスの違いを取得

２．通信その他機能の関数

getRSSIint getRSSI(int& rssi)
機能概要

3Gの電波強度（RSSI）を取得する

引数

rssi : [OUT] 取得した電波強度（単位はdBm） ＜範囲：-1 ～ -113＞

戻り値
補足

0：正常に取得できた時
0以外：取得できなかった時（rssiの値は不定）
電波強度は必ずマイナス値が返却される。0に近いほど電波強度は強い。

【電波受信レベルの測定サンプル】
実際に測定した実績では、３Gアンテナを付けないで測定した場合では「-113dBm」を計測、 また電波状態の良いところでは「-68dBm」程度を計測できている。

【使い方事例】
int rssi;
if (a3gim.getRSSI(rssi) == 0)
Serial.println(rssi);

166

３．通信その他機能の関数

getTIMEint getTime(char* date, char* time)
機能概要

date : [OUT] 取得した日付（"YYYY-MM-DD"形式）

引数

time : [OUT] 取得した時刻（"HH:MM:SS"形式）

戻り値

補足

現在の日付・時刻を取得する

0：正常に取得できた時
0以外：取得できなかった時（date/timeの値は不定）
日付・時刻は使用している3Gネットワークを介して日本のサーバから取得するた
め、精度およびタイムゾーンはネットワークに依存する。（日本国内で利用する
場合は、タイムゾーンは日本(JST)となる）
時刻は24h制（固定）である。ただし、自動調整出力となるため、変更は不可。

【使い方事例】【利用例】
if (a3gim.getTime(date, time) == 0) {Serial.print(date);
Serial.print(" ");Serial.println(time);}

167【出力結果例】
2012/12/01

12:10:43【注意：時刻自動調整機能について】
長く電源を入れていないと、時刻が一旦1980年1月5日16:00:00に戻る。
電源を入れて動かしている間に、一時的に現在時刻より16時間遅れで表示され、さらに、日本時間で表示されるようになる。

４．通信その他機能の関数

getTIME2

int getTime2(uint32_t& seconds)
機能概要

現在の時刻（1970/1/1からの通算秒：「UNIX時間」とも言う）を取得する

引数

seconds : [OUT] 取得した通算秒

戻り値

補足

0：正常に取得できた時
0以外：取得できなかった時（date/timeの値は不定）
時刻を秒単位で取得できるため、時刻の比較処理等が簡単となる。
日付・時刻の精度およびタイムゾーンについては、getTime()を参照。
秒への換算処理では、閏（うるう）年も考慮している。
2038年※問題が発生する可能性がある。

※ 2038年問題は、ISOの通算秒の定義に1970年1月1日からとしていて、C言語の標準で32ビット
符号付intを採用している場合、2038年1月19日3時14分7秒（UTC、以下同様）を過ぎると、この値がオーバーフローし、負と扱われるため、コンピュータが誤動作する可能性があるとされる問題。
【詳細はウィキペディア参照】

168

５．通信その他機能の関数

getVersion

int getVersion(char* version)
機能概要

３GIM ファームウェアgw3gアプリのバージョンを取得する

引数

version : [OUT] 取得したバージョン("9.9"形式)

戻り値
補足

169

0：正常に取得できた時
0以外：取得できなかった時（versionの値は不定）
begin()の処理の中で3Gシールドのバージョンと本ライブラリの整合性をチェックしているため、通常、本関数を利用する必要はない。

８． TCP/IP関連関数

170

TCP/IP関連の関数


提供関数ライブラリ
分類

TCP/IP

メソッド名
connectTCP※

機能概要
TCPコネクションを接続

補足

disconnectTCP※

TCPコネクションを切断

getStatusTCP

TCPコネクション最新状況取得

writeBegin

シリアル通信で直接書込み

read※

データの読込み

3バリエーション有write※

データの書出し3バリエーション有※ Arduino GSM/GPRSシールド用ライブラリと互換性がある関数【注意事項】
 TCP/IP v4のみサポートする。
 一度に一つのコネクションだけを利用できる。（Web機能とは独立して使用できる）
 本機能で提供する関数では、すべて同期的に処理する。そのため、サーバから結果が得られるまで、エラーが発生するまで、あるいは通信がタイムアウトするまで呼び出し元には制御が戻らない。
 接続や通信では、タイムアウト時間として30秒が設定されている
 readやwriteでエラーが発生した時は、接続(connectTCP)からやり直す必要がある
 TCP/IP機能を利用するためには、利用するSIMカードでパケット通信が利用できる必要がある。
また、契約プランによっては通信料金が高額になる場合があるため注意すること
 利用するSIMカードによっては、使用できるポート番号に制限(80番のみ等)がある場合がある。
 1バイト単位でのread/writeは、実行効率が悪く、かつ実行速度が遅い。そのため、できるだけ複数バイト単位でread/write関数を呼び出して処理することが望ましい。
 一部のread/write関数で、バイナリデータを透過的に取り扱うことができる。（Ver2.0以降）
 read関数がノンブロッキング（読み出すべきデータがない場合は、待たずに直ちに呼び出し元へリターンする）
 で動作するように変更した。（Ver2.0以降）

171１．TCP/IP機能の関数

connectTCP

int connectTCP(const char* server, int port)
機能概要

指定したサーバ、ポート番号へ接続して、TCPコネクションを確立する

引数server : 接続するサーバのホスト名またはIPアドレス
port : 接続するポート番号

戻り値

補足

0 : 正常に接続できた時
0以外 : エラーが発生した時（戻り値はエラー番号を表す）
本機能の処理には、状況によって最大30秒程度掛かる。
serverには、IPv4アドレス("x.x.x.x"形式)またはホスト名を指定することができる。
【使い方の例】

172

char *svr = "arduino.cc";
if (a3gim.connectTCP(svr, 80) == 0) {// GET Request for google site
a3gim.write("GET / HTTP/1.0$n");
a3gim.write("HOST:");
a3gim.write(svr);
a3gim.write("$n$n");// Get resopnse..
}
else {
Serial.println("Error: can't connect");}

２．TCP/IP機能の関数

disconnectTCP

int disconnectTCP(void)
機能概要

接続しているTCPコネクションを切断する

引数

なし

戻り値

補足

173

0 : 正常に切断できた時
0以外 : エラーが発生した時（戻り値はエラー番号を表す）
本機能の処理には、状況によって1～数秒程度掛かる。
本ライブラリの終了関数endでは、TCPコネクションは自動的に切断しない。そのため、必要に応じて必ず本関数を呼び出してTCPコネクションを明示的に切断すること。

３．TCP/IP機能の関数

getStatusTCP

int getStatusTCP(int *status,int *tcpnotif, logn *remainedBytes, long*receivedBytes)
機能概要

接続しているTCPコネクションを切断する

引数

status: TCPコネクションのステータス(別表①参照)
tcpnotif: TCPコネクションで最後に発生したエラーの内容(別表②参照)
remainedBytes: 相手に送信できていないデータのサイズ(バイト数)
receivedBytes: 受信したがまだread()していないデータのサイズ(バイト数)

戻り値

補足

174

0 : 正常に切断できた時
0以外 : エラーが発生した時（戻り値はエラー番号を表す）

本機能の処理には、状況によって1～数秒程度掛かる。
本ライブラリの終了関数endでは、TCPコネクションは自動的に切断しない。そのため、必要に応じて必ず本関数を呼び出してTCPコネクションを明示的に切断すること。

３．TCP/IP機能の関数

getStatusTCP

表① statusの意味

表② tcpnotifの意味

status意味

tcpnotif

0

未接続

0

ネットワークエラー

1

接続済み

1

ソケットエラー

2

接続失敗

2

メモリ問題

3

クローズした

3

DNS問題

4

接続中

4

TCPが相手から切断された

5

アイドルタイム*2のカウント開始

5

TCPコネクションエラー

6

アイドルタイム*2のカウント取り消し

6

一般的なエラー7

クライアントからのリクエスト受付けエラー*1

8

AT+KTCPSNDで文字待ちが発生*1

9セッションIDがおかしい*1

10セッションは使用中である

11

すべてのセッションは使用中である*1*2 TCPコネクションが切断された時からアイドルタイムのカウントが開始される。アイドルタイムが30秒となった
時に、3Gネットワークのセッションが解放される。アイ
ドルタイム中にread()やwrite()を行うと、アイドルタ
イムはいったんリセットされる。
【エラー発生時の対処方法】
何らかのエラーが発生した場合は、通常、TCPコネクションを切断して、再度接続からやり直す
ことを推奨する。

175

意味*1 通常は発生しない内部エラー

４．TCP/IP機能の関数

writeBeginint writeBegin(size_t sz)
機能概要

指定したサイズszのデータをTCPコネクションに対して書き込む準備をする

引数

sz : データのサイズ(バイト数)、最大 a3gsMAX_TUNNEL_DATA_LENGTH

戻り値

補足

【使い方の例】

176

0 : 正常に準備ができた時－1 : エラーが発生した時（引数szがおかしい）
本機能の処理には、状況によって数秒程度掛かる。
バイナリデータを相手へ書き込むための最速の関数である。$エスケープが不要であり、一度の書き込めるサイズも大きいため、write()関数よりも高速である。
本関数を呼び出した後は、指定したサイズ分のデータ(バイナリデータもそのままでOK)を、シリアルa3gsに対して直接書き込む。正確にszバイト分のデータを書き込む必要がある。szに満たない場合は、30秒のタイムアウト後に、szバイトに満たない不足分のデータとして、3GIMが自動的に0x00バイトを充当する。
通信速度を115,200bpsに設定している場合は、フロー制御を行っていないため
1024バイトのデータ送るたびに5ミリ秒以上のディレイを挿入する必要がある。
char *svr = “someserver.aaa";
uint8_t data[256];
if (a3gim.connectTCP(svr, 80) == 0) {a3gim.writeBegin(sizeof(data));for (int i = 0; i < sizeof(data); i++)a3gs.write(data[i]);int len = sizeof(buf) - 1;char buf[20];if (a3gs.getResult(buf, &len, 60000) != 0)// Error handling ..
}左記の使い方にあるように、
writeBegin()を呼んだ後は、シリアルa3gsに対して
直接write()やprint()を使って所定のサイズ分のデー
タを書き込む。
書き込んだ後は、getResult()関数を呼び出して、書き込みの成否をチェックする。

５．TCP/IP機能の関数

read バリエーション1 （バイナリデータの読み出し可）
int read(void)
機能概要

現在のTCPコネクションから１バイトのデータを読み出す

引数※なし
0～0xFF：読み出した1バイトのデータ

戻り値-1： エラーが発生した時（コネクションがcloseされた、エラーが発生した、タイムアウトした）-2： データが読み出せなかった時（データがない時）

補足【使い方の例】

177

本関数は常にノンブロッキングで動作する。そのため、読み出せるデータがない
時は直ちに呼び出し元へリターンする。
本関数は、コネクションがcloseされた時やエラーが発生した時は、直ちに呼び出し元へリターンする。
char *svr = “arduino.cc";
if (a3gim.connectTCP(svr, 80) == 0) {// GET Request for google site
a3gim.write("GET / HTTP/1.0$n");
a3gim.write("HOST:");
a3gim.write(svr);
a3gim.write("$n$n");
handleResponse();}else
Serial.println("Error: can't connect");

void handleResponse(void) {int c;
while ((c = a3gim.read()) > 0) {// 読み出した文字cを処理する}}

５．TCP/IP機能の関数

read バリエーション2（テキストデータの読み出しのみ）
int read(char* result, int resultlength)
機能概要

現在のTCPコネクションから最大resultlengthバイトのデータを読み出す

引数

result : [OUT] 読み出したデータを格納するバッファアドレス
resultlength : 呼び出し側で確保したバッファのサイズ（バイト数）
1～(resultlength-1)：正常に読み出した時（読み出したバイト数を返す）

戻り値

0：

データが読み出せなかった時

0未満 : エラーが発生した時（コネクションがcloseされた、エラーが発生した）

補足【使い方の例】

178

本関数は常にノンブロッキングで動作する。そのため、読み出せるデータがない
時は直ちに呼び出し元へリターンする。
本関数は、コネクションがcloseされた時やエラーが発生した時は、直ちに呼び出し元へリターンする。
resultで返却するデータは、ヌル文字('¥0')で終端させる。
void handleResponse(void) {char res[a3gimMAX_RESULT_LENGTH+1];
int nbytes;
while(a3gim.read(res,a3gimMAX_RESULT_LENGTH+1) > 0) {Serial.print(res);}}５．TCP/IP機能の関数

read バリエーション3 （バイナリデータの読み出し可）
int read(uint8_t* buffer, size_t sz)
機能概要

現在のTCPコネクションから最大szバイトのデータを読み出す

引数

buffer : [OUT] 読み出したデータを格納するバッファアドレス
sz : 呼び出し側で確保したバッファbufferのサイズ（バイト数）
1～sz：正常に読み出した時（読み出したバイト数を返す）

戻り値

0：

データが読み出せなかった時

0未満 : エラーが発生した時（コネクションがcloseされた、エラーが発生した）

補足

179

本関数は常にノンブロッキングで動作する。そのため、読み出せるデータがない
時は直ちに呼び出し元へリターンする。
本関数は、コネクションがcloseされた時やエラーが発生した時は、直ちに呼び出し元へリターンする。
機能はバリエーション2と同じであるが、バイナリデータを扱う場合は本関数を使用すること。バリエーション2と異なり、読み出したデータをヌル文字('¥0')で終端することはしない。

６．TCP/IP機能の関数

write バリエーション1（バイナリデータの書き出し可能）
int write(uint8_t c)
機能概要

現在のTCPコネクションへ１バイトのデータを書き出す

引数c : 書き出すデータ
1 : 正常に書き出した時

戻り値

補足

180

0未満 : エラーが発生した時（コネクションがcloseされた、エラーが発生した、タイムアウトした）
本関数の処理には、状況によって最大30秒程度掛かる
データcとして、制御文字、ヌル文字、あるいは特殊文字(ダブルクォート、$)等もそのまま指定することができる。
本関数は同期処理であるため、コネクションへデータを書き出すまで、コネクショ
ンがcloseされるまで、エラーが発生するまで、あるいはタイムアウトするまで呼び
出し元に制御は戻らない。

６．TCP/IP機能の関数

write バリエーション2（テキストデータの書き出しのみ）
int write(const char* str)
機能概要

現在のTCPコネクションへ文字列データを書き出す

引数

str : 書き出す文字列データ('¥0'で終端する文字配列)
1以上 : 正常に書き出した時（書き出したバイト数を返す）

戻り値0未満 : エラーが発生した時（コネクションがcloseされた、エラーが発生した、タイムアウトした）
本関数の処理には、状況によって最大30秒程度掛かる。
本関数は同期処理であるため、コネクションへデータを書き出すまで、コネクションがcloseされるまで、エラーが発生するまで、あるいはタイムアウトするまで呼び出し元に制御は戻らない。
バリエーション1・3と異なり、バイナリデータを取り扱うためのエスケープ処理を実行しないため、これらに比べて高速に実行できる。

補足【使い方の例】
char *svr = “arduino.cc";
if (a3gim.connectTCP(svr, 80) == 0) {// GET Request for google site
a3gim.write("GET / HTTP/1.0$n");
a3gim.write("HOST:");

a3gim.write(svr);
a3gim.write("$n$n");// Get resopnse..

181}

６．TCP/IP機能の関数

write バリエーション3（バイナリデータの書き出し可能）
int write(const uint8_t* buffer, size_t sz)
機能概要

現在のTCPコネクションへ指定したバイト数のデータを書き出す

引数

buffer : 書き出すデータ（バイト配列）
sz : データのサイズ（バイト数）

1以上 : 正常に書き出した時（書き出したバイト数を返す）
戻り値

補足

0未満 : エラーが発生した時（コネクションがcloseされた、エラーが発生した、タイムアウトした）
バリエーション2ではデータの中にヌル文字('¥0')を取り扱うことができないが、本バリエーションではデータをエスケープ処理するため、データの中に制御文字、
ヌル文字、あるいは特殊文字(ダブルクォート、$)をそのまま含めることができる。
本関数の処理には、状況によって最大30秒程度掛かる。
本関数は同期処理であるため、コネクションへデータを書き出すまで、コネクションがcloseされるまで、エラーが発生するまで、あるいはタイムアウトするまで呼び出し元に制御は戻らない。

【使い方の例】

182

char *svr = "192.168.1.1";
uint8_t binaryData[] = { 0x0, 0x1, 0x2, 0x3, ..};
if (a3gim.connectTCP(svr, 8080) == 0) {a3gim.write(binaryData, sizeof(binaryData));}９．プロファイル関連ほか関数183

プロファイル関連の関数


提供関数ライブラリ
分類
プロファイル

メソッド名

機能概要

setDefaultProfile

デフォルトプロファイルを設定

getDefaultProfile

デフォルトプロファイルを取得

補足【注意事項】プロファイルは、通信サービス事業体が提供するSIMカードを利用するための設定情報である。
詳細は、setDefaultProfile 関数の説明を参照。

184

１．プロファイルの関数

setDefaultProfile

int setDefaultProfile(const char *apn, const char *user, const car *password)
機能概要

デフォルトのプロファイルを設定する

引数

apn: SIMカードのAPN情報
user: SIMカードのユーザ名
password：SIMカードのパスワード

戻り値

補足

185

0：正常に設定できた時
0以外：設定できなかった時（引数の指定が間違っている等）
設定したデフォルトのプロファイル番号は、内臓マイコンのフラッシュROMに記録されるため、電源をOFFにしても維持される（再度、本ライブラリにて設定するまで有効である）
３GIM V2.0の出荷時の設定プロファイル情報は、下記の通りである：
出荷時デフォルト： IIJ様の iijmio サービス(iijmio.jp/mio@iij/iij)

２．プロファイルの関数

getDefaultProfile

int getDefaultProfile(char *apn, char *user, char *password)
機能概要

デフォルトのプロファイル番号を取得する

引数

apn: SIMカードのAPN情報
user: SIMカードのユーザ名
password：SIMカードのパスワード
0：正常に取得できた時

戻り値0以外：取得できなかった時

補足【使い方の例】
int pfNum;
if (a3gim.getDefaultProfile(&pfNum) == 0) {Serial.print("Default Profile No is ");switch (pfNum == 1)case 1 :Serial.println("docomo mopera");case 2 :Serial.println("IIJmio");case 3 :Serial.println("IIJmobile");186

case 11 :Serial.println(“bmobile");case 15 :Serial.println(“DTI ServerMan");default :Serial.println("unknown profile");}ATコマンド実行
int enterAT(unit32_t duration)
機能概要

ATコマンドパススルーモードに切り替え

引数

duration : ATコマンドパススルーモードから戻るまでの時間（単位：0.1秒）
例：300=30秒 600=1分＝０の場合には、ATコマンドパススルーモードに切り替わったまま

戻り値

補足

０：ATコマンドモードに切り替わった場合
１：引数の指定がおかしい時など（モードは切り替わらない）
ATコマンドパススルーモードでは、HL8548-Gに対して直接ATコマンドを送信して、そのままの結果を取得することができる。
ATコマンドの使用に制限はないため、HL8548-Gの設定を任意に変更することができる。しかし、変更した設定等によっては、gw3gファームウェアの動作に支障をきたす場合があるので、十分留意すること。
利用できるATコマンドの詳細は、HL8548-Gの開発元であるSierra Wireless社のサイトで公開されている「AT Commands Interface Guide - AirPrime HL6 and
HL8 Series」を参照のこと。

※ATコマンドそのものに関しては、Tabrainでは技術的なサポートは致しかねます
ので、ご了承ください。

187【補足資料】注意点


本製品で利用している３G通信モジュール（HL8548-G、以下3Gモジュールと呼ぶ）は，付属している3Gアンテナとの組合せで，日本の技適（技術基準適合証明※１）を取得をしています。よって，日本以外の海外での利用や，アンテナの取り換えやケーブルの取り外し等を行った使い方は，電波法違法利用となりますので，絶対行わないでください。



３GアンテナおよびGPSアンテナ，それにそれぞれのケーブルとコネクタは小さく，壊れやすいため，
取扱いには，十分注意してください。特に，頻繁な取り外し・取り付けは行わないようにお願い致します。（GPSアンテナ関係は別売オプションとなります）



Arduinoと3GIMを接続して、電源をONあるいはリセットを掛けた場合，利用できるようになるまで15秒程度の時間が掛かります。



3Gモジュールは瞬間的に消費電力が高くなる場合があり、なるべく外部電源(ACアダプタ)をご利用
頂くことをお薦めいたします。詳細は2章を参照ください。


ご利用されるパソコンの特性により、Arduino側へのUSB接続からの電力供給だけでは、3Gシールドが利用できない場合がありますのでご注意ください。動作が不安定となる場合は、外部電源(ACアダプタ)の利用をお勧めします。

※１ 技術基準適合証明とは、特定無線設備（総務省令「電波法施行規則」で定める小規模な無線局に使用するための無線設備）が電波法令の技術基準に適合していることを証明（電波法第38条の2）することである。（Wikipediaより）

188

１０．サンプルスケッチ群の実行例

189

１．a3gimサンプルスケッチ一覧
A3gimのサンプルスケッチを動かしてみましょう。
あらかじめ設定したサンプルスケッチは、以下の「スケッチの例」に表示されます。

190

２．３GIMシールド・IoTABシールド設定方法
a3gimのサンプルスケッチをArduino IDEで読み込み、ArduinoUNOやGenuino101ほか互換機にコンパイルし、書き込んで、実行してみてください。ここでは、ArduinoUNO＋IoTABシールド＋３GIM または ArduinoUNO＋３GIMシールド＋３GIM を使った設定を紹介しておき
ます。

D7

Rx:D4
Tx:D5

Rx:D4
Tx:D5

５V
ArduinoUNO＋IoTABシールド＋３GIMでは、

ArduinoUNO＋３GIMシールド＋３GIMでは、① JP1とJP2は、RxとTxのジャンパピンをD4とD5に接続① JP１とJP2のRxとTxのジャンパピンをD4とD5に接続② JP４はD7に接続③ JP5は ５Vに接続

191

３．サンプルスケッチの読込・書込・実行

前述の環境か、ほぼ同等の状態で、a3gimのサンプルスケッチをArduinoIDEに読み込み、コンパイルし、Arduino＋ （IoTABまたは３GIM）シールド＋３GIMに書込みます。そのあと実行してみてください。



ここでは、「get_imei.ino」を読込・書込・実行を行ってみています。

192

４．サンプルスケッチの実行結果例■check_baudrate.ino（通信ボーレート確認）■get_status.ino（機能状態取得）

Ready.
Initializing..
Try baudrate: 9600
Recognize succeeded.
Current baudrate is 9600bps.

■check_service.ino（SIMカードのサービス情報）

Ready.
Initializing.. Succeeded.
Status is IDLE
Shutdown...

■get_time.ino（現日時取得）Ready.
Initializing.. Succeeded.
2016/10/22 12:47:58
Shutdown..

Ready.
Initializing.. Succeeded.
Packet Service Only.
Shutdown..

■check_rssi.ino（電波強度取得）■get_time2.ino（現日時取得２）

Ready.
Initializing.. Succeeded.
RSSI = -81 dBm
Shutdown..

Ready.
Initializing.. Succeeded.
1477140604 Sec.
Shutdown..

■get_location.ino(GPS:位置情報・緯度・経度取得）
Ready.
Initializing.. Succeeded. It maybe takes several minutes.
OK: 35.641996, 139.604198
Shutdown..

193■http_get.ino（httpgetによるサーバデータ取得確認）※8行目のサーバを tabrain.jp に変更
Ready.
Initializing.. Succeeded.
httpGET() requesting.. OK!
[<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN""http://www.w3.org/TR/html4/loose.dtd"><html lang="ja"><head><meta http-equiv="Content-Type" content="text/html; charset=Shift]
Shutdown..

■sample_tcpip.ino（tcpipテスト確認）
Ready.
Initializing.. Succeeded.
www.arduino.org : Page title is "Arduino - Open Source Products forElectronic Projects"
Shutdown..
Initializing..

■tweet_sample.ino（ツイート送信確認）
Ready.
Initializing.. Succeeded.
tweet() requesting.. OK!
Shutdown..

※10行目のtokenを設定し、11行目に文章挿入（11行目の文章には空白はエラーとなり、「%20」に変更する）

もくじ【補足資料1】３GIMコマンド・応答一覧表【補足資料2】５Vから3.3Vを作り出す回路例【補足資料3】トラブルシューティング【補足資料4】３GIM V2.0 外形寸法
【補足資料5】 ３GIM サポートサイト【補足資料6】３GIM関連商品のご紹介【補足資料7】 ３GIM V1 との相違点【補足資料8】 ラズベリーパイでの３GIM利用

補足資料

194

【補足資料1】3GIM V2.0コマンド・応答一覧表
No

分類

機能

コマンド送信応答（レスポンス）正常受信応答（レスポンス）エラー受信

1

Version$YV¥n$YV=OK version¥n

2

RSSI

$YR¥n

$YR=OK rssi¥n3

Serice$YS¥n$YS=OK serice¥n

4

IMEI

$YI¥n

$YI=OK imei¥n$YI=NG errno¥n

5

LED

$YL¥n

$YL=OK status¥n$YL=NG errno¥nBaudrate$YB [baudrate]¥n$YB=OK baudrate¥n$YB=NG errno¥n

7

Reset

$YE [level]¥n$YE=OK level¥n$YE=NG errno¥n

8

Time

$YT¥n

$YT=OK datetime¥n$YP=NG¥n9

Airplane mode $YP [mode]¥n$YP=OK mode¥n$YP=NG errno¥n10

ATcommand

$YA¥n

OK

11

Send

$SS msn "message" [encode]¥n $SS=OK¥n$SS=NG errno ..¥n / $SS=NG errtype errcode¥n12 SMS

Receive$SR [index[1]]¥n$SR=OK msn "message"¥n$SR=NG errno¥n

13

Check

$SC [1]¥n$SC=OK rtn¥n

14 GPSGPS$LG method [op [rp]]¥n$LG=OK latitude longitude¥n$LG=NG errno¥n

15

Get

$WG url ["header"]¥n$WG=OK nbytes¥nresponse¥n$WG=NG errno ..¥nPost

$WP url "body" ["header"]¥n$WP=OK nbytes¥nresponse¥n$WP=NG errno ..¥n

17

Read

$TR maxbytes¥n$TR=OK nbytes¥ndata¥n$TR=NG errno ..¥n

18

Write

$TW "data"¥n$TW=OK nbytes¥n$TW=NG errno ..¥n19

Connect$TC host_or_ip port¥n$TC=OK¥n$TC=NG errno ..¥n

20 TCP/IP

Disconnect$TD¥n$TD=OK¥n$TD=NG errno ..¥n21

Status$TS [status]¥n$TS=OK status¥n$TS=NG errno ..¥n22

Get sockname $TN¥n$TN=OK ipAddr portNo¥n$TN=NG errno ..¥n23

Tunnel Write$TT nbyte¥ndata$TT=OK nbytes¥n$TT=NG errno ..¥n24 Profile

Set/Read$PS APN user pw¥n

$PS=OK¥n$PS=NG errno¥n616SystemWeb

195$YR=NG errno¥n【補足資料2】5Vから3.7Vを作り出す回路例◆ 5～12Vの電源(ACアダプタ等)から3GIMが必要とする3.7V電源を作り出す回路の例を以下に示す：◆ 必要な部品は下記の通り：
No

分類

パーツ

数量

実売価格(円)

補足・販売店

1

3端子レギュレータ

AZ1117H-ADJ

1個

30

秋月電子にて10個単位で販売

2

抵抗

1/4W抵抗(240Ω)

1個

10秋月電子・千石電商等で販売

3

抵抗

1/4W抵抗(120Ω)

1個

10秋月電子・千石電商等で販売

4

積層セラミックコンデンサ

25V 10μF

1個

80

秋月電子・千石電商等で販売

5

タンタルコンデンサ(または積層セラ
ミックコンデンサ)

10V 22μF

1個42

千石電商等で販売

196

【補足資料3】トラブルシューティング#

課題

１ 配線・接続

現象

問題点・対応策・UART（Tx:送信、Rx:受信）、電源お ・３GIMコネクタ部の#1~#6までを正しく理解して上で配よびGNDが正しく理解できていない
線・接続のこと#1（電源On/Off：任意）、#2（RX)、#3（Tx）、#4（1.8~5V 電源）、#5（3.3~4.2V電源）、#6（GND）

補足
・#5(VCC)で外部電源を利用する
場合には、3.7Vリチウムイオン電池を推奨

２ 応答（レスポンス） ・コマンドを送っても、返信がない
・正しい応答でない

・通信モジュールとマイコンボードとの通信、またはマイコン
ボードとPCとの通信において以下の原因が考えられる① 3GIMの配線が正しくできていない（配線・接続確認）② 電源供給に問題がある（電源電圧の確認）③ UART通信速度の設定が間違っている（確認設定）④ 初期電源後の待ち時間を考慮不足（15秒以上待機）⑤ プログラムに間違いがあることで再確認⑥ Arduino IDE シリアルモニタ画面の改行コード変更

・応答が正しく表示されない場合の原因は、配線ミスや配線での接触不良が考えられる
・②の電源供給で、VCCの3.3～
4.2Vを間違えるケースが多発
・⑥の場合、改行選択メニューで「CRおよびLF」を選択のこと

３ エラー頻発

・配線・接続が正しくできていること
・適正なSIMカードの挿入されていること
・正しく電源供給できていること

・RSSI（電波強度測定）やSIM
カードのサービス確認
・$YRや$YSコマンドで確認

・#=NGが多発・立ち上げタイミングの問題
・電源供給（電流が小さい）問題

４ 電波強度測定の取得 ・電波強度が取得できない

・正しいSIMカードとアンテナ接続によって正しく設定される ・同 上
・正しい電波強度を取得するにはしばらく時間が掛る

５ SMS送受信

・SMSの送受信ができない・SMSの応答が無い

・SIMカードが、SMS対応になっていない（切替え必要）
・SMSサーバとのやり取りでの不備（何度か読込み必要）

・同 上

６ GPS取得

・GPS取得ができない
・GPS取得に時間が掛る

・GPSアンテナが正しく接続されていること
・GPS電波状態が良い所（屋外・PCから離す）で実施のこと
・初期立上げでは数分から10分ほど掛る場合がある
・電源供給が正しくできていること・一度GPS取得でき、電源が入った状態だと、次からは即取得可能

７ ネット接続・Webコマンド群やTCP/IPコマンド群が正しく応答しない

・３Gアンテナを正しく接続する
・正しいSIMカードが挿入されていない・SIMカードの接続不良（再度再挿入などを実施）
・電源供給が正しくできていること

正しいSIMカードとは、＄PSコマ
ンドを使ってプロファイル設定されたSIMカードであること。WiKi
ページで情報公開※その他トラブルが有った場合には、WiKiページにてお問い合わせください。
http://form1.fc2.com/form/?id=816242
基本的なことは、これまでWiKiページサイトや、本資料等にて掲載していますので、そちらをご覧ください。 基本的なことでのお問い合わせは、返答を控えさせていただくことがあります。＄コマンドのエラーコード一覧表は、こちらとなります。

197

【補足資料4】３GIM V2.0 外形寸法198

【補足資料5】 ３GIM サポートサイト
３GIMに関する技術情報が盛りだくさん掲載されています。
http://a3gs.wiki.fc2.com/wiki/3GIMの紹介
内容（もくじ）■３GIM（3G IoT Module)について・概要
・外観
・提供する機能・３GIMスペック
・ピン配置■機能一覧(UART経由で利用する場合)
・UARTコマンドインタフェースの概要
・コマンド一覧■ ５Vから3.7Vを作り出す回路例■利用上の留意点■トラブルシューティング■ダウンロード■事例・Intel Edisonで使ってみました
・Arduinoを使ったモノ
・mbedを使ったモノ■ 3GShield ＆ ３GIM Lab
・Intel Edisonを使った事例
・３GIMを使った環境モニタ
・ラズベリーパイで3Gシールドを使ってみました・Intel Galileoで3Gシールドを使ってみる
・ハウス向け監視モジュールの試作(その2)・ハウス向け監視モジュールの試作
・GR SAKURAでの利用
・簡易監視装置の試作
・メール読み上げ機の試作
・3Gシールドを使ったセンサネットワークの試作199

【補足資料6】３GIM関連商品のご紹介
３GIMをArduino UNO や Genuino101 上、それにRaspberryPi（B＋、２B、３B、Zero)でも簡単に稼動させることができる3GIMシールドや３GIM HAT、それに14種類ものセンサ類等を持つTABシールドや10種類のIoTAB
シールドV3.0を使うことで、誰もが、簡単に、短時間で「IoTデバイス」のモノづくりできるプロトタイピング開
発環境が揃います。
（センサ値などをメールで送信し、ツイッタ―連携、クラウド連携が、容易に学べます）

３GIMシールドは、Arduino UNOやGenuino101、さらにArduino MEGAなどの上で簡単に３GIMを利用することができます。
３GIMシールドは、電源電圧3.7Vを３
GIMに安定供給し、安心して３GIMを稼動させることができます。

３GIM HATは、Raspberry Pi の多くの種類で稼動する３GIM専用の拡張ボードで、USBケーブルによるイン
ターネット接続と、UART接続による＄コマンド通信ができるものです。
Raspberry Piを野外のゲートウェイとして利用もでき、アナログセンサ対応ボードとしても利用できます。

200

TABシールドは、多くのセンサ類およびLCD・LED・スピーカなどの14種類もの電子部品を搭載した試作用キットとなります。
Arduino上で、センサ類やLCD・LED等を使った処理を検討する場合、半田付けやジャンパーケーブルの接続なしに、プログラミングだけで動かすことができます。

IoTABシールドV3.0は、これまでのセンサ拡張ボードTABシールドに、３GIMが取り付けられる仕様としました。このことで、IoTデバイスの試作に取り掛かることができ、そのままセンサネットワークとしても利用できるようになります。

【補足資料７】 ３GIM V1 との相違点
ハードウェアの違い

通信モジュール（HL8548-G）を搭載しました。（V1は、DTW400Wを搭載）



基板サイズは、厚さが7㎜と僅かに薄くなりまいた。（V1は、8㎜）



ご利用いただける電源電圧を、3.3~4.4Vとしました。（V1は、3.6~4.4V ）※Arduino UNOの3.3Vを使った場合には、マイコンボードの固体差もあり、PC側のUSBによる電源電力の差もあり、通信できたり、できなかったりします。



ファームウェアの違い


電源投入後（#1をLOW)、緑LEDが点滅した後、初期立上げメッセージが表示されます。



初期立ち上げメッセージは「Welcome to 3GIM(v2)」となりました。（V1は、「Hello, I‘m gw3g(Ver 2.0)」）

初期立ち上げ時間が、ほぼ15秒と短くなりました。（V1では、約25~35秒ほど）

一部のコマンドでの応答が変わりました。各コマンドの応答値をご覧ください。

通信ボーレートは、変更されると、リセットする必要なく、そのままご利用頂けます。（V1は、ハードウェアリセットが必要）

つまり￥YBを使ってボーレートを変更したのち、シリアル通信を同じく変更（Arduinoではbegin関数など）して即利用できます。


通信ボーレートは、9600・38400・57600・115200bpsとしました（推奨）。（V1は、4800pbs ～57600bpsまで設定可能）

ご利用頂けるSIMカードは、ユーザ設定できるようになりました。（V1は、限定された既存設定SIMカードから選択）
SIMカードのプロファイル（APN情報、ユーザ名、パスワード）設定・参照は、＄PSコマンドのみでできるようにしました。



GPS機能（精度も向上、コマンドオプション追加）を拡張しました。（V1は、V2に比べ精度が悪かった）

一部機能を削減（ストレージ機能）しました。（V1は、ストレージ機能保有）

一部機能を追加（TCPIP機能の32Kバイト送信可能な＄TTコマンドなど）しました。（V1は、最大1024バイトで送信）

V1で開発したソフトの変更点（参考）

初期立ち上げ時の待機時間やメッセージを受信した立ち上げでの配慮が必要となります。



コマンドの応答が一部異なることへの配慮が必要となります。

a3gim.zipのバージョンが変わり、一部機能変更がありますので、別途関連資料をご参考ください。

201

【補足資料８】 ラズベリーパイでの３GIM利用
３GIM(V2)は、Arduinoだけではなく、ラズベリーパイ等のLinuxでも簡単に利用できます。
ここでは、ラズベリーパイで3GIM(V2)を3Gモデムとして利用するための手順をご紹介します。
3GIM(V2)を3Gモデムとして利用することで、3GIM(V2)をUART経由で利用する方法に比べて、下記の利点が得られます：
１）高速な通信が可能
デフォルトで460kbpsの通信速度（設定ファイルで変更可能）
２）Linux上の豊富なネットワーク系コマンドが利用が可能
ブラウザ等のインターネットアプリケーションや、いわゆるSocket APIが利用できるのでC/C++やPython/JavaScript等で簡単にインターネット通信が利用できる●情報サイト（http://a3gs.wiki.fc2.com/wiki/3gimV2_sample2）
ここでは、ラズベリーパイ 2/B/B+ で使用する例をご説明します。A/A+、さらにはZeroでも同様に利用できます。
ただし、A/A+ではUSBコネクタの口が一つしかないため、（少なくとも設定する時には）USBハブが別途必要になります。
（近日中に「３GIM HAT V1.0」として、RaspberryPi向け拡張ボードを販売する予定でいます。2016年3月末時点）（近日中に「IoTABシールドV3.0」を販売する予定で、これによってIoTデバイスの試作教育が簡単になります）
お問い合わせは、info@tbrain.jp まで202