第2回アキハバラIoTツアーズ ばっしー編

  • このエントリーをはてなブックマークに追加
  • Pocket
  • LINEで送る

ついにやってきました!第2回目のIoTツアーズ!

なんでIoTツアーズっていう名称なんでしょう?某旅番組 のパクリ? にインスパイアされたとかでしょうか。謎です。

しかも、今回のテーマは「漢のIoT!!!」とか、これまた わけがわからないよ。 意外性を狙っていますね。素直にインスパイアもとは魁!○塾と思われます。
それにしてもただでさえ野郎ばかりなのに、さらにテーマまで漢くさいですが、なんと、我がチームにはなんと!紅一点のやまだチャンが居ます!さらにやまだチャンの上司のよしむーさんまで加わってくれました!この時点で勝った!間違いない(何にでしょう?)

我々のチームが作るもの、それは前日の夜に決まりました。そのため、前日の夕方に『ヤバい、ちょっと風邪ひきそうな嫌な感じがしてきた・・・』と思いましたが、「家で図面作成と印刷するので早く帰るね~」と、何事もないかのように帰宅しました。

帰宅しました。

が、

帰宅後にパワポでサクサクと作図して印刷、寝たのは日付が変わる頃でした。

当然、風邪は悪化してましたとさ。チーン。
そういうわけで、当日の写真はマスクしています。ゲホゲホ。。。

まぁ体調はともかく、企画の変遷やコンセプト、全体像の説明はチームメンバーのやまだチャンに、基本動作についてはよしむーさんに譲って、私は実装編を解説していきます。

※そういうわけで、構想から企画についてはやまだチャンに、基本動作についてはよしむーさんのエントリーを先に読んでいただいた方が分かりやすいです。

構成図

端末側

ちょっと無理矢理に配置してみました。

要するにサーボが2つ繋がればいいだけなので簡単です。電源をプラス/マイナス接続して、信号線をデジタル入力が可能なピンに接続するだけです。朝  飯前ですね。

 

サーバー側

ザックリと書くとこんな感じです。

動きを詳しく書いてみます。

詳細フロー

「手」の処理

まずは「手」側の処理です。Arduino(ESP8266)からのリクエストです。

ひたすらループで自分がどの手の状態(グー、チョキ、パー)になればいいのかを聞きに行き、返事が空の場合には状態を変えないという処理を繰り返します。

スマホの処理

スマホ側の処理はパターンが2つあります。画面も2つで「手の選択画面」と「クリアする画面」です。

それぞれ以下の様になっていて、要するにこの2つの画面が交互に現れるようになっています。

ソース

汚いソースですが以下の様なもので動かしていました。
※ネストとかぐちゃぐちゃですね…汗

「手」のソース

#include <Servo.h>
#include <Wire.h> 
#include <SPI.h>
#include <ESP8266WiFi.h>

#define WIFI_SSID "Wifi_Accesspoint"
#define WIFI_PSK "Wifi_Password"
#define DEST_HOST "ServerAddress"
#define DEST_PORT 80
#define DEST_URL "/RSP.php?num=1" //■端末No1

Servo servo1; //人差し指、中指
Servo servo2; //親指、薬指、小指

int val=0; //明るさを格納する為の変数
int i,r,g,b;
int wait_time=100;
int pos = 90; // デフォルト位置 これ以下三行は現物合わせ
int pos1 = 20; // 閉じる
int pos2 = 0; // 開く

void setup() {
 servo1.attach( 1 );
 servo2.attach( 2 );

 pinMode(4, OUTPUT); //OnBoadLED

 digitalWrite(4,LOW);
 Serial.begin(115200);
 Serial.println("");
 delay(10);
 
 WiFi.begin(WIFI_SSID, WIFI_PSK);
 
 while (WiFi.status() != WL_CONNECTED) {
 delay(500);
 Serial.print(".");
 }
 Serial.println("");
 Serial.println("WiFi connected"); 
 Serial.println("IP address: ");
 Serial.println(WiFi.localIP());
 Serial.println("");

 digitalWrite(4,HIGH);

}

