3GIM の魅力
株式会社タブレイン 高本孝頼
2016/04

パート２：Arduino と 3GIM で遠隔制御・遠隔監視を学ぶ
１．Arduino＋3GIM の技術的可能性
前回パート１において Arduino および 3GIM の概要、それに開発事例をご紹介しました。本
パート２では、具体的な Arduino と 3GIM を使った技術的なスキルアップの為の開発事例を紹介していきます。
Arduino を使えば、多くのセンサ類やアクチュエータ類を簡単に、しかも短時間に制御できるようになります。その理由は、GPIO（汎用 IO ピン）などが使いやすく、ネット上に豊富な事例が掲載されているからです。例えば新しいセンサなどを購入した場合でも、ネット上に多くのヒントが検索でき、アナログかデジタル、もしくはシリアル通信（UART や I2C、SPI）などの接続情報や、そのサンプルスケッチ（Arduino ではプログラムのことをスケッチと呼びます）を真似るだけですぐに動かすことができるようになっています。
また本 3GIM と Arduino を使うことで、取得したセンサ値を、広域無線の３G 通信によってインターネット上のクラウド・サーバにアップすることも簡単に行えるようになります。さらにセンサ値をトリガーとしてメール送信したり、ツイッターに送信したり、それにクラウドにアップしたデータをグラフ表示したりすることも簡単に開発できます。つまり Arduino と 3GIM を使うことで、ワイヤレスセンサネットワークや、そのデータを収集し分析するビックデータのビジネス、それに前回紹介した M2M/IoT ビジネスなどへと繋げる環境がそろうことになります。
以下では、Arduino と 3GIM、それに互いを繋ぎ合わせる３GIM シールドを使って、IoT デバイス・ゲートウェイを構築し、簡単にセンサ値のサーバへのアップと、値のメール送信、それにスマートデバイス（スマホなど）からの制御によって LED 点灯やスピーカ音を鳴らしたりすることを行っています。

図１．IoT デバイス側の組み立て（温度センサと圧電スピーカ取付）1本事例では、、図１のように温度センサと圧電スピーカを取りつけた IoT デバイスを組み立て、自分のスマホから３GIM 上の LED や圧電スピーカを操作したり、温度センサ値をメールにてスマホで受信することを行います。
ここでは Arduino として、Genuino101 を用い、３GIM シールドを搭載し、さらに３GIM V2.0にピンはんだ付けして、３GIM シールドに取り付けます。それと、ここで使う温度センサ（LM61BIZ）と圧電スピーカを３GIM シールド上に図のように取り付けます。温度センサは、アナログポートの A0 に温度センサの GND ピンを、A1 に Vout ピンを、A2 に VCC ピンを挿入します。圧電スピーカは、３GIM シールドの GND とデジタルピン D8 に挿入します。

２．事例開発のためのハードと統合開発環境（Arduino IDE）の準備
ここで紹介する Arduino（Genuino101 を利用）および３GIM、それに３GIM シールドは、以下のスイッチサイエンス社のサイトから購入できます。
ここでは、①Genuino101 や②３GIM、③３GIM シールド、それに④マイクロ SIM カード、その他に⑤センサキット（みんなの Arduino 入門：初級キット）、⑥UAB ケーブル、⑦９V1.3Aの AC 電源アダプタなどの入手・準備が必要となります。
① https://www.switch-science.com/catalog/2670/② https://www.switch-science.com/catalog/2607/③ https://www.switch-science.com/catalog/2579/④ https://www.switch-science.com/catalog/2604/⑤ https://www.switch-science.com/catalog/1900/⑥ https://www.switch-science.com/catalog/1033/⑦ https://www.switch-science.com/catalog/1795/
また、Arduino の統合開発環境は、http://arduino.cc/ のサイトから、PC にダウンロードするようになっています。2016 年春時点での最新版は、arduinoIDE1.6.8 となっています。

図３．Arduino 互換機（Genuino101）のマイコンボード（左）と統合開発環境（右）その他にインターネット上のサーバが必要ですので、フリー（無償）サーバの「webcrow.jp」などで php ファイルが使えるオプションを登録してご準備ください。

