Sei sulla pagina 1di 12

VIDEOGIOCHI

E
ISTRUZIONE

Jensen Davide
Anno scolastico 2014-2015
Classe 5^ Tel. A

ISIS A.Malignani A.S. 2014/2015

Relazione di Jensen Davide

INDICE

1 Introduzione

pg 3

1.1 I videogiochi
1.2 I videogiochi e la storia
1.3 I videogiochi e l'informatica
1.4 I videogiochi e l'attivit fisica
1.5 I videogiochi nel tempo libero

2 OF Run

pg 5

2.1 Il gioco
2.2 Hardware
2.3 Software

ISIS A.Malignani A.S. 2014/2015

pg 3
pg 3
pg 4
pg 4
pg 4

Relazione di Jensen Davide

pg 5
pg 5
pg 7

1 INTRODUZIONE
1.1 I videogiochi: i videogiochi sono ormai da tempo presenti nella vita di numerosi
ragazzi, ma ultimamente anche in quella di un sempre maggior numero di adulti.
Sono sovente molto criticati perch vengono visti come una perdita di tempo, uno svago
inutile, associato ad immagini violente o volgari.
Ma non sono solo questo, una grossa parte di videogiochi trattano di argomenti filosofici,
storici o letterali, fisici, scientifici e matematici.

1.2 I videogiochi e la storia: il primo videogioco realizzato si chiamava Cathode Raytube amusement device (fine seconda guerra mondiale), ed era ispirato al sistema di lancio
di missili utilizzato in guerra. Non viene sempre riconosciuto come il primo videogioco in
quanto non mai stato brevettato o commercializzato.
Diversi videogiochi trattano argomenti storici, pi o meno recenti. Il tema pi trattato
sicuramente la seconda guerra mondiale, ad esempio uno dei capitoli della saga dei Call of
Duty porta il giocatore a rivivere lo sbarco in Normandia, pi precisamente la battaglia di
Pointe du Hoc, nei panni di un soldato americano.
Altri videogiochi, invece, trattano argomenti storici pi antichi, quali la scoperta
dell'America o, nel caso del gioco Assassin's Creed Unity, ci presentano una fedele
riproduzione degli eventi accaduti durante la rivoluzione Francese aggiungendo anche dei
personaggi fantastici.
Un ragazzo francese ha scattato delle foto di varie ambientazioni del gioco per far vedere
quanto fedelmente stata replicata la citt:

ISIS A.Malignani A.S. 2014/2015

Relazione di Jensen Davide

1.3 I videogiochi e l'informatica: Ma i videogiochi non sono solo storia, in un


titolo noto come Minecraft il giocatore pu utilizzare una componente di gioco che
replica il funzionamento della logica booleana, pu utilizzare porte logiche, flip-flop,
pulsanti e quant'altro.
Alcuni utenti del gioco hanno riprodotto orologi, programmi di videoscrittura,
calcolatrici,... solo la fantasia pu porre limite all'inventiva.
Ci sono varie scuole medie in giro per il mondo che gi usano questo gioco per poter
insegnare le basi dell'elettronica o della programmazione ai ragazzi.
Un altro titolo molto interessante Project Spark. Questo gioco pu essere
completamente personalizzato dall'utente tramite linguaggio C#; possiamo creare
mostri, mappe e missioni da far giocare ad altre persone. Quale metodo migliore per
imparare a programmare?

1.4 I videogiochi e l'attivit fisica: Esistono alcuni dispositivi progettati per farci
allenare mentre giochiamo, la console Wii, creata dalla casa giapponese Nintendo,
possiede dei controller senza fili che permettono al giocatore di simulare una partita
di tennis, di golf o di ping pong, compiendo reali movimenti fisici, equiparabili a
quelli che utilizzerebbe in un ambiente reale. L' Omni VR un dispositivo, ancora
in fase di sviluppo, che permette al giocatore di correre sul posto grazie ad una
piattaforma curva di materiale scivoloso. I passi compiuti dalla persona vengono
sincronizzati con i passi del personaggio all'interno del gioco.

1.5 I videogiochi nel tempo libero: La collocazione temporale ideale dei


videogames dovrebbe rimanere confinata nel tempo libero, senza invadere
eccessivamente le nostre attivit principali. Come i personaggi dei racconti di
Pirandello eseguono qualche gesto al di fuori dal comune, cos noi possiamo
utilizzare i videogiochi per sfuggire per un istante alla realt, interpretando un supereroe, un dottore o qualsiasi altro personaggio la nostra fantasia ci suggerisca.
ISIS A.Malignani A.S. 2014/2015

