Unityと扇風機の連動

前からアイデアとしては存在していた、Unityと扇風機の連動をとうとう実現。自分の操作に対するフィードバックがマルチモーダルに返ってきたとき、われわれはそれを現実であると認識しやすい、という知見に基づき、触覚フィードバック(つまり風)の存在意義を再確認したわけである。

風量の信号は、
Unity→(http)→Webサーバー→(http)→M5StickC→(PWM)→扇風機
の順で送られる。なぜhttpなのか。俊敏な信号を送っても、どのみちプロペラが回転し始めるのには時間がかかるし、なんといっても一番簡単だからである。

using UnityEngine;
using System.Collections;
 using UnityEngine.Networking;

public class HTTP_GET : MonoBehaviour {

    int power = 20000;

	// Use this for initialization
	void Start () {
        //StartCoroutine(GetText());
    }
	
	// Update is called once per frame
	void Update () {
        if (Input.GetKeyDown(KeyCode.Alpha0))
        {
            power = 0; StartCoroutine(GetText());
        }
        if (Input.GetKeyDown(KeyCode.Alpha1))
        {
            power = 10000; StartCoroutine(GetText());
        }
        if (Input.GetKeyDown(KeyCode.Alpha2))
        {
            power = 15000; StartCoroutine(GetText());
        }
        if (Input.GetKeyDown(KeyCode.Alpha3))
        {
            power = 20000; StartCoroutine(GetText());
        }
        if (Input.GetKeyDown(KeyCode.Alpha4))
        {
            power = 25000; StartCoroutine(GetText());
        }
    }

    public void HTTPGET() {
        //GetText();
        
    }


    IEnumerator GetText()
    {
        string url = "";
        url = "http://kodamalab.sakura.ne.jp/FAN/control.php" + "?power="+power.ToString() ;
        Debug.Log("request:"+url);

        UnityWebRequest request = UnityWebRequest.Get(url);
        // 下記でも可
        // UnityWebRequest request = new UnityWebRequest("http://example.com");
        // methodプロパティにメソッドを渡すことで任意のメソッドを利用できるようになった
        // request.method = UnityWebRequest.kHttpVerbGET;

        // リクエスト送信
        yield return request.Send();

        // 通信エラーチェック
        if (request.isNetworkError)
        {
            Debug.Log(request.error);
        }
        else
        {
            if (request.responseCode == 200)
            {
                // UTF8文字列として取得する
                string text = request.downloadHandler.text;
                Debug.Log("payload:"+text);

                // バイナリデータとして取得する
                byte[] results = request.downloadHandler.data;
            }
        }
    }
}

#include <M5StickC.h>  // ----A
#define SERIAL_BAUDRATE     115200

#define LEDC_CHANNEL_0 0 //channel max 15
#define LEDC_TIMER_BIT 16 //max 16bit
//16bitの場合、最大周波数1220Hz
#define LEDC_BASE_FREQ 1220.0 //double 1220.0Hz以下
#define GPIO_PIN 26 //GPIO #36~#39 は設定不可

#include <Arduino.h>
#include <WiFi.h>
#include <WiFiMulti.h>
#include <HTTPClient.h>

#define USE_SERIAL Serial

WiFiMulti wifiMulti;
int cnt=0;
String payload;

void setup() {

    USE_SERIAL.begin(115200);

    USE_SERIAL.println();
    USE_SERIAL.println();
    USE_SERIAL.println();

    for(uint8_t t = 4; t > 0; t--) {
        USE_SERIAL.printf("[SETUP] WAIT %d...\n", t);
        USE_SERIAL.flush();
        delay(1000);
    }

    wifiMulti.addAP("HELL", "kodamamasahisa");

  //////////////
  ledcSetup(LEDC_CHANNEL_0, LEDC_BASE_FREQ, LEDC_TIMER_BIT);
  ledcAttachPin(GPIO_PIN, LEDC_CHANNEL_0);
  //16bit の場合 duty 0x0000~0xFFFF (max:65535)
  //duty 50%: 0x8000 (=32768)
  ledcWrite(LEDC_CHANNEL_0, 0x8000);

}

void loop() {
    // wait for WiFi connection
    if((wifiMulti.run() == WL_CONNECTED)) {

        HTTPClient http;

        USE_SERIAL.print("[HTTP] begin...\n");
        // configure traged server and url
        //http.begin("https://www.howsmyssl.com/a/check", ca); //HTTPS
        http.begin("http://kodamalab.sakura.ne.jp/FAN/control.php"); //HTTP

        USE_SERIAL.print("[HTTP] GET...\n");
        // start connection and send HTTP header
        int httpCode = http.GET();

        // httpCode will be negative on error
        if(httpCode > 0) {
            // HTTP header has been send and Server response header has been handled
            USE_SERIAL.printf("[HTTP] GET... code: %d\n", httpCode);

            // file found at server
            if(httpCode == HTTP_CODE_OK) {
                payload = http.getString();
                USE_SERIAL.println(payload);
            }
        } else {
            USE_SERIAL.printf("[HTTP] GET... failed, error: %s\n", http.errorToString(httpCode).c_str());
        }

        http.end();
    }

    //delay(5000);

    int power;
    power=payload.toInt();
    ledcWrite(LEDC_CHANNEL_0, power);
    Serial.printf("PWM:%d \n", power);
    delay(2000);      

    cnt++;
}

液晶画面に風速を表示

コメントを残す