2３．全体フロー概要と操作手順
それでは、遠隔で監視モニタリングしたり、遠隔制御したりするための技術を、簡単なサンプルを使って学んで行きましょう。まずは、全体の概要図を紹介し、その操作手順で何を実現しているかをご紹介いたします。（プログラム紹介は後述しています）

図４．遠隔制御・監視のための全体概要図

図５．フリーサーバ上にアップした①から③までのプログラム（html1 本と php2 本）

3

この事例で作成するプログラムは、図４の中の四角い（黒塗り）丸数字で示した①から④までの４つとなります。
うち④のみが Arduino の IDE で作成し、Arduino ボード上に書き込みます。
他の①から③の３つのプログラムは、登録したフリーのサーバ（ここでは webcrow.jp）上にアップしておきます（図５.参照）。
つぎに、この中の①「3gfrom.html」をスマホやタブレット、または PC 上の Web ブラウザから以下の html を起動してみましょう。
http://****.webcrow.jp/3gform.html
ここでの「****」は、webcrow.jp で登録した名前となります。
起動すると図６のようなプルダウンメニューが出てきます。

図６．①「3gform.html」の起動画面
このプログラムで、４つのメニュー選択ができるようになっています。それぞれの働きは、以下のとおりです。
㋐「LED on」
： ３GIM 上の LED を点灯㋑「LED off」
：３GIM 上の LED を消灯㋒「Send E-mail」：温度センサの値を指定したメールアドレスに送信㋓「Speaker Alarm」：圧電スピーカを鳴らす
つまり、㋐と㋑、㋓が遠隔にある IoT デバイスを操作することで「遠隔制御」の事例となります。㋒は、IoT デバイス上の値を手元のスマホなどで確認できるようにしたことで、「遠隔監視」または「遠隔モニタリング」の事例となります。
この①「3gform.html」の起動上の㋐から㋓までのメニュー選択を行い、【送信】をボタンを押すことで、内部処理として、②「3gmakefile.php」が起動し、一時ファイル「3gsa.xxx」に、上記のいずれかのコマンドが選択されたかを書込みします。
また、③「sendmail.php」プログラムは、図６のメニューで㋒「Send E-mail」が選択され4たときに起動するもので、IoT デバイスから送られてくる温度センサ値を、指定された自分のメールアドレスに送信するものです。
ここで送られてくるメール内容は、以下のようになります。

図７．
「Send E-mail」選択で送られてきたメール受信の例（スマホ側）
それでは、これら４つのプログラム（スケッチ）を手順追って説明していきましょう。

４．サーバ側の３つのプログラム
サーバ側には、上の図で示した番号のとおり、①クラウドから直接呼び出される「選択メニュー」プログラム(3gsaform.html)と、②「選択メニュー」から自動的に起動する「コマンドファイル出力」プログラム(3gmakefile.php)、それに③ 3GIM 側から起動される「メール送信機能」が用意されます。
それでは、それぞれのプログラムについて紹介していきましょう。
① 「選択メニュー」プログラム：3gform.html （html プログラム）
このプログラムはとても簡単で、上述した４つの選択肢メニュー（ＬＥＤ点灯やメール送信、アラーム発生）を表示させ、「送信」ボタンが押されると、②の「コマンドファイル出力」プログラム「3gmakefile.php」が、引数渡しで起動されます。
リスト１に、①の「3gform.html」のプログラム内容を紹介します。
このプログラムは、Ｗｅｂブラウザ上で「http://****/3gfrom.html」を起動すると、図４の選択メニューが表示され、４つの選択された後に「送信」ボタンが押されると同時に、「3gmakefile.php」の HTTP リクエストが実行されます。

5

リスト①．メニュー選択プログラム（3gform.html）// リスト①．メニュー選択プログラム（3gform.html）<form action = "3gmakefile.php" method = "post"><p> 3GIM menu <br><select name="cmd" id="cmd"><option value="LED on">LED on</option><option value="LED off">LED off</option><option value="Send E-mail">Send E-mail</option><option value="Speaker Alarm">Speaker Alarm</option></select></p><input type="submit" value="command send"></form>② 「コマンド出力」プログラム：3gmakefile.php (php プログラム)
このプログラムは、上記リスト①で選択された値(cmd)が、リスト②の「＄_POST[“cmd”]」経由で渡され、それを変数「$x」に代入し、一旦「temp.xxx」というファイル名に値を出力します。その後、ファイル名「3gsa.xxx」にファイルをコピーしています。
リスト②．コマンド出力プログラム（3gmakefile.php）//リスト②．コマンド出力プログラム<meta name="viewport" content="width=device-width, initial-scale=1.0"/><?php// echo $_POST["cmd"];$x=$_POST["cmd"] . "";$fn1="temp.xxx";$fp=fopen($fn1,'w');
fputs($fp, $x);
fclose($fp);$fn2 = “3gsa.xxx”;
copy($fn1 , $fn2);
echo 'command = [' . $x . ']';?>
<br><inputtype="submit"

