In this tutorial, I used Serial.print
to print the information from Arduino to Unity. With the most recent update, you can use uduino.print
, which is doing the same but ensures compatibility with Uduino Wifi plugin
Our aim in this tutorial is to show you how you can integrate any libraries to Uduino. For this purpose, we show an example to connect a rotary encoder directly to Unity. Encoders use advanced Arduino features (interrupts) and are easily controllable with external libraries.
This example can be found in the Example folder of the assets under the name Encoder Library
.
Each library works differently. In each case, you have to think about what is the best way to communicate between Unity and Arduino, to optimize your code. Sometimes you'll need to trigger events (so add custom commands) and other times you'll need to simply read a value. In our case, there are two visions to perform the reading task.
Each time the encoder is turned, change in real-time an object on Unity.
At specific moments on Unity, I want to know what is the value of the knob
For the purpose of this example, we are choosing the first way to do it.
To get started, we are using the library by Paul Stoffregen that can be installed from Arduino IDE. (Sketch>Include Library > Manage Libraries>Encoder
).
First step, we include Uduino and name our board.
#include<Uduino.h>
Uduino uduino("myEncoder");
Then we include the library. In our case, we declare a new encoder, connected to the pins 5 and 6.
#include <Encoder.h>
Encoder myEnc(5, 6);
long oldPosition = -999;
We read the encoder value following the library example and print it directly in the loop.
void setup()
{
Serial.begin(9600);
}
void loop() {
uduino.update(); //Mandatory part, to maintain the connection between Arduino and Unity
long newPosition = myEnc.read(); // This is how...
if (newPosition != oldPosition) { // ...the library...
oldPosition = newPosition; // ...normally works !
uduino.println(newPosition); // we print the encoder value when a change happens
}
}
delay()
and Serial.print()
TLDR; Remove the Serial.print
and delay
from your code !
If you use delay()
in your sketch, it will pause your sketch for some ms. Hence the connection between Unity and Arduino will not work smoothly; for instance, a message sent will be waiting in your serial buffer.
If you want to use delay, you should use the function uduino.delay()
, that works similarly to the Arduino delay function but maintain the Uduino connection open.
Similarly, you should know that every Serial.print()
that you use in your loop is susceptible to be read by Unity. hence I recommend to remove unnecessary print and only use uduino.print()
when you want to send a variable.
Back on Unity, we want to link the encoder value to a graphical slider. Each time a new value is set, we are going to launch an action animating the slider by adding a custom function as a parameter of the AlwaysRead() method.
void Start () {
UduinoManager.Instance.onValueReceived += ValueReceived
}
void ValueReceived(string value, string board) {
slider.value = int.Parse(data);
}
Example: Uduino\Examples\Advanced\EncoderLibrary