Actividad de ejecutar secuencia


En este caso, se plantea que el robot funcione como si fuese un escornabot. Este funcionamiento consiste en ejecutar una serie de movimientos definidos por nel usuario a la hora de presionar las teclas en la cructeta de la mochila botonera.

Cuando se presione cualquiera de las cuatro teclas externas de la cruceta, se debe almacenar ese movimien to en memoria, cuando se presione la tecla central , se debe ejecutar dicha secuencia, en donde las flechas delantera y trasera indican el movimiento hacia adelante o hacia atrás y las flechas izquierda y derecha indican los giros.

A su vez, cuando se presione un atecla de la cruceta se debe emitir un tono, que tiene que ser el mismo que ser emita cuando se realice la acción asociada a este. Es decir, se debe emitir un tono cuando se presione la tercla de avanzar y cuando el robot avance se debe emitir este tono. Esto sucede con las cinco teclas y acciones de la cruceta.

Cada vez que se presione la tecla izquierda o derecha de la cruceta, el robot debe girar 90 grados. Enh lo referente a las teclas de avanzar y retroceder, queda a gusto del usuario, pero se recomienda un valor de 10 cm.


Para esta actividad son necesarios el robot Orbito, el módulo de motores y la mochila botonera.

// Declaración de las librerias necesarias
#include <Orbito.h>
#include <Motores.h>
#include <OrbitoBotonera.h>

// Parametros modificables del código
#define SECUENCIA_DISTANCIA_CM 10
#define MAX_MOVIMIENTOS 20
#define TONO_IZQUIERDA 1000
#define TONO_AVANZAR 1300
#define TONO_DERECHA 1600
#define TONO_ATRAS 1900
#define TONO_CONFIRMAR 2800
#define TONO_DURACION 100

// Parametros del codigo
#define GIR_IZQ 1
#define AVANZAR 2
#define GIR_DER 3
#define RETROCEDER 4

// Se crean los objetos Botonera y Motores
OrbitoBotonera Botonera;
Motores Motores;

// Se definen las variables necesarias para el codigo
uint8_t position = 0;
uint8_t movements[MAX_MOVIMIENTOS];

// Esta funcion detecta la pulsación de los 4 pulsadores de la cruceta
// y guarda la pulsacion en el array de movimientos del robot
void detect_button(){
  if(Botonera.leerPulsador(Botonera.cruceta.izquierda)){
    Serial.println("Pulsador Izquierdo Presionado");
    movements[position] = GIR_IZQ;
    Orbito.System.tone(TONO_IZQUIERDA, TONO_DURACION);
    // Esperar hasta que se deje de presionar el pulsador para no hacer multiples medidas
    while(Botonera.leerPulsador(Botonera.cruceta.izquierda)){
      delay(10); // Retardo para no saturar las comunicaciones
    }
    position++;
  }
  else if(Botonera.leerPulsador(Botonera.cruceta.arriba)){
    Serial.println("Pulsador Superior Presionado");
    movements[position] = AVANZAR;
    Orbito.System.tone(TONO_AVANZAR, TONO_DURACION);
    // Esperar hasta que se deje de presionar el pulsador para no hacer multiples medidas
    while(Botonera.leerPulsador(Botonera.cruceta.arriba)){
      delay(10); // Retardo para no saturar las comunicaciones
    }
    position++;
  }
  else if(Botonera.leerPulsador(Botonera.cruceta.derecha)){
    Serial.println("Pulsador Derecho Presionado");
    movements[position] = GIR_DER;
    Orbito.System.tone(TONO_DERECHA, TONO_DURACION);
    // Esperar hasta que se deje de presionar el pulsador para no hacer multiples medidas
    while(Botonera.leerPulsador(Botonera.cruceta.derecha)){
      delay(10); // Retardo para no saturar las comunicaciones
    }
    position++;
  }
  else if(Botonera.leerPulsador(Botonera.cruceta.abajo)){
    Serial.println("Pulsador Inferior Presionado");
    movements[position] = RETROCEDER;
    Orbito.System.tone(TONO_ATRAS, TONO_DURACION);
    // Esperar hasta que se deje de presionar el pulsador para no hacer multiples medidas
    while(Botonera.leerPulsador(Botonera.cruceta.abajo)){
      delay(10); // Retardo para no saturar las comunicaciones
    }
    position++;
  }

}

// Esta funcion recorre el array de movimientos y llama a una funcion que ejecute
// los movimientos almacenad0os en cada posicion
void executeSecuency(){
  Serial.println("Ejecutando secuencia");
  for(int i = 0; i < position; i++){
    executeMove(movements[i]);
  }

}

// Esta funcion ejecuta un movimiento en funcion del parametro recibido
void executeMove(uint8_t move_id){
  switch(move_id){
    case GIR_IZQ:
      Orbito.System.tone(TONO_IZQUIERDA, TONO_DURACION);
      Motores.rotarRobot(Motores.izquierda, 90);
      delay(10);
      Serial.println("Girando a la izquierda");
      // Esperar a que el robot deje de moverse
      while(Motores.robotDetenido()){
        delay(10); // Retardo para no saturar las comunicaciones
      }
      break;
    case AVANZAR:
      Orbito.System.tone(TONO_AVANZAR, TONO_DURACION);
      Motores.moverRobot(Motores.adelante, SECUENCIA_DISTANCIA_CM);
      delay(10);
      Serial.println("Moviendose hacia adelante");
      // Esperar a que el robot deje de moverse
      while(Motores.robotDetenido()){
        delay(10); // Retardo para no saturar las comunicaciones
      }
      break;
    case GIR_DER:
      Orbito.System.tone(TONO_DERECHA, TONO_DURACION);
      Motores.rotarRobot(Motores.derecha, 90);
      delay(10);
      Serial.println("Girando a la derecha");
      // Esperar a que el robot deje de moverse
      while(Motores.robotDetenido()){
        delay(10); // Retardo para no saturar las comunicaciones
      }
      break;
    case RETROCEDER:
      Orbito.System.tone(TONO_ATRAS, TONO_DURACION);
      Motores.moverRobot(Motores.atras, SECUENCIA_DISTANCIA_CM);
      delay(10);
      Serial.println("Moviendose hacia atras");
      // Esperar a que el robot deje de moverse
      while(Motores.robotDetenido()){
        delay(10); // Retardo para no saturar las comunicaciones
      }
      break;
  }
}



void setup() {
  // Inicializar el robot
  Orbito.begin();
  Orbito.System.tone(1000, 100);
  // Se inicializa el monitor serial
  Serial.begin(9600);
  Serial.println("Iniciando modo Escornabot");
}

void loop() {
  detect_button();
  // Ejecutar la secuencia si se presiona el pulsador central de la cruceta
  if(Botonera.leerPulsador(Botonera.cruceta.centro)){
    // Esperar a que se deje de presionar el pulsador
    while(Botonera.leerPulsador(Botonera.cruceta.centro)){
      delay(10); // Retardo para no saturar las comunicaciones
    }
    Orbito.System.tone(TONO_CONFIRMAR, TONO_DURACION);
    executeSecuency();
    position = 0;
  }

}

Vistas
1 Número de vistas
1 Vistas de miembros
0 Vistas públicas
Acciones
0 Gustos
0 No me gusta
0 Comentarios
Compartir en redes sociales
Compartir enlace
Compartir por correo

Por favor iniciar sesión para compartir esto webpage por correo.