WebSocket Unityとサーバーの双方向通信 Unity編

WebSocketを使ったUnityとサーバーの双方向通信の実装

WebSocketを使ってUnityとサーバー間で
テキストデータを送り合うことを第一目標にしています

今回は其の弐
Unity側の処理を書きます

前回はこちらです

WebSocket Unityとサーバーの双方向通信 サーバー編

用語整理

Unity
統合開発環境を内蔵したゲームエンジン
2Dはもちろん、3DやVR用アプリケーションも作ることができる
Web,iOS,Androidなど様々な機器向けにデータをエクスポートできる

WebSocket
HTML5に定義されている技術規格
クライアントとサーバー間に「ソケット」と呼ばれる
持続的な接続を確立させることで
双方向からデータの送信を開始できるようになる(らしい)
基本的なHTTPだとクライアントからだけしか
データの送信を開始できない

( Unity ) websocket-sharpライブラリ
Unityで使用するC#用ライブラリ
WebSocketが簡単に作れるようになっている
ここからダウンロードできる

Visual Studio
MicrosoftのIDE
Unityをダウンロードすると一緒についてくる
Unity2018からのUnityで使うメインエディタ

クライアント( Unity )側実装

websocket-sharpライブラリダウンロード

以下Gitにアクセスして”Download ZIP”
https://github.com/sta/websocket-sharp

websocket-sharpライブラリビルド

ダウンロードしたディレクトリを解凍
websocket-sharp.slnファイルをダブルクリック

Visual Studioで開く

サブプロジェクトExampleをソリューションから削除

ビルド方法をReleaseに変更

メニューからビルドを実行

Build>Build All

成功するとwebsocket-sharp/bin/Release/websocket-sharp.dllが生成される

Unityにwebsocket-sharpライブラリをインポート

テスト用Unityプロジェクトを作成( 2D )

Assetsに子ディレクトリPluginsを作成
Assets/Plugins内にビルドしたwebsocket-sharp.dllをコピー

websocket-sharpライブラリインポート終了

 

スクリプト作成

新規スクリプトを作成

Assets > Create > C# Script

色々調べながら、スペースキーを押すとメッセージが
サーバーへ送信されるスクリプトを書く。できたのはこんな感じ

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using WebSocketSharp;
using WebSocketSharp.Net;

public class main : MonoBehaviour
{

    WebSocket ws;

    void Start()
    {
        ws = new WebSocket("ws://27.120.98.26:9001/");

        ws.OnOpen += (sender, e) =>
        {
            Debug.Log("WebSocket Open");
        };

        ws.OnMessage += (sender, e) =>
        {
            Debug.Log("WebSocket Receive Message Data: " + e.Data);
        };

        ws.OnError += (sender, e) =>
        {
            Debug.Log("WebSocket Error Message: " + e.Message);
        };

        ws.OnClose += (sender, e) =>
        {
            Debug.Log("WebSocket Close");
        };

        ws.Connect();

    }

    void Update()
    {

        if (Input.GetKeyUp(KeyCode.Space))
        {
            string send_message = "SpaceKey_pressed";
            Debug.Log("WebSocket Send Message Data: " + send_message);
            ws.Send(send_message);
        }

    }

    void OnDestroy()
    {
        ws.Close();
        ws = null;
    }
}

main.cs(スクリプト)ができたら、SceneのMain Cameraへ
ドラッグ&ドロップでアタッチする

Unity側実装終了

 

接続テスト

サーバーでPythonファイルを実行する

python3 /home/ユーザー名/python3_project/mei/version_1/arp.py

こんな感じのメッセージが出たら準備OK

INFO:websocket_server.websocket_server:Listening on port 9001 for clients..

Unity側Playボタンを押してプロジェクトを実行
コンソールに接続完了メッセージが出ると同時に
サーバー側でも接続完了メッセージ

以降スペースキーを押すごとにメッセージが送受信される

 

まとめ

やっとサーバーっぽいことができた!
WebSocket色々使えるので、これから作る

WebSocket Unityとサーバーの双方向通信 サーバー編