void loop() {

 WiFiClient client;
 String line;
 
 if (!client.connect(DEST_HOST, DEST_PORT)) {
 Serial.println("connection failed");
 return;
 }

 client.print(String("GET ") + DEST_URL + " HTTP/1.1\r\n" +
 "Host: " + DEST_HOST + "\r\n" + 
 "Connection: close\r\n\r\n");
 delay(10);
 //get rid of the HTTP headers
 while(client.available()){
 line = client.readStringUntil('\r');
 //Serial.print(line);
 line.trim();
 if (line.length() == 0) {
 break;
 }

 //get http content
 String buffer="";
 while(client.available()){
 line = client.readStringUntil('\r');
 //Serial.print(line);
 line.trim();
 buffer.concat(line);
 }
 Serial.println(line);

 }
 
if( line != ""){ // 返事がnullでない場合

float x = line.toFloat();
int hand = x / 10;
int win = x - hand * 10;

Serial.println( );
Serial.println( x );
Serial.println( hand );
Serial.println( win );

 if( x < 15){//■勝負ついた ぐー
 servo1.write(0);
 servo2.write(120);
 Serial.println("Rock");
 
 }else if( x < 25 ){//■チョキ
 servo1.write(0);
 servo2.write(0);
 Serial.println("Scissor");
 
 }else{//■パー
 servo1.write(140);
 servo2.write(20);
 Serial.println("Paper");
 }

 if( win = 1){//■勝敗でLED点灯 結局、光りっぱなしで意味がなかった・・・
 digitalWrite(4,LOW);
 }else{
 digitalWrite(4,HIGH);
 }

 }else{ //返事がnull=■まだ勝負していない
 Serial.println("null");
 }
 
delay(wait_time);
}

サーバのソース

<?php
$Link_URL=(empty($_SERVER['HTTPS']) ? 'http://' : 'https://').$_SERVER['HTTP_HOST'].$_SERVER['SCRIPT_NAME'];

//GET値を取得
$mode = filter_input(INPUT_GET, "mode");
$hand = filter_input(INPUT_GET, "hand");
$num = filter_input(INPUT_GET, "num");

if($num == 1){ //相手の番号
 $onum = 2;
}else{
 $onum = 1;
}

if($mode == "set" && $hand == ""){ //■■■モード:リセット ファイルを削除する
 unlink("1");
 unlink("2");

//HTMLヘッダ出力
print<<<EOF
<html>
<body>
<center>
<h1>
EOF;
//ここまで

echo " <a href=\"$Link_URL?mode=set&hand=1&num=$num\">Rock</a> ";
echo " <a href=\"$Link_URL?mode=set&hand=2&num=$num\">Scisors</a> ";
echo " <a href=\"$Link_URL?mode=set&hand=3&num=$num\">Paper</a> ";

//HTMLヘッダ出力
print<<<EOF
</h1>
</center>
</body>
</html>
EOF;
//ここまで

}elseif($mode == "set"){//■■■モード:じゃんけんぽん!
 $fp=fopen($num, "x");
 if (fwrite($fp, $hand) === FALSE){
 print('ファイル書き込みに失敗しました<br>');
 }
 fclose($fp);

//HTMLヘッダ出力
print<<<EOF
<html>
<body>
<center>
<h1>
EOF;
//ここまで

echo " <a href=\"$Link_URL?mode=set&num=$num\">Clear!</a>";

//HTMLヘッダ出力
print<<<EOF
</h1>
</center>
</body>
</html>
EOF;
//ここまで

}else{//■■マイコンからのアクセス
if (file_exists($onum)) {//■相手の手が出ていたら勝ち負けを返す
 $fp = fopen($num, "r");
 $hand = fgets($fp);
 fclose($fp);

 $ofp=fopen($onum, "r");
 $oline = fgets($ofp);
 $ohand = $oline;
 fclose($ofp);

 if($hand == $ohand){//■あいこ
 print($hand."0");
 }

 if($hand == 1 && $ohand == 2 ){//■勝ち
 print($hand."1");
 }

 if($hand == 2 && $ohand == 3 ){//■勝ち
 print($hand."1");
 }

 if($hand == 3 && $ohand == 1 ){//■勝ち
 print($hand."1");
 }

 if($hand == 1 && $ohand == 3 ){//■負け
 print($hand."2");
 }

 if($hand == 2 && $ohand == 1 ){//■負け
 print($hand."2");
 }

 if($hand == 3 && $ohand == 2 ){//■負け
 print($hand."2");
 }
}
}
?>
  • このエントリーをはてなブックマークに追加
  • Pocket
  • LINEで送る

SNSでもご購読できます。

コメント

コメントを残す