UnityでWi-Fi受信可能な加速度コントローラーを作る(2)

[前回](http://qiita.com/ELIXIR/items/7dded038455f966463a1)は[GR-COTTON](http://akizukidenshi.com/catalog/g/gK-09867/)というボードを使用しましたが、今回は[WIO-NODE](http://www.marutsu.co.jp/pc/i/607381/)を使用して同様のコントローラーを作ります。

![DSC02250.JPG](https://qiita-image-store.s3.amazonaws.com/0/59911/dba1893a-a5fc-cdec-96d9-ad567ae18636.jpeg)

WIO-NODEに搭載されているWi-FiモジュールESP-WROOM-02は、単体でArduinoとして動作するので、このモジュールに直接プログラムを書き込みます。
また、WIO-NODEはコネクタから直接I2Cのデータを受け取れるので、加速度センサーにもI2Cのものを使用します。

##揃えるもの
###パーツ
・[WIO-NODE](http://www.marutsu.co.jp/pc/i/607381/)
・[３軸加速度センサモジュール　ＡＤＸＬ３４５（ＳＰＩ／ＩＩＣ）](http://akizukidenshi.com/catalog/g/gM-06724/)
・[シリアル変換モジュール](http://akizukidenshi.com/catalog/g/gM-11007/)
###工作道具
・[ワイヤーストリッパー](https://www.amazon.co.jp/VESSEL-%E3%83%99%E3%83%83%E3%82%BB%E3%83%AB-No-3500E-2-%E3%83%AF%E3%82%A4%E3%83%A4%E3%83%BC%E3%82%B9%E3%83%88%E3%83%AA%E3%83%83%E3%83%91%E3%83%BC/dp/B000CEAXM4/ref=sr_1_5?ie=UTF8&qid=1481521568&sr=8-5&keywords=%E3%83%AF%E3%82%A4%E3%83%A4%E3%83%BC%E3%82%B9%E3%83%88%E3%83%AA%E3%83%83%E3%83%91%E3%83%BC)（またはニッパー、ナイフ等）
・[GROVE 4ピンケーブル](https://www.switch-science.com/catalog/798/)
・ハンダ
・ハンダこて
###電源
・[USBケーブル](https://www.amazon.co.jp/%E3%82%A8%E3%83%AC%E3%82%B3%E3%83%A0-%E5%85%85%E9%9B%BB%E5%B0%82%E7%94%A8-Micro-USB%E3%82%B1%E3%83%BC%E3%83%96%E3%83%AB-0-1m-%E3%83%96%E3%83%A9%E3%83%83%E3%82%AF/dp/B00DVT96RK/ref=sr_1_2?s=computers&ie=UTF8&qid=1481520722&sr=1-2&keywords=usb%E3%82%B1%E3%83%BC%E3%83%96%E3%83%AB+%E3%82%A8%E3%83%AC%E3%82%B3%E3%83%A0%E3%80%800.1m)
・[スマホ用バッテリー](https://www.amazon.co.jp/BUFFALO-BSMPB3301P1BK-iPhone7Plus-Nintendo/dp/B01KN3I0R8/ref=dp_ob_title_ce)
###ソフトウェア
・[Arduino IDE](https://www.arduino.cc/en/Main/Software)
##ハードウェア接続
まずはWIO-NODEと加速度センサーを下記のように配線・半田付けします。
![WIONODE.jpg](https://qiita-image-store.s3.amazonaws.com/0/59911/1f40c7c3-cba5-8951-180f-27d9dfff2d7b.jpeg)

半田付けしたら完成です。

##ソフトウェア作成
###WIO-NODE用加速度送信プログラム

```wio_node_acc.ino
#include <Wire.h>
#include <ESP8266WiFi.h>
#include <WiFiUDP.h>

#define WIO_POW_PIN 15

// port2:GND,3V3,SDA,SCL
// http://akizukidenshi.com/download/ds/freescale/ADXL345_jp.pdf

#define ADXL 0x1D // (SDO HIGH) or 0x53 (SDO LOW)
#define BW_RATE 0x2C
#define POWER_CTRL 0x2D
#define DATA_FORMAT 0x31
#define DATAX0 0x32 // Low
#define DATAX1 0x33 // High
#define DATAY0 0x34
#define DATAY1 0x35
#define DATAZ0 0x36
#define DATAZ1 0x37

/* for Wi-Fi */
#define HOST_NAME   "192.168.4.2"
#define HOST_PORT   (7001)
#define RECV_PORT   (7001)
static WiFiUDP wifiUdp; 
static const char *ssid = "skipshoes0";
static const char *password = "123456789";

void setup() {
  // put your setup code here, to run once:
  delay(1000);
  pinMode(WIO_POW_PIN, OUTPUT); // 
  digitalWrite(WIO_POW_PIN,HIGH); // Vcc (and LED) on
  delay(100);
  Serial.begin(115200);
  delay(100);
  espWifiSetup();  
  delay(1000);
  adxlSetup();
  delay(100);
}

void loop() {
  // put your main code here, to run repeatedly:
//  scan();

    int val[3]; // x,y,z
    char buff[15];
  
    adxlRead(val);
    delay(1);
    espWifiUpdate(val);
    delay(30);
  
    sprintf(buff,"%d,%d,%d",val[0],val[1],val[2]);
    Serial.println(buff);
}

void adxlSetup(){
  Wire.begin();
  delay(100);
  Wire.beginTransmission(ADXL);
  Wire.write(DATA_FORMAT);
  // D7:SELF_TEST
  // D6:SPI
  // D5:INT_INVERT
  // D4:0
  // D3:FULL_RES
  // D2:Justify
  // D1,0: 00=2g,01=4g,10=8g,11=16g
  Wire.write(B00000000);
  Wire.endTransmission();

  Wire.beginTransmission(ADXL);
  Wire.write(BW_RATE);
  // D4:LOW_POWER
  // D3-D0:Rate 400Hz:1100,200:1011,100:1010,50:1001
  Wire.write(B00001010);
  Wire.endTransmission();

  Wire.beginTransmission(ADXL);
  Wire.write(POWER_CTRL);
  // D7:0
  // D6:0
  // D5:Link
  // D4:AUTO_SLEEP
  // D3:Measure
  // D2:Sleep
  // D1,0: wakeup
  Wire.write(B00001000);
  Wire.endTransmission();

}

int adxlRead(int val[3]){
//符号なしで送る
    int STATUS=0x2F;
    byte vH,vL,st;
    st= 1;
  
  Wire.beginTransmission(ADXL);
  Wire.write(DATAX0);
  Wire.endTransmission();
  Wire.requestFrom(ADXL, 6); // DATAX0~DATAZ1
  Wire.endTransmission();
  
   //I2c.read(ADXL,0x32,2);
    vL = Wire.read();
    vH = Wire.read();
    val[0]=(short)(word(vH,vL))+512;
  
    //I2c.read(ADXL,0x34,2);
    vL = Wire.read();
    vH = Wire.read();
    val[1]=(short)(word(vH,vL))+512;
  
    //I2c.read(ADXL,0x36,2);
    vL = Wire.read();
    vH = Wire.read();
    val[2]=(short)(word(vH,vL))+512;

   return st; //1:dataready, 0:not ready
}

void   espWifiSetup(){
  Serial.println("espWifiSetup");
  delay(500);
  WiFi.mode(WIFI_AP);
  WiFi.softAP(ssid, password, 1, false);
  delay(500);
  wifiUdp.begin(RECV_PORT);
  delay(500);
  
}

void   espWifiUpdate(int val[3]){
  String sendStr = "x:" + String(val[0])+",y:" + String(val[1])+",z:" + String(val[2]);
  wifiUdp.beginPacket(HOST_NAME, HOST_PORT);
  wifiUdp.write((const uint8_t*)(sendStr.c_str()), strlen(sendStr.c_str()));
  wifiUdp.endPacket();
}
```

下の画像のように配線し、シリアル変換モジュールのSW1をOFFにして(3.3V)
１．Funcボタンを押しながらRSTボタンを押す
２．RSTボタンを離す
３．Funcボタンを離す
の手順で書き込みモードにした後、シリアル変換モジュールのUSBポートとPCを接続し、[Arduino IDE](https://www.arduino.cc/en/Main/Software)を使用して書き込みます。

書き込みするためには、事前に[IDEにESP8266ボードを追加しておく]
(http://trac.switch-science.com/wiki/esp_dev_arduino_ide)必要があります。

![WIONODE.jpg](https://qiita-image-store.s3.amazonaws.com/0/59911/9d91ce85-6acd-85f2-cbaf-5105fd20ae12.jpeg)

###Unity用加速度受信スクリプト
[前回](http://qiita.com/ELIXIR/items/7dded038455f966463a1)と同じです。