1 00:00:04,209 --> 00:00:10,169 Hola a todos y bienvenidos a mi canal, soy Juanra García y esto es TecnoJuanra777. 2 00:00:10,890 --> 00:00:16,589 En el vídeo de hoy vamos a estar revisando cómo construir los algoritmos que nos van a permitir 3 00:00:16,589 --> 00:00:21,370 luego programar a nuestros robots para que hagan lo que nosotros queramos. 4 00:00:21,829 --> 00:00:23,629 Así que sin más, empezamos. 5 00:00:53,289 --> 00:00:58,950 La presentación que voy a usar hoy se titula Programación de algoritmos para robots usando PSINT. 6 00:00:58,950 --> 00:01:04,390 y las cosas que vamos a estar revisando son las siguientes. 7 00:01:05,430 --> 00:01:09,170 Lo primero, repasaremos algunos conceptos básicos. 8 00:01:10,310 --> 00:01:16,370 Después, repasaremos los algoritmos para robots y veremos algunas cosas concretas acerca de ellos. 9 00:01:17,189 --> 00:01:24,790 Analizaremos el proceso de construcción de estos algoritmos y el proceso que llevan los robots para ejecutarlos paso a paso. 10 00:01:24,790 --> 00:01:30,530 Y por último, veremos un ejemplo completo de algoritmo que llamaremos robot. 11 00:01:31,590 --> 00:01:40,310 Bueno, lo primero, vamos a repasar algunos conceptos básicos y para ver lo primero es saber qué es un robot. 12 00:01:41,109 --> 00:01:47,590 ¿Qué es un robot? Ya hemos visto, porque lo hemos estudiado en vídeos anteriores, que un robot está compuesto por unos sensores. 13 00:01:47,590 --> 00:01:55,209 Unos sensores que van a estar captando la información del entorno y van a estar transformando esa información en valores. 14 00:01:55,629 --> 00:02:05,290 Esos valores se los van a entregar al cerebro que va a procesar esa información y en función de toda la información recogida 15 00:02:05,290 --> 00:02:13,270 va a decidir qué hacer con los diferentes dispositivos de salida que tiene conectados, que son los actuadores. 16 00:02:13,270 --> 00:02:41,430 Por poner algunos ejemplos, ejemplos que vamos a utilizar en nuestros robots cotidianos, pues en el caso de los sensores de entrada podemos tener sensores de distancia, como el HC-SR04, las LDRs o sensores de luminosidad que van a detectar cuando hay luz y cuando no, y los pulsadores que nos van a permitir también cambiar el funcionamiento de nuestro robot o indicarle ciertas cosas a través de las pulsaciones del propio pulsador. 17 00:02:41,430 --> 00:02:49,129 Estos sensores van a captar esa información y se la van a entregar a el cerebro 18 00:02:49,129 --> 00:02:52,330 que puede ser una crumble, ya hemos visto, puede ser un arduino 19 00:02:52,330 --> 00:02:57,509 y estos van a procesar esos datos y van a tomar decisiones 20 00:02:57,509 --> 00:03:03,009 Esas decisiones van a hacer que actúen sobre los diferentes dispositivos de salida 21 00:03:03,009 --> 00:03:07,169 que puede ser luces, motores u otras cosas 22 00:03:07,169 --> 00:03:10,990 Por supuesto, para conectar todo esto hacen falta cables 23 00:03:10,990 --> 00:03:16,469 cables que conecten nuestros sensores a los pines de entrada-salida de las tarjetas de control 24 00:03:16,469 --> 00:03:21,490 y también cables que conecten los pines de entrada-salida a los actuadores. 25 00:03:22,289 --> 00:03:27,550 Así que, si lo ponemos todo junto, lo que vamos a tener al final es un robot. 26 00:03:28,550 --> 00:03:33,550 En este caso, estáis viendo un robot. Os lo voy a enseñar en primera persona. 27 00:03:34,250 --> 00:03:37,090 Así que voy a hacer switch a la cámara. 28 00:03:37,090 --> 00:03:48,500 bien ahí estoy bueno pues aquí podéis ver el robot que se estaba enseñando por delante tiene 29 00:03:48,500 --> 00:03:55,460 el sensor de distancia tiene una crumble que la podéis ver aquí verdad y luego tiene un par 30 00:03:55,460 --> 00:04:01,280 de motores un par de motorcitos que son los dispositivos de salida no tiene más solamente 31 00:04:01,280 --> 00:04:08,379 tiene un dispositivo de entrada que en este caso sería nuestro sensor de distancia un cerebro que 32 00:04:08,379 --> 00:04:14,479 va a tomar las decisiones y los motores que son los actuadores bien también tengo aquí otro un 33 00:04:14,479 --> 00:04:21,459 poquitín más complejo que en este caso se trata de un robot también veis aquí que tiene un 34 00:04:21,459 --> 00:04:29,500 dispositivo de entrada que es el es el sensor de distancia tiene la tarjeta de control aquí 35 00:04:29,500 --> 00:04:38,060 arriba la podéis ver perfectamente esta tarjeta de control y aquí tenemos un sensor de bluetooth 36 00:04:38,379 --> 00:04:42,819 que nos va a permitir controlar este dispositivo, este coche, con un móvil. 37 00:04:43,560 --> 00:04:47,920 Por la parte de abajo, en este caso, tenemos los dos motores. Ahí los podéis ver. 38 00:04:48,920 --> 00:04:54,519 Bien, bueno, pues entonces ya veis que todo, por supuesto, está conectado a través de cables, ¿vale? 39 00:04:54,519 --> 00:05:01,000 Que conectan nuestros dispositivos de entrada. Aquí tenemos un sensor Bluetooth, tenemos el sensor de distancia 40 00:05:01,000 --> 00:05:06,579 y conectan esos sensores con nuestra tarjeta de control 41 00:05:06,579 --> 00:05:10,240 y esa tarjeta de control luego también lo van a conectar con los dispositivos de salida 42 00:05:10,240 --> 00:05:12,579 que en este caso solo son los motores. 43 00:05:13,920 --> 00:05:16,079 Vuelvo a cambiar a la presentación y continuamos. 44 00:05:16,920 --> 00:05:23,240 Por lo tanto, ya vemos que tenemos sensores, una tarjeta de control y actuadores 45 00:05:23,240 --> 00:05:27,220 y todo junto unido por cables funcionan como un robot. 46 00:05:27,220 --> 00:05:45,180 En segundo lugar, ahora vamos a pasar a ver cómo son los algoritmos para los robots. 47 00:05:45,379 --> 00:05:56,620 Son algoritmos, ya hemos visto cómo se construye un algoritmo, pero vamos a ver específicamente cómo vamos a simular a través de un algoritmo el funcionamiento de un programa de control de robots. 48 00:05:57,319 --> 00:06:03,560 Bien, lo primero que tenemos que tener en cuenta es que un robot ejecuta un programa infinito. 49 00:06:03,560 --> 00:06:15,839 ¿Y qué quiere decir esto? Pues muy sencillo. Quiere decir que un robot va a estar leyendo la información de los sensores, va a coger la información de los sensores y va a almacenar esos valores en variables 50 00:06:15,839 --> 00:06:28,120 para poderlos recuperar a posteriori y poder procesar la información. Al procesar la información va a tener todos los datos para poder tomar las decisiones que tenga que tomar 51 00:06:28,120 --> 00:06:33,279 y tomando las decisiones lo que va a hacer es actuar sobre los dispositivos de salida. 52 00:06:34,019 --> 00:06:38,680 Y cuando termine de hacer esto, volverá a leer los sensores, volverá a ver sus valores, 53 00:06:39,120 --> 00:06:44,480 asignarlos a variables, procesará la información, tomará decisiones y actuará si es necesario. 54 00:06:45,100 --> 00:06:48,980 Y volverá a leer los sensores y volverá a asignar las lecturas a las variables 55 00:06:48,980 --> 00:06:53,899 y volverá a procesar la información y a tomar decisiones y así sucesivamente de forma infinita. 56 00:06:54,660 --> 00:06:57,259 Por lo tanto, va a estar continuamente en este bucle. 57 00:06:58,120 --> 00:07:10,519 Y entonces la pregunta que nos hacemos es, ¿cómo podemos simular entonces un algoritmo infinito usando PSINT, que es la herramienta que nosotros utilizamos para simular los algoritmos? 58 00:07:11,000 --> 00:07:15,819 Bueno, pues ya vimos que había una estructura que era la estructura mientras. 59 00:07:16,720 --> 00:07:21,939 Mientras que sucede una condición, vamos a hacer un determinado proceso. 60 00:07:21,939 --> 00:07:29,240 aquí lo vemos, mientras suceda la condición, si la condición que estamos evaluando es verdadera, 61 00:07:29,579 --> 00:07:37,399 ejecutamos el proceso y el flujo vuelve arriba, con lo cual volvemos a evaluar la condición, 62 00:07:38,019 --> 00:07:44,100 si vuelve a ser verdadera volvemos a ejecutar y volvemos arriba y así nos permanecemos en este bucle 63 00:07:44,100 --> 00:07:50,139 mientras que la condición sea verdadera, cuando la condición deje de ser verdadera será falsa 64 00:07:50,139 --> 00:07:53,339 y continuaremos por la otra rama saliendo del bucle. 65 00:07:54,000 --> 00:07:59,639 Para construir un algoritmo infinito lo que tenemos que hacer es que tenemos que introducir una condición que siempre sea verdadera. 66 00:08:00,259 --> 00:08:07,560 Por lo tanto, el programa entrará en este bucle, el algoritmo entrará en este bucle y se quedará eternamente en este bucle 67 00:08:07,560 --> 00:08:09,519 porque la condición siempre va a ser verdadera. 68 00:08:10,220 --> 00:08:19,259 Y en PSINT tenemos una estructura que es verdadero, un comando que es verdadero. 69 00:08:19,259 --> 00:08:28,759 Entonces nosotros vamos a hacer la estructura mientras verdadero, hacer. Este verdadero es algo que va a devolver siempre el valor verdadero, 70 00:08:28,879 --> 00:08:39,059 nunca va a devolver otro valor que sea diferente, es decir, nunca va a devolver falso. Y como es un mientras verdadero, este bucle va a estar eternamente ejecutándose. 71 00:08:39,059 --> 00:08:57,720 Por lo tanto, lo primero que tenemos que tener en cuenta es que un algoritmo en PSINT va a tener una estructura mientras y esa mientras va a evaluar no una condición, sino un comando que es verdadero, que va a devolver siempre verdadero. 72 00:08:58,299 --> 00:09:06,299 Dentro de este bucle infinito, que va a estar siempre ejecutándose, es donde tendremos que leer los sensores, procesar la información, tomar las decisiones y actuar y volver arriba, etc. 73 00:09:06,299 --> 00:09:26,539 Y ahí vamos a estar en el bucle. Si ponemos esto en forma de algoritmo, pues lo que tiene es esta pinta. El algoritmo robot, por lo tanto, va a entrar en el bucle, la condición que va a evaluar es verdadero, con lo cual siempre va a salir por la rama V de verdadero y va a ejecutar estas acciones, leer sensores, procesar información, tomar decisiones y actuar. 74 00:09:26,539 --> 00:09:38,779 Y a partir de aquí vuelve arriba, vuelve a entrar en el bucle y va a quedarse en este bucle eternamente. ¿Por qué? Porque como la condición de salida siempre va a dar verdadero, 75 00:09:39,000 --> 00:09:51,460 nunca tomará el camino del falso que es el que me permitiría salir del bucle. Esta es la forma de simular un algoritmo de un programa de control robótico con PSEINT. 76 00:09:51,460 --> 00:10:07,179 Bien, vamos a analizar ahora el proceso paso a paso. Este proceso de leer, asignar las lecturas a los valores, procesar la información, tomar decisiones y actuar, lo vamos a ir analizando pasito a pasito. 77 00:10:07,179 --> 00:10:21,360 Y vamos a empezar por los dos primeros, porque realmente leer los sensores y asignar esas lecturas a variables es una sola acción. Normalmente, cuando nosotros programamos en código, lo que vamos a hacer es una estructura similar a lo que vemos aquí. 78 00:10:21,460 --> 00:10:34,200 el valor de una variable, el nombre de la variable, por ejemplo, u, va a ser igual y lo que voy a hacer es lanzar una ejecución de un comando 79 00:10:34,200 --> 00:10:43,240 que sea el que provoque la lectura de un sensor concreto. Entonces yo provocaré la lectura del sensor, el sensor me devolverá un valor 80 00:10:43,240 --> 00:10:49,419 y ese valor lo voy a asignar a la variable. Eso será cuando escribamos en código. Pero ¿cómo hacemos esto? 81 00:10:49,419 --> 00:10:54,860 cuando estamos en PSINT. Ya sabemos que en PSINT no tenemos sensores, no tenemos nada. 82 00:10:54,960 --> 00:10:59,379 La única forma de introducir información a los algoritmos es a través de la interacción con el usuario. 83 00:11:00,299 --> 00:11:05,000 Y esa interacción sucede a través del comando leer. 84 00:11:05,679 --> 00:11:12,679 Entonces nosotros vamos a utilizar el comando leer para introducir la información correspondiente a los sensores. 85 00:11:13,259 --> 00:11:18,320 Claro, cuando yo le pongo un leer, leer un sensor concreto en una variable, 86 00:11:18,320 --> 00:11:27,460 Claro, a mí me aparece un prompt y yo no sé qué es lo que tengo que introducir. Por lo tanto, tenemos que mezclar para simular esta lectura en PSINT. 87 00:11:27,600 --> 00:11:38,039 Lo que tengo que hacer es primero escribirle al usuario qué sensor es el que quiero leer y luego voy a quedar esperando el dato correspondiente de la lectura de ese sensor. 88 00:11:38,620 --> 00:11:44,659 Y será el usuario el que introduzca el valor. Y de esa forma lo simularemos. Vamos a verlo un poco más concreto. 89 00:11:44,659 --> 00:11:54,179 si escribimos leer sensor de ultrasonidos y luego con el comando leer u quedo esperando a que el usuario introduzca un valor 90 00:11:54,179 --> 00:12:01,299 cuando yo le meta un valor numérico lo que voy a asignar a la variable u es el valor que introduce el usuario 91 00:12:01,299 --> 00:12:06,259 que será para el programa lo que el sensor de ultrasonidos le ha devuelto 92 00:12:06,259 --> 00:12:12,720 por ejemplo imaginemos que el sensor de ultrasonidos que es un sensor de distancia me devuelve 30 centímetros 93 00:12:12,720 --> 00:12:18,799 Pues cuando yo me ponga leer el sensor de ultrasonidos y me quede esperando una respuesta, yo le pondré 30. 94 00:12:19,500 --> 00:12:23,039 Y eso querrá decir que el sensor de ultrasonidos ha devuelto 30 centímetros. 95 00:12:23,600 --> 00:12:30,679 Después diré leer LDR, que es el de la luz, y le pondré un valor entre 1 y 1024, que es lo que devuelve el LDR. 96 00:12:31,419 --> 00:12:38,539 Y después le diré leer botón, y entonces el botón devuelve a 0 o 1, porque es pulsado o sin pulsar. 97 00:12:38,539 --> 00:12:48,600 Y esos valores los iré metiendo dentro de las tres variables u, l y b. Después, como ya tengo almacenado lo que me ha devuelto cada sensor en una variable, 98 00:12:48,980 --> 00:12:56,240 esos valores los podré reutilizar invocando el nombre de las variables. Hay una forma también en PSINT de hacer esto de una sola vez, 99 00:12:56,679 --> 00:13:05,720 que es poner en una frase, leer los sensores ultrasonidos LDR y botón, y luego a la hora de hacer leer podemos separar las tres variables con una coma 100 00:13:05,720 --> 00:13:08,879 y entonces me va a ir preguntando cíclicamente por cada una de ellas. 101 00:13:09,460 --> 00:13:13,500 A mí me gusta más la primera porque queda más claro lo que estoy introduciendo en cada caso. 102 00:13:13,679 --> 00:13:18,019 En el segundo caso me va a poner la frase y luego va a aparecer un prompt de respuesta. 103 00:13:18,320 --> 00:13:20,740 Vamos a introducir un valor, me va a volver a aparecer un prompt de respuesta, 104 00:13:20,879 --> 00:13:26,019 le voy a introducir otro valor, pero no voy a saber exactamente si no leo la frase de arriba bien 105 00:13:26,019 --> 00:13:27,240 qué es lo que estoy metiendo. 106 00:13:28,100 --> 00:13:29,000 Vamos a ver un ejemplo. 107 00:13:30,139 --> 00:13:30,899 Ese sería el código. 108 00:13:31,419 --> 00:13:34,860 El código sería escribir el sensor de ultrasonidos 109 00:13:34,860 --> 00:13:43,659 y luego escribir esa frase y leer el U, después escribimos leer LDR y leemos L y después escribimos leer botón y leemos B. 110 00:13:44,019 --> 00:13:48,460 Lo que nos va a salir por la pantalla de PSINT es lo que tenemos en el cuadro de abajo. 111 00:13:49,600 --> 00:13:54,440 Pues ejecución iniciada, leer sensor de ultrasonidos, que es la frase que escribimos y después se me queda esperando un valor. 112 00:13:54,559 --> 00:14:00,679 Yo le he puesto 120, que son 120 centímetros, un metro veinte al objeto más cercano. 113 00:14:01,340 --> 00:14:10,259 Después leemos el LDR, yo le he puesto un 57, estamos prácticamente de noche y además lee el botón y le vamos a poner un 0 que quiere decir que el botón no está pulsado. 114 00:14:10,399 --> 00:14:23,419 Con lo cual en la variable U tendremos almacenado el valor 120, en la variable L tendremos el valor 57 y en la variable B habremos almacenado el valor 0. 115 00:14:23,919 --> 00:14:28,700 Y luego podremos utilizar estas variables para procesar esa información y tomar decisiones. 116 00:14:28,700 --> 00:14:46,629 ¿Qué estructuras usamos ahora para procesar esa información? Ya tenemos la información recogida, ya la hemos almacenado en unas variables, ya sabemos los sensores que han detectado en mi entorno y esa información la he almacenado en las variables. 117 00:14:46,629 --> 00:14:53,610 Pues para procesarla vamos a utilizar las estructuras normales de PSINT para hacer cualquier tipo de proceso. 118 00:14:54,450 --> 00:15:00,830 Asignar, pues vamos a hacer cosas con las variables y vamos a devolver valores en esa misma variable o en otras, 119 00:15:01,490 --> 00:15:08,549 o vamos a hacer bucles mientras, bucles repetir o bucles para, lo que necesitemos para procesar la información. 120 00:15:08,970 --> 00:15:14,250 Por ejemplo, si yo tengo un sensor de ultrasonidos que me devuelve el valor de la distancia en milímetros 121 00:15:14,250 --> 00:15:24,929 y yo necesito procesar esa información en centímetros, pues tendré primero que pasar el valor que ha leído el sensor de milímetros a centímetros 122 00:15:24,929 --> 00:15:32,210 para luego poder trabajar con esa información. Y eso sería una de las partes del proceso que yo haré internamente dentro del robot 123 00:15:32,210 --> 00:15:36,070 con las variables que tengo con los valores de los sensores. 124 00:15:37,169 --> 00:15:41,830 Y después de procesar la información, pues ya sabemos que lo que hay que hacer es tomar decisiones. 125 00:15:41,830 --> 00:15:54,169 Ya sabemos la información que tenemos, la hemos procesado y ahora toca sacar conclusiones y para sacar conclusiones solo podemos hacerlo a través de la bifurcación sí. 126 00:15:54,169 --> 00:16:05,950 La bifurcación sí lo que va a hacer es hacer una condición sobre las variables y esa condición la va a evaluar y en función de que se cumpla o no se cumpla la condición 127 00:16:05,950 --> 00:16:13,029 me va a ir por una rama o por otra bifurcando mis caminos del algoritmo en dos opciones. 128 00:16:13,769 --> 00:16:22,529 De esa forma yo tomaré decisiones y podré actuar sobre diferentes opciones o podré actuar o no actuar o podré hacer o no hacer o lo que sea. 129 00:16:22,529 --> 00:16:27,110 Por tanto, tomar decisiones va a ser siempre una bifurcación sí 130 00:16:27,110 --> 00:16:30,610 Y por último, una vez que hemos tomado la decisión 131 00:16:30,610 --> 00:16:32,889 Hemos elegido ya qué camino es el que tomamos 132 00:16:32,889 --> 00:16:35,509 El de la derecha o el de la izquierda, el del verdadero o el del falso 133 00:16:35,509 --> 00:16:38,350 Necesitamos actuar, solo si es necesario 134 00:16:38,350 --> 00:16:40,669 Claro, habrá caminos que sea no hagas nada 135 00:16:40,669 --> 00:16:43,029 Y habrá otros que sea actúa 136 00:16:43,029 --> 00:16:45,889 Entonces estos caminos de actuar 137 00:16:45,889 --> 00:16:50,169 Lo que vamos a hacer nosotros es simularlos 138 00:16:50,169 --> 00:16:59,190 a través del comando escribir. El comando escribir, en este caso, pues vamos a decir escribir gira el motor 1 al 75%, 139 00:16:59,190 --> 00:17:08,490 le estaremos informando, es una salida del algoritmo hacia el usuario. Le va a decir al usuario gira el motor 1 al 75% 140 00:17:08,490 --> 00:17:16,430 y eso va a ser una acción que luego cuando veamos robots ya veremos cómo se hace para que el motor 1 gire al 75%. 141 00:17:16,430 --> 00:17:22,150 Entonces, esa es la forma en la que nosotros vamos a devolver las salidas hacia los actuadores. 142 00:17:23,970 --> 00:17:29,089 Vamos a ver un ejemplo, un ejemplo completo de un algoritmo que llamaremos robot. 143 00:17:30,130 --> 00:17:33,470 Y para hacerlo, lo primero que tenemos que saber es qué queremos hacer. 144 00:17:33,710 --> 00:17:41,069 Bueno, pues tenemos un robot que tiene conectado un sensor de distancia por ultrasonidos y dos diodos LED, uno rojo y otro verde. 145 00:17:41,069 --> 00:17:48,230 Por lo tanto tenemos un sensor de entrada y dos dispositivos de salida, un LED rojo y un LED verde. 146 00:17:48,930 --> 00:17:52,009 Queremos construir un programa para que se comporte de la siguiente forma. 147 00:17:52,690 --> 00:17:57,130 Cuando la distancia medida por el sensor, el sensor de distancia, sea menor de 10 centímetros, 148 00:17:57,890 --> 00:18:01,509 debe encender el LED rojo para indicar peligro por cercanía de un objeto. 149 00:18:02,869 --> 00:18:07,549 Y en el caso de que la distancia medida por el sensor no sea menor de 10 centímetros, 150 00:18:07,549 --> 00:18:11,349 lo que debe es encender el LED verde para indicar que no hay nada cerca. 151 00:18:12,309 --> 00:18:19,869 Así pues, cuando nosotros utilicemos este dispositivo va a estar midiendo la distancia a través del sensor de ultrasonidos 152 00:18:19,869 --> 00:18:25,509 y cuando esa distancia sea menor de 10 centímetros nos va a encender una luz roja diciendo cuidado que hay un objeto cerca 153 00:18:25,509 --> 00:18:33,190 y sin embargo cuando esa distancia no sea menor de 10 centímetros, es decir, cuando no haya un objeto a menos de 10 centímetros 154 00:18:33,190 --> 00:18:38,190 entonces va a encender la luz verde y nos va a decir, todo bien, todo correcto, no hay riesgo. 155 00:18:39,329 --> 00:18:43,250 Bien, ¿cómo sería entonces el ejemplo de este algoritmo? 156 00:18:43,809 --> 00:18:47,690 Bueno, pues si quieres puedes dar la pausa e intentar hacerlo tú, ¿vale? 157 00:18:47,789 --> 00:18:50,150 Y yo ahora te lo explico. 158 00:18:53,779 --> 00:18:57,019 Bien, el algoritmo sería como este. 159 00:18:57,740 --> 00:19:04,079 Primero tenemos, ya sabemos que en PSINT siempre empieza por algoritmo con un nombre 160 00:19:04,079 --> 00:19:08,660 y termina con fin de algoritmo. Esa es la estructura del esqueleto básico de PSINT. 161 00:19:09,500 --> 00:19:13,519 Dentro ya hemos visto que lo que necesitamos es hacer un bucle mientras. 162 00:19:13,960 --> 00:19:20,700 Este bucle mientras lo que va a estar haciendo es que el programa entre en este ciclo y no salga nunca. 163 00:19:21,299 --> 00:19:25,279 ¿Por qué? Porque le hemos puesto como condición a evaluar verdadero. 164 00:19:25,940 --> 00:19:31,099 Por lo tanto siempre se va a cumplir y por lo tanto siempre va a entrar, nunca saldrá. 165 00:19:31,099 --> 00:19:41,680 Bien, entonces, primera cosa, el esqueleto. Segundo, el bucle infinito. Y una vez que estamos en el bucle infinito, dentro tenemos que poner las acciones a ejecutar. 166 00:19:42,059 --> 00:19:50,160 Lo primero, vamos a leer el sensor de ultrasonidos. Entonces escribimos al usuario leer el sensor de ultrasonidos en centímetros. 167 00:19:50,480 --> 00:19:59,859 Y entonces nos vamos a ir a un comando leer y este comando leer nos va a esperar a que el usuario nos introduzca el valor del sensor. 168 00:20:00,519 --> 00:20:03,960 Bueno, pues yo le pondré un valor y aquí está la decisión. 169 00:20:03,960 --> 00:20:07,980 No tengo que evaluar nada, no tengo que hacer ningún proceso intermedio 170 00:20:07,980 --> 00:20:11,119 porque ya directamente estoy pidiendo la información en centímetros. 171 00:20:11,279 --> 00:20:16,859 Insisto, si lo pidiera en milímetros y yo la condición sea que la distancia sea menor de 10 centímetros, 172 00:20:17,440 --> 00:20:23,380 el valor en milímetros tendría que dividirlo por 10, con lo cual aquí en medio habría una línea de proceso 173 00:20:23,380 --> 00:20:28,880 en el cual la variable u sería igual a la variable u dividido por 10. 174 00:20:28,880 --> 00:20:32,660 Es decir, a la variable u le asignaría su propio valor dividido por 10. 175 00:20:33,200 --> 00:20:36,599 Y después ya podría evaluarlo aquí, en esta condición. 176 00:20:37,000 --> 00:20:43,500 Bien, entonces tomo la decisión, si la variable u es menor de 10, es decir, si la distancia es menor de 10 centímetros, 177 00:20:43,700 --> 00:20:46,480 entonces ¿qué hacemos? Encendemos el LED rojo. 178 00:20:47,220 --> 00:20:51,339 Y si no es menor que 10, entonces encendemos el LED verde. 179 00:20:51,799 --> 00:20:52,619 Y ya hemos terminado. 180 00:20:52,960 --> 00:20:57,859 Ahora ¿qué hacemos? Volvemos a cerrar el ciclo, volvemos a leer el sensor de ultrasonidos, 181 00:20:57,859 --> 00:21:03,420 volvemos a pedirle al usuario que me meta la nueva medición, introducemos la nueva medición 182 00:21:03,420 --> 00:21:07,759 y en función de eso decidimos qué hacer y así nos quedamos en este bucle de forma infinita 183 00:21:07,759 --> 00:21:10,460 y el robot funcionaría exactamente como buscamos. 184 00:21:11,380 --> 00:21:17,019 Bien, este sería el diagrama de flujo de este algoritmo. 185 00:21:17,960 --> 00:21:21,819 Vemos, empieza el algoritmo robot, aquí estaría la estructura, ¿veis? 186 00:21:21,819 --> 00:21:28,640 la estructura del bucle infinito con la condición verdadero, que es un bucle mientras, 187 00:21:29,460 --> 00:21:33,400 y la salida falso es la que no se va a utilizar nunca, que es la que nos llevaría al fin del algoritmo. 188 00:21:33,519 --> 00:21:35,319 Por lo tanto, el algoritmo nunca se termina. 189 00:21:36,099 --> 00:21:41,119 Y entrando en el bucle, leemos el sensor de ultrasonidos, introducimos ese valor en la U, 190 00:21:42,059 --> 00:21:46,660 comprobamos si la U es menor que 10 centímetros, si no es menor que 10 centímetros, LED verde, 191 00:21:46,660 --> 00:22:14,180 Si es menor que 10 centímetros, led rojo. Y después cerramos el ciclo y volvemos arriba. Y terminamos nuestro algoritmo. Por lo tanto, este algoritmo estaría accediendo a los sensores, leyendo su información, procesando la información, comprobando si cumple un determinado parámetro, tomando decisiones en función de esa evaluación y actuando sobre los dispositivos de salida o actuadores. 192 00:22:14,180 --> 00:22:32,220 Y terminando el ciclo, volvemos a hacer esto. Y así eternamente. Así que, nada, ya sabemos cómo hacerlo. Esto es todo. Me gustaría que ahora hicierais algunos ejemplos y para eso os voy a proponer un reto. 193 00:22:32,839 --> 00:22:40,059 ¿De acuerdo? Un reto, como estamos en Semana Santa, pues lo he llamado el reto Semana Santa 2020. 194 00:22:41,559 --> 00:22:47,119 Bien, ¿cuál es el reto? Vamos a construir un algoritmo, un algoritmo para controlar ese robot que veis ahí, 195 00:22:47,119 --> 00:22:54,880 que es uno de los que os he enseñado antes, que sería un robot móvil que estaría andando o moviéndose 196 00:22:54,880 --> 00:23:01,500 y tomará decisiones en función de lo que mida su sensor de ultrasonidos situado en la parte frontal. 197 00:23:02,220 --> 00:23:16,880 Bien, ¿cómo quiero que se comporte este robot? Pues vamos a hacer que este robot, que tiene forma de coche, que tiene un sensor de distancia por ultrasonidos, que nos va a dar la distancia en milímetros, ¿vale? 198 00:23:16,880 --> 00:23:35,559 Entonces este sensor de ultrasonido, vamos a considerar que la distancia que nos está ofreciendo es en milímetros, está conectado a nuestro cerebro y luego también nuestro cerebro está conectado a dos motores que vamos a llamar motor 1, que es el de la izquierda, y motor 2, el de la derecha. 199 00:23:36,420 --> 00:23:43,019 Los motores, además, cuando yo actúe sobre ellos, pues le puedo indicar que vaya hacia adelante, 200 00:23:43,400 --> 00:23:47,519 le puedo indicar al motor que vaya hacia detrás o le puedo indicar que pueda pararse. 201 00:23:49,059 --> 00:23:52,539 Y adicionalmente puedo elegir a qué velocidad quiero que gire ese motor. 202 00:23:53,140 --> 00:23:57,019 Y la velocidad se la daré en porcentaje entre el 0 y el 100%. 203 00:23:57,019 --> 00:24:05,960 Entonces, una orden correcta para ese motor, por ejemplo, sería mueve el motor 1 hacia adelante al 75%. 204 00:24:05,960 --> 00:24:09,119 Otra orden correcta sería para el motor 2. 205 00:24:09,819 --> 00:24:17,960 Otra orden correcta sería mueve el motor 2 hacia atrás al 100%, por ejemplo. 206 00:24:18,880 --> 00:24:22,460 Esas son órdenes correctas, órdenes válidas sobre los motores. 207 00:24:23,400 --> 00:24:25,099 Entonces, ¿en qué consiste el reto? 208 00:24:25,099 --> 00:24:35,640 Pues tenemos que diseñar un algoritmo para que pudiéramos, en el caso hipotético que lo hiciéramos en el futuro, construir un programa que haga que este robot se comporte de la siguiente forma. 209 00:24:36,259 --> 00:24:43,359 Primero, el coche ha de avanzar de frente siempre a la máxima velocidad. Va a estar avanzando hacia adelante. 210 00:24:43,359 --> 00:24:58,410 Va a estar midiendo la distancia y cuando esa distancia que esté midiendo sea menor de 10 centímetros, entonces debe parar para no chocar contra el objeto que tenga delante. 211 00:24:59,329 --> 00:25:07,569 Una vez que pare, deberá echar marcha atrás, pero al echar marcha atrás tiene que hacer un giro para cambiar su dirección. 212 00:25:08,450 --> 00:25:21,490 Entonces, echará marcha atrás haciendo un giro y una vez que ha echado marcha atrás haciendo un giro, volverá a arrancar hacia adelante midiendo la distancia frontal para que no haya objetos que le estorben. 213 00:25:23,460 --> 00:25:32,759 Hay dos cosas que quiero contaros. Una, si las dos ruedas se mueven a la misma velocidad, el objeto, en este caso el coche, va en línea recta, hacia adelante o hacia atrás. 214 00:25:32,759 --> 00:25:40,940 Pero si una rueda se mueve más rápido que la otra, o una rueda está parada y solo mueve una de las ruedas, entonces el coche gira. 215 00:25:42,940 --> 00:25:46,839 Esa es una de las cosas que hay que tener en cuenta para poder resolver este reto exitosamente. 216 00:25:46,960 --> 00:25:52,619 La segunda, hay un comando que podemos utilizar que se llama el comando espera. 217 00:25:52,619 --> 00:26:06,180 Y este comando, le vamos a dar el comando seguido de un número y entonces lo que va a hacer es que durante ese tiempo el cerebro no va a hacer nada, por lo tanto el coche va a seguir haciendo lo que está haciendo. 218 00:26:07,140 --> 00:26:19,759 Si yo le he dicho mueve los dos motores hacia adelante al 100% y le digo espera un segundo, pues entonces el coche va a estar durante un segundo avanzando hacia adelante sin hacer nada. 219 00:26:19,759 --> 00:26:28,440 vale si después de ese espera uno le digo para los motores entonces el coche lo que va a hacer 220 00:26:28,440 --> 00:26:35,700 es avanzar durante un segundo parar el motor y quedarse quieto entonces como esto es un 221 00:26:35,700 --> 00:26:45,380 un bucle infinito y cíclico necesitamos a veces dar pequeñas pausas a nuestro programa para dar 222 00:26:45,380 --> 00:26:51,319 tiempo a que el robot vaya haciendo cosas por ejemplo imaginaros que yo quiero chequear la 223 00:26:51,319 --> 00:26:56,059 distancia que tengo delante evidentemente si no tengo nada ahora si en la distancia que yo he 224 00:26:56,059 --> 00:27:05,940 medido ahora mismo es de 30 centímetros al objeto más cercano si yo lo mido en velocidad de ejecución 225 00:27:05,940 --> 00:27:11,940 de este programa que pueden ser cientos o miles de veces por segundo de una milésima de segundo 226 00:27:11,940 --> 00:27:16,220 a la siguiente la distancia apenas va a haber cambiado por lo tanto esas decisiones no me 227 00:27:16,220 --> 00:27:23,180 implican un cambio muy brusco en las condiciones yo qué voy a hacer voy a leer voy a hacer que 228 00:27:23,180 --> 00:27:30,759 cada ciclo del programa se ejecute por ejemplo cada medio segundo yo voy a mirar la distancia 229 00:27:30,759 --> 00:27:37,559 al objeto si no avanzó hacia adelante y espero durante medio segundo y después volveré a medir 230 00:27:37,559 --> 00:27:40,680 la distancia pero no voy a estarla midiendo continuamente porque si no me vuelvo loco y 231 00:27:40,680 --> 00:27:42,740 y además puedo saturar el cerebro 232 00:27:42,740 --> 00:27:43,359 en la CPU 233 00:27:43,359 --> 00:27:46,339 entonces, lo que vamos a hacer es eso 234 00:27:46,339 --> 00:27:48,200 vamos a utilizar el comando espera 235 00:27:48,200 --> 00:27:50,640 ahí tenéis un ejemplo, si yo le digo espera 1 236 00:27:50,640 --> 00:27:52,700 eso quiere decir que el robot espere durante 237 00:27:52,700 --> 00:27:54,579 un segundo, pero no quiere decir 238 00:27:54,579 --> 00:27:56,519 que pare todo, sino que esté haciendo 239 00:27:56,519 --> 00:27:58,619 lo que esté haciendo, las cosas siguen funcionando 240 00:27:58,619 --> 00:28:00,259 es decir, si yo tengo un motor funcionando 241 00:28:00,259 --> 00:28:02,460 el motor durante ese segundo sigue funcionando 242 00:28:02,460 --> 00:28:04,480 si yo he encendido 243 00:28:04,480 --> 00:28:06,319 una luz, durante ese segundo la luz 244 00:28:06,319 --> 00:28:07,680 sigue encendida 245 00:28:07,680 --> 00:28:10,319 y de hecho las luces, si yo las enciendo 246 00:28:10,319 --> 00:28:16,559 permanecen encendidas hasta que no le digo que las apague de acuerdo es decir yo tengo que hacer una 247 00:28:16,559 --> 00:28:22,380 orden que sea deja de hacer algo sino el robot eternamente va a estar haciendo lo que yo le digo 248 00:28:22,380 --> 00:28:31,440 que haga bien pues con estas pistas ahí tenéis un enlace a un vídeo un vídeo de instagram donde veis 249 00:28:31,440 --> 00:28:39,319 exactamente qué quiero que haga, qué quiero que haga el robot. 250 00:28:39,980 --> 00:29:10,730 Os lo pongo aquí y aquí os fijáis. Bueno, pues ya lo habéis visto, veis que el robot va hacia adelante, 251 00:29:11,230 --> 00:29:17,970 cuando llega a un objeto que tiene menos de 10 centímetros, se para, echa hacia atrás haciendo un pequeño giro 252 00:29:17,970 --> 00:29:23,990 y vuelve a avanzar. ¿De acuerdo? Pues ese es el reto. Quiero que me escribáis el algoritmo 253 00:29:23,990 --> 00:29:31,170 y cuando lo tengáis, pues ya sabéis, me lo ponéis en los comentarios, me lo enviáis y hacéis que me llegue 254 00:29:31,170 --> 00:29:42,470 para que lo pueda hacer. Muchas gracias. Así que sin más, me despido. Hasta la próxima. 255 00:29:42,970 --> 00:29:48,710 En el próximo vídeo seguiremos aprendiendo cosas sobre programación, algoritmos y robots.