WebSocketを使ったUnityとサーバーの双方向通信の実装

前回に引き続きサーバー立てた理由にもなる企画です
後々使うことになるので試します

WebSocketを使ってUnityとサーバー間で
テキストデータを送り合うことを第一目標にしています

其の壱ではサーバー側の処理を作ります

用語整理

Unity
統合開発環境を内蔵したゲームエンジン
2Dはもちろん、3DやVR用アプリケーションも作ることができる
Web,iOS,Androidなど様々な機器向けにデータをエクスポートできる

使用されているサーバー

サーバーをたてる!(契約編)

こちらの記事でたてたUbuntu Server
このブログのファイルも置かれている

HTTP ( Hypertext Transfer Protocol )
ハイパーテキスト・トランスファー・プロトコル
リクエスト-レスポンス型のプロトコルで
ハイパーテキスト、画像、音声 などを
サーバーからクライアントへ転送できる
クライアントがサーバにリクエストを送信、レスポンスを返す
基本、この時点で初期状態に戻るので
サーバはクライアントの状態を保存しない

WebSocket
HTML5に定義されている技術規格
クライアントとサーバー間に「ソケット」と呼ばれる
持続的な接続を確立させることで
双方向からデータの送信を開始できるようになる(らしい)
基本的なHTTPだとクライアントからだけしか
データの送信を開始できない

サーバー側実装

サーバー側でのWebSocket通信の準備をします
ネット上の情報ではnode.jsを使っているものが
多いようなのですが、後でAI系のものを
組み合わせるのでPythonを使って実装します

お約束

ubuntu 14.04 のアップデートを確認

root@localhost:~# sudo apt-get update

アップデートを適用

root@localhost:~# sudo apt-get upgrade

使わなくなったパッケージを削除

root@localhost:~# sudo apt-get -y dist-upgrade

autoremove

root@localhost:~# sudo apt-get -y autoremove

aptのキャッシュを削除

root@localhost:~# sudo apt-get -y autoclean

 

Python3 環境確認

python3バーション確認

~# python3 -V
Python 3.4.3

pip3のバーションを確認

~# pip3 --version
pip 1.5.4 from /usr/lib/python3/dist-packages (python 3.4)

 

ファイル作成

新規ディレクトリ作成

 ~# mkdir /home/ユーザー名/python3_project/mei/version_1/

Pythonファイル作成
arp.py ( automatic response program )

~# vim /home/ユーザー名/python3_project/mei/version_1/arp.py

Pythonファイル編集

websocket-serverのGitページに載ってるサンプル
他のPythonでWebSocketやってた人のコードを参考に

さっきのwebsocket_serverパッケージと
ログを取るlogginを入れてます

ポート番号はGitのサンプルのまんまにしてあります

import logging
from websocket_server import WebsocketServer

PORT=9001
HOST='27.120.98.26'

#logger_setup
logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)
handler = logging.StreamHandler()
handler.setFormatter(logging.Formatter(' %(module)s -  %(asctime)s - %(levelname)s - %(message)s'))
logger.addHandler(handler)
 
#callback
def new_client(client, server):
    logger.info('New client {}:{} has joined.'.format(client['address'][0], client['address'][1]))
 
def client_left(client, server):
    logger.info('Client {}:{} has left.'.format(client['address'][0], client['address'][1]))
 
def message_received(client, server, message):
    logger.info('Message "{}" has been received from {}:{}'.format(message, client['address'][0], client['address'][1]))
    reply_message = 'Re: ' + message
    server.send_message(client, reply_message)
    logger.info('Message "{}" has been sent to {}:{}'.format(reply_message, client['address'][0], client['address'][1]))
 
#main
if __name__ == "__main__":
    server = WebsocketServer(port=PORT, host=HOST, loglevel=logging.INFO)
    server.set_fn_new_client(new_client)
    server.set_fn_client_left(client_left)
    server.set_fn_message_received(message_received)
    server.run_forever()

たぶんこれで動くはず…

 

其の弐はこちら
https://www.washio.net/wacode/websocket-unity-server-com-2/

