Programación Básica con “NQC” – Solución Guía de Ejercicios 1 Ruteos: 1.1 i 6 6 6 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 j 2 2 5 5 5 8 8 8 8 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 k 9 9 9 3 3 3 1 1 3 3 5 5 7 7 9 9 11 11 13 13 15 15 17 17 i 1 2 4 8 16 16 1 8 8 2 9 9 0 7 j 1024 256 64 16 4 8 8 8 16 16 16 32 32 32 i 16 16 16 16 17 17 17 18 j 4 4 4 2 2 2 0 0 1.2 1.3 k 8 10 10 10 12 12 12 Programación Básica con “NQC” – Solución Guía de Ejercicios Pedro F. Toledo – Patricio A. Castillo – [email protected] – 31/05/2006 18 0 18 -2 18 28 19 28 19 28 187 14 14 14 14 140 28 140 k 2 8 8 8 7 7 7 6 i 12 12 12 7 7 7 2 2 j 3 3 18 18 18 13 13 13 k 0 0 0 0 0 0 1 i 6 6 6 6 6 1 1 j 7 13 2 0 0 0 0 i 1 1 1 1 5 0 0 0 1 1 1 1 7 0 0 0 1 1 1 1 9 0 0 0 1 1 1 1 11 b 3 3 3 2 2 2 3 3 4 4 4 3 3 3 4 4 5 5 5 4 4 4 5 5 6 6 6 5 5 m 9 9 3 3 3 3 3 -3 -2 -2 4 4 4 4 4 -4 -3 -3 5 5 5 5 5 -5 -4 -4 6 6 6 1.4 1.5 1.6 h 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 -1 -1 -1 -1 Programación Básica con “NQC” – Solución Guía de Ejercicios Pedro F. Toledo – Patricio A. Castillo – [email protected] – 31/05/2006 -1 -1 -1 -1 -2 3 0 0 0 1 1 1 5 6 6 7 7 7 6 6 -6 -5 -5 -5 1.7 p 1 8 7 10 10 10 10 2 2 9 8 11 11 11 11 3 3 3 3 3 q 1 1 1 1 14 10 11 11 2 2 2 2 15 11 12 0 13 9 10 3 1.8 a 1 0 0 0 0 0 0 1 1 1 2 2 2 3 b 2 2 1 1 1 8 8 8 8 8 8 8 8 8 c 3 3 3 1 1 1 1 1 1 1 1 1 1 1 y 0 0 3 3 3 9 9 9 9 12 z 0 0 0 6 6 6 18 18 18 18 1.9 x 0 1 1 1 2 2 2 3 2 2 Programación Básica con “NQC” – Solución Guía de Ejercicios Pedro F. Toledo – Patricio A. Castillo – [email protected] – 31/05/2006 2 1 1 1 10 10 0 0 12 12 12 12 7 7 7 28 9 9 9 23 23 2 2 14 Programas: Lo que aquí se presenta es solo una manera de posible solución, un problema se puede resolver con diferentes algoritmos obteniendo el mismo resultado deseado, por lo que si una solución propuesta no es como la que aparece en este documento, esto no significa que esa solución esté incorrecta. 1.10 Inicio Declaración de Sensores Sensor1<21 Motor A Off B con poder 6 Sensor1<41 Motor A Off B con poder 4 Sensor1<51 Motor A Off B con poder 2 Sensor1<61 A con poder 1 B con poder 1 Sensor1<81 A con poder 3 B con poder 1 A con poder 5 B con poder 1 task main(){ SetSensor(SENSOR_1,SENSOR_LIGHT); while(1){ if(SENSOR_1<21){ Off(OUT_A); OnFwd(OUT_B); SetPower(OUT_B,6); } else{ if(SENSOR_1<41){ Off(OUT_A); OnFwd (OUT_B); SetPower(OUT_B,4); } Programación Básica con “NQC” – Solución Guía de Ejercicios Pedro F. Toledo – Patricio A. Castillo – [email protected] – 31/05/2006 else{ if(SENSOR_1<51){ Off(OUT_A); OnFwd(OUT_B); SetPower(OUT_B,2); } else{ if(SENSOR_1<61){ OnFwd(OUT_A+OUT_B); SetPower(OUT_A+OUT_B,1); } else{ if(SENSOR_1<81){ OnFwd(OUT_A+OUT_B); SetPower(OUT_A,3); SetPower(OUT_B,1); } else{ OnFwd(OUT_A+OUT_B); SetPower(OUT_A,5); SetPower(OUT_B,1); } } } } } } } 1.11 Inicio Declaración de Sensores Espera z Sensor1==1 Sensor2==1 Sensor3==1 Enciende A, Apaga B y set 6 Enciende A, Apaga B y set 4 Sensor3==1 Enciende A, Apaga B y set 2 Enciende A, Apaga B y set 0 Sensor2==1 Sensor3==1 Enciende B, Apaga A y set 6 Enciende B, Apaga A y set 4 Sensor3==1 Enciende B, Apaga A y set 2 Enciende B, Apaga A y set 0 Programación Básica con “NQC” – Solución Guía de Ejercicios Pedro F. Toledo – Patricio A. Castillo – [email protected] – 31/05/2006 #define z 10 task main(){ SetSensor(SENSOR_1,SENSOR_TOUCH); SetSensor(SENSOR_2,SENSOR_TOUCH); SetSensor(SENSOR_1,SENSOR_TOUCH); while(1){ if(SENSOR_1==1){ if(SENSOR_2==1){ if(SENSOR_3==1){ Off(OUT_B); On(OUT_A); SetPower(OUT_A,6); } else{ Off(OUT_B); On(OUT_A); SetPower(OUT_A,4); } } else{ if(SENSOR_3==1){ Off(OUT_B); On(OUT_A); SetPower(OUT_A,2); } else{ Off(OUT_B); On(OUT_A); SetPower(OUT_A,0); } } } else{ if(SENSOR_2==1){ if(SENSOR_3==1){ Off(OUT_A); On(OUT_B); SetPower(OUT_B,6); } else{ Off(OUT_A); On(OUT_B); SetPower(OUT_B,4); } } else{ if(SENSOR_3==1){ Off(OUT_A); On(OUT_B); SetPower(OUT_B,2); } else{ Off(OUT_A); On(OUT_B); SetPower(OUT_B,0); } } } Wait(z); } } Programación Básica con “NQC” – Solución Guía de Ejercicios Pedro F. Toledo – Patricio A. Castillo – [email protected] – 31/05/2006 1.12 Inicio Declaración de Sensores Wait(SENSOR_3) PlayTone(440,5) Wait(5) task main(){ SetSensor(SENSOR_3,SENSOR_DISTANCE); while(1){ Wait(SENSOR_3); PlayTone(440,5); Wait(5); } } 1.13 Derecha Izquierda Recto Dirección A->Fwd C->Rev Dirección A->Rev C->Fwd Dirección C->Fwd A->Fwd Encender A y C Encender A y C Encender A y C Inicio Esperar td Esperar ti Esperar tl Apagar A y C Apagar A y C Apagar A y C Fin Fin Fin Secuencia de subrutinas Fin #define td 50 #define ti 50 #define tl 100 sub derecha(){ Fwd(OUT_A); Rev(OUT_C); OnFor(OUT_A+OUT_C,td); } sub izquierda(){ Programación Básica con “NQC” – Solución Guía de Ejercicios Pedro F. Toledo – Patricio A. Castillo – [email protected] – 31/05/2006 Rev(OUT_A); Fwd(OUT_C); OnFor(OUT_A+OUT_C,ti); } sub recto(){ Fwd(OUT_A); Fwd(OUT_C); OnFor(OUT_A+OUT_C,tl); } task main(){ recto(); recto(); recto(); recto(); recto(); izquierda(); recto(); izquierda(); derecha(); recto(); recto(); izquierda(); derecha(); recto(); izquierda(); recto(); recto(); recto(); } izquierda(); derecha(); recto(); recto(); recto(); izquierda(); derecha(); derecha(); recto(); derecha(); recto(); derecha(); derecha(); recto(); recto(); recto(); izquierda(); recto(); izquierda(); recto(); recto(); recto(); izquierda(); derecha(); 1.14 Inicio Inicio de Sensores y Motores Sensor1<umb Avanza Derecha Avanza Izquierda #define umb 50 task main(){ SetSensor(SENSOR_1,SENSOR_LIGHT); Fwd(OUT_A+OUT_C); while(1){ if(SENSOR_1<umb){ Off(OUT_C); On(OUT_A); } else{ Off(OUT_C); On(OUT_A); } } } #define umb 50 task main(){ SetSensor(SENSOR_1,SENSOR_LIGHT); Fwd(OUT_A+OUT_C); while(1){ if(SENSOR_1<umb){ derecha(); } else{ izquierda(); } } Programación Básica con “NQC” – Solución Guía de Ejercicios Pedro F. Toledo – Patricio A. Castillo – [email protected] – 31/05/2006 } sub derecha(){ Off(OUT_C); On(OUT_A); } sub izquierda(){ Off(OUT_A); On(OUT_C); } 1.15 Inicio Sonidos Dec. de Sensores, m y n =0 Espera z m=n m=n Sensor1==1 Sensor2==1 Sensor3==1 Enciende A, n=1, Apaga B y set 6, Enciende A, n=2, Apaga B y set 4 Sensor3==1 Enciende A, n=3, Apaga B y set 2 Enciende A, n=4, Apaga B y set 0 Sensor2==1 Sensor3==1 Enciende B, n=5, Apaga A y set 6 Enciende B, n=6, Apaga A y set 4 Sensor3==1 Enciende B, n=7, Apaga A y set 2 Enciende B, n=8, Apaga A y set 0 #define z 10 int m=0; int n=0; task main(){ SetSensor(SENSOR_1,SENSOR_TOUCH); SetSensor(SENSOR_2,SENSOR_TOUCH); SetSensor(SENSOR_1,SENSOR_TOUCH); while(1){ m=n; if(SENSOR_1==1){ if(SENSOR_2==1){ if(SENSOR_3==1){ Off(OUT_B); On(OUT_A); SetPower(OUT_A,6); n=1; } else{ Programación Básica con “NQC” – Solución Guía de Ejercicios Pedro F. Toledo – Patricio A. Castillo – [email protected] – 31/05/2006 Off(OUT_B); On(OUT_A); SetPower(OUT_A,4); n=2; } } else{ if(SENSOR_3==1){ Off(OUT_B); On(OUT_A); SetPower(OUT_A,2); n=3; } else{ Off(OUT_B); On(OUT_A); SetPower(OUT_A,0); n=4; } } } else{ if(SENSOR_2==1){ if(SENSOR_3==1){ Off(OUT_A); On(OUT_B); SetPower(OUT_B,6); n=5; } else{ Off(OUT_A); On(OUT_B); SetPower(OUT_B,4); n=6; } } else{ if(SENSOR_3==1){ Off(OUT_A); On(OUT_B); SetPower(OUT_B,2); n=7; } else{ Off(OUT_A); On(OUT_B); SetPower(OUT_B,0); n=8; } } } if(n==m){ PlayTone(440,10); Wait(15); PlayTone(880,10); Wait(15); PlayTone(1760,10); Wait(10); } Wait(z); } } 1.16 #define x1 36 //se definen las ubicaciones de las piezas #define x2 64 task main(){ SetSensor(SENSOR_1,SENSOR_TOUCH); //los sensores son de tipo booleano SetSensor(SENSOR_2,SENSOR_TOUCH); int posicion = 11; //se indica la posicion inicial int h,v; h=x1%10-posicion%10; //se encuentra la diferencia de unidades, que corresponde a la distancia en columnas while(h!=0){ OnRev(OUT_A); //se mueve hacia la derecha Programación Básica con “NQC” – Solución Guía de Ejercicios Pedro F. Toledo – Patricio A. Castillo – [email protected] – 31/05/2006 if(SENSOR_1){ h-=h; //se descuentan las columnas que ha recorrido posicion+=1; //se actualiza la posicion Wait(10); //se esperan 0.1 segundos para evitar repetir los datos de entrada } } Off(OUT_A); //se deja de mover horizontalmente cuando completa su recorrido v=x1/10-posicion/10; //se encuentra la diferencia de decenas, que corresponde a la distancia en filas while(v!=0){ OnFwd(OUT_B); //se mueve hacia abajo if(SENSOR_2){ v-=v; //se descuentan las filas que ha recorrido posicion+=10; //se actualiza la posicion Wait(10); //se esperan 0.1 segundos para evitar repetir los datos de entrada } } Off(OUT_B); //se deja de mover verticalmente cuando completa su recorrido if(posicion==x1){ //se verifica que la posición sea la indicada OnRev(OUT_C); //se recoje la pieza Wait(200); }else{ return; //si la navegacion ha fallado, el programa se deja de ejecutar } h=x2%10-posicion%10; //se encuentra la diferencia en unidades, que corresponde a la distancia en columnas while(h!=0){ if(h>0){ OnRev(OUT_A); //si la diferencia es positiva avanza a la derecha }else{ OnFwd(OUT_A); //si la diferencia es negativa retrocede a la izquiera } if(SENSOR_1){ if(h>0){ h-=h; //se descuentan las columnas que ha recorrido posicion+=1; //se actualiza la posicion }else{ h+=h; //se descuentan las columnas que ha recorrido posicion-=1; //se actualiza la posicion } Wait(10); //se esperan 0.1 segundos para evitar repetir los datos de entrada } } Off(OUT_A); //se deja de mover horizontalmente cuando completa su recorrido v=x2/10-posicion/10;//se encuentra la diferencia en decenas, que corresponde a la distancia en filas while(v!=0){ if(v>0){ OnFwd(OUT_B);//si la diferencia es positiva se mueve hacia abajo }else{ OnRev(OUT_B);//si la diferencia es negativa se mueve hacia arriba } if(SENSOR_2){ if(v>0){ v-=v; //se descuentan las filas que ha recorrido posicion+=10; //se actualiza la posicion }else{ v+=v; //se descuentan las filas que ha recorrido posicion-=10; //se actualiza la posicion } Wait(10); //se esperan 0.1 segundos para evitar repetir los datos de entrada } } Programación Básica con “NQC” – Solución Guía de Ejercicios Pedro F. Toledo – Patricio A. Castillo – [email protected] – 31/05/2006 Off(OUT_B); recorrido //se deja de mover verticalmente cuando completa su if(posicion==x2){ //se verifica que la posición sea la indicada OnFwd(OUT_C); //se coloca la pieza Wait(200); }else{ return; //si la navegacion ha fallado, el programa se deja de ejecutar } h=posicion%10-1; //se encuentra la diferencia de unidades para regresar al origen while(h!=0){ OnFwd(OUT_A); //se mueve hacia la izquierda if(SENSOR_1){ h-=h; //se descuentan las columnas recorridas posicion-=1; //se actualiza la posicion Wait(10); //0.1 segundos de espera mientras pasa por la línea } } Off(OUT_A); //se detiene el motor al llegar a la primera columna v=posicion/10-1; // se encuentra la diferencia de decenas para regresar al origen while(v!=0){ OnRev(OUT_B); //se mueve hacia arriba if(SENSOR_2){ v-=v; //se descuentan las filas recorridas posicion-=10; //se actualiza la posicion Wait(10); //0.1 segundos de espera mientras pasa sobre la línea } } Off(OUT_B); //se detiene el motor al llegar al origen } Programación Básica con “NQC” – Solución Guía de Ejercicios Pedro F. Toledo – Patricio A. Castillo – [email protected] – 31/05/2006