3G シールドの 魅 力 高 本 孝 頼 2013 年 8 月 パート2:Arduino+3G シールドの 技 術 例 紹 介 1.Arduino+3G シールドの 技 術 可 能 性 前 回 において Arduino および3G シールドの 概 要 をご 紹 介 しました ここでは 具 体 的 な Arduino と3G シールドを 使 った 技 術 的 な 可 能 性 を 紹 介 していきます Arduino 側 では 多 くのセンサ 類 やアクチュエータ 類 を 簡 単 に しかも 短 時 間 で 制 御 でき ます 例 えば 新 しいセンサなどを 購 入 した 場 合 でも アナログ 接 続 かデジタル 接 続 もしく はシリアル 通 信 (I2C や SPI)による 接 続 のいずれかであれば ネット 上 に 多 くの 事 例 紹 介 とともに そのサンプルスケッチ(Arduino ではプログラムのことをスケッチと 呼 びます) によるヒントが 頂 けるようになっています また3G シールドを 使 うことで インターネット 上 の Web アプリケーションやクラウドサ ービス ツイッタ 連 携 それにメール 送 信 などが 利 用 できるようになります つまり Arduino と3G シールドを 使 うことで ワイヤレスセンサネットワークや そのデ ータを 収 集 し 分 析 するビックデータのビジネス それに 前 回 紹 介 した M2M ビジネスなどへ と 繋 げることができます また その 他 の3G シールドの 機 能 としては GPS( 位 置 情 報 取 得 ) 機 能 や 時 刻 の 取 得 機 能 SMS 送 受 信 機 能 などを 持 ち 合 わせています 以 下 では Arduino と3G シールドを 使 う 上 での 技 術 ハードルとして どのようなものが あるか またそれがどれだけ 簡 単 かをご 紹 介 していきたいと 思 います 2.Arduino と3G シールドの 利 用 環 境 の 準 備 Arduino は ハードウェアのマイコンボードと 統 合 開 発 環 境 (IDE と 呼 ばれる)の2つ のことを 指 して 言 います マイコンボードは ネット 上 で 簡 単 に 購 入 でき 1-2 日 間 ほどで すぐに 入 手 できるようになっています (スイッチサイエンス 社 のサイトなど 参 照 ) 1
図 1.Arduino とはマイコンボード( 左 )と 統 合 開 発 環 境 ( 右 ) また 統 合 開 発 環 境 は http://arduino.cc/ のサイトから PC にダウンロードするよう になっています PIC マイコンや H8 マイコンなどに 比 べ Arduino といくつかの 電 子 部 品 それに USB ケーブルさえあれば 直 ぐに 動 かすことができるようになっています ただ Arduino のドライバを 一 度 だけ PC にインストールしておく 必 要 はあります つぎに3G シールドですが こちらもネットから 購 入 できるようになっていていますが 利 用 するための SIM カードは 手 持 ちのものか 別 途 手 配 する 必 要 があります ( 現 在 3G シールドで 利 用 できる SIM カードは NTT ドコモの FOMA の SIM カードに 限 定 ) また3G シールドのソフトウェアの 最 新 版 は ホームページの http://3gsa.org/からか もしくは Wiki ページの http://a3gs.wiki.fc2.com/ に 掲 載 されているところから ダウン ロードできるようになっています この Arduino と3G シールドを 繋 いで 使 う 上 では 3G シールド 側 に 出 ている 複 数 のピン を Arduino 側 に 差 し 込 むだけで 利 用 できるようになっています 特 にソフトウェアの 設 定 などは 不 要 となっています 3.スマホなどのクライアント 側 から Arduino+3G シールド 側 の 操 作 それでは Arduino と3G シールドを 使 ったプログラミンがどれだけ 簡 単 かをご 紹 介 してい きましょう まずご 紹 介 する 事 例 の 全 体 像 を 説 明 していきましょう 2
図 2.Arduino+3G シールドによる 開 発 事 例 この 図 においては まず1のクライアント 側 からサーバ 上 にある HTML(3gform.html) を 起 動 します この 起 動 によって 以 下 のようなメニューがスマホや PC などに 表 示 されま す ここでは 単 純 に 4つのメニューの 選 択 ができるようになっています 1) LED 点 灯 2) LED 消 灯 3) 温 度 センサ 値 をメールで 受 信 4) スピーカのアラームを 発 生 (5 秒 間 ) つまり Arduino と3G シールド 上 に 付 けた LED や 圧 電 スピーカ それに 温 度 センサを 使 って 遠 隔 でのクライアント 側 (スマホや PC)から LED を 点 滅 させたり スピーカを 鳴 らしたり また 温 度 センサの 値 を 取 り 出 し 自 分 のメールアドレスに 受 信 したりするものです ここでは サーバ 側 に HTML プログラムが1つと PHP プログラムの2つの 計 3つを 用 意 しておきます また Arduino+3G シールドを 使 う 上 では Arduino 上 に1つのスケッチ ( 制 御 プログラム)を 用 意 しておきます それでは 以 下 にそれぞれのプログラムとスケッチをご 紹 介 していきましょう 4.サーバ 側 の3つのプログラム サーバ 側 には 上 の 図 で 示 した 番 号 のとおり 1クラウドから 直 接 呼 び 出 される HTML の 選 択 メニュー プログラム(3gsaform.html)と 2 選 択 メニュー から 自 動 的 に 起 動 す る コマンドファイル 出 力 プログラム(3gmakefile.php) それに3 3G シールド 側 から 起 動 される メール 送 信 機 能 が 用 意 されます 3
それでは それぞれのプログラムについて 紹 介 していきましょう 1 選 択 メニュー プログラム:3gform.html (HTMLプログラム) このプログラムはとても 簡 単 で 上 記 選 択 肢 メニュー(LED 点 灯 やメール 送 信 アラ ーム 発 生 )を 表 示 させ 送 信 ボタンが 押 されると 2の コマンドファイル 出 力 プ ログラム(3gmakefile.php)が 引 数 渡 しで 起 動 されます 図 3.クライアント 側 で 起 動 した 選 択 メニュー (3gform.html)の 画 面 リスト1に そのプログラム 内 容 を 紹 介 します つまり このプログラムは 端 末 側 から http://****/3gfrom.html で 起 動 すると 図 3の 選 択 メニューが 表 示 され 4つの 選 択 された 後 に 送 信 ボタンが 押 されると 同 時 に 3gmakefile.php の HTTP リクエストが 行 われます <form action = "3gmakefile.php" method = "post"> <p> 3G シールド 起 動 メニュー <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=" 送 信 "> </form> リスト1.メニュー 選 択 プログラム(3gform.html) 2 コマンド 出 力 プログラム:3gmakefile.php (php プログラム) このプログラムは 上 記 1で 選 択 された 値 が $_POST[ cmd ] 経 由 で 渡 され そ れを 変 数 $x に 代 入 し 一 旦 temp.xxx というファイル 名 に 値 を 出 力 します その 4
後 ファイル 名 3gsa.xxx にファイルをコピーしています <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 ' 実 行 コマンド = ['. $x. ']';?> <br> <input type="submit" name="buttonname" value=" 戻 る " onclick="history.back()" /> リスト2.コマンド 出 力 プログラム(3gmakefile.php) この 中 で 一 旦 ファイル 名 を 置 き 換 えているのは ファイルをオープンした 状 態 で 3G シー ルド 側 からのポーリングによる 読 込 みによって エラーとなるのを 防 ぐためのものとなって います 図 4.クライアント 側 に 表 示 される コマンド 出 力 プログラムの 表 示 例 このプログラムが 終 了 すると 選 択 されたコマンドの 内 容 がクライアント 画 面 に 図 4のよ うに 表 示 されます 3 メール 送 信 機 能 プログラム:3gsendmail.php (php プログラム) 5
このプログラムは Arduino+3G シールド 側 から 読 み 込 みされるプログラムで メール 送 信 先 $_GET[ email ] に 引 数 で 渡 されてくる 温 度 センサの 値 $_GET[ temp ] を 書 き 込 んで 送 信 するプログラムとなります <HTML> <HEAD><TITLE> 3G send e-mail </TITLE><HEAD> <BODY> <H3> 3G shield temp get </H3> <?php メールアドレス if(mail($_get["email"], // to 'Hi 3G shield',// タイトル ' 3Gshield ALARM '. "\r\n". 'DATE = '. date('y-m-d'). 'TIME = '. date('h:i:s'). "\r\n". 'TEMP = '. $_GET["temp"],// 本 文 'From: 3GSA<info@***.jp>'. "\n". 'X-Mailer: PHP/'. phpversion())) 温 度 センサ 値 echo '<B>SUCCESS TO SEND</B><BR>'; else echo '<B>faile to mb_send_mail</b><br>';?> </BODY> リスト3.メール 送 信 機 能 コマンド 出 力 プログラム(3gmakefile.php) このプログラムを 起 動 することで つぎの 図 5のようなメールが 送 られてきます 図 5. 温 度 センサ 値 のメール 受 信 画 面 ここでは 温 度 センサ 値 のほかに 日 付 と 時 間 も 同 時 に 添 えてメールで 送 ってきます 5.Arduino+3G シールド 側 のスケッチ 6
つぎの Arduino+3G シールド 側 には サーバ 側 にあるデータ ファイル(2で 書 出 しさ れたコマンドの 内 容 )を 読 み 込 む 機 能 や 温 度 センサの 値 をメール 送 信 する 際 に 上 記 3を 起 動 する 機 能 などを 備 えたスケッチ4が 用 意 されます (Arduino のプログラムのことをスケ ッチと 呼 びます) このスケッチは 基 本 的 には 立 ち 上 がって 自 動 的 に 無 限 ループによる Web 上 のコマンド 出 力 ファイルを 3 秒 おき(スケッチの 最 後 に delay(3000); と 記 述 )に 見 に 行 き その 中 身 が 変 わった 時 点 で それぞれ4つの 処 理 を 区 別 して 行 います この Web 上 のコマンド 出 力 ファイルを 読 みに 行 くのがポーリング 作 業 で Arduino+3G シールド 側 は 繰 り 返 しコマ ンド 出 力 ファイルが 何 に 置 き 換 わったかを 見 に 行 くことが 必 要 となります またここでは メール 送 信 と 圧 電 スピーカの 連 続 的 な 操 作 を 避 けるため 制 御 を 見 送 る 処 理 を 取 っています この 見 送 るための 変 数 として 2つのブーリアン 値 swm と swa を 使 って 制 御 を 行 っています #include <SoftwareSerial.h> #include "a3gs.h // LM61BIZ output pin: A1 #define LM61BIZ_Pin 1 int port = 80; int spk=8; //char res[15]; char path2[100]; //メールアドレス+ 温 度 センサ 値 バッファ int gettemp(void) 温 度 センサ 値 の 計 算 関 数 { int mv = analogread(lm61biz_pin) * 4.88; return (mv - 600); void spkalarm() { 圧 電 スピーカを 5 秒 間 鳴 らす 関 数 for(int i=0; i<500; i++) { digitalwrite(spk,high); delay(3); digitalwrite(spk,low); delay(2); void setup() 温 度 センサのピン 接 続 (A0,A1,A2 利 用 { pinmode(a0, OUTPUT); // A0(LM61BIZ - GND) digitalwrite(a0, LOW); pinmode(a2, OUTPUT); // A2(LM61BIZ - VSS+) digitalwrite(a2, HIGH); 圧 電 スピーカを D8 に 接 続 7
Serial.begin(9600); pinmode(8,output); pinmode(13,output); LED を D13 に 接 続 while(!(a3gs.start() == 0 && a3gs.begin()==0)) ; Serial.println("Start.."); a3gs.setled(true); 3G シールドの 初 期 化 void loop() 3G シールド 上 の LED 点 灯 { 3G シールド 上 の LED 点 滅 static boolean swa=true, swm=true; if(swa==false swm==false) a3gs.setled(false); const char *server = "www.*****.jp"; サーバ 側 のサイト const char *path = /****/3gsa.xxx"; char res[15]; コマンドファイルのフォルダ const int len = 15; コマンド 読 込 み res に 設 定 if (a3gs.httpget(server, port, path, res, len) == 0) { Serial.println(res); if(strncmp(res,"led on",6)==0 ) { LED on の 場 合 swa=true; swm= true; digitalwrite(13,high); else if(strncmp(res,"led off",7)==0) { LED off の 場 合 swa=true; swm= true; digitalwrite(13,low); else if(strncmp(res,"send E-mail",11)==0) { 温 度 センサ 値 のメール 送 信 の 場 合 if ( swm ) { int temp = gettemp(); 送 信 先 メールアドレス sprintf(path2, /*****/3gsendemail.php?email=*****&temp=%d.%d", temp/10, temp%10); if (a3gs.httpget(server, port, path2, res, len) == 0) Serial.println( res ); delay(5000); 3gsendmail.php 起 動 swm = false; else if(strncmp(res,"speaker Alarm",13)==0) { if (swa) { spkalarm(); ; swa = false; 圧 電 スピーカアラームの 場 合 8
delay(100); Serial.print("."); delay(3000); ポーリングを 行 う 待 機 時 間 (3 秒 ) リスト4.Arduino+3G シールド 側 のスケッチ(3gsaALL.ino) このスケッチの 中 では 3G シールド 専 用 の 関 数 群 は 赤 字 のわずか 4 つしか 使 っていま せん 最 初 の 初 期 化 で a3gs.start と a3gs.begin を 使 い,つぎに3G シールド 上 の LED を On/Off させるための a3gs.setled それにインターネットとの 接 続 のために a3gs.httpget の4つとなります この a3gs.httpget は 最 初 のものが コマンド 出 力 ファイルの 内 容 を 読 み 取 るもの で 後 のもは 温 度 センサ 値 をメール 送 信 する 3gsendmail.php を 起 動 するものとなって います このように httpget では サーバ 側 のプログラム 位 置 のアドレス( 変 数 の server と path または path2 )が 設 定 され ポート 番 号 port それに 引 き 渡 す res との その 長 さ len の 引 数 だけで インターネットとの 送 受 信 ができるようになっています 如 何 でしょうか?これだけ 簡 単 に インターネットとの 連 携 ができることは 自 分 でもで きると 思 われるのではないでしょうか? これらのプログラムを 応 用 するだけで Arduino+3G シールド 側 の 入 出 力 の 電 子 部 品 を 簡 単 に 遠 隔 地 から 操 作 でき またセンサ 値 などを 簡 単 に 取 得 することができるようになりま す つぎの 号 では フリーのクラウドサービス Xively.com に センサ 値 をアップしたり ツイ ッタ にセンサ 値 をアップしたりする 事 例 を 紹 介 しましょう こちらもとても 簡 単 にできる 仕 組 みとなっています 以 前 某 大 学 の 先 生 が 3G シールドを 手 に 取 って 僅 か 数 時 間 後 にク ラウドにセンサ 値 をアップされました この 驚 異 的 な 時 間 は 技 術 ハードルの 低 さを 物 語 っ ていると 言 えると 思 います それでは 次 号 をお 楽 しみにしてください 以 下 は 3G シールド 関 連 の 情 報 が 掲 載 されているサイトです 1.NPO 法 人 3G シールドアライアンスのサイト http://3gsa.org/ 2.3G シールド 技 術 情 報 および 保 守 サイト http://a3gs.wiki.fc2.com/ 3.Facebook NPO 法 人 3G シールドアライアンス でも 最 新 情 報 紹 介 9