焼き鳥屋照明 音声コントロール

この記事は過去に運用していたブログから移行したものです

はじめに
まえにブログを書いた時からやっぱりかなり時間が空いてしまいました
元々インターネット上に長文を書く習慣がないので
ついついモノを作るのが優先でまとめるのが後回しになってしまいます
定期考査も終わったので、2ヶ月間でやったことをしっかりと整理しようと思います
 
やったこと
GoogleHomeMini × ESP32 で照明ONの記事で書いたものを
焼き鳥屋(ものづくり学園つばめ)のカウンターにある
ダウンライト11個を操作できるように拡張しました
 
これがその時作った図です
GoogleAssistantからコマンドを
出して、IFTTT経由で
Blynkアプリを操作
 
ESP32というマイコンボードを
インターネット上から
いじることができます
 
結構いろんなところに応用がききます
焼き鳥屋のダウンライトは、3WのPowerLEDなので、3W = 3V × 1A
ESP32の1ピンあたりのドライブ能力は0.04Aなので故障防止にトランジスタ入れます
 
秋月電子、STA401A(直流電流増幅率1000で、コレクタ出力の最高値が4A)
このトランジスタが入った回路をものづくり学園つばめのハードに詳しい方に
作っていただいて、ぼくはソフトを作りました。
 
内容
ダウンライト計11個一度に操作するときは
IFTTT GoogleAssistant 連携の
Say a simple phrase を使って操作します
 
個別にひとつひとつ制御するときは、
同 Say a phrase with a number
はじめは11個Applet作っていましたが後で改良されました
IFTTTのアップレットは
こんな感じになっています
自分の制御したい言葉と
その返答などを設定します
 
iOS12でSiriショートカット
という似た様な機能が
搭載されるらしいので
個人的にはかなり楽しみです
 
これがIFTTTからWebhookを使って
Blynkを操作するための
“that”の部分です
 
モザイクがかかってるのは
そのURLでコマンド打つと
焼き鳥屋の電気のON,OFFが
できてしまうからです
 
 
インターネット経由でネットワークさえあればどこからでも操作できる
いろんななことに使えて応用がききますが
世界のどこかから焼き鳥屋の電気チカチカとかは困るので
本当にそれを考えたら作り込みは必要になります
 
 
つまずいたところ
最初GoogleHomeで実験していたとき
ダウンライト9番に見立てたLEDだけどうも消えない
いくら発音を変えたりして見てもダメでした
スマホのGoogle Assistantアプリで確認すると
「ダウンライト吸盤消して」となっていました
音声認識制度の問題か、発音が悪いのか
それはよくわかりませんが
Say a phrase with a numberが数字しか読まないという保証がなかったので
初期段階では11個Appletを作り
認識候補の一つに「吸盤」を入れることで対応できました
Say a phrase with a numberもうまく動く様なので
そちらの方が良かった様です
 
2つ目…
ESP32とダウンライトにはPC用電源から給電されます
焼き鳥屋のブレーカーが下げればすぐに立ち上がる
しかしWifiのアクセスポイントが開くまでの時間
ESP32をネットワークに繋げずに待機させないと
ネットワーク接続に失敗してめんどくさいことになることに
最初気づかず、アレ?となりました
 
結果として、ネットワークが開くまでの数十秒間待機して
ダウンライトはその間明滅する様に改良、いい感じになりました
 
 
リンク
このブログで書いたことについてものづくり学園つばめのページ
6mgt.comで紹介していただきました
 
ハードの設計を手伝ってくれた方が
音声制御の実験されている映像も公開されています

ESP32-DevkitC連続運転

この記事は過去に運用していたブログから移行したものです

はじめに
GoogleHomeMini × ESP32 で照明ON!
この記事を書いてから1ヶ月近くたちました。
学生のぼくとしては、定期テストが終わってちょっとホッとしています。
 