Relazione di Jensen Davide

2 OF RUN
2.1 Il gioco: OF Run (optic fiber run) pu essere visto come un semplice esempio di
videogioco istruttivo. Chi lo gioca si trova a comandare, tramite un guanto dotato di
accelerometro, un raggio luminoso all'interno di una fibra ottica. L'obiettivo quello
di giungere alla fine del percorso senza andare a sbattere contro i bordi del cavo, per
poter evitare la rifrazione del raggio di luce. Inoltre, allo scorrere del tempo, la
velocit di movimento del raggio aumenter e i colori cambieranno seguendo le
velocit e le scale cromatiche reali.

2.2 Hardware: La componentistica che stata utilizzata la seguente:


-2 Arduino UNO, il primo utilizzato come trasmettitore e il secondo come
ricevitore;

-2 NRF24 per la trasmissione e ricezione delle informazioni via radio;

-1 accelerometro Mpu6050 per poter misurare l'inclinazione della mano;

L'Arduino trasmettitore stato montato sul guanto che il giocatore indosser. Sopra
questo Arduino stata montata una mini-breadboard alla quale stato collegato il
sensore Mpu6050; questo possiede 8 pin, dei quali sono stati utilizzati solo i primi 4:
-PIN 1 Vcc: indica il pin di alimentazione, questo stato collegato direttamente al
pin di alimentazione di Arduino ad un voltaggio di 5 volt;
-PIN 2 Gnd: il pin di ground stato collegato al pin di ground di Arduino in
ISIS A.Malignani A.S. 2014/2015

Relazione di Jensen Davide

comune con il trasmettitore;


