Download - ANEXO II Programación Arduino y Processing
ANEXO II – Programación Arduino y Processing
Instalación audiovisual interactiva
NOMBRE DEL ESTUDIANTE: Oriol Elié Joan
NOMBRE DEL DIRECTOR: Jorge Martín Giménez
NOMBRE DEL CODIRECTOR: Rafael Weyler Perez
ESTUDIOS: Grado en ingeniería electrónica industrial y automática
ESCUELA: Escuela Técnica Superior de Ingenierías Industrial y Aeronáutica de Terrassa
FECHA: 09/05/2019
CONVOCATORIA: Convocatoria Extraordinaria de Primavera 2019
1 ESEIAAT
Página 1
Índice
Anexo II.1: Codigo Arduino .................................................................................................................. 2
Anexo II.2: Codigo Processing ............................................................................................................ 12
2 ESEIAAT
Página 2
Anexo II.1: Codigo Arduino #include <LiquidCrystal.h>
#include <timer.h>
LiquidCrystal lcd(7, 8, 9, 10, 11 , 12);// creamos una variable liquidCrystal y
lo asociamos que los pin 7,8,9,10,11,12
int PinSensorHall = 3;// variable para indicar que el sensor de efecto hall va
conectado al pin3
int PinGiroIzq = 5;
int PinGiroDer = 2;
int PulsadorLCD = 6;
int PulsadorReset = 13;
const int Analogpin = A1;
int EstadoActualSensor1 = 0;// variables para comparar el estado del sensor Hall
int EstadoActualSensor2 = 0;
int EstadoUltimoSensor = 0;
int Gir = 0;//la variable que utilizaremos para hacer los giros, si Gir=0 la bici
seguirá recta, si Gir=1 la bici giro izquierda y si Gir=2 giro derecha
int ContadorVueltas = 0;// contador vueltas bicicleta
int Screen = 1;// variable que se usara para cambiar la información que se
muestra en la pantalla LCD
int State;// variable donde almacenaremos el valor enviado desde processing para
poder cambiar la información del lcd
int Tiempo1 = 0;
int Tiempo2 = 0;
int Tiempo3 = 0;
int PosicionPote;
int GiroAnterior = 0;
int ValorGiroAnterior = 0;
int TensionPote;
int ContadorParo1 = 0;//variables que se usaran para contar el tiempo que ha
estado parada la bicicleta para así poner a 0 la velocidad.
int ContadorParo2 = 0;
int Reset = 0;// variable que servirá para resetear el recorrido de processing.
static float radioEnCm = 30.0; //INGRESAR radio de la rueda en cm
static float pi = 3.1416;
static float PerimetroRueda = 2*pi*(radioEnCm/100); //Calcula Perimetro en
metros
float DistRecorrida=0;
float DistKM=0;
float Tiempo4=0;
float Velocidad=0;
float VelocidadMedia=0;
String StringGiro;// variable String que nos servirá para pasar un valor Int a
String
3 ESEIAAT
Página 3
boolean esValorDistancia=false;// variables booleanas que se usaran para evitar
conflictos a la hora de enviar por puerto serie los valores de distancia y
velocidad
boolean esValorVelocitat=false;
boolean TimerAcabado2 = false;
bool PulsacionAnterior = HIGH;
bool PulsacioResetAnterior = HIGH;
unsigned long TiempoTranscurrido,TiempoTranscurridoMin=0;// temporizador donde
se almacenara el tiempo transcurrido desde que se ha iniciado el programa
Timer<1> Temporizador;// creamos una variable timer que usaremos para contar el
tiempo que esta parada la bicicleta.
void setup(){
pinMode(PinGiroIzq,OUTPUT);// este es un pin digital que usaremos para
encender un led en caso de que se gire a la izquierda,Pin2.
pinMode(PinGiroDer,OUTPUT);// este es un pin digital que usaremos para
encender un led en caso de que se gire a la derecha,Pin5.
pinMode(PinSensorHall,INPUT);// el pin que se usa para el detector magnético,
el que se usa para calcular la velocidad.
pinMode(4,OUTPUT);// pin que indica si el sensor de efecto hall está
detectando o no mediante un led.
pinMode(PulsadorLCD,INPUT_PULLUP);//Pin 6, usamos las resistencias de PULL-UP
internar del Microcontrolador ARDUINO UNO R3, para tener un pulsador que se
activa por flanco de bajada.
pinMode(PulsadorReset, INPUT);// pin 13.
Serial.begin(9600);
lcd.begin(16,2);//Inicializa la interfaz en la pantalla LCD y especifica las
cotas (anchura y altura) de la visualización. begin () debe llamarse antes que
cualquier otro comando de la librería LCD.
DistRecorrida = 0;//Inicias estas variables con valor 0
Velocidad=0;
PantallaLCD();//llamas al metodo PantallaLCD()
}
4 ESEIAAT
Página 4
Inicio Loop
void loop(){
TiempoTranscurrido = millis()/1000;// calculamos el tiempo que ha trancurrido
desde que se ha iniciado el programa en segundos
if(TiempoTranscurrido >= 60){
TiempoTranscurridoMin = millis()/60000;// pasamos de segundo a minutos
}
if(digitalRead(PulsadorReset) == LOW && PulsacioResetAnterior == HIGH ){//
comparación para que solo entre al if cuando se detecte un flanco descendente
Reset = 1;
Serial.print(Reset);
Serial.print('\b');
}
PulsacioResetAnterior = digitalRead(PulsadorReset);
EstadoActualSensor1=digitalRead(3);//la variable estadoActualSensor1 recoge el
valor que hay en el pin digital 3
delay(10);
EstadoActualSensor2=digitalRead(3);//la variable estadoActualSensor2 recoge el
valor que hay en el pin digital 3 al cabo de 10ms
TensionPote=analogRead(Analogpin);// coges el valor que hay en el pin analogico
A1.
PosicionPote= map(TensionPote,0,1023,0,100);// esto sirve para pasar a % el
valor de voltaje del potenciómetro, ya que al ser una
//salida analógica el valor que obtienes al leer el pin viene dado en una
resolución de 10bits, 0V=0 y 5V = 1023, por lo tanto el 0V=0% y 5V=100%
if(PosicionPote != GiroAnterior){// con esta condición se consigue que solo
entre en el método Giro() en el caso de que la posición del potenciómetro se
mueva, en caso de que el potenciómetro se mantenga en la misma posición no
entrara en el if
GiroAnterior = PosicionPote;// guardo el valor de PosicionPote en la
variable de giro anterior para así asegurarme que solo entra en el método giro()
solo cuando el potenciómetro se mueva.
Giro();// llama al método giro()
}
//Si los estados no son iguales, el sketch no hace gran cosa, ya que significa
que las lecturas del sensor Hall son producidas por el ruido.
5 ESEIAAT
Página 5
if (EstadoActualSensor1 == EstadoActualSensor2) { // se compara el
estado del sensor hall con su estado al cabo de 10ms, para así evitar el efecto
bounce que es un efecto producido al ejecutar un conteo de vueltas, el sensor no
reacciona o a veces cuenta más de una vuelta. Esto se produce durante el primer
milisegundo de cada conteo produciendo pequeñas variaciones de la señal de
entrada que hacen que los valores HIGH y LOW obtenidos alternen rápidamente
if (EstadoActualSensor1!= EstadoUltimoSensor){// se hace esta
comparación para comprobar que realmente la rueda está girando.
if (EstadoActualSensor1 == LOW) {// Debido al efecto de la
resistencia Pull-up que se ha puesto en serie con el sensor( para evitar lecturas
erróneas por factores externos como el ruido eléctrico) hace que en estado de
reposo el PIN 3 tenga el estado HIGH,
ContadorVueltas = ContadorVueltas + 1;// el contador
sirve para contar el número de vueltas que ha hecho la rueda, cada vez que el
sensor detecta el imán, aumentamos el contador en 1
VEL();// llamada al método
Distancia();// llamada al método
}
}
}
Temporizador.tick();//inicias el timer
EstadoUltimoSensor = EstadoActualSensor1; // guardas el valor de estado
actual en estado último.
if (ContadorVueltas%2 == 0 ) {// hace la comparación del resultado del
resto(%)del contador de vueltas de la rueda, en caso de que el número de vueltas
sea múltiple de 2 el resto siempre será 0 por lo tanto entrara en este if
digitalWrite(4, LOW);//apaga el led que nos servirá como indicador
de que el sensor hall funciona correctamente
ContadorParo1=0;//se resetea el contador que indica
Cuánto tiempo lleva la bicicleta parada cuando el led esta encendido
Temporizador.every(1000,Funcion2);// con esta función se
Llama, cada 1000ms, a la interrupción funcion2.
}
else {
digitalWrite(4, HIGH);//Enciende el led que nos servirá como
indicador de que el sensor hall funciona correctamente
ContadorParo2=0;//se resetea el contador que indica cuánto tiempo
lleva la bicicleta parada cuando el led esta apagado
6 ESEIAAT
Página 6
Temporizador.every(1000, Funcion2);//con esta función se llama,
cada 1000ms, a la interrupción funcion2.
}
PantallaLCD();// llamamos al método PantallaLCD() para actualizar los
valores que salen por pantalla
}
Fin método Loop()
bool Funcion2(){// método que retorna una variable booleana TimerAcabado2
ContadorParo2 = ContadorParo2 + 1;//cada vez que se entra en este metodo( cada
1000ms) incrementamos en 1 el contadorParo2
ContadorParo1 = ContadorParo1 + 1;// cada vez que se entra en este metodo( cada
1000ms) incrementamos en 1 el contadorParo1
if(ContadorParo2 == 3 or ContadorParo1 == 3){// entra en el if cuando
cualquiera de los 2 contadores llegue a 3( significa que han pasado 3s desde que
no se detecta un cambio en el contador de vueltas de la rueda, es decir que el
sensor de efecto hall no detecta el imán, por lo tanto no hay movimiento.)
ContadorParo2=0;// se resetean los contadores
ContadorParo1=0;
TimerAcabado2 = true;// retornamos un true para indicar que han pasado 3s des
de que la bicicleta se ha parado, para poner la velocidad a 0.
VEL();//llamamos al método VEL() para actualizar su valor.
}
TimerAcabado2 = false;// en caso de que los contadores no lleguen a 3 se
retorna un falso para indicar que la bicicleta sigue en marcha.
}
Inicio método Distancia
void Distancia(){ //método donde se calculará la distancia recorrida
DistRecorrida = PerimetroRueda*ContadorVueltas;//calculas la distancia
recorrida en metros a partir del perímetro de la rueda y a partir del número de
vueltas que detecta el sensor magnético(de efecto hall) con el imán
DistKM = DistRecorrida/1000;//pasas los metros a Km
esValorDistancia = true;// ponemos la variable a true para indicar que el
valor que se quiere enviar por puerto serie es el de la distancia.
esValorVelocitat=false;// ponemos la variable a false.
if(DistRecorrida <= 999){
7 ESEIAAT
Página 7
floatToString(DistRecorrida,6,2);//llamada al metodo floatToString(el valor
en float, longitud del numero,numero de decimales)
}
else {
floatToString(DistKM,6,2);//llamada al metodo floatToString(valor en float,
longitud del número, número de decimales)
}
} Fin del método Distancia
Inicio metodo VEL()
void VEL(){
if (ContadorVueltas%2 == 0 ) {// comparas el resultado del módulo del
operador con 0, esta comparación será cierta en el caso de que el número de
vueltas de la rueda corresponda a un número múltiple de 2
Tiempo1 = millis();//obtienes el tiempo en ms cuando el número de
vueltas de la rueda sea par
}
else {
Tiempo2 = millis();// obtienes el tiempo en ms cuando el número de
vueltas de la rueda sea impar,
Con estos dos valores podrás saber el tiempo que pasa entre cada vuelta de rueda
para así calcular la velocidad.
}
Tiempo3 = abs(Tiempo2-Tiempo1); //obtienes el valor absoluto en ms de la
resta del tiempo2 - tiempo1, esto se hace para saber el tiempo que ha
transcurrido cada vez que el sensor a detectado el imán para así poder calcular
luego la velocidad
Tiempo4 = (((Tiempo3/1000.0)/60)/60);//pasas el resultado de ms a horas
Velocidad = ((PerimetroRueda/1000)/Tiempo4);//calculas la velocidad en
Km/h a a partir del perímetro de la rueda y con el tiempo4
if(Velocidad < 0){// se hace esta comparación para evitar posibles
velocidades negativas en caso de que haya algún error
Velocidad = 0;
}
if(Velocidad >= 100){// se acota la velocidad máxima que se puede
alcanzar en 100Km/h
Velocidad = 100;
}
if(TimerAcabado2 == true){// con este if pondremos la velocidad a 0 a
partir del booleano que nos retorna la interrupción funcion2.
8 ESEIAAT
Página 8
Velocidad = 0;
ContadorParo1 = 0;// reseteamos los contadores
ContadorParo2 = 0;
}
esValorDistancia = false;
esValorVelocitat = true;
floatToString(Velocidad,6,2); // llamada al metodo floatToString(valor
en float, longitud del numero,numero de decimales)
delay(10);
}Fin Metodo VEL()
Inicio método FloatToString()
void floatToString(float n,int i,int d){// Con este método pasaremos lo valores
de velocidad y distancia de float a string, ya que para enviar datos por puerto
serie no se acepta en formato float, pero si en string
if(esValorVelocitat == true){// en caso de que lo que se envíe sea la velocidad
char z[i+1];// cadena donde almacenaremos el número convertido, será un array
con una longitud de i + 1.
String VelReal;
dtostrf(n,i,d,z);// n: es el número en formato float a convertir/ i: Tamaño
del número en caracteres/ d: precisión, el número de decimales que queremos
obtener.
VelReal = String(z);
Serial.print(VelReal);// enviamos la velocidad, a Processing, vía puerto
serie en formato String.
Serial.print("\t");// enviamos este carácter para indicar el final de la
transmisión de los datos de la velocidad.
delay(10);// retardo de 10ms
}
if(esValorDistancia == true){
char c[i+1];
String Distancia;
dtostrf(n,i,d,c);
Distancia=String(c);
Serial.print(Distancia
Serial.print("\n
delay(10);
}
} Fin de FloatToString()
9 ESEIAAT
Página 9
Inicio método Giro()
void Giro(){// método para enviar el valor de giro a partir del valor del
potenciómetro, en este método la idea es que el pin 3 lea la tensión que deja
pasar el potenciómetro(0 a 5V) en caso de que la tensión leída sea de 0 a 1,66V
corresponde al 0-33% si la tensión es 1,67 a 3,32(33-66%) i si es de 3,33-5V(66-
100%)
if(PosicionPote >= 0 & PosicionPote <= 33){//en caso de que la tensión del
potenciómetro leída sea de 0-33% se girara a la izquierda
digitalWrite(PinGiroIzq,HIGH);//encendemos el led izquierdo
digitalWrite(PinGiroDer,LOW);//apagamos el led derecho
Gir=1;
if(Gir != ValorGiroAnterior){// haciendo este se consigue que el valor
de giro solo se envie una vez entra la posición del potenciometro del 0-33% para
evitar que se envie constantemente el valor de giro cuando el poteciometro se
gire entre el rango 0-33%
ValorGiroAnterior = Gir;
Serial.print(Gir);// enviamos el valor via puerto serie
Serial.print("\r");
delay(10);
}
}
if(PosicionPote > 33 & PosicionPote <= 66){
digitalWrite(PinGiroIzq,LOW);
digitalWrite(PinGiroDer,LOW);
Gir=0;
if(Gir != ValorGiroAnterior){
ValorGiroAnterior = Gir;
Serial.print(Gir);
Serial.print("\r");
delay(10);
}
}
if(PosicionPote > 66 & PosicionPote <= 100){
digitalWrite(PinGiroIzq,LOW);
digitalWrite(PinGiroDer,HIGH);
Gir=2;
if(Gir != ValorGiroAnterior){
ValorGiroAnterior = Gir;
Serial.print(Gir);
Serial.print("\r");
delay(10);
}
}
} Fin Giro()
10 ESEIAAT
Página 10
Inicio método PantallaLCD()
void PantallaLCD(){
if(digitalRead(PulsadorLCD)== LOW && PulsacionAnterior == HIGH){// activara
cada vez que se detecte un flanco de bajada, así en el caso de que mantengamos
apretado el pulsador la pantalla del LCD no cambiará constantemente
lcd.clear();
Screen=Screen+1;
}
PulsacionAnterior = digitalRead(PulsadorLCD);
if (Serial.available() > 0) {//compruebas que en el puerto serie hay un dato
disponible
State = Serial.read();// lees el valor que se ha enviado de processing a
arduino mediante puerto serie
if (State == '1') {// Se entra en el if en caso de el valor del puerto serie
sea 1 o en caso de que se haya pulsado el pulsador
lcd.clear();// limpias la pantalla del lcd
Screen = Screen+1;//incrementas en 1 el valor de la variable screen, para
así poder cambiar la información de la pantalla LCD
}
}
if(Screen == 4){//En el caso de que la variable screen sea igual a 3
Screen = 1;// se resetea su valor a 1 debido a que solo hay tres pantallas
con información distinta en el LCD
}
if(Screen == 1){// si el valor de la pantalla es 1
lcd.clear();// se limpia la pantalla LCD
lcd.write("V=");// escribes en la pantalla el caracter V=
lcd.print(Velocidad);// imprimes por pantalla el valor de la velocidad
lcd.write("Km/h");// escribes en la pantalla el caracter Km/h
lcd.setCursor(0,1);// mueves el cursor de la pantalla una linea para poder
escribir por debajo de lo escrito anteriormente, per defecto el cursor empieza en
el(0,0)
if(DistRecorrida<=999){//en caso que el valor de la distanciaRecorrida sea
menor a 999 se mostrara la distancia recorrida en metros
lcd.write("D=");// escribes en la
pantalla el caracter D=
lcd.print(DistRecorrida);// imprimes
por pantalla el valor de la distReco.
lcd.write("m");// escribes en la
pantalla el caracter m
}
11 ESEIAAT
Página 11
else{// en el caso de que el valor de la
distanciaRecorrida sea mayor a 999 se imprimira por pantalla la distanci en Km
lcd.write("D=");
lcd.print(DistKM);
lcd.write("Km"); }
}
if(Screen == 2){// si el valor de la pantalla es 2
lcd.clear();//se limpia la pantalla LCD
if(TiempoTranscurrido <= 60){
lcd.write("Tiempo=");
lcd.print(TiempoTranscurrido);
lcd.write("s"); }
else{
lcd.write("Tiempo=");
lcd.print(TiempoTranscurridoMin);
lcd.write("min");
}
lcd.setCursor(0,1);
lcd.write("V.media=");
lcd.print(VelocidadMedia);
lcd.write("Km/h");
}
if(Screen == 3){// si el valor de la pantalla es 1
lcd.clear();
lcd.write("Contador=");
lcd.print(ContadorVueltas);
lcd.write("vueltas");
}
return;
}Fin PantallaLCD()
12 ESEIAAT
Página 12
Anexo II.2: Codigo Processing import processing.video.*;
import processing.video.Movie;
import org.gstreamer.elements.PlayBin2;
import processing.serial.*;
import cc.arduino.*;// librería que permite la comunicación vía puerto serie
entre Processing y Arduino
import interfascia.*;// librería para crear el pulsador que servirá para cambiar
la información( velocidad, distancia etc.) que salga por pantalla
final PlayBin2.ABOUT_TO_FINISH FINISHING = new PlayBin2.ABOUT_TO_FINISH() {//
Evento que se acciona cada vez que un video termina
@ Override void aboutToFinish(PlayBin2 elt) {
VideoTerminado = true;//Variable booleana que sirve para indicar que un video
se ha terminado.
print("Finishing...", elt.get("uri"));// cuando se termina el video se
muestra por consolar el mensaje de Finishing mas la localización y el nombre del
video terminado.
}
};
static final String[] FILMS = {//Se crea un array de strings donde se llenara con
todos los video que se usaran en este proyecto.
"F:\\1carrermerce.mov",
"F:\\2Carme_DretaMagatzem.mov",
"F:\\3Carme_IzqRafael.mov",
"F:\\4MerceRecta.mov",
"F:\\5SantRafael_IzqMerce.mov",
"F:\\6SantRafael_DretaMerce.mov",
"F:\\7Rafael_DretaCarme.mov",
"F:\\8girDretasantrafael.mov",
"F:\\9girIZQrafel.mov",
"F:\\10Domenecdreta.mov",
"F:\\11magatzem_DretaDomenec.mov",
"F:\\12Merce_Venintde_DretaMagatzem.mov",
"F:\\13Domenecizq_venintde_izqrafael.mov",
"F:\\14santpere_venintde_izqsantdoemnec.mov",
"F:\\15santpere_vennintde_santpereRecta.mov",
"F:\\16Carme_venintde_izqPere.mov",
"F:\\17SantRafael_venintde_izqCarme.mov",
"F:\\18Carme_recta_anantcapalaRambla.mov",
"F:\\19Magatzem_izqCarme.mov",
"F:\\20Merce_venintde_DretaSantRafael.mov",
"F:\\21Merce_venintde_IzqSantRafael.mov",
"F:\\22SantRafael_seguintrecta_Cap_a_Doemenec.mov",
"F:\\23Merce_venintde_izqSantpere.mov",
"F:\\24Merce_venintde_izqMagatzem.mov",
"F:\\25Magatzem_seguintrecta.mov",
"F:\\26SantDomenec_venintde_izqMagatzem.mov",
"F:\\27SantRafael_venintde_izqMerce.mov",
"F:\\28SantRafael_venintde_dretaMerce.mov",
"F:\\29Merce_seguintrecta_direccioRambla.mov",
"F:\\30Magatzem_venintde_IzqMerce.mov",
"F:\\31Magatzem_venintde_dretaMerce.mov",
"F:\\32Carme_Venintde_DretaRafael.mov",
"F:\\33SantPere_venintde_dretaCarme.mov",
13 ESEIAAT
Página 13
"F:\\34Santpera_seguintrecta_capaCarme.mov",
"F:\\35Domenec_venintde_DretaSantpera.mov",
"F:\\36SantRafel_venintde_DretaDomenec.mov",
"F:\\37Domenec_seguintRectaRambla.mov",
"F:\\38Magatzem_venintde_DretaDomenec.mov",
"F:\\39Merce_venintde_DretaMagatzem.mov",
"F:\\40Magatzem_venintde_DretaMerce.mov",
"F:\\41Domenec_dretaRafael.mov",
"F:\\42Magatzem_venintde_DretaDomenec.mov",
"F:\\43SantPere_venintde_izqMerce.mov",
"F:\\44SantPere_venintde_DerMerce.mov",
"F:\\45Domenc_IzqMagatzem.mov",
"F:\\46Carme_DretaRafael.mov",
"F:\\47Rafael_IzqDomenec.mov",
"F:\\48Magatzem_RectacapaCarme.mov",
"F:\\49Carme_RectacapaPere.mov",
"F:\\50Rafael_DretaDomenec.mov",
"F:\\51Rafael_RectaCapaCarme.mov",
"F:\\52SantPere_RectaCapaDomenec.mov",
"F:\\53Domenec_RectaCapaPere.mov",
"F:\\54Merce_DretaPere.mov",
"F:\\55Merce_DretaRafael.mov",
"F:\\56Merce_IzqRafaelRambla.mov",
};
static final float FPS = 30.0;// creamos la variable FPS como un float y estática
para fijar su valor y que no se pueda modificar .
final Movie[] movies = new Movie[FILMS.length];// creas una array de peliculas
con la
//longitud de films es decir cras una array con la cantidad de videos que contien
e films, pero lo haces como variable final
//para que asi no se modificar su valor(longitud) en el programa.
Serial myPort;
Movie m;// crea una variable película
int idx,x,y;// creas variables enteras.
int Giro;// la uso para pasar el valor de giro de string a int ya que despues en
el if(valorgir==1) la comparación se ha de hacer con enteros, Si valorgir=0
seguir recto, valorgir=1 izquierda, valorgir=2 derecha
int screen = 0;// variable per cambiar la información de la pantalla.
int Reset;
boolean
carrermerce,mercerecta,rafaelizq,rafaeldreta,carme_izqrafael,santrafaeldreta,dome
nec_dretapera,carme_izqpere,magatzem_izqcarme,domenecrectarambla,carmerectarambla
,santrafael_izqcarme,magatzem_rectadesdecarme,isPaused=false;
boolean
merce_izqmagatzem,magatzem_dretadomenec,santrafael_rectacapadomenec,merce_izqrafa
el,merce_dretarafael,domenec_izqmagatzem,merce_dretamagatzem,domenec_izqrafael,do
menec_dretarafael,magatzem_izqmerce=false;
boolean
magatzem_dretamerce,domenecrecta,santrafael_izqdomenec,santpere_izqdomenec,santpe
re_izqmerce,santpere_dretamerce,carme_dretamagatzem,santRafael_RectacapaCarme,car
me_dretarafael,santrafael_dretadomenec,santpere_rectacapacarme,merce_izqpere,merc
14 ESEIAAT
Página 14
e_rectarambla,santrafael_izqmerce,santrafael_dretamerce,domenec_dretapere,carme_r
ectacapapere,santpere_dretacarme,merce_dretapere,santpere_rectacapadomenec,domene
c_rectarambla,rafael_dretacarme,magatzem_rectacapacarme=false;
String TransmisionVelocidad;// esta variable es la que se comunica con el
arduinop para obtener los valors de la velocidad que envia el arduino
String TransmisionGiro;//esta variable es la que se comunica con el arduinop para
obtener los valors del giro que envia el arduino
String TransmisionDistancia;// Variable donde guardaremos el valor de la
distancia que se ha enviado mediante puerto serie de Arduino a Processing
String TransmisionReset;
String ValorVelocidad;// esta variable sirve para recoger el valor de la
velociadad a partir de transmisionvelocidad pero filtrando los valores donde la
velocidad es null
String ValorGiro;// esta variable sirve para recoger el valor de giro a partir de
transmisiongiro pero filtrando los valores donde el giro es null
String ValorVelMedia;
String ValorDistancia;
String ValorReset;
Float FloatVelocidad;// para pasar de string a float ya que para el
m.speed(float) necesito un float
float FloatDistancia;
Float FloatvelMedia;
float VelocidaddeRepoduccion;
float TiempoTranscurridoSeg;
float TiempoTranscurridoMin;
PFont Texto;// PFont es la clase de fuente para Processing, que nos servira para
crear un tipo de letra a partir del método createFont();
boolean VideoTerminado=false;// esta variable la creo pasa usarla en el movie
event para que asi cuando se termine el video se ponga a true.
GUIController informacion;// variable GuiController donde se controlara las
variables b1 y L
IFButton b1;//Se crea una variable IFButton que sirve para crear un pulsador.
PGraphics j2;
void setup() {
size(1280, 800, P2D);// creas la ventana donde se reproducen los videos con un
tamaño de 1280 pixeles en el eje x y 800 pixeles en el eje y, la variable P2D es
un Procesador de gráficos 2D que hace uso de hardware de gráficos compatible con
OpenGL.
noSmooth();// el smooths se usa para suavizar la imagen, por defecto siempre se
aplica, por eso tienes que poner el noSmooths.
loop();//
frameRate(FPS);//FPS=30
background(0);// es el color de fondo de la venta, en este caso el 0 = negro
j2 = createGraphics(width/4, height/10, P2D);//creas y retornas un nuevo objeto
PGraphics, se usa esta variable para dibujar un bufer de gràficos fuera de
pantalla. los 2 primeros parámetros son para definir la altura i la anchura, en
pixeles, del objeto y el tercer parámetro es para especificar el renderizador en
este caso el P2D.Nos servirá de pantalla por donde saldrá toda la
información(velocidad,Distancia etc.)
15 ESEIAAT
Página 15
informacion = new GUIController(this);//El objeto GUIController realiza un
seguimiento de todos los componentes de la GUI y maneja el reenvío de eventos
desde el applet de procesamiento a los componentes de la GUI individuales.
b1 = new IFButton("Informacíon",100,600,width/4, height/20); //Creas un nuevo
componente GUI de botón, el primer parámetro es el texto mostrado en el botón,
los dos siguientes parámetros son para seleccionar en que posición se muestra en
la pantalla, y los 2 últimos són para crear el tamaño y forma del botón
b1.addActionListener(this);//asocias la variable botón b1 a un ActionListener
para manejar los eventos en caso de que pulse el botón.
informacion.add(b1);// añades al objeto GUIController información el botón b1
mediante el metodo add() para así controlar el botón
Texto = createFont("Arial",22,true);// Apartar de las variables Pfont creada
anteriormente, especificas el tipo de letra que se usará y el tamaño de las
letras.
String portName = Serial.list()[1];//Asocias tu puerto a la entrada USB
correspondient, en el caso de mi ordenador es la 1.
myPort = new Serial(this, portName, 9600);// Creas una nuevo puerto serie
asociado al puerto de entrada 1 y con un BaudRate de 9600
for (String s : FILMS) (movies[idx++] = new Movie(this,
s)).playbin.connect(FINISHING);//recorres todo la longitud de la variable films
para rellenar la variable movies.El idx se usa de puntero.Ademas llamas al evento
playbin.connect(FINISHING).
CarrerMerce();// llamas al método para empezar el recorrido
}
void draw() {
set(x, y, m);//Al configurar una imagen(m), los parámetros x e y definen las
coordenadas para la esquina superior izquierda de la imagen, independientemente
del modo de imagen actual ().
drawRect(j2);//dibujas un rectángulo con los parámetro de la variable PGraphics
j2
image(j2, 100, 650);// el método image sirve para dibujar en la pantalla el
rectángulo creado a partir de la variable j2.Los otros dos parámetros son para
indicar la posición donde se dibujara el rectángulo en la ventana principal
if(myPort.available() > 0){ // si hay algún dato disponible en el puerto
TransmisionVelocidad=myPort.readStringUntil('\t');// leemos el string que
enviamos por arduino, y especificamos que solo lea los valores hasta que detecta
el carácter '\t', así conseguimos identificar qué valor se está enviando y evitar
conflictos
delay(10);
if(TransmisionVelocidad!=null){//en caso de que el valor enviado no se null
ValorVelocidad=TransmisionVelocidad;// guardamos el valor de
transmisionVelocidad con los nulls ya filtrados en la variable String
ValorVelocidad
FloatVelocidad= float(trim(ValorVelocidad));// convertimos a Float el
valor de velocidad.
}
TransmisionGiro=myPort.readStringUntil('\r');
16 ESEIAAT
Página 16
if(TransmisionGiro != null){
ValorGiro = TransmisionGiro;
Giro = Integer.parseInt(ValorGiro.trim());// convertimos a Int el valor
de giro
println(Giro);
}
TransmisionDistancia=myPort.readStringUntil('\n');
if(TransmisionDistancia!=null){
ValorDistancia=TransmisionDistancia;
FloatDistancia= float(trim(ValorDistancia));//convertimos a Float el
valor de a distancia.
}
TransmisionReset = myPort.readStringUntil('\b');
if(TransmisionReset != null){
ValorReset = TransmisionReset;
Reset = Integer.parseInt(ValorReset.trim());
println(Reset);
}
}
if(Reset == 1){// en el caso de que el pulsador de reset sea presionado,
reiniciamos el recorrido.
CarrerMerce();
}
TiempoTranscurridoSeg = millis()/1000;// tiempo transcurrido en segundos desde
que se inicia el programa.
if(TiempoTranscurridoSeg>=60){//cuando el TiempoTranscurridoSeg sea mas grande
o igual a 60
TiempoTranscurridoMin = millis()/60000;//Pasamos el tiempo a de segundos a
minutos
}
FloatvelMedia=FloatDistancia/(millis()/1000)*3600;// calculamos la velocidad
media a partir de la distancia recorrida(valor que se obtiene por puerto serie)
con el tiempo transcurrido
surface.setTitle(round(m.time()) + "\t " + round(m.duration())+ "\t " +
FILMS[idx]);
if(carrermerce==true){//A partir de las variables booleanas con el nombre de
las calles, lo que se quiere conseguir, es que mientras el video aún se esté
ejecutando se sigua entrando en el método de la calle correspondiente.
CarrerMerce();
}
else if(mercerecta==true){
Mercerecta();
}
else if(rafaelizq==true){
SantRafaelizq();
}
else if(santrafaeldreta==true){
17 ESEIAAT
Página 17
SantRafaeldreta();
}
else if(carme_izqrafael==true){
Carme_IzqRafael();
}
else if(domenec_dretapera==true){
Domenec_DretaPera();
}
else if(carme_izqpere==true){
Carme_IzqPere();
}
else if(magatzem_izqcarme==true){
Magatzem_IzqCarme();
}
else if(carmerectarambla==true){
CarmeRectaRambla();
}
else if(santrafael_izqcarme==true){
SantRafael_IzqCarme();
}
else if(magatzem_rectadesdecarme==true){
Magatzem_rectadesdeCarme();
}
else if(merce_izqmagatzem==true){
Merce_IzqMagatzem();
}
else if(magatzem_dretadomenec==true){
Magatzem_DretaDomenec();
}
else if(santrafael_rectacapadomenec==true){
SantRafael_RectacapaDomenec();
}
else if(merce_izqrafael==true){
Merce_IzqRafael();
}
else if(merce_dretarafael==true){
Merce_DretaRafael();
}
else if(domenec_izqmagatzem==true){
Domenec_IzqMagatzem();
}
else if(merce_dretamagatzem==true){
Merce_DretaMagatzem();
}
18 ESEIAAT
Página 18
else if(domenec_izqrafael==true){
Domenec_IzqRafael();
}
else if(domenec_dretarafael==true){
Domenec_DretaRafael();
}
else if(magatzem_izqmerce==true){
Magatzem_IzqMerce();
}
else if(magatzem_dretamerce==true){
Magatzem_DretaMerce();
}
else if(domenecrecta==true){
DomenecRecta();
}
else if(santrafael_izqdomenec==true){
SantRafael_IzqDomenec();
}
else if(santpere_izqdomenec==true){
SantPere_IzqDomenec();
}
else if(santpere_izqmerce==true){
SantPere_IzqMerce();
}
else if(santpere_dretamerce==true){
SantPere_DretaMerce();
}
else if(carme_dretamagatzem==true){
Carme_DretaMagatzem();
}
else if(santRafael_RectacapaCarme==true){
SantRafael_RectacapaCarme();
}
else if(carme_dretarafael==true){
Carme_DretaRafael();
}
else if(santrafael_dretadomenec==true){
SantRafael_DretaDomenec();
}
else if(santpere_rectacapacarme==true){
SantPere_RectacapaCarme();
}
else if(merce_izqpere==true){
19 ESEIAAT
Página 19
Merce_IzqPere();
}
else if(merce_rectarambla==true){
Merce_RectaRambla();
}
else if(santrafael_izqmerce==true){
SantRafael_IzqMerce();
}
else if(santrafael_dretamerce==true){
SantRafael_DretaMerce();
}
else if(domenec_dretapere==true){
Domenec_DretaPere();
}
else if(carme_rectacapapere==true){
Carme_RectacapaPere();
}
else if(santpere_dretacarme==true){
SantPere_DretaCarme();
}
else if(merce_dretapere==true){
Merce_DretaPere();
}
else if(santpere_rectacapadomenec==true){
SantPere_rectacapaDomenec();
}
else if(domenec_rectarambla==true){
Domenec_RectaRambla();
}
else if(rafael_dretacarme==true){
Rafael_DretaCarme();
}
else if(magatzem_rectacapacarme==true){
Magatzem_RectacapaCarme();
}
}
void CarrerMerce(){
Reset = 0;// Ponemos la variable a 0 para que no entre en bucle
carrermerce=true;// Ponemos esta variable a true para indicar de que aun se
esta ejecutando el video
(m = movies[idx = 0]).play();// ejecutamos el video que esta en la posición 0
del array de videos.
while (m.width == 0) delay(100);
20 ESEIAAT
Página 20
centralizeMovie();
if(FloatVelocidad==null || FloatVelocidad<= 0 ){// En el caso de que la
velocidad sea null, mas pequeña o igual a 0
VelocidaddeRepoduccion=0.1;//Fijamos la velocidad a 0.1 para asi evitar
errores
}
else{
VelocidaddeRepoduccion=FloatVelocidad/10.89;// La velocidad de reproduccion
sera igual a la velocidad obtenida por puerto serie divida por la velocidad en la
que iba cuando se grabo el video.
}
m.speed(VelocidaddeRepoduccion);//Fijamos que la velocidad de reproducción del
video sea igual al dato calculado anteriormente
if(VideoTerminado == true){// cuando el video haya terminado, mediante el final
PlayBin2.ABOUT_TO_FINISH FINISHING que retorna VideoTerminado==true
carrermerce=false;// indicamos que el video ya se ha finalizado
VideoTerminado=false;// Reseteamos la variable.
switch(Giro){
case 0:// En caso de que el valor de giro = 0,(si valorgir==0 es para
indicar que se quiere seguir recto)
m.stop();// paramos el video
delay(100);// retraso de 100ms
Mercerecta();// saltamos a este metodo para ejecutar el siguiente
video
break;
case 1:// En caso de que el valor de giro = 1,(si valorgir==1 es para
indicar que se quiere girar a la izquierda)
m.stop();// paramos el video
delay(100);// retraso de 100ms
SantRafaelizq(); // saltamos a este metodo para ejecutar el siguiente
video
break;
case 2: // En caso de que el valor de giro = 1,(si valorgir==1 es para
indicar que se quiere girar a la izquierda)
m.stop();// paramos el video
delay(100);// retraso de 100ms
SantRafaeldreta();// saltamos a este metodo para ejecutar el
siguiente video
break;
}
}
}
void SantRafaelizq(){
if(FloatVelocidad==null || FloatVelocidad<= 0 ){
21 ESEIAAT
Página 21
VelocidaddeRepoduccion=0.1;
}
else{
VelocidaddeRepoduccion=FloatVelocidad/10.097;
}
rafaelizq=true;
(m = movies[idx = 4]).play();
m.speed(VelocidaddeRepoduccion);
while (m.width == 0) delay(100);
centralizeMovie();
if(VideoTerminado==true){
rafaelizq=false;
VideoTerminado=false;
switch(Giro){
case 0:
m.stop();
break;
case 1:
m.stop();
Carme_IzqRafael();
break;
case 2:
m.stop();
Carme_DretaRafael();
break;
}
}
}
void Mercerecta(){
mercerecta=true;
if(FloatVelocidad==null || FloatVelocidad<= 0 ){
VelocidaddeRepoduccion=0.1;
}
else{
VelocidaddeRepoduccion=FloatVelocidad/9.76;
}
(m = movies[idx = 3]).play();
m.speed(VelocidaddeRepoduccion);
while (m.width == 0) delay(100);
centralizeMovie();
if(VideoTerminado==true){
mercerecta=false;
VideoTerminado=false;
switch(Giro){
22 ESEIAAT
Página 22
case 0:
m.stop();
break;
case 1:
m.stop();
SantPere_IzqMerce();
break;
case 2:
m.stop();
SantPere_DretaMerce();
break;
}
}
}
void SantRafaeldreta(){
santrafaeldreta=true;
if(FloatVelocidad==null || FloatVelocidad<= 0 ){// En el caso de que la
velocidad sea null, mas pequeña o igual a 0
VelocidaddeRepoduccion=0.1;
}
else{
VelocidaddeRepoduccion=FloatVelocidad/10.678;
}
(m = movies[idx = 5]).play();// ejecutamos el video de la 5 posición
m.speed(VelocidaddeRepoduccion);
while (m.width == 0) delay(100);
centralizeMovie();
if(VideoTerminado == true) {
santrafaeldreta = false;
VideoTerminado = false;
switch(Giro){
case 0:
m.stop();
break;
case 1:
m.stop();
Domenec_IzqRafael();
break;
case 2:
m.stop();
Domenec_DretaRafael();
break;
}
}
23 ESEIAAT
Página 23
}
void Carme_IzqRafael(){
if(FloatVelocidad==null || FloatVelocidad<= 0 ){
VelocidaddeRepoduccion=0.1;
}
else{
VelocidaddeRepoduccion=FloatVelocidad/8.77;
}
carme_izqrafael=true;
(m = movies[idx = 2]).play();
m.speed(VelocidaddeRepoduccion);
while (m.width == 0) delay(100);
centralizeMovie();
if(VideoTerminado==true){
carme_izqrafael=false;
VideoTerminado=false;
switch(Giro){
case 0:
m.stop();
break;
case 1:
m.stop();
Magatzem_IzqCarme();
break;
case 2:
m.stop();
break;
}
}
}
void Domenec_DretaPera(){
if(FloatVelocidad==null || FloatVelocidad<= 0 ){
VelocidaddeRepoduccion=0.1;
}
else{
VelocidaddeRepoduccion=FloatVelocidad/11.27;
}
domenec_dretapera=true;
(m = movies[idx = 34]).play();
m.speed(VelocidaddeRepoduccion);
while (m.width == 0) delay(100);
centralizeMovie();
24 ESEIAAT
Página 24
if(VideoTerminado==true){
domenec_dretapera=false;
VideoTerminado=false;
switch(Giro){
case 0:
m.stop();
Domenec_RectaRambla();
break;
case 1:
m.stop();
break;
case 2:
m.stop();
SantRafael_DretaDomenec();
break;
}
}
}
void Carme_IzqPere(){
carme_izqpere=true;
if(FloatVelocidad==null || FloatVelocidad<= 0 ){ VelocidaddeRepoduccion=0.1;
}
else{
VelocidaddeRepoduccion=FloatVelocidad/9.26;
}
(m = movies[idx = 15]).play();
m.speed(VelocidaddeRepoduccion);
while (m.width == 0) delay(100);
centralizeMovie();
if(VideoTerminado==true){
carme_izqpere=false;
VideoTerminado=false;
switch(Giro){
case 0:
m.stop();
CarmeRectaRambla();
break;
case 1:
m.stop();
SantRafael_IzqCarme();
break;
case 2:
m.stop();
break;
25 ESEIAAT
Página 25
}
}
}
void Magatzem_IzqCarme(){
magatzem_izqcarme=true;
if(FloatVelocidad==null || FloatVelocidad<= 0 ){// En el caso de que la
velocidad sea null, mas pequeña o igual a 0
VelocidaddeRepoduccion=0.1;//Fijamos la velocidad a 0.1 para así evitar
errores
}
else{
VelocidaddeRepoduccion=FloatVelocidad/10.377;// La velocidad de reproduccion
sera igual a la velocidad obtenida por puerto serie divida por la velocidad en la
que iba cuando se grabó el video.
}
(m = movies[idx = 18]).play();
m.speed(VelocidaddeRepoduccion);
while (m.width == 0) delay(100);
centralizeMovie();
if(VideoTerminado==true){
magatzem_izqcarme=false;
VideoTerminado=false;
switch(Giro){
case 0:
m.stop();
Magatzem_rectadesdeCarme();
break;
case 1:
m.stop();
Merce_IzqMagatzem();
break;
case 2:
m.stop();
break;
}
}
}
void CarmeRectaRambla(){
carmerectarambla=true;
if(FloatVelocidad==null || FloatVelocidad<= 0 ){// En el caso de que la
velocidad sea null, más pequeña o igual a 0
VelocidaddeRepoduccion=0.1;//Fijamos la velocidad a 0.1 para asi evitar
errores
}
26 ESEIAAT
Página 26
else{
VelocidaddeRepoduccion=FloatVelocidad/9.94;// La velocidad de reproducción
será igual a la velocidad obtenida por puerto serie divida por la velocidad en la
que iba cuando se grabó el video.
}
(m = movies[idx = 17]).play();
m.speed(VelocidaddeRepoduccion);
while (m.width == 0) delay(100);
centralizeMovie();
if(VideoTerminado==true){
carmerectarambla=false;
VideoTerminado=false;
switch(Giro){
case 0:
m.stop();
break;
case 1:
m.stop();
Magatzem_IzqCarme();
break;
case 2:
m.stop();
break;
}
}
}
void SantRafael_IzqCarme(){
santrafael_izqcarme=true;
if(FloatVelocidad==null || FloatVelocidad<= 0 ){// En el caso de que la
velocidad sea null, mas pequeña o igual a 0
VelocidaddeRepoduccion=0.1;//Fijamos la velocidad a 0.1 para asi evitar
errores
}
else{
VelocidaddeRepoduccion=FloatVelocidad/10.34;// La velocidad de reproduccion
sera igual a la velocidad obtenida por puerto serie divida por la velocidad en la
que iba cuando se grabo el video.
}
(m = movies[idx = 16]).play();
m.speed(VelocidaddeRepoduccion);
while (m.width == 0) delay(100);
centralizeMovie();
if(VideoTerminado==true){
santrafael_izqcarme=false;
VideoTerminado=false;
switch(Giro){
27 ESEIAAT
Página 27
case 0:
m.stop();
SantRafael_RectacapaDomenec();
break;
case 1:
m.stop();
Merce_IzqRafael();
break;
case 2:
m.stop();
Merce_DretaRafael();
break;
}
}
}
void Magatzem_rectadesdeCarme(){
magatzem_rectadesdecarme=true;
if(FloatVelocidad==null || FloatVelocidad<= 0 ){
VelocidaddeRepoduccion=0.1;
}
else{
VelocidaddeRepoduccion=FloatVelocidad/11.16;
}
(m = movies[idx = 24]).play();
m.speed(VelocidaddeRepoduccion);
while (m.width == 0) delay(100);
centralizeMovie();
if(VideoTerminado==true){
magatzem_rectadesdecarme=false;
VideoTerminado=false;
switch(Giro){
case 0:
m.stop();
break;
case 1:
m.stop();
Domenec_IzqMagatzem();
break;
case 2:
m.stop();
break;
}
}
}
28 ESEIAAT
Página 28
void Merce_IzqMagatzem(){
merce_izqmagatzem=true;
if(FloatVelocidad==null || FloatVelocidad<= 0 ){
VelocidaddeRepoduccion=0.1;
}
else{
VelocidaddeRepoduccion=FloatVelocidad/9.53;
}
(m = movies[idx = 23]).play();
m.speed(VelocidaddeRepoduccion);
while (m.width == 0) delay(100);
centralizeMovie();
if(VideoTerminado==true){
merce_izqmagatzem=false;
VideoTerminado=false;
switch(Giro){
case 0:
m.stop();
Mercerecta();
break;
case 1:
m.stop();
SantRafaelizq();
break;
case 2:
m.stop();
SantRafaeldreta();
break;
}
}
}
void Magatzem_DretaDomenec(){
magatzem_dretadomenec = true;
if(FloatVelocidad == null || FloatVelocidad <= 0 ){
VelocidaddeRepoduccion = 0.1;
}
else{
VelocidaddeRepoduccion = FloatVelocidad/10.377;
}
(m = movies[idx = 37]).play();
m.speed(VelocidaddeRepoduccion);
while (m.width == 0) delay(100);
centralizeMovie();
29 ESEIAAT
Página 29
if(VideoTerminado==true){
magatzem_dretadomenec=false;
VideoTerminado=false;
switch(Giro){
case 0:
m.stop();
Magatzem_RectacapaCarme();
break;
case 1:
m.stop();
break;
case 2:
m.stop();
Merce_DretaMagatzem();
break;
}
}
}
void Magatzem_RectacapaCarme(){
magatzem_rectacapacarme=true;
if(FloatVelocidad==null || FloatVelocidad<= 0 ){
VelocidaddeRepoduccion=0.1;
}
else{
VelocidaddeRepoduccion=FloatVelocidad/10.377;
}
(m = movies[idx = 47]).play();
m.speed(VelocidaddeRepoduccion);
while (m.width == 0) delay(100);
centralizeMovie();
if(VideoTerminado==true){
magatzem_rectacapacarme=false;
VideoTerminado=false;
switch(Giro){
case 0:
m.stop();
break;
case 1:
m.stop();
break;
case 2:
m.stop();
Carme_DretaMagatzem();
30 ESEIAAT
Página 30
break;
}
}
}
void SantRafael_RectacapaDomenec(){
santrafael_rectacapadomenec=true;
if(FloatVelocidad==null || FloatVelocidad<= 0 ){
VelocidaddeRepoduccion=0.1;
}
else{
VelocidaddeRepoduccion=FloatVelocidad/10.678;
}
(m = movies[idx = 21]).play();
m.speed(VelocidaddeRepoduccion);
while (m.width == 0) delay(100);
centralizeMovie();
if(VideoTerminado == true){
santrafael_rectacapadomenec = false;
VideoTerminado = false;
switch(Giro){
case 0:
m.stop();
break;
case 1:
m.stop();
Domenec_IzqRafael();
case 2:
m.stop();
Domenec_DretaRafael();// video 40
break;
}
}
}
void Merce_IzqRafael(){
merce_izqrafael=true;
if(FloatVelocidad==null || FloatVelocidad<= 0 ){
VelocidaddeRepoduccion=0.1;
}
else{
VelocidaddeRepoduccion=FloatVelocidad/9.76;
}
(m = movies[idx = 20]).play();
m.speed(VelocidaddeRepoduccion);
while (m.width == 0) delay(100);
31 ESEIAAT
Página 31
centralizeMovie();
if(VideoTerminado == true){
merce_izqrafael = false;
VideoTerminado = false;
switch(Giro){
case 0:
m.stop();
break;
case 1:
m.stop();
SantPere_IzqMerce();
break;
case 2:
m.stop();
SantPere_DretaMerce();
break;
}
}
}
void Merce_DretaRafael(){
merce_dretarafael = true;
if(FloatVelocidad == null || FloatVelocidad <= 0 ){
VelocidaddeRepoduccion = 0.1;
}
else{
VelocidaddeRepoduccion = FloatVelocidad/9.18;
}
(m = movies[idx = 19]).play();
m.speed(VelocidaddeRepoduccion);
while (m.width == 0) delay(100);
centralizeMovie();
if(VideoTerminado == true){
merce_dretarafael = false;
VideoTerminado = false;
switch(Giro){
case 0:
m.stop();
break;
case 1:
m.stop();
Magatzem_IzqMerce();
break;
32 ESEIAAT
Página 32
case 2:
m.stop();
Magatzem_DretaMerce();// video 30
break;
}
}
}
void Domenec_IzqMagatzem(){
domenec_izqmagatzem = true;
if(FloatVelocidad == null || FloatVelocidad <= 0 ){
VelocidaddeRepoduccion = 0.1;
}
else{
VelocidaddeRepoduccion = FloatVelocidad/9.379;
}
(m = movies[idx = 25]).play();
m.speed(VelocidaddeRepoduccion);
while (m.width == 0) delay(100);
centralizeMovie();
if(VideoTerminado == true){
domenec_izqmagatzem = false;
VideoTerminado = true;
switch(Giro){
case 0:
m.stop();
DomenecRecta();
break;
case 1:
m.stop();
SantRafael_IzqDomenec();
break;
case 2:
m.stop();
break;
}
}
}
void Merce_DretaMagatzem(){
merce_dretamagatzem=true;
if(FloatVelocidad == null || FloatVelocidad <= 0 ){
VelocidaddeRepoduccion = 0.1;
33 ESEIAAT
Página 33
}
else{
VelocidaddeRepoduccion = FloatVelocidad/10.89;
}
(m = movies[idx = 11]).play();
m.speed(VelocidaddeRepoduccion);
while (m.width == 0) delay(100);
centralizeMovie();
if(VideoTerminado == true){
merce_dretamagatzem=false;
VideoTerminado=false;
switch(Giro){
case 0:
m.stop();
Mercerecta();
break;
case 1:
m.stop();
SantRafaelizq();
break;
case 2:
m.stop();
SantRafaeldreta();
break;
}
}
}
void Domenec_IzqRafael(){
domenec_izqrafael=true;
if(FloatVelocidad == null || FloatVelocidad <= 0 ){
VelocidaddeRepoduccion = 0.1;
}
else{
VelocidaddeRepoduccion = FloatVelocidad/9.4;
}
(m = movies[idx = 12]).play();
m.speed(VelocidaddeRepoduccion);
while (m.width == 0) delay(100);
centralizeMovie();
if(VideoTerminado == true){
domenec_izqrafael = false;
VideoTerminado = false;
switch(Giro){
34 ESEIAAT
Página 34
case 0:
m.stop();
break;
case 1:
m.stop();
SantPere_IzqDomenec();
break;
case 2:
m.stop();
break;
}
}
}
void Domenec_DretaRafael(){
domenec_dretarafael=true;
if(FloatVelocidad == null || FloatVelocidad <= 0 ){
VelocidaddeRepoduccion = 0.1;
}
else{
VelocidaddeRepoduccion = FloatVelocidad/9.96;
}
(m = movies[idx = 40]).play();
m.speed(VelocidaddeRepoduccion);
while (m.width == 0) delay(100);
centralizeMovie();
if(VideoTerminado == true){
domenec_dretarafael = false;
VideoTerminado = false;
switch(Giro){
case 0:
m.stop();
break;
case 1:
m.stop();
break;
case 2:
m.stop();
Magatzem_DretaDomenec();
break;
}
}
}
void Magatzem_IzqMerce (){
35 ESEIAAT
Página 35
magatzem_izqmerce=true;
if(FloatVelocidad == null || FloatVelocidad <= 0 ){
VelocidaddeRepoduccion = 0.1;
}
else{
VelocidaddeRepoduccion = FloatVelocidad/10.377;
}
(m = movies[idx = 29]).play();
m.speed(VelocidaddeRepoduccion);
while (m.width == 0) delay(100);
centralizeMovie();
if(VideoTerminado==true){
magatzem_izqmerce=false;
VideoTerminado=false;
switch(Giro){
case 0:
m.stop();
break;
case 1:
m.stop();
Domenec_IzqMagatzem();
break;
case 2:
m.stop();
}
}
}
void Magatzem_DretaMerce(){
magatzem_dretamerce=true;
if(FloatVelocidad == null || FloatVelocidad <= 0 ){
VelocidaddeRepoduccion = 0.1;
}
else{
VelocidaddeRepoduccion = FloatVelocidad/10.377;
}
(m = movies[idx = 30]).play();
m.speed(VelocidaddeRepoduccion);
while (m.width == 0) delay(100);
centralizeMovie();
if(VideoTerminado == true){
magatzem_dretamerce = false;
VideoTerminado = false;
switch(Giro){
36 ESEIAAT
Página 36
case 0:
m.stop();
break;
case 1:
m.stop();
break;
case 2:
m.stop();
Carme_DretaMagatzem();
break;
}
}
}
void DomenecRecta(){// Domenec Recta cap a Pere
domenecrecta=true;
if(FloatVelocidad == null || FloatVelocidad <= 0 ){
VelocidaddeRepoduccion = 0.1;
}
else{
VelocidaddeRepoduccion = FloatVelocidad/9.95;
}
(m = movies[idx = 52]).play();
m.speed(VelocidaddeRepoduccion);
while (m.width == 0) delay(100);
centralizeMovie();
if(VideoTerminado == true){
domenecrecta = false;
VideoTerminado = false;
switch(Giro){
case 0:
m.stop();
break;
case 1:
m.stop();
SantPere_IzqDomenec();
break;
case 2:
m.stop();
break;
}
}
}
void SantRafael_IzqDomenec(){
santrafael_izqdomenec=true;
37 ESEIAAT
Página 37
if(FloatVelocidad == null || FloatVelocidad <= 0 ){
VelocidaddeRepoduccion = 0.1;
}
else{
VelocidaddeRepoduccion = FloatVelocidad/11.47;
}
(m = movies[idx = 46]).play();
m.speed(VelocidaddeRepoduccion);
while (m.width == 0) delay(100);
centralizeMovie();
if(VideoTerminado == true){
santrafael_izqdomenec = false;
VideoTerminado=false;
switch(Giro){
case 0:
m.stop();
SantRafael_RectacapaCarme();
break;
case 1:
m.stop();
Merce_IzqRafael();
break;
case 2:
m.stop();
Merce_DretaRafael();
break;
}
}
}
void SantPere_IzqDomenec(){
santpere_izqdomenec=true;
if(FloatVelocidad == null || FloatVelocidad <= 0 ){
VelocidaddeRepoduccion = 0.1;
}
else{
VelocidaddeRepoduccion = FloatVelocidad/11.225;
}
(m = movies[idx = 13]).play();
m.speed(VelocidaddeRepoduccion);
while (m.width == 0) delay(100);
centralizeMovie();
if(VideoTerminado == true){
santpere_izqdomenec = false;
38 ESEIAAT
Página 38
VideoTerminado=false;
switch(Giro){
case 0:
m.stop();
SantPere_RectacapaCarme();
break;
case 1:
m.stop();
Merce_IzqPere();
break;
case 2:
m.stop();
break;
}
}
}
void SantPere_IzqMerce(){
santpere_izqmerce=true;
if(FloatVelocidad == null || FloatVelocidad <= 0 ){
VelocidaddeRepoduccion = 0.1;
}
else{
VelocidaddeRepoduccion = FloatVelocidad/9.89;
}
(m = movies[idx = 42]).play();
m.speed(VelocidaddeRepoduccion);
while (m.width == 0) delay(100);
centralizeMovie();
if(VideoTerminado==true){
santpere_izqmerce=false;
VideoTerminado=false;
switch(Giro){
case 0:
m.stop();
break;
case 1:
m.stop();
Carme_IzqPere();
break;
case 2:
m.stop();
break;
}
}
39 ESEIAAT
Página 39
}
void SantPere_DretaMerce(){
santpere_dretamerce=true;
if(FloatVelocidad == null || FloatVelocidad <= 0 ){
VelocidaddeRepoduccion = 0.1;
}
else{
VelocidaddeRepoduccion = FloatVelocidad/10.6;
}
(m = movies[idx = 43]).play();
m.speed(VelocidaddeRepoduccion);
while (m.width == 0) delay(100);
centralizeMovie();
if(VideoTerminado==true){
santpere_dretamerce=false;
VideoTerminado=false;
switch(Giro){
case 0:
m.stop();
break;
case 1:
m.stop();
break;
case 2:
m.stop();
Domenec_DretaPere();
break;
}
}
}
void Carme_DretaMagatzem(){
carme_dretamagatzem=true;
if(FloatVelocidad == null || FloatVelocidad <= 0 ){
VelocidaddeRepoduccion = 0.1;
}
else{
VelocidaddeRepoduccion = FloatVelocidad/8.77;
}
(m = movies[idx = 1]).play();
m.speed(VelocidaddeRepoduccion);
while (m.width == 0) delay(100);
centralizeMovie();
if(VideoTerminado==true){
40 ESEIAAT
Página 40
carme_dretamagatzem=false;
VideoTerminado=false;
switch(Giro){
case 0:
m.stop();
Carme_RectacapaPere();
break;
case 1:
m.stop();
break;
case 2:
m.stop();
Rafael_DretaCarme();
break;
}
}
}
void SantRafael_RectacapaCarme(){
santRafael_RectacapaCarme=true;
if(FloatVelocidad == null || FloatVelocidad <= 0 ){
VelocidaddeRepoduccion = 0.1;
}
else{
VelocidaddeRepoduccion = FloatVelocidad/11.93;
}
(m = movies[idx = 50]).play();
m.speed(VelocidaddeRepoduccion);
while (m.width == 0) delay(100);
centralizeMovie();
if(VideoTerminado == true){
santRafael_RectacapaCarme = false;
VideoTerminado = false;
switch(Giro){
case 0:
m.stop();
break;
case 1:
m.stop();
Carme_IzqRafael();
break;
case 2:
m.stop();
Carme_DretaRafael();
41 ESEIAAT
Página 41
break;
}
}
}
void Carme_DretaRafael(){
carme_dretarafael=true;
if(FloatVelocidad == null || FloatVelocidad <= 0 ){
VelocidaddeRepoduccion = 0.1;
}
else{
VelocidaddeRepoduccion = FloatVelocidad/8.23;
}
(m = movies[idx = 45]).play();
m.speed(VelocidaddeRepoduccion);
while (m.width == 0) delay(100);
centralizeMovie();
if(VideoTerminado == true){
carme_dretarafael = false;
VideoTerminado = false;
switch(Giro){
case 0:
m.stop();
break;
case 1:
m.stop();
break;
case 2:
m.stop();
SantPere_DretaCarme();
break;
}
}
}
void SantRafael_DretaDomenec(){
santrafael_dretadomenec=true;
if(FloatVelocidad == null || FloatVelocidad <= 0 ){
VelocidaddeRepoduccion = 0.1;
}
else{
VelocidaddeRepoduccion = FloatVelocidad/12.19;
}
(m = movies[idx = 49]).play();
42 ESEIAAT
Página 42
m.speed(VelocidaddeRepoduccion);
while (m.width == 0) delay(100);
centralizeMovie();
if(VideoTerminado == true){
santrafael_dretadomenec = false;
VideoTerminado = false;
switch(Giro){
case 0:
m.stop();
SantRafael_RectacapaCarme();
break;
case 1:
m.stop();
Merce_IzqRafael();
case 2:
m.stop();
Merce_DretaRafael();
}
}
}
void SantPere_RectacapaCarme(){
santpere_rectacapacarme=true;
if(FloatVelocidad == null || FloatVelocidad <= 0 ){
VelocidaddeRepoduccion = 0.1;
}
else{
VelocidaddeRepoduccion = FloatVelocidad/9.3;
}
(m = movies[idx = 14]).play();
m.speed(VelocidaddeRepoduccion);
while (m.width == 0) delay(100);
centralizeMovie();
if(VideoTerminado==true){
santpere_rectacapacarme=false;
VideoTerminado=false;
switch(Giro){
case 0:
m.stop();
break;
case 1:
m.stop();
Carme_IzqPere();
break;
43 ESEIAAT
Página 43
case 2:
m.stop();
break;
}
}
}
void Merce_IzqPere(){
merce_izqpere=true;
if(FloatVelocidad == null || FloatVelocidad <= 0 ){
VelocidaddeRepoduccion = 0.1;
}
else{
VelocidaddeRepoduccion = FloatVelocidad/9.76;
}
(m = movies[idx = 22]).play();
m.speed(VelocidaddeRepoduccion);
while (m.width == 0) delay(100);
centralizeMovie();
if(VideoTerminado==true){
merce_izqpere=false;
VideoTerminado=false;
switch(Giro){
case 0:
m.stop();
Merce_RectaRambla();
break;
case 1:
m.stop();
SantRafael_IzqMerce();
break;
case 2:
m.stop();
SantRafael_DretaMerce();
break;
}
}
}
void Merce_RectaRambla(){
merce_rectarambla=true;
if(FloatVelocidad == null || FloatVelocidad <= 0 ){
VelocidaddeRepoduccion = 0.1;
}
44 ESEIAAT
Página 44
else{
VelocidaddeRepoduccion = FloatVelocidad/11.73;
}
(m = movies[idx = 28]).play();
m.speed(VelocidaddeRepoduccion);
while (m.width == 0) delay(100);
centralizeMovie();
if(VideoTerminado==true){
merce_rectarambla=false;
VideoTerminado=false;
switch(Giro){
case 0:
m.stop();
break;
case 1:
m.stop();
Magatzem_IzqMerce();
case 2:
m.stop();
Magatzem_DretaMerce();
}
}
}
void SantRafael_IzqMerce(){
santrafael_izqmerce=true;
if(FloatVelocidad == null || FloatVelocidad <= 0 ){
VelocidaddeRepoduccion = 0.1;
}
else{
VelocidaddeRepoduccion = FloatVelocidad/10.84;
}
(m = movies[idx = 26]).play();
m.speed(VelocidaddeRepoduccion);
while (m.width == 0) delay(100);
centralizeMovie();
if(VideoTerminado==true){
santrafael_izqmerce=false;
VideoTerminado=false;
switch(Giro){
case 0:
m.stop();
45 ESEIAAT
Página 45
break;
case 1:
m.stop();
Carme_IzqRafael();
break;
case 2:
m.stop();
Carme_DretaRafael();
break;
}
}
}
void SantRafael_DretaMerce(){
santrafael_dretamerce=true;
if(FloatVelocidad == null || FloatVelocidad <= 0 ){
VelocidaddeRepoduccion = 0.1;
}
else{
VelocidaddeRepoduccion = FloatVelocidad/10.84;
}
(m = movies[idx = 27]).play();
VelocidaddeRepoduccion=FloatVelocidad/10.84;
m.speed(VelocidaddeRepoduccion);
while (m.width == 0) delay(100);
centralizeMovie();
if(VideoTerminado==true){
santrafael_dretamerce=false;
VideoTerminado=false;
switch(Giro){
case 0:
m.stop();
break;
case 1:
m.stop();
Carme_IzqRafael();
break;
case 2:
m.stop();
Carme_DretaRafael();
break;
}
}
}
46 ESEIAAT
Página 46
void Domenec_DretaPere(){
domenec_dretapera=true;
if(FloatVelocidad == null || FloatVelocidad <= 0 ){
VelocidaddeRepoduccion = 0.1;
}
else{
VelocidaddeRepoduccion = FloatVelocidad/11.27;
}
(m = movies[idx = 34]).play();
m.speed(VelocidaddeRepoduccion);
while (m.width == 0) delay(100);
centralizeMovie();
if(VideoTerminado==true){
domenec_dretapera=false;
VideoTerminado=false;
switch(Giro){
case 0:
m.stop();
Domenec_RectaRambla();
break;
case 1:
m.stop();
break;
case 2:
m.stop();
SantRafael_DretaDomenec();
}
}
}
void Carme_RectacapaPere(){
carme_rectacapapere=true;
if(FloatVelocidad == null || FloatVelocidad <= 0 ){
VelocidaddeRepoduccion = 0.1;
}
else{
VelocidaddeRepoduccion = FloatVelocidad/10.25;
}
(m = movies[idx = 48]).play();
m.speed(VelocidaddeRepoduccion);
while (m.width == 0) delay(100);
centralizeMovie();
if(VideoTerminado==true){
47 ESEIAAT
Página 47
carme_rectacapapere=false;
VideoTerminado=false;
switch(Giro){
case 0:
m.stop();
break;
case 1:
m.stop();
break;
case 2:
m.stop();
SantPere_DretaCarme();
break;
}
}
}
void SantPere_DretaCarme(){
santpere_dretacarme=true;
if(FloatVelocidad == null || FloatVelocidad <= 0 ){
VelocidaddeRepoduccion = 0.1;
}
else{
VelocidaddeRepoduccion = FloatVelocidad/8.33;
}
(m = movies[idx = 32]).play();
m.speed(VelocidaddeRepoduccion);
while (m.width == 0) delay(100);
centralizeMovie();
if(VideoTerminado==true){
santpere_dretacarme=false;
VideoTerminado=false;
switch(Giro){
case 0:
m.stop();
SantPere_rectacapaDomenec();
break;
case 1:
m.stop();
break;
case 2:
m.stop();
Merce_DretaPere();
48 ESEIAAT
Página 48
break;
}
}
}
void Merce_DretaPere(){
merce_dretapere=true;
if(FloatVelocidad == null || FloatVelocidad <= 0 ){
VelocidaddeRepoduccion = 0.1;
}
else{
VelocidaddeRepoduccion = FloatVelocidad/9.18;
}
(m = movies[idx = 53]).play();
m.speed(VelocidaddeRepoduccion);
while (m.width == 0) delay(100);
centralizeMovie();
if(VideoTerminado==true){
merce_dretapere=false;
VideoTerminado=false;
switch(Giro){
case 0:
m.stop();
Merce_RectaRambla();
break;
case 1:
m.stop();
SantRafael_IzqMerce();
break;
case 2:
m.stop();
SantRafael_DretaMerce();
break;
}
}
}
void SantPere_rectacapaDomenec(){
santpere_rectacapadomenec=true;
if(FloatVelocidad == null || FloatVelocidad <= 0 ){
VelocidaddeRepoduccion = 0.1;
}
else{
49 ESEIAAT
Página 49
VelocidaddeRepoduccion = FloatVelocidad/11.225;
}
(m = movies[idx = 51]).play();
m.speed(VelocidaddeRepoduccion);
while (m.width == 0) delay(100);
centralizeMovie();
if(VideoTerminado==true){
santpere_rectacapadomenec=false;
VideoTerminado=false;
switch(Giro){
case 0:
m.stop();
break;
case 1:
m.stop();
break;
case 2:
m.stop();
Domenec_DretaPera();
break;
}
}
}
void Domenec_RectaRambla(){
domenec_rectarambla=true;
if(FloatVelocidad == null || FloatVelocidad <= 0 ){
VelocidaddeRepoduccion = 0.1;
}
else{
VelocidaddeRepoduccion = FloatVelocidad/9.379;
}
(m = movies[idx = 36]).play();
m.speed(VelocidaddeRepoduccion);
while (m.width == 0) delay(100);
centralizeMovie();
if(VideoTerminado==true){
domenec_rectarambla=false;
VideoTerminado=false;
switch(Giro){
case 0:
m.stop();
break;
50 ESEIAAT
Página 50
case 1:
m.stop();
break;
case 2:
m.stop();
Magatzem_DretaDomenec();
break;
}
}
}
void Rafael_DretaCarme(){
rafael_dretacarme=true;
if(FloatVelocidad == null || FloatVelocidad <= 0 ){
VelocidaddeRepoduccion = 0.1;
}
else{
VelocidaddeRepoduccion = FloatVelocidad/11.916;
}
(m = movies[idx = 6]).play();
m.speed(VelocidaddeRepoduccion);
while (m.width == 0) delay(100);
centralizeMovie();
if(VideoTerminado==true){
rafael_dretacarme=false;
VideoTerminado=false;
switch(Giro){
case 0:
m.stop();
SantRafael_RectacapaDomenec();
break;
case 1:
m.stop();
Merce_IzqRafael();
break;
case 2:
m.stop();
Merce_DretaRafael();
}
}
}
51 ESEIAAT
Página 51
void actionPerformed(GUIEvent e){// se llama a este método cada vez que un
componente GUI genera un evento, nos servirá para detectar si se ha pulsado el
botón b1.
if(e.getSource()==b1){// en caso de que el evento detectado corresponda a la
pulsación del botón b1
screen= screen+1;// se incrementa en uno esta variable para cambiar la
informacón que sale por el recuadro creado j2
myPort.write('1');// envías por puerto serie el valor de uno para así poder
combiar también la información que sale por el lcd
if(screen == 3){// en el caso de que screen = 3
screen=1;// reseteamos a 1 el valor de la variable screen
}
}
}
void drawRect(PGraphics pg){// con este método creas el rectángulo a partir de la
variable PGraphics j2
pg.beginDraw();//Establece las propiedades predeterminadas para un objeto
PGraphics. Debe llamarse antes de que algo se dibuje en el objeto.
pg.clear();// limpias la información que sale por pantalla
pg.stroke(128);//Establece el color utilizado para dibujar líneas y bordes
alrededor de las formas. Este color se especifica en términos del color RGB o HSB
según el modo de color actual (). El espacio de color predeterminado es RGB, con
cada valor en el rango de 0
pg.strokeWeight(10);//Establece la anchura que tendrá el borde del rectángulo
pg.fill(128, 55, 0, 128);// Estableces el color del rectángulo y su opacidad,
los tres primeros parámetros son para indicar el color según RGB y el útilmo
parametro para la opacidad.
pg.rect(0, 0, pg.width, pg.height);// indicas el tamaño del rectangulo
if(screen == 1){//en caso de que el valor de la variable screen sea 1
pg.textFont(Texto); // indicas el tipo de letra que se usara para escribir
la información
pg.fill(0,102,0);// con este método controlas el color de las letras en
RGB.
pg.textAlign(CENTER);// alineas el texto en el centro del recuadro
pg.text("Velocidad = "+FloatVelocidad+"Km/h",pg.width/2,pg.height/2.25);//
escribes en el recuadro la información que quieres mostrar así como donde estará
situado el texto en el rectángulo
if(FloatDistancia<=999){
pg.text("Distancia = "+FloatDistancia+"m",pg.width/2,pg.height/1.5);
}
else{
pg.text("Distancia =
"+FloatDistancia+"Km",pg.width/2,pg.height/1.5);
}
}
if(screen == 2){
52 ESEIAAT
Página 52
pg.textFont(Texto);
pg.fill(0,102,0);
pg.textAlign(CENTER);
pg.text("Vel.Media= "+ FloatvelMedia+"Km/h",pg.width/2,pg.height/2.25);
if(TiempoTranscurridoSeg<=60){
pg.text("Tiempo transcurrido = "+
TiempoTranscurridoSeg+"s",pg.width/2,pg.height/1.5);
}
else pg.text("Tiempo transcurrido = "+
TiempoTranscurridoMin+"min",pg.width/2,pg.height/1.5);
}
pg.endDraw();// Finalizes the rendering of a PGraphics object so that it can be
shown on screen. Editar
}
void movieEvent(Movie m) {// Evento que se ejecuta cada vez que se reproduce un
video
m.read();// lee el video que se quiere ejecutar
redraw();// Esta función permite que el programa actualice la ventana de
visualización sólo cuando sea necesario,
}
void centralizeMovie() {// método para hacer que el video salga centrado respecto
a la ventana
x = width - m.width >> 1;
y = height - m.height >> 1;
}