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 ‘tumbler’ 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