Utiliza el sensor de ultrasonido del Innobot, para DETECTAR, RECOLECTAR y APARTAR botellas de la pista para resolver el Reto Recolector de Botellas.

 

¿Es posible utilizar varios tipos de sensores al tiempo?

 

El Innobot, cuenta con una unidad de control, que le permite conectar y utilizar varios sensores al mismo tiempo. La clave del buen uso de los sensores, depende del algoritmo y lógica que utilicemos para programar el robot.

1. Funciones RECOLECTAR, APARTAR y SOLTAR

Función Recolectar  – Robot Recolector y Seguidor

Bloque Variable


Una variable está formada por un espacio en el sistema de almacenaje (memoria principal de la unidad de control del robot) y un nombre simbólico (un identificador) que está asociado a dicho espacio. Ese espacio contiene una cantidad de información conocida o desconocida, es decir un valor. El valor que se le puede asignar a una variable, puede ser numérico (enteros, lógicos o flotantes) o caracter como las cadenas. Estas variables deben ser nombradas con un nombre único que no contenga caracteres especiales, se recomienda que al utilizar nombres compuestos, estos se separen con mayúsculas. Este bloque lo puedes encontrar en la categoría de Variables.

Paso 1

Se partirá del programa básico para seguir la línea y una configuración de botellas dada. De esta forma, podemos utilizar los programas del tutorial anterior.

Configuración de Botellas

trazados_02

Programa Seguidor de Línea (Para la configuración de botellas que se plantea)

trazados_16

Paso 2

Lo primero que debe hacer el Innobot es comprender a que distancia debe detectar la botella para ser recolectada. Desde la categoría de Variables, traslada un bloque de tipo variable, hasta Declaraciones.

apartar_02

Paso 3

Luego se nombrará la variable, en este caso distanciaObjeto, además cambiaremos el valor que se le ha asignado. Este valor es la distancia a la que el robot detectará una botella, cambiamos entonces 0 por 9.

apartar_03

Paso 4

Ahora declararemos una variable, que será el umbral que se ha estado usando para seguir la línea, cuyo valor es de 700 y agregaremos miContador (variable que nos permite determinar las intersecciones que debe sortear el robot, ver tutorial anterior). Con la declaración de estas variables es posible cambiar los parámetros una sola vez en el programa, y no se debe hacer varias veces, puesto que en el resto del código solo nos referiremos a la variable y no a su valor.

apartar_04

Paso 5

Construyamos un algoritmo tal que:  SI la distancia a la que se detecta el objeto es MENOR O IGUAL a 9 cm, se active la función RECOLECTAR . Por este motivo, es necesario utilizar un bloque de SI HACER.

apartar_05

Paso 6

Modificaremos la velocidad de los tres motores en la sección de Configuraciones, luego agregaremos la un bloque de Igual a, en el bloque SI HACER, y lo transformaremos en un menor o igual.

apartar_06

Paso 7

Compararemos el valor que lee la función de ultrasonido, con la variable distanciaObjeto. Recuerda que esta variable ya fue declarada, el programa agrega un bloque en la categoría de Variables, para que pueda ser usada. El sensor de ultrasonido, está conectado en el puerto J3.

apartar_07

Paso 8

Configuraremos el estado de las pinzas del robot, para ello debemos agregar un bloque de Encender Motor para M3 en REVERSA, un delay de 400 milisegundos y Apagar Motor. De esta manera las pinzas empezarán abiertas.

apartar_09

Paso 9

Para la función RECOLECTAR, vamos utilizar un bloque de Función de la categoría Funciones. Para recolectar un objeto, el Innobot deberá DETENERSE, CERRAR pinzas durante cierto tiempo y finalmente APAGAR el motor de las pinzas para no ocasionar daños en el motor.

Paso 10

Para utilizar la función RECOLECTAR, cuando el Innobot detecte por medio del sensor de ultrasonido una distancia de 9cm (distanciaObjeto), nos dirigimos a la categoría de Funciones y buscamos el bloque que  representa la función, luego lo trasladamos hasta el bloque SI – HACER.

