Portefølje 3, IOT i AR

Jacob Bauer, Jacob Toftemark Jørgensen, Kasper Møberg Rasmussen og Peter Gissel Christensen

Beskrivelse af ideen bag applikationen:
Det vi har arbejdet med i denne opgave er at  skabe en forbindelse mellem et fysisk miljø og et virtuelt miljø via sensorinput. Vores applikation består af en fysisk del, der består af en 3D printet model af en vulkan-ø, som vi selv har designet i Blender. På denne model har vi monteret to sensorer, en tryksensor og en knap. Disse to sensorer er koblet til en Arduino, som modtager deres data, og videresender dem til Unity, som indeholder vores digitale del af opgaven. Det digitale miljø reagerer på sensorinputtet på to måder: a. Knappen starter et vulkanudbrud. b. Tryksensoren måler hvor hårdt brugeren trykker, og alt efter hvor stor denne kraft er rystes en stor sten på øen, og hvis kraften overstiger en vis grænseværdi sprænger stenen i luften. Se nedenstående billed for opstilling af det fysiske miljø:

På billedet ses tre typer af sensor – LDR, tryksensor og en knap – men da vores ldr sensor ikke endnu var ordentligt implementeret i det digitale miljø, udlader vi nærmere forklaring af vores tanker med denne sensor.
Yderligere ses arduinoen, koblet til computeren udenfor billedet, i højre side, og under øen breadboardet som er koblingen mellem den fysiske ø og arduinonen.

Tryksensor:
Vi har haft anvendt tryksensoren for at skabe  et haptisk feedback overensstemmende med den opgave som brugeren løser i det digitale miljø: destruktionen af en sten.

Knap:
Da vi har arbejdet med en yngre målgruppe (børn mellem 4-6), har vi følt at simplictet er nødvendigt, og derfor valgte vi at benytter en simpel knap, placeret på toppen af vulkanen, til at significere aktivering af vulkanen.

Vidoer af den kørende applikation:

 

 

Kode highlight

SensorManager

I den nedenstående kode, hvor vi highlighter hvordan vi forbinder Unity og Arduino, har vi haft arbejdet videre med opgaven, og tilføjet en række sensorer, men logikken er stadig den samme.

Det første  stykke af koden, ned til “void start” definere vi de variabler vi anvender – de varibler hvor der står [hideInInspector] er variblerne der indeholder de målte sensor værdier. Den sidste variable anvendes til at opbevare værdierne.

I “void start” funktionen tjekkes der om forbindelsen til arduinoen allerede er åbnet, og hvis den ikke er åbnes den. ReadPort funktionen bliver herefter kaldt. I denne funktion bliver de sendte værdier fra arduinoen gemt i arrayet, og spredt ud på de public variabler defineret i starten af koden, for at gøre dem mere tilgængelig for andre scripts.

public class sensorManager : MonoBehaviour
{
    SerialPort sp = new SerialPort("COM4", 9600); //ændres til Arduinos
    public string[] sensorArray;
    public bool arduinoConnected;

    [HideInInspector] public int forceApplied1;
    [HideInInspector] public int forceApplied2;
    [HideInInspector] public int buttonVal;
    [HideInInspector] public int lightVal1;
    [HideInInspector] public int lightVal2;
    [HideInInspector] public int lightVal3;
    [HideInInspector] public int lightVal4;
    [HideInInspector] public int xAxis, zAxis;

    private int arrayLength;

    void Start()
    {
        if (!sp.IsOpen)
            sp.Open();

        ReadPort();
    }

    void ReadPort()
    {
        try
        {
            sensorArray = sp.ReadLine().Split(',');

            forceApplied1 = int.Parse(sensorArray[0]);
            forceApplied2 = int.Parse(sensorArray[1]);
            lightVal1 = int.Parse(sensorArray[2]);
            lightVal2 = int.Parse(sensorArray[3]);
            lightVal3 = int.Parse(sensorArray[4]);
            lightVal4 = int.Parse(sensorArray[5]);
            buttonVal = int.Parse(sensorArray[6]);
            xAxis = int.Parse(sensorArray[7]);
            zAxis = int.Parse(sensorArray[8]);

            sp.BaseStream.Flush();
            StartCoroutine(delay());
        }
        catch
        {
            Debug.Log("Horrible things happened!");
        }

    }
    IEnumerator delay()
    {
        yield return new WaitForSeconds(.0844f);
        ReadPort();

VolcanoSensor – aktivering

Hvis arduinoen er forbundet skal koden reagere på at den fysiske knap på ø’en bliver trykket ned, og kalde “SensorPressed” funktionen.
“cdReady” er en variable brugt til at begrænse hvor ofte vulkanen kan gå i udbrud.

if (connected == true)
        {
            // --- Activate sensorPressed method through sensor input --- 
            int buttonVal = sensorManagerScript.buttonVal;
            Debug.Log("buttonVal: " + buttonVal);

            if (buttonVal == 1 && cdReady == true)
            {
                cdReady = false;
                Debug.Log("Entered button method");
                SensorPressed();
            }
        }

VolcanoSensor – SensorPressed funktion

 

Funktionen starter med at afspille dets tilhørende lyd, samt aktiver en funktion der håndterer particle systemet som udgør den visuelle del af udbruddet. Dernæst ændre funktion på den mængde lys som der kommer fra vulkanens åbning. Til sidst beregn funktionen mængden af lavakugler (debrisCount) der skal være i udbrudet, og aktiver “FireVolcano” funktion som skyder lavakuglerne afsted. Normalt var det også tiltænkt at denne funktion skulle aktiver et screenshake, men i denne iteration er det udkommenteret.

void SensorPressed()
    {
        audSour.Play();
        Invoke("StartExploPartic", 0.1f);

        // Make lava light more intense
        lightFluxVal = lightFluxVal * 2;
        maxLightFlux = maxLightFlux * 2;
        minLightFlux = maxLightFlux - minLightFlux;

        //ScreenShake();

        debrisCount = Random.Range(3, 10);
        FireVolcano();
    }

Tryksensoren der er forbundet til en sten på øen gennemgår en lignende behandling.

Leave a Reply