-PIN 3 SCL: collegato al pin A5, questo viene collegato al bus utilizzato
dall'Arduino per una comunicazione gestita dal protocollo I2C;
-PIN 4 SDA: collegato al pin A4, questo viene collegato al bus utilizzato
dall'Arduino per una comunicazione gestita dal protocollo I2C;
Le informazioni di rotazione vengono inviate sulle due linee SCL ed SDA.
L'accelerometro montato in posizione parallela alla mano.
Andando a piegare la mano verranno modificati i valori di rotazione dell'asse x e y
(espressi in gradi), questi verranno poi elaborati per effettuare i movimenti (descrizione
completa nella sezione 2.3)Software).
Sull'Arduino trasmettitore montato anche un trasmettitore NRF24, anch'esso
possiede 8 pin, dei quali sono utilizzati 7:
-PIN1 Vcc: il pin di Vcc, necessario per l'alimentazione, stato collegato
direttamente al pin di alimentazione dell'Arduino, differentemente dall'accelerometro
questo integrato lavora a 3.3 volt;
-PIN2 Gnd: il pin di ground stato collegato al pin di ground di Arduino in comune
con l'accelerometro;
-PIN3 CSN: questo pin permette l'invio di varie informazioni all'Arduino tramite il
protocollo SPI, collegato al pin 10 dell'Arduino;
-PIN4 CE: tramite il pin denominato Chip Enable si pu scegliere se porre il chip
in trasmissione o in ricezione, collegato al pin 9 dell'Arduino;
-PIN5 MOSI: con questo pin si indica la linea che esce dal master per andare agli
slave (essendo l'SPI un master-slave based), collegato al pin 11 dell'Arduino;
-PIN6 SCK: la linea di sincronizzazione sulla quale transita il segnale di clock, al
pin 13 dell'Arduino;
-PIN7 MISO: con questo pin si indica la linea che esce dagli slave per andare al
master (essendo l'SPI un master-slave based), collegato al pin 12 dell'Arduino;
Riguardo all'Arduino ricevitore l'unico componente collegato risulta essere un'altra
scheda NRF24, essendo il pin-out lo stesso i collegamenti sono stati effettuati
analogamente a quelli del trasmettitore.
L'utente pu scegliere il metodo di alimentazione del trasmettitore, questo pu essere
sia collegato al computer tramite cavo USB, oppure alimentato da un supporto
esterno quale una PowerBank oppure una batteria da 9 volt.
Per poter fissare il dispositivo trasmettitore al guanto o alla mano basta adoperare un
tessuto di velcro.

ISIS A.Malignani A.S. 2014/2015

Relazione di Jensen Davide

2.2 Software: Di seguito verr presentato il codice presente sulle due schede
Arduino e la parte di acquisizione delle informazioni all'interno del software Unity.
Sulla scheda utilizzata come trasmettitore il codice che troviamo il seguente:
#include <SPI.h>
#include <I2Cdev.h>
#include <nRF24L01.h>
#include <RF24.h>
#include <Wire.h>
#include <MPU6050.h>
#define CE_PIN 9
#define CSN_PIN 10
const uint64_t pipe = 0xE8E8F0F0E1LL;
MPU6050 mpu;
int16_t ax, ay, az;
int16_t gx, gy, gz;
int val_assi[2];
RF24 radio(CE_PIN, CSN_PIN);
void setup()
{
Serial.begin(9600);
radio.begin();
radio.openWritingPipe(pipe);
Wire.begin();
mpu.initialize();
}
void loop()
{
mpu.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);
val_assi[0] = map(ax, -17000, 17000, 0, 179);
val_assi[1] = map(ay, -17000, 17000, 0, 179);
val_assi[1] *= -1;
radio.write( val_assi, sizeof(val_assi));
}

ISIS A.Malignani A.S. 2014/2015

Relazione di Jensen Davide

Le librerie che sono state importate sono, in ordine, quelle di definizione delle
funzioni relative al protocollo SPI, al protocollo I2C, alle funzioni relative all'NRF24
e all'accelerometro MPU6050.
Viene da subito dichiarata la pipeline di trasmissione, ovvero il canale sul quale
verranno inviati i dati via radio.
Nella funzione di setup viene inizializzata la velocit seriale a 9600 baud al secondo,
viene in seguito inizializzato il collegamento radio aprendo il canale di scrittura sulla
pipeline precedentemente definita, viene poi inizializzata la lettura dei valori forniti
dall'accelerometro.
Nella funzione di loop vengono acquisiti i valori di rotazione dell'accelerometro sugli
assi x, y e z (vengono acquisiti anche i valori del gyroscopio che, per, non verranno
utilizzati).
Il sensore fornisce i valori acquisiti in un range da -17000 a +17000. E' necessaria,
dunque, una ri-mappatura dei valori in un range appropriato da 0 a 179.
I valori di rotazione di x e y vengono salvati in un vettore, successivamente vengono
separati dai valori successivi da una variabile.
Il vettore contenente i valori viene poi inviato via radio.
Per quanto riguarda il trasmettitore le librerie utilizzate e le variabili dichiarate
risultano essere le stesse, cos come anche la funzione di setup, nella funzione di
loop, invece, troviamo il seguente codice:
void loop()
{
if ( radio.available() )
{
bool lettura = false;
while (!lettura)
{
lettura = radio.read( val_assi, sizeof(val_assi) );
Serial.println(val_assi[0]);
Serial.println(val_assi[1]);
delay(80);
}
}
}
Inizialmente viene effettuato un controllo per verificare che la sessione di
comunicazione radio sia avviabile e correttamente funzionante, se si allora pone il
valore booleano di lettura a falso, effettuando cos la prima lettura dei valori inviati
via radio, questi vengono posti all'interno del vettore, che viene poi inviato
serialmente al computer. Prima di effettuare una nuova acquisizione delle
informazioni viene atteso un ritardo di 80 milli-secondi per evitare una saturazione
della memoria.
ISIS A.Malignani A.S. 2014/2015

Relazione di Jensen Davide

All'interno del gioco, che stato sviluppato con il motore grafico Unity, la parte
principale del codice risiede in due script, uno utilizzato per l'acquisizione delle
informazioni, il secondo per l'esecuzione delle informazioni stesse.
Viene di seguito riportato e descritto il primo codice:
SerialPort stream = new SerialPort("COM4", 9600);
public int x_0 = 0 , y_0 = 0;
public int value_int;
private string value;
void Start () {
int value_i;
stream.ReadTimeout = 80;
stream.Open();
stream.ReadTimeout = 80;
while(x_0 == 0 || y_0 == 0)
{
value = stream.ReadLine();
if(value != ""){
value_i = int.Parse(value);
if(value_i>=0){
x_0 = value_i;
}
else{
y_0 = Mathf.Abs(value_i);
}
}
}
}
void Update () {
value = stream.ReadLine();
if(value != "") {
value_int =
int.Parse(value,System.Globalization.NumberStyles.AllowLeadingSign);
stream.BaseStream.Flush();
}
}
Viene dichiarata la porta seriale dalla quale verranno letti i valori inviati dal
ricevitore, viene utilizzata la seriale COM4 ad un baud rate di 9600 baud al
secondo. Le due variabili intere x_0 e y_0 verranno in seguito utilizzate per poter
calibrare la ricezione dei valori. Vengono poi dichiarate due variabili che terranno in
ISIS A.Malignani A.S. 2014/2015

Relazione di Jensen Davide

memoria i singoli valori ricevuti, prima in forma di stringa e poi convertiti a interi.
Nella funzione di start viene aperta la lettura dello stream delle informazioni, affinch
si eviti una ricezione parziale si attende che vengano ricevuti almeno una volta
entrambi i valori di rotazione in asse x e in asse y, essendo che questi sono forniti con
il segno pi nel caso in cui siano valori x e con il segno meno nel caso in cui siano
valori y necessario renderli senza segno dopo averli identificati.
Nella funzione di update, chiamata ad ogni frame visivo, viene costantemente letto lo
stream e, i valori, vengono trasformati uno ad uno da tipo stringa a tipo intero.
In seguito alla lettura di ogni valore viene pulito lo stream per evitare una saturazione
di informazioni con conseguente rallentamento del programma.
Per quanto riguarda l'esecuzione dei comandi ricevuti il codice il seguente:
private ValoriSeriali valori;
private GameObject player, maincam;
private Vector3 posizione, posizione_camera;
private int x,y;
void Start(){
valori = GetComponent<ValoriSeriali>();
player = GameObject.FindGameObjectWithTag("Player");
maincam = GameObject.FindGameObjectWithTag("MainCamera");
posizione = player.transform.position;
posizione_camera = maincam.transform.position;
}
void FixedUpdate(){
float speed = PlayerPrefs.GetFloat("Speed");
if(valori.value_int >= 0){
x = valori.value_int;
}
else{
y = valori.value_int;
y = y * -1;
}
if( x>100 && x<=130){
posizione.x -= 0.01f;
}
if( x>130 && x<=150){
posizione.x -= 0.06f;
}
ISIS A.Malignani A.S. 2014/2015

Relazione di Jensen Davide

10

if( x>150 && x<=180){


posizione.x -= 0.10f;
}
if( y>100 && y<=130){
posizione.y += 0.01f;
}
if( y>130 && y<=150){
posizione.y += 0.06f;
}
if( y>150 && y<=180){
posizione.y += 0.10f;
}
if( x>50 && x<=80){
posizione.x += 0.01f;
}
if( x>30 && x<=50){
posizione.x += 0.06f;
}
if( x>0 && x<=30){
posizione.x += 0.10f;
}
if( y>50 && y<=80){
posizione.y -= 0.01f;
}
if( y>30 && y<=50){
posizione.y -= 0.06f;
}
if( y>0 && y<=30){
posizione.y -= 0.10f;
}
posizione_camera.z += speed;
posizione.z += speed;
posizione_camera.x = posizione.x;
posizione_camera.y = posizione.y;
maincam.transform.position = Vector3.Lerp
(maincam.transform.position, posizione_camera, 0.5f);
player.transform.position = Vector3.Lerp(player.transform.position,
posizione, 0.5f);
}
}

