前からアイデアとしては存在していた、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++;
}
液晶画面に風速を表示