M5StackをArduinoのように使ってUnityに送る(光センサー・アセットなし)
本来は加速度センサーを使ったほうが分かりやすいですが、手持ちがなかったので光センサーで代用です。
光センサーに光を当てると、Unity側のオブジェクトが回転します。
いろいろ書いて最初は上手くいかなかったのですが、どうも「int rot = int.Parse(sp.ReadLine());」がキモなようです。
写真は手持ちがなくて10kオームの抵抗を使ったせいで、値が1kオームのときとは異なってますが、お気になさらず。
■準備(Arduinoと同じ)
・1kオームの抵抗
・光センサ
・M5Stack
・ワイヤー
●Arduino側
1.下記のように接続する
図と抵抗の値が違っていますが、抵抗の色は無視してください。1kオームを使用します。
2.Arduinoアプリの「ツール」メニュー→「シリアルポート」の「シリアルポート"なんとか" ▶︎」の「"なんとか"」の部分をメモする。下記の例の場合は「"/dev/cu.SLAB_USBtoUART"」をメモする
●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); } }