Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
E
ISTRUZIONE
Jensen Davide
Anno scolastico 2014-2015
Classe 5^ Tel. A
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
pg 3
pg 3
pg 4
pg 4
pg 4
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:
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.
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.
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
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));
}
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
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
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
10
11
12