Función Apartar  – Robot Recolector y Seguidor

Paso 11

Después de recolectar la botella, es necesario APARTARLA de la pista, para ello se debe construir una secuencia como la siguiente:

  1. Girar a la IZQUIERDA
  2. AVANZAR durante un tiempo
  3. DETENERSE

Esta secuencia, será una nueva función, que llamaremos apartar.

apartar_11

Paso 12

Para utilizar la función apartar, se traslada un bloque de función hasta donde se desee y luego en la lista desplegable del bloque se elige la función apartar.

apartar_13

Función Soltar  – Robot Recolector y Seguidor

Paso 13

Después de apartar la botella, es necesario SOLTARLA, para ello construiremos la siguiente función:

  1. ENCENDER motor M3 en REVERSA durante cierto tiempo
  2. APAGAR motor M3 

 

apartar_14

2. Función RETORNAR

Función Retornar  – Robot Recolector y Seguidor

Hasta aquí, el Innobot puede recolectar un objeto, apartarlo y soltarlo. Ahora vamos a agregar dos funcionalidades muy importantes, lo primero que haremos, será construir una función que permita RETORNAR a la pista después de soltar el objeto. Para ello seguiremos los siguientes pasos:

Paso 1

Se construirá una función retornar, que: MIENTRAS el sensor de línea del puerto J1 (Derecha) detecte un valor menor al umbralLinea (NEGRO), entonces Ir en REVERSA.

apartar_15

Paso 2

Luego, para que el Innobot retorne a la línea, es necesario girar, entonces MIENTRAS, el sensor J2 sea menor o igual al umbralLinea (NEGRO), entonces, GIRAR a la DERECHA.

apartar_16

Paso 3

Ahora convertiremos en una función el programa Seguir Línea:

apartar_17

Paso 4

Finalmente completaremos el programa del Innobot Recolector y Seguidor, de la siguiente forma:

  1. Agregar función retornar al bloque SI – HACER principal.
  2. Agregar un bloque SINO al bloque SI – HACER principal.
  3. Agregar función seguir_linea en el bloque SINO.

 

apartar_18

Recuerda subir el programa en el Innobot, hasta aquí el robot es capaz de Seguir una Línea, Recolectar Objetos, Apartarlos y Retornar a la pista. Además es posible programar rutas y trazados para resolver el reto propuesto.

1. Funciones RECOLECTAR, APARTAR y SOLTAR

Función Recolectar  – Robot Recolector y Seguidor

 Variables

  int miVariable = 0;

Una variable está formada por un espacio en el sistema de almacenaje (memoria principal de la unidad de control del robot) y un nombre simbólico (un identificador) que está asociado a dicho espacio. Ese espacio contiene una cantidad de información conocida o desconocida, es decir un valor. El valor que se le puede asignar a una variable, puede ser numérico (enteros, lógicos o flotantes) o caracter como las cadenas. Estas variables deben ser nombradas con un nombre único que no contenga caracteres especiales, se recomienda que al utilizar nombres compuestos, estos se separen con mayúsculas.

Paso 1

Se partirá del programa básico para seguir la línea y una configuración de botellas dada. De esta forma, podemos utilizar los programas del tutorial anterior.

Configuración de Botellas

trazados_02

Programa Seguidor de Línea (Para la configuración de botellas que se plantea)

void setup() {
  // escribe código aquí, para que se ejecute una sola vez:
  int umbraLinea = 700;
  int miContador = 0 ; // Contador
}

void loop() {
  // escribe código aquí, para que se ejecute repetidamente:
  if (sensorRead(J2) <= umbraLinea && sensorRead(J1) <= umbraLinea) {
    goForward(M1,M2);
  } else if (sensorRead(J2) <= umbraLinea && sensorRead(J1) > umbraLinea) {
    turnRight(M2 , M1);
  } else if (sensorRead(J2) > umbraLinea && sensorRead(J1) <= umbraLinea) {
    turnLeft(M2 , M1);
  } else {
    if (miContador == 0) {
      turnLeft(M2 , M1);
      delay(500);
      while (sensorRead(J1) <= umbraLinea) {
        turnLeft(M2 , M1);
        delay(500);
      }
      miContador += 1;
    } else if (miContador == 4) {
      turnRight(M2 , M1);
      delay(500);
      while (sensorRead(J2) <= umbraLinea) {
        turnRight(M2 , M1);
        delay(500);
      }
      miContador += 1;
    } else {
      goForward(M1,M2);
      delay(200);
    }
  }
}