name="buttonName"

onClick="history.back()" />6

value="back"この中で一旦ファイル名を置き換えているのは、ファイルをオープンした状態で、3GIM 側からのポーリングによる読込みによって、エラーとなるのを防ぐためのものとなっています。

図８．クライアント側に表示される「コマンド出力」プログラムの表示例
このリスト②のプログラムの実行結果は、図８のように選択されたコマンド内容が表示されます。
③ 「メール送信機能」プログラム： sendmail.php （php プログラム）
このプログラムは、IoT デバイスの Arduino＋3GIM 側のリスト④から起動されるプログラ
ムで、メール送信先「$_GET[“email”]」および温度センサの値「$_GET[“temp”]」を IoTデバイスからもらって、メール送信するプログラムとなります。
リスト③．メール送信プログラム（sendmail.php）// リスト③．メール送信機能コマンド出力プログラム<HTML><HEAD><TITLE> 3GIM send e-mail </TITLE><HEAD><BODY><H3> 3GIM TEMP get </H3>

引数「email」
メールアドレス<?php
if(mail($_GET["email"], // to'Hi 3G shield' ,// タイトル

' 3GIM ALARM ' . "\r\n" . 'DATE = ' . date('Y-m-d') . 'TIME = ' .
date('H:i:s') . "\r\n" . 'TEMP = ' . $_GET["temp"] ,//本文'From: 送信元名前<送信元メールアドレス>' . "\n" .
'X-Mailer: PHP/' . phpVersion()))

引数「temp」
温度センサ値

echo '<B>SUCCESS TO SEND</B><BR>';else
echo '<B>faile to mb_send_mail</B><BR>';?></BODY>

このプログラムを起動することで、図７のようなメールが送られてきます。
ここでは、温度センサ値のほかに、日付と時間も同時に添えてメールで送ってきます。

7

５．Arduino+3GIM 側のスケッチ（_3gmain.ino）
つぎに Arduino+3GIM 側のプログラム（スケッチと呼ぶ）をご紹介します。このプログラム
は、サーバ側にある「3gsa.xxx」ファイル（②で書出しされたコマンドの内容）を読み込む機能や、温度センサの値をメール送信する際に、上記③を起動する機能などを備えたスケッチ④となります。
このスケッチは、基本的には立ち上がって自動的に無限ループによる Web 上のコマンド出力
ファイルを 10 秒おき（スケッチの最後の「delay(10000)；」と記述）に見に行き、その中身が変わった時点で、それぞれ４つの処理を区別して行います。この Web 上のコマンド出力ファイルを読みに行くのがポーリング作業で、Arduino＋3GIM 側は、繰り返しコマンド出力ファイルが何に置き換わったかを見に行くことが必要となります。
またここでは、メール送信と圧電スピーカの連続的な操作を避けるため、制御を見送る処理を取っています。この見送るための変数として、２つのブーリアン値「swm」と「swa」を使って制御を行っています。
リスト④．Arduino+3GIM 側のスケッチ（_3gmain.ino）//リスト④：Arduino+3GIM 側のスケッチ#define BAUDRATE 38400#define LM61BIZ_Pin 1#define SPK_Pin 8
String server = "http://YOURID.webcrow.jp/";「YOURID」は、webcrow の登録サイト

