まゆたまガジェット開発逆引き辞典

電子工作やプログラミングのHowtoを逆引き形式で掲載しています。作りたいモノを決めて学んでいくスタイル。プログラマではないので、コードの汚さはお許しを。参照していないものに関しては、コピペ改変まったく問いません

M5StackをArduinoのように使ってUnityに送る(光センサー・アセットなし)

本来は加速度センサーを使ったほうが分かりやすいですが、手持ちがなかったので光センサーで代用です。
光センサーに光を当てると、Unity側のオブジェクトが回転します。
いろいろ書いて最初は上手くいかなかったのですが、どうも「int rot = int.Parse(sp.ReadLine());」がキモなようです。

f:id:prince9:20180926055721p:plain
f:id:prince9:20180926055732p:plain
写真は手持ちがなくて10kオームの抵抗を使ったせいで、値が1kオームのときとは異なってますが、お気になさらず。

■準備(Arduinoと同じ)
・1kオームの抵抗
・光センサ
・M5Stack
・ワイヤー

Arduino
1.下記のように接続する
図と抵抗の値が違っていますが、抵抗の色は無視してください。1kオームを使用します。
f:id:prince9:20180925195123p:plain
2.Arduinoアプリの「ツール」メニュー→「シリアルポート」の「シリアルポート"なんとか" ▶︎」の「"なんとか"」の部分をメモする。下記の例の場合は「"/dev/cu.SLAB_USBtoUART"」をメモする
f:id:prince9:20180926032905p:plain

●Unity側(アセットなし)
1.Unityのプロジェクトを作り、「GameOBject」メニュー→「3DObject」→「Cube」などを選び、適当にオブジェクトを作る
2.「File」メニュー→「Build Settings」を選択し、「Player Settings」をクリックする
3.Inspectorの「Other Settings」→「Api Compatibility Level」を「.NET 2.0」にする
4.「Build Settings」を閉じる
5.「Assets」を右クリックし、「Create」→「C# Script」を選択する
6.「ArduinoReceive」など適当にファイル名をつけて、後からスクリプトを書く
7.スクリプトを書いたら保存し、「Hierarchy」にある1.で作ったオブジェクト名にドラッグ&ドロップして適用する


スクリプト
Unity側はYouTube動画もろもろに助けられました。

Arduino

#include <M5Stack.h>

#define LDR_pin 36  // センサーをGPIO36につなぐ
int val=0;
int sdata=0;

void setup(){
    M5.begin();

Serial.begin(9600);
    pinMode(LDR_pin, INPUT);
}

void loop() {
  // 画面クリア
    M5.Lcd.clear();
    M5.Lcd.setCursor(0, 0);
    
val = analogRead(LDR_pin);
sdata = val/4; //値が大きすぎる場合は0-255になるよう、「/4」の「4」の値を変更する
 Serial.println(sdata); // センサーを読み、シリアルに出力
 
//M5の液晶に値を表示
    M5.Lcd.setTextColor(WHITE);
      M5.Lcd.setTextSize(5);
    M5.Lcd.print(sdata);
    
    delay(500);
      M5.update();
}

●Unity側

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO.Ports;

public class ArduinoToUnityScript : MonoBehaviour {
int sdata = 0;

//new SerialPort("")にArduinoアプリで調べてメモしたシリアルポート名を指定する
SerialPort sp = new SerialPort("/dev/cu.SLAB_USBtoUART", 9600);

	// Use this for initialization
	void Start () {
		//シリアルポートが開いてないときはポートを開ける
		if (!sp.IsOpen) {
			sp.Open();
			sp.ReadTimeout = 1000;
		} else {
			sp.Close();

		}
		

		
	}
	
	// Update is called once per frame
	void Update () {
		//文字列を数値に変更
		int rot = int.Parse(sp.ReadLine());
		//オブジェクトの角度を変える
		transform.eulerAngles = new Vector3(0,rot,0);
		//コンソールにセンサーの値を出力
		Debug.Log(rot);

		
	}


}