Paso 2

Lo primero que debe hacer el Innobot es comprender a que distancia debe detectar la botella para ser recolectada. Se declarará una variable que se refiere  a la distancia  a la que el robot detecta la botella, en este caso el valor asignado, será 9cm.

  int distanciaObjeto = 9;
  int umbraLinea = 700;
  int miContador = 0 ; // Contador

void setup() {
  // escribe código aquí, para que se ejecute una sola vez:
}

void loop() {
  // escribe código aquí, para que se ejecute repetidamente:
}

Además, ya hemos declararemos una nueva variable, que será el umbral que se ha estado usando para seguir la línea, cuyo valor es de 700 y agregaremos miContador (variable que nos permite determinar las intersecciones que debe sortear el robot, ver tutorial anterior). Con la declaración de estas variables es posible cambiar los parámetros una sola vez en el programa, y no se debe hacer varias veces, puesto que en el resto del código solo nos referiremos a la variable y no a su valor.

Paso 3

Ahora crearemos la estructura básica del programa:

  1. Configurar las condiciones iniciales del robot: Velocidad de los motores y abrir las pinzas cuando se encienda el robot
  2. Condicional IF – ELSE. SI el Innobot detecta una botella debe realizar ciertas instrucciones, SINO debe realizar otras, en este caso SEGUIR la línea blanca.
  int distanciaObjeto = 9;
  int umbraLinea = 700;
  int miContador = 0 ; // Contador

void setup () {
  motorSpeed(M1,60);
  motorSpeed(M2,60);
  motorSpeed(M3,60);
  motorOn(M3,REVERSE);
  delay(400);
  motorOff(M3);
}
void loop () {
  if () {

  } else {

  }
}

Paso 4

En este paso se agregará la comparación de la lectura del sensor de ultrasonido con la distanciaObjeto.

  int distanciaObjeto = 9;
  int umbraLinea = 700;
  int miContador = 0 ; // Contador

void setup () {
  motorSpeed(M1,60);
  motorSpeed(M2,60);
  motorSpeed(M3,60);
  motorOn(M3,REVERSE);
  delay(400);
  motorOff(M3);

}
void loop () {
  if (ultrasoundRead(J3) <= distanciaObjeto) {

  } else {
  }
}

Paso 5

La función recolectar, debe tener las siguientes instrucciones:

  1. APAGAR motores M1 y M2
  2. ENCENDER hacia ADELANTE el motor M3
  3. ESPERAR un tiempo a que cierren las pinzas
  4. APAGAR M3
  int distanciaObjeto = 9;
  int umbraLinea = 700;
  int miContador = 0 ; // Contador

void setup () {
  motorSpeed(M1,60);
  motorSpeed(M2,60);
  motorSpeed(M3,60);
  motorOn(M3,REVERSE);
  delay(400);
  motorOff(M3);

}
void loop () {
  if (ultrasoundRead(J3) <= distanciaObjeto) {

  } else {
  }
}

void recolectar (){
  motorsOff(M1 , M2);
  motorOn(M3,FORWARD);
  delay(400);
  motorOff(M3);
}

Función Apartar  – Robot Recolector y Seguidor

Paso 6

La función apartar consistirá en:

  1. GIRAR a la IZQUIERDA durante cierto tiempo
  2. Ir Hacia Adelante 
  3. DETENERSE
  int distanciaObjeto = 9;
  int umbraLinea = 700;
  int miContador = 0 ; // Contador

void setup () {
  motorSpeed(M1,60);
  motorSpeed(M2,60);
  motorSpeed(M3,60);
  motorOn(M3,REVERSE);
  delay(400);
  motorOff(M3);
}
void loop () {
  if (ultrasoundRead(J3) <= distanciaObjeto) {

  } else {
  }
}