void setup() {while (!Serial);
Serial.begin(BAUDRATE);
Serial1.begin(BAUDRATE);
Serial.println("Ready...");
３GIM シールド
pinMode(7, OUTPUT); digitalWrite(7, HIGH); delay(5);設定
digitalWrite(7, LOW);
pinMode(A0, OUTPUT); // A0(LM61BIZ - GND)
digitalWrite(A0, LOW);
温度センサ設定
pinMode(A2, OUTPUT); // A2(LM61BIZ - VSS+:3.3V)「LM61BIZ」
digitalWrite(A2, HIGH);
pinMode(SPK_Pin, OUTPUT);
圧電スピーカ設定
delay(14000);
while (Serial1.available())
Serial.println(Serial1.readStringUntil('\n'));Serial.println("Start..");}
void loop(){ unsigned long tim;
static boolean swa = true, swm = true;
3gsa.xxx 読込み
Serial1.println("$WG " + server + "3gsa.xxx");
String res;do {while (!Serial1.available());
res = Serial1.readStringUntil('\n');Serial.println(res);} while (res.indexOf("$WG=") < 0);8

if (res.indexOf("$WG=OK") == 0) {res = Serial1.readStringUntil('\n');Serial.println(res);
if (res.indexOf("LED on") == 0) {㋐LED onswa = true; swm = true;
Serial1.println("$YL 1");}else if (res.indexOf("LED off") == 0) {㋑LED offswa = true; swm = true;
Serial1.println("$YL 0");}else if (res.indexOf("Send E-mail") == 0) {温度センサ値取得
if ( swm ) {float temp = analogRead(A1) * 0.322 - 60.0; // 3.3V convert
tim = millis();Serial1.println("$WG " + server +"/sendemail.php?email=送信先メールアドレス&temp=" +String(temp));do {while (!Serial1.available());
メール送信プログラム③の起動
res = Serial1.readStringUntil('\n');} while (res.indexOf("/BODY") < 0 && (millis() - tim < 30000));}
swm = false;}
else if (res.indexOf("Speaker Alarm") == 0) {㋒Send E-mailif (swa) {tone(SPK_Pin, 250, 3000);delay(5000);};㋓Speaker Alarm
swa = false;}}
Serial.print(".");
delay(10000);}

このスケッチの中で 3GIM 利用で httpGET を利用しているところは 2 ヶ所しかありません。
１つは、「3gsa.xxx」ファイルを読み込むところ、もう１つはメール送信プログラムのところとなります（黄色吹き出し部）
最初の 3gsa.xxx を呼び出すとおろは、Serial1.println("$WG " + server + "3gsa.xxx");
で、実際には「$WG http://YOURID.webcrow.jp/3gsa.xxx」を記述しているだけで「3gsa.xxx」に記述されているコマンドを読み込みます。
２つめのは、Serial1.println("$WG "＋server + ”/sendemail.php?email=送信先メールアドレス&temp="+String(temp));で、リスト③「sendmail.php」を起動し、２つのパラメータ「email」と「temp」の値にメールアドレスと温度センサ値を入れて送っています。

9

如何でしょうか？これだけ簡単に、インターネットとの連携ができることは、自分でもできると思われるのではないでしょうか？
これらのプログラムを応用するだけで、Arduino＋3GIM 側の入出力の電子部品を、簡単に遠隔地から操作でき、またセンサ値などを簡単に取得することができるようになります。
TCP/IP などを使えば、さらに高速な処理なども可能ですので、いろいろと試してみては如何でしょうか。
本スケッチは、2013 年に 3G シールド版で作成したものを改変したものです。３G シールド版では、中学生らが学習し、アイデアコンテストで最優秀賞や優秀賞を取るといった土台にものあった資料となっています。
つぎのパート３では、フリーのクラウドサービス M2X に、センサ値をアップしたり、ツイッタ―にセンサ値をアップしたりする事例を紹介しましょう。こちらもとても簡単にできる仕組みとなっています。以前某大学の先生が、3GIM を手に取って僅か数時間後にクラウドにセンサ値をアップされました。この驚異的な時間は、技術ハードルの低さを物語っていると言えると思います。それでは次号をお楽しみにしてください。

以下は、3GIM 関連の情報が掲載されているサイトです。
１．3GIM 関連資料一式： http://tabrain.jp/service3gim.html
２．NPO 法人オープンワイヤレスアライアンスのサイト
３．3GIM 技術情報および保守サイト

http://owalliance.org/

http://a3gs.wiki.fc2.com/

４．Facebook「NPO 法人オープンワイヤレスアライアンス」でも技術情報紹介
パート 1 の資料は、こちらからダウンロードできます。

以10上