Autor: Patricio Aros Erices.
Competecia: Desarrollo de software (Nivel 1).
Descripción de la actividad
Contexto:
Usted es el encargado de construir un robot de competencia para el nuevo juego del verano “Dribbler”.
Reglas del juego:
- La idea de la competencia es que un robot autónomo encuentre la mayor cantidad de “zonas de puntaje” (círculo negro) en la pista, sin chocar con los obstáculos presentes (paredes, bloques, etc), ya que cuando pase esto, termina el juego.
- Cuando el robot vaya a chocar, el jugador debe indicarle que existe peligro de choque, a través de una señal audible (grito, pitazo, aplauso, etc), de modo que el robot no colisione.
- Cada vez que el robot encuentra una zona de puntaje (círculo negro), acumula puntos, pero también aumenta su velocidad.
- Gana el jugador que logre el mayor puntaje, antes de chocar con algún obstáculo.
Especificaciones:
- El robot debe iniciar su recorrido con una potencia de 20 e iniciar un timer en 0.
- Mientras el robot busca zonas de puntaje se emitirá constantemente una música ad-hoc.
- Cuando detecte una zona de puntaje (círculo negro), el robot:
- Emitirá una música de anotación de puntos
- Registrará el puntaje obtenido en la posición correspondiente dentro de un arreglo (array)
- Aumenta la potencia de movimiento en 10, hasta el máximo de 100.
- Girará aleatoriamente sobre su eje
- Reiniciará el timer a 0.
- Seguirá su rumbo con la nueva velocidad.
- Volverá a su música de recorrido.
- El puntaje obtenido por el robot, estará dado por la siguiente función:
P = - 5*t + 50 si t <= 10
P = 0 si t > 10
Donde:
P= Puntaje.
t = Intervalo de tiempo (en segundos) para encontrar la zona de puntaje.
- Si el robot detecta una señal audible de 80 db (ud. puede ajustarla) girará en un ángulo apropiado (uds. lo definen) de modo de esquivar un obstáculo, o bien corregir su recorrido.
- Cuando el robot choque contra algún obstáculo se detendrá, finalizará todas las tareas y mostrará en el visor cada uno de los puntajes guardados en el arreglo y la suma total de los mismos.
NOTAS:
- Los obstáculos serán las paredes de la mesa de competición, más algunos obstáculos dentro de la mesa (por definir).
- Se sugiere que consigan un pito para dar la señal de advertencia al robot.
- Para construir su robot, deben utilizar la rueda de mayor diámetro del kit, conectada directamente al motor.-
Ejemplo de como es un array |
En resumen la actividad era mas o menos asi:
CLICK AQUI PARA TAMAÑO ORIGINAL |
La solución, como en el primer semestre, comenzo de un Pseudocodigo simple, luego lo arreglamos para que se asemejara un poco al codigo de NXC y poder tener un mejor trabajo. Lo que tenemos es asi:
PSEUDOCODIGO:
Se declaran las variables:
#define negro 30 //umbral de luz
#define ruido 60 //umbral de sonido
mutex semaforo; //
int puntos=0;
int tiempo=0;
int puntaje[];
int i=0;
int anterior=0;
int actual=0;
int P=0;
int potencia = 20;
int t =0;
int Total=0;
int k=0;
subrutina calculo (){
actual=CurrentTick(); //Tiempo actual desde que se inicia el programa
t=(actual-anterior)/1000;
si ( el tiempo es <= 10 ) {
puntaje aumenta }
sino { puntaje = 0}
guardamos puntaje en un arreglo }
//Subrutina que muestra el total del puntaje al terminar el programa.
sub MostrarTotal(){
Limpia la pantalla();
para(cuando el puntaje aumente){
mostrar puntaje en pantalla ;
}
//Melodia del programa
task Melodia()
{
Mientras (Sea verdadero)
{ Melodía
}
}
Tarea AntesChoke(){
mientras(verdadero){
si (Sensor detecta sonido >=60){
- Gira en 180°
}
}
}
Tarea Choque ()
{
mientras (sea verdadero)
{
Avanzar ;
Si (detecta pared)
{
Se detienen los procesos () ;
Muestra en pantalla
Durante 10 segundos
}
}
}
sub Cambio_potencia(){
aumenta la potencia en 10;
si (potencia es >= 100 ){
potencia se mantiene en 100;}
PlayTone(1000,90); } //emite sonido de puntaje(al encontrar el punto negro)
Tarea Circulo()
{ Mientras sea(verdaderos)
{
Si (detecta negro){
{
Cambio_potencia();
calculo();
}
} }
}
task main ()
{
anterior=guarda el tiempo desde que se inicio el programa
se llaman las tareas para ejecutarlas(Melodia,AntesCh oke, Choque, Circulo) ;
activar sensor touch;
activar sensor luz;
activar sensor sonido;
}
CODIGO FINAL NXC
5.4) Código Fuente:
/* @author: EQUIPO "NEXUS"
@date: 16/08/2011
Integrantes y roles:
Jefe de Grupo : Patricio Aros
Secretario : Lidia Baschmann
Productor Multimedia : Nicole Rodríguez
Staff de Apoyo : Omar Becerra */
// Se declaran las variables:
#define negro 30 //umbral de luz
#define ruido 50 //umbral de sonido
mutex semaforo; //
int tiempo=0;
int puntaje[];
int i=0;
int anterior=0;
int actual=0;
int P=0;
int potencia = 20;
int t =0;
int acumulado=0; //velocidad de ejecucion de la melodia
int Total=0;
int k=0;
sub calculo(){
actual=CurrentTick(); //Tiempo actual desde que se inicia el programa
t=(actual-anterior)/1000;
anterior=actual;
//Si el tiempo de ir de un punto hacia otro es igual o menor a 10 segundos suma puntos.
if(t<=10){
P = (-5*t + 50);} //Formula para obtener el puntaje
// De lo contrario no aumenta puntaje.
else{ P=0;}
puntaje[i]= P; //Guardamos el valor de P (Puntaje) en un arreglo.
i++;
acumulado =P+Total;
NumOut(30,20,Acumulado);
}
//Subrutina que muestra el total del puntaje al terminar el programa.
sub MostrarTotal(){
ClearScreen(); //Limpiar la pantalla
for(k=0; k<i;k++){ // se muestra el puntaje de forma ordenanda en la pantalla
NumOut(50,40-k*5,puntaje[k]);
Total=Total+puntaje[k];
}
NumOut(30,20, Total); //imprime el total del puntaje
}
//Melodia del programa
task Melodia()
{
while (true)
{
PlayTone(330,200);
Wait(240);
PlayTone(440,200);
Wait(240);
PlayTone(494,200);
Wait(240);
PlayTone(554,300);
Wait(360);
PlayTone(587,100);
Wait(120);
PlayTone(554,400);
Wait(480);
Wait(240);
PlayTone(440,200);
Wait(240);
PlayTone(440,200);
Wait(240);
PlayTone(330,200);
Wait(240);
PlayTone(494,200);
Wait(240);
PlayTone(440,200);
Wait(240);
PlayTone(415,200);
Wait(240);
PlayTone(440,200);
Wait(240);
}
}
task AntesChoke(){ // tarea antes choke
while(true){
if(SENSOR_2>=60){ // si el robot detecta un ruido mayor a 60 desibeles
Acquire(semaforo);
OnRev(OUT_A,75); // girar en 180 grados;
OnFwd(OUT_C, 75);
Wait(500);
Release(semaforo);
}
}
}
task Choque ()
{
while(true)
{
Acquire(semaforo);
OnFwd(OUT_AC, potencia); //Avanzar durante todo el programa
Release(semaforo);
if (SENSOR_1 == 1) // si el sensor de toque es activado
{
Acquire(semaforo);
Off(OUT_AC); // Apagar motores
MostrarTotal(); // Mostrar en pantalla llamando a la sub rutina
Wait(10000); // esperar 10 segundos
Release(semaforo);
StopAllTasks() ; // Detener toda funcionalidad del robot
}
}
}
sub Cambio_potencia(){
potencia = potencia+10; // Aumenta la pontencia con un hasta limite de 100
if (potencia >= 100){
potencia=100;}
PlayTone(1000,90); }
task Circulo()
{ anterior = CurrentTick();
while(true)
{
if(SENSOR_3<=negro){ //si el robot tetecta el color negro
{
Cambio_potencia(); //aumenta la potencia llamando a la subrutina
calculo(); // Hace el calculo de puntaje
Acquire(semaforo);
OnRev(OUT_A, potencia); //hace un giro en un angulo aleatorio
Wait(Random(500));
Release(semaforo);
}
} }
} //tarea
task main () // comienzan todas las intrucciones del robot
{
anterior=CurrentTick();
Precedes(Melodia,AntesChoke, Choque, Circulo);
SetSensorTouch(IN_1); //Tacto
SetSensorLight(IN_3); //LUz
SetSensorSound(IN_2); //Sonido
}
SI DESEA VER DE MANERA MAS ORDENADA EL CODIGO RECOMIENDO DAR CLICK AQUI
Dentro de todo la actividad la pudimos realizar, lo que nos complicó en gran medida a mi y mi grupo fueron los enredados calculos para llevar la cuenta de los puntajes y luego mostrarla por pantalla, pero logramos hacer la mayor parte del trabajo sin complicación alguna y con el apoyo de todos.
REFLEXION:
El gran aporte que nos dejo este proyecto fue aclararnos mucho el uso de los Arreglos(Arrays) los cuales como mensione anteriormente nos quitan grandes problemas en este y otros lenguajes al momento de realizar algunas operaciones concretas dentro de los programas lo bueno de NXC y varios otros lenguajes es que son similares y pueden complementarse, dejando en cada materia todo mas claro y mas entendible que si lo pasaramos tan solo en una materia.
0 comentarios:
Publicar un comentario