MicroBleMobile Design Tips
MicroBleMobile is an adapter interface tool for transfer from micro:bit to Unity on Android mobile phone using BLE (Bluetooth low energy). By connecting the sensor device (gyro, accelerometer, GPS, etc.) with micro:bit you can input various sense data to Unity. You can also output various data from Unity by connecting the display device (LED, LCD panel, etc.) with micro:bit. This design tip explains how to modify for transfer data between Unity and micro:bit based on the purchased Unity script example and the purchased micro:bit code. MicroBleMobile transfers array data up to 64 bytes from Unity to micro:bit and array data up to 64 bytes from micro:bit to Unity by changing the Unity script example and the micro:bit code.
1. How to transfer data from micro:bit to Unity
1.1 How to set up data to Unity in micro:bit
1.2 How to get data from micro:bit in Unity
2. How to transfer data from Unity to micro:bit
2.1 How to set up data to micro:bit in Unity
2.2 How to get data from Unity in micro:bit
1. How to transfer data from micro:bit to Unity
1.1 How to set up data to Unity in micro:bit
The micro:bit code ‘microble-v2.1.ino’ generates 3D Object‘glasses’ tilt data ‘x, y, z’ using the “SIN” function and convert it to strings using the “sprintf” function. The micro:bit code needs to change the strings to byte array data type using ‘saccel.getBytes’ function for sending data to Unity when micro:bit connects some sensors device.
… void setAccelCharacteristicValue() { sprintf(param, "degx:%d degy:%d", degx[value], degy[value]); Serial.println(param); x = sin(degx[value] / (180 / PI)); y = sin(degy[value] / (180 / PI)); sprintf(formatted_msg, "%4.2f,%4.2f,%4.2f,", x, y, z); Serial.println(formatted_msg); String saccel = String(formatted_msg); //Serial.println(saccel); byte sbyte[saccel.length()]; saccel.getBytes(sbyte, saccel.length() + 1); accelCharacteristic.setValue(sbyte, saccel.length()); … } …
The micro:bit code ‘microble-v2.1.ino’ calls the ‘setValue’ function in the following format for sending data to Unity.
void setValue(byte[] sbyte, int length);
1.2 How to get data from micro:bit in Unity
Unity script example ‘MicroBleMobileSampleCode.cs’ receives BLE data from micro:bit as byte array data ‘str’ of return value of ‘obj.Call
... // Update is called once per frame void Update() { float[] acceldata = new float[3]; //byte[] indata = new byte[64]; //int length = 0; byte[] str = obj.Call<byte[]>("UpdateRead"); UnityEngine.Debug.LogWarning(TAG + " Update: " + str.Length); if (str.Length == 0) { UnityEngine.Debug.LogWarning(TAG + " Not connect "); return; } try { string text = System.Text.Encoding.UTF8.GetString(str); UnityEngine.Debug.LogWarning(TAG + " indata: " + text); string[] arr = text.Split(','); acceldata[0] = float.Parse(arr[0]); acceldata[1] = float.Parse(arr[1]); acceldata[2] = float.Parse(arr[2]); UnityEngine.Debug.LogWarning(TAG + " x: " + acceldata[0] + " y: " + acceldata[1] + " z: " + acceldata[2]); accelx = acceldata[0] * 100 + (-90); accely = acceldata[1] * 100; accelz = acceldata[2] * 100; transform.rotation = Quaternion.AngleAxis(accelx, Vector3.up) * Quaternion.AngleAxis(accely, Vector3.right); } catch (Exception e) { UnityEngine.Debug.LogWarning(TAG + e.ToString()); } finally { } } ...
Unity script example ‘MicroBleMobileSampleCode.cs’ calls the ‘Call
byte[] Call("UpdateRead");
2. How to transfer data from Unity to micro:bit
2.1 How to set up data to micro:bit in Unity
Unity script example ‘MicroBleMobileSampleCode.cs’ call back ‘ButtonClick’ function at button ‘On’ clicked. ‘ButtonClick’ function inputs data from ’inputFieldno0’ / ‘inputFieldno1’, then calls ‘obj.Call
… public void ButtonClick() { UnityEngine.Debug.LogWarning(TAG + " ButtonClick "); ; byte[] writedata = new byte[2] { byte.Parse(inputFieldno0.text), byte.Parse(inputFieldno1.text) }; bool result = obj.Call<bool>("Command", writedata); if (!result) { UnityEngine.Debug.LogWarning(TAG + " Not connect "); return; } UnityEngine.Debug.LogWarning(TAG + writedata[0] + " " + writedata[1]); }
Unity script example ‘MicroBleMobileSampleCode.cs’ calls the ‘Call
bool Call("Command", byte[] data);
2.2 How to get data from Unity in micro:bit
The micro:bit code ‘microble-v2.1.ino’calls back ‘getContolCharacteristicValue’ function at received data from Unity. The ‘getContolCharacteristicValue’ function receives Inputfield ’No0’ / Inputfield ‘No1’ of Unity as 2 bytes of data using the ‘controlCharacteristic.value’ function.
… void getContolCharacteristicValue() { Serial.println("************** receive data! ******************"); if (controlCharacteristic.value()) { byte row = controlCharacteristic.value()[0]; byte col = controlCharacteristic.value()[1]; Serial.println(row); Serial.println(col); led_pset(col, row, HIGH); delay(200); led_pset(col, row, LOW); } } …
The micro:bit code ‘microble-v2.1.ino’ calls the ‘value’ function for receiving byte array data in the following format from Unity.
byte value()[x]; x: byte array index return: byte