さて、ESP32とGoogleHomeMiniでの照明操作とっても便利です。
作る前は、そんなのいるのか?という感じでしたがいざあると使います
 
 
昨日参加した新潟日報みらい大学の公演で、開発者と購入者の間に
商品の価値が共有されていないと、どんな優れたロボットだったとしても
購入者は別の安価な不完全・安心できないモノを選び、市場が成り立たない、
レモン市場という現象が起きることを学びました。
ちなみに、その講演者の人はモノの価値が共有できるようにSTMという
指標を作っているそうです。
今回の場合、自分で作っているのでやってみないと分からなくて、
必要か必要じゃないか、実生活の中で試してみないと分からないんだなというのが、
今回の仕組み作りでの気づきです
接続
作ったはいいのですが、最初の方12月後半トラブルばっかりでした。
ESP32のブレッドボード上に、Wifiアクセスポイントとちゃんと接続されているか確認する
ピンクLEDをつけていたのですが、ぴこぴこ点滅してどうもうまく接続できていないよう。
何が悪いのか全く分からず、そのままにしていました
 
物は試しと、ハードオフに行った時、2000円で802.11acまで対応している
Wifiルーターがあったので買ってきました。4ポートのハブとしても使えます。
包装箱がなかったので、安かったみたいです。
(ESP32はb/g/nまでだったと思います)
 
それを家のメインのWifiルーターから部屋に伸びているLANケーブルに接続し
アクセスポイント限定モードで部屋に設置したところ、ESP32の接続が突然安定!
ESP32のWifi接続トラブルで悩んでいる方は、アクセスポイントの増設、オススメです。
 
 
連続運転
12/31日近所の神社にいく途中Blynkアプリを確認すると、
ESP32がオフラインになっていました。
 
帰って確認すると、LEDや抵抗の足は折れ、ショート。
ジャンパーは切れていました。
 
姉の寝相の悪さが原因でした。 ボードが壊れなくてよかったです。
こんな時でもBlynkサーバーを通してるのですぐわかっていいです。
 
修復し、それから連続運転させてます。1/1からと考えて40日
今の所、発熱など異常はありません。
Wifiずーっと繋がっているはずなのに、すごい。
新潟大雪になるほど寒いので、夏になるとどうかはわかりません。
DeepSleepされるように改良しないとかなと思ってます。
 
 
おわりに
私は朝起きることが苦手で、この仕組みと目覚ましを組み合わせてることで
何か出来ないだろうかと考えてます。
JRではベットが揺れたりするらしいです。
 
GoogleHomeの方にはラズパイで喋らせられるらしいのですが、
今までディスプレイが別の部屋にしかなく。
が、とあることで部屋にディスプレイがやってきたのでまた記事にします。

GoogleHomeMini × ESP32 で照明ON

この記事は過去に運用していたブログから移行したものです

はじまり
お世話になっているものづくり学縁つばめ、杉山さんより
施設の改造&アップデートの報酬として
最近ホットなGoogleHomeMiniをいただいた。
 
調べると、IFTTT経由でマイコンを制御していた例がいくつか出てきたので、
自分のおうちハックに使ってみたいと思う。
最初は簡単どころで部屋の照明ON,OFFをしてみる。
 
システムを作る
今回はmgo-tec電子工作さんの
Google Home Mini を使って、声で ESP32 の LED を光らせてみた
という記事を参考にアレンジしながらやっていく。
 
流れは以下のような感じ。
 
GoogleHomeMiniにコマンドを入力
GoogleAssistantサーバー
IFTTTサーバーで処理
WebHookサーバー
Blynkサーバー
ESP32
 
だいたい元の通りなのだけれど、今回は照明のON,OFFだけなので
IFTTTアップレットを2つにし、片方にを送る機能
もう片方に255を送る機能だけを持つように変更した。
 
アップレット増やせば、2とか3とかも送れる。
声で「100」とか入力して送るのはまさに元のソース。
あとはそのBlynkバーチャルピンの値をESP32が判断すればいろんなことに使えるだろう。
 
元のブログが素晴らしすぎて、あまりメモしておくことがない。
 
ハード構成を考える
この家は築40年程度の米屋で、2階が居住スペースになっている。
ぼくの部屋はもともと3部屋だったところを
2部屋にリフォームしてできた部屋。
 
