Teknisk dokumentasjon for Ludosphaera Av Gameguru ved Nikolas Ebbesberg, Silje Helene Lund, Vanessa Storøy Merine, Erik Nystad og Maria Løvland Johansson IN1060 - Vår 2019 Institutt for Informatikk Matematisk-Naturfaglige Fakultet Universitetet i Oslo
1. Mål for prosjektet Problemstillingen for prosjektet vårt var hvordan kan vi legge til rette for økt innlevelse, og skape en innbydende atmosfære under spillet?, da innlevelse og atmosfære er to av mange aspekter som påvirker spillopplevelsen under bordrollespill. Målet for prosjektet ble dermed å styrke disse aspektene, da vi håpet at dette ville adressere spillernes behov for lek og underholdning. Prototypen vår, Ludosphaera, bidrar til å nå dette målet ved at den gir muligheter for å bygge lydbilder og lage stemningslys, som er spesielt tilpassede til vår målgruppes bruksområde. Prototypen skal styres av Keeperen, da det er han som lager spillscenarioet, og leder spillerne gjennom historien. Resten av spillerne som deltar i spillscenarioet opplever selve effekten av lydbildene og stemningslyset som produseres, der disse effektene skal bidra til en innbydende atmosfære i rommet, samt at spillerne lever seg mer inn i spillhistorien. 2. Presentasjon av video Link til presentasjonsvideo av prototypen: https://bit.ly/2x35cpf Videoen starter med å gi en introduksjon til bordrollespillet Call of Cthulhu, og presenterer samtidig hvordan en typisk spillsetting kan se ut. Deretter presenteres prototypen vi har utformet som løsning til problemstillingen vår. Den består av en kontrollboks for lyd, en lyskule og et sett høyttalere. Kontrollboksen inneholder en mikrokontroller fra Arduino, et breadboard, tre potentiometere og tre RFID-lesere. Den brukes ved å legge på et RFID-kort med ønsket lydfil oppå boksen og deretter kontrollere volumet med hvert sitt potentiometer, mappet til riktig leser. Komponentene blir forsynt med strøm fra en laptop som, gjennom processing, spiller av lyden med høyttalerne. Lyskulen er LED-lampe med en tilhørende fjernkontroll som brukes til å skifte farge. Deretter viser videoen et bruksscenario, hvor vi ser hvordan Keeper tar både lyskulen og lydboksen i bruk og hvilken effekt det har på stemningen i rommet. Videoen viser all funksjonalitet vi har implementert i prototypen. 3. Teknisk dokumentasjon I denne delen vil vi først beskrive de ulike tekniske komponentene som ble brukt i prototypen. Deretter vil vi forklare og beskrive hvordan Arduino- og Processing-kodene er implementert. Avslutningsvis vil vi presentere tekniske utfordringer vi stod overfor, og deretter beskrive hvordan vi løste dem. 1
3.1 Komponenter Navn Antall Beskrivelse Arduino Uno 1 Mikrokontroller som leser analoge og digitale signaler fra RFID-lesere og potentiometre. Snakker med Processing gjennom Serial-kommunikasjon og USB-kabel. Processing 3 1 Programvare for å styre lydavspilling. Snakker med Arduino-en gjennom Serial-kommunikasjon og USB-kabel. Breadboard 1 Brett brukt til å koble ledninger, RFID-lesere og potentiometre til selve Arduino-en. RFID-leser 3 Lesere basert på Radio Frequency Identification (RFID)-teknologi. Brukes for å registrere og lese tilhørende RFID-kort. RFID-kort 13 Hvert RFID-kort er programmert med én unik ID, der hver ID er knyttet til en spesifikk lydfil i Processing. Når et kort leses av, spilles den tilhørende lydfilen. Potentiometer 10k Ω 3 Brukt for å styre lydnivået til hver fil som spilles av. Laptop 1 Brukt som strømkilde til kontrollboksen, samt for å kjøre Processing-programmet som styrte lydavspilling. USB-kabel 1 Koblet mellom Laptop og Arduino. Brukt for strømtilførsel, samt for å opprette kontakt mellom Arduino-en og Processing-programmet. Treboks 1 Boks brukt for å samle alle tekniske komponenter inni. RFID-kortene legges oppå boksen. RGB bordlampe med Fjernkontroll 2.1 lydsystem: to høyttalere og en subwoofer 1 Ferdig produkt kjøpt på Clas Ohlson. Fjernkontrollen kommuniserer med lampen gjennom IR-signaler. 1 Brukes for å spille av lyd. Høyttalerne plasseres i hver sin ende ved bordet det spilles rundt, og subwooferen plasseres på gulvet. AUX-kabel 1 Koblet mellom Laptop og 2.1 lydsystem. 2
3.2 Fritzing-diagram av løsning Diagrammet under viser hvordan de forskjellige RFID-leserne og potentiometrene er koblet til breadboardet og selve Arduino-en. 3.3 Forklaring av kode Link til Arduino-kode: https://bit.ly/2qxlyc0 Link til Processing-kode: https://bit.ly/2xiqqui I Processing-koden importerer vi processing.serial, processing.sound og java.util.map for å legge til rette for henholdsvis Serial-kommunikasjon, avspilling/kontrollering av lyd og bruk av HashMap. Vi bruker arduino-bibliotekene <MFRC522.h> som gjør at vi kan lese fra og skrive til RFID-kortene, og <SPI.h> som legger til rette for kommunikasjon mellom Arduino en og SPI-enheter, slik som RFID-lesere. For å 3
hente av ID-en til kortene har vi brukt (justert etter vårt behov) følgende kode fra Arduino s eksempelprogram for avlesing av RFID-kort: Serial. print (F( "Card UID:" )); for ( byte i = 0 ; i < mfrc522.uid. size ; i++) { Serial. print (mfrc522.uid.uidbyte[i] < 0x10? " 0" : " " ); Serial. print (mfrc522.uid.uidbyte[i], HEX); } Serial. println (); Løsningen baserer seg på Serial kommunikasjon mellom Arduino og Processing. For hver gang loop-metoden i Arduinoen kjøres printes det seks kommandoer til Serial-monitoren. Tre av meldingene forteller hvilket potentiometer den kommende verdien gjelder, og deretter den analoge verdien som blir lest av potentiometret (eks. "Pot1,104"). Tre meldinger forteller Processing RFID-en til hvert av kortene som leses av som enten en ",Stop" eller en ",Play"-kommando avhengig om kortet ligger på leseren eller nettopp er tatt av. Til slutt vises et tall som forteller hvilken RFID-leser kortet ligger på (eks. "8F 5D E4 29,Play,1"). Dersom det ikke er noe kort på leseren printes bare en verdi "ingen,ting", som forteller Processing at RFID-leserne venter på et kort. I Processing leses verdiene fra Serial-porten som Arduinoen er koblet på. Deretter hentes lydfilen til den tilhørende ID-en fra et HashMap og spilles av/stoppes. Til slutt leses volumet til et gitt potentiometer av og mappes til riktig verdi (fra 0-1023 til 0-1), og volumet på lydfilen blir satt til å være den nye verdien. I tillegg er det lagt til en grafisk representasjon av potentiometrene i Processing for å lettere kunne se om de oppfører seg slik de skal. Nærmere forklaringer av koden linje for linje er beskrevet som kommentarer i kodefilene lastet opp på GitHub. 3.4 Utfordringer En utfordring vi møtte på var at dersom RFID-lesere ble plassert for nært hverandre ble signalene fra RFID-kortene forstyrret, og dermed mistet signalet til den korrekte leseren. Ved å plassere RFID-leserne så langt unna hverandre som mulig inne i boksen fikk vi minimalisert denne effekten. En av de største utfordringene ved den tekniske implementasjonen var å finne en måte å spille av en spesifikk lydfil når det tilhørende RFID-kortet var nært en leser og deretter stoppe når kortet ble fjernet fra leseren. Dette 4
skulle i tillegg kunne gjøres på tre forskjellige RFID-lesere samtidig. Dette løste vi med bruk av millis() og et format på meldinger til serial-monitoren som fortalte hvilket RFID-kort som ble avlest, om det skulle spilles eller stoppes og hvilken RFID-leser kommandoen gjaldt. En annen stor utfordring var at Serial-kommunikasjonen var lite konsistent til tider, spesielt rett etter oppstart av programmet. Dette førte til at Processing av og til kunne stoppe og gi feilmeldinger, men deretter fungere fint under neste kjøring uten endringer i koden. Vi løste dette med en rekke if-tester og kasting av exceptions. Vi støtte også på problemer ved volumkontrollering: vi opplevde at potentiometeret som styrte volumet til en gitt lydfil kunne henge med når vi flyttet kortet til en ny leser, i stedet for at volumet ble styrt av potentiometeret til den nye leseren. Dette løste vi med å bruke tre variabler for filen som ble spilt av der og da (på en gitt leser) i stedet for et Array av disse som vi først hadde implementert. 5