void recolectar (){
  motorsOff(M1 , M2);
  motorOn(M3,FORWARD);
  delay(400);
  motorOff(M3);
}
void apartar (){
  turnLeft(M2 , M1);
  delay(500);
  goForward(M1,M2);
  delay(500);
  motorsOff(M1 , M2);
}

Función Soltar  – Robot Recolector y Seguidor

Paso 7

La función soltar, tiene los siguientes pasos:

  1. ABRIR pinzas
  2. APAGAR motor M3
  int distanciaObjeto = 9;
  int umbraLinea = 700;
  int miContador = 0 ; // Contador

void setup () {
  motorSpeed(M1,60);
  motorSpeed(M2,60);
  motorSpeed(M3,60);
  motorOn(M3,REVERSE);
  delay(400);
  motorOff(M3);
}
void loop () {
  if (ultrasoundRead(J3) <= distanciaObjeto) {

  } else {
  }
}

void recolectar (){
  motorsOff(M1 , M2);
  motorOn(M3,FORWARD);
  delay(400);
  motorOff(M3);
}
void apartar (){
  turnLeft(M2 , M1);
  delay(500);
  goForward(M1,M2);
  delay(500);
  motorsOff(M1 , M2);
}
void soltar (){
  motorOn(M3,REVERSE);
  delay(300);
  motorOff(M3);
}

Hasta aquí hemos construido, tres de las cuatro funciones que debe realizar el Innobot cuando ha detectado una botella. Para usar las funciones en el primer condicional, solo es necesario escribir su nombre, abrir y cerrar paréntesis () y un punto y coma ;.

  int distanciaObjeto = 9;
  int umbraLinea = 700;
  int miContador = 0 ; // Contador

void setup () {
  motorSpeed(M1,60);
  motorSpeed(M2,60);
  motorSpeed(M3,60);
  motorOn(M3,REVERSE);
  delay(400);
  motorOff(M3);
}
void loop () {
  if (ultrasoundRead(J3) <= distanciaObjeto) {
    recolectar ();
    apartar ();
    soltar ();
  } else {
  }
}

void recolectar (){
  motorsOff(M1 , M2);
  motorOn(M3,FORWARD);
  delay(400);
  motorOff(M3);
}
void apartar (){
  turnLeft(M2 , M1);
  delay(500);
  goForward(M1,M2);
  delay(500);
  motorsOff(M1 , M2);
}
void soltar (){
  motorOn(M3,REVERSE);
  delay(300);
  motorOff(M3);
}

2. Función RETORNAR

Función Retornar  – Robot Recolector y Seguidor

Hasta aquí, el Innobot puede recolectar un objeto, apartarlo y soltarlo. Ahora vamos a agregar dos funcionalidades muy importantes, lo primero que haremos, será construir una función que permita RETORNAR a la pista después de soltar el objeto. Para ello seguiremos los siguientes pasos:

Paso 1

Se construirá una función retornar, que: MIENTRAS el sensor de línea del puerto J1 (Derecha) detecte un valor menor al umbralLinea (NEGRO), entonces Ir en REVERSA. Luego, para que el Innobot retorne a la línea, es necesario girar, entonces MIENTRAS, el sensor J2 sea menor o igual al umbralLinea (NEGRO), entonces, GIRAR a la DERECHA.

  int distanciaObjeto = 9;
  int umbraLinea = 700;
  int miContador = 0 ; // Contador

void setup () {
  motorSpeed(M1,60);
  motorSpeed(M2,60);
  motorSpeed(M3,60);
  motorOn(M3,REVERSE);
  delay(400);
  motorOff(M3);
}
void loop () {
  if (ultrasoundRead(J3) <= distanciaObjeto) {
    recolectar ();
    apartar ();
    soltar ();
    retornar();
  } else {
  }
}