ISIS A.Malignani A.S. 2014/2015

Relazione di Jensen Davide

11

La variabile di tipo ValoriSeriali necessaria per creare un collegamento allo script


di acquisizione delle informazioni. Le due dichiarazioni di tipo GameObject
indicano rispettivamente l'oggetto del giocatore e della camera mentre i due vettori di
tre spazi indicano le rispettive posizioni. Con le due variabili intere x e y indichiamo i
valori che andremo a salvare. Nella funzione di start vengono creati tutti i
collegamenti necessari, ovvero il collegamento allo script di acquisizione, i
collegamenti fra variabili e oggetti all'interno del gioco e viene eseguita la definizione
delle posizioni degli oggetti.
All'interno della funzione di update vengono letti i valori acquisiti nello script
nominato ValoriSeriali, viene nuovamente analizzato se i valori sono positivi o
negativi per identificare se appartengono ad una rotazione sull'asse x o y. In base ai
valori salvati, tramite gli if a cascata, viene incrementata o decrementata la posizione
del giocatore in base a quanto l'accelerometro risulta inclinato, avendo degli if a
cascata nel caso in cui pi condizioni siano vere vengono eseguiti pi if, rendendo
cos possibile un movimento in obliquo nel caso in cui venga effettuato con un
movimento del trasmettitore. Vengono, infine, modificate le posizioni con i valori
scelti, incrementando costantemente il valore dell'asse z dando l'effetto di un
movimento in avanti continuo. All'interno del progetto sono disponibili gli script
sopracitati ed altri interamente commentati.

ISIS A.Malignani A.S. 2014/2015

Relazione di Jensen Davide

12

Potrebbero piacerti anche