====== Robot explorador autónomo ====== \\ En esta actividad eqiparemos de “ojos” al robot con el sensor de {{ :es:manuals:acts:3dbot:img_20220329_101601_1_.jpg?nolink&370|}}ultrasonido HC-SR04 y haremos que funcione autónomamente explorando su entorno sin chocar. Para evitar el choque iremos haciendo varias estrategias, de la más simple a la más complicada. \\ \\ Primero haremos un programa para que el robot siempre vaya hacia adelante y que cuando encuentre un objeto, a menos de 20cm, se pare. Y si el objeto desaparece debe volver a avanzar. \\ \\ El bloque se encuentra en el apartado “3dBot” de ArduinoBlocks: \\ {{ :es:manuals:acts:3dbot:3dbot_110.png?nolink |}} \\ \\ \\ \\ ==== #01 Programa ==== Prueba el siguiente programa. \\ {{ :es:manuals:acts:3dbot:arduinoblocks_1649239523311.png?nolink&400 |}} \\ ==== #02 Segunda estrategia ==== La segunda estrategia consistirá en hacer que cuando se pare, gire a la derecha 90 grados y siga adelante. Para realizarlo va a ser especialmente importante utilizar el encoder que hemos explicado en la actividad A13. \\ \\ Hemos visto también en la actividad A13 que, para girar 90 grados {{ :es:manuals:acts:3dbot:3dbot_111.png?nolink&|}}a la derecha, basta con girar a la derecha durante 6 pasos (aproximadamente). \\ \\ En lugar de la función “girar”, que sólo mueve una rueda, se puede utilizar la función “rotar”, en la que giran ambas ruedas en sentido contrario. Vamos a ver los dos ejemplos. * **Programa utilizando el giro** {{ :es:manuals:acts:3dbot:3dbot_112.png?nolink |}} \\ * **Programa utilizando la rotación** {{ :es:manuals:acts:3dbot:3dbot_113.png?nolink |}} \\ Si comparamos ambos ejemplos, vemos que el número de pasos necesario para rotar 90 grados no es el mismo que para girar 90 grados. Podéis probar con distintos valores para ver los resultados y así marear un poco al 3dBot. \\ \\ También es muy importante tener en cuenta que solo disponemos de encoder en la rueda izquierda y que es en los giros a la izquierda esta no se mueve, por tanto, en ese giro no podremos controlar el ángulo girado. Como en las rotaciones si se mueven ambas ruedas, ahí si podemos medir el ángulo girado a la izquierda. \\ \\ Por último, se puede cambiar la distancia mínima a la que detecta un obstáculo. \\ \\ ==== #03 Robot explorador autónomo en laberinto ==== En el programa anterior, el solo puede esquivar obstáculos en una dirección, lo que provoca que cuando la única dirección posible es la izquierda, el robot se pierde o vuelve por donde ha venido. \\ \\ Para evitarlo, vamos a utilizar dos rotaciones diferentes, una de 90 grados y otra de 180 grados. Estos dos movimientos los vamos a definir, por comodidad, en las siguientes funciones: \\ {{ :es:manuals:acts:3dbot:arduinoblocks_1649316771583.png?nolink&600 |}} \\ Tras esto, si vamos al apartado “Funciones”, veremos las nuevas funciones creadas y listas para insertar en cualquier parte de nuestro programa: \\ {{ :es:manuals:acts:3dbot:3dbot_114.png?nolink |}} \\ Además, vamos a introducir nuevas condiciones que le den a nuestro robot más herramientas a la hora de enfrentarse a obstáculos. \\ \\ Como antes el robot solo giraba a la derecha, esto provocaba que, cuando la única dirección posible era a la izquierda, el robot se perdía o volvía por donde había venido. \\ \\ Insertar imagen superior del 3dBot en un laberinto con giro a la izquierda. \\ \\ Para evitarlo, vamos a decirle que si gira a la derecha e inmediatamente vuelve a encontrar otro obstáculo y va a volver a girar a la derecha, querrá ecir que realmente tenía que haber girado hacia la izquierda (es lo más probable). Teniendo en cuenta que acaba de realizar un giro de 90 grados en la dirección equivocada, le diremos que gire 180 grados para ir en la dirección opuesta. \\ \\ Veremos en el programa que, para hacer esta condición explicada más efectiva, el robot va a tomar la decisión descrita, no solo cuando haya interpretado dos giros inmediatamente seguidos a la derecha, sino también cuando los haya interpretado en menos de 800ms, aunque en ese tiempo sí haya avanzado brevemente en línea recta. \\ {{ :es:manuals:acts:3dbot:arduinoblocks_1649319454279.png?nolink&550 |}} \\ Recordar dejar en la misma pantalla las funciones antes definidas. La definición de estas funciones no tiene que ir dentro de bucle. En total queda algo así: \\ {{ :es:manuals:acts:3dbot:arduinoblocks_1649319972301.png?nolink&700 |}} \\ \\