void recolectar (){
  motorsOff(M1 , M2);
  motorOn(M3,FORWARD);
  delay(400);
  motorOff(M3);
}
void apartar (){
  turnLeft(M2 , M1);
  delay(500);
  goForward(M1,M2);
  delay(500);
  motorsOff(M1 , M2);
}
void soltar (){
  motorOn(M3,REVERSE);
  delay(300);
  motorOff(M3);
}
void retornar (){
  while (sensorRead(J1) < umbraLinea) {
    goReverse(M1,M2);
  }
  while (sensorRead(J2) < umbraLinea) {
    turnRight(M2 , M1);
  }
}

Paso 2

Ahora convertiremos en una función el programa Seguir Línea:

void seguir_linea (){
  if (sensorRead(J2) <= umbraLinea && sensorRead(J1) <= umbraLinea) {
    goForward(M1,M2);
  } else if (sensorRead(J2) <= umbraLinea && sensorRead(J1) > umbraLinea) {
    turnRight(M2 , M1);
  } else if (sensorRead(J2) > umbraLinea && sensorRead(J1) <= umbraLinea) {
    turnLeft(M2 , M1);
  } else {
    if (miContador == 0) {
      turnLeft(M2 , M1);
      delay(500);
      while (sensorRead(J1) <= umbraLinea) {
        turnLeft(M2 , M1);
        delay(500);
      }
      miContador += 1;
    } else if (miContador == 4) {
      turnRight(M2 , M1);
      delay(500);
      while (sensorRead(J2) <= umbraLinea) {
        turnRight(M2 , M1);
        delay(500);
      }
      miContador += 1;
    } else {
      goForward(M1,M2);
      delay(200);
    }
  }
}

Paso 3

Finalmente completaremos el programa del Innobot Recolector y Seguidor, agregando la función seguir_linea en el condicional ELSE.

  int distanciaObjeto = 9;
  int umbraLinea = 700;
  int miContador = 0 ; // Contador

void setup () {
  motorSpeed(M1,60);
  motorSpeed(M2,60);
  motorSpeed(M3,60);
  motorOn(M3,REVERSE);
  delay(400);
  motorOff(M3);

}
void loop () {
  if (ultrasoundRead(J3) <= distanciaObjeto) {
    recolectar ();
    apartar ();
    soltar ();
    retornar ();
  } else {
    seguir_linea ();
  }

}
void recolectar (){
  motorsOff(M1 , M2);
  motorOn(M3,FORWARD);
  delay(400);
  motorOff(M3);

}
void apartar (){
  turnLeft(M2 , M1);
  delay(500);
  goForward(M1,M2);
  delay(500);
  motorsOff(M1 , M2);
}
void soltar (){
  motorOn(M3,REVERSE);
  delay(300);
  motorOff(M3);
}
void retornar (){
  while (sensorRead(J1) < umbraLinea) {
    goReverse(M1,M2);
  }
  while (sensorRead(J2) < umbraLinea) {
    turnRight(M2 , M1);
  }
}
void seguir_linea (){
  if (sensorRead(J2) <= umbraLinea && sensorRead(J1) <= umbraLinea) {
    goForward(M1,M2);
  } else if (sensorRead(J2) <= umbraLinea && sensorRead(J1) > umbraLinea) {
    turnRight(M2 , M1);
  } else if (sensorRead(J2) > umbraLinea && sensorRead(J1) <= umbraLinea) {
    turnLeft(M2 , M1);
  } else {
    if (miContador == 0) {
      turnLeft(M2 , M1);
      delay(500);
      while (sensorRead(J1) <= umbraLinea) {
        turnLeft(M2 , M1);
        delay(500);
      }
      miContador += 1;
    } else if (miContador == 4) {
      turnRight(M2 , M1);
      delay(500);
      while (sensorRead(J2) <= umbraLinea) {
        turnRight(M2 , M1);
        delay(500);
      }
      miContador += 1;
    } else {
      goForward(M1,M2);
      delay(200);
    }
  }
}

Recuerda subir el programa en el Innobot, hasta aquí el robot es capaz de Seguir una Línea, Recolectar Objetos, Apartarlos y Retornar a la pista. Además es posible programar rutas y trazados para resolver el reto propuesto.