つり下げ式の蛍光灯(ペンダントライト)がひとつで、
部屋の入り口と、ベットの陰の二箇所にスイッチがある。
3路スイッチで切り替えながら照明のON,OFFをしているイメージ。
 
最初は100Vリレーを考えた。マイコンから簡単に制御でき、そう高価な部品でもない。
でも、今あるスイッチを生かすためには”3路にする必要=2つリレーが必要”
それに、もしマイコンが壊れれば、リレー2つともOFF状態になって、
もう一つのスイッチでも部屋の明かりがつけられなくなる。
その時用の仕組みや保護回路入れたりなんだりしていると、
GoogleHomeの掴みにしては複雑かな、とも思えてきた。
 
ということで、原始的にSG90サーボで今のスイッチを押させることにした。
ここが決まればあとは早い。マイコンは今手持ちののあるESP32で決定。
ネットワークの接続確認用LEDと、サーボ動作時に点灯するLED。その保護抵抗。
その辺にあったもの。
 
 <ちょっと一覧>
・LED保護抵抗 赤紫茶金 270Ω ×2 http://akizukidenshi.com/catalog/g/gR-16271/
作る

作る。スイッチの押し具合を測って
角度を何度にするか決めて、
サーボに5Vピン、GND、
PWM用にIO12を接続。
IO27に保護抵抗を入れて白色LED。IO25に同じく保護抵抗を入れてピンクLED。
ハードは以上。
とりあえずだが、こんな感じの待機状態になった。
ネットワークに接続されていることを示すピンクのLEDが付いている。
 
コードは、こちら。

弱点
このプログラムには弱点があります。
 
照明が消えてる時「消して」で付きます。逆もまたあります。
部屋の明かりが3路のため、面倒なことになっていて対処しきれていません。
改良しなくてはです。

ESP32 × PowerLED11個

この記事は過去に運用していたブログから移行したものです

ESP-WROOM-32をWifiスイッチとして使ってみました。
ものづくり学縁つばめのカウンターには、全部で11個、
PowerLEDの照明が付いています。
それをWifi経由で制御するため、ブレッドボードの上で実験しました。
ESP8266でやれば、もっと簡単なのでしょうが、
他にも追加して行く予定なのでESP32使っています。
 
ものづくり学縁つばめには、SoftBankAirのルータがあります
ESP32標準ライブラリでWifiルータ経由で通信しようとすると
“client disonnected”
と表示され、通信が切れてしまう症状が続いたので、
東京お気楽カメラさんの http://okiraku-camera.tokyo/blog/
ESP32をアクセスポイントモードにして、
HTMLサーバーを動かすライブラリを
使わせていただきました。
 
リセットしても、SoftAPが起動しないことがありましたが、
何度かリセットしてると起動します。

LEDを付ける部分を、増やしてあります
 server.add_handler("/", index);
  server.add_handler("/one_t", one_t);
  server.add_handler("/one_f", one_f);
  server.add_handler("/two_t", two_t);
  server.add_handler("/two_f", two_f);
  server.add_handler("/three_t", three_t);
  server.add_handler("/three_f", three_f);
  server.add_handler("/four_t", four_t);
  server.add_handler("/four_f", four_f);
  server.add_handler("/five_t", five_t);
  server.add_handler("/five_f", five_f);
  server.add_handler("/six_t", six_t);
  server.add_handler("/six_f", six_f);
  server.add_handler("/seven_t", seven_t);
  server.add_handler("/seven_f", seven_f);
  server.add_handler("/eight_t", eight_t);
  server.add_handler("/eight_f", eight_f);
  server.add_handler("/nine_t", nine_t);
  server.add_handler("/nine_f", nine_f);
  server.add_handler("/ten_t", ten_t);
  server.add_handler("/ten_f", ten_f);
  server.add_handler("/eleven_t", eleven_t);
  server.add_handler("/eleven_f", eleven_f);
  server.add_handler("/error", error);

  server.add_default_handler(default_handler);
  server.begin();