<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="es">
		<id>http://164.73.124.35/inco/proyectos/butia/mediawiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=German.moreira</id>
		<title>Proyecto Butiá - Contribuciones del usuario [es]</title>
		<link rel="self" type="application/atom+xml" href="http://164.73.124.35/inco/proyectos/butia/mediawiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=German.moreira"/>
		<link rel="alternate" type="text/html" href="http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php/Especial:Contribuciones/German.moreira"/>
		<updated>2026-04-05T18:51:46Z</updated>
		<subtitle>Contribuciones del usuario</subtitle>
		<generator>MediaWiki 1.26.2</generator>

	<entry>
		<id>http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Programando_el_Butia_desde_el_celular&amp;diff=11732</id>
		<title>Programando el Butia desde el celular</title>
		<link rel="alternate" type="text/html" href="http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Programando_el_Butia_desde_el_celular&amp;diff=11732"/>
				<updated>2021-06-28T02:47:23Z</updated>
		
		<summary type="html">&lt;p&gt;German.moreira: /* Archivos de uso */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Introducción ==&lt;br /&gt;
&lt;br /&gt;
La idea del proyecto en un principio era usar el celular como medio para controlar el robot Butiá para que resulte más atractivo para los estudiantes que no les guste la programación.&lt;br /&gt;
&lt;br /&gt;
Luego, la idea se modifico un poco debido a que descubrimos que con esta implementación, podíamos hacer mas sencilla la resolución de algunos ejercicios básicos mediante algoritmos mas simplificados, tomamos el trabajo que teníamos hecho hasta el momento y lo adaptamos a un menú con distintas acciones simples como avanzar un determinado tiempo, avanzar hasta chocar contra un objeto o rotar a la izquierda o derecha un determinado tiempo.&lt;br /&gt;
&lt;br /&gt;
Estas funciones básicas y bastante sencillas de entender más una interfaz amigable y fácil de usar, se implementaron para que el rango de edad de uso de esta aplicación vaya de 3 años en adelante.&lt;br /&gt;
&lt;br /&gt;
Como resultado obtuvimos una aplicación que se puede usar para que niños de:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- 4 / 5 / 6 años resuelvan ejercicios sencillos como puede ser llegar de un punto a otro, buscar el camino a un objeto o resolver un laberinto sencillo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- 7 / 8 / 9 años puedan resolver ejercicios un poco más complejos como puede ser resolver un laberinto del más sencillo al mas complejo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- 10 años en adelante tengan la capacidad de adaptar una parte personal de código al programa y puedan resolver cualquier ejercicio que se pueda plantear con el robot Butiá.&lt;br /&gt;
&lt;br /&gt;
== Objetivo y motivación==&lt;br /&gt;
&lt;br /&gt;
Los objetivos del proyecto eran, como dice el nombre, poder conectar remotamente el robot Butiá a un celular y buscar una abstracción de la mayor cantidad de problemas que puedan ser resueltos con el robot Butiá.&lt;br /&gt;
&lt;br /&gt;
Esto, para poder crear un método de uso del robot Butiá más dinámico y con funciones que permiten realizar, mediante algoritmos mas sencillos, la solución de la mayor cantidad de puzles particulares, abstrayéndose de la programación directa, lo que puede ser tedioso o abrumador para personas que tienen su primer acercamiento a la programación.&lt;br /&gt;
&lt;br /&gt;
Al hacer esto, el nivel de uso en aulas del robot Butiá, puede simplificarse hasta clases desde 3 años de jardinera en adelante, debido a que la aplicación simplifica la parte de codificación y los algoritmos de solución de ejercicios se convierten simplemente en una serie de pasos básicos a ejecutar linealmente.&lt;br /&gt;
&lt;br /&gt;
Lo que se busca con este proyecto, es despertar la curiosidad e interés en niños y adolescentes en el área de la programación de una forma didáctica, en donde estos pueden experimentar directamente con el robot y potenciar la creatividad para resolver problemas. &lt;br /&gt;
&lt;br /&gt;
La aplicación esta inspirada en el lenguaje &amp;quot;Sratch&amp;quot;, el cual es un lenguaje ideal para los primeros acercamientos a la programación. &lt;br /&gt;
&lt;br /&gt;
Este ''software'' permite ademas, introducir conceptos como, instrucciones, secuencialidad de código, algoritmos, secuencias de control, estructuras de repetición, etc. Como ejercicio, se puede plantear por ejemplo, hacer el pasaje a Python de algoritmos diseñados en la aplicación.&lt;br /&gt;
&lt;br /&gt;
== Armado del Butiá ==&lt;br /&gt;
&lt;br /&gt;
* Paso 1: Armar el Butiá a partir de esta [https://www.fing.edu.uy/inco/proyectos/butia/files/docs_butia2/armando_paso_a_paso_motores_CC_rev1.pdf guía oficial]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Paso 2: Instalar el sensor de grises&lt;br /&gt;
&lt;br /&gt;
1:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP1.jpeg]] &lt;br /&gt;
&lt;br /&gt;
2:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP2.jpeg]]&lt;br /&gt;
&lt;br /&gt;
3:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP3.jpeg]]&lt;br /&gt;
&lt;br /&gt;
4:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP4.jpeg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Paso 3: Instalar el sensor de distancia&lt;br /&gt;
&lt;br /&gt;
1:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP1.png]]&lt;br /&gt;
&lt;br /&gt;
2:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP2.png]]&lt;br /&gt;
&lt;br /&gt;
3:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP3.png]]&lt;br /&gt;
&lt;br /&gt;
4:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP4.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Observación''': Es indispensable que los componentes del robot se encuentren en condiciones optimas para que este tenga el comportamiento deseado al momento de ejecutar las acciones enviadas desde la app. Esto incluye a los motores, debido a que una diferencia de comportamiento entre estos no permitiría por ejemplo, que el robot se desplace en linea recta.&lt;br /&gt;
&lt;br /&gt;
== Protocolo de comunicación ==&lt;br /&gt;
El protocolo de comunicaron diseñado para la comunicación entre Servidor y Aplicación ''Mobile'' es el siguiente:&lt;br /&gt;
&lt;br /&gt;
'''''Accion0-S0\nAccion1-S1\nAccion2-S2\nAccion3\nAccion4-S4\nVelocidad'''''&lt;br /&gt;
&lt;br /&gt;
Donde, este ''string'' representa la serie encadenada de acciones que el servidor recibe para ejecutar en el robot desde la aplicación por medio de un ''WebSocket'' (socket que utiliza protocolo http).&lt;br /&gt;
Cada acción esta separada de la que se encuentra a continuación por el símbolo &amp;quot;''\n''&amp;quot;.&lt;br /&gt;
Podemos diferenciar dos tipos de acciones, las que requieren parámetro y las que no, estas se comunican de la siguiente forma:&lt;br /&gt;
&lt;br /&gt;
'''-Acción con parámetro''': NombreAccion-Parametro&lt;br /&gt;
&lt;br /&gt;
'''-Acción sin parámetro''': NombreAccion&lt;br /&gt;
&lt;br /&gt;
== Implementación código Python ==&lt;br /&gt;
&lt;br /&gt;
Antes de empezar a programar o usar el código, es necesario instalar las librerías a usar, esto se puede hacer escribiendo &lt;br /&gt;
&lt;br /&gt;
'''''pip install [nombre de la librería]''''' en el interprete de comandos del sistema.&lt;br /&gt;
&lt;br /&gt;
Entonces instalamos la librería a utilizar, en este caso:&lt;br /&gt;
&lt;br /&gt;
'''''pip install simple_websocket_server'''''&lt;br /&gt;
&lt;br /&gt;
Una vez instalada la librería, hay que empezar a escribir el código.&lt;br /&gt;
&lt;br /&gt;
El encabezado del código es el siguiente&lt;br /&gt;
El uso de cada librería se explica con detalle mas adelante&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Encabezado.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A partir de la librería '''sys''' se define el camino del sistema para utilizar los plugin Butiá.&lt;br /&gt;
En nuestro caso, la ruta es ''' '/home/trerb/TurtleBots.activity/plugins/butia' ''', eso se tiene que modificar dependiendo de donde se encuentren el directorio ''' TurtleBots.activity/ ''' en su sistema de archivos&lt;br /&gt;
&lt;br /&gt;
[[Archivo:UsoPluginButia.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego se encuentra la función ''' clearConsole ''',&lt;br /&gt;
Esta función sirve únicamente para limpiar el interprete de Python usando la librería ''' os ''' y tener una ejecución mas limpia&lt;br /&gt;
&lt;br /&gt;
[[Archivo:clearConsole().png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
El siguiente código utiliza la librería ''' socket ''' para conectarse a la web y preguntar la ip del ordenador que ejecuta el archivo y la muestra en pantalla, esto se usa para facilitar la conexión con la App Mobile&lt;br /&gt;
&lt;br /&gt;
[[Archivo:conexionSocket.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Las siguientes líneas de código preguntan al usuario que puerto va a utilizar para la conexión, este código verifica que se ingrese un dato numérico, dentro del rango de los puertos, y que el puerto este disponible.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:tryPuerto.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego se declaran las variables: ''' Speed, Puerto_Gris y Puerto_Distancia ''', se verifica que los sensores de distancia y de grises estén conectados y asigna el puerto en el que estén conectados a las variables ''' Puerto_Distancia ''' y ''' Puerto_Gris ''' respectivamente. La variable ''' Speed ''' es una variable global que se lee al inicio de cada cadena de acciones y la utiliza para todos los movimientos del Butiá de esa cadena.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:declaracionVariables.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Seguimos con la declaración de las funciones básicas del Butiá, en este caso son ''' Avanzar, Rotar, AvanzarHastaVerColor y AvanzarHastaObstaculo ''' &lt;br /&gt;
&lt;br /&gt;
-La función ''' Avanzar ''' recibe un parámetro de tiempo y el Butiá avanza ese determinado tiempo.&lt;br /&gt;
&lt;br /&gt;
-La función ''' Retroceder ''' recibe un parámetro de tiempo y el Butiá retrocede ese determinado tiempo.&lt;br /&gt;
&lt;br /&gt;
-La función ''' Rotar ''' recibe dos parámetros, una dirección que puede ser Izquierda o Derecha y un tiempo que indica la duración de la rotación del Butiá.&lt;br /&gt;
&lt;br /&gt;
-La función ''' AvanzarHastaVerColor ''' recibe un parámetro que varia entre Blanco o Negro, el robot va a avanzar hasta detectar el color seleccionado.&lt;br /&gt;
Esta función solo se puede usar si el sensor de grises esta conectado.&lt;br /&gt;
&lt;br /&gt;
-Por ultimo, la función ''' AvanzarHastaObstaculo ''' no recibe parámetros, en este caso el Butiá va a avanzar hasta estar a unos pocos centímetros de un obstáculo.&lt;br /&gt;
Esta función solo se puede usar si el sensor de distancia esta conectado.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:FuncionesBasicas.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego se encuentra una función ''' Accion1 ''' esta función la puede definir el usuario a gusto, se puede implementar desde una función básica hasta un seguidor de líneas avanzado. La única condición que se necesita para implementar esta ''' Accion1 ''' es que no puede recibir parámetros&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Accion1.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ahora tenemos que definir el menú principal del programa, este se divide en dos funciones&lt;br /&gt;
&lt;br /&gt;
- ''' handle ''': Esta es una función predeterminada de la librería ''' simple_web_socket ''' y se llama cada vez que el servidor recibe un dato del cliente. En este caso la función crea una lista de las acciones que le llegan de la App Mobile, y las va ejecutando ordenadamente&lt;br /&gt;
&lt;br /&gt;
- ''' handle_close ''': Al igual que la función anterior, esta también es una función predeterminada de la librería ''' simple_web_socket ''' y se llama cuando el cliente se desconecta del servidor&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Screenshot from 2021-06-27 03-58-56.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Y por ultimo tenemos el dos líneas de codigo, la primera se encarga de abrir el servidor y la segunda lo mantiene abierto infinitamente&lt;br /&gt;
&lt;br /&gt;
[[Archivo:abrirServidor.png]]&lt;br /&gt;
&lt;br /&gt;
== Implementación código React ==&lt;br /&gt;
&lt;br /&gt;
La aplicación ''mobile'' esta implementada con React Native, ademas, se utiliza el ''framework'' [https://docs.expo.io/ Expo]. Este ''framework'' nos brinda un conjunto de herramientas que facilita el desarrollo de aplicaciones ''mobile''. &lt;br /&gt;
En caso de querer agregar, o modificar cualidades, es necesario proceder de la siguiente forma:&lt;br /&gt;
&lt;br /&gt;
Descargar el archivo comprimido adjunto.&lt;br /&gt;
&lt;br /&gt;
Extraerlo, posicionarse en el directorio raiz de la carpeta descomprimida, y ejecutar desde la terminal lo siguiente (tener en cuenta que es necesario tener en la maquina, el gestor de paquetes [https://docs.npmjs.com/ npm]).&lt;br /&gt;
&lt;br /&gt;
''''npm install'''' &lt;br /&gt;
&lt;br /&gt;
Esto descarga las dependencias que utiliza la aplicación, luego de esto podemos empezar a desarrollar.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para visualizar los cambios en tiempo real mientras desarrollamos, es necesario instalar la aplicación Expo Go para [https://play.google.com/store/apps/details?id=host.exp.exponent&amp;amp;hl=es_UY&amp;amp;gl=US Android] o para [https://apps.apple.com/es/app/expo-go/id982107779 iOS] según sea el caso.&lt;br /&gt;
&lt;br /&gt;
Para a visualizar la app en desarrollo desde Expo Go, procedemos de la siguiente forma:&lt;br /&gt;
Desde el directorio raíz de la aplicación ejecutamos desde la terminal lo siguiente:&lt;br /&gt;
&lt;br /&gt;
''''npm start''''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego, desde la aplicación Expo Go, con el celular conectado en la misma red local accedemos a la aplicación seleccionando lo siguiente:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Expo.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hecho esto, podemos cambiar el código de la aplicación y ver reflejados los cambios de forma casi instantánea.&lt;br /&gt;
&lt;br /&gt;
La aplicación esta compuesta por dos pantallas, la pantalla de configuración (''ConfigScreen.js''), donde se ingresa la dirección ip y puerto del servidor, y la pantalla principal (''MainScreen.js''), donde se lleva a cabo la programación del robot mediante acciones.&lt;br /&gt;
&lt;br /&gt;
Esta ultima pantalla esta compuesta por los componentes ''TopList.js'' y ''BottomList.js''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Untitled presentation.png]]&lt;br /&gt;
&lt;br /&gt;
Para agregar una nueva accion al sistema, es necesario programarla en el servidor con un determinado nombre, supondremos &amp;quot;AccionN&amp;quot;, esto resulta fácil si se toma como ejemplo las acciones ya implementadas.&lt;br /&gt;
&lt;br /&gt;
En la aplicación, esta nueva acción se agrega en el ''array'' &amp;quot;''actionsData''&amp;quot;, dicho ''array'' se encuentra en la pantalla principal, es decir en el archivo &amp;quot;''MainScreen.js''&amp;quot;, cada acción cuenta con los siguientes datos:&lt;br /&gt;
&lt;br /&gt;
-'''idAccion:''' Identificador (indice) de la acción en dicho arreglo (actionsData). Esto permite identificar a la acción y hacer referencia a su ''overlay'' cuando se requiere modificar un parámetro de la accion en la app.&lt;br /&gt;
&lt;br /&gt;
-'''title:''': Titulo de la acción que se muestra en el panel superior (componente TopList).&lt;br /&gt;
&lt;br /&gt;
-'''actionId:''' Nombre identificador de la acción en el servidor (en el ejemplo, &amp;quot;AccionN&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
-'''overlay:''' ''Overlay'' que se despliega al seleccionar la acción en la app (si esta requiere cierto parámetro), esta función lleva como parámetro &amp;quot;''editOverlay''&amp;quot; y &amp;quot;''id''&amp;quot;, estos se utilizan cuando se requiere cambiar el parametro de una acción que ya fue seleccionada y se encuentra en el panel inferior (componente BottomList) de la aplicación, como por ejemplo pueden ser segundos en el caso de la acción &amp;quot;Avanzar&amp;quot;, o colores en el caso de &amp;quot;Avanzar hasta obstáculo&amp;quot;. Este parámetro puede ser que no sea necesario, como es en el caso de la acción &amp;quot;Avanzar hasta obstáculo&amp;quot;, en este ultimo caso el valor de este campo es ''null''.&lt;br /&gt;
&lt;br /&gt;
Ejemplo de la acción &amp;quot;Avanzar&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Screenshot from 2021-06-27 04-18-42.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ejemplo de la acción &amp;quot;Avanzar hasta obstáculo&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Screenshot_from_2021-06-27_00-28-32.png]]&lt;br /&gt;
&lt;br /&gt;
== Manual de uso de la aplicación ==&lt;br /&gt;
&lt;br /&gt;
Aunque la aplicación resulta intuitiva y fácil de usar se describe a continuación una serie de pasos para utilizarla correctamente.&lt;br /&gt;
&lt;br /&gt;
Para comenzar a utilizar la aplicación es necesario configurar la conexión de la aplicación con el servidor (recordar que ambos se deben encontrar ejecutándose en la misma red local), el servidor ejecutando en una computadora que esté conectada correctamente al butiá (con los sensores descritos anteriormente) y la aplicación ejecutándose en el celular.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Conectando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego que la conexión haya resultado exitosa, nos encontramos en la pantalla principal. En el panel superior, como se muestra a continuación, se encuentran las aplicaciones disponibles que podemos ejecutar en el robot butiá.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Acciones.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para agregar una serie de acciones al robot, simplemente presionamos la que queramos, a continuación esta aparecerá en el panel inferior, a medida de que vayamos seleccionando acciones, estas se irán encadenando una tras otras, estas estarán prontas para ejecutarse secuencialmente, desde la parte inferior, a la parte superior, en el momento que presionemos el botón &amp;quot;Empezar&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Agregando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Como la aplicación está pensada para planificar algoritmos para resolver desafíos o ''puzzles'', es probable que nos equivoquemos y seleccionemos una acción o insertemos un parámetro incorrectamente, ¡pero no te preocupes!. Para editar el parámetro que le hayamos ingresado a una acción, simplemente mantenemos pulsado la que deseamos corregir e ingresamos el nuevo valor.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Editando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
También es posible eliminar una acción, para hacer esto, nuevamente mantenemos pulsada la acción que queremos eliminar, pero esta vez, seleccionamos la acción eliminar. A continuación la acción seleccionada desaparecerá del panel inferior. También es posible que deseemos eliminar todas las acciones que habíamos ingresado, en este caso seleccionamos el botón &amp;quot;Eliminar acciones&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Eliminando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es posible que queremos que el robot se desplace a ciertas velocidades, teniendo en cuenta que al modificar la velocidad, el robot tendrá un comportamiento totalmente diferente, debido a que gran parte de las acciones se ejecutan por un tiempo asignado, a mayor velocidad, más desplazamiento.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Velocidad.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En caso de que exista un error en la conexión, podemos intentar volver a conectar la aplicación al servidor, para esto seleccionamos la opción configuración.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:A configuracion.gif]]&lt;br /&gt;
&lt;br /&gt;
== Mejoras a futuro ==&lt;br /&gt;
&lt;br /&gt;
* Implementar una forma para que las función ''' Accion1 ''' pueda recibir parámetros, para así ampliar la gama de problemas que se puedan solucionar a través de esta aplicación.&lt;br /&gt;
&lt;br /&gt;
* Implementación de código que permita añadir a través del código, una mayor cantidad de funciones genéricas a la aplicación.&lt;br /&gt;
&lt;br /&gt;
* Desarrollar una forma de comunicación bilateral entre la ''App Mobile'' y Python para mejorar el ''debug'' en tiempo de ejecución.&lt;br /&gt;
&lt;br /&gt;
== Archivos de uso ==&lt;br /&gt;
&lt;br /&gt;
- [[Archivo:Server Code.zip]]&lt;br /&gt;
&lt;br /&gt;
- [[Archivo:App Code.zip]]&lt;br /&gt;
&lt;br /&gt;
- [[Archivo:Apk app.zip ]]&lt;/div&gt;</summary>
		<author><name>German.moreira</name></author>	</entry>

	<entry>
		<id>http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Archivo:App_Code.zip&amp;diff=11731</id>
		<title>Archivo:App Code.zip</title>
		<link rel="alternate" type="text/html" href="http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Archivo:App_Code.zip&amp;diff=11731"/>
				<updated>2021-06-28T02:46:58Z</updated>
		
		<summary type="html">&lt;p&gt;German.moreira: German.moreira subió una nueva versión de Archivo:App Code.zip&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>German.moreira</name></author>	</entry>

	<entry>
		<id>http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Archivo:App_Code.zip&amp;diff=11729</id>
		<title>Archivo:App Code.zip</title>
		<link rel="alternate" type="text/html" href="http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Archivo:App_Code.zip&amp;diff=11729"/>
				<updated>2021-06-28T02:42:42Z</updated>
		
		<summary type="html">&lt;p&gt;German.moreira: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>German.moreira</name></author>	</entry>

	<entry>
		<id>http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Programando_el_Butia_desde_el_celular&amp;diff=11713</id>
		<title>Programando el Butia desde el celular</title>
		<link rel="alternate" type="text/html" href="http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Programando_el_Butia_desde_el_celular&amp;diff=11713"/>
				<updated>2021-06-28T01:58:34Z</updated>
		
		<summary type="html">&lt;p&gt;German.moreira: /* Implementación código React */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Introducción ==&lt;br /&gt;
&lt;br /&gt;
La idea del proyecto en un principio era usar el celular como medio para controlar el robot Butiá para que resulte más atractivo para los estudiantes que no les guste la programación.&lt;br /&gt;
&lt;br /&gt;
Luego, la idea se modifico un poco debido a que descubrimos que con esta implementación, podíamos hacer mas sencilla la resolución de algunos ejercicios básicos mediante algoritmos mas simplificados, tomamos el trabajo que teníamos hecho hasta el momento y lo adaptamos a un menú con distintas acciones simples como avanzar un determinado tiempo, avanzar hasta chocar contra un objeto o rotar a la izquierda o derecha un determinado tiempo.&lt;br /&gt;
&lt;br /&gt;
Estas funciones básicas y bastante sencillas de entender más una interfaz amigable y fácil de usar, se implementaron para que el rango de edad de uso de esta aplicación vaya de 3 años en adelante.&lt;br /&gt;
&lt;br /&gt;
Como resultado obtuvimos una aplicación que se puede usar para que niños de:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- 4 / 5 / 6 años resuelvan ejercicios sencillos como puede ser llegar de un punto a otro, buscar el camino a un objeto o resolver un laberinto sencillo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- 7 / 8 / 9 años puedan resolver ejercicios un poco más complejos como puede ser resolver un laberinto del más sencillo al mas complejo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- 10 años en adelante tengan la capacidad de adaptar una parte personal de código al programa y puedan resolver cualquier ejercicio que se pueda plantear con el robot Butiá.&lt;br /&gt;
&lt;br /&gt;
== Objetivo y motivación==&lt;br /&gt;
&lt;br /&gt;
Los objetivos del proyecto eran, como dice el nombre, poder conectar remotamente el robot Butiá a un celular y buscar una abstracción de la mayor cantidad de problemas que puedan ser resueltos con el robot Butiá.&lt;br /&gt;
&lt;br /&gt;
Esto, para poder crear un método de uso del robot Butiá más dinámico y con funciones que permiten realizar, mediante algoritmos mas sencillos, la solución de la mayor cantidad de puzles particulares, abstrayéndose de la programación directa, lo que puede ser tedioso o abrumador para personas que tienen su primer acercamiento a la programación.&lt;br /&gt;
&lt;br /&gt;
Al hacer esto, el nivel de uso en aulas del robot Butiá, puede simplificarse hasta clases desde 3 años de jardinera en adelante, debido a que la aplicación simplifica la parte de codificación y los algoritmos de solución de ejercicios se convierten simplemente en una serie de pasos básicos a ejecutar linealmente.&lt;br /&gt;
&lt;br /&gt;
Lo que se busca con este proyecto, es despertar la curiosidad e interés en niños y adolescentes en el área de la programación de una forma didáctica, en donde estos pueden experimentar directamente con el robot y potenciar la creatividad para resolver problemas. &lt;br /&gt;
&lt;br /&gt;
La aplicación esta inspirada en el lenguaje &amp;quot;Sratch&amp;quot;, el cual es un lenguaje ideal para los primeros acercamientos a la programación. &lt;br /&gt;
&lt;br /&gt;
Este ''software'' permite ademas, introducir conceptos como, instrucciones, secuencialidad de código, algoritmos, secuencias de control, estructuras de repetición, etc. Como ejercicio, se puede plantear por ejemplo, hacer el pasaje a Python de algoritmos diseñados en la aplicación.&lt;br /&gt;
&lt;br /&gt;
== Armado del Butiá ==&lt;br /&gt;
&lt;br /&gt;
* Paso 1: Armar el Butiá a partir de esta [https://www.fing.edu.uy/inco/proyectos/butia/files/docs_butia2/armando_paso_a_paso_motores_CC_rev1.pdf guía oficial]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Paso 2: Instalar el sensor de grises&lt;br /&gt;
&lt;br /&gt;
1:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP1.jpeg]] &lt;br /&gt;
&lt;br /&gt;
2:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP2.jpeg]]&lt;br /&gt;
&lt;br /&gt;
3:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP3.jpeg]]&lt;br /&gt;
&lt;br /&gt;
4:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP4.jpeg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Paso 3: Instalar el sensor de distancia&lt;br /&gt;
&lt;br /&gt;
1:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP1.png]]&lt;br /&gt;
&lt;br /&gt;
2:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP2.png]]&lt;br /&gt;
&lt;br /&gt;
3:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP3.png]]&lt;br /&gt;
&lt;br /&gt;
4:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP4.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Observación''': Es indispensable que los componentes del robot se encuentren en condiciones optimas para que este tenga el comportamiento deseado al momento de ejecutar las acciones enviadas desde la app. Esto incluye a los motores, debido a que una diferencia de comportamiento entre estos no permitiría por ejemplo, que el robot se desplace en linea recta.&lt;br /&gt;
&lt;br /&gt;
== Protocolo de comunicación ==&lt;br /&gt;
El protocolo de comunicaron diseñado para la comunicación entre Servidor y Aplicación ''Mobile'' es el siguiente:&lt;br /&gt;
&lt;br /&gt;
'''''Accion0-S0\nAccion1-S1\nAccion2-S2\nAccion3\nAccion4-S4\nVelocidad'''''&lt;br /&gt;
&lt;br /&gt;
Donde, este ''string'' representa la serie encadenada de acciones que el servidor recibe para ejecutar en el robot desde la aplicación por medio de un ''WebSocket'' (socket que utiliza protocolo http).&lt;br /&gt;
Cada acción esta separada de la que se encuentra a continuación por el símbolo &amp;quot;''\n''&amp;quot;.&lt;br /&gt;
Podemos diferenciar dos tipos de acciones, las que requieren parámetro y las que no, estas se comunican de la siguiente forma:&lt;br /&gt;
&lt;br /&gt;
'''-Acción con parámetro''': NombreAccion-Parametro&lt;br /&gt;
&lt;br /&gt;
'''-Acción sin parámetro''': NombreAccion&lt;br /&gt;
&lt;br /&gt;
== Implementación código Python ==&lt;br /&gt;
&lt;br /&gt;
Antes de empezar a programar o usar el código, es necesario instalar las librerías a usar, esto se puede hacer escribiendo &lt;br /&gt;
&lt;br /&gt;
'''''pip install [nombre de la librería]''''' en el interprete de comandos del sistema.&lt;br /&gt;
&lt;br /&gt;
Entonces instalamos la librería a utilizar, en este caso:&lt;br /&gt;
&lt;br /&gt;
'''''pip install simple_websocket_server'''''&lt;br /&gt;
&lt;br /&gt;
Una vez instalada la librería, hay que empezar a escribir el código.&lt;br /&gt;
&lt;br /&gt;
El encabezado del código es el siguiente&lt;br /&gt;
El uso de cada librería se explica con detalle mas adelante&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Encabezado.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A partir de la librería '''sys''' se define el camino del sistema para utilizar los plugin Butiá.&lt;br /&gt;
En nuestro caso, la ruta es ''' '/home/trerb/TurtleBots.activity/plugins/butia' ''', eso se tiene que modificar dependiendo de donde se encuentren el directorio ''' TurtleBots.activity/ ''' en su sistema de archivos&lt;br /&gt;
&lt;br /&gt;
[[Archivo:UsoPluginButia.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego se encuentra la función ''' clearConsole ''',&lt;br /&gt;
Esta función sirve únicamente para limpiar el interprete de Python usando la librería ''' os ''' y tener una ejecución mas limpia&lt;br /&gt;
&lt;br /&gt;
[[Archivo:clearConsole().png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
El siguiente código utiliza la librería ''' socket ''' para conectarse a la web y preguntar la ip del ordenador que ejecuta el archivo y la muestra en pantalla, esto se usa para facilitar la conexión con la App Mobile&lt;br /&gt;
&lt;br /&gt;
[[Archivo:conexionSocket.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Las siguientes líneas de código preguntan al usuario que puerto va a utilizar para la conexión, este código verifica que se ingrese un dato numérico, dentro del rango de los puertos, y que el puerto este disponible.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:tryPuerto.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego se declaran las variables: ''' Speed, Puerto_Gris y Puerto_Distancia ''', se verifica que los sensores de distancia y de grises estén conectados y asigna el puerto en el que estén conectados a las variables ''' Puerto_Distancia ''' y ''' Puerto_Gris ''' respectivamente. La variable ''' Speed ''' es una variable global que se lee al inicio de cada cadena de acciones y la utiliza para todos los movimientos del Butiá de esa cadena.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:declaracionVariables.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Seguimos con la declaración de las funciones básicas del Butiá, en este caso son ''' Avanzar, Rotar, AvanzarHastaVerColor y AvanzarHastaObstaculo ''' &lt;br /&gt;
&lt;br /&gt;
-La función ''' Avanzar ''' recibe un parámetro de tiempo y el Butiá avanza ese determinado tiempo.&lt;br /&gt;
&lt;br /&gt;
-La función ''' Retroceder ''' recibe un parámetro de tiempo y el Butiá retrocede ese determinado tiempo.&lt;br /&gt;
&lt;br /&gt;
-La función ''' Rotar ''' recibe dos parámetros, una dirección que puede ser Izquierda o Derecha y un tiempo que indica la duración de la rotación del Butiá.&lt;br /&gt;
&lt;br /&gt;
-La función ''' AvanzarHastaVerColor ''' recibe un parámetro que varia entre Blanco o Negro, el robot va a avanzar hasta detectar el color seleccionado.&lt;br /&gt;
Esta función solo se puede usar si el sensor de grises esta conectado.&lt;br /&gt;
&lt;br /&gt;
-Por ultimo, la función ''' AvanzarHastaObstaculo ''' no recibe parámetros, en este caso el Butiá va a avanzar hasta estar a unos pocos centímetros de un obstáculo.&lt;br /&gt;
Esta función solo se puede usar si el sensor de distancia esta conectado.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:FuncionesBasicas.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego se encuentra una función ''' Accion1 ''' esta función la puede definir el usuario a gusto, se puede implementar desde una función básica hasta un seguidor de líneas avanzado. La única condición que se necesita para implementar esta ''' Accion1 ''' es que no puede recibir parámetros&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Accion1.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ahora tenemos que definir el menú principal del programa, este se divide en dos funciones&lt;br /&gt;
&lt;br /&gt;
- ''' handle ''': Esta es una función predeterminada de la librería ''' simple_web_socket ''' y se llama cada vez que el servidor recibe un dato del cliente. En este caso la función crea una lista de las acciones que le llegan de la App Mobile, y las va ejecutando ordenadamente&lt;br /&gt;
&lt;br /&gt;
- ''' handle_close ''': Al igual que la función anterior, esta también es una función predeterminada de la librería ''' simple_web_socket ''' y se llama cuando el cliente se desconecta del servidor&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Screenshot from 2021-06-27 03-58-56.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Y por ultimo tenemos el dos líneas de codigo, la primera se encarga de abrir el servidor y la segunda lo mantiene abierto infinitamente&lt;br /&gt;
&lt;br /&gt;
[[Archivo:abrirServidor.png]]&lt;br /&gt;
&lt;br /&gt;
== Implementación código React ==&lt;br /&gt;
&lt;br /&gt;
La aplicación ''mobile'' esta implementada con React Native, ademas, se utiliza el ''framework'' [https://docs.expo.io/ Expo]. Este ''framework'' nos brinda un conjunto de herramientas que facilita el desarrollo de aplicaciones ''mobile''. &lt;br /&gt;
En caso de querer agregar, o modificar cualidades, es necesario proceder de la siguiente forma:&lt;br /&gt;
&lt;br /&gt;
Descargar el archivo comprimido adjunto.&lt;br /&gt;
&lt;br /&gt;
Extraerlo, posicionarse en el directorio raiz de la carpeta descomprimida, y ejecutar desde la terminal lo siguiente (tener en cuenta que es necesario tener en la maquina, el gestor de paquetes [https://docs.npmjs.com/ npm]).&lt;br /&gt;
&lt;br /&gt;
''''npm install'''' &lt;br /&gt;
&lt;br /&gt;
Esto descarga las dependencias que utiliza la aplicación, luego de esto podemos empezar a desarrollar.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para visualizar los cambios en tiempo real mientras desarrollamos, es necesario instalar la aplicación Expo Go para [https://play.google.com/store/apps/details?id=host.exp.exponent&amp;amp;hl=es_UY&amp;amp;gl=US Android] o para [https://apps.apple.com/es/app/expo-go/id982107779 iOS] según sea el caso.&lt;br /&gt;
&lt;br /&gt;
Para a visualizar la app en desarrollo desde Expo Go, procedemos de la siguiente forma:&lt;br /&gt;
Desde el directorio raíz de la aplicación ejecutamos desde la terminal lo siguiente:&lt;br /&gt;
&lt;br /&gt;
''''npm start''''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego, desde la aplicación Expo Go, con el celular conectado en la misma red local accedemos a la aplicación seleccionando lo siguiente:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Expo.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hecho esto, podemos cambiar el código de la aplicación y ver reflejados los cambios de forma casi instantánea.&lt;br /&gt;
&lt;br /&gt;
La aplicación esta compuesta por dos pantallas, la pantalla de configuración (''ConfigScreen.js''), donde se ingresa la dirección ip y puerto del servidor, y la pantalla principal (''MainScreen.js''), donde se lleva a cabo la programación del robot mediante acciones.&lt;br /&gt;
&lt;br /&gt;
Esta ultima pantalla esta compuesta por los componentes ''TopList.js'' y ''BottomList.js''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Untitled presentation.png]]&lt;br /&gt;
&lt;br /&gt;
Para agregar una nueva accion al sistema, es necesario programarla en el servidor con un determinado nombre, supondremos &amp;quot;AccionN&amp;quot;, esto resulta fácil si se toma como ejemplo las acciones ya implementadas.&lt;br /&gt;
&lt;br /&gt;
En la aplicación, esta nueva acción se agrega en el ''array'' &amp;quot;''actionsData''&amp;quot;, dicho ''array'' se encuentra en la pantalla principal, es decir en el archivo &amp;quot;''MainScreen.js''&amp;quot;, cada acción cuenta con los siguientes datos:&lt;br /&gt;
&lt;br /&gt;
-'''idAccion:''' Identificador (indice) de la acción en dicho arreglo (actionsData). Esto permite identificar a la acción y hacer referencia a su ''overlay'' cuando se requiere modificar un parámetro de la accion en la app.&lt;br /&gt;
&lt;br /&gt;
-'''title:''': Titulo de la acción que se muestra en el panel superior (componente TopList).&lt;br /&gt;
&lt;br /&gt;
-'''actionId:''' Nombre identificador de la acción en el servidor (en el ejemplo, &amp;quot;AccionN&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
-'''overlay:''' ''Overlay'' que se despliega al seleccionar la acción en la app (si esta requiere cierto parámetro), esta función lleva como parámetro &amp;quot;''editOverlay''&amp;quot; y &amp;quot;''id''&amp;quot;, estos se utilizan cuando se requiere cambiar el parametro de una acción que ya fue seleccionada y se encuentra en el panel inferior (componente BottomList) de la aplicación, como por ejemplo pueden ser segundos en el caso de la acción &amp;quot;Avanzar&amp;quot;, o colores en el caso de &amp;quot;Avanzar hasta obstáculo&amp;quot;. Este parámetro puede ser que no sea necesario, como es en el caso de la acción &amp;quot;Avanzar hasta obstáculo&amp;quot;, en este ultimo caso el valor de este campo es ''null''.&lt;br /&gt;
&lt;br /&gt;
Ejemplo de la acción &amp;quot;Avanzar&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Screenshot from 2021-06-27 04-18-42.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ejemplo de la acción &amp;quot;Avanzar hasta obstáculo&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Screenshot_from_2021-06-27_00-28-32.png]]&lt;br /&gt;
&lt;br /&gt;
== Manual de uso de la aplicación ==&lt;br /&gt;
&lt;br /&gt;
Aunque la aplicación resulta intuitiva y fácil de usar se describe a continuación una serie de pasos para utilizarla correctamente.&lt;br /&gt;
&lt;br /&gt;
Para comenzar a utilizar la aplicación es necesario configurar la conexión de la aplicación con el servidor (recordar que ambos se deben encontrar ejecutándose en la misma red local), el servidor ejecutando en una computadora que esté conectada correctamente al butiá (con los sensores descritos anteriormente) y la aplicación ejecutándose en el celular.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Conectando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego que la conexión haya resultado exitosa, nos encontramos en la pantalla principal. En el panel superior, como se muestra a continuación, se encuentran las aplicaciones disponibles que podemos ejecutar en el robot butiá.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Acciones.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para agregar una serie de acciones al robot, simplemente presionamos la que queramos, a continuación esta aparecerá en el panel inferior, a medida de que vayamos seleccionando acciones, estas se irán encadenando una tras otras, estas estarán prontas para ejecutarse secuencialmente, desde la parte inferior, a la parte superior, en el momento que presionemos el botón &amp;quot;Empezar&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Agregando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Como la aplicación está pensada para planificar algoritmos para resolver desafíos o ''puzzles'', es probable que nos equivoquemos y seleccionemos una acción o insertemos un parámetro incorrectamente, ¡pero no te preocupes!. Para editar el parámetro que le hayamos ingresado a una acción, simplemente mantenemos pulsado la que deseamos corregir e ingresamos el nuevo valor.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Editando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
También es posible eliminar una acción, para hacer esto, nuevamente mantenemos pulsada la acción que queremos eliminar, pero esta vez, seleccionamos la acción eliminar. A continuación la acción seleccionada desaparecerá del panel inferior. También es posible que deseemos eliminar todas las acciones que habíamos ingresado, en este caso seleccionamos el botón &amp;quot;Eliminar acciones&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Eliminando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es posible que queremos que el robot se desplace a ciertas velocidades, teniendo en cuenta que al modificar la velocidad, el robot tendrá un comportamiento totalmente diferente, debido a que gran parte de las acciones se ejecutan por un tiempo asignado, a mayor velocidad, más desplazamiento.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Velocidad.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En caso de que exista un error en la conexión, podemos intentar volver a conectar la aplicación al servidor, para esto seleccionamos la opción configuración.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:A configuracion.gif]]&lt;br /&gt;
&lt;br /&gt;
== Mejoras a futuro ==&lt;br /&gt;
&lt;br /&gt;
* Implementar una forma para que las función ''' Accion1 ''' pueda recibir parámetros, para así ampliar la gama de problemas que se puedan solucionar a través de esta aplicación.&lt;br /&gt;
&lt;br /&gt;
* Implementación de código que permita añadir a través del código, una mayor cantidad de funciones genéricas a la aplicación.&lt;br /&gt;
&lt;br /&gt;
* Desarrollar una forma de comunicación bilateral entre la ''App Mobile'' y Python para mejorar el ''debug'' en tiempo de ejecución.&lt;br /&gt;
&lt;br /&gt;
== Archivos de uso ==&lt;br /&gt;
&lt;br /&gt;
- [[Archivo:Server Code.zip]]&lt;br /&gt;
&lt;br /&gt;
- [[Archivo:App code.zip]]&lt;br /&gt;
&lt;br /&gt;
- [[Archivo:Apk app.zip ]]&lt;/div&gt;</summary>
		<author><name>German.moreira</name></author>	</entry>

	<entry>
		<id>http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Programando_el_Butia_desde_el_celular&amp;diff=11712</id>
		<title>Programando el Butia desde el celular</title>
		<link rel="alternate" type="text/html" href="http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Programando_el_Butia_desde_el_celular&amp;diff=11712"/>
				<updated>2021-06-28T01:57:49Z</updated>
		
		<summary type="html">&lt;p&gt;German.moreira: /* Implementación código React */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Introducción ==&lt;br /&gt;
&lt;br /&gt;
La idea del proyecto en un principio era usar el celular como medio para controlar el robot Butiá para que resulte más atractivo para los estudiantes que no les guste la programación.&lt;br /&gt;
&lt;br /&gt;
Luego, la idea se modifico un poco debido a que descubrimos que con esta implementación, podíamos hacer mas sencilla la resolución de algunos ejercicios básicos mediante algoritmos mas simplificados, tomamos el trabajo que teníamos hecho hasta el momento y lo adaptamos a un menú con distintas acciones simples como avanzar un determinado tiempo, avanzar hasta chocar contra un objeto o rotar a la izquierda o derecha un determinado tiempo.&lt;br /&gt;
&lt;br /&gt;
Estas funciones básicas y bastante sencillas de entender más una interfaz amigable y fácil de usar, se implementaron para que el rango de edad de uso de esta aplicación vaya de 3 años en adelante.&lt;br /&gt;
&lt;br /&gt;
Como resultado obtuvimos una aplicación que se puede usar para que niños de:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- 4 / 5 / 6 años resuelvan ejercicios sencillos como puede ser llegar de un punto a otro, buscar el camino a un objeto o resolver un laberinto sencillo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- 7 / 8 / 9 años puedan resolver ejercicios un poco más complejos como puede ser resolver un laberinto del más sencillo al mas complejo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- 10 años en adelante tengan la capacidad de adaptar una parte personal de código al programa y puedan resolver cualquier ejercicio que se pueda plantear con el robot Butiá.&lt;br /&gt;
&lt;br /&gt;
== Objetivo y motivación==&lt;br /&gt;
&lt;br /&gt;
Los objetivos del proyecto eran, como dice el nombre, poder conectar remotamente el robot Butiá a un celular y buscar una abstracción de la mayor cantidad de problemas que puedan ser resueltos con el robot Butiá.&lt;br /&gt;
&lt;br /&gt;
Esto, para poder crear un método de uso del robot Butiá más dinámico y con funciones que permiten realizar, mediante algoritmos mas sencillos, la solución de la mayor cantidad de puzles particulares, abstrayéndose de la programación directa, lo que puede ser tedioso o abrumador para personas que tienen su primer acercamiento a la programación.&lt;br /&gt;
&lt;br /&gt;
Al hacer esto, el nivel de uso en aulas del robot Butiá, puede simplificarse hasta clases desde 3 años de jardinera en adelante, debido a que la aplicación simplifica la parte de codificación y los algoritmos de solución de ejercicios se convierten simplemente en una serie de pasos básicos a ejecutar linealmente.&lt;br /&gt;
&lt;br /&gt;
Lo que se busca con este proyecto, es despertar la curiosidad e interés en niños y adolescentes en el área de la programación de una forma didáctica, en donde estos pueden experimentar directamente con el robot y potenciar la creatividad para resolver problemas. &lt;br /&gt;
&lt;br /&gt;
La aplicación esta inspirada en el lenguaje &amp;quot;Sratch&amp;quot;, el cual es un lenguaje ideal para los primeros acercamientos a la programación. &lt;br /&gt;
&lt;br /&gt;
Este ''software'' permite ademas, introducir conceptos como, instrucciones, secuencialidad de código, algoritmos, secuencias de control, estructuras de repetición, etc. Como ejercicio, se puede plantear por ejemplo, hacer el pasaje a Python de algoritmos diseñados en la aplicación.&lt;br /&gt;
&lt;br /&gt;
== Armado del Butiá ==&lt;br /&gt;
&lt;br /&gt;
* Paso 1: Armar el Butiá a partir de esta [https://www.fing.edu.uy/inco/proyectos/butia/files/docs_butia2/armando_paso_a_paso_motores_CC_rev1.pdf guía oficial]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Paso 2: Instalar el sensor de grises&lt;br /&gt;
&lt;br /&gt;
1:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP1.jpeg]] &lt;br /&gt;
&lt;br /&gt;
2:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP2.jpeg]]&lt;br /&gt;
&lt;br /&gt;
3:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP3.jpeg]]&lt;br /&gt;
&lt;br /&gt;
4:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP4.jpeg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Paso 3: Instalar el sensor de distancia&lt;br /&gt;
&lt;br /&gt;
1:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP1.png]]&lt;br /&gt;
&lt;br /&gt;
2:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP2.png]]&lt;br /&gt;
&lt;br /&gt;
3:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP3.png]]&lt;br /&gt;
&lt;br /&gt;
4:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP4.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Observación''': Es indispensable que los componentes del robot se encuentren en condiciones optimas para que este tenga el comportamiento deseado al momento de ejecutar las acciones enviadas desde la app. Esto incluye a los motores, debido a que una diferencia de comportamiento entre estos no permitiría por ejemplo, que el robot se desplace en linea recta.&lt;br /&gt;
&lt;br /&gt;
== Protocolo de comunicación ==&lt;br /&gt;
El protocolo de comunicaron diseñado para la comunicación entre Servidor y Aplicación ''Mobile'' es el siguiente:&lt;br /&gt;
&lt;br /&gt;
'''''Accion0-S0\nAccion1-S1\nAccion2-S2\nAccion3\nAccion4-S4\nVelocidad'''''&lt;br /&gt;
&lt;br /&gt;
Donde, este ''string'' representa la serie encadenada de acciones que el servidor recibe para ejecutar en el robot desde la aplicación por medio de un ''WebSocket'' (socket que utiliza protocolo http).&lt;br /&gt;
Cada acción esta separada de la que se encuentra a continuación por el símbolo &amp;quot;''\n''&amp;quot;.&lt;br /&gt;
Podemos diferenciar dos tipos de acciones, las que requieren parámetro y las que no, estas se comunican de la siguiente forma:&lt;br /&gt;
&lt;br /&gt;
'''-Acción con parámetro''': NombreAccion-Parametro&lt;br /&gt;
&lt;br /&gt;
'''-Acción sin parámetro''': NombreAccion&lt;br /&gt;
&lt;br /&gt;
== Implementación código Python ==&lt;br /&gt;
&lt;br /&gt;
Antes de empezar a programar o usar el código, es necesario instalar las librerías a usar, esto se puede hacer escribiendo &lt;br /&gt;
&lt;br /&gt;
'''''pip install [nombre de la librería]''''' en el interprete de comandos del sistema.&lt;br /&gt;
&lt;br /&gt;
Entonces instalamos la librería a utilizar, en este caso:&lt;br /&gt;
&lt;br /&gt;
'''''pip install simple_websocket_server'''''&lt;br /&gt;
&lt;br /&gt;
Una vez instalada la librería, hay que empezar a escribir el código.&lt;br /&gt;
&lt;br /&gt;
El encabezado del código es el siguiente&lt;br /&gt;
El uso de cada librería se explica con detalle mas adelante&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Encabezado.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A partir de la librería '''sys''' se define el camino del sistema para utilizar los plugin Butiá.&lt;br /&gt;
En nuestro caso, la ruta es ''' '/home/trerb/TurtleBots.activity/plugins/butia' ''', eso se tiene que modificar dependiendo de donde se encuentren el directorio ''' TurtleBots.activity/ ''' en su sistema de archivos&lt;br /&gt;
&lt;br /&gt;
[[Archivo:UsoPluginButia.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego se encuentra la función ''' clearConsole ''',&lt;br /&gt;
Esta función sirve únicamente para limpiar el interprete de Python usando la librería ''' os ''' y tener una ejecución mas limpia&lt;br /&gt;
&lt;br /&gt;
[[Archivo:clearConsole().png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
El siguiente código utiliza la librería ''' socket ''' para conectarse a la web y preguntar la ip del ordenador que ejecuta el archivo y la muestra en pantalla, esto se usa para facilitar la conexión con la App Mobile&lt;br /&gt;
&lt;br /&gt;
[[Archivo:conexionSocket.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Las siguientes líneas de código preguntan al usuario que puerto va a utilizar para la conexión, este código verifica que se ingrese un dato numérico, dentro del rango de los puertos, y que el puerto este disponible.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:tryPuerto.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego se declaran las variables: ''' Speed, Puerto_Gris y Puerto_Distancia ''', se verifica que los sensores de distancia y de grises estén conectados y asigna el puerto en el que estén conectados a las variables ''' Puerto_Distancia ''' y ''' Puerto_Gris ''' respectivamente. La variable ''' Speed ''' es una variable global que se lee al inicio de cada cadena de acciones y la utiliza para todos los movimientos del Butiá de esa cadena.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:declaracionVariables.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Seguimos con la declaración de las funciones básicas del Butiá, en este caso son ''' Avanzar, Rotar, AvanzarHastaVerColor y AvanzarHastaObstaculo ''' &lt;br /&gt;
&lt;br /&gt;
-La función ''' Avanzar ''' recibe un parámetro de tiempo y el Butiá avanza ese determinado tiempo.&lt;br /&gt;
&lt;br /&gt;
-La función ''' Retroceder ''' recibe un parámetro de tiempo y el Butiá retrocede ese determinado tiempo.&lt;br /&gt;
&lt;br /&gt;
-La función ''' Rotar ''' recibe dos parámetros, una dirección que puede ser Izquierda o Derecha y un tiempo que indica la duración de la rotación del Butiá.&lt;br /&gt;
&lt;br /&gt;
-La función ''' AvanzarHastaVerColor ''' recibe un parámetro que varia entre Blanco o Negro, el robot va a avanzar hasta detectar el color seleccionado.&lt;br /&gt;
Esta función solo se puede usar si el sensor de grises esta conectado.&lt;br /&gt;
&lt;br /&gt;
-Por ultimo, la función ''' AvanzarHastaObstaculo ''' no recibe parámetros, en este caso el Butiá va a avanzar hasta estar a unos pocos centímetros de un obstáculo.&lt;br /&gt;
Esta función solo se puede usar si el sensor de distancia esta conectado.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:FuncionesBasicas.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego se encuentra una función ''' Accion1 ''' esta función la puede definir el usuario a gusto, se puede implementar desde una función básica hasta un seguidor de líneas avanzado. La única condición que se necesita para implementar esta ''' Accion1 ''' es que no puede recibir parámetros&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Accion1.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ahora tenemos que definir el menú principal del programa, este se divide en dos funciones&lt;br /&gt;
&lt;br /&gt;
- ''' handle ''': Esta es una función predeterminada de la librería ''' simple_web_socket ''' y se llama cada vez que el servidor recibe un dato del cliente. En este caso la función crea una lista de las acciones que le llegan de la App Mobile, y las va ejecutando ordenadamente&lt;br /&gt;
&lt;br /&gt;
- ''' handle_close ''': Al igual que la función anterior, esta también es una función predeterminada de la librería ''' simple_web_socket ''' y se llama cuando el cliente se desconecta del servidor&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Screenshot from 2021-06-27 03-58-56.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Y por ultimo tenemos el dos líneas de codigo, la primera se encarga de abrir el servidor y la segunda lo mantiene abierto infinitamente&lt;br /&gt;
&lt;br /&gt;
[[Archivo:abrirServidor.png]]&lt;br /&gt;
&lt;br /&gt;
== Implementación código React ==&lt;br /&gt;
&lt;br /&gt;
La aplicación ''mobile'' esta implementada con React Native, ademas, se utiliza el ''framework'' [https://docs.expo.io/ Expo]. Este ''framework'' nos brinda un conjunto de herramientas que facilita el desarrollo de aplicaciones ''mobile''. &lt;br /&gt;
En caso de querer agregar, o modificar cualidades, es necesario proceder de la siguiente forma:&lt;br /&gt;
&lt;br /&gt;
Descargar el archivo comprimido adjunto.&lt;br /&gt;
&lt;br /&gt;
Extraerlo, posicionarse en el directorio raiz de la carpeta descomprimida, y ejecutar desde la terminal lo siguiente (tener en cuenta que es necesario tener en la maquina, el gestor de paquetes [https://docs.npmjs.com/ npm]).&lt;br /&gt;
&lt;br /&gt;
''''npm install'''' &lt;br /&gt;
&lt;br /&gt;
Esto descarga las dependencias que utiliza la aplicación, luego de esto podemos empezar a desarrollar.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para visualizar los cambios en tiempo real mientras desarrollamos, es necesario instalar la aplicación Expo Go para [https://play.google.com/store/apps/details?id=host.exp.exponent&amp;amp;hl=es_UY&amp;amp;gl=US Android] o para [https://apps.apple.com/es/app/expo-go/id982107779 iOS] según sea el caso.&lt;br /&gt;
&lt;br /&gt;
Para a visualizar la app en desarrollo desde Expo Go, procedemos de la siguiente forma:&lt;br /&gt;
Desde el directorio raíz de la aplicación ejecutamos desde la terminal lo siguiente:&lt;br /&gt;
&lt;br /&gt;
''''npm start''''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego, desde la aplicación Expo Go, con el celular conectado en la misma red local accedemos a la aplicación seleccionando lo siguiente:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Expo.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hecho esto, podemos cambiar el código de la aplicación y ver reflejados los cambios de forma casi instantánea.&lt;br /&gt;
&lt;br /&gt;
La aplicación esta compuesta por dos pantallas, la pantalla de configuración (''ConfigScreen.js''), donde se ingresa la dirección ip y puerto del servidor, y la pantalla principal (''MainScreen.js''), donde se lleva a cabo la programación del robot mediante acciones.&lt;br /&gt;
&lt;br /&gt;
Esta ultima pantalla esta compuesta por los componentes ''TopList.js'' y ''BottomList.js''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Untitled presentation.png]]&lt;br /&gt;
&lt;br /&gt;
Para agregar una nueva accion al sistema, es necesario programarla en el servidor con un determinado nombre, supondremos &amp;quot;AccionN&amp;quot;, esto resulta fácil si se toma como ejemplo las acciones ya implementadas.&lt;br /&gt;
&lt;br /&gt;
En la aplicación, esta nueva acción se agrega en el ''array'' &amp;quot;''actionsData''&amp;quot;, dicho ''array'' se encuentra en la pantalla principal, es decir en el archivo &amp;quot;''MainScreen.js''&amp;quot;, cada acción cuenta con los siguientes datos:&lt;br /&gt;
&lt;br /&gt;
-'''idAccion:''' Identificador (indice) de la acción en dicho arreglo (actionsData). Esto permite identificar a la acción y hacer referencia a su ''overlay'' cuando se requiere modificar un parámetro de la accion en la app.&lt;br /&gt;
&lt;br /&gt;
-'''title:''': Titulo de la acción que se muestra en el panel superior (TopList).&lt;br /&gt;
&lt;br /&gt;
-'''actionId:''' Nombre identificador de la acción en el servidor (en el ejemplo, &amp;quot;AccionN&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
-'''overlay:''' ''Overlay'' que se despliega al seleccionar la acción en la app (si esta requiere cierto parámetro), esta función lleva como parámetro &amp;quot;''editOverlay''&amp;quot; y &amp;quot;''id''&amp;quot;, estos se utilizan cuando se requiere cambiar el parametro de una acción que ya fue seleccionada y se encuentra en el panel inferior (BottomList) de la aplicación, como por ejemplo pueden ser segundos en el caso de la acción &amp;quot;Avanzar&amp;quot;, o colores en el caso de &amp;quot;Avanzar hasta obstáculo&amp;quot;. Este parámetro puede ser que no sea necesario, como es en el caso de la acción &amp;quot;Avanzar hasta obstáculo&amp;quot;, en este ultimo caso el valor de este campo es ''null''.&lt;br /&gt;
&lt;br /&gt;
Ejemplo de la acción &amp;quot;Avanzar&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Screenshot from 2021-06-27 04-18-42.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ejemplo de la acción &amp;quot;Avanzar hasta obstáculo&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Screenshot_from_2021-06-27_00-28-32.png]]&lt;br /&gt;
&lt;br /&gt;
== Manual de uso de la aplicación ==&lt;br /&gt;
&lt;br /&gt;
Aunque la aplicación resulta intuitiva y fácil de usar se describe a continuación una serie de pasos para utilizarla correctamente.&lt;br /&gt;
&lt;br /&gt;
Para comenzar a utilizar la aplicación es necesario configurar la conexión de la aplicación con el servidor (recordar que ambos se deben encontrar ejecutándose en la misma red local), el servidor ejecutando en una computadora que esté conectada correctamente al butiá (con los sensores descritos anteriormente) y la aplicación ejecutándose en el celular.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Conectando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego que la conexión haya resultado exitosa, nos encontramos en la pantalla principal. En el panel superior, como se muestra a continuación, se encuentran las aplicaciones disponibles que podemos ejecutar en el robot butiá.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Acciones.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para agregar una serie de acciones al robot, simplemente presionamos la que queramos, a continuación esta aparecerá en el panel inferior, a medida de que vayamos seleccionando acciones, estas se irán encadenando una tras otras, estas estarán prontas para ejecutarse secuencialmente, desde la parte inferior, a la parte superior, en el momento que presionemos el botón &amp;quot;Empezar&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Agregando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Como la aplicación está pensada para planificar algoritmos para resolver desafíos o ''puzzles'', es probable que nos equivoquemos y seleccionemos una acción o insertemos un parámetro incorrectamente, ¡pero no te preocupes!. Para editar el parámetro que le hayamos ingresado a una acción, simplemente mantenemos pulsado la que deseamos corregir e ingresamos el nuevo valor.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Editando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
También es posible eliminar una acción, para hacer esto, nuevamente mantenemos pulsada la acción que queremos eliminar, pero esta vez, seleccionamos la acción eliminar. A continuación la acción seleccionada desaparecerá del panel inferior. También es posible que deseemos eliminar todas las acciones que habíamos ingresado, en este caso seleccionamos el botón &amp;quot;Eliminar acciones&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Eliminando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es posible que queremos que el robot se desplace a ciertas velocidades, teniendo en cuenta que al modificar la velocidad, el robot tendrá un comportamiento totalmente diferente, debido a que gran parte de las acciones se ejecutan por un tiempo asignado, a mayor velocidad, más desplazamiento.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Velocidad.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En caso de que exista un error en la conexión, podemos intentar volver a conectar la aplicación al servidor, para esto seleccionamos la opción configuración.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:A configuracion.gif]]&lt;br /&gt;
&lt;br /&gt;
== Mejoras a futuro ==&lt;br /&gt;
&lt;br /&gt;
* Implementar una forma para que las función ''' Accion1 ''' pueda recibir parámetros, para así ampliar la gama de problemas que se puedan solucionar a través de esta aplicación.&lt;br /&gt;
&lt;br /&gt;
* Implementación de código que permita añadir a través del código, una mayor cantidad de funciones genéricas a la aplicación.&lt;br /&gt;
&lt;br /&gt;
* Desarrollar una forma de comunicación bilateral entre la ''App Mobile'' y Python para mejorar el ''debug'' en tiempo de ejecución.&lt;br /&gt;
&lt;br /&gt;
== Archivos de uso ==&lt;br /&gt;
&lt;br /&gt;
- [[Archivo:Server Code.zip]]&lt;br /&gt;
&lt;br /&gt;
- [[Archivo:App code.zip]]&lt;br /&gt;
&lt;br /&gt;
- [[Archivo:Apk app.zip ]]&lt;/div&gt;</summary>
		<author><name>German.moreira</name></author>	</entry>

	<entry>
		<id>http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Archivo:Untitsled_presentation.png&amp;diff=11711</id>
		<title>Archivo:Untitsled presentation.png</title>
		<link rel="alternate" type="text/html" href="http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Archivo:Untitsled_presentation.png&amp;diff=11711"/>
				<updated>2021-06-28T01:56:33Z</updated>
		
		<summary type="html">&lt;p&gt;German.moreira: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>German.moreira</name></author>	</entry>

	<entry>
		<id>http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Programando_el_Butia_desde_el_celular&amp;diff=11710</id>
		<title>Programando el Butia desde el celular</title>
		<link rel="alternate" type="text/html" href="http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Programando_el_Butia_desde_el_celular&amp;diff=11710"/>
				<updated>2021-06-28T01:52:40Z</updated>
		
		<summary type="html">&lt;p&gt;German.moreira: /* Implementación código React */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Introducción ==&lt;br /&gt;
&lt;br /&gt;
La idea del proyecto en un principio era usar el celular como medio para controlar el robot Butiá para que resulte más atractivo para los estudiantes que no les guste la programación.&lt;br /&gt;
&lt;br /&gt;
Luego, la idea se modifico un poco debido a que descubrimos que con esta implementación, podíamos hacer mas sencilla la resolución de algunos ejercicios básicos mediante algoritmos mas simplificados, tomamos el trabajo que teníamos hecho hasta el momento y lo adaptamos a un menú con distintas acciones simples como avanzar un determinado tiempo, avanzar hasta chocar contra un objeto o rotar a la izquierda o derecha un determinado tiempo.&lt;br /&gt;
&lt;br /&gt;
Estas funciones básicas y bastante sencillas de entender más una interfaz amigable y fácil de usar, se implementaron para que el rango de edad de uso de esta aplicación vaya de 3 años en adelante.&lt;br /&gt;
&lt;br /&gt;
Como resultado obtuvimos una aplicación que se puede usar para que niños de:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- 4 / 5 / 6 años resuelvan ejercicios sencillos como puede ser llegar de un punto a otro, buscar el camino a un objeto o resolver un laberinto sencillo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- 7 / 8 / 9 años puedan resolver ejercicios un poco más complejos como puede ser resolver un laberinto del más sencillo al mas complejo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- 10 años en adelante tengan la capacidad de adaptar una parte personal de código al programa y puedan resolver cualquier ejercicio que se pueda plantear con el robot Butiá.&lt;br /&gt;
&lt;br /&gt;
== Objetivo y motivación==&lt;br /&gt;
&lt;br /&gt;
Los objetivos del proyecto eran, como dice el nombre, poder conectar remotamente el robot Butiá a un celular y buscar una abstracción de la mayor cantidad de problemas que puedan ser resueltos con el robot Butiá.&lt;br /&gt;
&lt;br /&gt;
Esto, para poder crear un método de uso del robot Butiá más dinámico y con funciones que permiten realizar, mediante algoritmos mas sencillos, la solución de la mayor cantidad de puzles particulares, abstrayéndose de la programación directa, lo que puede ser tedioso o abrumador para personas que tienen su primer acercamiento a la programación.&lt;br /&gt;
&lt;br /&gt;
Al hacer esto, el nivel de uso en aulas del robot Butiá, puede simplificarse hasta clases desde 3 años de jardinera en adelante, debido a que la aplicación simplifica la parte de codificación y los algoritmos de solución de ejercicios se convierten simplemente en una serie de pasos básicos a ejecutar linealmente.&lt;br /&gt;
&lt;br /&gt;
Lo que se busca con este proyecto, es despertar la curiosidad e interés en niños y adolescentes en el área de la programación de una forma didáctica, en donde estos pueden experimentar directamente con el robot y potenciar la creatividad para resolver problemas. &lt;br /&gt;
&lt;br /&gt;
La aplicación esta inspirada en el lenguaje &amp;quot;Sratch&amp;quot;, el cual es un lenguaje ideal para los primeros acercamientos a la programación. &lt;br /&gt;
&lt;br /&gt;
Este ''software'' permite ademas, introducir conceptos como, instrucciones, secuencialidad de código, algoritmos, secuencias de control, estructuras de repetición, etc. Como ejercicio, se puede plantear por ejemplo, hacer el pasaje a Python de algoritmos diseñados en la aplicación.&lt;br /&gt;
&lt;br /&gt;
== Armado del Butiá ==&lt;br /&gt;
&lt;br /&gt;
* Paso 1: Armar el Butiá a partir de esta [https://www.fing.edu.uy/inco/proyectos/butia/files/docs_butia2/armando_paso_a_paso_motores_CC_rev1.pdf guía oficial]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Paso 2: Instalar el sensor de grises&lt;br /&gt;
&lt;br /&gt;
1:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP1.jpeg]] &lt;br /&gt;
&lt;br /&gt;
2:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP2.jpeg]]&lt;br /&gt;
&lt;br /&gt;
3:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP3.jpeg]]&lt;br /&gt;
&lt;br /&gt;
4:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP4.jpeg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Paso 3: Instalar el sensor de distancia&lt;br /&gt;
&lt;br /&gt;
1:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP1.png]]&lt;br /&gt;
&lt;br /&gt;
2:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP2.png]]&lt;br /&gt;
&lt;br /&gt;
3:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP3.png]]&lt;br /&gt;
&lt;br /&gt;
4:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP4.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Observación''': Es indispensable que los componentes del robot se encuentren en condiciones optimas para que este tenga el comportamiento deseado al momento de ejecutar las acciones enviadas desde la app. Esto incluye a los motores, debido a que una diferencia de comportamiento entre estos no permitiría por ejemplo, que el robot se desplace en linea recta.&lt;br /&gt;
&lt;br /&gt;
== Protocolo de comunicación ==&lt;br /&gt;
El protocolo de comunicaron diseñado para la comunicación entre Servidor y Aplicación ''Mobile'' es el siguiente:&lt;br /&gt;
&lt;br /&gt;
'''''Accion0-S0\nAccion1-S1\nAccion2-S2\nAccion3\nAccion4-S4\nVelocidad'''''&lt;br /&gt;
&lt;br /&gt;
Donde, este ''string'' representa la serie encadenada de acciones que el servidor recibe para ejecutar en el robot desde la aplicación por medio de un ''WebSocket'' (socket que utiliza protocolo http).&lt;br /&gt;
Cada acción esta separada de la que se encuentra a continuación por el símbolo &amp;quot;''\n''&amp;quot;.&lt;br /&gt;
Podemos diferenciar dos tipos de acciones, las que requieren parámetro y las que no, estas se comunican de la siguiente forma:&lt;br /&gt;
&lt;br /&gt;
'''-Acción con parámetro''': NombreAccion-Parametro&lt;br /&gt;
&lt;br /&gt;
'''-Acción sin parámetro''': NombreAccion&lt;br /&gt;
&lt;br /&gt;
== Implementación código Python ==&lt;br /&gt;
&lt;br /&gt;
Antes de empezar a programar o usar el código, es necesario instalar las librerías a usar, esto se puede hacer escribiendo &lt;br /&gt;
&lt;br /&gt;
'''''pip install [nombre de la librería]''''' en el interprete de comandos del sistema.&lt;br /&gt;
&lt;br /&gt;
Entonces instalamos la librería a utilizar, en este caso:&lt;br /&gt;
&lt;br /&gt;
'''''pip install simple_websocket_server'''''&lt;br /&gt;
&lt;br /&gt;
Una vez instalada la librería, hay que empezar a escribir el código.&lt;br /&gt;
&lt;br /&gt;
El encabezado del código es el siguiente&lt;br /&gt;
El uso de cada librería se explica con detalle mas adelante&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Encabezado.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A partir de la librería '''sys''' se define el camino del sistema para utilizar los plugin Butiá.&lt;br /&gt;
En nuestro caso, la ruta es ''' '/home/trerb/TurtleBots.activity/plugins/butia' ''', eso se tiene que modificar dependiendo de donde se encuentren el directorio ''' TurtleBots.activity/ ''' en su sistema de archivos&lt;br /&gt;
&lt;br /&gt;
[[Archivo:UsoPluginButia.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego se encuentra la función ''' clearConsole ''',&lt;br /&gt;
Esta función sirve únicamente para limpiar el interprete de Python usando la librería ''' os ''' y tener una ejecución mas limpia&lt;br /&gt;
&lt;br /&gt;
[[Archivo:clearConsole().png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
El siguiente código utiliza la librería ''' socket ''' para conectarse a la web y preguntar la ip del ordenador que ejecuta el archivo y la muestra en pantalla, esto se usa para facilitar la conexión con la App Mobile&lt;br /&gt;
&lt;br /&gt;
[[Archivo:conexionSocket.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Las siguientes líneas de código preguntan al usuario que puerto va a utilizar para la conexión, este código verifica que se ingrese un dato numérico, dentro del rango de los puertos, y que el puerto este disponible.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:tryPuerto.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego se declaran las variables: ''' Speed, Puerto_Gris y Puerto_Distancia ''', se verifica que los sensores de distancia y de grises estén conectados y asigna el puerto en el que estén conectados a las variables ''' Puerto_Distancia ''' y ''' Puerto_Gris ''' respectivamente. La variable ''' Speed ''' es una variable global que se lee al inicio de cada cadena de acciones y la utiliza para todos los movimientos del Butiá de esa cadena.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:declaracionVariables.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Seguimos con la declaración de las funciones básicas del Butiá, en este caso son ''' Avanzar, Rotar, AvanzarHastaVerColor y AvanzarHastaObstaculo ''' &lt;br /&gt;
&lt;br /&gt;
-La función ''' Avanzar ''' recibe un parámetro de tiempo y el Butiá avanza ese determinado tiempo.&lt;br /&gt;
&lt;br /&gt;
-La función ''' Retroceder ''' recibe un parámetro de tiempo y el Butiá retrocede ese determinado tiempo.&lt;br /&gt;
&lt;br /&gt;
-La función ''' Rotar ''' recibe dos parámetros, una dirección que puede ser Izquierda o Derecha y un tiempo que indica la duración de la rotación del Butiá.&lt;br /&gt;
&lt;br /&gt;
-La función ''' AvanzarHastaVerColor ''' recibe un parámetro que varia entre Blanco o Negro, el robot va a avanzar hasta detectar el color seleccionado.&lt;br /&gt;
Esta función solo se puede usar si el sensor de grises esta conectado.&lt;br /&gt;
&lt;br /&gt;
-Por ultimo, la función ''' AvanzarHastaObstaculo ''' no recibe parámetros, en este caso el Butiá va a avanzar hasta estar a unos pocos centímetros de un obstáculo.&lt;br /&gt;
Esta función solo se puede usar si el sensor de distancia esta conectado.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:FuncionesBasicas.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego se encuentra una función ''' Accion1 ''' esta función la puede definir el usuario a gusto, se puede implementar desde una función básica hasta un seguidor de líneas avanzado. La única condición que se necesita para implementar esta ''' Accion1 ''' es que no puede recibir parámetros&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Accion1.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ahora tenemos que definir el menú principal del programa, este se divide en dos funciones&lt;br /&gt;
&lt;br /&gt;
- ''' handle ''': Esta es una función predeterminada de la librería ''' simple_web_socket ''' y se llama cada vez que el servidor recibe un dato del cliente. En este caso la función crea una lista de las acciones que le llegan de la App Mobile, y las va ejecutando ordenadamente&lt;br /&gt;
&lt;br /&gt;
- ''' handle_close ''': Al igual que la función anterior, esta también es una función predeterminada de la librería ''' simple_web_socket ''' y se llama cuando el cliente se desconecta del servidor&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Screenshot from 2021-06-27 03-58-56.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Y por ultimo tenemos el dos líneas de codigo, la primera se encarga de abrir el servidor y la segunda lo mantiene abierto infinitamente&lt;br /&gt;
&lt;br /&gt;
[[Archivo:abrirServidor.png]]&lt;br /&gt;
&lt;br /&gt;
== Implementación código React ==&lt;br /&gt;
&lt;br /&gt;
La aplicación ''mobile'' esta implementada con React Native, ademas, se utiliza el ''framework'' [https://docs.expo.io/ Expo]. Este ''framework'' nos brinda un conjunto de herramientas que facilita el desarrollo de aplicaciones ''mobile''. &lt;br /&gt;
En caso de querer agregar, o modificar cualidades, es necesario proceder de la siguiente forma:&lt;br /&gt;
&lt;br /&gt;
Descargar el archivo comprimido adjunto.&lt;br /&gt;
&lt;br /&gt;
Extraerlo, posicionarse en el directorio raiz de la carpeta descomprimida, y ejecutar desde la terminal lo siguiente (tener en cuenta que es necesario tener en la maquina, el gestor de paquetes [https://docs.npmjs.com/ npm]).&lt;br /&gt;
&lt;br /&gt;
''''npm install'''' &lt;br /&gt;
&lt;br /&gt;
Esto descarga las dependencias que utiliza la aplicación, luego de esto podemos empezar a desarrollar.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para visualizar los cambios en tiempo real mientras desarrollamos, es necesario instalar la aplicación Expo Go para [https://play.google.com/store/apps/details?id=host.exp.exponent&amp;amp;hl=es_UY&amp;amp;gl=US Android] o para [https://apps.apple.com/es/app/expo-go/id982107779 iOS] según sea el caso.&lt;br /&gt;
&lt;br /&gt;
Para a visualizar la app en desarrollo desde Expo Go, procedemos de la siguiente forma:&lt;br /&gt;
Desde el directorio raíz de la aplicación ejecutamos desde la terminal lo siguiente:&lt;br /&gt;
&lt;br /&gt;
''''npm start''''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego, desde la aplicación Expo Go, con el celular conectado en la misma red local accedemos a la aplicación seleccionando lo siguiente:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Expo.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hecho esto, podemos cambiar el código de la aplicación y ver reflejados los cambios de forma casi instantánea.&lt;br /&gt;
&lt;br /&gt;
La aplicación esta compuesta por dos pantallas, la pantalla de configuración (''ConfigScreen.js''), donde se ingresa la dirección ip y puerto del servidor, y la pantalla principal (''MainScreen.js''), donde se lleva a cabo la programación del robot mediante acciones.&lt;br /&gt;
&lt;br /&gt;
Esta ultima pantalla esta compuesta por los componentes ''TopList.js'' y ''BottomList.js''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Untitled presentation.png]]&lt;br /&gt;
&lt;br /&gt;
Para agregar una nueva accion al sistema, es necesario programarla en el servidor con un determinado nombre, supondremos &amp;quot;AccionN&amp;quot;, esto resulta fácil si se toma como ejemplo las acciones ya implementadas.&lt;br /&gt;
&lt;br /&gt;
En la aplicación, esta nueva acción se agrega en el ''array'' &amp;quot;''actionsData''&amp;quot;, dicho ''array'' se encuentra en la pantalla principal, es decir en el archivo &amp;quot;''MainScreen.js''&amp;quot;, cada acción cuenta con los siguientes datos:&lt;br /&gt;
&lt;br /&gt;
-'''idAccion:''' Identificador (indice) de la acción en dicho arreglo (actionsData). Esto permite identificar a la acción y hacer referencia a su ''overlay'' cuando se requiere modificar un parámetro de la accion en la app.&lt;br /&gt;
&lt;br /&gt;
-'''title:''': Titulo de la acción que se muestra en el panel superior.&lt;br /&gt;
&lt;br /&gt;
-'''actionId:''' Nombre identificador de la acción en el servidor (en el ejemplo, &amp;quot;AccionN&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
-'''overlay:''' ''Overlay'' que se despliega al seleccionar la acción en la app (si esta requiere cierto parámetro), esta función lleva como parámetro &amp;quot;''editOverlay''&amp;quot; y &amp;quot;''id''&amp;quot;, estos se utilizan cuando se requiere cambiar el parametro de una acción que ya fue seleccionada y se encuentra en el panel inferior de la aplicación, como por ejemplo pueden ser segundos en el caso de la acción &amp;quot;Avanzar&amp;quot;, o colores en el caso de &amp;quot;Avanzar hasta obstáculo&amp;quot;. Este parámetro puede ser que no sea necesario, como es en el caso de la acción &amp;quot;Avanzar hasta obstáculo&amp;quot;, en este ultimo caso el valor de este campo es ''null''.&lt;br /&gt;
&lt;br /&gt;
Ejemplo de la acción &amp;quot;Avanzar&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Screenshot from 2021-06-27 04-18-42.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ejemplo de la acción &amp;quot;Avanzar hasta obstáculo&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Screenshot_from_2021-06-27_00-28-32.png]]&lt;br /&gt;
&lt;br /&gt;
== Manual de uso de la aplicación ==&lt;br /&gt;
&lt;br /&gt;
Aunque la aplicación resulta intuitiva y fácil de usar se describe a continuación una serie de pasos para utilizarla correctamente.&lt;br /&gt;
&lt;br /&gt;
Para comenzar a utilizar la aplicación es necesario configurar la conexión de la aplicación con el servidor (recordar que ambos se deben encontrar ejecutándose en la misma red local), el servidor ejecutando en una computadora que esté conectada correctamente al butiá (con los sensores descritos anteriormente) y la aplicación ejecutándose en el celular.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Conectando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego que la conexión haya resultado exitosa, nos encontramos en la pantalla principal. En el panel superior, como se muestra a continuación, se encuentran las aplicaciones disponibles que podemos ejecutar en el robot butiá.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Acciones.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para agregar una serie de acciones al robot, simplemente presionamos la que queramos, a continuación esta aparecerá en el panel inferior, a medida de que vayamos seleccionando acciones, estas se irán encadenando una tras otras, estas estarán prontas para ejecutarse secuencialmente, desde la parte inferior, a la parte superior, en el momento que presionemos el botón &amp;quot;Empezar&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Agregando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Como la aplicación está pensada para planificar algoritmos para resolver desafíos o ''puzzles'', es probable que nos equivoquemos y seleccionemos una acción o insertemos un parámetro incorrectamente, ¡pero no te preocupes!. Para editar el parámetro que le hayamos ingresado a una acción, simplemente mantenemos pulsado la que deseamos corregir e ingresamos el nuevo valor.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Editando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
También es posible eliminar una acción, para hacer esto, nuevamente mantenemos pulsada la acción que queremos eliminar, pero esta vez, seleccionamos la acción eliminar. A continuación la acción seleccionada desaparecerá del panel inferior. También es posible que deseemos eliminar todas las acciones que habíamos ingresado, en este caso seleccionamos el botón &amp;quot;Eliminar acciones&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Eliminando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es posible que queremos que el robot se desplace a ciertas velocidades, teniendo en cuenta que al modificar la velocidad, el robot tendrá un comportamiento totalmente diferente, debido a que gran parte de las acciones se ejecutan por un tiempo asignado, a mayor velocidad, más desplazamiento.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Velocidad.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En caso de que exista un error en la conexión, podemos intentar volver a conectar la aplicación al servidor, para esto seleccionamos la opción configuración.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:A configuracion.gif]]&lt;br /&gt;
&lt;br /&gt;
== Mejoras a futuro ==&lt;br /&gt;
&lt;br /&gt;
* Implementar una forma para que las función ''' Accion1 ''' pueda recibir parámetros, para así ampliar la gama de problemas que se puedan solucionar a través de esta aplicación.&lt;br /&gt;
&lt;br /&gt;
* Implementación de código que permita añadir a través del código, una mayor cantidad de funciones genéricas a la aplicación.&lt;br /&gt;
&lt;br /&gt;
* Desarrollar una forma de comunicación bilateral entre la ''App Mobile'' y Python para mejorar el ''debug'' en tiempo de ejecución.&lt;br /&gt;
&lt;br /&gt;
== Archivos de uso ==&lt;br /&gt;
&lt;br /&gt;
- [[Archivo:Server Code.zip]]&lt;br /&gt;
&lt;br /&gt;
- [[Archivo:App code.zip]]&lt;br /&gt;
&lt;br /&gt;
- [[Archivo:Apk app.zip ]]&lt;/div&gt;</summary>
		<author><name>German.moreira</name></author>	</entry>

	<entry>
		<id>http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Programando_el_Butia_desde_el_celular&amp;diff=11709</id>
		<title>Programando el Butia desde el celular</title>
		<link rel="alternate" type="text/html" href="http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Programando_el_Butia_desde_el_celular&amp;diff=11709"/>
				<updated>2021-06-28T01:49:50Z</updated>
		
		<summary type="html">&lt;p&gt;German.moreira: /* Implementación código React */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Introducción ==&lt;br /&gt;
&lt;br /&gt;
La idea del proyecto en un principio era usar el celular como medio para controlar el robot Butiá para que resulte más atractivo para los estudiantes que no les guste la programación.&lt;br /&gt;
&lt;br /&gt;
Luego, la idea se modifico un poco debido a que descubrimos que con esta implementación, podíamos hacer mas sencilla la resolución de algunos ejercicios básicos mediante algoritmos mas simplificados, tomamos el trabajo que teníamos hecho hasta el momento y lo adaptamos a un menú con distintas acciones simples como avanzar un determinado tiempo, avanzar hasta chocar contra un objeto o rotar a la izquierda o derecha un determinado tiempo.&lt;br /&gt;
&lt;br /&gt;
Estas funciones básicas y bastante sencillas de entender más una interfaz amigable y fácil de usar, se implementaron para que el rango de edad de uso de esta aplicación vaya de 3 años en adelante.&lt;br /&gt;
&lt;br /&gt;
Como resultado obtuvimos una aplicación que se puede usar para que niños de:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- 4 / 5 / 6 años resuelvan ejercicios sencillos como puede ser llegar de un punto a otro, buscar el camino a un objeto o resolver un laberinto sencillo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- 7 / 8 / 9 años puedan resolver ejercicios un poco más complejos como puede ser resolver un laberinto del más sencillo al mas complejo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- 10 años en adelante tengan la capacidad de adaptar una parte personal de código al programa y puedan resolver cualquier ejercicio que se pueda plantear con el robot Butiá.&lt;br /&gt;
&lt;br /&gt;
== Objetivo y motivación==&lt;br /&gt;
&lt;br /&gt;
Los objetivos del proyecto eran, como dice el nombre, poder conectar remotamente el robot Butiá a un celular y buscar una abstracción de la mayor cantidad de problemas que puedan ser resueltos con el robot Butiá.&lt;br /&gt;
&lt;br /&gt;
Esto, para poder crear un método de uso del robot Butiá más dinámico y con funciones que permiten realizar, mediante algoritmos mas sencillos, la solución de la mayor cantidad de puzles particulares, abstrayéndose de la programación directa, lo que puede ser tedioso o abrumador para personas que tienen su primer acercamiento a la programación.&lt;br /&gt;
&lt;br /&gt;
Al hacer esto, el nivel de uso en aulas del robot Butiá, puede simplificarse hasta clases desde 3 años de jardinera en adelante, debido a que la aplicación simplifica la parte de codificación y los algoritmos de solución de ejercicios se convierten simplemente en una serie de pasos básicos a ejecutar linealmente.&lt;br /&gt;
&lt;br /&gt;
Lo que se busca con este proyecto, es despertar la curiosidad e interés en niños y adolescentes en el área de la programación de una forma didáctica, en donde estos pueden experimentar directamente con el robot y potenciar la creatividad para resolver problemas. &lt;br /&gt;
&lt;br /&gt;
La aplicación esta inspirada en el lenguaje &amp;quot;Sratch&amp;quot;, el cual es un lenguaje ideal para los primeros acercamientos a la programación. &lt;br /&gt;
&lt;br /&gt;
Este ''software'' permite ademas, introducir conceptos como, instrucciones, secuencialidad de código, algoritmos, secuencias de control, estructuras de repetición, etc. Como ejercicio, se puede plantear por ejemplo, hacer el pasaje a Python de algoritmos diseñados en la aplicación.&lt;br /&gt;
&lt;br /&gt;
== Armado del Butiá ==&lt;br /&gt;
&lt;br /&gt;
* Paso 1: Armar el Butiá a partir de esta [https://www.fing.edu.uy/inco/proyectos/butia/files/docs_butia2/armando_paso_a_paso_motores_CC_rev1.pdf guía oficial]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Paso 2: Instalar el sensor de grises&lt;br /&gt;
&lt;br /&gt;
1:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP1.jpeg]] &lt;br /&gt;
&lt;br /&gt;
2:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP2.jpeg]]&lt;br /&gt;
&lt;br /&gt;
3:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP3.jpeg]]&lt;br /&gt;
&lt;br /&gt;
4:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP4.jpeg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Paso 3: Instalar el sensor de distancia&lt;br /&gt;
&lt;br /&gt;
1:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP1.png]]&lt;br /&gt;
&lt;br /&gt;
2:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP2.png]]&lt;br /&gt;
&lt;br /&gt;
3:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP3.png]]&lt;br /&gt;
&lt;br /&gt;
4:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP4.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Observación''': Es indispensable que los componentes del robot se encuentren en condiciones optimas para que este tenga el comportamiento deseado al momento de ejecutar las acciones enviadas desde la app. Esto incluye a los motores, debido a que una diferencia de comportamiento entre estos no permitiría por ejemplo, que el robot se desplace en linea recta.&lt;br /&gt;
&lt;br /&gt;
== Protocolo de comunicación ==&lt;br /&gt;
El protocolo de comunicaron diseñado para la comunicación entre Servidor y Aplicación ''Mobile'' es el siguiente:&lt;br /&gt;
&lt;br /&gt;
'''''Accion0-S0\nAccion1-S1\nAccion2-S2\nAccion3\nAccion4-S4\nVelocidad'''''&lt;br /&gt;
&lt;br /&gt;
Donde, este ''string'' representa la serie encadenada de acciones que el servidor recibe para ejecutar en el robot desde la aplicación por medio de un ''WebSocket'' (socket que utiliza protocolo http).&lt;br /&gt;
Cada acción esta separada de la que se encuentra a continuación por el símbolo &amp;quot;''\n''&amp;quot;.&lt;br /&gt;
Podemos diferenciar dos tipos de acciones, las que requieren parámetro y las que no, estas se comunican de la siguiente forma:&lt;br /&gt;
&lt;br /&gt;
'''-Acción con parámetro''': NombreAccion-Parametro&lt;br /&gt;
&lt;br /&gt;
'''-Acción sin parámetro''': NombreAccion&lt;br /&gt;
&lt;br /&gt;
== Implementación código Python ==&lt;br /&gt;
&lt;br /&gt;
Antes de empezar a programar o usar el código, es necesario instalar las librerías a usar, esto se puede hacer escribiendo &lt;br /&gt;
&lt;br /&gt;
'''''pip install [nombre de la librería]''''' en el interprete de comandos del sistema.&lt;br /&gt;
&lt;br /&gt;
Entonces instalamos la librería a utilizar, en este caso:&lt;br /&gt;
&lt;br /&gt;
'''''pip install simple_websocket_server'''''&lt;br /&gt;
&lt;br /&gt;
Una vez instalada la librería, hay que empezar a escribir el código.&lt;br /&gt;
&lt;br /&gt;
El encabezado del código es el siguiente&lt;br /&gt;
El uso de cada librería se explica con detalle mas adelante&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Encabezado.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A partir de la librería '''sys''' se define el camino del sistema para utilizar los plugin Butiá.&lt;br /&gt;
En nuestro caso, la ruta es ''' '/home/trerb/TurtleBots.activity/plugins/butia' ''', eso se tiene que modificar dependiendo de donde se encuentren el directorio ''' TurtleBots.activity/ ''' en su sistema de archivos&lt;br /&gt;
&lt;br /&gt;
[[Archivo:UsoPluginButia.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego se encuentra la función ''' clearConsole ''',&lt;br /&gt;
Esta función sirve únicamente para limpiar el interprete de Python usando la librería ''' os ''' y tener una ejecución mas limpia&lt;br /&gt;
&lt;br /&gt;
[[Archivo:clearConsole().png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
El siguiente código utiliza la librería ''' socket ''' para conectarse a la web y preguntar la ip del ordenador que ejecuta el archivo y la muestra en pantalla, esto se usa para facilitar la conexión con la App Mobile&lt;br /&gt;
&lt;br /&gt;
[[Archivo:conexionSocket.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Las siguientes líneas de código preguntan al usuario que puerto va a utilizar para la conexión, este código verifica que se ingrese un dato numérico, dentro del rango de los puertos, y que el puerto este disponible.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:tryPuerto.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego se declaran las variables: ''' Speed, Puerto_Gris y Puerto_Distancia ''', se verifica que los sensores de distancia y de grises estén conectados y asigna el puerto en el que estén conectados a las variables ''' Puerto_Distancia ''' y ''' Puerto_Gris ''' respectivamente. La variable ''' Speed ''' es una variable global que se lee al inicio de cada cadena de acciones y la utiliza para todos los movimientos del Butiá de esa cadena.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:declaracionVariables.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Seguimos con la declaración de las funciones básicas del Butiá, en este caso son ''' Avanzar, Rotar, AvanzarHastaVerColor y AvanzarHastaObstaculo ''' &lt;br /&gt;
&lt;br /&gt;
-La función ''' Avanzar ''' recibe un parámetro de tiempo y el Butiá avanza ese determinado tiempo.&lt;br /&gt;
&lt;br /&gt;
-La función ''' Retroceder ''' recibe un parámetro de tiempo y el Butiá retrocede ese determinado tiempo.&lt;br /&gt;
&lt;br /&gt;
-La función ''' Rotar ''' recibe dos parámetros, una dirección que puede ser Izquierda o Derecha y un tiempo que indica la duración de la rotación del Butiá.&lt;br /&gt;
&lt;br /&gt;
-La función ''' AvanzarHastaVerColor ''' recibe un parámetro que varia entre Blanco o Negro, el robot va a avanzar hasta detectar el color seleccionado.&lt;br /&gt;
Esta función solo se puede usar si el sensor de grises esta conectado.&lt;br /&gt;
&lt;br /&gt;
-Por ultimo, la función ''' AvanzarHastaObstaculo ''' no recibe parámetros, en este caso el Butiá va a avanzar hasta estar a unos pocos centímetros de un obstáculo.&lt;br /&gt;
Esta función solo se puede usar si el sensor de distancia esta conectado.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:FuncionesBasicas.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego se encuentra una función ''' Accion1 ''' esta función la puede definir el usuario a gusto, se puede implementar desde una función básica hasta un seguidor de líneas avanzado. La única condición que se necesita para implementar esta ''' Accion1 ''' es que no puede recibir parámetros&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Accion1.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ahora tenemos que definir el menú principal del programa, este se divide en dos funciones&lt;br /&gt;
&lt;br /&gt;
- ''' handle ''': Esta es una función predeterminada de la librería ''' simple_web_socket ''' y se llama cada vez que el servidor recibe un dato del cliente. En este caso la función crea una lista de las acciones que le llegan de la App Mobile, y las va ejecutando ordenadamente&lt;br /&gt;
&lt;br /&gt;
- ''' handle_close ''': Al igual que la función anterior, esta también es una función predeterminada de la librería ''' simple_web_socket ''' y se llama cuando el cliente se desconecta del servidor&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Screenshot from 2021-06-27 03-58-56.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Y por ultimo tenemos el dos líneas de codigo, la primera se encarga de abrir el servidor y la segunda lo mantiene abierto infinitamente&lt;br /&gt;
&lt;br /&gt;
[[Archivo:abrirServidor.png]]&lt;br /&gt;
&lt;br /&gt;
== Implementación código React ==&lt;br /&gt;
&lt;br /&gt;
La aplicación ''mobile'' esta implementada con React Native, ademas, se utiliza el ''framework'' [https://docs.expo.io/ Expo]. Este ''framework'' nos brinda un conjunto de herramientas que facilita el desarrollo de aplicaciones ''mobile''. &lt;br /&gt;
En caso de querer agregar, o modificar cualidades, es necesario proceder de la siguiente forma:&lt;br /&gt;
&lt;br /&gt;
Descargar el archivo comprimido adjunto.&lt;br /&gt;
&lt;br /&gt;
Extraerlo, posicionarse en el directorio raiz de la carpeta descomprimida, y ejecutar desde la terminal lo siguiente (tener en cuenta que es necesario tener en la maquina, el gestor de paquetes [https://docs.npmjs.com/ npm]).&lt;br /&gt;
&lt;br /&gt;
''''npm install'''' &lt;br /&gt;
&lt;br /&gt;
Esto descarga las dependencias que utiliza la aplicación, luego de esto podemos empezar a desarrollar.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para visualizar los cambios en tiempo real mientras desarrollamos, es necesario instalar la aplicación Expo Go para [https://play.google.com/store/apps/details?id=host.exp.exponent&amp;amp;hl=es_UY&amp;amp;gl=US Android] o para [https://apps.apple.com/es/app/expo-go/id982107779 iOS] según sea el caso.&lt;br /&gt;
&lt;br /&gt;
Para a visualizar la app en desarrollo desde Expo Go, procedemos de la siguiente forma:&lt;br /&gt;
Desde el directorio raíz de la aplicación ejecutamos desde la terminal lo siguiente:&lt;br /&gt;
&lt;br /&gt;
''''npm start''''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego, desde la aplicación Expo Go, con el celular conectado en la misma red local accedemos a la aplicación seleccionando lo siguiente:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Expo.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hecho esto, podemos cambiar el código de la aplicación y ver reflejados los cambios de forma casi instantánea.&lt;br /&gt;
&lt;br /&gt;
La aplicación esta compuesta por dos pantallas, la pantalla de configuración (''ConfigScreen.js''), donde se ingresa la dirección ip y puerto del servidor, y la pantalla principal (''MainScreen.js''), donde se lleva a cabo la programación del robot mediante acciones.&lt;br /&gt;
&lt;br /&gt;
Esta ultima pantalla esta compuesta por los componentes ''TopList.js'' y ''BottomList.js''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Untitled presentation.png]]&lt;br /&gt;
&lt;br /&gt;
Para agregar una nueva accion al sistema, es necesario programarla en el servidor con un determinado nombre, supondremos &amp;quot;AccionN&amp;quot;, esto resulta fácil si se toma como ejemplo las acciones ya implementadas.&lt;br /&gt;
&lt;br /&gt;
En la aplicación, esta nueva acción se agrega en el ''array'' &amp;quot;''actionsData''&amp;quot;, dicho ''array'' se encuentra en la pantalla principal, es decir en el archivo &amp;quot;''MainScreen.js''&amp;quot;, cada acción cuenta con los siguientes datos:&lt;br /&gt;
&lt;br /&gt;
-'''idAccion:''' Identificador (indice) de la acción en dicho arreglo (actionsData). Esto permite identificar a la acción y hacer referencia a su ''overlay'' cuando se requiere modificar un parámetro de la accion en la app.&lt;br /&gt;
&lt;br /&gt;
-'''title:''': Titulo de la acción que se muestra en el panel superior.&lt;br /&gt;
&lt;br /&gt;
-'''actionId:''' Nombre identificador de la acción en el servidor (en el ejemplo, &amp;quot;AccionN&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
-'''overlay:''' ''Overlay'' que se despliega al seleccionar la acción (si esta requiere cierto parámetro), esta función lleva como parámetro &amp;quot;''editOverlay''&amp;quot; y &amp;quot;''id''&amp;quot;, estos se utilizan cuando se requiere cambiar dicha variable en una acción que ya fue seleccionada y se encuentra en el panel inferior de la aplicación, como por ejemplo pueden ser segundos en el caso de la acción &amp;quot;Avanzar&amp;quot;, o colores en el caso de &amp;quot;Avanzar hasta obstáculo&amp;quot;. Este parámetro puede ser que no sea necesario, como es en el caso de la acción &amp;quot;Avanzar hasta obstáculo&amp;quot;, en este ultimo caso el valor de este campo es ''null''.&lt;br /&gt;
&lt;br /&gt;
Ejemplo de la acción &amp;quot;Avanzar&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Screenshot from 2021-06-27 04-18-42.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ejemplo de la acción &amp;quot;Avanzar hasta obstáculo&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Screenshot_from_2021-06-27_00-28-32.png]]&lt;br /&gt;
&lt;br /&gt;
== Manual de uso de la aplicación ==&lt;br /&gt;
&lt;br /&gt;
Aunque la aplicación resulta intuitiva y fácil de usar se describe a continuación una serie de pasos para utilizarla correctamente.&lt;br /&gt;
&lt;br /&gt;
Para comenzar a utilizar la aplicación es necesario configurar la conexión de la aplicación con el servidor (recordar que ambos se deben encontrar ejecutándose en la misma red local), el servidor ejecutando en una computadora que esté conectada correctamente al butiá (con los sensores descritos anteriormente) y la aplicación ejecutándose en el celular.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Conectando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego que la conexión haya resultado exitosa, nos encontramos en la pantalla principal. En el panel superior, como se muestra a continuación, se encuentran las aplicaciones disponibles que podemos ejecutar en el robot butiá.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Acciones.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para agregar una serie de acciones al robot, simplemente presionamos la que queramos, a continuación esta aparecerá en el panel inferior, a medida de que vayamos seleccionando acciones, estas se irán encadenando una tras otras, estas estarán prontas para ejecutarse secuencialmente, desde la parte inferior, a la parte superior, en el momento que presionemos el botón &amp;quot;Empezar&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Agregando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Como la aplicación está pensada para planificar algoritmos para resolver desafíos o ''puzzles'', es probable que nos equivoquemos y seleccionemos una acción o insertemos un parámetro incorrectamente, ¡pero no te preocupes!. Para editar el parámetro que le hayamos ingresado a una acción, simplemente mantenemos pulsado la que deseamos corregir e ingresamos el nuevo valor.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Editando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
También es posible eliminar una acción, para hacer esto, nuevamente mantenemos pulsada la acción que queremos eliminar, pero esta vez, seleccionamos la acción eliminar. A continuación la acción seleccionada desaparecerá del panel inferior. También es posible que deseemos eliminar todas las acciones que habíamos ingresado, en este caso seleccionamos el botón &amp;quot;Eliminar acciones&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Eliminando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es posible que queremos que el robot se desplace a ciertas velocidades, teniendo en cuenta que al modificar la velocidad, el robot tendrá un comportamiento totalmente diferente, debido a que gran parte de las acciones se ejecutan por un tiempo asignado, a mayor velocidad, más desplazamiento.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Velocidad.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En caso de que exista un error en la conexión, podemos intentar volver a conectar la aplicación al servidor, para esto seleccionamos la opción configuración.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:A configuracion.gif]]&lt;br /&gt;
&lt;br /&gt;
== Mejoras a futuro ==&lt;br /&gt;
&lt;br /&gt;
* Implementar una forma para que las función ''' Accion1 ''' pueda recibir parámetros, para así ampliar la gama de problemas que se puedan solucionar a través de esta aplicación.&lt;br /&gt;
&lt;br /&gt;
* Implementación de código que permita añadir a través del código, una mayor cantidad de funciones genéricas a la aplicación.&lt;br /&gt;
&lt;br /&gt;
* Desarrollar una forma de comunicación bilateral entre la ''App Mobile'' y Python para mejorar el ''debug'' en tiempo de ejecución.&lt;br /&gt;
&lt;br /&gt;
== Archivos de uso ==&lt;br /&gt;
&lt;br /&gt;
- [[Archivo:Server Code.zip]]&lt;br /&gt;
&lt;br /&gt;
- [[Archivo:App code.zip]]&lt;br /&gt;
&lt;br /&gt;
- [[Archivo:Apk app.zip ]]&lt;/div&gt;</summary>
		<author><name>German.moreira</name></author>	</entry>

	<entry>
		<id>http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Programando_el_Butia_desde_el_celular&amp;diff=11708</id>
		<title>Programando el Butia desde el celular</title>
		<link rel="alternate" type="text/html" href="http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Programando_el_Butia_desde_el_celular&amp;diff=11708"/>
				<updated>2021-06-28T01:46:34Z</updated>
		
		<summary type="html">&lt;p&gt;German.moreira: /* Armado del Butiá */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Introducción ==&lt;br /&gt;
&lt;br /&gt;
La idea del proyecto en un principio era usar el celular como medio para controlar el robot Butiá para que resulte más atractivo para los estudiantes que no les guste la programación.&lt;br /&gt;
&lt;br /&gt;
Luego, la idea se modifico un poco debido a que descubrimos que con esta implementación, podíamos hacer mas sencilla la resolución de algunos ejercicios básicos mediante algoritmos mas simplificados, tomamos el trabajo que teníamos hecho hasta el momento y lo adaptamos a un menú con distintas acciones simples como avanzar un determinado tiempo, avanzar hasta chocar contra un objeto o rotar a la izquierda o derecha un determinado tiempo.&lt;br /&gt;
&lt;br /&gt;
Estas funciones básicas y bastante sencillas de entender más una interfaz amigable y fácil de usar, se implementaron para que el rango de edad de uso de esta aplicación vaya de 3 años en adelante.&lt;br /&gt;
&lt;br /&gt;
Como resultado obtuvimos una aplicación que se puede usar para que niños de:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- 4 / 5 / 6 años resuelvan ejercicios sencillos como puede ser llegar de un punto a otro, buscar el camino a un objeto o resolver un laberinto sencillo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- 7 / 8 / 9 años puedan resolver ejercicios un poco más complejos como puede ser resolver un laberinto del más sencillo al mas complejo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- 10 años en adelante tengan la capacidad de adaptar una parte personal de código al programa y puedan resolver cualquier ejercicio que se pueda plantear con el robot Butiá.&lt;br /&gt;
&lt;br /&gt;
== Objetivo y motivación==&lt;br /&gt;
&lt;br /&gt;
Los objetivos del proyecto eran, como dice el nombre, poder conectar remotamente el robot Butiá a un celular y buscar una abstracción de la mayor cantidad de problemas que puedan ser resueltos con el robot Butiá.&lt;br /&gt;
&lt;br /&gt;
Esto, para poder crear un método de uso del robot Butiá más dinámico y con funciones que permiten realizar, mediante algoritmos mas sencillos, la solución de la mayor cantidad de puzles particulares, abstrayéndose de la programación directa, lo que puede ser tedioso o abrumador para personas que tienen su primer acercamiento a la programación.&lt;br /&gt;
&lt;br /&gt;
Al hacer esto, el nivel de uso en aulas del robot Butiá, puede simplificarse hasta clases desde 3 años de jardinera en adelante, debido a que la aplicación simplifica la parte de codificación y los algoritmos de solución de ejercicios se convierten simplemente en una serie de pasos básicos a ejecutar linealmente.&lt;br /&gt;
&lt;br /&gt;
Lo que se busca con este proyecto, es despertar la curiosidad e interés en niños y adolescentes en el área de la programación de una forma didáctica, en donde estos pueden experimentar directamente con el robot y potenciar la creatividad para resolver problemas. &lt;br /&gt;
&lt;br /&gt;
La aplicación esta inspirada en el lenguaje &amp;quot;Sratch&amp;quot;, el cual es un lenguaje ideal para los primeros acercamientos a la programación. &lt;br /&gt;
&lt;br /&gt;
Este ''software'' permite ademas, introducir conceptos como, instrucciones, secuencialidad de código, algoritmos, secuencias de control, estructuras de repetición, etc. Como ejercicio, se puede plantear por ejemplo, hacer el pasaje a Python de algoritmos diseñados en la aplicación.&lt;br /&gt;
&lt;br /&gt;
== Armado del Butiá ==&lt;br /&gt;
&lt;br /&gt;
* Paso 1: Armar el Butiá a partir de esta [https://www.fing.edu.uy/inco/proyectos/butia/files/docs_butia2/armando_paso_a_paso_motores_CC_rev1.pdf guía oficial]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Paso 2: Instalar el sensor de grises&lt;br /&gt;
&lt;br /&gt;
1:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP1.jpeg]] &lt;br /&gt;
&lt;br /&gt;
2:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP2.jpeg]]&lt;br /&gt;
&lt;br /&gt;
3:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP3.jpeg]]&lt;br /&gt;
&lt;br /&gt;
4:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP4.jpeg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Paso 3: Instalar el sensor de distancia&lt;br /&gt;
&lt;br /&gt;
1:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP1.png]]&lt;br /&gt;
&lt;br /&gt;
2:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP2.png]]&lt;br /&gt;
&lt;br /&gt;
3:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP3.png]]&lt;br /&gt;
&lt;br /&gt;
4:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP4.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Observación''': Es indispensable que los componentes del robot se encuentren en condiciones optimas para que este tenga el comportamiento deseado al momento de ejecutar las acciones enviadas desde la app. Esto incluye a los motores, debido a que una diferencia de comportamiento entre estos no permitiría por ejemplo, que el robot se desplace en linea recta.&lt;br /&gt;
&lt;br /&gt;
== Protocolo de comunicación ==&lt;br /&gt;
El protocolo de comunicaron diseñado para la comunicación entre Servidor y Aplicación ''Mobile'' es el siguiente:&lt;br /&gt;
&lt;br /&gt;
'''''Accion0-S0\nAccion1-S1\nAccion2-S2\nAccion3\nAccion4-S4\nVelocidad'''''&lt;br /&gt;
&lt;br /&gt;
Donde, este ''string'' representa la serie encadenada de acciones que el servidor recibe para ejecutar en el robot desde la aplicación por medio de un ''WebSocket'' (socket que utiliza protocolo http).&lt;br /&gt;
Cada acción esta separada de la que se encuentra a continuación por el símbolo &amp;quot;''\n''&amp;quot;.&lt;br /&gt;
Podemos diferenciar dos tipos de acciones, las que requieren parámetro y las que no, estas se comunican de la siguiente forma:&lt;br /&gt;
&lt;br /&gt;
'''-Acción con parámetro''': NombreAccion-Parametro&lt;br /&gt;
&lt;br /&gt;
'''-Acción sin parámetro''': NombreAccion&lt;br /&gt;
&lt;br /&gt;
== Implementación código Python ==&lt;br /&gt;
&lt;br /&gt;
Antes de empezar a programar o usar el código, es necesario instalar las librerías a usar, esto se puede hacer escribiendo &lt;br /&gt;
&lt;br /&gt;
'''''pip install [nombre de la librería]''''' en el interprete de comandos del sistema.&lt;br /&gt;
&lt;br /&gt;
Entonces instalamos la librería a utilizar, en este caso:&lt;br /&gt;
&lt;br /&gt;
'''''pip install simple_websocket_server'''''&lt;br /&gt;
&lt;br /&gt;
Una vez instalada la librería, hay que empezar a escribir el código.&lt;br /&gt;
&lt;br /&gt;
El encabezado del código es el siguiente&lt;br /&gt;
El uso de cada librería se explica con detalle mas adelante&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Encabezado.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A partir de la librería '''sys''' se define el camino del sistema para utilizar los plugin Butiá.&lt;br /&gt;
En nuestro caso, la ruta es ''' '/home/trerb/TurtleBots.activity/plugins/butia' ''', eso se tiene que modificar dependiendo de donde se encuentren el directorio ''' TurtleBots.activity/ ''' en su sistema de archivos&lt;br /&gt;
&lt;br /&gt;
[[Archivo:UsoPluginButia.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego se encuentra la función ''' clearConsole ''',&lt;br /&gt;
Esta función sirve únicamente para limpiar el interprete de Python usando la librería ''' os ''' y tener una ejecución mas limpia&lt;br /&gt;
&lt;br /&gt;
[[Archivo:clearConsole().png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
El siguiente código utiliza la librería ''' socket ''' para conectarse a la web y preguntar la ip del ordenador que ejecuta el archivo y la muestra en pantalla, esto se usa para facilitar la conexión con la App Mobile&lt;br /&gt;
&lt;br /&gt;
[[Archivo:conexionSocket.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Las siguientes líneas de código preguntan al usuario que puerto va a utilizar para la conexión, este código verifica que se ingrese un dato numérico, dentro del rango de los puertos, y que el puerto este disponible.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:tryPuerto.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego se declaran las variables: ''' Speed, Puerto_Gris y Puerto_Distancia ''', se verifica que los sensores de distancia y de grises estén conectados y asigna el puerto en el que estén conectados a las variables ''' Puerto_Distancia ''' y ''' Puerto_Gris ''' respectivamente. La variable ''' Speed ''' es una variable global que se lee al inicio de cada cadena de acciones y la utiliza para todos los movimientos del Butiá de esa cadena.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:declaracionVariables.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Seguimos con la declaración de las funciones básicas del Butiá, en este caso son ''' Avanzar, Rotar, AvanzarHastaVerColor y AvanzarHastaObstaculo ''' &lt;br /&gt;
&lt;br /&gt;
-La función ''' Avanzar ''' recibe un parámetro de tiempo y el Butiá avanza ese determinado tiempo.&lt;br /&gt;
&lt;br /&gt;
-La función ''' Retroceder ''' recibe un parámetro de tiempo y el Butiá retrocede ese determinado tiempo.&lt;br /&gt;
&lt;br /&gt;
-La función ''' Rotar ''' recibe dos parámetros, una dirección que puede ser Izquierda o Derecha y un tiempo que indica la duración de la rotación del Butiá.&lt;br /&gt;
&lt;br /&gt;
-La función ''' AvanzarHastaVerColor ''' recibe un parámetro que varia entre Blanco o Negro, el robot va a avanzar hasta detectar el color seleccionado.&lt;br /&gt;
Esta función solo se puede usar si el sensor de grises esta conectado.&lt;br /&gt;
&lt;br /&gt;
-Por ultimo, la función ''' AvanzarHastaObstaculo ''' no recibe parámetros, en este caso el Butiá va a avanzar hasta estar a unos pocos centímetros de un obstáculo.&lt;br /&gt;
Esta función solo se puede usar si el sensor de distancia esta conectado.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:FuncionesBasicas.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego se encuentra una función ''' Accion1 ''' esta función la puede definir el usuario a gusto, se puede implementar desde una función básica hasta un seguidor de líneas avanzado. La única condición que se necesita para implementar esta ''' Accion1 ''' es que no puede recibir parámetros&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Accion1.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ahora tenemos que definir el menú principal del programa, este se divide en dos funciones&lt;br /&gt;
&lt;br /&gt;
- ''' handle ''': Esta es una función predeterminada de la librería ''' simple_web_socket ''' y se llama cada vez que el servidor recibe un dato del cliente. En este caso la función crea una lista de las acciones que le llegan de la App Mobile, y las va ejecutando ordenadamente&lt;br /&gt;
&lt;br /&gt;
- ''' handle_close ''': Al igual que la función anterior, esta también es una función predeterminada de la librería ''' simple_web_socket ''' y se llama cuando el cliente se desconecta del servidor&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Screenshot from 2021-06-27 03-58-56.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Y por ultimo tenemos el dos líneas de codigo, la primera se encarga de abrir el servidor y la segunda lo mantiene abierto infinitamente&lt;br /&gt;
&lt;br /&gt;
[[Archivo:abrirServidor.png]]&lt;br /&gt;
&lt;br /&gt;
== Implementación código React ==&lt;br /&gt;
&lt;br /&gt;
La aplicación ''mobile'' esta implementada con React Native, ademas, se utiliza el ''framework'' [https://docs.expo.io/ Expo]. Este ''framework'' nos brinda un conjunto de herramientas que facilita el desarrollo de aplicaciones ''mobile''. &lt;br /&gt;
En caso de querer agregar, o modificar cualidades, es necesario proceder de la siguiente forma:&lt;br /&gt;
&lt;br /&gt;
Descargar el archivo comprimido adjunto.&lt;br /&gt;
&lt;br /&gt;
Extraerlo, posicionarse en el directorio raiz de la carpeta descomprimida, y ejecutar desde la terminal lo siguiente (tener en cuenta que es necesario tener en la maquina, el gestor de paquetes [https://docs.npmjs.com/ npm]).&lt;br /&gt;
&lt;br /&gt;
''''npm install'''' &lt;br /&gt;
&lt;br /&gt;
Esto descarga las dependencias que utiliza la aplicación, luego de esto podemos empezar a desarrollar.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para visualizar los cambios en tiempo real mientras desarrollamos, es necesario instalar la aplicación Expo Go para [https://play.google.com/store/apps/details?id=host.exp.exponent&amp;amp;hl=es_UY&amp;amp;gl=US Android] o para [https://apps.apple.com/es/app/expo-go/id982107779 iOS] según sea el caso.&lt;br /&gt;
&lt;br /&gt;
Para a visualizar la app en desarrollo desde Expo Go, procedemos de la siguiente forma:&lt;br /&gt;
Desde el directorio raíz de la aplicación ejecutamos desde la terminal lo siguiente:&lt;br /&gt;
&lt;br /&gt;
''''npm start''''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego, desde la aplicación Expo Go, con el celular conectado en la misma red local accedemos a la aplicación seleccionando lo siguiente:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Expo.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hecho esto, podemos cambiar el código de la aplicación y ver reflejados los cambios de forma casi instantánea.&lt;br /&gt;
&lt;br /&gt;
La aplicación esta compuesta por dos pantallas, la pantalla de configuración (''ConfigScreen.js''), donde se ingresa la dirección ip y puerto del servidor, y la pantalla principal (''MainScreen.js''), donde se lleva a cabo la programación del robot mediante acciones.&lt;br /&gt;
&lt;br /&gt;
Esta ultima pantalla esta compuesta por los componentes ''TopList.js'' y ''BottomList.js''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Untitled presentation.png]]&lt;br /&gt;
&lt;br /&gt;
Para agregar una nueva accion al sistema, es necesario programarla en el servidor con un determinado nombre, supondremos &amp;quot;AccionN&amp;quot;, esto resulta fácil si se toma como ejemplo las acciones ya implementadas.&lt;br /&gt;
&lt;br /&gt;
En la aplicación, esta nueva acción se agrega en el ''array'' &amp;quot;''actionsData''&amp;quot;, dicho ''array'' se encuentra en la pantalla principal, es decir en el archivo &amp;quot;''MainScreen.js''&amp;quot;, cada acción cuenta con los siguientes datos:&lt;br /&gt;
&lt;br /&gt;
-'''idAccion:''' Identificador de la acción en dicho arreglo (actionsData).&lt;br /&gt;
&lt;br /&gt;
-'''title:''': Titulo de la acción que se muestra en el panel superior.&lt;br /&gt;
&lt;br /&gt;
-'''actionId:''' Nombre identificador de la acción en el servidor.&lt;br /&gt;
&lt;br /&gt;
-'''overlay:''' ''Overlay'' que se despliega al seleccionar la acción (si esta requiere cierto parámetro), esta función lleva como parámetro &amp;quot;''editOverlay''&amp;quot; y &amp;quot;''id''&amp;quot;, estos se utilizan cuando se requiere cambiar dicha variable en una acción que ya fue seleccionada y se encuentra en el panel inferior de la aplicación, como por ejemplo pueden ser segundos en el caso de la acción &amp;quot;Avanzar&amp;quot;, o colores en el caso de &amp;quot;Avanzar hasta obstáculo&amp;quot;. Este parámetro puede ser que no sea necesario, como es en el caso de la acción &amp;quot;Avanzar hasta obstáculo&amp;quot;, en este ultimo caso el valor de este campo es ''null''.&lt;br /&gt;
&lt;br /&gt;
Ejemplo de la acción &amp;quot;Avanzar&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Screenshot from 2021-06-27 04-18-42.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ejemplo de la acción &amp;quot;Avanzar hasta obstáculo&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Screenshot_from_2021-06-27_00-28-32.png]]&lt;br /&gt;
&lt;br /&gt;
== Manual de uso de la aplicación ==&lt;br /&gt;
&lt;br /&gt;
Aunque la aplicación resulta intuitiva y fácil de usar se describe a continuación una serie de pasos para utilizarla correctamente.&lt;br /&gt;
&lt;br /&gt;
Para comenzar a utilizar la aplicación es necesario configurar la conexión de la aplicación con el servidor (recordar que ambos se deben encontrar ejecutándose en la misma red local), el servidor ejecutando en una computadora que esté conectada correctamente al butiá (con los sensores descritos anteriormente) y la aplicación ejecutándose en el celular.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Conectando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego que la conexión haya resultado exitosa, nos encontramos en la pantalla principal. En el panel superior, como se muestra a continuación, se encuentran las aplicaciones disponibles que podemos ejecutar en el robot butiá.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Acciones.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para agregar una serie de acciones al robot, simplemente presionamos la que queramos, a continuación esta aparecerá en el panel inferior, a medida de que vayamos seleccionando acciones, estas se irán encadenando una tras otras, estas estarán prontas para ejecutarse secuencialmente, desde la parte inferior, a la parte superior, en el momento que presionemos el botón &amp;quot;Empezar&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Agregando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Como la aplicación está pensada para planificar algoritmos para resolver desafíos o ''puzzles'', es probable que nos equivoquemos y seleccionemos una acción o insertemos un parámetro incorrectamente, ¡pero no te preocupes!. Para editar el parámetro que le hayamos ingresado a una acción, simplemente mantenemos pulsado la que deseamos corregir e ingresamos el nuevo valor.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Editando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
También es posible eliminar una acción, para hacer esto, nuevamente mantenemos pulsada la acción que queremos eliminar, pero esta vez, seleccionamos la acción eliminar. A continuación la acción seleccionada desaparecerá del panel inferior. También es posible que deseemos eliminar todas las acciones que habíamos ingresado, en este caso seleccionamos el botón &amp;quot;Eliminar acciones&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Eliminando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es posible que queremos que el robot se desplace a ciertas velocidades, teniendo en cuenta que al modificar la velocidad, el robot tendrá un comportamiento totalmente diferente, debido a que gran parte de las acciones se ejecutan por un tiempo asignado, a mayor velocidad, más desplazamiento.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Velocidad.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En caso de que exista un error en la conexión, podemos intentar volver a conectar la aplicación al servidor, para esto seleccionamos la opción configuración.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:A configuracion.gif]]&lt;br /&gt;
&lt;br /&gt;
== Mejoras a futuro ==&lt;br /&gt;
&lt;br /&gt;
* Implementar una forma para que las función ''' Accion1 ''' pueda recibir parámetros, para así ampliar la gama de problemas que se puedan solucionar a través de esta aplicación.&lt;br /&gt;
&lt;br /&gt;
* Implementación de código que permita añadir a través del código, una mayor cantidad de funciones genéricas a la aplicación.&lt;br /&gt;
&lt;br /&gt;
* Desarrollar una forma de comunicación bilateral entre la ''App Mobile'' y Python para mejorar el ''debug'' en tiempo de ejecución.&lt;br /&gt;
&lt;br /&gt;
== Archivos de uso ==&lt;br /&gt;
&lt;br /&gt;
- [[Archivo:Server Code.zip]]&lt;br /&gt;
&lt;br /&gt;
- [[Archivo:App code.zip]]&lt;br /&gt;
&lt;br /&gt;
- [[Archivo:Apk app.zip ]]&lt;/div&gt;</summary>
		<author><name>German.moreira</name></author>	</entry>

	<entry>
		<id>http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Programando_el_Butia_desde_el_celular&amp;diff=11707</id>
		<title>Programando el Butia desde el celular</title>
		<link rel="alternate" type="text/html" href="http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Programando_el_Butia_desde_el_celular&amp;diff=11707"/>
				<updated>2021-06-28T01:46:12Z</updated>
		
		<summary type="html">&lt;p&gt;German.moreira: /* Armado del Butiá */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Introducción ==&lt;br /&gt;
&lt;br /&gt;
La idea del proyecto en un principio era usar el celular como medio para controlar el robot Butiá para que resulte más atractivo para los estudiantes que no les guste la programación.&lt;br /&gt;
&lt;br /&gt;
Luego, la idea se modifico un poco debido a que descubrimos que con esta implementación, podíamos hacer mas sencilla la resolución de algunos ejercicios básicos mediante algoritmos mas simplificados, tomamos el trabajo que teníamos hecho hasta el momento y lo adaptamos a un menú con distintas acciones simples como avanzar un determinado tiempo, avanzar hasta chocar contra un objeto o rotar a la izquierda o derecha un determinado tiempo.&lt;br /&gt;
&lt;br /&gt;
Estas funciones básicas y bastante sencillas de entender más una interfaz amigable y fácil de usar, se implementaron para que el rango de edad de uso de esta aplicación vaya de 3 años en adelante.&lt;br /&gt;
&lt;br /&gt;
Como resultado obtuvimos una aplicación que se puede usar para que niños de:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- 4 / 5 / 6 años resuelvan ejercicios sencillos como puede ser llegar de un punto a otro, buscar el camino a un objeto o resolver un laberinto sencillo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- 7 / 8 / 9 años puedan resolver ejercicios un poco más complejos como puede ser resolver un laberinto del más sencillo al mas complejo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- 10 años en adelante tengan la capacidad de adaptar una parte personal de código al programa y puedan resolver cualquier ejercicio que se pueda plantear con el robot Butiá.&lt;br /&gt;
&lt;br /&gt;
== Objetivo y motivación==&lt;br /&gt;
&lt;br /&gt;
Los objetivos del proyecto eran, como dice el nombre, poder conectar remotamente el robot Butiá a un celular y buscar una abstracción de la mayor cantidad de problemas que puedan ser resueltos con el robot Butiá.&lt;br /&gt;
&lt;br /&gt;
Esto, para poder crear un método de uso del robot Butiá más dinámico y con funciones que permiten realizar, mediante algoritmos mas sencillos, la solución de la mayor cantidad de puzles particulares, abstrayéndose de la programación directa, lo que puede ser tedioso o abrumador para personas que tienen su primer acercamiento a la programación.&lt;br /&gt;
&lt;br /&gt;
Al hacer esto, el nivel de uso en aulas del robot Butiá, puede simplificarse hasta clases desde 3 años de jardinera en adelante, debido a que la aplicación simplifica la parte de codificación y los algoritmos de solución de ejercicios se convierten simplemente en una serie de pasos básicos a ejecutar linealmente.&lt;br /&gt;
&lt;br /&gt;
Lo que se busca con este proyecto, es despertar la curiosidad e interés en niños y adolescentes en el área de la programación de una forma didáctica, en donde estos pueden experimentar directamente con el robot y potenciar la creatividad para resolver problemas. &lt;br /&gt;
&lt;br /&gt;
La aplicación esta inspirada en el lenguaje &amp;quot;Sratch&amp;quot;, el cual es un lenguaje ideal para los primeros acercamientos a la programación. &lt;br /&gt;
&lt;br /&gt;
Este ''software'' permite ademas, introducir conceptos como, instrucciones, secuencialidad de código, algoritmos, secuencias de control, estructuras de repetición, etc. Como ejercicio, se puede plantear por ejemplo, hacer el pasaje a Python de algoritmos diseñados en la aplicación.&lt;br /&gt;
&lt;br /&gt;
== Armado del Butiá ==&lt;br /&gt;
&lt;br /&gt;
* Paso 1: Armar el Butiá a partir de esta [https://www.fing.edu.uy/inco/proyectos/butia/files/docs_butia2/armando_paso_a_paso_motores_CC_rev1.pdf guía oficial]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Paso 2: Instalar el sensor de grises&lt;br /&gt;
&lt;br /&gt;
1:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP1.jpeg]] &lt;br /&gt;
&lt;br /&gt;
2:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP2.jpeg]]&lt;br /&gt;
&lt;br /&gt;
3:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP3.jpeg]]&lt;br /&gt;
&lt;br /&gt;
4:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP4.jpeg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Paso 3: Instalar el sensor de distancia&lt;br /&gt;
&lt;br /&gt;
1:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP1.png]]&lt;br /&gt;
&lt;br /&gt;
2:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP2.png]]&lt;br /&gt;
&lt;br /&gt;
3:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP3.png]]&lt;br /&gt;
&lt;br /&gt;
4:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP4.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Texto en negrita''': Es indispensable que los componentes del robot se encuentren en condiciones optimas para que este tenga el comportamiento deseado al momento de ejecutar las acciones enviadas desde la app. Esto incluye a los motores, debido a que una diferencia de comportamiento entre estos no permitiría por ejemplo, que el robot se desplace en linea recta.&lt;br /&gt;
&lt;br /&gt;
== Protocolo de comunicación ==&lt;br /&gt;
El protocolo de comunicaron diseñado para la comunicación entre Servidor y Aplicación ''Mobile'' es el siguiente:&lt;br /&gt;
&lt;br /&gt;
'''''Accion0-S0\nAccion1-S1\nAccion2-S2\nAccion3\nAccion4-S4\nVelocidad'''''&lt;br /&gt;
&lt;br /&gt;
Donde, este ''string'' representa la serie encadenada de acciones que el servidor recibe para ejecutar en el robot desde la aplicación por medio de un ''WebSocket'' (socket que utiliza protocolo http).&lt;br /&gt;
Cada acción esta separada de la que se encuentra a continuación por el símbolo &amp;quot;''\n''&amp;quot;.&lt;br /&gt;
Podemos diferenciar dos tipos de acciones, las que requieren parámetro y las que no, estas se comunican de la siguiente forma:&lt;br /&gt;
&lt;br /&gt;
'''-Acción con parámetro''': NombreAccion-Parametro&lt;br /&gt;
&lt;br /&gt;
'''-Acción sin parámetro''': NombreAccion&lt;br /&gt;
&lt;br /&gt;
== Implementación código Python ==&lt;br /&gt;
&lt;br /&gt;
Antes de empezar a programar o usar el código, es necesario instalar las librerías a usar, esto se puede hacer escribiendo &lt;br /&gt;
&lt;br /&gt;
'''''pip install [nombre de la librería]''''' en el interprete de comandos del sistema.&lt;br /&gt;
&lt;br /&gt;
Entonces instalamos la librería a utilizar, en este caso:&lt;br /&gt;
&lt;br /&gt;
'''''pip install simple_websocket_server'''''&lt;br /&gt;
&lt;br /&gt;
Una vez instalada la librería, hay que empezar a escribir el código.&lt;br /&gt;
&lt;br /&gt;
El encabezado del código es el siguiente&lt;br /&gt;
El uso de cada librería se explica con detalle mas adelante&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Encabezado.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A partir de la librería '''sys''' se define el camino del sistema para utilizar los plugin Butiá.&lt;br /&gt;
En nuestro caso, la ruta es ''' '/home/trerb/TurtleBots.activity/plugins/butia' ''', eso se tiene que modificar dependiendo de donde se encuentren el directorio ''' TurtleBots.activity/ ''' en su sistema de archivos&lt;br /&gt;
&lt;br /&gt;
[[Archivo:UsoPluginButia.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego se encuentra la función ''' clearConsole ''',&lt;br /&gt;
Esta función sirve únicamente para limpiar el interprete de Python usando la librería ''' os ''' y tener una ejecución mas limpia&lt;br /&gt;
&lt;br /&gt;
[[Archivo:clearConsole().png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
El siguiente código utiliza la librería ''' socket ''' para conectarse a la web y preguntar la ip del ordenador que ejecuta el archivo y la muestra en pantalla, esto se usa para facilitar la conexión con la App Mobile&lt;br /&gt;
&lt;br /&gt;
[[Archivo:conexionSocket.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Las siguientes líneas de código preguntan al usuario que puerto va a utilizar para la conexión, este código verifica que se ingrese un dato numérico, dentro del rango de los puertos, y que el puerto este disponible.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:tryPuerto.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego se declaran las variables: ''' Speed, Puerto_Gris y Puerto_Distancia ''', se verifica que los sensores de distancia y de grises estén conectados y asigna el puerto en el que estén conectados a las variables ''' Puerto_Distancia ''' y ''' Puerto_Gris ''' respectivamente. La variable ''' Speed ''' es una variable global que se lee al inicio de cada cadena de acciones y la utiliza para todos los movimientos del Butiá de esa cadena.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:declaracionVariables.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Seguimos con la declaración de las funciones básicas del Butiá, en este caso son ''' Avanzar, Rotar, AvanzarHastaVerColor y AvanzarHastaObstaculo ''' &lt;br /&gt;
&lt;br /&gt;
-La función ''' Avanzar ''' recibe un parámetro de tiempo y el Butiá avanza ese determinado tiempo.&lt;br /&gt;
&lt;br /&gt;
-La función ''' Retroceder ''' recibe un parámetro de tiempo y el Butiá retrocede ese determinado tiempo.&lt;br /&gt;
&lt;br /&gt;
-La función ''' Rotar ''' recibe dos parámetros, una dirección que puede ser Izquierda o Derecha y un tiempo que indica la duración de la rotación del Butiá.&lt;br /&gt;
&lt;br /&gt;
-La función ''' AvanzarHastaVerColor ''' recibe un parámetro que varia entre Blanco o Negro, el robot va a avanzar hasta detectar el color seleccionado.&lt;br /&gt;
Esta función solo se puede usar si el sensor de grises esta conectado.&lt;br /&gt;
&lt;br /&gt;
-Por ultimo, la función ''' AvanzarHastaObstaculo ''' no recibe parámetros, en este caso el Butiá va a avanzar hasta estar a unos pocos centímetros de un obstáculo.&lt;br /&gt;
Esta función solo se puede usar si el sensor de distancia esta conectado.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:FuncionesBasicas.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego se encuentra una función ''' Accion1 ''' esta función la puede definir el usuario a gusto, se puede implementar desde una función básica hasta un seguidor de líneas avanzado. La única condición que se necesita para implementar esta ''' Accion1 ''' es que no puede recibir parámetros&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Accion1.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ahora tenemos que definir el menú principal del programa, este se divide en dos funciones&lt;br /&gt;
&lt;br /&gt;
- ''' handle ''': Esta es una función predeterminada de la librería ''' simple_web_socket ''' y se llama cada vez que el servidor recibe un dato del cliente. En este caso la función crea una lista de las acciones que le llegan de la App Mobile, y las va ejecutando ordenadamente&lt;br /&gt;
&lt;br /&gt;
- ''' handle_close ''': Al igual que la función anterior, esta también es una función predeterminada de la librería ''' simple_web_socket ''' y se llama cuando el cliente se desconecta del servidor&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Screenshot from 2021-06-27 03-58-56.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Y por ultimo tenemos el dos líneas de codigo, la primera se encarga de abrir el servidor y la segunda lo mantiene abierto infinitamente&lt;br /&gt;
&lt;br /&gt;
[[Archivo:abrirServidor.png]]&lt;br /&gt;
&lt;br /&gt;
== Implementación código React ==&lt;br /&gt;
&lt;br /&gt;
La aplicación ''mobile'' esta implementada con React Native, ademas, se utiliza el ''framework'' [https://docs.expo.io/ Expo]. Este ''framework'' nos brinda un conjunto de herramientas que facilita el desarrollo de aplicaciones ''mobile''. &lt;br /&gt;
En caso de querer agregar, o modificar cualidades, es necesario proceder de la siguiente forma:&lt;br /&gt;
&lt;br /&gt;
Descargar el archivo comprimido adjunto.&lt;br /&gt;
&lt;br /&gt;
Extraerlo, posicionarse en el directorio raiz de la carpeta descomprimida, y ejecutar desde la terminal lo siguiente (tener en cuenta que es necesario tener en la maquina, el gestor de paquetes [https://docs.npmjs.com/ npm]).&lt;br /&gt;
&lt;br /&gt;
''''npm install'''' &lt;br /&gt;
&lt;br /&gt;
Esto descarga las dependencias que utiliza la aplicación, luego de esto podemos empezar a desarrollar.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para visualizar los cambios en tiempo real mientras desarrollamos, es necesario instalar la aplicación Expo Go para [https://play.google.com/store/apps/details?id=host.exp.exponent&amp;amp;hl=es_UY&amp;amp;gl=US Android] o para [https://apps.apple.com/es/app/expo-go/id982107779 iOS] según sea el caso.&lt;br /&gt;
&lt;br /&gt;
Para a visualizar la app en desarrollo desde Expo Go, procedemos de la siguiente forma:&lt;br /&gt;
Desde el directorio raíz de la aplicación ejecutamos desde la terminal lo siguiente:&lt;br /&gt;
&lt;br /&gt;
''''npm start''''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego, desde la aplicación Expo Go, con el celular conectado en la misma red local accedemos a la aplicación seleccionando lo siguiente:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Expo.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hecho esto, podemos cambiar el código de la aplicación y ver reflejados los cambios de forma casi instantánea.&lt;br /&gt;
&lt;br /&gt;
La aplicación esta compuesta por dos pantallas, la pantalla de configuración (''ConfigScreen.js''), donde se ingresa la dirección ip y puerto del servidor, y la pantalla principal (''MainScreen.js''), donde se lleva a cabo la programación del robot mediante acciones.&lt;br /&gt;
&lt;br /&gt;
Esta ultima pantalla esta compuesta por los componentes ''TopList.js'' y ''BottomList.js''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Untitled presentation.png]]&lt;br /&gt;
&lt;br /&gt;
Para agregar una nueva accion al sistema, es necesario programarla en el servidor con un determinado nombre, supondremos &amp;quot;AccionN&amp;quot;, esto resulta fácil si se toma como ejemplo las acciones ya implementadas.&lt;br /&gt;
&lt;br /&gt;
En la aplicación, esta nueva acción se agrega en el ''array'' &amp;quot;''actionsData''&amp;quot;, dicho ''array'' se encuentra en la pantalla principal, es decir en el archivo &amp;quot;''MainScreen.js''&amp;quot;, cada acción cuenta con los siguientes datos:&lt;br /&gt;
&lt;br /&gt;
-'''idAccion:''' Identificador de la acción en dicho arreglo (actionsData).&lt;br /&gt;
&lt;br /&gt;
-'''title:''': Titulo de la acción que se muestra en el panel superior.&lt;br /&gt;
&lt;br /&gt;
-'''actionId:''' Nombre identificador de la acción en el servidor.&lt;br /&gt;
&lt;br /&gt;
-'''overlay:''' ''Overlay'' que se despliega al seleccionar la acción (si esta requiere cierto parámetro), esta función lleva como parámetro &amp;quot;''editOverlay''&amp;quot; y &amp;quot;''id''&amp;quot;, estos se utilizan cuando se requiere cambiar dicha variable en una acción que ya fue seleccionada y se encuentra en el panel inferior de la aplicación, como por ejemplo pueden ser segundos en el caso de la acción &amp;quot;Avanzar&amp;quot;, o colores en el caso de &amp;quot;Avanzar hasta obstáculo&amp;quot;. Este parámetro puede ser que no sea necesario, como es en el caso de la acción &amp;quot;Avanzar hasta obstáculo&amp;quot;, en este ultimo caso el valor de este campo es ''null''.&lt;br /&gt;
&lt;br /&gt;
Ejemplo de la acción &amp;quot;Avanzar&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Screenshot from 2021-06-27 04-18-42.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ejemplo de la acción &amp;quot;Avanzar hasta obstáculo&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Screenshot_from_2021-06-27_00-28-32.png]]&lt;br /&gt;
&lt;br /&gt;
== Manual de uso de la aplicación ==&lt;br /&gt;
&lt;br /&gt;
Aunque la aplicación resulta intuitiva y fácil de usar se describe a continuación una serie de pasos para utilizarla correctamente.&lt;br /&gt;
&lt;br /&gt;
Para comenzar a utilizar la aplicación es necesario configurar la conexión de la aplicación con el servidor (recordar que ambos se deben encontrar ejecutándose en la misma red local), el servidor ejecutando en una computadora que esté conectada correctamente al butiá (con los sensores descritos anteriormente) y la aplicación ejecutándose en el celular.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Conectando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego que la conexión haya resultado exitosa, nos encontramos en la pantalla principal. En el panel superior, como se muestra a continuación, se encuentran las aplicaciones disponibles que podemos ejecutar en el robot butiá.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Acciones.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para agregar una serie de acciones al robot, simplemente presionamos la que queramos, a continuación esta aparecerá en el panel inferior, a medida de que vayamos seleccionando acciones, estas se irán encadenando una tras otras, estas estarán prontas para ejecutarse secuencialmente, desde la parte inferior, a la parte superior, en el momento que presionemos el botón &amp;quot;Empezar&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Agregando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Como la aplicación está pensada para planificar algoritmos para resolver desafíos o ''puzzles'', es probable que nos equivoquemos y seleccionemos una acción o insertemos un parámetro incorrectamente, ¡pero no te preocupes!. Para editar el parámetro que le hayamos ingresado a una acción, simplemente mantenemos pulsado la que deseamos corregir e ingresamos el nuevo valor.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Editando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
También es posible eliminar una acción, para hacer esto, nuevamente mantenemos pulsada la acción que queremos eliminar, pero esta vez, seleccionamos la acción eliminar. A continuación la acción seleccionada desaparecerá del panel inferior. También es posible que deseemos eliminar todas las acciones que habíamos ingresado, en este caso seleccionamos el botón &amp;quot;Eliminar acciones&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Eliminando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es posible que queremos que el robot se desplace a ciertas velocidades, teniendo en cuenta que al modificar la velocidad, el robot tendrá un comportamiento totalmente diferente, debido a que gran parte de las acciones se ejecutan por un tiempo asignado, a mayor velocidad, más desplazamiento.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Velocidad.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En caso de que exista un error en la conexión, podemos intentar volver a conectar la aplicación al servidor, para esto seleccionamos la opción configuración.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:A configuracion.gif]]&lt;br /&gt;
&lt;br /&gt;
== Mejoras a futuro ==&lt;br /&gt;
&lt;br /&gt;
* Implementar una forma para que las función ''' Accion1 ''' pueda recibir parámetros, para así ampliar la gama de problemas que se puedan solucionar a través de esta aplicación.&lt;br /&gt;
&lt;br /&gt;
* Implementación de código que permita añadir a través del código, una mayor cantidad de funciones genéricas a la aplicación.&lt;br /&gt;
&lt;br /&gt;
* Desarrollar una forma de comunicación bilateral entre la ''App Mobile'' y Python para mejorar el ''debug'' en tiempo de ejecución.&lt;br /&gt;
&lt;br /&gt;
== Archivos de uso ==&lt;br /&gt;
&lt;br /&gt;
- [[Archivo:Server Code.zip]]&lt;br /&gt;
&lt;br /&gt;
- [[Archivo:App code.zip]]&lt;br /&gt;
&lt;br /&gt;
- [[Archivo:Apk app.zip ]]&lt;/div&gt;</summary>
		<author><name>German.moreira</name></author>	</entry>

	<entry>
		<id>http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Programando_el_Butia_desde_el_celular&amp;diff=11706</id>
		<title>Programando el Butia desde el celular</title>
		<link rel="alternate" type="text/html" href="http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Programando_el_Butia_desde_el_celular&amp;diff=11706"/>
				<updated>2021-06-28T01:44:25Z</updated>
		
		<summary type="html">&lt;p&gt;German.moreira: /* Armado del Butiá */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Introducción ==&lt;br /&gt;
&lt;br /&gt;
La idea del proyecto en un principio era usar el celular como medio para controlar el robot Butiá para que resulte más atractivo para los estudiantes que no les guste la programación.&lt;br /&gt;
&lt;br /&gt;
Luego, la idea se modifico un poco debido a que descubrimos que con esta implementación, podíamos hacer mas sencilla la resolución de algunos ejercicios básicos mediante algoritmos mas simplificados, tomamos el trabajo que teníamos hecho hasta el momento y lo adaptamos a un menú con distintas acciones simples como avanzar un determinado tiempo, avanzar hasta chocar contra un objeto o rotar a la izquierda o derecha un determinado tiempo.&lt;br /&gt;
&lt;br /&gt;
Estas funciones básicas y bastante sencillas de entender más una interfaz amigable y fácil de usar, se implementaron para que el rango de edad de uso de esta aplicación vaya de 3 años en adelante.&lt;br /&gt;
&lt;br /&gt;
Como resultado obtuvimos una aplicación que se puede usar para que niños de:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- 4 / 5 / 6 años resuelvan ejercicios sencillos como puede ser llegar de un punto a otro, buscar el camino a un objeto o resolver un laberinto sencillo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- 7 / 8 / 9 años puedan resolver ejercicios un poco más complejos como puede ser resolver un laberinto del más sencillo al mas complejo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- 10 años en adelante tengan la capacidad de adaptar una parte personal de código al programa y puedan resolver cualquier ejercicio que se pueda plantear con el robot Butiá.&lt;br /&gt;
&lt;br /&gt;
== Objetivo y motivación==&lt;br /&gt;
&lt;br /&gt;
Los objetivos del proyecto eran, como dice el nombre, poder conectar remotamente el robot Butiá a un celular y buscar una abstracción de la mayor cantidad de problemas que puedan ser resueltos con el robot Butiá.&lt;br /&gt;
&lt;br /&gt;
Esto, para poder crear un método de uso del robot Butiá más dinámico y con funciones que permiten realizar, mediante algoritmos mas sencillos, la solución de la mayor cantidad de puzles particulares, abstrayéndose de la programación directa, lo que puede ser tedioso o abrumador para personas que tienen su primer acercamiento a la programación.&lt;br /&gt;
&lt;br /&gt;
Al hacer esto, el nivel de uso en aulas del robot Butiá, puede simplificarse hasta clases desde 3 años de jardinera en adelante, debido a que la aplicación simplifica la parte de codificación y los algoritmos de solución de ejercicios se convierten simplemente en una serie de pasos básicos a ejecutar linealmente.&lt;br /&gt;
&lt;br /&gt;
Lo que se busca con este proyecto, es despertar la curiosidad e interés en niños y adolescentes en el área de la programación de una forma didáctica, en donde estos pueden experimentar directamente con el robot y potenciar la creatividad para resolver problemas. &lt;br /&gt;
&lt;br /&gt;
La aplicación esta inspirada en el lenguaje &amp;quot;Sratch&amp;quot;, el cual es un lenguaje ideal para los primeros acercamientos a la programación. &lt;br /&gt;
&lt;br /&gt;
Este ''software'' permite ademas, introducir conceptos como, instrucciones, secuencialidad de código, algoritmos, secuencias de control, estructuras de repetición, etc. Como ejercicio, se puede plantear por ejemplo, hacer el pasaje a Python de algoritmos diseñados en la aplicación.&lt;br /&gt;
&lt;br /&gt;
== Armado del Butiá ==&lt;br /&gt;
&lt;br /&gt;
* Paso 1: Armar el Butiá a partir de esta [https://www.fing.edu.uy/inco/proyectos/butia/files/docs_butia2/armando_paso_a_paso_motores_CC_rev1.pdf guía oficial]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Paso 2: Instalar el sensor de grises&lt;br /&gt;
&lt;br /&gt;
1:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP1.jpeg]] &lt;br /&gt;
&lt;br /&gt;
2:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP2.jpeg]]&lt;br /&gt;
&lt;br /&gt;
3:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP3.jpeg]]&lt;br /&gt;
&lt;br /&gt;
4:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP4.jpeg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Paso 3: Instalar el sensor de distancia&lt;br /&gt;
&lt;br /&gt;
1:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP1.png]]&lt;br /&gt;
&lt;br /&gt;
2:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP2.png]]&lt;br /&gt;
&lt;br /&gt;
3:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP3.png]]&lt;br /&gt;
&lt;br /&gt;
4:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP4.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Texto en negrita''': Es indispensable que los componentes del robot se encuentren en conidicones optimas para que este tenga el comportamiento deseado al momento de ejecutar las acciones enviadas desde la app.&lt;br /&gt;
&lt;br /&gt;
== Protocolo de comunicación ==&lt;br /&gt;
El protocolo de comunicaron diseñado para la comunicación entre Servidor y Aplicación ''Mobile'' es el siguiente:&lt;br /&gt;
&lt;br /&gt;
'''''Accion0-S0\nAccion1-S1\nAccion2-S2\nAccion3\nAccion4-S4\nVelocidad'''''&lt;br /&gt;
&lt;br /&gt;
Donde, este ''string'' representa la serie encadenada de acciones que el servidor recibe para ejecutar en el robot desde la aplicación por medio de un ''WebSocket'' (socket que utiliza protocolo http).&lt;br /&gt;
Cada acción esta separada de la que se encuentra a continuación por el símbolo &amp;quot;''\n''&amp;quot;.&lt;br /&gt;
Podemos diferenciar dos tipos de acciones, las que requieren parámetro y las que no, estas se comunican de la siguiente forma:&lt;br /&gt;
&lt;br /&gt;
'''-Acción con parámetro''': NombreAccion-Parametro&lt;br /&gt;
&lt;br /&gt;
'''-Acción sin parámetro''': NombreAccion&lt;br /&gt;
&lt;br /&gt;
== Implementación código Python ==&lt;br /&gt;
&lt;br /&gt;
Antes de empezar a programar o usar el código, es necesario instalar las librerías a usar, esto se puede hacer escribiendo &lt;br /&gt;
&lt;br /&gt;
'''''pip install [nombre de la librería]''''' en el interprete de comandos del sistema.&lt;br /&gt;
&lt;br /&gt;
Entonces instalamos la librería a utilizar, en este caso:&lt;br /&gt;
&lt;br /&gt;
'''''pip install simple_websocket_server'''''&lt;br /&gt;
&lt;br /&gt;
Una vez instalada la librería, hay que empezar a escribir el código.&lt;br /&gt;
&lt;br /&gt;
El encabezado del código es el siguiente&lt;br /&gt;
El uso de cada librería se explica con detalle mas adelante&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Encabezado.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A partir de la librería '''sys''' se define el camino del sistema para utilizar los plugin Butiá.&lt;br /&gt;
En nuestro caso, la ruta es ''' '/home/trerb/TurtleBots.activity/plugins/butia' ''', eso se tiene que modificar dependiendo de donde se encuentren el directorio ''' TurtleBots.activity/ ''' en su sistema de archivos&lt;br /&gt;
&lt;br /&gt;
[[Archivo:UsoPluginButia.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego se encuentra la función ''' clearConsole ''',&lt;br /&gt;
Esta función sirve únicamente para limpiar el interprete de Python usando la librería ''' os ''' y tener una ejecución mas limpia&lt;br /&gt;
&lt;br /&gt;
[[Archivo:clearConsole().png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
El siguiente código utiliza la librería ''' socket ''' para conectarse a la web y preguntar la ip del ordenador que ejecuta el archivo y la muestra en pantalla, esto se usa para facilitar la conexión con la App Mobile&lt;br /&gt;
&lt;br /&gt;
[[Archivo:conexionSocket.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Las siguientes líneas de código preguntan al usuario que puerto va a utilizar para la conexión, este código verifica que se ingrese un dato numérico, dentro del rango de los puertos, y que el puerto este disponible.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:tryPuerto.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego se declaran las variables: ''' Speed, Puerto_Gris y Puerto_Distancia ''', se verifica que los sensores de distancia y de grises estén conectados y asigna el puerto en el que estén conectados a las variables ''' Puerto_Distancia ''' y ''' Puerto_Gris ''' respectivamente. La variable ''' Speed ''' es una variable global que se lee al inicio de cada cadena de acciones y la utiliza para todos los movimientos del Butiá de esa cadena.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:declaracionVariables.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Seguimos con la declaración de las funciones básicas del Butiá, en este caso son ''' Avanzar, Rotar, AvanzarHastaVerColor y AvanzarHastaObstaculo ''' &lt;br /&gt;
&lt;br /&gt;
-La función ''' Avanzar ''' recibe un parámetro de tiempo y el Butiá avanza ese determinado tiempo.&lt;br /&gt;
&lt;br /&gt;
-La función ''' Retroceder ''' recibe un parámetro de tiempo y el Butiá retrocede ese determinado tiempo.&lt;br /&gt;
&lt;br /&gt;
-La función ''' Rotar ''' recibe dos parámetros, una dirección que puede ser Izquierda o Derecha y un tiempo que indica la duración de la rotación del Butiá.&lt;br /&gt;
&lt;br /&gt;
-La función ''' AvanzarHastaVerColor ''' recibe un parámetro que varia entre Blanco o Negro, el robot va a avanzar hasta detectar el color seleccionado.&lt;br /&gt;
Esta función solo se puede usar si el sensor de grises esta conectado.&lt;br /&gt;
&lt;br /&gt;
-Por ultimo, la función ''' AvanzarHastaObstaculo ''' no recibe parámetros, en este caso el Butiá va a avanzar hasta estar a unos pocos centímetros de un obstáculo.&lt;br /&gt;
Esta función solo se puede usar si el sensor de distancia esta conectado.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:FuncionesBasicas.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego se encuentra una función ''' Accion1 ''' esta función la puede definir el usuario a gusto, se puede implementar desde una función básica hasta un seguidor de líneas avanzado. La única condición que se necesita para implementar esta ''' Accion1 ''' es que no puede recibir parámetros&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Accion1.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ahora tenemos que definir el menú principal del programa, este se divide en dos funciones&lt;br /&gt;
&lt;br /&gt;
- ''' handle ''': Esta es una función predeterminada de la librería ''' simple_web_socket ''' y se llama cada vez que el servidor recibe un dato del cliente. En este caso la función crea una lista de las acciones que le llegan de la App Mobile, y las va ejecutando ordenadamente&lt;br /&gt;
&lt;br /&gt;
- ''' handle_close ''': Al igual que la función anterior, esta también es una función predeterminada de la librería ''' simple_web_socket ''' y se llama cuando el cliente se desconecta del servidor&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Screenshot from 2021-06-27 03-58-56.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Y por ultimo tenemos el dos líneas de codigo, la primera se encarga de abrir el servidor y la segunda lo mantiene abierto infinitamente&lt;br /&gt;
&lt;br /&gt;
[[Archivo:abrirServidor.png]]&lt;br /&gt;
&lt;br /&gt;
== Implementación código React ==&lt;br /&gt;
&lt;br /&gt;
La aplicación ''mobile'' esta implementada con React Native, ademas, se utiliza el ''framework'' [https://docs.expo.io/ Expo]. Este ''framework'' nos brinda un conjunto de herramientas que facilita el desarrollo de aplicaciones ''mobile''. &lt;br /&gt;
En caso de querer agregar, o modificar cualidades, es necesario proceder de la siguiente forma:&lt;br /&gt;
&lt;br /&gt;
Descargar el archivo comprimido adjunto.&lt;br /&gt;
&lt;br /&gt;
Extraerlo, posicionarse en el directorio raiz de la carpeta descomprimida, y ejecutar desde la terminal lo siguiente (tener en cuenta que es necesario tener en la maquina, el gestor de paquetes [https://docs.npmjs.com/ npm]).&lt;br /&gt;
&lt;br /&gt;
''''npm install'''' &lt;br /&gt;
&lt;br /&gt;
Esto descarga las dependencias que utiliza la aplicación, luego de esto podemos empezar a desarrollar.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para visualizar los cambios en tiempo real mientras desarrollamos, es necesario instalar la aplicación Expo Go para [https://play.google.com/store/apps/details?id=host.exp.exponent&amp;amp;hl=es_UY&amp;amp;gl=US Android] o para [https://apps.apple.com/es/app/expo-go/id982107779 iOS] según sea el caso.&lt;br /&gt;
&lt;br /&gt;
Para a visualizar la app en desarrollo desde Expo Go, procedemos de la siguiente forma:&lt;br /&gt;
Desde el directorio raíz de la aplicación ejecutamos desde la terminal lo siguiente:&lt;br /&gt;
&lt;br /&gt;
''''npm start''''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego, desde la aplicación Expo Go, con el celular conectado en la misma red local accedemos a la aplicación seleccionando lo siguiente:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Expo.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hecho esto, podemos cambiar el código de la aplicación y ver reflejados los cambios de forma casi instantánea.&lt;br /&gt;
&lt;br /&gt;
La aplicación esta compuesta por dos pantallas, la pantalla de configuración (''ConfigScreen.js''), donde se ingresa la dirección ip y puerto del servidor, y la pantalla principal (''MainScreen.js''), donde se lleva a cabo la programación del robot mediante acciones.&lt;br /&gt;
&lt;br /&gt;
Esta ultima pantalla esta compuesta por los componentes ''TopList.js'' y ''BottomList.js''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Untitled presentation.png]]&lt;br /&gt;
&lt;br /&gt;
Para agregar una nueva accion al sistema, es necesario programarla en el servidor con un determinado nombre, supondremos &amp;quot;AccionN&amp;quot;, esto resulta fácil si se toma como ejemplo las acciones ya implementadas.&lt;br /&gt;
&lt;br /&gt;
En la aplicación, esta nueva acción se agrega en el ''array'' &amp;quot;''actionsData''&amp;quot;, dicho ''array'' se encuentra en la pantalla principal, es decir en el archivo &amp;quot;''MainScreen.js''&amp;quot;, cada acción cuenta con los siguientes datos:&lt;br /&gt;
&lt;br /&gt;
-'''idAccion:''' Identificador de la acción en dicho arreglo (actionsData).&lt;br /&gt;
&lt;br /&gt;
-'''title:''': Titulo de la acción que se muestra en el panel superior.&lt;br /&gt;
&lt;br /&gt;
-'''actionId:''' Nombre identificador de la acción en el servidor.&lt;br /&gt;
&lt;br /&gt;
-'''overlay:''' ''Overlay'' que se despliega al seleccionar la acción (si esta requiere cierto parámetro), esta función lleva como parámetro &amp;quot;''editOverlay''&amp;quot; y &amp;quot;''id''&amp;quot;, estos se utilizan cuando se requiere cambiar dicha variable en una acción que ya fue seleccionada y se encuentra en el panel inferior de la aplicación, como por ejemplo pueden ser segundos en el caso de la acción &amp;quot;Avanzar&amp;quot;, o colores en el caso de &amp;quot;Avanzar hasta obstáculo&amp;quot;. Este parámetro puede ser que no sea necesario, como es en el caso de la acción &amp;quot;Avanzar hasta obstáculo&amp;quot;, en este ultimo caso el valor de este campo es ''null''.&lt;br /&gt;
&lt;br /&gt;
Ejemplo de la acción &amp;quot;Avanzar&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Screenshot from 2021-06-27 04-18-42.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ejemplo de la acción &amp;quot;Avanzar hasta obstáculo&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Screenshot_from_2021-06-27_00-28-32.png]]&lt;br /&gt;
&lt;br /&gt;
== Manual de uso de la aplicación ==&lt;br /&gt;
&lt;br /&gt;
Aunque la aplicación resulta intuitiva y fácil de usar se describe a continuación una serie de pasos para utilizarla correctamente.&lt;br /&gt;
&lt;br /&gt;
Para comenzar a utilizar la aplicación es necesario configurar la conexión de la aplicación con el servidor (recordar que ambos se deben encontrar ejecutándose en la misma red local), el servidor ejecutando en una computadora que esté conectada correctamente al butiá (con los sensores descritos anteriormente) y la aplicación ejecutándose en el celular.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Conectando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego que la conexión haya resultado exitosa, nos encontramos en la pantalla principal. En el panel superior, como se muestra a continuación, se encuentran las aplicaciones disponibles que podemos ejecutar en el robot butiá.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Acciones.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para agregar una serie de acciones al robot, simplemente presionamos la que queramos, a continuación esta aparecerá en el panel inferior, a medida de que vayamos seleccionando acciones, estas se irán encadenando una tras otras, estas estarán prontas para ejecutarse secuencialmente, desde la parte inferior, a la parte superior, en el momento que presionemos el botón &amp;quot;Empezar&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Agregando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Como la aplicación está pensada para planificar algoritmos para resolver desafíos o ''puzzles'', es probable que nos equivoquemos y seleccionemos una acción o insertemos un parámetro incorrectamente, ¡pero no te preocupes!. Para editar el parámetro que le hayamos ingresado a una acción, simplemente mantenemos pulsado la que deseamos corregir e ingresamos el nuevo valor.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Editando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
También es posible eliminar una acción, para hacer esto, nuevamente mantenemos pulsada la acción que queremos eliminar, pero esta vez, seleccionamos la acción eliminar. A continuación la acción seleccionada desaparecerá del panel inferior. También es posible que deseemos eliminar todas las acciones que habíamos ingresado, en este caso seleccionamos el botón &amp;quot;Eliminar acciones&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Eliminando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es posible que queremos que el robot se desplace a ciertas velocidades, teniendo en cuenta que al modificar la velocidad, el robot tendrá un comportamiento totalmente diferente, debido a que gran parte de las acciones se ejecutan por un tiempo asignado, a mayor velocidad, más desplazamiento.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Velocidad.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En caso de que exista un error en la conexión, podemos intentar volver a conectar la aplicación al servidor, para esto seleccionamos la opción configuración.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:A configuracion.gif]]&lt;br /&gt;
&lt;br /&gt;
== Mejoras a futuro ==&lt;br /&gt;
&lt;br /&gt;
* Implementar una forma para que las función ''' Accion1 ''' pueda recibir parámetros, para así ampliar la gama de problemas que se puedan solucionar a través de esta aplicación.&lt;br /&gt;
&lt;br /&gt;
* Implementación de código que permita añadir a través del código, una mayor cantidad de funciones genéricas a la aplicación.&lt;br /&gt;
&lt;br /&gt;
* Desarrollar una forma de comunicación bilateral entre la ''App Mobile'' y Python para mejorar el ''debug'' en tiempo de ejecución.&lt;br /&gt;
&lt;br /&gt;
== Archivos de uso ==&lt;br /&gt;
&lt;br /&gt;
- [[Archivo:Server Code.zip]]&lt;br /&gt;
&lt;br /&gt;
- [[Archivo:App code.zip]]&lt;br /&gt;
&lt;br /&gt;
- [[Archivo:Apk app.zip ]]&lt;/div&gt;</summary>
		<author><name>German.moreira</name></author>	</entry>

	<entry>
		<id>http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Programando_el_Butia_desde_el_celular&amp;diff=11705</id>
		<title>Programando el Butia desde el celular</title>
		<link rel="alternate" type="text/html" href="http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Programando_el_Butia_desde_el_celular&amp;diff=11705"/>
				<updated>2021-06-28T01:43:55Z</updated>
		
		<summary type="html">&lt;p&gt;German.moreira: /* Armado del Butiá */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Introducción ==&lt;br /&gt;
&lt;br /&gt;
La idea del proyecto en un principio era usar el celular como medio para controlar el robot Butiá para que resulte más atractivo para los estudiantes que no les guste la programación.&lt;br /&gt;
&lt;br /&gt;
Luego, la idea se modifico un poco debido a que descubrimos que con esta implementación, podíamos hacer mas sencilla la resolución de algunos ejercicios básicos mediante algoritmos mas simplificados, tomamos el trabajo que teníamos hecho hasta el momento y lo adaptamos a un menú con distintas acciones simples como avanzar un determinado tiempo, avanzar hasta chocar contra un objeto o rotar a la izquierda o derecha un determinado tiempo.&lt;br /&gt;
&lt;br /&gt;
Estas funciones básicas y bastante sencillas de entender más una interfaz amigable y fácil de usar, se implementaron para que el rango de edad de uso de esta aplicación vaya de 3 años en adelante.&lt;br /&gt;
&lt;br /&gt;
Como resultado obtuvimos una aplicación que se puede usar para que niños de:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- 4 / 5 / 6 años resuelvan ejercicios sencillos como puede ser llegar de un punto a otro, buscar el camino a un objeto o resolver un laberinto sencillo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- 7 / 8 / 9 años puedan resolver ejercicios un poco más complejos como puede ser resolver un laberinto del más sencillo al mas complejo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- 10 años en adelante tengan la capacidad de adaptar una parte personal de código al programa y puedan resolver cualquier ejercicio que se pueda plantear con el robot Butiá.&lt;br /&gt;
&lt;br /&gt;
== Objetivo y motivación==&lt;br /&gt;
&lt;br /&gt;
Los objetivos del proyecto eran, como dice el nombre, poder conectar remotamente el robot Butiá a un celular y buscar una abstracción de la mayor cantidad de problemas que puedan ser resueltos con el robot Butiá.&lt;br /&gt;
&lt;br /&gt;
Esto, para poder crear un método de uso del robot Butiá más dinámico y con funciones que permiten realizar, mediante algoritmos mas sencillos, la solución de la mayor cantidad de puzles particulares, abstrayéndose de la programación directa, lo que puede ser tedioso o abrumador para personas que tienen su primer acercamiento a la programación.&lt;br /&gt;
&lt;br /&gt;
Al hacer esto, el nivel de uso en aulas del robot Butiá, puede simplificarse hasta clases desde 3 años de jardinera en adelante, debido a que la aplicación simplifica la parte de codificación y los algoritmos de solución de ejercicios se convierten simplemente en una serie de pasos básicos a ejecutar linealmente.&lt;br /&gt;
&lt;br /&gt;
Lo que se busca con este proyecto, es despertar la curiosidad e interés en niños y adolescentes en el área de la programación de una forma didáctica, en donde estos pueden experimentar directamente con el robot y potenciar la creatividad para resolver problemas. &lt;br /&gt;
&lt;br /&gt;
La aplicación esta inspirada en el lenguaje &amp;quot;Sratch&amp;quot;, el cual es un lenguaje ideal para los primeros acercamientos a la programación. &lt;br /&gt;
&lt;br /&gt;
Este ''software'' permite ademas, introducir conceptos como, instrucciones, secuencialidad de código, algoritmos, secuencias de control, estructuras de repetición, etc. Como ejercicio, se puede plantear por ejemplo, hacer el pasaje a Python de algoritmos diseñados en la aplicación.&lt;br /&gt;
&lt;br /&gt;
== Armado del Butiá ==&lt;br /&gt;
&lt;br /&gt;
* Paso 1: Armar el Butiá a partir de esta [https://www.fing.edu.uy/inco/proyectos/butia/files/docs_butia2/armando_paso_a_paso_motores_CC_rev1.pdf guía oficial]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Paso 2: Instalar el sensor de grises&lt;br /&gt;
&lt;br /&gt;
1:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP1.jpeg]] &lt;br /&gt;
&lt;br /&gt;
2:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP2.jpeg]]&lt;br /&gt;
&lt;br /&gt;
3:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP3.jpeg]]&lt;br /&gt;
&lt;br /&gt;
4:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP4.jpeg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Paso 3: Instalar el sensor de distancia&lt;br /&gt;
&lt;br /&gt;
1:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP1.png]]&lt;br /&gt;
&lt;br /&gt;
2:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP2.png]]&lt;br /&gt;
&lt;br /&gt;
3:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP3.png]]&lt;br /&gt;
&lt;br /&gt;
4:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP4.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''Observacion'': Es indispensable que los componentes del robot se encuentren en conidicones optimas para que este tenga el comportamiento deseado al momento de ejecutar las acciones enviadas desde la app.&lt;br /&gt;
&lt;br /&gt;
== Protocolo de comunicación ==&lt;br /&gt;
El protocolo de comunicaron diseñado para la comunicación entre Servidor y Aplicación ''Mobile'' es el siguiente:&lt;br /&gt;
&lt;br /&gt;
'''''Accion0-S0\nAccion1-S1\nAccion2-S2\nAccion3\nAccion4-S4\nVelocidad'''''&lt;br /&gt;
&lt;br /&gt;
Donde, este ''string'' representa la serie encadenada de acciones que el servidor recibe para ejecutar en el robot desde la aplicación por medio de un ''WebSocket'' (socket que utiliza protocolo http).&lt;br /&gt;
Cada acción esta separada de la que se encuentra a continuación por el símbolo &amp;quot;''\n''&amp;quot;.&lt;br /&gt;
Podemos diferenciar dos tipos de acciones, las que requieren parámetro y las que no, estas se comunican de la siguiente forma:&lt;br /&gt;
&lt;br /&gt;
'''-Acción con parámetro''': NombreAccion-Parametro&lt;br /&gt;
&lt;br /&gt;
'''-Acción sin parámetro''': NombreAccion&lt;br /&gt;
&lt;br /&gt;
== Implementación código Python ==&lt;br /&gt;
&lt;br /&gt;
Antes de empezar a programar o usar el código, es necesario instalar las librerías a usar, esto se puede hacer escribiendo &lt;br /&gt;
&lt;br /&gt;
'''''pip install [nombre de la librería]''''' en el interprete de comandos del sistema.&lt;br /&gt;
&lt;br /&gt;
Entonces instalamos la librería a utilizar, en este caso:&lt;br /&gt;
&lt;br /&gt;
'''''pip install simple_websocket_server'''''&lt;br /&gt;
&lt;br /&gt;
Una vez instalada la librería, hay que empezar a escribir el código.&lt;br /&gt;
&lt;br /&gt;
El encabezado del código es el siguiente&lt;br /&gt;
El uso de cada librería se explica con detalle mas adelante&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Encabezado.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A partir de la librería '''sys''' se define el camino del sistema para utilizar los plugin Butiá.&lt;br /&gt;
En nuestro caso, la ruta es ''' '/home/trerb/TurtleBots.activity/plugins/butia' ''', eso se tiene que modificar dependiendo de donde se encuentren el directorio ''' TurtleBots.activity/ ''' en su sistema de archivos&lt;br /&gt;
&lt;br /&gt;
[[Archivo:UsoPluginButia.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego se encuentra la función ''' clearConsole ''',&lt;br /&gt;
Esta función sirve únicamente para limpiar el interprete de Python usando la librería ''' os ''' y tener una ejecución mas limpia&lt;br /&gt;
&lt;br /&gt;
[[Archivo:clearConsole().png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
El siguiente código utiliza la librería ''' socket ''' para conectarse a la web y preguntar la ip del ordenador que ejecuta el archivo y la muestra en pantalla, esto se usa para facilitar la conexión con la App Mobile&lt;br /&gt;
&lt;br /&gt;
[[Archivo:conexionSocket.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Las siguientes líneas de código preguntan al usuario que puerto va a utilizar para la conexión, este código verifica que se ingrese un dato numérico, dentro del rango de los puertos, y que el puerto este disponible.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:tryPuerto.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego se declaran las variables: ''' Speed, Puerto_Gris y Puerto_Distancia ''', se verifica que los sensores de distancia y de grises estén conectados y asigna el puerto en el que estén conectados a las variables ''' Puerto_Distancia ''' y ''' Puerto_Gris ''' respectivamente. La variable ''' Speed ''' es una variable global que se lee al inicio de cada cadena de acciones y la utiliza para todos los movimientos del Butiá de esa cadena.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:declaracionVariables.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Seguimos con la declaración de las funciones básicas del Butiá, en este caso son ''' Avanzar, Rotar, AvanzarHastaVerColor y AvanzarHastaObstaculo ''' &lt;br /&gt;
&lt;br /&gt;
-La función ''' Avanzar ''' recibe un parámetro de tiempo y el Butiá avanza ese determinado tiempo.&lt;br /&gt;
&lt;br /&gt;
-La función ''' Retroceder ''' recibe un parámetro de tiempo y el Butiá retrocede ese determinado tiempo.&lt;br /&gt;
&lt;br /&gt;
-La función ''' Rotar ''' recibe dos parámetros, una dirección que puede ser Izquierda o Derecha y un tiempo que indica la duración de la rotación del Butiá.&lt;br /&gt;
&lt;br /&gt;
-La función ''' AvanzarHastaVerColor ''' recibe un parámetro que varia entre Blanco o Negro, el robot va a avanzar hasta detectar el color seleccionado.&lt;br /&gt;
Esta función solo se puede usar si el sensor de grises esta conectado.&lt;br /&gt;
&lt;br /&gt;
-Por ultimo, la función ''' AvanzarHastaObstaculo ''' no recibe parámetros, en este caso el Butiá va a avanzar hasta estar a unos pocos centímetros de un obstáculo.&lt;br /&gt;
Esta función solo se puede usar si el sensor de distancia esta conectado.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:FuncionesBasicas.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego se encuentra una función ''' Accion1 ''' esta función la puede definir el usuario a gusto, se puede implementar desde una función básica hasta un seguidor de líneas avanzado. La única condición que se necesita para implementar esta ''' Accion1 ''' es que no puede recibir parámetros&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Accion1.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ahora tenemos que definir el menú principal del programa, este se divide en dos funciones&lt;br /&gt;
&lt;br /&gt;
- ''' handle ''': Esta es una función predeterminada de la librería ''' simple_web_socket ''' y se llama cada vez que el servidor recibe un dato del cliente. En este caso la función crea una lista de las acciones que le llegan de la App Mobile, y las va ejecutando ordenadamente&lt;br /&gt;
&lt;br /&gt;
- ''' handle_close ''': Al igual que la función anterior, esta también es una función predeterminada de la librería ''' simple_web_socket ''' y se llama cuando el cliente se desconecta del servidor&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Screenshot from 2021-06-27 03-58-56.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Y por ultimo tenemos el dos líneas de codigo, la primera se encarga de abrir el servidor y la segunda lo mantiene abierto infinitamente&lt;br /&gt;
&lt;br /&gt;
[[Archivo:abrirServidor.png]]&lt;br /&gt;
&lt;br /&gt;
== Implementación código React ==&lt;br /&gt;
&lt;br /&gt;
La aplicación ''mobile'' esta implementada con React Native, ademas, se utiliza el ''framework'' [https://docs.expo.io/ Expo]. Este ''framework'' nos brinda un conjunto de herramientas que facilita el desarrollo de aplicaciones ''mobile''. &lt;br /&gt;
En caso de querer agregar, o modificar cualidades, es necesario proceder de la siguiente forma:&lt;br /&gt;
&lt;br /&gt;
Descargar el archivo comprimido adjunto.&lt;br /&gt;
&lt;br /&gt;
Extraerlo, posicionarse en el directorio raiz de la carpeta descomprimida, y ejecutar desde la terminal lo siguiente (tener en cuenta que es necesario tener en la maquina, el gestor de paquetes [https://docs.npmjs.com/ npm]).&lt;br /&gt;
&lt;br /&gt;
''''npm install'''' &lt;br /&gt;
&lt;br /&gt;
Esto descarga las dependencias que utiliza la aplicación, luego de esto podemos empezar a desarrollar.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para visualizar los cambios en tiempo real mientras desarrollamos, es necesario instalar la aplicación Expo Go para [https://play.google.com/store/apps/details?id=host.exp.exponent&amp;amp;hl=es_UY&amp;amp;gl=US Android] o para [https://apps.apple.com/es/app/expo-go/id982107779 iOS] según sea el caso.&lt;br /&gt;
&lt;br /&gt;
Para a visualizar la app en desarrollo desde Expo Go, procedemos de la siguiente forma:&lt;br /&gt;
Desde el directorio raíz de la aplicación ejecutamos desde la terminal lo siguiente:&lt;br /&gt;
&lt;br /&gt;
''''npm start''''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego, desde la aplicación Expo Go, con el celular conectado en la misma red local accedemos a la aplicación seleccionando lo siguiente:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Expo.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hecho esto, podemos cambiar el código de la aplicación y ver reflejados los cambios de forma casi instantánea.&lt;br /&gt;
&lt;br /&gt;
La aplicación esta compuesta por dos pantallas, la pantalla de configuración (''ConfigScreen.js''), donde se ingresa la dirección ip y puerto del servidor, y la pantalla principal (''MainScreen.js''), donde se lleva a cabo la programación del robot mediante acciones.&lt;br /&gt;
&lt;br /&gt;
Esta ultima pantalla esta compuesta por los componentes ''TopList.js'' y ''BottomList.js''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Untitled presentation.png]]&lt;br /&gt;
&lt;br /&gt;
Para agregar una nueva accion al sistema, es necesario programarla en el servidor con un determinado nombre, supondremos &amp;quot;AccionN&amp;quot;, esto resulta fácil si se toma como ejemplo las acciones ya implementadas.&lt;br /&gt;
&lt;br /&gt;
En la aplicación, esta nueva acción se agrega en el ''array'' &amp;quot;''actionsData''&amp;quot;, dicho ''array'' se encuentra en la pantalla principal, es decir en el archivo &amp;quot;''MainScreen.js''&amp;quot;, cada acción cuenta con los siguientes datos:&lt;br /&gt;
&lt;br /&gt;
-'''idAccion:''' Identificador de la acción en dicho arreglo (actionsData).&lt;br /&gt;
&lt;br /&gt;
-'''title:''': Titulo de la acción que se muestra en el panel superior.&lt;br /&gt;
&lt;br /&gt;
-'''actionId:''' Nombre identificador de la acción en el servidor.&lt;br /&gt;
&lt;br /&gt;
-'''overlay:''' ''Overlay'' que se despliega al seleccionar la acción (si esta requiere cierto parámetro), esta función lleva como parámetro &amp;quot;''editOverlay''&amp;quot; y &amp;quot;''id''&amp;quot;, estos se utilizan cuando se requiere cambiar dicha variable en una acción que ya fue seleccionada y se encuentra en el panel inferior de la aplicación, como por ejemplo pueden ser segundos en el caso de la acción &amp;quot;Avanzar&amp;quot;, o colores en el caso de &amp;quot;Avanzar hasta obstáculo&amp;quot;. Este parámetro puede ser que no sea necesario, como es en el caso de la acción &amp;quot;Avanzar hasta obstáculo&amp;quot;, en este ultimo caso el valor de este campo es ''null''.&lt;br /&gt;
&lt;br /&gt;
Ejemplo de la acción &amp;quot;Avanzar&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Screenshot from 2021-06-27 04-18-42.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ejemplo de la acción &amp;quot;Avanzar hasta obstáculo&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Screenshot_from_2021-06-27_00-28-32.png]]&lt;br /&gt;
&lt;br /&gt;
== Manual de uso de la aplicación ==&lt;br /&gt;
&lt;br /&gt;
Aunque la aplicación resulta intuitiva y fácil de usar se describe a continuación una serie de pasos para utilizarla correctamente.&lt;br /&gt;
&lt;br /&gt;
Para comenzar a utilizar la aplicación es necesario configurar la conexión de la aplicación con el servidor (recordar que ambos se deben encontrar ejecutándose en la misma red local), el servidor ejecutando en una computadora que esté conectada correctamente al butiá (con los sensores descritos anteriormente) y la aplicación ejecutándose en el celular.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Conectando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego que la conexión haya resultado exitosa, nos encontramos en la pantalla principal. En el panel superior, como se muestra a continuación, se encuentran las aplicaciones disponibles que podemos ejecutar en el robot butiá.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Acciones.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para agregar una serie de acciones al robot, simplemente presionamos la que queramos, a continuación esta aparecerá en el panel inferior, a medida de que vayamos seleccionando acciones, estas se irán encadenando una tras otras, estas estarán prontas para ejecutarse secuencialmente, desde la parte inferior, a la parte superior, en el momento que presionemos el botón &amp;quot;Empezar&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Agregando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Como la aplicación está pensada para planificar algoritmos para resolver desafíos o ''puzzles'', es probable que nos equivoquemos y seleccionemos una acción o insertemos un parámetro incorrectamente, ¡pero no te preocupes!. Para editar el parámetro que le hayamos ingresado a una acción, simplemente mantenemos pulsado la que deseamos corregir e ingresamos el nuevo valor.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Editando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
También es posible eliminar una acción, para hacer esto, nuevamente mantenemos pulsada la acción que queremos eliminar, pero esta vez, seleccionamos la acción eliminar. A continuación la acción seleccionada desaparecerá del panel inferior. También es posible que deseemos eliminar todas las acciones que habíamos ingresado, en este caso seleccionamos el botón &amp;quot;Eliminar acciones&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Eliminando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es posible que queremos que el robot se desplace a ciertas velocidades, teniendo en cuenta que al modificar la velocidad, el robot tendrá un comportamiento totalmente diferente, debido a que gran parte de las acciones se ejecutan por un tiempo asignado, a mayor velocidad, más desplazamiento.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Velocidad.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En caso de que exista un error en la conexión, podemos intentar volver a conectar la aplicación al servidor, para esto seleccionamos la opción configuración.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:A configuracion.gif]]&lt;br /&gt;
&lt;br /&gt;
== Mejoras a futuro ==&lt;br /&gt;
&lt;br /&gt;
* Implementar una forma para que las función ''' Accion1 ''' pueda recibir parámetros, para así ampliar la gama de problemas que se puedan solucionar a través de esta aplicación.&lt;br /&gt;
&lt;br /&gt;
* Implementación de código que permita añadir a través del código, una mayor cantidad de funciones genéricas a la aplicación.&lt;br /&gt;
&lt;br /&gt;
* Desarrollar una forma de comunicación bilateral entre la ''App Mobile'' y Python para mejorar el ''debug'' en tiempo de ejecución.&lt;br /&gt;
&lt;br /&gt;
== Archivos de uso ==&lt;br /&gt;
&lt;br /&gt;
- [[Archivo:Server Code.zip]]&lt;br /&gt;
&lt;br /&gt;
- [[Archivo:App code.zip]]&lt;br /&gt;
&lt;br /&gt;
- [[Archivo:Apk app.zip ]]&lt;/div&gt;</summary>
		<author><name>German.moreira</name></author>	</entry>

	<entry>
		<id>http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Programando_el_Butia_desde_el_celular&amp;diff=11704</id>
		<title>Programando el Butia desde el celular</title>
		<link rel="alternate" type="text/html" href="http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Programando_el_Butia_desde_el_celular&amp;diff=11704"/>
				<updated>2021-06-28T01:41:53Z</updated>
		
		<summary type="html">&lt;p&gt;German.moreira: /* Protocolo de comunicación */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Introducción ==&lt;br /&gt;
&lt;br /&gt;
La idea del proyecto en un principio era usar el celular como medio para controlar el robot Butiá para que resulte más atractivo para los estudiantes que no les guste la programación.&lt;br /&gt;
&lt;br /&gt;
Luego, la idea se modifico un poco debido a que descubrimos que con esta implementación, podíamos hacer mas sencilla la resolución de algunos ejercicios básicos mediante algoritmos mas simplificados, tomamos el trabajo que teníamos hecho hasta el momento y lo adaptamos a un menú con distintas acciones simples como avanzar un determinado tiempo, avanzar hasta chocar contra un objeto o rotar a la izquierda o derecha un determinado tiempo.&lt;br /&gt;
&lt;br /&gt;
Estas funciones básicas y bastante sencillas de entender más una interfaz amigable y fácil de usar, se implementaron para que el rango de edad de uso de esta aplicación vaya de 3 años en adelante.&lt;br /&gt;
&lt;br /&gt;
Como resultado obtuvimos una aplicación que se puede usar para que niños de:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- 4 / 5 / 6 años resuelvan ejercicios sencillos como puede ser llegar de un punto a otro, buscar el camino a un objeto o resolver un laberinto sencillo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- 7 / 8 / 9 años puedan resolver ejercicios un poco más complejos como puede ser resolver un laberinto del más sencillo al mas complejo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- 10 años en adelante tengan la capacidad de adaptar una parte personal de código al programa y puedan resolver cualquier ejercicio que se pueda plantear con el robot Butiá.&lt;br /&gt;
&lt;br /&gt;
== Objetivo y motivación==&lt;br /&gt;
&lt;br /&gt;
Los objetivos del proyecto eran, como dice el nombre, poder conectar remotamente el robot Butiá a un celular y buscar una abstracción de la mayor cantidad de problemas que puedan ser resueltos con el robot Butiá.&lt;br /&gt;
&lt;br /&gt;
Esto, para poder crear un método de uso del robot Butiá más dinámico y con funciones que permiten realizar, mediante algoritmos mas sencillos, la solución de la mayor cantidad de puzles particulares, abstrayéndose de la programación directa, lo que puede ser tedioso o abrumador para personas que tienen su primer acercamiento a la programación.&lt;br /&gt;
&lt;br /&gt;
Al hacer esto, el nivel de uso en aulas del robot Butiá, puede simplificarse hasta clases desde 3 años de jardinera en adelante, debido a que la aplicación simplifica la parte de codificación y los algoritmos de solución de ejercicios se convierten simplemente en una serie de pasos básicos a ejecutar linealmente.&lt;br /&gt;
&lt;br /&gt;
Lo que se busca con este proyecto, es despertar la curiosidad e interés en niños y adolescentes en el área de la programación de una forma didáctica, en donde estos pueden experimentar directamente con el robot y potenciar la creatividad para resolver problemas. &lt;br /&gt;
&lt;br /&gt;
La aplicación esta inspirada en el lenguaje &amp;quot;Sratch&amp;quot;, el cual es un lenguaje ideal para los primeros acercamientos a la programación. &lt;br /&gt;
&lt;br /&gt;
Este ''software'' permite ademas, introducir conceptos como, instrucciones, secuencialidad de código, algoritmos, secuencias de control, estructuras de repetición, etc. Como ejercicio, se puede plantear por ejemplo, hacer el pasaje a Python de algoritmos diseñados en la aplicación.&lt;br /&gt;
&lt;br /&gt;
== Armado del Butiá ==&lt;br /&gt;
&lt;br /&gt;
* Paso 1: Armar el Butiá a partir de esta [https://www.fing.edu.uy/inco/proyectos/butia/files/docs_butia2/armando_paso_a_paso_motores_CC_rev1.pdf guía oficial]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Paso 2: Instalar el sensor de grises&lt;br /&gt;
&lt;br /&gt;
1:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP1.jpeg]] &lt;br /&gt;
&lt;br /&gt;
2:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP2.jpeg]]&lt;br /&gt;
&lt;br /&gt;
3:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP3.jpeg]]&lt;br /&gt;
&lt;br /&gt;
4:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP4.jpeg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Paso 3: Instalar el sensor de distancia&lt;br /&gt;
&lt;br /&gt;
1:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP1.png]]&lt;br /&gt;
&lt;br /&gt;
2:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP2.png]]&lt;br /&gt;
&lt;br /&gt;
3:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP3.png]]&lt;br /&gt;
&lt;br /&gt;
4:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP4.png]]&lt;br /&gt;
&lt;br /&gt;
== Protocolo de comunicación ==&lt;br /&gt;
El protocolo de comunicaron diseñado para la comunicación entre Servidor y Aplicación ''Mobile'' es el siguiente:&lt;br /&gt;
&lt;br /&gt;
'''''Accion0-S0\nAccion1-S1\nAccion2-S2\nAccion3\nAccion4-S4\nVelocidad'''''&lt;br /&gt;
&lt;br /&gt;
Donde, este ''string'' representa la serie encadenada de acciones que el servidor recibe para ejecutar en el robot desde la aplicación por medio de un ''WebSocket'' (socket que utiliza protocolo http).&lt;br /&gt;
Cada acción esta separada de la que se encuentra a continuación por el símbolo &amp;quot;''\n''&amp;quot;.&lt;br /&gt;
Podemos diferenciar dos tipos de acciones, las que requieren parámetro y las que no, estas se comunican de la siguiente forma:&lt;br /&gt;
&lt;br /&gt;
'''-Acción con parámetro''': NombreAccion-Parametro&lt;br /&gt;
&lt;br /&gt;
'''-Acción sin parámetro''': NombreAccion&lt;br /&gt;
&lt;br /&gt;
== Implementación código Python ==&lt;br /&gt;
&lt;br /&gt;
Antes de empezar a programar o usar el código, es necesario instalar las librerías a usar, esto se puede hacer escribiendo &lt;br /&gt;
&lt;br /&gt;
'''''pip install [nombre de la librería]''''' en el interprete de comandos del sistema.&lt;br /&gt;
&lt;br /&gt;
Entonces instalamos la librería a utilizar, en este caso:&lt;br /&gt;
&lt;br /&gt;
'''''pip install simple_websocket_server'''''&lt;br /&gt;
&lt;br /&gt;
Una vez instalada la librería, hay que empezar a escribir el código.&lt;br /&gt;
&lt;br /&gt;
El encabezado del código es el siguiente&lt;br /&gt;
El uso de cada librería se explica con detalle mas adelante&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Encabezado.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A partir de la librería '''sys''' se define el camino del sistema para utilizar los plugin Butiá.&lt;br /&gt;
En nuestro caso, la ruta es ''' '/home/trerb/TurtleBots.activity/plugins/butia' ''', eso se tiene que modificar dependiendo de donde se encuentren el directorio ''' TurtleBots.activity/ ''' en su sistema de archivos&lt;br /&gt;
&lt;br /&gt;
[[Archivo:UsoPluginButia.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego se encuentra la función ''' clearConsole ''',&lt;br /&gt;
Esta función sirve únicamente para limpiar el interprete de Python usando la librería ''' os ''' y tener una ejecución mas limpia&lt;br /&gt;
&lt;br /&gt;
[[Archivo:clearConsole().png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
El siguiente código utiliza la librería ''' socket ''' para conectarse a la web y preguntar la ip del ordenador que ejecuta el archivo y la muestra en pantalla, esto se usa para facilitar la conexión con la App Mobile&lt;br /&gt;
&lt;br /&gt;
[[Archivo:conexionSocket.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Las siguientes líneas de código preguntan al usuario que puerto va a utilizar para la conexión, este código verifica que se ingrese un dato numérico, dentro del rango de los puertos, y que el puerto este disponible.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:tryPuerto.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego se declaran las variables: ''' Speed, Puerto_Gris y Puerto_Distancia ''', se verifica que los sensores de distancia y de grises estén conectados y asigna el puerto en el que estén conectados a las variables ''' Puerto_Distancia ''' y ''' Puerto_Gris ''' respectivamente. La variable ''' Speed ''' es una variable global que se lee al inicio de cada cadena de acciones y la utiliza para todos los movimientos del Butiá de esa cadena.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:declaracionVariables.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Seguimos con la declaración de las funciones básicas del Butiá, en este caso son ''' Avanzar, Rotar, AvanzarHastaVerColor y AvanzarHastaObstaculo ''' &lt;br /&gt;
&lt;br /&gt;
-La función ''' Avanzar ''' recibe un parámetro de tiempo y el Butiá avanza ese determinado tiempo.&lt;br /&gt;
&lt;br /&gt;
-La función ''' Retroceder ''' recibe un parámetro de tiempo y el Butiá retrocede ese determinado tiempo.&lt;br /&gt;
&lt;br /&gt;
-La función ''' Rotar ''' recibe dos parámetros, una dirección que puede ser Izquierda o Derecha y un tiempo que indica la duración de la rotación del Butiá.&lt;br /&gt;
&lt;br /&gt;
-La función ''' AvanzarHastaVerColor ''' recibe un parámetro que varia entre Blanco o Negro, el robot va a avanzar hasta detectar el color seleccionado.&lt;br /&gt;
Esta función solo se puede usar si el sensor de grises esta conectado.&lt;br /&gt;
&lt;br /&gt;
-Por ultimo, la función ''' AvanzarHastaObstaculo ''' no recibe parámetros, en este caso el Butiá va a avanzar hasta estar a unos pocos centímetros de un obstáculo.&lt;br /&gt;
Esta función solo se puede usar si el sensor de distancia esta conectado.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:FuncionesBasicas.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego se encuentra una función ''' Accion1 ''' esta función la puede definir el usuario a gusto, se puede implementar desde una función básica hasta un seguidor de líneas avanzado. La única condición que se necesita para implementar esta ''' Accion1 ''' es que no puede recibir parámetros&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Accion1.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ahora tenemos que definir el menú principal del programa, este se divide en dos funciones&lt;br /&gt;
&lt;br /&gt;
- ''' handle ''': Esta es una función predeterminada de la librería ''' simple_web_socket ''' y se llama cada vez que el servidor recibe un dato del cliente. En este caso la función crea una lista de las acciones que le llegan de la App Mobile, y las va ejecutando ordenadamente&lt;br /&gt;
&lt;br /&gt;
- ''' handle_close ''': Al igual que la función anterior, esta también es una función predeterminada de la librería ''' simple_web_socket ''' y se llama cuando el cliente se desconecta del servidor&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Screenshot from 2021-06-27 03-58-56.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Y por ultimo tenemos el dos líneas de codigo, la primera se encarga de abrir el servidor y la segunda lo mantiene abierto infinitamente&lt;br /&gt;
&lt;br /&gt;
[[Archivo:abrirServidor.png]]&lt;br /&gt;
&lt;br /&gt;
== Implementación código React ==&lt;br /&gt;
&lt;br /&gt;
La aplicación ''mobile'' esta implementada con React Native, ademas, se utiliza el ''framework'' [https://docs.expo.io/ Expo]. Este ''framework'' nos brinda un conjunto de herramientas que facilita el desarrollo de aplicaciones ''mobile''. &lt;br /&gt;
En caso de querer agregar, o modificar cualidades, es necesario proceder de la siguiente forma:&lt;br /&gt;
&lt;br /&gt;
Descargar el archivo comprimido adjunto.&lt;br /&gt;
&lt;br /&gt;
Extraerlo, posicionarse en el directorio raiz de la carpeta descomprimida, y ejecutar desde la terminal lo siguiente (tener en cuenta que es necesario tener en la maquina, el gestor de paquetes [https://docs.npmjs.com/ npm]).&lt;br /&gt;
&lt;br /&gt;
''''npm install'''' &lt;br /&gt;
&lt;br /&gt;
Esto descarga las dependencias que utiliza la aplicación, luego de esto podemos empezar a desarrollar.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para visualizar los cambios en tiempo real mientras desarrollamos, es necesario instalar la aplicación Expo Go para [https://play.google.com/store/apps/details?id=host.exp.exponent&amp;amp;hl=es_UY&amp;amp;gl=US Android] o para [https://apps.apple.com/es/app/expo-go/id982107779 iOS] según sea el caso.&lt;br /&gt;
&lt;br /&gt;
Para a visualizar la app en desarrollo desde Expo Go, procedemos de la siguiente forma:&lt;br /&gt;
Desde el directorio raíz de la aplicación ejecutamos desde la terminal lo siguiente:&lt;br /&gt;
&lt;br /&gt;
''''npm start''''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego, desde la aplicación Expo Go, con el celular conectado en la misma red local accedemos a la aplicación seleccionando lo siguiente:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Expo.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hecho esto, podemos cambiar el código de la aplicación y ver reflejados los cambios de forma casi instantánea.&lt;br /&gt;
&lt;br /&gt;
La aplicación esta compuesta por dos pantallas, la pantalla de configuración (''ConfigScreen.js''), donde se ingresa la dirección ip y puerto del servidor, y la pantalla principal (''MainScreen.js''), donde se lleva a cabo la programación del robot mediante acciones.&lt;br /&gt;
&lt;br /&gt;
Esta ultima pantalla esta compuesta por los componentes ''TopList.js'' y ''BottomList.js''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Untitled presentation.png]]&lt;br /&gt;
&lt;br /&gt;
Para agregar una nueva accion al sistema, es necesario programarla en el servidor con un determinado nombre, supondremos &amp;quot;AccionN&amp;quot;, esto resulta fácil si se toma como ejemplo las acciones ya implementadas.&lt;br /&gt;
&lt;br /&gt;
En la aplicación, esta nueva acción se agrega en el ''array'' &amp;quot;''actionsData''&amp;quot;, dicho ''array'' se encuentra en la pantalla principal, es decir en el archivo &amp;quot;''MainScreen.js''&amp;quot;, cada acción cuenta con los siguientes datos:&lt;br /&gt;
&lt;br /&gt;
-'''idAccion:''' Identificador de la acción en dicho arreglo (actionsData).&lt;br /&gt;
&lt;br /&gt;
-'''title:''': Titulo de la acción que se muestra en el panel superior.&lt;br /&gt;
&lt;br /&gt;
-'''actionId:''' Nombre identificador de la acción en el servidor.&lt;br /&gt;
&lt;br /&gt;
-'''overlay:''' ''Overlay'' que se despliega al seleccionar la acción (si esta requiere cierto parámetro), esta función lleva como parámetro &amp;quot;''editOverlay''&amp;quot; y &amp;quot;''id''&amp;quot;, estos se utilizan cuando se requiere cambiar dicha variable en una acción que ya fue seleccionada y se encuentra en el panel inferior de la aplicación, como por ejemplo pueden ser segundos en el caso de la acción &amp;quot;Avanzar&amp;quot;, o colores en el caso de &amp;quot;Avanzar hasta obstáculo&amp;quot;. Este parámetro puede ser que no sea necesario, como es en el caso de la acción &amp;quot;Avanzar hasta obstáculo&amp;quot;, en este ultimo caso el valor de este campo es ''null''.&lt;br /&gt;
&lt;br /&gt;
Ejemplo de la acción &amp;quot;Avanzar&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Screenshot from 2021-06-27 04-18-42.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ejemplo de la acción &amp;quot;Avanzar hasta obstáculo&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Screenshot_from_2021-06-27_00-28-32.png]]&lt;br /&gt;
&lt;br /&gt;
== Manual de uso de la aplicación ==&lt;br /&gt;
&lt;br /&gt;
Aunque la aplicación resulta intuitiva y fácil de usar se describe a continuación una serie de pasos para utilizarla correctamente.&lt;br /&gt;
&lt;br /&gt;
Para comenzar a utilizar la aplicación es necesario configurar la conexión de la aplicación con el servidor (recordar que ambos se deben encontrar ejecutándose en la misma red local), el servidor ejecutando en una computadora que esté conectada correctamente al butiá (con los sensores descritos anteriormente) y la aplicación ejecutándose en el celular.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Conectando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego que la conexión haya resultado exitosa, nos encontramos en la pantalla principal. En el panel superior, como se muestra a continuación, se encuentran las aplicaciones disponibles que podemos ejecutar en el robot butiá.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Acciones.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para agregar una serie de acciones al robot, simplemente presionamos la que queramos, a continuación esta aparecerá en el panel inferior, a medida de que vayamos seleccionando acciones, estas se irán encadenando una tras otras, estas estarán prontas para ejecutarse secuencialmente, desde la parte inferior, a la parte superior, en el momento que presionemos el botón &amp;quot;Empezar&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Agregando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Como la aplicación está pensada para planificar algoritmos para resolver desafíos o ''puzzles'', es probable que nos equivoquemos y seleccionemos una acción o insertemos un parámetro incorrectamente, ¡pero no te preocupes!. Para editar el parámetro que le hayamos ingresado a una acción, simplemente mantenemos pulsado la que deseamos corregir e ingresamos el nuevo valor.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Editando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
También es posible eliminar una acción, para hacer esto, nuevamente mantenemos pulsada la acción que queremos eliminar, pero esta vez, seleccionamos la acción eliminar. A continuación la acción seleccionada desaparecerá del panel inferior. También es posible que deseemos eliminar todas las acciones que habíamos ingresado, en este caso seleccionamos el botón &amp;quot;Eliminar acciones&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Eliminando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es posible que queremos que el robot se desplace a ciertas velocidades, teniendo en cuenta que al modificar la velocidad, el robot tendrá un comportamiento totalmente diferente, debido a que gran parte de las acciones se ejecutan por un tiempo asignado, a mayor velocidad, más desplazamiento.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Velocidad.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En caso de que exista un error en la conexión, podemos intentar volver a conectar la aplicación al servidor, para esto seleccionamos la opción configuración.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:A configuracion.gif]]&lt;br /&gt;
&lt;br /&gt;
== Mejoras a futuro ==&lt;br /&gt;
&lt;br /&gt;
* Implementar una forma para que las función ''' Accion1 ''' pueda recibir parámetros, para así ampliar la gama de problemas que se puedan solucionar a través de esta aplicación.&lt;br /&gt;
&lt;br /&gt;
* Implementación de código que permita añadir a través del código, una mayor cantidad de funciones genéricas a la aplicación.&lt;br /&gt;
&lt;br /&gt;
* Desarrollar una forma de comunicación bilateral entre la ''App Mobile'' y Python para mejorar el ''debug'' en tiempo de ejecución.&lt;br /&gt;
&lt;br /&gt;
== Archivos de uso ==&lt;br /&gt;
&lt;br /&gt;
- [[Archivo:Server Code.zip]]&lt;br /&gt;
&lt;br /&gt;
- [[Archivo:App code.zip]]&lt;br /&gt;
&lt;br /&gt;
- [[Archivo:Apk app.zip ]]&lt;/div&gt;</summary>
		<author><name>German.moreira</name></author>	</entry>

	<entry>
		<id>http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Programando_el_Butia_desde_el_celular&amp;diff=11703</id>
		<title>Programando el Butia desde el celular</title>
		<link rel="alternate" type="text/html" href="http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Programando_el_Butia_desde_el_celular&amp;diff=11703"/>
				<updated>2021-06-28T01:41:32Z</updated>
		
		<summary type="html">&lt;p&gt;German.moreira: /* Protocolo de comunicación */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Introducción ==&lt;br /&gt;
&lt;br /&gt;
La idea del proyecto en un principio era usar el celular como medio para controlar el robot Butiá para que resulte más atractivo para los estudiantes que no les guste la programación.&lt;br /&gt;
&lt;br /&gt;
Luego, la idea se modifico un poco debido a que descubrimos que con esta implementación, podíamos hacer mas sencilla la resolución de algunos ejercicios básicos mediante algoritmos mas simplificados, tomamos el trabajo que teníamos hecho hasta el momento y lo adaptamos a un menú con distintas acciones simples como avanzar un determinado tiempo, avanzar hasta chocar contra un objeto o rotar a la izquierda o derecha un determinado tiempo.&lt;br /&gt;
&lt;br /&gt;
Estas funciones básicas y bastante sencillas de entender más una interfaz amigable y fácil de usar, se implementaron para que el rango de edad de uso de esta aplicación vaya de 3 años en adelante.&lt;br /&gt;
&lt;br /&gt;
Como resultado obtuvimos una aplicación que se puede usar para que niños de:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- 4 / 5 / 6 años resuelvan ejercicios sencillos como puede ser llegar de un punto a otro, buscar el camino a un objeto o resolver un laberinto sencillo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- 7 / 8 / 9 años puedan resolver ejercicios un poco más complejos como puede ser resolver un laberinto del más sencillo al mas complejo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- 10 años en adelante tengan la capacidad de adaptar una parte personal de código al programa y puedan resolver cualquier ejercicio que se pueda plantear con el robot Butiá.&lt;br /&gt;
&lt;br /&gt;
== Objetivo y motivación==&lt;br /&gt;
&lt;br /&gt;
Los objetivos del proyecto eran, como dice el nombre, poder conectar remotamente el robot Butiá a un celular y buscar una abstracción de la mayor cantidad de problemas que puedan ser resueltos con el robot Butiá.&lt;br /&gt;
&lt;br /&gt;
Esto, para poder crear un método de uso del robot Butiá más dinámico y con funciones que permiten realizar, mediante algoritmos mas sencillos, la solución de la mayor cantidad de puzles particulares, abstrayéndose de la programación directa, lo que puede ser tedioso o abrumador para personas que tienen su primer acercamiento a la programación.&lt;br /&gt;
&lt;br /&gt;
Al hacer esto, el nivel de uso en aulas del robot Butiá, puede simplificarse hasta clases desde 3 años de jardinera en adelante, debido a que la aplicación simplifica la parte de codificación y los algoritmos de solución de ejercicios se convierten simplemente en una serie de pasos básicos a ejecutar linealmente.&lt;br /&gt;
&lt;br /&gt;
Lo que se busca con este proyecto, es despertar la curiosidad e interés en niños y adolescentes en el área de la programación de una forma didáctica, en donde estos pueden experimentar directamente con el robot y potenciar la creatividad para resolver problemas. &lt;br /&gt;
&lt;br /&gt;
La aplicación esta inspirada en el lenguaje &amp;quot;Sratch&amp;quot;, el cual es un lenguaje ideal para los primeros acercamientos a la programación. &lt;br /&gt;
&lt;br /&gt;
Este ''software'' permite ademas, introducir conceptos como, instrucciones, secuencialidad de código, algoritmos, secuencias de control, estructuras de repetición, etc. Como ejercicio, se puede plantear por ejemplo, hacer el pasaje a Python de algoritmos diseñados en la aplicación.&lt;br /&gt;
&lt;br /&gt;
== Armado del Butiá ==&lt;br /&gt;
&lt;br /&gt;
* Paso 1: Armar el Butiá a partir de esta [https://www.fing.edu.uy/inco/proyectos/butia/files/docs_butia2/armando_paso_a_paso_motores_CC_rev1.pdf guía oficial]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Paso 2: Instalar el sensor de grises&lt;br /&gt;
&lt;br /&gt;
1:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP1.jpeg]] &lt;br /&gt;
&lt;br /&gt;
2:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP2.jpeg]]&lt;br /&gt;
&lt;br /&gt;
3:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP3.jpeg]]&lt;br /&gt;
&lt;br /&gt;
4:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP4.jpeg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Paso 3: Instalar el sensor de distancia&lt;br /&gt;
&lt;br /&gt;
1:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP1.png]]&lt;br /&gt;
&lt;br /&gt;
2:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP2.png]]&lt;br /&gt;
&lt;br /&gt;
3:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP3.png]]&lt;br /&gt;
&lt;br /&gt;
4:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP4.png]]&lt;br /&gt;
&lt;br /&gt;
== Protocolo de comunicación ==&lt;br /&gt;
El protocolo de comunicaron diseñado para la comunicación entre Servidor y Aplicación ''Mobile'' es el siguiente:&lt;br /&gt;
&lt;br /&gt;
'''''Accion0-S0\nAccion1-S1\nAccion2-S2\nAccion3\nAccion4-S4\nVelocidad'''''&lt;br /&gt;
&lt;br /&gt;
Donde, este ''string'' representa la serie encadenada de acciones que el servidor recibe para ejecutar en el robot desde la aplicación por medio de un ''WebSocket'' (socket que utiliza protocolo http).&lt;br /&gt;
Cada acción esta separada de la que se encuentra a continuación por el símbolo &amp;quot;''\n''&amp;quot;.&lt;br /&gt;
Podemos diferenciar dos tipos de acciones, las que requieren parámetro y las que no, estas se comunican de la siguiente forma:&lt;br /&gt;
&lt;br /&gt;
'''Acción con parámetro''': NombreAccion-Parametro&lt;br /&gt;
&lt;br /&gt;
'''Acción sin parámetro''': NombreAccion&lt;br /&gt;
&lt;br /&gt;
== Implementación código Python ==&lt;br /&gt;
&lt;br /&gt;
Antes de empezar a programar o usar el código, es necesario instalar las librerías a usar, esto se puede hacer escribiendo &lt;br /&gt;
&lt;br /&gt;
'''''pip install [nombre de la librería]''''' en el interprete de comandos del sistema.&lt;br /&gt;
&lt;br /&gt;
Entonces instalamos la librería a utilizar, en este caso:&lt;br /&gt;
&lt;br /&gt;
'''''pip install simple_websocket_server'''''&lt;br /&gt;
&lt;br /&gt;
Una vez instalada la librería, hay que empezar a escribir el código.&lt;br /&gt;
&lt;br /&gt;
El encabezado del código es el siguiente&lt;br /&gt;
El uso de cada librería se explica con detalle mas adelante&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Encabezado.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A partir de la librería '''sys''' se define el camino del sistema para utilizar los plugin Butiá.&lt;br /&gt;
En nuestro caso, la ruta es ''' '/home/trerb/TurtleBots.activity/plugins/butia' ''', eso se tiene que modificar dependiendo de donde se encuentren el directorio ''' TurtleBots.activity/ ''' en su sistema de archivos&lt;br /&gt;
&lt;br /&gt;
[[Archivo:UsoPluginButia.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego se encuentra la función ''' clearConsole ''',&lt;br /&gt;
Esta función sirve únicamente para limpiar el interprete de Python usando la librería ''' os ''' y tener una ejecución mas limpia&lt;br /&gt;
&lt;br /&gt;
[[Archivo:clearConsole().png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
El siguiente código utiliza la librería ''' socket ''' para conectarse a la web y preguntar la ip del ordenador que ejecuta el archivo y la muestra en pantalla, esto se usa para facilitar la conexión con la App Mobile&lt;br /&gt;
&lt;br /&gt;
[[Archivo:conexionSocket.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Las siguientes líneas de código preguntan al usuario que puerto va a utilizar para la conexión, este código verifica que se ingrese un dato numérico, dentro del rango de los puertos, y que el puerto este disponible.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:tryPuerto.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego se declaran las variables: ''' Speed, Puerto_Gris y Puerto_Distancia ''', se verifica que los sensores de distancia y de grises estén conectados y asigna el puerto en el que estén conectados a las variables ''' Puerto_Distancia ''' y ''' Puerto_Gris ''' respectivamente. La variable ''' Speed ''' es una variable global que se lee al inicio de cada cadena de acciones y la utiliza para todos los movimientos del Butiá de esa cadena.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:declaracionVariables.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Seguimos con la declaración de las funciones básicas del Butiá, en este caso son ''' Avanzar, Rotar, AvanzarHastaVerColor y AvanzarHastaObstaculo ''' &lt;br /&gt;
&lt;br /&gt;
-La función ''' Avanzar ''' recibe un parámetro de tiempo y el Butiá avanza ese determinado tiempo.&lt;br /&gt;
&lt;br /&gt;
-La función ''' Retroceder ''' recibe un parámetro de tiempo y el Butiá retrocede ese determinado tiempo.&lt;br /&gt;
&lt;br /&gt;
-La función ''' Rotar ''' recibe dos parámetros, una dirección que puede ser Izquierda o Derecha y un tiempo que indica la duración de la rotación del Butiá.&lt;br /&gt;
&lt;br /&gt;
-La función ''' AvanzarHastaVerColor ''' recibe un parámetro que varia entre Blanco o Negro, el robot va a avanzar hasta detectar el color seleccionado.&lt;br /&gt;
Esta función solo se puede usar si el sensor de grises esta conectado.&lt;br /&gt;
&lt;br /&gt;
-Por ultimo, la función ''' AvanzarHastaObstaculo ''' no recibe parámetros, en este caso el Butiá va a avanzar hasta estar a unos pocos centímetros de un obstáculo.&lt;br /&gt;
Esta función solo se puede usar si el sensor de distancia esta conectado.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:FuncionesBasicas.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego se encuentra una función ''' Accion1 ''' esta función la puede definir el usuario a gusto, se puede implementar desde una función básica hasta un seguidor de líneas avanzado. La única condición que se necesita para implementar esta ''' Accion1 ''' es que no puede recibir parámetros&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Accion1.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ahora tenemos que definir el menú principal del programa, este se divide en dos funciones&lt;br /&gt;
&lt;br /&gt;
- ''' handle ''': Esta es una función predeterminada de la librería ''' simple_web_socket ''' y se llama cada vez que el servidor recibe un dato del cliente. En este caso la función crea una lista de las acciones que le llegan de la App Mobile, y las va ejecutando ordenadamente&lt;br /&gt;
&lt;br /&gt;
- ''' handle_close ''': Al igual que la función anterior, esta también es una función predeterminada de la librería ''' simple_web_socket ''' y se llama cuando el cliente se desconecta del servidor&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Screenshot from 2021-06-27 03-58-56.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Y por ultimo tenemos el dos líneas de codigo, la primera se encarga de abrir el servidor y la segunda lo mantiene abierto infinitamente&lt;br /&gt;
&lt;br /&gt;
[[Archivo:abrirServidor.png]]&lt;br /&gt;
&lt;br /&gt;
== Implementación código React ==&lt;br /&gt;
&lt;br /&gt;
La aplicación ''mobile'' esta implementada con React Native, ademas, se utiliza el ''framework'' [https://docs.expo.io/ Expo]. Este ''framework'' nos brinda un conjunto de herramientas que facilita el desarrollo de aplicaciones ''mobile''. &lt;br /&gt;
En caso de querer agregar, o modificar cualidades, es necesario proceder de la siguiente forma:&lt;br /&gt;
&lt;br /&gt;
Descargar el archivo comprimido adjunto.&lt;br /&gt;
&lt;br /&gt;
Extraerlo, posicionarse en el directorio raiz de la carpeta descomprimida, y ejecutar desde la terminal lo siguiente (tener en cuenta que es necesario tener en la maquina, el gestor de paquetes [https://docs.npmjs.com/ npm]).&lt;br /&gt;
&lt;br /&gt;
''''npm install'''' &lt;br /&gt;
&lt;br /&gt;
Esto descarga las dependencias que utiliza la aplicación, luego de esto podemos empezar a desarrollar.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para visualizar los cambios en tiempo real mientras desarrollamos, es necesario instalar la aplicación Expo Go para [https://play.google.com/store/apps/details?id=host.exp.exponent&amp;amp;hl=es_UY&amp;amp;gl=US Android] o para [https://apps.apple.com/es/app/expo-go/id982107779 iOS] según sea el caso.&lt;br /&gt;
&lt;br /&gt;
Para a visualizar la app en desarrollo desde Expo Go, procedemos de la siguiente forma:&lt;br /&gt;
Desde el directorio raíz de la aplicación ejecutamos desde la terminal lo siguiente:&lt;br /&gt;
&lt;br /&gt;
''''npm start''''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego, desde la aplicación Expo Go, con el celular conectado en la misma red local accedemos a la aplicación seleccionando lo siguiente:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Expo.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hecho esto, podemos cambiar el código de la aplicación y ver reflejados los cambios de forma casi instantánea.&lt;br /&gt;
&lt;br /&gt;
La aplicación esta compuesta por dos pantallas, la pantalla de configuración (''ConfigScreen.js''), donde se ingresa la dirección ip y puerto del servidor, y la pantalla principal (''MainScreen.js''), donde se lleva a cabo la programación del robot mediante acciones.&lt;br /&gt;
&lt;br /&gt;
Esta ultima pantalla esta compuesta por los componentes ''TopList.js'' y ''BottomList.js''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Untitled presentation.png]]&lt;br /&gt;
&lt;br /&gt;
Para agregar una nueva accion al sistema, es necesario programarla en el servidor con un determinado nombre, supondremos &amp;quot;AccionN&amp;quot;, esto resulta fácil si se toma como ejemplo las acciones ya implementadas.&lt;br /&gt;
&lt;br /&gt;
En la aplicación, esta nueva acción se agrega en el ''array'' &amp;quot;''actionsData''&amp;quot;, dicho ''array'' se encuentra en la pantalla principal, es decir en el archivo &amp;quot;''MainScreen.js''&amp;quot;, cada acción cuenta con los siguientes datos:&lt;br /&gt;
&lt;br /&gt;
-'''idAccion:''' Identificador de la acción en dicho arreglo (actionsData).&lt;br /&gt;
&lt;br /&gt;
-'''title:''': Titulo de la acción que se muestra en el panel superior.&lt;br /&gt;
&lt;br /&gt;
-'''actionId:''' Nombre identificador de la acción en el servidor.&lt;br /&gt;
&lt;br /&gt;
-'''overlay:''' ''Overlay'' que se despliega al seleccionar la acción (si esta requiere cierto parámetro), esta función lleva como parámetro &amp;quot;''editOverlay''&amp;quot; y &amp;quot;''id''&amp;quot;, estos se utilizan cuando se requiere cambiar dicha variable en una acción que ya fue seleccionada y se encuentra en el panel inferior de la aplicación, como por ejemplo pueden ser segundos en el caso de la acción &amp;quot;Avanzar&amp;quot;, o colores en el caso de &amp;quot;Avanzar hasta obstáculo&amp;quot;. Este parámetro puede ser que no sea necesario, como es en el caso de la acción &amp;quot;Avanzar hasta obstáculo&amp;quot;, en este ultimo caso el valor de este campo es ''null''.&lt;br /&gt;
&lt;br /&gt;
Ejemplo de la acción &amp;quot;Avanzar&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Screenshot from 2021-06-27 04-18-42.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ejemplo de la acción &amp;quot;Avanzar hasta obstáculo&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Screenshot_from_2021-06-27_00-28-32.png]]&lt;br /&gt;
&lt;br /&gt;
== Manual de uso de la aplicación ==&lt;br /&gt;
&lt;br /&gt;
Aunque la aplicación resulta intuitiva y fácil de usar se describe a continuación una serie de pasos para utilizarla correctamente.&lt;br /&gt;
&lt;br /&gt;
Para comenzar a utilizar la aplicación es necesario configurar la conexión de la aplicación con el servidor (recordar que ambos se deben encontrar ejecutándose en la misma red local), el servidor ejecutando en una computadora que esté conectada correctamente al butiá (con los sensores descritos anteriormente) y la aplicación ejecutándose en el celular.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Conectando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego que la conexión haya resultado exitosa, nos encontramos en la pantalla principal. En el panel superior, como se muestra a continuación, se encuentran las aplicaciones disponibles que podemos ejecutar en el robot butiá.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Acciones.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para agregar una serie de acciones al robot, simplemente presionamos la que queramos, a continuación esta aparecerá en el panel inferior, a medida de que vayamos seleccionando acciones, estas se irán encadenando una tras otras, estas estarán prontas para ejecutarse secuencialmente, desde la parte inferior, a la parte superior, en el momento que presionemos el botón &amp;quot;Empezar&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Agregando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Como la aplicación está pensada para planificar algoritmos para resolver desafíos o ''puzzles'', es probable que nos equivoquemos y seleccionemos una acción o insertemos un parámetro incorrectamente, ¡pero no te preocupes!. Para editar el parámetro que le hayamos ingresado a una acción, simplemente mantenemos pulsado la que deseamos corregir e ingresamos el nuevo valor.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Editando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
También es posible eliminar una acción, para hacer esto, nuevamente mantenemos pulsada la acción que queremos eliminar, pero esta vez, seleccionamos la acción eliminar. A continuación la acción seleccionada desaparecerá del panel inferior. También es posible que deseemos eliminar todas las acciones que habíamos ingresado, en este caso seleccionamos el botón &amp;quot;Eliminar acciones&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Eliminando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es posible que queremos que el robot se desplace a ciertas velocidades, teniendo en cuenta que al modificar la velocidad, el robot tendrá un comportamiento totalmente diferente, debido a que gran parte de las acciones se ejecutan por un tiempo asignado, a mayor velocidad, más desplazamiento.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Velocidad.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En caso de que exista un error en la conexión, podemos intentar volver a conectar la aplicación al servidor, para esto seleccionamos la opción configuración.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:A configuracion.gif]]&lt;br /&gt;
&lt;br /&gt;
== Mejoras a futuro ==&lt;br /&gt;
&lt;br /&gt;
* Implementar una forma para que las función ''' Accion1 ''' pueda recibir parámetros, para así ampliar la gama de problemas que se puedan solucionar a través de esta aplicación.&lt;br /&gt;
&lt;br /&gt;
* Implementación de código que permita añadir a través del código, una mayor cantidad de funciones genéricas a la aplicación.&lt;br /&gt;
&lt;br /&gt;
* Desarrollar una forma de comunicación bilateral entre la ''App Mobile'' y Python para mejorar el ''debug'' en tiempo de ejecución.&lt;br /&gt;
&lt;br /&gt;
== Archivos de uso ==&lt;br /&gt;
&lt;br /&gt;
- [[Archivo:Server Code.zip]]&lt;br /&gt;
&lt;br /&gt;
- [[Archivo:App code.zip]]&lt;br /&gt;
&lt;br /&gt;
- [[Archivo:Apk app.zip ]]&lt;/div&gt;</summary>
		<author><name>German.moreira</name></author>	</entry>

	<entry>
		<id>http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Programando_el_Butia_desde_el_celular&amp;diff=11702</id>
		<title>Programando el Butia desde el celular</title>
		<link rel="alternate" type="text/html" href="http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Programando_el_Butia_desde_el_celular&amp;diff=11702"/>
				<updated>2021-06-28T01:41:10Z</updated>
		
		<summary type="html">&lt;p&gt;German.moreira: /* Protocolo de comunicación */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Introducción ==&lt;br /&gt;
&lt;br /&gt;
La idea del proyecto en un principio era usar el celular como medio para controlar el robot Butiá para que resulte más atractivo para los estudiantes que no les guste la programación.&lt;br /&gt;
&lt;br /&gt;
Luego, la idea se modifico un poco debido a que descubrimos que con esta implementación, podíamos hacer mas sencilla la resolución de algunos ejercicios básicos mediante algoritmos mas simplificados, tomamos el trabajo que teníamos hecho hasta el momento y lo adaptamos a un menú con distintas acciones simples como avanzar un determinado tiempo, avanzar hasta chocar contra un objeto o rotar a la izquierda o derecha un determinado tiempo.&lt;br /&gt;
&lt;br /&gt;
Estas funciones básicas y bastante sencillas de entender más una interfaz amigable y fácil de usar, se implementaron para que el rango de edad de uso de esta aplicación vaya de 3 años en adelante.&lt;br /&gt;
&lt;br /&gt;
Como resultado obtuvimos una aplicación que se puede usar para que niños de:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- 4 / 5 / 6 años resuelvan ejercicios sencillos como puede ser llegar de un punto a otro, buscar el camino a un objeto o resolver un laberinto sencillo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- 7 / 8 / 9 años puedan resolver ejercicios un poco más complejos como puede ser resolver un laberinto del más sencillo al mas complejo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- 10 años en adelante tengan la capacidad de adaptar una parte personal de código al programa y puedan resolver cualquier ejercicio que se pueda plantear con el robot Butiá.&lt;br /&gt;
&lt;br /&gt;
== Objetivo y motivación==&lt;br /&gt;
&lt;br /&gt;
Los objetivos del proyecto eran, como dice el nombre, poder conectar remotamente el robot Butiá a un celular y buscar una abstracción de la mayor cantidad de problemas que puedan ser resueltos con el robot Butiá.&lt;br /&gt;
&lt;br /&gt;
Esto, para poder crear un método de uso del robot Butiá más dinámico y con funciones que permiten realizar, mediante algoritmos mas sencillos, la solución de la mayor cantidad de puzles particulares, abstrayéndose de la programación directa, lo que puede ser tedioso o abrumador para personas que tienen su primer acercamiento a la programación.&lt;br /&gt;
&lt;br /&gt;
Al hacer esto, el nivel de uso en aulas del robot Butiá, puede simplificarse hasta clases desde 3 años de jardinera en adelante, debido a que la aplicación simplifica la parte de codificación y los algoritmos de solución de ejercicios se convierten simplemente en una serie de pasos básicos a ejecutar linealmente.&lt;br /&gt;
&lt;br /&gt;
Lo que se busca con este proyecto, es despertar la curiosidad e interés en niños y adolescentes en el área de la programación de una forma didáctica, en donde estos pueden experimentar directamente con el robot y potenciar la creatividad para resolver problemas. &lt;br /&gt;
&lt;br /&gt;
La aplicación esta inspirada en el lenguaje &amp;quot;Sratch&amp;quot;, el cual es un lenguaje ideal para los primeros acercamientos a la programación. &lt;br /&gt;
&lt;br /&gt;
Este ''software'' permite ademas, introducir conceptos como, instrucciones, secuencialidad de código, algoritmos, secuencias de control, estructuras de repetición, etc. Como ejercicio, se puede plantear por ejemplo, hacer el pasaje a Python de algoritmos diseñados en la aplicación.&lt;br /&gt;
&lt;br /&gt;
== Armado del Butiá ==&lt;br /&gt;
&lt;br /&gt;
* Paso 1: Armar el Butiá a partir de esta [https://www.fing.edu.uy/inco/proyectos/butia/files/docs_butia2/armando_paso_a_paso_motores_CC_rev1.pdf guía oficial]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Paso 2: Instalar el sensor de grises&lt;br /&gt;
&lt;br /&gt;
1:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP1.jpeg]] &lt;br /&gt;
&lt;br /&gt;
2:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP2.jpeg]]&lt;br /&gt;
&lt;br /&gt;
3:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP3.jpeg]]&lt;br /&gt;
&lt;br /&gt;
4:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP4.jpeg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Paso 3: Instalar el sensor de distancia&lt;br /&gt;
&lt;br /&gt;
1:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP1.png]]&lt;br /&gt;
&lt;br /&gt;
2:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP2.png]]&lt;br /&gt;
&lt;br /&gt;
3:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP3.png]]&lt;br /&gt;
&lt;br /&gt;
4:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP4.png]]&lt;br /&gt;
&lt;br /&gt;
== Protocolo de comunicación ==&lt;br /&gt;
El protocolo de comunicaron diseñado para la comunicación entre Servidor y Aplicación ''Mobile'' es el siguiente:&lt;br /&gt;
&lt;br /&gt;
'''''Accion0-S0\nAccion1-S1\nAccion2-S2\nAccion3\nAccion4-S4\nVelocidad'''''&lt;br /&gt;
&lt;br /&gt;
Donde, este ''string'' representa la serie encadenada de acciones que el servidor recibe para ejecutar en el robot desde la aplicación por medio de un ''WebSocket'' (socket que utiliza protocolo http).&lt;br /&gt;
Cada acción esta separada de la que se encuentra a continuación por el símbolo &amp;quot;''\n''&amp;quot;.&lt;br /&gt;
Podemos diferenciar dos tipos de acciones, las que requieren parámetro y las que no, estas se comunican de la siguiente forma:&lt;br /&gt;
'''Acción con parámetro''': NombreAccion-Parametro&lt;br /&gt;
&lt;br /&gt;
'''Acción sin parámetro''': NombreAccion&lt;br /&gt;
&lt;br /&gt;
== Implementación código Python ==&lt;br /&gt;
&lt;br /&gt;
Antes de empezar a programar o usar el código, es necesario instalar las librerías a usar, esto se puede hacer escribiendo &lt;br /&gt;
&lt;br /&gt;
'''''pip install [nombre de la librería]''''' en el interprete de comandos del sistema.&lt;br /&gt;
&lt;br /&gt;
Entonces instalamos la librería a utilizar, en este caso:&lt;br /&gt;
&lt;br /&gt;
'''''pip install simple_websocket_server'''''&lt;br /&gt;
&lt;br /&gt;
Una vez instalada la librería, hay que empezar a escribir el código.&lt;br /&gt;
&lt;br /&gt;
El encabezado del código es el siguiente&lt;br /&gt;
El uso de cada librería se explica con detalle mas adelante&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Encabezado.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A partir de la librería '''sys''' se define el camino del sistema para utilizar los plugin Butiá.&lt;br /&gt;
En nuestro caso, la ruta es ''' '/home/trerb/TurtleBots.activity/plugins/butia' ''', eso se tiene que modificar dependiendo de donde se encuentren el directorio ''' TurtleBots.activity/ ''' en su sistema de archivos&lt;br /&gt;
&lt;br /&gt;
[[Archivo:UsoPluginButia.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego se encuentra la función ''' clearConsole ''',&lt;br /&gt;
Esta función sirve únicamente para limpiar el interprete de Python usando la librería ''' os ''' y tener una ejecución mas limpia&lt;br /&gt;
&lt;br /&gt;
[[Archivo:clearConsole().png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
El siguiente código utiliza la librería ''' socket ''' para conectarse a la web y preguntar la ip del ordenador que ejecuta el archivo y la muestra en pantalla, esto se usa para facilitar la conexión con la App Mobile&lt;br /&gt;
&lt;br /&gt;
[[Archivo:conexionSocket.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Las siguientes líneas de código preguntan al usuario que puerto va a utilizar para la conexión, este código verifica que se ingrese un dato numérico, dentro del rango de los puertos, y que el puerto este disponible.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:tryPuerto.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego se declaran las variables: ''' Speed, Puerto_Gris y Puerto_Distancia ''', se verifica que los sensores de distancia y de grises estén conectados y asigna el puerto en el que estén conectados a las variables ''' Puerto_Distancia ''' y ''' Puerto_Gris ''' respectivamente. La variable ''' Speed ''' es una variable global que se lee al inicio de cada cadena de acciones y la utiliza para todos los movimientos del Butiá de esa cadena.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:declaracionVariables.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Seguimos con la declaración de las funciones básicas del Butiá, en este caso son ''' Avanzar, Rotar, AvanzarHastaVerColor y AvanzarHastaObstaculo ''' &lt;br /&gt;
&lt;br /&gt;
-La función ''' Avanzar ''' recibe un parámetro de tiempo y el Butiá avanza ese determinado tiempo.&lt;br /&gt;
&lt;br /&gt;
-La función ''' Retroceder ''' recibe un parámetro de tiempo y el Butiá retrocede ese determinado tiempo.&lt;br /&gt;
&lt;br /&gt;
-La función ''' Rotar ''' recibe dos parámetros, una dirección que puede ser Izquierda o Derecha y un tiempo que indica la duración de la rotación del Butiá.&lt;br /&gt;
&lt;br /&gt;
-La función ''' AvanzarHastaVerColor ''' recibe un parámetro que varia entre Blanco o Negro, el robot va a avanzar hasta detectar el color seleccionado.&lt;br /&gt;
Esta función solo se puede usar si el sensor de grises esta conectado.&lt;br /&gt;
&lt;br /&gt;
-Por ultimo, la función ''' AvanzarHastaObstaculo ''' no recibe parámetros, en este caso el Butiá va a avanzar hasta estar a unos pocos centímetros de un obstáculo.&lt;br /&gt;
Esta función solo se puede usar si el sensor de distancia esta conectado.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:FuncionesBasicas.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego se encuentra una función ''' Accion1 ''' esta función la puede definir el usuario a gusto, se puede implementar desde una función básica hasta un seguidor de líneas avanzado. La única condición que se necesita para implementar esta ''' Accion1 ''' es que no puede recibir parámetros&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Accion1.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ahora tenemos que definir el menú principal del programa, este se divide en dos funciones&lt;br /&gt;
&lt;br /&gt;
- ''' handle ''': Esta es una función predeterminada de la librería ''' simple_web_socket ''' y se llama cada vez que el servidor recibe un dato del cliente. En este caso la función crea una lista de las acciones que le llegan de la App Mobile, y las va ejecutando ordenadamente&lt;br /&gt;
&lt;br /&gt;
- ''' handle_close ''': Al igual que la función anterior, esta también es una función predeterminada de la librería ''' simple_web_socket ''' y se llama cuando el cliente se desconecta del servidor&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Screenshot from 2021-06-27 03-58-56.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Y por ultimo tenemos el dos líneas de codigo, la primera se encarga de abrir el servidor y la segunda lo mantiene abierto infinitamente&lt;br /&gt;
&lt;br /&gt;
[[Archivo:abrirServidor.png]]&lt;br /&gt;
&lt;br /&gt;
== Implementación código React ==&lt;br /&gt;
&lt;br /&gt;
La aplicación ''mobile'' esta implementada con React Native, ademas, se utiliza el ''framework'' [https://docs.expo.io/ Expo]. Este ''framework'' nos brinda un conjunto de herramientas que facilita el desarrollo de aplicaciones ''mobile''. &lt;br /&gt;
En caso de querer agregar, o modificar cualidades, es necesario proceder de la siguiente forma:&lt;br /&gt;
&lt;br /&gt;
Descargar el archivo comprimido adjunto.&lt;br /&gt;
&lt;br /&gt;
Extraerlo, posicionarse en el directorio raiz de la carpeta descomprimida, y ejecutar desde la terminal lo siguiente (tener en cuenta que es necesario tener en la maquina, el gestor de paquetes [https://docs.npmjs.com/ npm]).&lt;br /&gt;
&lt;br /&gt;
''''npm install'''' &lt;br /&gt;
&lt;br /&gt;
Esto descarga las dependencias que utiliza la aplicación, luego de esto podemos empezar a desarrollar.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para visualizar los cambios en tiempo real mientras desarrollamos, es necesario instalar la aplicación Expo Go para [https://play.google.com/store/apps/details?id=host.exp.exponent&amp;amp;hl=es_UY&amp;amp;gl=US Android] o para [https://apps.apple.com/es/app/expo-go/id982107779 iOS] según sea el caso.&lt;br /&gt;
&lt;br /&gt;
Para a visualizar la app en desarrollo desde Expo Go, procedemos de la siguiente forma:&lt;br /&gt;
Desde el directorio raíz de la aplicación ejecutamos desde la terminal lo siguiente:&lt;br /&gt;
&lt;br /&gt;
''''npm start''''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego, desde la aplicación Expo Go, con el celular conectado en la misma red local accedemos a la aplicación seleccionando lo siguiente:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Expo.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hecho esto, podemos cambiar el código de la aplicación y ver reflejados los cambios de forma casi instantánea.&lt;br /&gt;
&lt;br /&gt;
La aplicación esta compuesta por dos pantallas, la pantalla de configuración (''ConfigScreen.js''), donde se ingresa la dirección ip y puerto del servidor, y la pantalla principal (''MainScreen.js''), donde se lleva a cabo la programación del robot mediante acciones.&lt;br /&gt;
&lt;br /&gt;
Esta ultima pantalla esta compuesta por los componentes ''TopList.js'' y ''BottomList.js''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Untitled presentation.png]]&lt;br /&gt;
&lt;br /&gt;
Para agregar una nueva accion al sistema, es necesario programarla en el servidor con un determinado nombre, supondremos &amp;quot;AccionN&amp;quot;, esto resulta fácil si se toma como ejemplo las acciones ya implementadas.&lt;br /&gt;
&lt;br /&gt;
En la aplicación, esta nueva acción se agrega en el ''array'' &amp;quot;''actionsData''&amp;quot;, dicho ''array'' se encuentra en la pantalla principal, es decir en el archivo &amp;quot;''MainScreen.js''&amp;quot;, cada acción cuenta con los siguientes datos:&lt;br /&gt;
&lt;br /&gt;
-'''idAccion:''' Identificador de la acción en dicho arreglo (actionsData).&lt;br /&gt;
&lt;br /&gt;
-'''title:''': Titulo de la acción que se muestra en el panel superior.&lt;br /&gt;
&lt;br /&gt;
-'''actionId:''' Nombre identificador de la acción en el servidor.&lt;br /&gt;
&lt;br /&gt;
-'''overlay:''' ''Overlay'' que se despliega al seleccionar la acción (si esta requiere cierto parámetro), esta función lleva como parámetro &amp;quot;''editOverlay''&amp;quot; y &amp;quot;''id''&amp;quot;, estos se utilizan cuando se requiere cambiar dicha variable en una acción que ya fue seleccionada y se encuentra en el panel inferior de la aplicación, como por ejemplo pueden ser segundos en el caso de la acción &amp;quot;Avanzar&amp;quot;, o colores en el caso de &amp;quot;Avanzar hasta obstáculo&amp;quot;. Este parámetro puede ser que no sea necesario, como es en el caso de la acción &amp;quot;Avanzar hasta obstáculo&amp;quot;, en este ultimo caso el valor de este campo es ''null''.&lt;br /&gt;
&lt;br /&gt;
Ejemplo de la acción &amp;quot;Avanzar&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Screenshot from 2021-06-27 04-18-42.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ejemplo de la acción &amp;quot;Avanzar hasta obstáculo&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Screenshot_from_2021-06-27_00-28-32.png]]&lt;br /&gt;
&lt;br /&gt;
== Manual de uso de la aplicación ==&lt;br /&gt;
&lt;br /&gt;
Aunque la aplicación resulta intuitiva y fácil de usar se describe a continuación una serie de pasos para utilizarla correctamente.&lt;br /&gt;
&lt;br /&gt;
Para comenzar a utilizar la aplicación es necesario configurar la conexión de la aplicación con el servidor (recordar que ambos se deben encontrar ejecutándose en la misma red local), el servidor ejecutando en una computadora que esté conectada correctamente al butiá (con los sensores descritos anteriormente) y la aplicación ejecutándose en el celular.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Conectando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego que la conexión haya resultado exitosa, nos encontramos en la pantalla principal. En el panel superior, como se muestra a continuación, se encuentran las aplicaciones disponibles que podemos ejecutar en el robot butiá.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Acciones.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para agregar una serie de acciones al robot, simplemente presionamos la que queramos, a continuación esta aparecerá en el panel inferior, a medida de que vayamos seleccionando acciones, estas se irán encadenando una tras otras, estas estarán prontas para ejecutarse secuencialmente, desde la parte inferior, a la parte superior, en el momento que presionemos el botón &amp;quot;Empezar&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Agregando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Como la aplicación está pensada para planificar algoritmos para resolver desafíos o ''puzzles'', es probable que nos equivoquemos y seleccionemos una acción o insertemos un parámetro incorrectamente, ¡pero no te preocupes!. Para editar el parámetro que le hayamos ingresado a una acción, simplemente mantenemos pulsado la que deseamos corregir e ingresamos el nuevo valor.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Editando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
También es posible eliminar una acción, para hacer esto, nuevamente mantenemos pulsada la acción que queremos eliminar, pero esta vez, seleccionamos la acción eliminar. A continuación la acción seleccionada desaparecerá del panel inferior. También es posible que deseemos eliminar todas las acciones que habíamos ingresado, en este caso seleccionamos el botón &amp;quot;Eliminar acciones&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Eliminando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es posible que queremos que el robot se desplace a ciertas velocidades, teniendo en cuenta que al modificar la velocidad, el robot tendrá un comportamiento totalmente diferente, debido a que gran parte de las acciones se ejecutan por un tiempo asignado, a mayor velocidad, más desplazamiento.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Velocidad.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En caso de que exista un error en la conexión, podemos intentar volver a conectar la aplicación al servidor, para esto seleccionamos la opción configuración.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:A configuracion.gif]]&lt;br /&gt;
&lt;br /&gt;
== Mejoras a futuro ==&lt;br /&gt;
&lt;br /&gt;
* Implementar una forma para que las función ''' Accion1 ''' pueda recibir parámetros, para así ampliar la gama de problemas que se puedan solucionar a través de esta aplicación.&lt;br /&gt;
&lt;br /&gt;
* Implementación de código que permita añadir a través del código, una mayor cantidad de funciones genéricas a la aplicación.&lt;br /&gt;
&lt;br /&gt;
* Desarrollar una forma de comunicación bilateral entre la ''App Mobile'' y Python para mejorar el ''debug'' en tiempo de ejecución.&lt;br /&gt;
&lt;br /&gt;
== Archivos de uso ==&lt;br /&gt;
&lt;br /&gt;
- [[Archivo:Server Code.zip]]&lt;br /&gt;
&lt;br /&gt;
- [[Archivo:App code.zip]]&lt;br /&gt;
&lt;br /&gt;
- [[Archivo:Apk app.zip ]]&lt;/div&gt;</summary>
		<author><name>German.moreira</name></author>	</entry>

	<entry>
		<id>http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Programando_el_Butia_desde_el_celular&amp;diff=11701</id>
		<title>Programando el Butia desde el celular</title>
		<link rel="alternate" type="text/html" href="http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Programando_el_Butia_desde_el_celular&amp;diff=11701"/>
				<updated>2021-06-28T01:40:40Z</updated>
		
		<summary type="html">&lt;p&gt;German.moreira: /* Protocolo de comunicación */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Introducción ==&lt;br /&gt;
&lt;br /&gt;
La idea del proyecto en un principio era usar el celular como medio para controlar el robot Butiá para que resulte más atractivo para los estudiantes que no les guste la programación.&lt;br /&gt;
&lt;br /&gt;
Luego, la idea se modifico un poco debido a que descubrimos que con esta implementación, podíamos hacer mas sencilla la resolución de algunos ejercicios básicos mediante algoritmos mas simplificados, tomamos el trabajo que teníamos hecho hasta el momento y lo adaptamos a un menú con distintas acciones simples como avanzar un determinado tiempo, avanzar hasta chocar contra un objeto o rotar a la izquierda o derecha un determinado tiempo.&lt;br /&gt;
&lt;br /&gt;
Estas funciones básicas y bastante sencillas de entender más una interfaz amigable y fácil de usar, se implementaron para que el rango de edad de uso de esta aplicación vaya de 3 años en adelante.&lt;br /&gt;
&lt;br /&gt;
Como resultado obtuvimos una aplicación que se puede usar para que niños de:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- 4 / 5 / 6 años resuelvan ejercicios sencillos como puede ser llegar de un punto a otro, buscar el camino a un objeto o resolver un laberinto sencillo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- 7 / 8 / 9 años puedan resolver ejercicios un poco más complejos como puede ser resolver un laberinto del más sencillo al mas complejo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- 10 años en adelante tengan la capacidad de adaptar una parte personal de código al programa y puedan resolver cualquier ejercicio que se pueda plantear con el robot Butiá.&lt;br /&gt;
&lt;br /&gt;
== Objetivo y motivación==&lt;br /&gt;
&lt;br /&gt;
Los objetivos del proyecto eran, como dice el nombre, poder conectar remotamente el robot Butiá a un celular y buscar una abstracción de la mayor cantidad de problemas que puedan ser resueltos con el robot Butiá.&lt;br /&gt;
&lt;br /&gt;
Esto, para poder crear un método de uso del robot Butiá más dinámico y con funciones que permiten realizar, mediante algoritmos mas sencillos, la solución de la mayor cantidad de puzles particulares, abstrayéndose de la programación directa, lo que puede ser tedioso o abrumador para personas que tienen su primer acercamiento a la programación.&lt;br /&gt;
&lt;br /&gt;
Al hacer esto, el nivel de uso en aulas del robot Butiá, puede simplificarse hasta clases desde 3 años de jardinera en adelante, debido a que la aplicación simplifica la parte de codificación y los algoritmos de solución de ejercicios se convierten simplemente en una serie de pasos básicos a ejecutar linealmente.&lt;br /&gt;
&lt;br /&gt;
Lo que se busca con este proyecto, es despertar la curiosidad e interés en niños y adolescentes en el área de la programación de una forma didáctica, en donde estos pueden experimentar directamente con el robot y potenciar la creatividad para resolver problemas. &lt;br /&gt;
&lt;br /&gt;
La aplicación esta inspirada en el lenguaje &amp;quot;Sratch&amp;quot;, el cual es un lenguaje ideal para los primeros acercamientos a la programación. &lt;br /&gt;
&lt;br /&gt;
Este ''software'' permite ademas, introducir conceptos como, instrucciones, secuencialidad de código, algoritmos, secuencias de control, estructuras de repetición, etc. Como ejercicio, se puede plantear por ejemplo, hacer el pasaje a Python de algoritmos diseñados en la aplicación.&lt;br /&gt;
&lt;br /&gt;
== Armado del Butiá ==&lt;br /&gt;
&lt;br /&gt;
* Paso 1: Armar el Butiá a partir de esta [https://www.fing.edu.uy/inco/proyectos/butia/files/docs_butia2/armando_paso_a_paso_motores_CC_rev1.pdf guía oficial]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Paso 2: Instalar el sensor de grises&lt;br /&gt;
&lt;br /&gt;
1:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP1.jpeg]] &lt;br /&gt;
&lt;br /&gt;
2:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP2.jpeg]]&lt;br /&gt;
&lt;br /&gt;
3:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP3.jpeg]]&lt;br /&gt;
&lt;br /&gt;
4:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP4.jpeg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Paso 3: Instalar el sensor de distancia&lt;br /&gt;
&lt;br /&gt;
1:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP1.png]]&lt;br /&gt;
&lt;br /&gt;
2:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP2.png]]&lt;br /&gt;
&lt;br /&gt;
3:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP3.png]]&lt;br /&gt;
&lt;br /&gt;
4:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP4.png]]&lt;br /&gt;
&lt;br /&gt;
== Protocolo de comunicación ==&lt;br /&gt;
El protocolo de comunicaron diseñado para la comunicación entre Servidor y Aplicación ''Mobile'' es el siguiente:&lt;br /&gt;
&lt;br /&gt;
'''''Accion0-S0\nAccion1-S1\nAccion2-S2\nAccion3\nAccion4-S4\nVelocidad'''''&lt;br /&gt;
&lt;br /&gt;
Donde, este ''string'' representa la serie encadenada de acciones que el servidor recibe para ejecutar en el robot desde la aplicación por medio de ''WebSockets'' (socket que utiliza protocolo http).&lt;br /&gt;
Cada acción esta separada de la que se encuentra a continuación por el símbolo &amp;quot;''\n''&amp;quot;.&lt;br /&gt;
Podemos diferenciar dos tipos de acciones, las que requieren parámetro y las que no, estas se comunican de la siguiente forma:&lt;br /&gt;
'''Acción con parámetro''': NombreAccion-Parametro&lt;br /&gt;
&lt;br /&gt;
'''Acción sin parámetro''': NombreAccion&lt;br /&gt;
&lt;br /&gt;
== Implementación código Python ==&lt;br /&gt;
&lt;br /&gt;
Antes de empezar a programar o usar el código, es necesario instalar las librerías a usar, esto se puede hacer escribiendo &lt;br /&gt;
&lt;br /&gt;
'''''pip install [nombre de la librería]''''' en el interprete de comandos del sistema.&lt;br /&gt;
&lt;br /&gt;
Entonces instalamos la librería a utilizar, en este caso:&lt;br /&gt;
&lt;br /&gt;
'''''pip install simple_websocket_server'''''&lt;br /&gt;
&lt;br /&gt;
Una vez instalada la librería, hay que empezar a escribir el código.&lt;br /&gt;
&lt;br /&gt;
El encabezado del código es el siguiente&lt;br /&gt;
El uso de cada librería se explica con detalle mas adelante&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Encabezado.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A partir de la librería '''sys''' se define el camino del sistema para utilizar los plugin Butiá.&lt;br /&gt;
En nuestro caso, la ruta es ''' '/home/trerb/TurtleBots.activity/plugins/butia' ''', eso se tiene que modificar dependiendo de donde se encuentren el directorio ''' TurtleBots.activity/ ''' en su sistema de archivos&lt;br /&gt;
&lt;br /&gt;
[[Archivo:UsoPluginButia.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego se encuentra la función ''' clearConsole ''',&lt;br /&gt;
Esta función sirve únicamente para limpiar el interprete de Python usando la librería ''' os ''' y tener una ejecución mas limpia&lt;br /&gt;
&lt;br /&gt;
[[Archivo:clearConsole().png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
El siguiente código utiliza la librería ''' socket ''' para conectarse a la web y preguntar la ip del ordenador que ejecuta el archivo y la muestra en pantalla, esto se usa para facilitar la conexión con la App Mobile&lt;br /&gt;
&lt;br /&gt;
[[Archivo:conexionSocket.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Las siguientes líneas de código preguntan al usuario que puerto va a utilizar para la conexión, este código verifica que se ingrese un dato numérico, dentro del rango de los puertos, y que el puerto este disponible.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:tryPuerto.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego se declaran las variables: ''' Speed, Puerto_Gris y Puerto_Distancia ''', se verifica que los sensores de distancia y de grises estén conectados y asigna el puerto en el que estén conectados a las variables ''' Puerto_Distancia ''' y ''' Puerto_Gris ''' respectivamente. La variable ''' Speed ''' es una variable global que se lee al inicio de cada cadena de acciones y la utiliza para todos los movimientos del Butiá de esa cadena.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:declaracionVariables.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Seguimos con la declaración de las funciones básicas del Butiá, en este caso son ''' Avanzar, Rotar, AvanzarHastaVerColor y AvanzarHastaObstaculo ''' &lt;br /&gt;
&lt;br /&gt;
-La función ''' Avanzar ''' recibe un parámetro de tiempo y el Butiá avanza ese determinado tiempo.&lt;br /&gt;
&lt;br /&gt;
-La función ''' Retroceder ''' recibe un parámetro de tiempo y el Butiá retrocede ese determinado tiempo.&lt;br /&gt;
&lt;br /&gt;
-La función ''' Rotar ''' recibe dos parámetros, una dirección que puede ser Izquierda o Derecha y un tiempo que indica la duración de la rotación del Butiá.&lt;br /&gt;
&lt;br /&gt;
-La función ''' AvanzarHastaVerColor ''' recibe un parámetro que varia entre Blanco o Negro, el robot va a avanzar hasta detectar el color seleccionado.&lt;br /&gt;
Esta función solo se puede usar si el sensor de grises esta conectado.&lt;br /&gt;
&lt;br /&gt;
-Por ultimo, la función ''' AvanzarHastaObstaculo ''' no recibe parámetros, en este caso el Butiá va a avanzar hasta estar a unos pocos centímetros de un obstáculo.&lt;br /&gt;
Esta función solo se puede usar si el sensor de distancia esta conectado.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:FuncionesBasicas.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego se encuentra una función ''' Accion1 ''' esta función la puede definir el usuario a gusto, se puede implementar desde una función básica hasta un seguidor de líneas avanzado. La única condición que se necesita para implementar esta ''' Accion1 ''' es que no puede recibir parámetros&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Accion1.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ahora tenemos que definir el menú principal del programa, este se divide en dos funciones&lt;br /&gt;
&lt;br /&gt;
- ''' handle ''': Esta es una función predeterminada de la librería ''' simple_web_socket ''' y se llama cada vez que el servidor recibe un dato del cliente. En este caso la función crea una lista de las acciones que le llegan de la App Mobile, y las va ejecutando ordenadamente&lt;br /&gt;
&lt;br /&gt;
- ''' handle_close ''': Al igual que la función anterior, esta también es una función predeterminada de la librería ''' simple_web_socket ''' y se llama cuando el cliente se desconecta del servidor&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Screenshot from 2021-06-27 03-58-56.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Y por ultimo tenemos el dos líneas de codigo, la primera se encarga de abrir el servidor y la segunda lo mantiene abierto infinitamente&lt;br /&gt;
&lt;br /&gt;
[[Archivo:abrirServidor.png]]&lt;br /&gt;
&lt;br /&gt;
== Implementación código React ==&lt;br /&gt;
&lt;br /&gt;
La aplicación ''mobile'' esta implementada con React Native, ademas, se utiliza el ''framework'' [https://docs.expo.io/ Expo]. Este ''framework'' nos brinda un conjunto de herramientas que facilita el desarrollo de aplicaciones ''mobile''. &lt;br /&gt;
En caso de querer agregar, o modificar cualidades, es necesario proceder de la siguiente forma:&lt;br /&gt;
&lt;br /&gt;
Descargar el archivo comprimido adjunto.&lt;br /&gt;
&lt;br /&gt;
Extraerlo, posicionarse en el directorio raiz de la carpeta descomprimida, y ejecutar desde la terminal lo siguiente (tener en cuenta que es necesario tener en la maquina, el gestor de paquetes [https://docs.npmjs.com/ npm]).&lt;br /&gt;
&lt;br /&gt;
''''npm install'''' &lt;br /&gt;
&lt;br /&gt;
Esto descarga las dependencias que utiliza la aplicación, luego de esto podemos empezar a desarrollar.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para visualizar los cambios en tiempo real mientras desarrollamos, es necesario instalar la aplicación Expo Go para [https://play.google.com/store/apps/details?id=host.exp.exponent&amp;amp;hl=es_UY&amp;amp;gl=US Android] o para [https://apps.apple.com/es/app/expo-go/id982107779 iOS] según sea el caso.&lt;br /&gt;
&lt;br /&gt;
Para a visualizar la app en desarrollo desde Expo Go, procedemos de la siguiente forma:&lt;br /&gt;
Desde el directorio raíz de la aplicación ejecutamos desde la terminal lo siguiente:&lt;br /&gt;
&lt;br /&gt;
''''npm start''''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego, desde la aplicación Expo Go, con el celular conectado en la misma red local accedemos a la aplicación seleccionando lo siguiente:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Expo.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hecho esto, podemos cambiar el código de la aplicación y ver reflejados los cambios de forma casi instantánea.&lt;br /&gt;
&lt;br /&gt;
La aplicación esta compuesta por dos pantallas, la pantalla de configuración (''ConfigScreen.js''), donde se ingresa la dirección ip y puerto del servidor, y la pantalla principal (''MainScreen.js''), donde se lleva a cabo la programación del robot mediante acciones.&lt;br /&gt;
&lt;br /&gt;
Esta ultima pantalla esta compuesta por los componentes ''TopList.js'' y ''BottomList.js''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Untitled presentation.png]]&lt;br /&gt;
&lt;br /&gt;
Para agregar una nueva accion al sistema, es necesario programarla en el servidor con un determinado nombre, supondremos &amp;quot;AccionN&amp;quot;, esto resulta fácil si se toma como ejemplo las acciones ya implementadas.&lt;br /&gt;
&lt;br /&gt;
En la aplicación, esta nueva acción se agrega en el ''array'' &amp;quot;''actionsData''&amp;quot;, dicho ''array'' se encuentra en la pantalla principal, es decir en el archivo &amp;quot;''MainScreen.js''&amp;quot;, cada acción cuenta con los siguientes datos:&lt;br /&gt;
&lt;br /&gt;
-'''idAccion:''' Identificador de la acción en dicho arreglo (actionsData).&lt;br /&gt;
&lt;br /&gt;
-'''title:''': Titulo de la acción que se muestra en el panel superior.&lt;br /&gt;
&lt;br /&gt;
-'''actionId:''' Nombre identificador de la acción en el servidor.&lt;br /&gt;
&lt;br /&gt;
-'''overlay:''' ''Overlay'' que se despliega al seleccionar la acción (si esta requiere cierto parámetro), esta función lleva como parámetro &amp;quot;''editOverlay''&amp;quot; y &amp;quot;''id''&amp;quot;, estos se utilizan cuando se requiere cambiar dicha variable en una acción que ya fue seleccionada y se encuentra en el panel inferior de la aplicación, como por ejemplo pueden ser segundos en el caso de la acción &amp;quot;Avanzar&amp;quot;, o colores en el caso de &amp;quot;Avanzar hasta obstáculo&amp;quot;. Este parámetro puede ser que no sea necesario, como es en el caso de la acción &amp;quot;Avanzar hasta obstáculo&amp;quot;, en este ultimo caso el valor de este campo es ''null''.&lt;br /&gt;
&lt;br /&gt;
Ejemplo de la acción &amp;quot;Avanzar&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Screenshot from 2021-06-27 04-18-42.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ejemplo de la acción &amp;quot;Avanzar hasta obstáculo&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Screenshot_from_2021-06-27_00-28-32.png]]&lt;br /&gt;
&lt;br /&gt;
== Manual de uso de la aplicación ==&lt;br /&gt;
&lt;br /&gt;
Aunque la aplicación resulta intuitiva y fácil de usar se describe a continuación una serie de pasos para utilizarla correctamente.&lt;br /&gt;
&lt;br /&gt;
Para comenzar a utilizar la aplicación es necesario configurar la conexión de la aplicación con el servidor (recordar que ambos se deben encontrar ejecutándose en la misma red local), el servidor ejecutando en una computadora que esté conectada correctamente al butiá (con los sensores descritos anteriormente) y la aplicación ejecutándose en el celular.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Conectando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego que la conexión haya resultado exitosa, nos encontramos en la pantalla principal. En el panel superior, como se muestra a continuación, se encuentran las aplicaciones disponibles que podemos ejecutar en el robot butiá.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Acciones.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para agregar una serie de acciones al robot, simplemente presionamos la que queramos, a continuación esta aparecerá en el panel inferior, a medida de que vayamos seleccionando acciones, estas se irán encadenando una tras otras, estas estarán prontas para ejecutarse secuencialmente, desde la parte inferior, a la parte superior, en el momento que presionemos el botón &amp;quot;Empezar&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Agregando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Como la aplicación está pensada para planificar algoritmos para resolver desafíos o ''puzzles'', es probable que nos equivoquemos y seleccionemos una acción o insertemos un parámetro incorrectamente, ¡pero no te preocupes!. Para editar el parámetro que le hayamos ingresado a una acción, simplemente mantenemos pulsado la que deseamos corregir e ingresamos el nuevo valor.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Editando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
También es posible eliminar una acción, para hacer esto, nuevamente mantenemos pulsada la acción que queremos eliminar, pero esta vez, seleccionamos la acción eliminar. A continuación la acción seleccionada desaparecerá del panel inferior. También es posible que deseemos eliminar todas las acciones que habíamos ingresado, en este caso seleccionamos el botón &amp;quot;Eliminar acciones&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Eliminando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es posible que queremos que el robot se desplace a ciertas velocidades, teniendo en cuenta que al modificar la velocidad, el robot tendrá un comportamiento totalmente diferente, debido a que gran parte de las acciones se ejecutan por un tiempo asignado, a mayor velocidad, más desplazamiento.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Velocidad.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En caso de que exista un error en la conexión, podemos intentar volver a conectar la aplicación al servidor, para esto seleccionamos la opción configuración.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:A configuracion.gif]]&lt;br /&gt;
&lt;br /&gt;
== Mejoras a futuro ==&lt;br /&gt;
&lt;br /&gt;
* Implementar una forma para que las función ''' Accion1 ''' pueda recibir parámetros, para así ampliar la gama de problemas que se puedan solucionar a través de esta aplicación.&lt;br /&gt;
&lt;br /&gt;
* Implementación de código que permita añadir a través del código, una mayor cantidad de funciones genéricas a la aplicación.&lt;br /&gt;
&lt;br /&gt;
* Desarrollar una forma de comunicación bilateral entre la ''App Mobile'' y Python para mejorar el ''debug'' en tiempo de ejecución.&lt;br /&gt;
&lt;br /&gt;
== Archivos de uso ==&lt;br /&gt;
&lt;br /&gt;
- [[Archivo:Server Code.zip]]&lt;br /&gt;
&lt;br /&gt;
- [[Archivo:App code.zip]]&lt;br /&gt;
&lt;br /&gt;
- [[Archivo:Apk app.zip ]]&lt;/div&gt;</summary>
		<author><name>German.moreira</name></author>	</entry>

	<entry>
		<id>http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Programando_el_Butia_desde_el_celular&amp;diff=11700</id>
		<title>Programando el Butia desde el celular</title>
		<link rel="alternate" type="text/html" href="http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Programando_el_Butia_desde_el_celular&amp;diff=11700"/>
				<updated>2021-06-28T01:38:45Z</updated>
		
		<summary type="html">&lt;p&gt;German.moreira: /* Implementación código React */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Introducción ==&lt;br /&gt;
&lt;br /&gt;
La idea del proyecto en un principio era usar el celular como medio para controlar el robot Butiá para que resulte más atractivo para los estudiantes que no les guste la programación.&lt;br /&gt;
&lt;br /&gt;
Luego, la idea se modifico un poco debido a que descubrimos que con esta implementación, podíamos hacer mas sencilla la resolución de algunos ejercicios básicos mediante algoritmos mas simplificados, tomamos el trabajo que teníamos hecho hasta el momento y lo adaptamos a un menú con distintas acciones simples como avanzar un determinado tiempo, avanzar hasta chocar contra un objeto o rotar a la izquierda o derecha un determinado tiempo.&lt;br /&gt;
&lt;br /&gt;
Estas funciones básicas y bastante sencillas de entender más una interfaz amigable y fácil de usar, se implementaron para que el rango de edad de uso de esta aplicación vaya de 3 años en adelante.&lt;br /&gt;
&lt;br /&gt;
Como resultado obtuvimos una aplicación que se puede usar para que niños de:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- 4 / 5 / 6 años resuelvan ejercicios sencillos como puede ser llegar de un punto a otro, buscar el camino a un objeto o resolver un laberinto sencillo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- 7 / 8 / 9 años puedan resolver ejercicios un poco más complejos como puede ser resolver un laberinto del más sencillo al mas complejo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- 10 años en adelante tengan la capacidad de adaptar una parte personal de código al programa y puedan resolver cualquier ejercicio que se pueda plantear con el robot Butiá.&lt;br /&gt;
&lt;br /&gt;
== Objetivo y motivación==&lt;br /&gt;
&lt;br /&gt;
Los objetivos del proyecto eran, como dice el nombre, poder conectar remotamente el robot Butiá a un celular y buscar una abstracción de la mayor cantidad de problemas que puedan ser resueltos con el robot Butiá.&lt;br /&gt;
&lt;br /&gt;
Esto, para poder crear un método de uso del robot Butiá más dinámico y con funciones que permiten realizar, mediante algoritmos mas sencillos, la solución de la mayor cantidad de puzles particulares, abstrayéndose de la programación directa, lo que puede ser tedioso o abrumador para personas que tienen su primer acercamiento a la programación.&lt;br /&gt;
&lt;br /&gt;
Al hacer esto, el nivel de uso en aulas del robot Butiá, puede simplificarse hasta clases desde 3 años de jardinera en adelante, debido a que la aplicación simplifica la parte de codificación y los algoritmos de solución de ejercicios se convierten simplemente en una serie de pasos básicos a ejecutar linealmente.&lt;br /&gt;
&lt;br /&gt;
Lo que se busca con este proyecto, es despertar la curiosidad e interés en niños y adolescentes en el área de la programación de una forma didáctica, en donde estos pueden experimentar directamente con el robot y potenciar la creatividad para resolver problemas. &lt;br /&gt;
&lt;br /&gt;
La aplicación esta inspirada en el lenguaje &amp;quot;Sratch&amp;quot;, el cual es un lenguaje ideal para los primeros acercamientos a la programación. &lt;br /&gt;
&lt;br /&gt;
Este ''software'' permite ademas, introducir conceptos como, instrucciones, secuencialidad de código, algoritmos, secuencias de control, estructuras de repetición, etc. Como ejercicio, se puede plantear por ejemplo, hacer el pasaje a Python de algoritmos diseñados en la aplicación.&lt;br /&gt;
&lt;br /&gt;
== Armado del Butiá ==&lt;br /&gt;
&lt;br /&gt;
* Paso 1: Armar el Butiá a partir de esta [https://www.fing.edu.uy/inco/proyectos/butia/files/docs_butia2/armando_paso_a_paso_motores_CC_rev1.pdf guía oficial]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Paso 2: Instalar el sensor de grises&lt;br /&gt;
&lt;br /&gt;
1:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP1.jpeg]] &lt;br /&gt;
&lt;br /&gt;
2:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP2.jpeg]]&lt;br /&gt;
&lt;br /&gt;
3:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP3.jpeg]]&lt;br /&gt;
&lt;br /&gt;
4:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP4.jpeg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Paso 3: Instalar el sensor de distancia&lt;br /&gt;
&lt;br /&gt;
1:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP1.png]]&lt;br /&gt;
&lt;br /&gt;
2:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP2.png]]&lt;br /&gt;
&lt;br /&gt;
3:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP3.png]]&lt;br /&gt;
&lt;br /&gt;
4:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP4.png]]&lt;br /&gt;
&lt;br /&gt;
== Protocolo de comunicación ==&lt;br /&gt;
El protocolo de comunicaron diseñado para la comunicación entre Servidor y Aplicación ''Mobile'' es el siguiente:&lt;br /&gt;
&lt;br /&gt;
'''''Accion0-S0\nAccion1-S1\nAccion2-S2\nAccion3\nAccion4-S4\nVelocidad'''''&lt;br /&gt;
&lt;br /&gt;
Donde, este ''string'' representa la serie encadenada de acciones que el servidor recibe para ejecutar en el robot desde la aplicación.&lt;br /&gt;
Cada acción esta separada de la que se encuentra a continuación por el símbolo &amp;quot;''\n''&amp;quot;.&lt;br /&gt;
Podemos diferenciar dos tipos de acciones, las que requieren parámetro y las que no, estas se comunican de la siguiente forma:&lt;br /&gt;
'''Acción con parámetro''': NombreAccion-Parametro&lt;br /&gt;
&lt;br /&gt;
'''Acción sin parámetro''': NombreAccion&lt;br /&gt;
&lt;br /&gt;
== Implementación código Python ==&lt;br /&gt;
&lt;br /&gt;
Antes de empezar a programar o usar el código, es necesario instalar las librerías a usar, esto se puede hacer escribiendo &lt;br /&gt;
&lt;br /&gt;
'''''pip install [nombre de la librería]''''' en el interprete de comandos del sistema.&lt;br /&gt;
&lt;br /&gt;
Entonces instalamos la librería a utilizar, en este caso:&lt;br /&gt;
&lt;br /&gt;
'''''pip install simple_websocket_server'''''&lt;br /&gt;
&lt;br /&gt;
Una vez instalada la librería, hay que empezar a escribir el código.&lt;br /&gt;
&lt;br /&gt;
El encabezado del código es el siguiente&lt;br /&gt;
El uso de cada librería se explica con detalle mas adelante&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Encabezado.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A partir de la librería '''sys''' se define el camino del sistema para utilizar los plugin Butiá.&lt;br /&gt;
En nuestro caso, la ruta es ''' '/home/trerb/TurtleBots.activity/plugins/butia' ''', eso se tiene que modificar dependiendo de donde se encuentren el directorio ''' TurtleBots.activity/ ''' en su sistema de archivos&lt;br /&gt;
&lt;br /&gt;
[[Archivo:UsoPluginButia.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego se encuentra la función ''' clearConsole ''',&lt;br /&gt;
Esta función sirve únicamente para limpiar el interprete de Python usando la librería ''' os ''' y tener una ejecución mas limpia&lt;br /&gt;
&lt;br /&gt;
[[Archivo:clearConsole().png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
El siguiente código utiliza la librería ''' socket ''' para conectarse a la web y preguntar la ip del ordenador que ejecuta el archivo y la muestra en pantalla, esto se usa para facilitar la conexión con la App Mobile&lt;br /&gt;
&lt;br /&gt;
[[Archivo:conexionSocket.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Las siguientes líneas de código preguntan al usuario que puerto va a utilizar para la conexión, este código verifica que se ingrese un dato numérico, dentro del rango de los puertos, y que el puerto este disponible.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:tryPuerto.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego se declaran las variables: ''' Speed, Puerto_Gris y Puerto_Distancia ''', se verifica que los sensores de distancia y de grises estén conectados y asigna el puerto en el que estén conectados a las variables ''' Puerto_Distancia ''' y ''' Puerto_Gris ''' respectivamente. La variable ''' Speed ''' es una variable global que se lee al inicio de cada cadena de acciones y la utiliza para todos los movimientos del Butiá de esa cadena.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:declaracionVariables.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Seguimos con la declaración de las funciones básicas del Butiá, en este caso son ''' Avanzar, Rotar, AvanzarHastaVerColor y AvanzarHastaObstaculo ''' &lt;br /&gt;
&lt;br /&gt;
-La función ''' Avanzar ''' recibe un parámetro de tiempo y el Butiá avanza ese determinado tiempo.&lt;br /&gt;
&lt;br /&gt;
-La función ''' Retroceder ''' recibe un parámetro de tiempo y el Butiá retrocede ese determinado tiempo.&lt;br /&gt;
&lt;br /&gt;
-La función ''' Rotar ''' recibe dos parámetros, una dirección que puede ser Izquierda o Derecha y un tiempo que indica la duración de la rotación del Butiá.&lt;br /&gt;
&lt;br /&gt;
-La función ''' AvanzarHastaVerColor ''' recibe un parámetro que varia entre Blanco o Negro, el robot va a avanzar hasta detectar el color seleccionado.&lt;br /&gt;
Esta función solo se puede usar si el sensor de grises esta conectado.&lt;br /&gt;
&lt;br /&gt;
-Por ultimo, la función ''' AvanzarHastaObstaculo ''' no recibe parámetros, en este caso el Butiá va a avanzar hasta estar a unos pocos centímetros de un obstáculo.&lt;br /&gt;
Esta función solo se puede usar si el sensor de distancia esta conectado.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:FuncionesBasicas.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego se encuentra una función ''' Accion1 ''' esta función la puede definir el usuario a gusto, se puede implementar desde una función básica hasta un seguidor de líneas avanzado. La única condición que se necesita para implementar esta ''' Accion1 ''' es que no puede recibir parámetros&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Accion1.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ahora tenemos que definir el menú principal del programa, este se divide en dos funciones&lt;br /&gt;
&lt;br /&gt;
- ''' handle ''': Esta es una función predeterminada de la librería ''' simple_web_socket ''' y se llama cada vez que el servidor recibe un dato del cliente. En este caso la función crea una lista de las acciones que le llegan de la App Mobile, y las va ejecutando ordenadamente&lt;br /&gt;
&lt;br /&gt;
- ''' handle_close ''': Al igual que la función anterior, esta también es una función predeterminada de la librería ''' simple_web_socket ''' y se llama cuando el cliente se desconecta del servidor&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Screenshot from 2021-06-27 03-58-56.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Y por ultimo tenemos el dos líneas de codigo, la primera se encarga de abrir el servidor y la segunda lo mantiene abierto infinitamente&lt;br /&gt;
&lt;br /&gt;
[[Archivo:abrirServidor.png]]&lt;br /&gt;
&lt;br /&gt;
== Implementación código React ==&lt;br /&gt;
&lt;br /&gt;
La aplicación ''mobile'' esta implementada con React Native, ademas, se utiliza el ''framework'' [https://docs.expo.io/ Expo]. Este ''framework'' nos brinda un conjunto de herramientas que facilita el desarrollo de aplicaciones ''mobile''. &lt;br /&gt;
En caso de querer agregar, o modificar cualidades, es necesario proceder de la siguiente forma:&lt;br /&gt;
&lt;br /&gt;
Descargar el archivo comprimido adjunto.&lt;br /&gt;
&lt;br /&gt;
Extraerlo, posicionarse en el directorio raiz de la carpeta descomprimida, y ejecutar desde la terminal lo siguiente (tener en cuenta que es necesario tener en la maquina, el gestor de paquetes [https://docs.npmjs.com/ npm]).&lt;br /&gt;
&lt;br /&gt;
''''npm install'''' &lt;br /&gt;
&lt;br /&gt;
Esto descarga las dependencias que utiliza la aplicación, luego de esto podemos empezar a desarrollar.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para visualizar los cambios en tiempo real mientras desarrollamos, es necesario instalar la aplicación Expo Go para [https://play.google.com/store/apps/details?id=host.exp.exponent&amp;amp;hl=es_UY&amp;amp;gl=US Android] o para [https://apps.apple.com/es/app/expo-go/id982107779 iOS] según sea el caso.&lt;br /&gt;
&lt;br /&gt;
Para a visualizar la app en desarrollo desde Expo Go, procedemos de la siguiente forma:&lt;br /&gt;
Desde el directorio raíz de la aplicación ejecutamos desde la terminal lo siguiente:&lt;br /&gt;
&lt;br /&gt;
''''npm start''''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego, desde la aplicación Expo Go, con el celular conectado en la misma red local accedemos a la aplicación seleccionando lo siguiente:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Expo.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hecho esto, podemos cambiar el código de la aplicación y ver reflejados los cambios de forma casi instantánea.&lt;br /&gt;
&lt;br /&gt;
La aplicación esta compuesta por dos pantallas, la pantalla de configuración (''ConfigScreen.js''), donde se ingresa la dirección ip y puerto del servidor, y la pantalla principal (''MainScreen.js''), donde se lleva a cabo la programación del robot mediante acciones.&lt;br /&gt;
&lt;br /&gt;
Esta ultima pantalla esta compuesta por los componentes ''TopList.js'' y ''BottomList.js''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Untitled presentation.png]]&lt;br /&gt;
&lt;br /&gt;
Para agregar una nueva accion al sistema, es necesario programarla en el servidor con un determinado nombre, supondremos &amp;quot;AccionN&amp;quot;, esto resulta fácil si se toma como ejemplo las acciones ya implementadas.&lt;br /&gt;
&lt;br /&gt;
En la aplicación, esta nueva acción se agrega en el ''array'' &amp;quot;''actionsData''&amp;quot;, dicho ''array'' se encuentra en la pantalla principal, es decir en el archivo &amp;quot;''MainScreen.js''&amp;quot;, cada acción cuenta con los siguientes datos:&lt;br /&gt;
&lt;br /&gt;
-'''idAccion:''' Identificador de la acción en dicho arreglo (actionsData).&lt;br /&gt;
&lt;br /&gt;
-'''title:''': Titulo de la acción que se muestra en el panel superior.&lt;br /&gt;
&lt;br /&gt;
-'''actionId:''' Nombre identificador de la acción en el servidor.&lt;br /&gt;
&lt;br /&gt;
-'''overlay:''' ''Overlay'' que se despliega al seleccionar la acción (si esta requiere cierto parámetro), esta función lleva como parámetro &amp;quot;''editOverlay''&amp;quot; y &amp;quot;''id''&amp;quot;, estos se utilizan cuando se requiere cambiar dicha variable en una acción que ya fue seleccionada y se encuentra en el panel inferior de la aplicación, como por ejemplo pueden ser segundos en el caso de la acción &amp;quot;Avanzar&amp;quot;, o colores en el caso de &amp;quot;Avanzar hasta obstáculo&amp;quot;. Este parámetro puede ser que no sea necesario, como es en el caso de la acción &amp;quot;Avanzar hasta obstáculo&amp;quot;, en este ultimo caso el valor de este campo es ''null''.&lt;br /&gt;
&lt;br /&gt;
Ejemplo de la acción &amp;quot;Avanzar&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Screenshot from 2021-06-27 04-18-42.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ejemplo de la acción &amp;quot;Avanzar hasta obstáculo&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Screenshot_from_2021-06-27_00-28-32.png]]&lt;br /&gt;
&lt;br /&gt;
== Manual de uso de la aplicación ==&lt;br /&gt;
&lt;br /&gt;
Aunque la aplicación resulta intuitiva y fácil de usar se describe a continuación una serie de pasos para utilizarla correctamente.&lt;br /&gt;
&lt;br /&gt;
Para comenzar a utilizar la aplicación es necesario configurar la conexión de la aplicación con el servidor (recordar que ambos se deben encontrar ejecutándose en la misma red local), el servidor ejecutando en una computadora que esté conectada correctamente al butiá (con los sensores descritos anteriormente) y la aplicación ejecutándose en el celular.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Conectando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego que la conexión haya resultado exitosa, nos encontramos en la pantalla principal. En el panel superior, como se muestra a continuación, se encuentran las aplicaciones disponibles que podemos ejecutar en el robot butiá.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Acciones.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para agregar una serie de acciones al robot, simplemente presionamos la que queramos, a continuación esta aparecerá en el panel inferior, a medida de que vayamos seleccionando acciones, estas se irán encadenando una tras otras, estas estarán prontas para ejecutarse secuencialmente, desde la parte inferior, a la parte superior, en el momento que presionemos el botón &amp;quot;Empezar&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Agregando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Como la aplicación está pensada para planificar algoritmos para resolver desafíos o ''puzzles'', es probable que nos equivoquemos y seleccionemos una acción o insertemos un parámetro incorrectamente, ¡pero no te preocupes!. Para editar el parámetro que le hayamos ingresado a una acción, simplemente mantenemos pulsado la que deseamos corregir e ingresamos el nuevo valor.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Editando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
También es posible eliminar una acción, para hacer esto, nuevamente mantenemos pulsada la acción que queremos eliminar, pero esta vez, seleccionamos la acción eliminar. A continuación la acción seleccionada desaparecerá del panel inferior. También es posible que deseemos eliminar todas las acciones que habíamos ingresado, en este caso seleccionamos el botón &amp;quot;Eliminar acciones&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Eliminando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es posible que queremos que el robot se desplace a ciertas velocidades, teniendo en cuenta que al modificar la velocidad, el robot tendrá un comportamiento totalmente diferente, debido a que gran parte de las acciones se ejecutan por un tiempo asignado, a mayor velocidad, más desplazamiento.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Velocidad.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En caso de que exista un error en la conexión, podemos intentar volver a conectar la aplicación al servidor, para esto seleccionamos la opción configuración.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:A configuracion.gif]]&lt;br /&gt;
&lt;br /&gt;
== Mejoras a futuro ==&lt;br /&gt;
&lt;br /&gt;
* Implementar una forma para que las función ''' Accion1 ''' pueda recibir parámetros, para así ampliar la gama de problemas que se puedan solucionar a través de esta aplicación.&lt;br /&gt;
&lt;br /&gt;
* Implementación de código que permita añadir a través del código, una mayor cantidad de funciones genéricas a la aplicación.&lt;br /&gt;
&lt;br /&gt;
* Desarrollar una forma de comunicación bilateral entre la ''App Mobile'' y Python para mejorar el ''debug'' en tiempo de ejecución.&lt;br /&gt;
&lt;br /&gt;
== Archivos de uso ==&lt;br /&gt;
&lt;br /&gt;
- [[Archivo:Server Code.zip]]&lt;br /&gt;
&lt;br /&gt;
- [[Archivo:App code.zip]]&lt;br /&gt;
&lt;br /&gt;
- [[Archivo:Apk app.zip ]]&lt;/div&gt;</summary>
		<author><name>German.moreira</name></author>	</entry>

	<entry>
		<id>http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Programando_el_Butia_desde_el_celular&amp;diff=11699</id>
		<title>Programando el Butia desde el celular</title>
		<link rel="alternate" type="text/html" href="http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Programando_el_Butia_desde_el_celular&amp;diff=11699"/>
				<updated>2021-06-28T01:32:12Z</updated>
		
		<summary type="html">&lt;p&gt;German.moreira: /* Archivos de uso */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Introducción ==&lt;br /&gt;
&lt;br /&gt;
La idea del proyecto en un principio era usar el celular como medio para controlar el robot Butiá para que resulte más atractivo para los estudiantes que no les guste la programación.&lt;br /&gt;
&lt;br /&gt;
Luego, la idea se modifico un poco debido a que descubrimos que con esta implementación, podíamos hacer mas sencilla la resolución de algunos ejercicios básicos mediante algoritmos mas simplificados, tomamos el trabajo que teníamos hecho hasta el momento y lo adaptamos a un menú con distintas acciones simples como avanzar un determinado tiempo, avanzar hasta chocar contra un objeto o rotar a la izquierda o derecha un determinado tiempo.&lt;br /&gt;
&lt;br /&gt;
Estas funciones básicas y bastante sencillas de entender más una interfaz amigable y fácil de usar, se implementaron para que el rango de edad de uso de esta aplicación vaya de 3 años en adelante.&lt;br /&gt;
&lt;br /&gt;
Como resultado obtuvimos una aplicación que se puede usar para que niños de:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- 4 / 5 / 6 años resuelvan ejercicios sencillos como puede ser llegar de un punto a otro, buscar el camino a un objeto o resolver un laberinto sencillo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- 7 / 8 / 9 años puedan resolver ejercicios un poco más complejos como puede ser resolver un laberinto del más sencillo al mas complejo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- 10 años en adelante tengan la capacidad de adaptar una parte personal de código al programa y puedan resolver cualquier ejercicio que se pueda plantear con el robot Butiá.&lt;br /&gt;
&lt;br /&gt;
== Objetivo y motivación==&lt;br /&gt;
&lt;br /&gt;
Los objetivos del proyecto eran, como dice el nombre, poder conectar remotamente el robot Butiá a un celular y buscar una abstracción de la mayor cantidad de problemas que puedan ser resueltos con el robot Butiá.&lt;br /&gt;
&lt;br /&gt;
Esto, para poder crear un método de uso del robot Butiá más dinámico y con funciones que permiten realizar, mediante algoritmos mas sencillos, la solución de la mayor cantidad de puzles particulares, abstrayéndose de la programación directa, lo que puede ser tedioso o abrumador para personas que tienen su primer acercamiento a la programación.&lt;br /&gt;
&lt;br /&gt;
Al hacer esto, el nivel de uso en aulas del robot Butiá, puede simplificarse hasta clases desde 3 años de jardinera en adelante, debido a que la aplicación simplifica la parte de codificación y los algoritmos de solución de ejercicios se convierten simplemente en una serie de pasos básicos a ejecutar linealmente.&lt;br /&gt;
&lt;br /&gt;
Lo que se busca con este proyecto, es despertar la curiosidad e interés en niños y adolescentes en el área de la programación de una forma didáctica, en donde estos pueden experimentar directamente con el robot y potenciar la creatividad para resolver problemas. &lt;br /&gt;
&lt;br /&gt;
La aplicación esta inspirada en el lenguaje &amp;quot;Sratch&amp;quot;, el cual es un lenguaje ideal para los primeros acercamientos a la programación. &lt;br /&gt;
&lt;br /&gt;
Este ''software'' permite ademas, introducir conceptos como, instrucciones, secuencialidad de código, algoritmos, secuencias de control, estructuras de repetición, etc. Como ejercicio, se puede plantear por ejemplo, hacer el pasaje a Python de algoritmos diseñados en la aplicación.&lt;br /&gt;
&lt;br /&gt;
== Armado del Butiá ==&lt;br /&gt;
&lt;br /&gt;
* Paso 1: Armar el Butiá a partir de esta [https://www.fing.edu.uy/inco/proyectos/butia/files/docs_butia2/armando_paso_a_paso_motores_CC_rev1.pdf guía oficial]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Paso 2: Instalar el sensor de grises&lt;br /&gt;
&lt;br /&gt;
1:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP1.jpeg]] &lt;br /&gt;
&lt;br /&gt;
2:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP2.jpeg]]&lt;br /&gt;
&lt;br /&gt;
3:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP3.jpeg]]&lt;br /&gt;
&lt;br /&gt;
4:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP4.jpeg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Paso 3: Instalar el sensor de distancia&lt;br /&gt;
&lt;br /&gt;
1:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP1.png]]&lt;br /&gt;
&lt;br /&gt;
2:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP2.png]]&lt;br /&gt;
&lt;br /&gt;
3:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP3.png]]&lt;br /&gt;
&lt;br /&gt;
4:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP4.png]]&lt;br /&gt;
&lt;br /&gt;
== Protocolo de comunicación ==&lt;br /&gt;
El protocolo de comunicaron diseñado para la comunicación entre Servidor y Aplicación ''Mobile'' es el siguiente:&lt;br /&gt;
&lt;br /&gt;
'''''Accion0-S0\nAccion1-S1\nAccion2-S2\nAccion3\nAccion4-S4\nVelocidad'''''&lt;br /&gt;
&lt;br /&gt;
Donde, este ''string'' representa la serie encadenada de acciones que el servidor recibe para ejecutar en el robot desde la aplicación.&lt;br /&gt;
Cada acción esta separada de la que se encuentra a continuación por el símbolo &amp;quot;''\n''&amp;quot;.&lt;br /&gt;
Podemos diferenciar dos tipos de acciones, las que requieren parámetro y las que no, estas se comunican de la siguiente forma:&lt;br /&gt;
'''Acción con parámetro''': NombreAccion-Parametro&lt;br /&gt;
&lt;br /&gt;
'''Acción sin parámetro''': NombreAccion&lt;br /&gt;
&lt;br /&gt;
== Implementación código Python ==&lt;br /&gt;
&lt;br /&gt;
Antes de empezar a programar o usar el código, es necesario instalar las librerías a usar, esto se puede hacer escribiendo &lt;br /&gt;
&lt;br /&gt;
'''''pip install [nombre de la librería]''''' en el interprete de comandos del sistema.&lt;br /&gt;
&lt;br /&gt;
Entonces instalamos la librería a utilizar, en este caso:&lt;br /&gt;
&lt;br /&gt;
'''''pip install simple_websocket_server'''''&lt;br /&gt;
&lt;br /&gt;
Una vez instalada la librería, hay que empezar a escribir el código.&lt;br /&gt;
&lt;br /&gt;
El encabezado del código es el siguiente&lt;br /&gt;
El uso de cada librería se explica con detalle mas adelante&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Encabezado.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A partir de la librería '''sys''' se define el camino del sistema para utilizar los plugin Butiá.&lt;br /&gt;
En nuestro caso, la ruta es ''' '/home/trerb/TurtleBots.activity/plugins/butia' ''', eso se tiene que modificar dependiendo de donde se encuentren el directorio ''' TurtleBots.activity/ ''' en su sistema de archivos&lt;br /&gt;
&lt;br /&gt;
[[Archivo:UsoPluginButia.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego se encuentra la función ''' clearConsole ''',&lt;br /&gt;
Esta función sirve únicamente para limpiar el interprete de Python usando la librería ''' os ''' y tener una ejecución mas limpia&lt;br /&gt;
&lt;br /&gt;
[[Archivo:clearConsole().png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
El siguiente código utiliza la librería ''' socket ''' para conectarse a la web y preguntar la ip del ordenador que ejecuta el archivo y la muestra en pantalla, esto se usa para facilitar la conexión con la App Mobile&lt;br /&gt;
&lt;br /&gt;
[[Archivo:conexionSocket.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Las siguientes líneas de código preguntan al usuario que puerto va a utilizar para la conexión, este código verifica que se ingrese un dato numérico, dentro del rango de los puertos, y que el puerto este disponible.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:tryPuerto.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego se declaran las variables: ''' Speed, Puerto_Gris y Puerto_Distancia ''', se verifica que los sensores de distancia y de grises estén conectados y asigna el puerto en el que estén conectados a las variables ''' Puerto_Distancia ''' y ''' Puerto_Gris ''' respectivamente. La variable ''' Speed ''' es una variable global que se lee al inicio de cada cadena de acciones y la utiliza para todos los movimientos del Butiá de esa cadena.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:declaracionVariables.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Seguimos con la declaración de las funciones básicas del Butiá, en este caso son ''' Avanzar, Rotar, AvanzarHastaVerColor y AvanzarHastaObstaculo ''' &lt;br /&gt;
&lt;br /&gt;
-La función ''' Avanzar ''' recibe un parámetro de tiempo y el Butiá avanza ese determinado tiempo.&lt;br /&gt;
&lt;br /&gt;
-La función ''' Retroceder ''' recibe un parámetro de tiempo y el Butiá retrocede ese determinado tiempo.&lt;br /&gt;
&lt;br /&gt;
-La función ''' Rotar ''' recibe dos parámetros, una dirección que puede ser Izquierda o Derecha y un tiempo que indica la duración de la rotación del Butiá.&lt;br /&gt;
&lt;br /&gt;
-La función ''' AvanzarHastaVerColor ''' recibe un parámetro que varia entre Blanco o Negro, el robot va a avanzar hasta detectar el color seleccionado.&lt;br /&gt;
Esta función solo se puede usar si el sensor de grises esta conectado.&lt;br /&gt;
&lt;br /&gt;
-Por ultimo, la función ''' AvanzarHastaObstaculo ''' no recibe parámetros, en este caso el Butiá va a avanzar hasta estar a unos pocos centímetros de un obstáculo.&lt;br /&gt;
Esta función solo se puede usar si el sensor de distancia esta conectado.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:FuncionesBasicas.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego se encuentra una función ''' Accion1 ''' esta función la puede definir el usuario a gusto, se puede implementar desde una función básica hasta un seguidor de líneas avanzado. La única condición que se necesita para implementar esta ''' Accion1 ''' es que no puede recibir parámetros&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Accion1.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ahora tenemos que definir el menú principal del programa, este se divide en dos funciones&lt;br /&gt;
&lt;br /&gt;
- ''' handle ''': Esta es una función predeterminada de la librería ''' simple_web_socket ''' y se llama cada vez que el servidor recibe un dato del cliente. En este caso la función crea una lista de las acciones que le llegan de la App Mobile, y las va ejecutando ordenadamente&lt;br /&gt;
&lt;br /&gt;
- ''' handle_close ''': Al igual que la función anterior, esta también es una función predeterminada de la librería ''' simple_web_socket ''' y se llama cuando el cliente se desconecta del servidor&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Screenshot from 2021-06-27 03-58-56.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Y por ultimo tenemos el dos líneas de codigo, la primera se encarga de abrir el servidor y la segunda lo mantiene abierto infinitamente&lt;br /&gt;
&lt;br /&gt;
[[Archivo:abrirServidor.png]]&lt;br /&gt;
&lt;br /&gt;
== Implementación código React ==&lt;br /&gt;
&lt;br /&gt;
La aplicación ''mobile'' esta implementada con React Native, ademas, se utiliza el ''framework'' [https://docs.expo.io/ Expo]. Este ''framework'' nos brinda un conjunto de herramientas que facilita el desarrollo de aplicaciones ''mobile''. &lt;br /&gt;
En caso de querer agregar, o modificar cualidades, es necesario proceder de la siguiente forma:&lt;br /&gt;
&lt;br /&gt;
Descargar el archivo comprimido adjunto.&lt;br /&gt;
&lt;br /&gt;
Extraerlo, posicionarse en el directorio raiz de la carpeta descomprimida, y ejecutar desde la terminal lo siguiente (tener en cuenta que es necesario tener en la maquina, el gestor de paquetes [https://docs.npmjs.com/ npm]).&lt;br /&gt;
&lt;br /&gt;
''''npm install'''' &lt;br /&gt;
&lt;br /&gt;
Esto descarga las dependencias que utiliza la aplicación, luego de esto podemos empezar a desarrollar.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para visualizar los cambios en tiempo real mientras desarrollamos, es necesario instalar la aplicación Expo Go para [https://play.google.com/store/apps/details?id=host.exp.exponent&amp;amp;hl=es_UY&amp;amp;gl=US Android] o para [https://apps.apple.com/es/app/expo-go/id982107779 iOS] según sea el caso.&lt;br /&gt;
&lt;br /&gt;
Para a visualizar la app en desarrollo desde Expo Go, procedemos de la siguiente forma:&lt;br /&gt;
Desde el directorio raíz de la aplicación ejecutamos desde la terminal lo siguiente:&lt;br /&gt;
&lt;br /&gt;
''''npm start''''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego, desde la aplicación Expo Go, con el celular conectado en la misma red local accedemos a la aplicación seleccionando lo siguiente:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Expo.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hecho esto, podemos cambiar el código de la aplicación y ver reflejados los cambios de forma casi instantánea.&lt;br /&gt;
&lt;br /&gt;
La aplicación esta compuesta por dos pantallas, la pantalla de configuración (''ConfigScreen.js''), donde se ingresa la dirección ip y puerto del servidor, y la pantalla principal (''MainScreen.js''), donde se lleva a cabo la programación del robot mediante acciones.&lt;br /&gt;
&lt;br /&gt;
Esta ultima pantalla esta compuesta por los componentes ''TopList.js'' y ''BottomList.js''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Untitled presentation.png]]&lt;br /&gt;
&lt;br /&gt;
Para agregar una nueva accion al sistema, es necesario programarla en el servidor con un determinado nombre, supondremos &amp;quot;AccionN&amp;quot;, esto resulta fácil si se toma como ejemplo las acciones ya implementadas.&lt;br /&gt;
&lt;br /&gt;
En la aplicación, esta nueva acción se agrega en el ''array'' &amp;quot;''actionsData''&amp;quot;, dicho ''array'' se encuentra en la pantalla principal, es decir en el archivo &amp;quot;''MainScreen.js''&amp;quot;, cada acción cuenta con los siguientes datos:&lt;br /&gt;
&lt;br /&gt;
-'''idAccion:''' Identificador de la acción en dicho arreglo (actionsData).&lt;br /&gt;
&lt;br /&gt;
-'''title:''': Titulo de la acción que se muestra en el panel superior.&lt;br /&gt;
&lt;br /&gt;
-'''actionId:''' Nombre identificador de la acción en el servidor.&lt;br /&gt;
&lt;br /&gt;
-'''overlay:''' ''Overlay'' que se despliega al seleccionar la acción (si esta requiere parámetro), esta función lleva como parámetro &amp;quot;''editOverlay''&amp;quot; y &amp;quot;''id''&amp;quot; (estos que se utilizan cuando se requiere cambiar dicho valor en una acción que ya fue seleccionada y se encuentra en el panel inferior), como por ejemplo pueden ser segundos en el caso de la acción &amp;quot;Avanzar&amp;quot;, o colores en el caso de &amp;quot;Avanzar hasta obstáculo&amp;quot;. Este parámetro puede ser que no sea necesario, como es en el caso de la acción &amp;quot;Avanzar hasta obstáculo&amp;quot;, en este ultimo caso el valor de este campo es ''null''.&lt;br /&gt;
&lt;br /&gt;
Ejemplo de la acción &amp;quot;Avanzar&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Screenshot from 2021-06-27 04-18-42.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ejemplo de la acción &amp;quot;Avanzar hasta obstáculo&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Screenshot_from_2021-06-27_00-28-32.png]]&lt;br /&gt;
&lt;br /&gt;
== Manual de uso de la aplicación ==&lt;br /&gt;
&lt;br /&gt;
Aunque la aplicación resulta intuitiva y fácil de usar se describe a continuación una serie de pasos para utilizarla correctamente.&lt;br /&gt;
&lt;br /&gt;
Para comenzar a utilizar la aplicación es necesario configurar la conexión de la aplicación con el servidor (recordar que ambos se deben encontrar ejecutándose en la misma red local), el servidor ejecutando en una computadora que esté conectada correctamente al butiá (con los sensores descritos anteriormente) y la aplicación ejecutándose en el celular.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Conectando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego que la conexión haya resultado exitosa, nos encontramos en la pantalla principal. En el panel superior, como se muestra a continuación, se encuentran las aplicaciones disponibles que podemos ejecutar en el robot butiá.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Acciones.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para agregar una serie de acciones al robot, simplemente presionamos la que queramos, a continuación esta aparecerá en el panel inferior, a medida de que vayamos seleccionando acciones, estas se irán encadenando una tras otras, estas estarán prontas para ejecutarse secuencialmente, desde la parte inferior, a la parte superior, en el momento que presionemos el botón &amp;quot;Empezar&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Agregando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Como la aplicación está pensada para planificar algoritmos para resolver desafíos o ''puzzles'', es probable que nos equivoquemos y seleccionemos una acción o insertemos un parámetro incorrectamente, ¡pero no te preocupes!. Para editar el parámetro que le hayamos ingresado a una acción, simplemente mantenemos pulsado la que deseamos corregir e ingresamos el nuevo valor.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Editando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
También es posible eliminar una acción, para hacer esto, nuevamente mantenemos pulsada la acción que queremos eliminar, pero esta vez, seleccionamos la acción eliminar. A continuación la acción seleccionada desaparecerá del panel inferior. También es posible que deseemos eliminar todas las acciones que habíamos ingresado, en este caso seleccionamos el botón &amp;quot;Eliminar acciones&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Eliminando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es posible que queremos que el robot se desplace a ciertas velocidades, teniendo en cuenta que al modificar la velocidad, el robot tendrá un comportamiento totalmente diferente, debido a que gran parte de las acciones se ejecutan por un tiempo asignado, a mayor velocidad, más desplazamiento.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Velocidad.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En caso de que exista un error en la conexión, podemos intentar volver a conectar la aplicación al servidor, para esto seleccionamos la opción configuración.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:A configuracion.gif]]&lt;br /&gt;
&lt;br /&gt;
== Mejoras a futuro ==&lt;br /&gt;
&lt;br /&gt;
* Implementar una forma para que las función ''' Accion1 ''' pueda recibir parámetros, para así ampliar la gama de problemas que se puedan solucionar a través de esta aplicación.&lt;br /&gt;
&lt;br /&gt;
* Implementación de código que permita añadir a través del código, una mayor cantidad de funciones genéricas a la aplicación.&lt;br /&gt;
&lt;br /&gt;
* Desarrollar una forma de comunicación bilateral entre la ''App Mobile'' y Python para mejorar el ''debug'' en tiempo de ejecución.&lt;br /&gt;
&lt;br /&gt;
== Archivos de uso ==&lt;br /&gt;
&lt;br /&gt;
- [[Archivo:Server Code.zip]]&lt;br /&gt;
&lt;br /&gt;
- [[Archivo:App code.zip]]&lt;br /&gt;
&lt;br /&gt;
- [[Archivo:Apk app.zip ]]&lt;/div&gt;</summary>
		<author><name>German.moreira</name></author>	</entry>

	<entry>
		<id>http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Programando_el_Butia_desde_el_celular&amp;diff=11698</id>
		<title>Programando el Butia desde el celular</title>
		<link rel="alternate" type="text/html" href="http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Programando_el_Butia_desde_el_celular&amp;diff=11698"/>
				<updated>2021-06-28T01:31:43Z</updated>
		
		<summary type="html">&lt;p&gt;German.moreira: /* Archivos de uso */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Introducción ==&lt;br /&gt;
&lt;br /&gt;
La idea del proyecto en un principio era usar el celular como medio para controlar el robot Butiá para que resulte más atractivo para los estudiantes que no les guste la programación.&lt;br /&gt;
&lt;br /&gt;
Luego, la idea se modifico un poco debido a que descubrimos que con esta implementación, podíamos hacer mas sencilla la resolución de algunos ejercicios básicos mediante algoritmos mas simplificados, tomamos el trabajo que teníamos hecho hasta el momento y lo adaptamos a un menú con distintas acciones simples como avanzar un determinado tiempo, avanzar hasta chocar contra un objeto o rotar a la izquierda o derecha un determinado tiempo.&lt;br /&gt;
&lt;br /&gt;
Estas funciones básicas y bastante sencillas de entender más una interfaz amigable y fácil de usar, se implementaron para que el rango de edad de uso de esta aplicación vaya de 3 años en adelante.&lt;br /&gt;
&lt;br /&gt;
Como resultado obtuvimos una aplicación que se puede usar para que niños de:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- 4 / 5 / 6 años resuelvan ejercicios sencillos como puede ser llegar de un punto a otro, buscar el camino a un objeto o resolver un laberinto sencillo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- 7 / 8 / 9 años puedan resolver ejercicios un poco más complejos como puede ser resolver un laberinto del más sencillo al mas complejo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- 10 años en adelante tengan la capacidad de adaptar una parte personal de código al programa y puedan resolver cualquier ejercicio que se pueda plantear con el robot Butiá.&lt;br /&gt;
&lt;br /&gt;
== Objetivo y motivación==&lt;br /&gt;
&lt;br /&gt;
Los objetivos del proyecto eran, como dice el nombre, poder conectar remotamente el robot Butiá a un celular y buscar una abstracción de la mayor cantidad de problemas que puedan ser resueltos con el robot Butiá.&lt;br /&gt;
&lt;br /&gt;
Esto, para poder crear un método de uso del robot Butiá más dinámico y con funciones que permiten realizar, mediante algoritmos mas sencillos, la solución de la mayor cantidad de puzles particulares, abstrayéndose de la programación directa, lo que puede ser tedioso o abrumador para personas que tienen su primer acercamiento a la programación.&lt;br /&gt;
&lt;br /&gt;
Al hacer esto, el nivel de uso en aulas del robot Butiá, puede simplificarse hasta clases desde 3 años de jardinera en adelante, debido a que la aplicación simplifica la parte de codificación y los algoritmos de solución de ejercicios se convierten simplemente en una serie de pasos básicos a ejecutar linealmente.&lt;br /&gt;
&lt;br /&gt;
Lo que se busca con este proyecto, es despertar la curiosidad e interés en niños y adolescentes en el área de la programación de una forma didáctica, en donde estos pueden experimentar directamente con el robot y potenciar la creatividad para resolver problemas. &lt;br /&gt;
&lt;br /&gt;
La aplicación esta inspirada en el lenguaje &amp;quot;Sratch&amp;quot;, el cual es un lenguaje ideal para los primeros acercamientos a la programación. &lt;br /&gt;
&lt;br /&gt;
Este ''software'' permite ademas, introducir conceptos como, instrucciones, secuencialidad de código, algoritmos, secuencias de control, estructuras de repetición, etc. Como ejercicio, se puede plantear por ejemplo, hacer el pasaje a Python de algoritmos diseñados en la aplicación.&lt;br /&gt;
&lt;br /&gt;
== Armado del Butiá ==&lt;br /&gt;
&lt;br /&gt;
* Paso 1: Armar el Butiá a partir de esta [https://www.fing.edu.uy/inco/proyectos/butia/files/docs_butia2/armando_paso_a_paso_motores_CC_rev1.pdf guía oficial]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Paso 2: Instalar el sensor de grises&lt;br /&gt;
&lt;br /&gt;
1:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP1.jpeg]] &lt;br /&gt;
&lt;br /&gt;
2:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP2.jpeg]]&lt;br /&gt;
&lt;br /&gt;
3:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP3.jpeg]]&lt;br /&gt;
&lt;br /&gt;
4:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP4.jpeg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Paso 3: Instalar el sensor de distancia&lt;br /&gt;
&lt;br /&gt;
1:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP1.png]]&lt;br /&gt;
&lt;br /&gt;
2:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP2.png]]&lt;br /&gt;
&lt;br /&gt;
3:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP3.png]]&lt;br /&gt;
&lt;br /&gt;
4:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP4.png]]&lt;br /&gt;
&lt;br /&gt;
== Protocolo de comunicación ==&lt;br /&gt;
El protocolo de comunicaron diseñado para la comunicación entre Servidor y Aplicación ''Mobile'' es el siguiente:&lt;br /&gt;
&lt;br /&gt;
'''''Accion0-S0\nAccion1-S1\nAccion2-S2\nAccion3\nAccion4-S4\nVelocidad'''''&lt;br /&gt;
&lt;br /&gt;
Donde, este ''string'' representa la serie encadenada de acciones que el servidor recibe para ejecutar en el robot desde la aplicación.&lt;br /&gt;
Cada acción esta separada de la que se encuentra a continuación por el símbolo &amp;quot;''\n''&amp;quot;.&lt;br /&gt;
Podemos diferenciar dos tipos de acciones, las que requieren parámetro y las que no, estas se comunican de la siguiente forma:&lt;br /&gt;
'''Acción con parámetro''': NombreAccion-Parametro&lt;br /&gt;
&lt;br /&gt;
'''Acción sin parámetro''': NombreAccion&lt;br /&gt;
&lt;br /&gt;
== Implementación código Python ==&lt;br /&gt;
&lt;br /&gt;
Antes de empezar a programar o usar el código, es necesario instalar las librerías a usar, esto se puede hacer escribiendo &lt;br /&gt;
&lt;br /&gt;
'''''pip install [nombre de la librería]''''' en el interprete de comandos del sistema.&lt;br /&gt;
&lt;br /&gt;
Entonces instalamos la librería a utilizar, en este caso:&lt;br /&gt;
&lt;br /&gt;
'''''pip install simple_websocket_server'''''&lt;br /&gt;
&lt;br /&gt;
Una vez instalada la librería, hay que empezar a escribir el código.&lt;br /&gt;
&lt;br /&gt;
El encabezado del código es el siguiente&lt;br /&gt;
El uso de cada librería se explica con detalle mas adelante&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Encabezado.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A partir de la librería '''sys''' se define el camino del sistema para utilizar los plugin Butiá.&lt;br /&gt;
En nuestro caso, la ruta es ''' '/home/trerb/TurtleBots.activity/plugins/butia' ''', eso se tiene que modificar dependiendo de donde se encuentren el directorio ''' TurtleBots.activity/ ''' en su sistema de archivos&lt;br /&gt;
&lt;br /&gt;
[[Archivo:UsoPluginButia.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego se encuentra la función ''' clearConsole ''',&lt;br /&gt;
Esta función sirve únicamente para limpiar el interprete de Python usando la librería ''' os ''' y tener una ejecución mas limpia&lt;br /&gt;
&lt;br /&gt;
[[Archivo:clearConsole().png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
El siguiente código utiliza la librería ''' socket ''' para conectarse a la web y preguntar la ip del ordenador que ejecuta el archivo y la muestra en pantalla, esto se usa para facilitar la conexión con la App Mobile&lt;br /&gt;
&lt;br /&gt;
[[Archivo:conexionSocket.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Las siguientes líneas de código preguntan al usuario que puerto va a utilizar para la conexión, este código verifica que se ingrese un dato numérico, dentro del rango de los puertos, y que el puerto este disponible.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:tryPuerto.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego se declaran las variables: ''' Speed, Puerto_Gris y Puerto_Distancia ''', se verifica que los sensores de distancia y de grises estén conectados y asigna el puerto en el que estén conectados a las variables ''' Puerto_Distancia ''' y ''' Puerto_Gris ''' respectivamente. La variable ''' Speed ''' es una variable global que se lee al inicio de cada cadena de acciones y la utiliza para todos los movimientos del Butiá de esa cadena.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:declaracionVariables.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Seguimos con la declaración de las funciones básicas del Butiá, en este caso son ''' Avanzar, Rotar, AvanzarHastaVerColor y AvanzarHastaObstaculo ''' &lt;br /&gt;
&lt;br /&gt;
-La función ''' Avanzar ''' recibe un parámetro de tiempo y el Butiá avanza ese determinado tiempo.&lt;br /&gt;
&lt;br /&gt;
-La función ''' Retroceder ''' recibe un parámetro de tiempo y el Butiá retrocede ese determinado tiempo.&lt;br /&gt;
&lt;br /&gt;
-La función ''' Rotar ''' recibe dos parámetros, una dirección que puede ser Izquierda o Derecha y un tiempo que indica la duración de la rotación del Butiá.&lt;br /&gt;
&lt;br /&gt;
-La función ''' AvanzarHastaVerColor ''' recibe un parámetro que varia entre Blanco o Negro, el robot va a avanzar hasta detectar el color seleccionado.&lt;br /&gt;
Esta función solo se puede usar si el sensor de grises esta conectado.&lt;br /&gt;
&lt;br /&gt;
-Por ultimo, la función ''' AvanzarHastaObstaculo ''' no recibe parámetros, en este caso el Butiá va a avanzar hasta estar a unos pocos centímetros de un obstáculo.&lt;br /&gt;
Esta función solo se puede usar si el sensor de distancia esta conectado.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:FuncionesBasicas.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego se encuentra una función ''' Accion1 ''' esta función la puede definir el usuario a gusto, se puede implementar desde una función básica hasta un seguidor de líneas avanzado. La única condición que se necesita para implementar esta ''' Accion1 ''' es que no puede recibir parámetros&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Accion1.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ahora tenemos que definir el menú principal del programa, este se divide en dos funciones&lt;br /&gt;
&lt;br /&gt;
- ''' handle ''': Esta es una función predeterminada de la librería ''' simple_web_socket ''' y se llama cada vez que el servidor recibe un dato del cliente. En este caso la función crea una lista de las acciones que le llegan de la App Mobile, y las va ejecutando ordenadamente&lt;br /&gt;
&lt;br /&gt;
- ''' handle_close ''': Al igual que la función anterior, esta también es una función predeterminada de la librería ''' simple_web_socket ''' y se llama cuando el cliente se desconecta del servidor&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Screenshot from 2021-06-27 03-58-56.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Y por ultimo tenemos el dos líneas de codigo, la primera se encarga de abrir el servidor y la segunda lo mantiene abierto infinitamente&lt;br /&gt;
&lt;br /&gt;
[[Archivo:abrirServidor.png]]&lt;br /&gt;
&lt;br /&gt;
== Implementación código React ==&lt;br /&gt;
&lt;br /&gt;
La aplicación ''mobile'' esta implementada con React Native, ademas, se utiliza el ''framework'' [https://docs.expo.io/ Expo]. Este ''framework'' nos brinda un conjunto de herramientas que facilita el desarrollo de aplicaciones ''mobile''. &lt;br /&gt;
En caso de querer agregar, o modificar cualidades, es necesario proceder de la siguiente forma:&lt;br /&gt;
&lt;br /&gt;
Descargar el archivo comprimido adjunto.&lt;br /&gt;
&lt;br /&gt;
Extraerlo, posicionarse en el directorio raiz de la carpeta descomprimida, y ejecutar desde la terminal lo siguiente (tener en cuenta que es necesario tener en la maquina, el gestor de paquetes [https://docs.npmjs.com/ npm]).&lt;br /&gt;
&lt;br /&gt;
''''npm install'''' &lt;br /&gt;
&lt;br /&gt;
Esto descarga las dependencias que utiliza la aplicación, luego de esto podemos empezar a desarrollar.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para visualizar los cambios en tiempo real mientras desarrollamos, es necesario instalar la aplicación Expo Go para [https://play.google.com/store/apps/details?id=host.exp.exponent&amp;amp;hl=es_UY&amp;amp;gl=US Android] o para [https://apps.apple.com/es/app/expo-go/id982107779 iOS] según sea el caso.&lt;br /&gt;
&lt;br /&gt;
Para a visualizar la app en desarrollo desde Expo Go, procedemos de la siguiente forma:&lt;br /&gt;
Desde el directorio raíz de la aplicación ejecutamos desde la terminal lo siguiente:&lt;br /&gt;
&lt;br /&gt;
''''npm start''''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego, desde la aplicación Expo Go, con el celular conectado en la misma red local accedemos a la aplicación seleccionando lo siguiente:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Expo.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hecho esto, podemos cambiar el código de la aplicación y ver reflejados los cambios de forma casi instantánea.&lt;br /&gt;
&lt;br /&gt;
La aplicación esta compuesta por dos pantallas, la pantalla de configuración (''ConfigScreen.js''), donde se ingresa la dirección ip y puerto del servidor, y la pantalla principal (''MainScreen.js''), donde se lleva a cabo la programación del robot mediante acciones.&lt;br /&gt;
&lt;br /&gt;
Esta ultima pantalla esta compuesta por los componentes ''TopList.js'' y ''BottomList.js''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Untitled presentation.png]]&lt;br /&gt;
&lt;br /&gt;
Para agregar una nueva accion al sistema, es necesario programarla en el servidor con un determinado nombre, supondremos &amp;quot;AccionN&amp;quot;, esto resulta fácil si se toma como ejemplo las acciones ya implementadas.&lt;br /&gt;
&lt;br /&gt;
En la aplicación, esta nueva acción se agrega en el ''array'' &amp;quot;''actionsData''&amp;quot;, dicho ''array'' se encuentra en la pantalla principal, es decir en el archivo &amp;quot;''MainScreen.js''&amp;quot;, cada acción cuenta con los siguientes datos:&lt;br /&gt;
&lt;br /&gt;
-'''idAccion:''' Identificador de la acción en dicho arreglo (actionsData).&lt;br /&gt;
&lt;br /&gt;
-'''title:''': Titulo de la acción que se muestra en el panel superior.&lt;br /&gt;
&lt;br /&gt;
-'''actionId:''' Nombre identificador de la acción en el servidor.&lt;br /&gt;
&lt;br /&gt;
-'''overlay:''' ''Overlay'' que se despliega al seleccionar la acción (si esta requiere parámetro), esta función lleva como parámetro &amp;quot;''editOverlay''&amp;quot; y &amp;quot;''id''&amp;quot; (estos que se utilizan cuando se requiere cambiar dicho valor en una acción que ya fue seleccionada y se encuentra en el panel inferior), como por ejemplo pueden ser segundos en el caso de la acción &amp;quot;Avanzar&amp;quot;, o colores en el caso de &amp;quot;Avanzar hasta obstáculo&amp;quot;. Este parámetro puede ser que no sea necesario, como es en el caso de la acción &amp;quot;Avanzar hasta obstáculo&amp;quot;, en este ultimo caso el valor de este campo es ''null''.&lt;br /&gt;
&lt;br /&gt;
Ejemplo de la acción &amp;quot;Avanzar&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Screenshot from 2021-06-27 04-18-42.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ejemplo de la acción &amp;quot;Avanzar hasta obstáculo&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Screenshot_from_2021-06-27_00-28-32.png]]&lt;br /&gt;
&lt;br /&gt;
== Manual de uso de la aplicación ==&lt;br /&gt;
&lt;br /&gt;
Aunque la aplicación resulta intuitiva y fácil de usar se describe a continuación una serie de pasos para utilizarla correctamente.&lt;br /&gt;
&lt;br /&gt;
Para comenzar a utilizar la aplicación es necesario configurar la conexión de la aplicación con el servidor (recordar que ambos se deben encontrar ejecutándose en la misma red local), el servidor ejecutando en una computadora que esté conectada correctamente al butiá (con los sensores descritos anteriormente) y la aplicación ejecutándose en el celular.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Conectando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego que la conexión haya resultado exitosa, nos encontramos en la pantalla principal. En el panel superior, como se muestra a continuación, se encuentran las aplicaciones disponibles que podemos ejecutar en el robot butiá.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Acciones.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para agregar una serie de acciones al robot, simplemente presionamos la que queramos, a continuación esta aparecerá en el panel inferior, a medida de que vayamos seleccionando acciones, estas se irán encadenando una tras otras, estas estarán prontas para ejecutarse secuencialmente, desde la parte inferior, a la parte superior, en el momento que presionemos el botón &amp;quot;Empezar&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Agregando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Como la aplicación está pensada para planificar algoritmos para resolver desafíos o ''puzzles'', es probable que nos equivoquemos y seleccionemos una acción o insertemos un parámetro incorrectamente, ¡pero no te preocupes!. Para editar el parámetro que le hayamos ingresado a una acción, simplemente mantenemos pulsado la que deseamos corregir e ingresamos el nuevo valor.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Editando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
También es posible eliminar una acción, para hacer esto, nuevamente mantenemos pulsada la acción que queremos eliminar, pero esta vez, seleccionamos la acción eliminar. A continuación la acción seleccionada desaparecerá del panel inferior. También es posible que deseemos eliminar todas las acciones que habíamos ingresado, en este caso seleccionamos el botón &amp;quot;Eliminar acciones&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Eliminando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es posible que queremos que el robot se desplace a ciertas velocidades, teniendo en cuenta que al modificar la velocidad, el robot tendrá un comportamiento totalmente diferente, debido a que gran parte de las acciones se ejecutan por un tiempo asignado, a mayor velocidad, más desplazamiento.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Velocidad.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En caso de que exista un error en la conexión, podemos intentar volver a conectar la aplicación al servidor, para esto seleccionamos la opción configuración.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:A configuracion.gif]]&lt;br /&gt;
&lt;br /&gt;
== Mejoras a futuro ==&lt;br /&gt;
&lt;br /&gt;
* Implementar una forma para que las función ''' Accion1 ''' pueda recibir parámetros, para así ampliar la gama de problemas que se puedan solucionar a través de esta aplicación.&lt;br /&gt;
&lt;br /&gt;
* Implementación de código que permita añadir a través del código, una mayor cantidad de funciones genéricas a la aplicación.&lt;br /&gt;
&lt;br /&gt;
* Desarrollar una forma de comunicación bilateral entre la ''App Mobile'' y Python para mejorar el ''debug'' en tiempo de ejecución.&lt;br /&gt;
&lt;br /&gt;
== Archivos de uso ==&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Server Code.zip]]&lt;br /&gt;
&lt;br /&gt;
[[Archivo:App code.zip]]&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Apk app.zip ]]&lt;/div&gt;</summary>
		<author><name>German.moreira</name></author>	</entry>

	<entry>
		<id>http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Archivo:Server_Code.zip&amp;diff=11697</id>
		<title>Archivo:Server Code.zip</title>
		<link rel="alternate" type="text/html" href="http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Archivo:Server_Code.zip&amp;diff=11697"/>
				<updated>2021-06-28T01:30:20Z</updated>
		
		<summary type="html">&lt;p&gt;German.moreira: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>German.moreira</name></author>	</entry>

	<entry>
		<id>http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Archivo:App_code.zip&amp;diff=11696</id>
		<title>Archivo:App code.zip</title>
		<link rel="alternate" type="text/html" href="http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Archivo:App_code.zip&amp;diff=11696"/>
				<updated>2021-06-28T01:30:00Z</updated>
		
		<summary type="html">&lt;p&gt;German.moreira: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>German.moreira</name></author>	</entry>

	<entry>
		<id>http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Archivo:Apk_app.zip&amp;diff=11695</id>
		<title>Archivo:Apk app.zip</title>
		<link rel="alternate" type="text/html" href="http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Archivo:Apk_app.zip&amp;diff=11695"/>
				<updated>2021-06-28T01:29:32Z</updated>
		
		<summary type="html">&lt;p&gt;German.moreira: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>German.moreira</name></author>	</entry>

	<entry>
		<id>http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Programando_el_Butia_desde_el_celular&amp;diff=11693</id>
		<title>Programando el Butia desde el celular</title>
		<link rel="alternate" type="text/html" href="http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Programando_el_Butia_desde_el_celular&amp;diff=11693"/>
				<updated>2021-06-28T01:21:07Z</updated>
		
		<summary type="html">&lt;p&gt;German.moreira: /* Objetivo y motivación */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Introducción ==&lt;br /&gt;
&lt;br /&gt;
La idea del proyecto en un principio era usar el celular como medio para controlar el robot Butiá para que resulte más atractivo para los estudiantes que no les guste la programación.&lt;br /&gt;
&lt;br /&gt;
Luego, la idea se modifico un poco debido a que descubrimos que con esta implementación, podíamos hacer mas sencilla la resolución de algunos ejercicios básicos mediante algoritmos mas simplificados, tomamos el trabajo que teníamos hecho hasta el momento y lo adaptamos a un menú con distintas acciones simples como avanzar un determinado tiempo, avanzar hasta chocar contra un objeto o rotar a la izquierda o derecha un determinado tiempo.&lt;br /&gt;
&lt;br /&gt;
Estas funciones básicas y bastante sencillas de entender más una interfaz amigable y fácil de usar, se implementaron para que el rango de edad de uso de esta aplicación vaya de 3 años en adelante.&lt;br /&gt;
&lt;br /&gt;
Como resultado obtuvimos una aplicación que se puede usar para que niños de:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- 4 / 5 / 6 años resuelvan ejercicios sencillos como puede ser llegar de un punto a otro, buscar el camino a un objeto o resolver un laberinto sencillo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- 7 / 8 / 9 años puedan resolver ejercicios un poco más complejos como puede ser resolver un laberinto del más sencillo al mas complejo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- 10 años en adelante tengan la capacidad de adaptar una parte personal de código al programa y puedan resolver cualquier ejercicio que se pueda plantear con el robot Butiá.&lt;br /&gt;
&lt;br /&gt;
== Objetivo y motivación==&lt;br /&gt;
&lt;br /&gt;
Los objetivos del proyecto eran, como dice el nombre, poder conectar remotamente el robot Butiá a un celular y buscar una abstracción de la mayor cantidad de problemas que puedan ser resueltos con el robot Butiá.&lt;br /&gt;
&lt;br /&gt;
Esto, para poder crear un método de uso del robot Butiá más dinámico y con funciones que permiten realizar, mediante algoritmos mas sencillos, la solución de la mayor cantidad de puzles particulares, abstrayéndose de la programación directa, lo que puede ser tedioso o abrumador para personas que tienen su primer acercamiento a la programación.&lt;br /&gt;
&lt;br /&gt;
Al hacer esto, el nivel de uso en aulas del robot Butiá, puede simplificarse hasta clases desde 3 años de jardinera en adelante, debido a que la aplicación simplifica la parte de codificación y los algoritmos de solución de ejercicios se convierten simplemente en una serie de pasos básicos a ejecutar linealmente.&lt;br /&gt;
&lt;br /&gt;
Lo que se busca con este proyecto, es despertar la curiosidad e interés en niños y adolescentes en el área de la programación de una forma didáctica, en donde estos pueden experimentar directamente con el robot y potenciar la creatividad para resolver problemas. &lt;br /&gt;
&lt;br /&gt;
La aplicación esta inspirada en el lenguaje &amp;quot;Sratch&amp;quot;, el cual es un lenguaje ideal para los primeros acercamientos a la programación. &lt;br /&gt;
&lt;br /&gt;
Este ''software'' permite ademas, introducir conceptos como, instrucciones, secuencialidad de código, algoritmos, secuencias de control, estructuras de repetición, etc. Como ejercicio, se puede plantear por ejemplo, hacer el pasaje a Python de algoritmos diseñados en la aplicación.&lt;br /&gt;
&lt;br /&gt;
== Armado del Butiá ==&lt;br /&gt;
&lt;br /&gt;
* Paso 1: Armar el Butiá a partir de esta [https://www.fing.edu.uy/inco/proyectos/butia/files/docs_butia2/armando_paso_a_paso_motores_CC_rev1.pdf guía oficial]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Paso 2: Instalar el sensor de grises&lt;br /&gt;
&lt;br /&gt;
1:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP1.jpeg]] &lt;br /&gt;
&lt;br /&gt;
2:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP2.jpeg]]&lt;br /&gt;
&lt;br /&gt;
3:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP3.jpeg]]&lt;br /&gt;
&lt;br /&gt;
4:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP4.jpeg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Paso 3: Instalar el sensor de distancia&lt;br /&gt;
&lt;br /&gt;
1:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP1.png]]&lt;br /&gt;
&lt;br /&gt;
2:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP2.png]]&lt;br /&gt;
&lt;br /&gt;
3:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP3.png]]&lt;br /&gt;
&lt;br /&gt;
4:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP4.png]]&lt;br /&gt;
&lt;br /&gt;
== Protocolo de comunicación ==&lt;br /&gt;
El protocolo de comunicaron diseñado para la comunicación entre Servidor y Aplicación ''Mobile'' es el siguiente:&lt;br /&gt;
&lt;br /&gt;
'''''Accion0-S0\nAccion1-S1\nAccion2-S2\nAccion3\nAccion4-S4\nVelocidad'''''&lt;br /&gt;
&lt;br /&gt;
Donde, este ''string'' representa la serie encadenada de acciones que el servidor recibe para ejecutar en el robot desde la aplicación.&lt;br /&gt;
Cada acción esta separada de la que se encuentra a continuación por el símbolo &amp;quot;''\n''&amp;quot;.&lt;br /&gt;
Podemos diferenciar dos tipos de acciones, las que requieren parámetro y las que no, estas se comunican de la siguiente forma:&lt;br /&gt;
'''Acción con parámetro''': NombreAccion-Parametro&lt;br /&gt;
&lt;br /&gt;
'''Acción sin parámetro''': NombreAccion&lt;br /&gt;
&lt;br /&gt;
== Implementación código Python ==&lt;br /&gt;
&lt;br /&gt;
Antes de empezar a programar o usar el código, es necesario instalar las librerías a usar, esto se puede hacer escribiendo &lt;br /&gt;
&lt;br /&gt;
'''''pip install [nombre de la librería]''''' en el interprete de comandos del sistema.&lt;br /&gt;
&lt;br /&gt;
Entonces instalamos la librería a utilizar, en este caso:&lt;br /&gt;
&lt;br /&gt;
'''''pip install simple_websocket_server'''''&lt;br /&gt;
&lt;br /&gt;
Una vez instalada la librería, hay que empezar a escribir el código.&lt;br /&gt;
&lt;br /&gt;
El encabezado del código es el siguiente&lt;br /&gt;
El uso de cada librería se explica con detalle mas adelante&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Encabezado.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A partir de la librería '''sys''' se define el camino del sistema para utilizar los plugin Butiá.&lt;br /&gt;
En nuestro caso, la ruta es ''' '/home/trerb/TurtleBots.activity/plugins/butia' ''', eso se tiene que modificar dependiendo de donde se encuentren el directorio ''' TurtleBots.activity/ ''' en su sistema de archivos&lt;br /&gt;
&lt;br /&gt;
[[Archivo:UsoPluginButia.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego se encuentra la función ''' clearConsole ''',&lt;br /&gt;
Esta función sirve únicamente para limpiar el interprete de Python usando la librería ''' os ''' y tener una ejecución mas limpia&lt;br /&gt;
&lt;br /&gt;
[[Archivo:clearConsole().png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
El siguiente código utiliza la librería ''' socket ''' para conectarse a la web y preguntar la ip del ordenador que ejecuta el archivo y la muestra en pantalla, esto se usa para facilitar la conexión con la App Mobile&lt;br /&gt;
&lt;br /&gt;
[[Archivo:conexionSocket.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Las siguientes líneas de código preguntan al usuario que puerto va a utilizar para la conexión, este código verifica que se ingrese un dato numérico, dentro del rango de los puertos, y que el puerto este disponible.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:tryPuerto.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego se declaran las variables: ''' Speed, Puerto_Gris y Puerto_Distancia ''', se verifica que los sensores de distancia y de grises estén conectados y asigna el puerto en el que estén conectados a las variables ''' Puerto_Distancia ''' y ''' Puerto_Gris ''' respectivamente. La variable ''' Speed ''' es una variable global que se lee al inicio de cada cadena de acciones y la utiliza para todos los movimientos del Butiá de esa cadena.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:declaracionVariables.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Seguimos con la declaración de las funciones básicas del Butiá, en este caso son ''' Avanzar, Rotar, AvanzarHastaVerColor y AvanzarHastaObstaculo ''' &lt;br /&gt;
&lt;br /&gt;
-La función ''' Avanzar ''' recibe un parámetro de tiempo y el Butiá avanza ese determinado tiempo.&lt;br /&gt;
&lt;br /&gt;
-La función ''' Retroceder ''' recibe un parámetro de tiempo y el Butiá retrocede ese determinado tiempo.&lt;br /&gt;
&lt;br /&gt;
-La función ''' Rotar ''' recibe dos parámetros, una dirección que puede ser Izquierda o Derecha y un tiempo que indica la duración de la rotación del Butiá.&lt;br /&gt;
&lt;br /&gt;
-La función ''' AvanzarHastaVerColor ''' recibe un parámetro que varia entre Blanco o Negro, el robot va a avanzar hasta detectar el color seleccionado.&lt;br /&gt;
Esta función solo se puede usar si el sensor de grises esta conectado.&lt;br /&gt;
&lt;br /&gt;
-Por ultimo, la función ''' AvanzarHastaObstaculo ''' no recibe parámetros, en este caso el Butiá va a avanzar hasta estar a unos pocos centímetros de un obstáculo.&lt;br /&gt;
Esta función solo se puede usar si el sensor de distancia esta conectado.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:FuncionesBasicas.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego se encuentra una función ''' Accion1 ''' esta función la puede definir el usuario a gusto, se puede implementar desde una función básica hasta un seguidor de líneas avanzado. La única condición que se necesita para implementar esta ''' Accion1 ''' es que no puede recibir parámetros&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Accion1.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ahora tenemos que definir el menú principal del programa, este se divide en dos funciones&lt;br /&gt;
&lt;br /&gt;
- ''' handle ''': Esta es una función predeterminada de la librería ''' simple_web_socket ''' y se llama cada vez que el servidor recibe un dato del cliente. En este caso la función crea una lista de las acciones que le llegan de la App Mobile, y las va ejecutando ordenadamente&lt;br /&gt;
&lt;br /&gt;
- ''' handle_close ''': Al igual que la función anterior, esta también es una función predeterminada de la librería ''' simple_web_socket ''' y se llama cuando el cliente se desconecta del servidor&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Screenshot from 2021-06-27 03-58-56.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Y por ultimo tenemos el dos líneas de codigo, la primera se encarga de abrir el servidor y la segunda lo mantiene abierto infinitamente&lt;br /&gt;
&lt;br /&gt;
[[Archivo:abrirServidor.png]]&lt;br /&gt;
&lt;br /&gt;
== Implementación código React ==&lt;br /&gt;
&lt;br /&gt;
La aplicación ''mobile'' esta implementada con React Native, ademas, se utiliza el ''framework'' [https://docs.expo.io/ Expo]. Este ''framework'' nos brinda un conjunto de herramientas que facilita el desarrollo de aplicaciones ''mobile''. &lt;br /&gt;
En caso de querer agregar, o modificar cualidades, es necesario proceder de la siguiente forma:&lt;br /&gt;
&lt;br /&gt;
Descargar el archivo comprimido adjunto.&lt;br /&gt;
&lt;br /&gt;
Extraerlo, posicionarse en el directorio raiz de la carpeta descomprimida, y ejecutar desde la terminal lo siguiente (tener en cuenta que es necesario tener en la maquina, el gestor de paquetes [https://docs.npmjs.com/ npm]).&lt;br /&gt;
&lt;br /&gt;
''''npm install'''' &lt;br /&gt;
&lt;br /&gt;
Esto descarga las dependencias que utiliza la aplicación, luego de esto podemos empezar a desarrollar.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para visualizar los cambios en tiempo real mientras desarrollamos, es necesario instalar la aplicación Expo Go para [https://play.google.com/store/apps/details?id=host.exp.exponent&amp;amp;hl=es_UY&amp;amp;gl=US Android] o para [https://apps.apple.com/es/app/expo-go/id982107779 iOS] según sea el caso.&lt;br /&gt;
&lt;br /&gt;
Para a visualizar la app en desarrollo desde Expo Go, procedemos de la siguiente forma:&lt;br /&gt;
Desde el directorio raíz de la aplicación ejecutamos desde la terminal lo siguiente:&lt;br /&gt;
&lt;br /&gt;
''''npm start''''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego, desde la aplicación Expo Go, con el celular conectado en la misma red local accedemos a la aplicación seleccionando lo siguiente:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Expo.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hecho esto, podemos cambiar el código de la aplicación y ver reflejados los cambios de forma casi instantánea.&lt;br /&gt;
&lt;br /&gt;
La aplicación esta compuesta por dos pantallas, la pantalla de configuración (''ConfigScreen.js''), donde se ingresa la dirección ip y puerto del servidor, y la pantalla principal (''MainScreen.js''), donde se lleva a cabo la programación del robot mediante acciones.&lt;br /&gt;
&lt;br /&gt;
Esta ultima pantalla esta compuesta por los componentes ''TopList.js'' y ''BottomList.js''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Untitled presentation.png]]&lt;br /&gt;
&lt;br /&gt;
Para agregar una nueva accion al sistema, es necesario programarla en el servidor con un determinado nombre, supondremos &amp;quot;AccionN&amp;quot;, esto resulta fácil si se toma como ejemplo las acciones ya implementadas.&lt;br /&gt;
&lt;br /&gt;
En la aplicación, esta nueva acción se agrega en el ''array'' &amp;quot;''actionsData''&amp;quot;, dicho ''array'' se encuentra en la pantalla principal, es decir en el archivo &amp;quot;''MainScreen.js''&amp;quot;, cada acción cuenta con los siguientes datos:&lt;br /&gt;
&lt;br /&gt;
-'''idAccion:''' Identificador de la acción en dicho arreglo (actionsData).&lt;br /&gt;
&lt;br /&gt;
-'''title:''': Titulo de la acción que se muestra en el panel superior.&lt;br /&gt;
&lt;br /&gt;
-'''actionId:''' Nombre identificador de la acción en el servidor.&lt;br /&gt;
&lt;br /&gt;
-'''overlay:''' ''Overlay'' que se despliega al seleccionar la acción (si esta requiere parámetro), esta función lleva como parámetro &amp;quot;''editOverlay''&amp;quot; y &amp;quot;''id''&amp;quot; (estos que se utilizan cuando se requiere cambiar dicho valor en una acción que ya fue seleccionada y se encuentra en el panel inferior), como por ejemplo pueden ser segundos en el caso de la acción &amp;quot;Avanzar&amp;quot;, o colores en el caso de &amp;quot;Avanzar hasta obstáculo&amp;quot;. Este parámetro puede ser que no sea necesario, como es en el caso de la acción &amp;quot;Avanzar hasta obstáculo&amp;quot;, en este ultimo caso el valor de este campo es ''null''.&lt;br /&gt;
&lt;br /&gt;
Ejemplo de la acción &amp;quot;Avanzar&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Screenshot from 2021-06-27 04-18-42.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ejemplo de la acción &amp;quot;Avanzar hasta obstáculo&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Screenshot_from_2021-06-27_00-28-32.png]]&lt;br /&gt;
&lt;br /&gt;
== Manual de uso de la aplicación ==&lt;br /&gt;
&lt;br /&gt;
Aunque la aplicación resulta intuitiva y fácil de usar se describe a continuación una serie de pasos para utilizarla correctamente.&lt;br /&gt;
&lt;br /&gt;
Para comenzar a utilizar la aplicación es necesario configurar la conexión de la aplicación con el servidor (recordar que ambos se deben encontrar ejecutándose en la misma red local), el servidor ejecutando en una computadora que esté conectada correctamente al butiá (con los sensores descritos anteriormente) y la aplicación ejecutándose en el celular.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Conectando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego que la conexión haya resultado exitosa, nos encontramos en la pantalla principal. En el panel superior, como se muestra a continuación, se encuentran las aplicaciones disponibles que podemos ejecutar en el robot butiá.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Acciones.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para agregar una serie de acciones al robot, simplemente presionamos la que queramos, a continuación esta aparecerá en el panel inferior, a medida de que vayamos seleccionando acciones, estas se irán encadenando una tras otras, estas estarán prontas para ejecutarse secuencialmente, desde la parte inferior, a la parte superior, en el momento que presionemos el botón &amp;quot;Empezar&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Agregando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Como la aplicación está pensada para planificar algoritmos para resolver desafíos o ''puzzles'', es probable que nos equivoquemos y seleccionemos una acción o insertemos un parámetro incorrectamente, ¡pero no te preocupes!. Para editar el parámetro que le hayamos ingresado a una acción, simplemente mantenemos pulsado la que deseamos corregir e ingresamos el nuevo valor.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Editando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
También es posible eliminar una acción, para hacer esto, nuevamente mantenemos pulsada la acción que queremos eliminar, pero esta vez, seleccionamos la acción eliminar. A continuación la acción seleccionada desaparecerá del panel inferior. También es posible que deseemos eliminar todas las acciones que habíamos ingresado, en este caso seleccionamos el botón &amp;quot;Eliminar acciones&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Eliminando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es posible que queremos que el robot se desplace a ciertas velocidades, teniendo en cuenta que al modificar la velocidad, el robot tendrá un comportamiento totalmente diferente, debido a que gran parte de las acciones se ejecutan por un tiempo asignado, a mayor velocidad, más desplazamiento.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Velocidad.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En caso de que exista un error en la conexión, podemos intentar volver a conectar la aplicación al servidor, para esto seleccionamos la opción configuración.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:A configuracion.gif]]&lt;br /&gt;
&lt;br /&gt;
== Mejoras a futuro ==&lt;br /&gt;
&lt;br /&gt;
* Implementar una forma para que las función ''' Accion1 ''' pueda recibir parámetros, para así ampliar la gama de problemas que se puedan solucionar a través de esta aplicación.&lt;br /&gt;
&lt;br /&gt;
* Implementación de código que permita añadir a través del código, una mayor cantidad de funciones genéricas a la aplicación.&lt;br /&gt;
&lt;br /&gt;
* Desarrollar una forma de comunicación bilateral entre la ''App Mobile'' y Python para mejorar el ''debug'' en tiempo de ejecución.&lt;br /&gt;
&lt;br /&gt;
== Archivos de uso ==&lt;/div&gt;</summary>
		<author><name>German.moreira</name></author>	</entry>

	<entry>
		<id>http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Programando_el_Butia_desde_el_celular&amp;diff=11686</id>
		<title>Programando el Butia desde el celular</title>
		<link rel="alternate" type="text/html" href="http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Programando_el_Butia_desde_el_celular&amp;diff=11686"/>
				<updated>2021-06-28T01:00:53Z</updated>
		
		<summary type="html">&lt;p&gt;German.moreira: /* Video de muestra */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Introducción ==&lt;br /&gt;
&lt;br /&gt;
La idea del proyecto en un principio era usar el celular como medio para controlar el robot Butiá para que resulte más atractivo para los estudiantes que no les guste la programación.&lt;br /&gt;
&lt;br /&gt;
Luego, la idea se modifico un poco debido a que descubrimos que con esta implementación, podíamos hacer mas sencilla la resolución de algunos ejercicios básicos mediante algoritmos mas simplificados, tomamos el trabajo que teníamos hecho hasta el momento y lo adaptamos a un menú con distintas acciones simples como avanzar un determinado tiempo, avanzar hasta chocar contra un objeto o rotar a la izquierda o derecha un determinado tiempo.&lt;br /&gt;
&lt;br /&gt;
Estas funciones básicas y bastante sencillas de entender más una interfaz amigable y fácil de usar, se implementaron para que el rango de edad de uso de esta aplicación vaya de 3 años en adelante.&lt;br /&gt;
&lt;br /&gt;
Como resultado obtuvimos una aplicación que se puede usar para que niños de:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- 4 / 5 / 6 años resuelvan ejercicios sencillos como puede ser llegar de un punto a otro, buscar el camino a un objeto o resolver un laberinto sencillo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- 7 / 8 / 9 años puedan resolver ejercicios un poco más complejos como puede ser resolver un laberinto del más sencillo al mas complejo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- 10 años en adelante tengan la capacidad de adaptar una parte personal de código al programa y puedan resolver cualquier ejercicio que se pueda plantear con el robot Butiá.&lt;br /&gt;
&lt;br /&gt;
== Objetivo y motivación==&lt;br /&gt;
&lt;br /&gt;
Los objetivos del proyecto eran, como dice el nombre, poder conectar remotamente el robot Butiá a un celular y buscar una abstracción de la mayor cantidad de problemas que puedan ser resueltos con el robot Butiá.&lt;br /&gt;
&lt;br /&gt;
Esto, para poder crear un método de uso del robot Butiá más dinámico y con funciones que permiten realizar, mediante algoritmos mas sencillos, la solución de la mayor cantidad de puzles particulares, abstrayéndose de la programación directa, lo que puede ser tedioso o abrumador para personas que tienen su primer acercamiento a la programación.&lt;br /&gt;
&lt;br /&gt;
Al hacer esto, el nivel de uso en aulas del robot Butiá, puede simplificarse hasta clases desde 3 años de jardinera en adelante, debido a que la aplicación simplifica la parte de codificación y los algoritmos de solución de ejercicios se convierten simplemente en una serie de pasos básicos a ejecutar linealmente.&lt;br /&gt;
&lt;br /&gt;
Lo que se busca con este proyecto, es despertar la curiosidad e interés en niños y adolescentes en el área de la programación, de una forma didáctica en la que estos pueden experimentar directamente con el robot y potenciar la creatividad para resolver problemas. &lt;br /&gt;
&lt;br /&gt;
La aplicación esta inspirada en el lenguaje &amp;quot;Sratch&amp;quot;, el cual es un lenguaje ideal como primera aproximación a la programación. &lt;br /&gt;
&lt;br /&gt;
Este ''software'' permite ademas, introducir conceptos como, instrucciones, secuencialidad de código, algoritmos, secuencias de control, estructuras de repetición, etc. Como ejercicio, se puede plantear por ejemplo, hacer el pasaje de algoritmos diseñados en la aplicación en el Python.&lt;br /&gt;
&lt;br /&gt;
== Armado del Butiá ==&lt;br /&gt;
&lt;br /&gt;
* Paso 1: Armar el Butiá a partir de esta [https://www.fing.edu.uy/inco/proyectos/butia/files/docs_butia2/armando_paso_a_paso_motores_CC_rev1.pdf guía oficial]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Paso 2: Instalar el sensor de grises&lt;br /&gt;
&lt;br /&gt;
1:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP1.jpeg]] &lt;br /&gt;
&lt;br /&gt;
2:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP2.jpeg]]&lt;br /&gt;
&lt;br /&gt;
3:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP3.jpeg]]&lt;br /&gt;
&lt;br /&gt;
4:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP4.jpeg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Paso 3: Instalar el sensor de distancia&lt;br /&gt;
&lt;br /&gt;
1:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP1.png]]&lt;br /&gt;
&lt;br /&gt;
2:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP2.png]]&lt;br /&gt;
&lt;br /&gt;
3:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP3.png]]&lt;br /&gt;
&lt;br /&gt;
4:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP4.png]]&lt;br /&gt;
&lt;br /&gt;
== Protocolo de comunicación ==&lt;br /&gt;
El protocolo de comunicaron diseñado para la comunicación entre Servidor y Aplicación ''Mobile'' es el siguiente:&lt;br /&gt;
&lt;br /&gt;
'''''Accion0-S0\nAccion1-S1\nAccion2-S2\nAccion3\nAccion4-S4\nVelocidad'''''&lt;br /&gt;
&lt;br /&gt;
Donde, este ''string'' representa la serie encadenada de acciones que el servidor recibe para ejecutar en el robot desde la aplicación.&lt;br /&gt;
Cada acción esta separada de la que se encuentra a continuación por el símbolo &amp;quot;''\n''&amp;quot;.&lt;br /&gt;
Podemos diferenciar dos tipos de acciones, las que requieren parámetro y las que no, estas se comunican de la siguiente forma:&lt;br /&gt;
'''Acción con parámetro''': NombreAccion-Parametro&lt;br /&gt;
&lt;br /&gt;
'''Acción sin parámetro''': NombreAccion&lt;br /&gt;
&lt;br /&gt;
== Implementación código Python ==&lt;br /&gt;
&lt;br /&gt;
Antes de empezar a programar o usar el código, es necesario instalar las librerías a usar, esto se puede hacer escribiendo &lt;br /&gt;
&lt;br /&gt;
'''''pip install [nombre de la librería]''''' en el interprete de comandos del sistema.&lt;br /&gt;
&lt;br /&gt;
Entonces instalamos la librería a utilizar, en este caso:&lt;br /&gt;
&lt;br /&gt;
'''''pip install simple_websocket_server'''''&lt;br /&gt;
&lt;br /&gt;
Una vez instalada la librería, hay que empezar a escribir el código.&lt;br /&gt;
&lt;br /&gt;
El encabezado del código es el siguiente&lt;br /&gt;
El uso de cada librería se explica con detalle mas adelante&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Encabezado.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A partir de la librería '''sys''' se define el camino del sistema para utilizar los plugin Butiá.&lt;br /&gt;
En nuestro caso, la ruta es ''' '/home/trerb/TurtleBots.activity/plugins/butia' ''', eso se tiene que modificar dependiendo de donde se encuentren el directorio ''' TurtleBots.activity/ ''' en su sistema de archivos&lt;br /&gt;
&lt;br /&gt;
[[Archivo:UsoPluginButia.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego se encuentra la función ''' clearConsole ''',&lt;br /&gt;
Esta función sirve únicamente para limpiar el interprete de Python usando la librería ''' os ''' y tener una ejecución mas limpia&lt;br /&gt;
&lt;br /&gt;
[[Archivo:clearConsole().png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
El siguiente código utiliza la librería ''' socket ''' para conectarse a la web y preguntar la ip del ordenador que ejecuta el archivo y la muestra en pantalla, esto se usa para facilitar la conexión con la App Mobile&lt;br /&gt;
&lt;br /&gt;
[[Archivo:conexionSocket.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Las siguientes líneas de código preguntan al usuario que puerto va a utilizar para la conexión, este código verifica que se ingrese un dato numérico, dentro del rango de los puertos, y que el puerto este disponible.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:tryPuerto.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego se declaran las variables: ''' Speed, Puerto_Gris y Puerto_Distancia ''', se verifica que los sensores de distancia y de grises estén conectados y asigna el puerto en el que estén conectados a las variables ''' Puerto_Distancia ''' y ''' Puerto_Gris ''' respectivamente. La variable ''' Speed ''' es una variable global que se lee al inicio de cada cadena de acciones y la utiliza para todos los movimientos del Butiá de esa cadena.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:declaracionVariables.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Seguimos con la declaración de las funciones básicas del Butiá, en este caso son ''' Avanzar, Rotar, AvanzarHastaVerColor y AvanzarHastaObstaculo ''' &lt;br /&gt;
&lt;br /&gt;
-La función ''' Avanzar ''' recibe un parámetro de tiempo y el Butiá avanza ese determinado tiempo.&lt;br /&gt;
&lt;br /&gt;
-La función ''' Retroceder ''' recibe un parámetro de tiempo y el Butiá retrocede ese determinado tiempo.&lt;br /&gt;
&lt;br /&gt;
-La función ''' Rotar ''' recibe dos parámetros, una dirección que puede ser Izquierda o Derecha y un tiempo que indica la duración de la rotación del Butiá.&lt;br /&gt;
&lt;br /&gt;
-La función ''' AvanzarHastaVerColor ''' recibe un parámetro que varia entre Blanco o Negro, el robot va a avanzar hasta detectar el color seleccionado.&lt;br /&gt;
Esta función solo se puede usar si el sensor de grises esta conectado.&lt;br /&gt;
&lt;br /&gt;
-Por ultimo, la función ''' AvanzarHastaObstaculo ''' no recibe parámetros, en este caso el Butiá va a avanzar hasta estar a unos pocos centímetros de un obstáculo.&lt;br /&gt;
Esta función solo se puede usar si el sensor de distancia esta conectado.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:FuncionesBasicas.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego se encuentra una función ''' Accion1 ''' esta función la puede definir el usuario a gusto, se puede implementar desde una función básica hasta un seguidor de líneas avanzado. La única condición que se necesita para implementar esta ''' Accion1 ''' es que no puede recibir parámetros&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Accion1.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ahora tenemos que definir el menú principal del programa, este se divide en dos funciones&lt;br /&gt;
&lt;br /&gt;
- ''' handle ''': Esta es una función predeterminada de la librería ''' simple_web_socket ''' y se llama cada vez que el servidor recibe un dato del cliente. En este caso la función crea una lista de las acciones que le llegan de la App Mobile, y las va ejecutando ordenadamente&lt;br /&gt;
&lt;br /&gt;
- ''' handle_close ''': Al igual que la función anterior, esta también es una función predeterminada de la librería ''' simple_web_socket ''' y se llama cuando el cliente se desconecta del servidor&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Screenshot from 2021-06-27 03-58-56.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Y por ultimo tenemos el dos líneas de codigo, la primera se encarga de abrir el servidor y la segunda lo mantiene abierto infinitamente&lt;br /&gt;
&lt;br /&gt;
[[Archivo:abrirServidor.png]]&lt;br /&gt;
&lt;br /&gt;
== Implementación código React ==&lt;br /&gt;
&lt;br /&gt;
La aplicación ''mobile'' esta implementada con React Native, ademas, se utiliza el ''framework'' [https://docs.expo.io/ Expo]. Este ''framework'' nos brinda un conjunto de herramientas que facilita el desarrollo de aplicaciones ''mobile''. &lt;br /&gt;
En caso de querer agregar, o modificar cualidades, es necesario proceder de la siguiente forma:&lt;br /&gt;
&lt;br /&gt;
Descargar el archivo comprimido adjunto.&lt;br /&gt;
&lt;br /&gt;
Extraerlo, posicionarse en el directorio raiz de la carpeta descomprimida, y ejecutar desde la terminal lo siguiente (tener en cuenta que es necesario tener en la maquina, el gestor de paquetes [https://docs.npmjs.com/ npm]).&lt;br /&gt;
&lt;br /&gt;
''''npm install'''' &lt;br /&gt;
&lt;br /&gt;
Esto descarga las dependencias que utiliza la aplicación, luego de esto podemos empezar a desarrollar.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para visualizar los cambios en tiempo real mientras desarrollamos, es necesario instalar la aplicación Expo Go para [https://play.google.com/store/apps/details?id=host.exp.exponent&amp;amp;hl=es_UY&amp;amp;gl=US Android] o para [https://apps.apple.com/es/app/expo-go/id982107779 iOS] según sea el caso.&lt;br /&gt;
&lt;br /&gt;
Para a visualizar la app en desarrollo desde Expo Go, procedemos de la siguiente forma:&lt;br /&gt;
Desde el directorio raíz de la aplicación ejecutamos desde la terminal lo siguiente:&lt;br /&gt;
&lt;br /&gt;
''''npm start''''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego, desde la aplicación Expo Go, con el celular conectado en la misma red local accedemos a la aplicación seleccionando lo siguiente:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Expo.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hecho esto, podemos cambiar el código de la aplicación y ver reflejados los cambios de forma casi instantánea.&lt;br /&gt;
&lt;br /&gt;
La aplicación esta compuesta por dos pantallas, la pantalla de configuración (''ConfigScreen.js''), donde se ingresa la dirección ip y puerto del servidor, y la pantalla principal (''MainScreen.js''), donde se lleva a cabo la programación del robot mediante acciones.&lt;br /&gt;
&lt;br /&gt;
Esta ultima pantalla esta compuesta por los componentes ''TopList.js'' y ''BottomList.js''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Untitled presentation.png]]&lt;br /&gt;
&lt;br /&gt;
Para agregar una nueva accion al sistema, es necesario programarla en el servidor con un determinado nombre, supondremos &amp;quot;AccionN&amp;quot;, esto resulta fácil si se toma como ejemplo las acciones ya implementadas.&lt;br /&gt;
&lt;br /&gt;
En la aplicación, esta nueva acción se agrega en el ''array'' &amp;quot;''actionsData''&amp;quot;, dicho ''array'' se encuentra en la pantalla principal, es decir en el archivo &amp;quot;''MainScreen.js''&amp;quot;, cada acción cuenta con los siguientes datos:&lt;br /&gt;
&lt;br /&gt;
-'''idAccion:''' Identificador de la acción en dicho arreglo (actionsData).&lt;br /&gt;
&lt;br /&gt;
-'''title:''': Titulo de la acción que se muestra en el panel superior.&lt;br /&gt;
&lt;br /&gt;
-'''actionId:''' Nombre identificador de la acción en el servidor.&lt;br /&gt;
&lt;br /&gt;
-'''overlay:''' ''Overlay'' que se despliega al seleccionar la acción (si esta requiere parámetro), esta función lleva como parámetro &amp;quot;''editOverlay''&amp;quot; y &amp;quot;''id''&amp;quot; (estos que se utilizan cuando se requiere cambiar dicho valor en una acción que ya fue seleccionada y se encuentra en el panel inferior), como por ejemplo pueden ser segundos en el caso de la acción &amp;quot;Avanzar&amp;quot;, o colores en el caso de &amp;quot;Avanzar hasta obstáculo&amp;quot;. Este parámetro puede ser que no sea necesario, como es en el caso de la acción &amp;quot;Avanzar hasta obstáculo&amp;quot;, en este ultimo caso el valor de este campo es ''null''.&lt;br /&gt;
&lt;br /&gt;
Ejemplo de la acción &amp;quot;Avanzar&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Screenshot from 2021-06-27 04-18-42.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ejemplo de la acción &amp;quot;Avanzar hasta obstáculo&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Screenshot_from_2021-06-27_00-28-32.png]]&lt;br /&gt;
&lt;br /&gt;
== Manual de uso de la aplicación ==&lt;br /&gt;
&lt;br /&gt;
Aunque la aplicación resulta intuitiva y fácil de usar se describe a continuación una serie de pasos para utilizarla correctamente.&lt;br /&gt;
&lt;br /&gt;
Para comenzar a utilizar la aplicación es necesario configurar la conexión de la aplicación con el servidor (recordar que ambos se deben encontrar ejecutándose en la misma red local), el servidor ejecutando en una computadora que esté conectada correctamente al butiá (con los sensores descritos anteriormente) y la aplicación ejecutándose en el celular.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Conectando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego que la conexión haya resultado exitosa, nos encontramos en la pantalla principal. En el panel superior, como se muestra a continuación, se encuentran las aplicaciones disponibles que podemos ejecutar en el robot butiá.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Acciones.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para agregar una serie de acciones al robot, simplemente presionamos la que queramos, a continuación esta aparecerá en el panel inferior, a medida de que vayamos seleccionando acciones, estas se irán encadenando una tras otras, estas estarán prontas para ejecutarse secuencialmente, desde la parte inferior, a la parte superior, en el momento que presionemos el botón &amp;quot;Empezar&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Agregando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Como la aplicación está pensada para planificar algoritmos para resolver desafíos o ''puzzles'', es probable que nos equivoquemos y seleccionemos una acción o insertemos un parámetro incorrectamente, ¡pero no te preocupes!. Para editar el parámetro que le hayamos ingresado a una acción, simplemente mantenemos pulsado la que deseamos corregir e ingresamos el nuevo valor.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Editando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
También es posible eliminar una acción, para hacer esto, nuevamente mantenemos pulsada la acción que queremos eliminar, pero esta vez, seleccionamos la acción eliminar. A continuación la acción seleccionada desaparecerá del panel inferior. También es posible que deseemos eliminar todas las acciones que habíamos ingresado, en este caso seleccionamos el botón &amp;quot;Eliminar acciones&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Eliminando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es posible que queremos que el robot se desplace a ciertas velocidades, teniendo en cuenta que al modificar la velocidad, el robot tendrá un comportamiento totalmente diferente, debido a que gran parte de las acciones se ejecutan por un tiempo asignado, a mayor velocidad, más desplazamiento.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Velocidad.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En caso de que exista un error en la conexión, podemos intentar volver a conectar la aplicación al servidor, para esto seleccionamos la opción configuración.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:A configuracion.gif]]&lt;br /&gt;
&lt;br /&gt;
== Mejoras a futuro ==&lt;br /&gt;
&lt;br /&gt;
* Implementar una forma para que las función ''' Accion1 ''' pueda recibir parámetros, para así ampliar la gama de problemas que se puedan solucionar a través de esta aplicación.&lt;br /&gt;
&lt;br /&gt;
* Implementación de código que permita añadir a través del código, una mayor cantidad de funciones genéricas a la aplicación.&lt;br /&gt;
&lt;br /&gt;
* Desarrollar una forma de comunicación bilateral entre la ''App Mobile'' y Python para mejorar el ''debug'' en tiempo de ejecución.&lt;br /&gt;
&lt;br /&gt;
== Archivos de uso ==&lt;/div&gt;</summary>
		<author><name>German.moreira</name></author>	</entry>

	<entry>
		<id>http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Programando_el_Butia_desde_el_celular&amp;diff=11636</id>
		<title>Programando el Butia desde el celular</title>
		<link rel="alternate" type="text/html" href="http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Programando_el_Butia_desde_el_celular&amp;diff=11636"/>
				<updated>2021-06-27T08:16:59Z</updated>
		
		<summary type="html">&lt;p&gt;German.moreira: /* Implementación codigo React */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Introducción ==&lt;br /&gt;
&lt;br /&gt;
La idea del proyecto en un principio era usar el celular como medio para controlar el robot Butiá para que resulte más atractivo para los estudiantes que no les guste la programación.&lt;br /&gt;
&lt;br /&gt;
Luego, la idea se modifico un poco debido a que descubrimos que con esta implementación, podíamos hacer mas sencilla la resolución de algunos ejercicios básicos mediante algoritmos mas simplificados, tomamos el trabajo que teníamos hecho hasta el momento y lo adaptamos a un menú con distintas acciones simples como avanzar un determinado tiempo, avanzar hasta chocar contra un objeto o rotar a la izquierda o derecha un determinado tiempo.&lt;br /&gt;
&lt;br /&gt;
Estas funciones básicas y bastante sencillas de entender más una interfaz amigable y fácil de usar, se implementaron para que el rango de edad de uso de esta aplicación vaya de 3 años en adelante.&lt;br /&gt;
&lt;br /&gt;
Como resultado obtuvimos una aplicación que se puede usar para que niños de:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- 4 / 5 / 6 años resuelvan ejercicios sencillos como puede ser llegar de un punto a otro, buscar el camino a un objeto o resolver un laberinto sencillo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- 7 / 8 / 9 años puedan resolver ejercicios un poco más complejos como puede ser resolver un laberinto del más sencillo al mas complejo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- 10 años en adelante tengan la capacidad de adaptar una parte personal de código al programa y puedan resolver cualquier ejercicio que se pueda plantear con el robot Butiá.&lt;br /&gt;
&lt;br /&gt;
== Objetivo y motivación==&lt;br /&gt;
&lt;br /&gt;
Los objetivos del proyecto eran, como dice el nombre, poder conectar remotamente el robot Butiá a un celular y buscar una abstracción de la mayor cantidad de problemas que puedan ser resueltos con el robot Butiá.&lt;br /&gt;
&lt;br /&gt;
Esto, para poder crear un método de uso del robot Butiá más dinámico y con funciones que permiten realizar, mediante algoritmos mas sencillos, la solución de la mayor cantidad de puzles particulares, abstrayéndose de la programación directa, lo que puede ser tedioso o abrumador para personas que tienen su primer acercamiento a la programación.&lt;br /&gt;
&lt;br /&gt;
Al hacer esto, el nivel de uso en aulas del robot Butiá, puede simplificarse hasta clases desde 3 años de jardinera en adelante, debido a que la aplicación simplifica la parte de codificación y los algoritmos de solución de ejercicios se convierten simplemente en una serie de pasos básicos a ejecutar linealmente.&lt;br /&gt;
&lt;br /&gt;
Lo que se busca con este proyecto, es despertar la curiosidad e interés en niños y adolescentes en el área de la programación, de una forma didáctica en la que estos pueden experimentar directamente con el robot y potenciar la creatividad para resolver problemas. &lt;br /&gt;
&lt;br /&gt;
La aplicación esta inspirada en el lenguaje &amp;quot;Sratch&amp;quot;, el cual es un lenguaje ideal como primera aproximación a la programación. &lt;br /&gt;
&lt;br /&gt;
Este ''software'' permite ademas, introducir conceptos como, instrucciones, secuencialidad de código, algoritmos, secuencias de control, estructuras de repetición, etc. Como ejercicio, se puede plantear por ejemplo, hacer el pasaje de algoritmos diseñados en la aplicación en el Python.&lt;br /&gt;
&lt;br /&gt;
== Armado del Butiá ==&lt;br /&gt;
&lt;br /&gt;
* Paso 1: Armar el Butiá a partir de esta [https://www.fing.edu.uy/inco/proyectos/butia/files/docs_butia2/armando_paso_a_paso_motores_CC_rev1.pdf guía oficial]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Paso 2: Instalar el sensor de grises&lt;br /&gt;
&lt;br /&gt;
1:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP1.jpeg]] &lt;br /&gt;
&lt;br /&gt;
2:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP2.jpeg]]&lt;br /&gt;
&lt;br /&gt;
3:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP3.jpeg]]&lt;br /&gt;
&lt;br /&gt;
4:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP4.jpeg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Paso 3: Instalar el sensor de distancia&lt;br /&gt;
&lt;br /&gt;
1:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP1.png]]&lt;br /&gt;
&lt;br /&gt;
2:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP2.png]]&lt;br /&gt;
&lt;br /&gt;
3:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP3.png]]&lt;br /&gt;
&lt;br /&gt;
4:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP4.png]]&lt;br /&gt;
&lt;br /&gt;
== Protocolo de comunicación ==&lt;br /&gt;
El protocolo de comunicaron diseñado para la comunicación entre Servidor y Aplicación ''Mobile'' es el siguiente:&lt;br /&gt;
&lt;br /&gt;
'''''Accion0-S0\nAccion1-S1\nAccion2-S2\nAccion3\nAccion4-S4\nVelocidad'''''&lt;br /&gt;
&lt;br /&gt;
Donde, este ''string'' representa la serie encadenada de acciones que el servidor recibe para ejecutar en el robot desde la aplicación.&lt;br /&gt;
Cada acción esta separada de la que se encuentra a continuación por el símbolo &amp;quot;''\n''&amp;quot;.&lt;br /&gt;
Podemos diferenciar dos tipos de acciones, las que requieren parámetro y las que no, estas se comunican de la siguiente forma:&lt;br /&gt;
'''Acción con parámetro''': NombreAccion-Parametro&lt;br /&gt;
&lt;br /&gt;
'''Acción sin parámetro''': NombreAccion&lt;br /&gt;
&lt;br /&gt;
== Implementación código Python ==&lt;br /&gt;
&lt;br /&gt;
Antes de empezar a programar o usar el código, es necesario instalar las librerías a usar, esto se puede hacer escribiendo &lt;br /&gt;
&lt;br /&gt;
'''''pip install [nombre de la librería]''''' en el interprete de comandos del sistema.&lt;br /&gt;
&lt;br /&gt;
Entonces instalamos la librería a utilizar, en este caso:&lt;br /&gt;
&lt;br /&gt;
'''''pip install simple_websocket_server'''''&lt;br /&gt;
&lt;br /&gt;
Una vez instalada la librería, hay que empezar a escribir el código.&lt;br /&gt;
&lt;br /&gt;
El encabezado del código es el siguiente&lt;br /&gt;
El uso de cada librería se explica con detalle mas adelante&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Encabezado.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A partir de la librería '''sys''' se define el camino del sistema para utilizar los plugin Butiá.&lt;br /&gt;
En nuestro caso, la ruta es ''' '/home/trerb/TurtleBots.activity/plugins/butia' ''', eso se tiene que modificar dependiendo de donde se encuentren el directorio ''' TurtleBots.activity/ ''' en su sistema de archivos&lt;br /&gt;
&lt;br /&gt;
[[Archivo:UsoPluginButia.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego se encuentra la función ''' clearConsole ''',&lt;br /&gt;
Esta función sirve únicamente para limpiar el interprete de Python usando la librería ''' os ''' y tener una ejecución mas limpia&lt;br /&gt;
&lt;br /&gt;
[[Archivo:clearConsole().png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
El siguiente código utiliza la librería ''' socket ''' para conectarse a la web y preguntar la ip del ordenador que ejecuta el archivo y la muestra en pantalla, esto se usa para facilitar la conexión con la App Mobile&lt;br /&gt;
&lt;br /&gt;
[[Archivo:conexionSocket.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Las siguientes líneas de código preguntan al usuario que puerto va a utilizar para la conexión, este código verifica que se ingrese un dato numérico, dentro del rango de los puertos, y que el puerto este disponible.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:tryPuerto.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego se declaran las variables: ''' Speed, Puerto_Gris y Puerto_Distancia ''', se verifica que los sensores de distancia y de grises estén conectados y asigna el puerto en el que estén conectados a las variables ''' Puerto_Distancia ''' y ''' Puerto_Gris ''' respectivamente. La variable ''' Speed ''' es una variable global que se lee al inicio de cada cadena de acciones y la utiliza para todos los movimientos del Butiá de esa cadena.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:declaracionVariables.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Seguimos con la declaración de las funciones básicas del Butiá, en este caso son ''' Avanzar, Rotar, AvanzarHastaVerColor y AvanzarHastaObstaculo ''' &lt;br /&gt;
&lt;br /&gt;
-La función ''' Avanzar ''' recibe un parámetro de tiempo y el Butiá avanza ese determinado tiempo.&lt;br /&gt;
&lt;br /&gt;
-La función ''' Retroceder ''' recibe un parámetro de tiempo y el Butiá retrocede ese determinado tiempo.&lt;br /&gt;
&lt;br /&gt;
-La función ''' Rotar ''' recibe dos parámetros, una dirección que puede ser Izquierda o Derecha y un tiempo que indica la duración de la rotación del Butiá.&lt;br /&gt;
&lt;br /&gt;
-La función ''' AvanzarHastaVerColor ''' recibe un parámetro que varia entre Blanco o Negro, el robot va a avanzar hasta detectar el color seleccionado.&lt;br /&gt;
Esta función solo se puede usar si el sensor de grises esta conectado.&lt;br /&gt;
&lt;br /&gt;
-Por ultimo, la función ''' AvanzarHastaObstaculo ''' no recibe parámetros, en este caso el Butiá va a avanzar hasta estar a unos pocos centímetros de un obstáculo.&lt;br /&gt;
Esta función solo se puede usar si el sensor de distancia esta conectado.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:FuncionesBasicas.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego se encuentra una función ''' Accion1 ''' esta función la puede definir el usuario a gusto, se puede implementar desde una función básica hasta un seguidor de líneas avanzado. La única condición que se necesita para implementar esta ''' Accion1 ''' es que no puede recibir parámetros&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Accion1.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ahora tenemos que definir el menú principal del programa, este se divide en dos funciones&lt;br /&gt;
&lt;br /&gt;
- ''' handle ''': Esta es una función predeterminada de la librería ''' simple_web_socket ''' y se llama cada vez que el servidor recibe un dato del cliente. En este caso la función crea una lista de las acciones que le llegan de la App Mobile, y las va ejecutando ordenadamente&lt;br /&gt;
&lt;br /&gt;
- ''' handle_close ''': Al igual que la función anterior, esta también es una función predeterminada de la librería ''' simple_web_socket ''' y se llama cuando el cliente se desconecta del servidor&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Screenshot from 2021-06-27 03-58-56.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Y por ultimo tenemos el dos líneas de codigo, la primera se encarga de abrir el servidor y la segunda lo mantiene abierto infinitamente&lt;br /&gt;
&lt;br /&gt;
[[Archivo:abrirServidor.png]]&lt;br /&gt;
&lt;br /&gt;
== Implementación código React ==&lt;br /&gt;
&lt;br /&gt;
La aplicación ''mobile'' esta implementada con React Native, ademas, se utiliza el ''framework'' [https://docs.expo.io/ Expo]. Este ''framework'' nos brinda un conjunto de herramientas que facilita el desarrollo de aplicaciones ''mobile''. &lt;br /&gt;
En caso de querer agregar, o modificar cualidades, es necesario proceder de la siguiente forma:&lt;br /&gt;
&lt;br /&gt;
Descargar el archivo comprimido adjunto.&lt;br /&gt;
&lt;br /&gt;
Extraerlo, posicionarse en el directorio raiz de la carpeta descomprimida, y ejecutar desde la terminal lo siguiente (tener en cuenta que es necesario tener en la maquina, el gestor de paquetes [https://docs.npmjs.com/ npm]).&lt;br /&gt;
&lt;br /&gt;
''''npm install'''' &lt;br /&gt;
&lt;br /&gt;
Esto descarga las dependencias que utiliza la aplicación, luego de esto podemos empezar a desarrollar.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para visualizar los cambios en tiempo real mientras desarrollamos, es necesario instalar la aplicación Expo Go para [https://play.google.com/store/apps/details?id=host.exp.exponent&amp;amp;hl=es_UY&amp;amp;gl=US Android] o para [https://apps.apple.com/es/app/expo-go/id982107779 iOS] según sea el caso.&lt;br /&gt;
&lt;br /&gt;
Para a visualizar la app en desarrollo desde Expo Go, procedemos de la siguiente forma:&lt;br /&gt;
Desde el directorio raíz de la aplicación ejecutamos desde la terminal lo siguiente:&lt;br /&gt;
&lt;br /&gt;
''''npm start''''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego, desde la aplicación Expo Go, con el celular conectado en la misma red local accedemos a la aplicación seleccionando lo siguiente:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Expo.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hecho esto, podemos cambiar el código de la aplicación y ver reflejados los cambios de forma casi instantánea.&lt;br /&gt;
&lt;br /&gt;
La aplicación esta compuesta por dos pantallas, la pantalla de configuración (''ConfigScreen.js''), donde se ingresa la dirección ip y puerto del servidor, y la pantalla principal (''MainScreen.js''), donde se lleva a cabo la programación del robot mediante acciones.&lt;br /&gt;
&lt;br /&gt;
Esta ultima pantalla esta compuesta por los componentes ''TopList.js'' y ''BottomList.js''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Untitled presentation.png]]&lt;br /&gt;
&lt;br /&gt;
Para agregar una nueva accion al sistema, es necesario programarla en el servidor con un determinado nombre, supondremos &amp;quot;AccionN&amp;quot;, esto resulta fácil si se toma como ejemplo las acciones ya implementadas.&lt;br /&gt;
&lt;br /&gt;
En la aplicación, esta nueva acción se agrega en el ''array'' &amp;quot;''actionsData''&amp;quot;, dicho ''array'' se encuentra en la pantalla principal, es decir en el archivo &amp;quot;''MainScreen.js''&amp;quot;, cada acción cuenta con los siguientes datos:&lt;br /&gt;
&lt;br /&gt;
-'''idAccion:''' Identificador de la acción en dicho arreglo (actionsData).&lt;br /&gt;
&lt;br /&gt;
-'''title:''': Titulo de la acción que se muestra en el panel superior.&lt;br /&gt;
&lt;br /&gt;
-'''actionId:''' Nombre identificador de la acción en el servidor.&lt;br /&gt;
&lt;br /&gt;
-'''overlay:''' ''Overlay'' que se despliega al seleccionar la acción (si esta requiere parámetro), esta función lleva como parámetro &amp;quot;''editOverlay''&amp;quot; y &amp;quot;''id''&amp;quot; (estos que se utilizan cuando se requiere cambiar dicho valor en una acción que ya fue seleccionada y se encuentra en el panel inferior), como por ejemplo pueden ser segundos en el caso de la acción &amp;quot;Avanzar&amp;quot;, o colores en el caso de &amp;quot;Avanzar hasta obstáculo&amp;quot;. Este parámetro puede ser que no sea necesario, como es en el caso de la acción &amp;quot;Avanzar hasta obstáculo&amp;quot;, en este ultimo caso el valor de este campo es ''null''.&lt;br /&gt;
&lt;br /&gt;
Ejemplo de la acción &amp;quot;Avanzar&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Screenshot from 2021-06-27 04-18-42.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ejemplo de la acción &amp;quot;Avanzar hasta obstáculo&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Screenshot_from_2021-06-27_00-28-32.png]]&lt;br /&gt;
&lt;br /&gt;
== Manual de uso de la aplicación ==&lt;br /&gt;
&lt;br /&gt;
Aunque la aplicación resulta intuitiva y fácil de usar se describe a continuación una serie de pasos para utilizarla correctamente.&lt;br /&gt;
&lt;br /&gt;
Para comenzar a utilizar la aplicación es necesario configurar la conexión de la aplicación con el servidor (recordar que ambos se deben encontrar ejecutándose en la misma red local), el servidor ejecutando en una computadora que esté conectada correctamente al butiá (con los sensores descritos anteriormente) y la aplicación ejecutándose en el celular.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Conectando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego que la conexión haya resultado exitosa, nos encontramos en la pantalla principal. En el panel superior, como se muestra a continuación, se encuentran las aplicaciones disponibles que podemos ejecutar en el robot butiá.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Acciones.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para agregar una serie de acciones al robot, simplemente presionamos la que queramos, a continuación esta aparecerá en el panel inferior, a medida de que vayamos seleccionando acciones, estas se irán encadenando una tras otras, estas estarán prontas para ejecutarse secuencialmente, desde la parte inferior, a la parte superior, en el momento que presionemos el botón &amp;quot;Empezar&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Agregando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Como la aplicación está pensada para planificar algoritmos para resolver desafíos o ''puzzles'', es probable que nos equivoquemos y seleccionemos una acción o insertemos un parámetro incorrectamente, ¡pero no te preocupes!. Para editar el parámetro que le hayamos ingresado a una acción, simplemente mantenemos pulsado la que deseamos corregir e ingresamos el nuevo valor.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Editando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
También es posible eliminar una acción, para hacer esto, nuevamente mantenemos pulsada la acción que queremos eliminar, pero esta vez, seleccionamos la acción eliminar. A continuación la acción seleccionada desaparecerá del panel inferior. También es posible que deseemos eliminar todas las acciones que habíamos ingresado, en este caso seleccionamos el botón &amp;quot;Eliminar acciones&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Eliminando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es posible que queremos que el robot se desplace a ciertas velocidades, teniendo en cuenta que al modificar la velocidad, el robot tendrá un comportamiento totalmente diferente, debido a que gran parte de las acciones se ejecutan por un tiempo asignado, a mayor velocidad, más desplazamiento.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Velocidad.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En caso de que exista un error en la conexión, podemos intentar volver a conectar la aplicación al servidor, para esto seleccionamos la opción configuración.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:A configuracion.gif]]&lt;br /&gt;
&lt;br /&gt;
== Video de muestra ==&lt;br /&gt;
&lt;br /&gt;
== Mejoras a futuro ==&lt;br /&gt;
&lt;br /&gt;
* Implementar una forma para que las función ''' Accion1 ''' pueda recibir parámetros, para así ampliar la gama de problemas que se puedan solucionar a través de esta aplicación.&lt;br /&gt;
&lt;br /&gt;
* Implementación de código que permita añadir a través del código, una mayor cantidad de funciones genéricas a la aplicación.&lt;br /&gt;
&lt;br /&gt;
* Desarrollar una forma de comunicación bilateral entre la ''App Mobile'' y Python para mejorar el ''debug'' en tiempo de ejecución.&lt;br /&gt;
&lt;br /&gt;
== Archivos de uso ==&lt;/div&gt;</summary>
		<author><name>German.moreira</name></author>	</entry>

	<entry>
		<id>http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Programando_el_Butia_desde_el_celular&amp;diff=11635</id>
		<title>Programando el Butia desde el celular</title>
		<link rel="alternate" type="text/html" href="http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Programando_el_Butia_desde_el_celular&amp;diff=11635"/>
				<updated>2021-06-27T08:07:26Z</updated>
		
		<summary type="html">&lt;p&gt;German.moreira: /* Manual de uso de la aplicación */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Introducción ==&lt;br /&gt;
&lt;br /&gt;
La idea del proyecto en un principio era usar el celular como medio para controlar el robot Butiá para que resulte más atractivo para los estudiantes que no les guste la programación.&lt;br /&gt;
&lt;br /&gt;
Luego, la idea se modifico un poco debido a que descubrimos que con esta implementación, podíamos hacer mas sencilla la resolución de algunos ejercicios básicos mediante algoritmos mas simplificados, tomamos el trabajo que teníamos hecho hasta el momento y lo adaptamos a un menú con distintas acciones simples como avanzar un determinado tiempo, avanzar hasta chocar contra un objeto o rotar a la izquierda o derecha un determinado tiempo.&lt;br /&gt;
&lt;br /&gt;
Estas funciones básicas y bastante sencillas de entender más una interfaz amigable y fácil de usar, se implementaron para que el rango de edad de uso de esta aplicación vaya de 3 años en adelante.&lt;br /&gt;
&lt;br /&gt;
Como resultado obtuvimos una aplicación que se puede usar para que niños de:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- 4 / 5 / 6 años resuelvan ejercicios sencillos como puede ser llegar de un punto a otro, buscar el camino a un objeto o resolver un laberinto sencillo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- 7 / 8 / 9 años puedan resolver ejercicios un poco más complejos como puede ser resolver un laberinto del más sencillo al mas complejo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- 10 años en adelante tengan la capacidad de adaptar una parte personal de código al programa y puedan resolver cualquier ejercicio que se pueda plantear con el robot Butiá.&lt;br /&gt;
&lt;br /&gt;
== Objetivo y motivación==&lt;br /&gt;
&lt;br /&gt;
Los objetivos del proyecto eran, como dice el nombre, poder conectar remotamente el robot Butiá a un celular y buscar una abstracción de la mayor cantidad de problemas que puedan ser resueltos con el robot Butiá.&lt;br /&gt;
&lt;br /&gt;
Esto, para poder crear un método de uso del robot Butiá más dinámico y con funciones que permiten realizar, mediante algoritmos mas sencillos, la solución de la mayor cantidad de puzles particulares, abstrayéndose de la programación directa, lo que puede ser tedioso o abrumador para personas que tienen su primer acercamiento a la programación.&lt;br /&gt;
&lt;br /&gt;
Al hacer esto, el nivel de uso en aulas del robot Butiá, puede simplificarse hasta clases desde 3 años de jardinera en adelante, debido a que la aplicación simplifica la parte de codificación y los algoritmos de solución de ejercicios se convierten simplemente en una serie de pasos básicos a ejecutar linealmente.&lt;br /&gt;
&lt;br /&gt;
Lo que se busca con este proyecto, es despertar la curiosidad e interés en niños y adolescentes en el área de la programación, de una forma didáctica en la que estos pueden experimentar directamente con el robot y potenciar la creatividad para resolver problemas. &lt;br /&gt;
&lt;br /&gt;
La aplicación esta inspirada en el lenguaje &amp;quot;Sratch&amp;quot;, el cual es un lenguaje ideal como primera aproximación a la programación. &lt;br /&gt;
&lt;br /&gt;
Este ''software'' permite ademas, introducir conceptos como, instrucciones, secuencialidad de código, algoritmos, secuencias de control, estructuras de repetición, etc. Como ejercicio, se puede plantear por ejemplo, hacer el pasaje de algoritmos diseñados en la aplicación en el Python.&lt;br /&gt;
&lt;br /&gt;
== Armado del Butiá ==&lt;br /&gt;
&lt;br /&gt;
* Paso 1: Armar el Butiá a partir de esta [https://www.fing.edu.uy/inco/proyectos/butia/files/docs_butia2/armando_paso_a_paso_motores_CC_rev1.pdf guía oficial]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Paso 2: Instalar el sensor de grises&lt;br /&gt;
&lt;br /&gt;
1:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP1.jpeg]] &lt;br /&gt;
&lt;br /&gt;
2:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP2.jpeg]]&lt;br /&gt;
&lt;br /&gt;
3:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP3.jpeg]]&lt;br /&gt;
&lt;br /&gt;
4:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP4.jpeg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Paso 3: Instalar el sensor de distancia&lt;br /&gt;
&lt;br /&gt;
1:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP1.png]]&lt;br /&gt;
&lt;br /&gt;
2:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP2.png]]&lt;br /&gt;
&lt;br /&gt;
3:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP3.png]]&lt;br /&gt;
&lt;br /&gt;
4:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP4.png]]&lt;br /&gt;
&lt;br /&gt;
== Protocolo de comunicación ==&lt;br /&gt;
El protocolo de comunicaron diseñado para la comunicación entre Servidor y Aplicación ''Mobile'' es el siguiente:&lt;br /&gt;
&lt;br /&gt;
'''''Accion0-S0\nAccion1-S1\nAccion2-S2\nAccion3\nAccion4-S4\nVelocidad'''''&lt;br /&gt;
&lt;br /&gt;
Donde, este ''string'' representa la serie encadenada de acciones que el servidor recibe para ejecutar en el robot desde la aplicación.&lt;br /&gt;
Cada acción esta separada de la que se encuentra a continuación por el símbolo &amp;quot;''\n''&amp;quot;.&lt;br /&gt;
Podemos diferenciar dos tipos de acciones, las que requieren parámetro y las que no, estas se comunican de la siguiente forma:&lt;br /&gt;
'''Acción con parámetro''': NombreAccion-Parametro&lt;br /&gt;
&lt;br /&gt;
'''Acción sin parámetro''': NombreAccion&lt;br /&gt;
&lt;br /&gt;
== Implementación código Python ==&lt;br /&gt;
&lt;br /&gt;
Antes de empezar a programar o usar el código, es necesario instalar las librerías a usar, esto se puede hacer escribiendo &lt;br /&gt;
&lt;br /&gt;
'''''pip install [nombre de la librería]''''' en el interprete de comandos del sistema.&lt;br /&gt;
&lt;br /&gt;
Entonces instalamos la librería a utilizar, en este caso:&lt;br /&gt;
&lt;br /&gt;
'''''pip install simple_websocket_server'''''&lt;br /&gt;
&lt;br /&gt;
Una vez instalada la librería, hay que empezar a escribir el código.&lt;br /&gt;
&lt;br /&gt;
El encabezado del código es el siguiente&lt;br /&gt;
El uso de cada librería se explica con detalle mas adelante&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Encabezado.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A partir de la librería '''sys''' se define el camino del sistema para utilizar los plugin Butiá.&lt;br /&gt;
En nuestro caso, la ruta es ''' '/home/trerb/TurtleBots.activity/plugins/butia' ''', eso se tiene que modificar dependiendo de donde se encuentren el directorio ''' TurtleBots.activity/ ''' en su sistema de archivos&lt;br /&gt;
&lt;br /&gt;
[[Archivo:UsoPluginButia.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego se encuentra la función ''' clearConsole ''',&lt;br /&gt;
Esta función sirve únicamente para limpiar el interprete de Python usando la librería ''' os ''' y tener una ejecución mas limpia&lt;br /&gt;
&lt;br /&gt;
[[Archivo:clearConsole().png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
El siguiente código utiliza la librería ''' socket ''' para conectarse a la web y preguntar la ip del ordenador que ejecuta el archivo y la muestra en pantalla, esto se usa para facilitar la conexión con la App Mobile&lt;br /&gt;
&lt;br /&gt;
[[Archivo:conexionSocket.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Las siguientes líneas de código preguntan al usuario que puerto va a utilizar para la conexión, este código verifica que se ingrese un dato numérico, dentro del rango de los puertos, y que el puerto este disponible.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:tryPuerto.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego se declaran las variables: ''' Speed, Puerto_Gris y Puerto_Distancia ''', se verifica que los sensores de distancia y de grises estén conectados y asigna el puerto en el que estén conectados a las variables ''' Puerto_Distancia ''' y ''' Puerto_Gris ''' respectivamente. La variable ''' Speed ''' es una variable global que se lee al inicio de cada cadena de acciones y la utiliza para todos los movimientos del Butiá de esa cadena.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:declaracionVariables.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Seguimos con la declaración de las funciones básicas del Butiá, en este caso son ''' Avanzar, Rotar, AvanzarHastaVerColor y AvanzarHastaObstaculo ''' &lt;br /&gt;
&lt;br /&gt;
-La función ''' Avanzar ''' recibe un parámetro de tiempo y el Butiá avanza ese determinado tiempo.&lt;br /&gt;
&lt;br /&gt;
-La función ''' Retroceder ''' recibe un parámetro de tiempo y el Butiá retrocede ese determinado tiempo.&lt;br /&gt;
&lt;br /&gt;
-La función ''' Rotar ''' recibe dos parámetros, una dirección que puede ser Izquierda o Derecha y un tiempo que indica la duración de la rotación del Butiá.&lt;br /&gt;
&lt;br /&gt;
-La función ''' AvanzarHastaVerColor ''' recibe un parámetro que varia entre Blanco o Negro, el robot va a avanzar hasta detectar el color seleccionado.&lt;br /&gt;
Esta función solo se puede usar si el sensor de grises esta conectado.&lt;br /&gt;
&lt;br /&gt;
-Por ultimo, la función ''' AvanzarHastaObstaculo ''' no recibe parámetros, en este caso el Butiá va a avanzar hasta estar a unos pocos centímetros de un obstáculo.&lt;br /&gt;
Esta función solo se puede usar si el sensor de distancia esta conectado.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:FuncionesBasicas.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego se encuentra una función ''' Accion1 ''' esta función la puede definir el usuario a gusto, se puede implementar desde una función básica hasta un seguidor de líneas avanzado. La única condición que se necesita para implementar esta ''' Accion1 ''' es que no puede recibir parámetros&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Accion1.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ahora tenemos que definir el menú principal del programa, este se divide en dos funciones&lt;br /&gt;
&lt;br /&gt;
- ''' handle ''': Esta es una función predeterminada de la librería ''' simple_web_socket ''' y se llama cada vez que el servidor recibe un dato del cliente. En este caso la función crea una lista de las acciones que le llegan de la App Mobile, y las va ejecutando ordenadamente&lt;br /&gt;
&lt;br /&gt;
- ''' handle_close ''': Al igual que la función anterior, esta también es una función predeterminada de la librería ''' simple_web_socket ''' y se llama cuando el cliente se desconecta del servidor&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Screenshot from 2021-06-27 03-58-56.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Y por ultimo tenemos el dos líneas de codigo, la primera se encarga de abrir el servidor y la segunda lo mantiene abierto infinitamente&lt;br /&gt;
&lt;br /&gt;
[[Archivo:abrirServidor.png]]&lt;br /&gt;
&lt;br /&gt;
== Implementación codigo React ==&lt;br /&gt;
&lt;br /&gt;
La aplicacion movil esta implementada con React Native, ademas, se utiliza el ''framework'' [https://docs.expo.io/ Expo]. Este ''framework'' nos brinda un conjunto de herramientas que facilita el desarrollo de aplicaciones mobiles. &lt;br /&gt;
En caso de querer agregar, o modificar cualidades, es necesario proceder de la siguiente forma:&lt;br /&gt;
&lt;br /&gt;
Descargar el archivo comprimido adjunto.&lt;br /&gt;
&lt;br /&gt;
Extraerlo, posicionarse en el directorio raiz de la carpeta descomprimida, y ejecutar desde la terminal lo siguiente (tener en cuenta que es necesario tener en la maquina, el gestor de paquetes [https://docs.npmjs.com/ npm]).&lt;br /&gt;
&lt;br /&gt;
''''npm install'''' &lt;br /&gt;
&lt;br /&gt;
Esto descarga las dependencias que utiliza la aplicación, luego de esto podemos empezar a desarrollar.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para visualizar los cambios en tiempo real mientras desarrollamos, es necesario instalar la aplicación Expo Go para [https://play.google.com/store/apps/details?id=host.exp.exponent&amp;amp;hl=es_UY&amp;amp;gl=US Android] o para [https://apps.apple.com/es/app/expo-go/id982107779 iOS] según sea el caso.&lt;br /&gt;
&lt;br /&gt;
Para a visualizar la app en desarrollo desde Expo Go, procedemos de la siguiente forma:&lt;br /&gt;
Desde el directorio raíz de la aplicación ejecutamos desde la terminal lo siguiente:&lt;br /&gt;
&lt;br /&gt;
''''npm start''''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego, desde la aplicación Expo Go, con el celular conectado en la misma red local accedemos a la aplicación seleccionando lo siguiente:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Expo.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hecho esto, podemos cambiar el código de la aplicación y ver reflejados los cambios de forma casi instantánea.&lt;br /&gt;
&lt;br /&gt;
La aplicacion esta compuesta por dos pantallas, la pantalla de configuracion (''ConfigScreen.js''), donde se ingresa la direccion ip y puerto del servidor, y la pantalla principal (''MainScreen.js''), donde se lleva a cabo la programacion del robot mediante acciones.&lt;br /&gt;
&lt;br /&gt;
Esta ultima pantalla esta compuesta por los componentes ''TopList.js'' y ''BottomList.js''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Untitled presentation.png]]&lt;br /&gt;
&lt;br /&gt;
Para agregar una nueva accion al sistema, es necesario programarla en el servidor con un deteminado nombre, supondremos &amp;quot;AccionN&amp;quot;, esto resulta facil si se toma como ejemplo las acciones ya implementadas.&lt;br /&gt;
&lt;br /&gt;
En la aplicacion, esta nueva accion se agrega en el array &amp;quot;''actionsData''&amp;quot;, dicho array se encuentra en la palntalla principal, es decir en el archivo &amp;quot;''MainScreen.js''&amp;quot;, cada accion cuenta con los siguientes datos:&lt;br /&gt;
&lt;br /&gt;
-'''idAccion:''' Identificador de la accion en dicho arreglo (actionsData).&lt;br /&gt;
&lt;br /&gt;
-'''title:''': Titulo de la accion que se muetra en el panel superior.&lt;br /&gt;
&lt;br /&gt;
-'''actionId:''' Nombre identificador de la accion en el servidor.&lt;br /&gt;
&lt;br /&gt;
-'''overlay:''': ''Overlay'' que se despliega al seleccionar la accion si esta lleva un parametro, esta funcion lleva como parametro &amp;quot;''editOverlay''&amp;quot; y &amp;quot;''id''&amp;quot; (parametros que se utilizan cuando se requiere cambiar el valor del parametro de la accuion que ya fue seleccionada y se encuentra en el panel inferior), como por ejemplo pueden ser segundos en el caso de la accion &amp;quot;Avanzar&amp;quot;, o colores en el caso de &amp;quot;Avanzar hasta obstaculo&amp;quot;. Este parametro puede ser que no sea necesario, como es en el caso de la accion &amp;quot;Avanzar hasta obstaculo&amp;quot;, en este ultimo caso el valor de este campo es null.&lt;br /&gt;
&lt;br /&gt;
Ejemplo de la accion &amp;quot;Avanzar&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Screenshot from 2021-06-27 04-18-42.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ejemplo de la accion &amp;quot;Avanzar hasta obstaculo&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Screenshot_from_2021-06-27_00-28-32.png]]&lt;br /&gt;
&lt;br /&gt;
== Manual de uso de la aplicación ==&lt;br /&gt;
&lt;br /&gt;
Aunque la aplicación resulta intuitiva y fácil de usar se describe a continuación una serie de pasos para utilizarla correctamente.&lt;br /&gt;
&lt;br /&gt;
Para comenzar a utilizar la aplicación es necesario configurar la conexión de la aplicación con el servidor (recordar que ambos se deben encontrar ejecutándose en la misma red local), el servidor ejecutando en una computadora que esté conectada correctamente al butiá (con los sensores descritos anteriormente) y la aplicación ejecutándose en el celular.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Conectando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego que la conexión haya resultado exitosa, nos encontramos en la pantalla principal. En el panel superior, como se muestra a continuación, se encuentran las aplicaciones disponibles que podemos ejecutar en el robot butiá.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Acciones.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para agregar una serie de acciones al robot, simplemente presionamos la que queramos, a continuación esta aparecerá en el panel inferior, a medida de que vayamos seleccionando acciones, estas se irán encadenando una tras otras, estas estarán prontas para ejecutarse secuencialmente, desde la parte inferior, a la parte superior, en el momento que presionemos el botón &amp;quot;Empezar&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Agregando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Como la aplicación está pensada para planificar algoritmos para resolver desafíos o ''puzzles'', es probable que nos equivoquemos y seleccionemos una acción o insertemos un parámetro incorrectamente, ¡pero no te preocupes!. Para editar el parámetro que le hayamos ingresado a una acción, simplemente mantenemos pulsado la que deseamos corregir e ingresamos el nuevo valor.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Editando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
También es posible eliminar una acción, para hacer esto, nuevamente mantenemos pulsada la acción que queremos eliminar, pero esta vez, seleccionamos la acción eliminar. A continuación la acción seleccionada desaparecerá del panel inferior. También es posible que deseemos eliminar todas las acciones que habíamos ingresado, en este caso seleccionamos el botón &amp;quot;Eliminar acciones&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Eliminando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es posible que queremos que el robot se desplace a ciertas velocidades, teniendo en cuenta que al modificar la velocidad, el robot tendrá un comportamiento totalmente diferente, debido a que gran parte de las acciones se ejecutan por un tiempo asignado, a mayor velocidad, más desplazamiento.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Velocidad.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En caso de que exista un error en la conexión, podemos intentar volver a conectar la aplicación al servidor, para esto seleccionamos la opción configuración.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:A configuracion.gif]]&lt;br /&gt;
&lt;br /&gt;
== Video de muestra ==&lt;br /&gt;
&lt;br /&gt;
== Mejoras a futuro ==&lt;br /&gt;
&lt;br /&gt;
* Implementar una forma para que las función ''' Accion1 ''' pueda recibir parámetros, para así ampliar la gama de problemas que se puedan solucionar a través de esta aplicación.&lt;br /&gt;
&lt;br /&gt;
* Implementación de código que permita añadir a través del código, una mayor cantidad de funciones genéricas a la aplicación.&lt;br /&gt;
&lt;br /&gt;
* Desarrollar una forma de comunicación bilateral entre la ''App Mobile'' y Python para mejorar el ''debug'' en tiempo de ejecución.&lt;br /&gt;
&lt;br /&gt;
== Archivos de uso ==&lt;/div&gt;</summary>
		<author><name>German.moreira</name></author>	</entry>

	<entry>
		<id>http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Programando_el_Butia_desde_el_celular&amp;diff=11634</id>
		<title>Programando el Butia desde el celular</title>
		<link rel="alternate" type="text/html" href="http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Programando_el_Butia_desde_el_celular&amp;diff=11634"/>
				<updated>2021-06-27T08:06:09Z</updated>
		
		<summary type="html">&lt;p&gt;German.moreira: /* Implementación codigo React */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Introducción ==&lt;br /&gt;
&lt;br /&gt;
La idea del proyecto en un principio era usar el celular como medio para controlar el robot Butiá para que resulte más atractivo para los estudiantes que no les guste la programación.&lt;br /&gt;
&lt;br /&gt;
Luego, la idea se modifico un poco debido a que descubrimos que con esta implementación, podíamos hacer mas sencilla la resolución de algunos ejercicios básicos mediante algoritmos mas simplificados, tomamos el trabajo que teníamos hecho hasta el momento y lo adaptamos a un menú con distintas acciones simples como avanzar un determinado tiempo, avanzar hasta chocar contra un objeto o rotar a la izquierda o derecha un determinado tiempo.&lt;br /&gt;
&lt;br /&gt;
Estas funciones básicas y bastante sencillas de entender más una interfaz amigable y fácil de usar, se implementaron para que el rango de edad de uso de esta aplicación vaya de 3 años en adelante.&lt;br /&gt;
&lt;br /&gt;
Como resultado obtuvimos una aplicación que se puede usar para que niños de:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- 4 / 5 / 6 años resuelvan ejercicios sencillos como puede ser llegar de un punto a otro, buscar el camino a un objeto o resolver un laberinto sencillo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- 7 / 8 / 9 años puedan resolver ejercicios un poco más complejos como puede ser resolver un laberinto del más sencillo al mas complejo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- 10 años en adelante tengan la capacidad de adaptar una parte personal de código al programa y puedan resolver cualquier ejercicio que se pueda plantear con el robot Butiá.&lt;br /&gt;
&lt;br /&gt;
== Objetivo y motivación==&lt;br /&gt;
&lt;br /&gt;
Los objetivos del proyecto eran, como dice el nombre, poder conectar remotamente el robot Butiá a un celular y buscar una abstracción de la mayor cantidad de problemas que puedan ser resueltos con el robot Butiá.&lt;br /&gt;
&lt;br /&gt;
Esto, para poder crear un método de uso del robot Butiá más dinámico y con funciones que permiten realizar, mediante algoritmos mas sencillos, la solución de la mayor cantidad de puzles particulares, abstrayéndose de la programación directa, lo que puede ser tedioso o abrumador para personas que tienen su primer acercamiento a la programación.&lt;br /&gt;
&lt;br /&gt;
Al hacer esto, el nivel de uso en aulas del robot Butiá, puede simplificarse hasta clases desde 3 años de jardinera en adelante, debido a que la aplicación simplifica la parte de codificación y los algoritmos de solución de ejercicios se convierten simplemente en una serie de pasos básicos a ejecutar linealmente.&lt;br /&gt;
&lt;br /&gt;
Lo que se busca con este proyecto, es despertar la curiosidad e interés en niños y adolescentes en el área de la programación, de una forma didáctica en la que estos pueden experimentar directamente con el robot y potenciar la creatividad para resolver problemas. &lt;br /&gt;
&lt;br /&gt;
La aplicación esta inspirada en el lenguaje &amp;quot;Sratch&amp;quot;, el cual es un lenguaje ideal como primera aproximación a la programación. &lt;br /&gt;
&lt;br /&gt;
Este ''software'' permite ademas, introducir conceptos como, instrucciones, secuencialidad de código, algoritmos, secuencias de control, estructuras de repetición, etc. Como ejercicio, se puede plantear por ejemplo, hacer el pasaje de algoritmos diseñados en la aplicación en el Python.&lt;br /&gt;
&lt;br /&gt;
== Armado del Butiá ==&lt;br /&gt;
&lt;br /&gt;
* Paso 1: Armar el Butiá a partir de esta [https://www.fing.edu.uy/inco/proyectos/butia/files/docs_butia2/armando_paso_a_paso_motores_CC_rev1.pdf guía oficial]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Paso 2: Instalar el sensor de grises&lt;br /&gt;
&lt;br /&gt;
1:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP1.jpeg]] &lt;br /&gt;
&lt;br /&gt;
2:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP2.jpeg]]&lt;br /&gt;
&lt;br /&gt;
3:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP3.jpeg]]&lt;br /&gt;
&lt;br /&gt;
4:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP4.jpeg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Paso 3: Instalar el sensor de distancia&lt;br /&gt;
&lt;br /&gt;
1:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP1.png]]&lt;br /&gt;
&lt;br /&gt;
2:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP2.png]]&lt;br /&gt;
&lt;br /&gt;
3:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP3.png]]&lt;br /&gt;
&lt;br /&gt;
4:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP4.png]]&lt;br /&gt;
&lt;br /&gt;
== Protocolo de comunicación ==&lt;br /&gt;
El protocolo de comunicaron diseñado para la comunicación entre Servidor y Aplicación ''Mobile'' es el siguiente:&lt;br /&gt;
&lt;br /&gt;
'''''Accion0-S0\nAccion1-S1\nAccion2-S2\nAccion3\nAccion4-S4\nVelocidad'''''&lt;br /&gt;
&lt;br /&gt;
Donde, este ''string'' representa la serie encadenada de acciones que el servidor recibe para ejecutar en el robot desde la aplicación.&lt;br /&gt;
Cada acción esta separada de la que se encuentra a continuación por el símbolo &amp;quot;''\n''&amp;quot;.&lt;br /&gt;
Podemos diferenciar dos tipos de acciones, las que requieren parámetro y las que no, estas se comunican de la siguiente forma:&lt;br /&gt;
'''Acción con parámetro''': NombreAccion-Parametro&lt;br /&gt;
&lt;br /&gt;
'''Acción sin parámetro''': NombreAccion&lt;br /&gt;
&lt;br /&gt;
== Implementación código Python ==&lt;br /&gt;
&lt;br /&gt;
Antes de empezar a programar o usar el código, es necesario instalar las librerías a usar, esto se puede hacer escribiendo &lt;br /&gt;
&lt;br /&gt;
'''''pip install [nombre de la librería]''''' en el interprete de comandos del sistema.&lt;br /&gt;
&lt;br /&gt;
Entonces instalamos la librería a utilizar, en este caso:&lt;br /&gt;
&lt;br /&gt;
'''''pip install simple_websocket_server'''''&lt;br /&gt;
&lt;br /&gt;
Una vez instalada la librería, hay que empezar a escribir el código.&lt;br /&gt;
&lt;br /&gt;
El encabezado del código es el siguiente&lt;br /&gt;
El uso de cada librería se explica con detalle mas adelante&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Encabezado.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A partir de la librería '''sys''' se define el camino del sistema para utilizar los plugin Butiá.&lt;br /&gt;
En nuestro caso, la ruta es ''' '/home/trerb/TurtleBots.activity/plugins/butia' ''', eso se tiene que modificar dependiendo de donde se encuentren el directorio ''' TurtleBots.activity/ ''' en su sistema de archivos&lt;br /&gt;
&lt;br /&gt;
[[Archivo:UsoPluginButia.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego se encuentra la función ''' clearConsole ''',&lt;br /&gt;
Esta función sirve únicamente para limpiar el interprete de Python usando la librería ''' os ''' y tener una ejecución mas limpia&lt;br /&gt;
&lt;br /&gt;
[[Archivo:clearConsole().png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
El siguiente código utiliza la librería ''' socket ''' para conectarse a la web y preguntar la ip del ordenador que ejecuta el archivo y la muestra en pantalla, esto se usa para facilitar la conexión con la App Mobile&lt;br /&gt;
&lt;br /&gt;
[[Archivo:conexionSocket.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Las siguientes líneas de código preguntan al usuario que puerto va a utilizar para la conexión, este código verifica que se ingrese un dato numérico, dentro del rango de los puertos, y que el puerto este disponible.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:tryPuerto.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego se declaran las variables: ''' Speed, Puerto_Gris y Puerto_Distancia ''', se verifica que los sensores de distancia y de grises estén conectados y asigna el puerto en el que estén conectados a las variables ''' Puerto_Distancia ''' y ''' Puerto_Gris ''' respectivamente. La variable ''' Speed ''' es una variable global que se lee al inicio de cada cadena de acciones y la utiliza para todos los movimientos del Butiá de esa cadena.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:declaracionVariables.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Seguimos con la declaración de las funciones básicas del Butiá, en este caso son ''' Avanzar, Rotar, AvanzarHastaVerColor y AvanzarHastaObstaculo ''' &lt;br /&gt;
&lt;br /&gt;
-La función ''' Avanzar ''' recibe un parámetro de tiempo y el Butiá avanza ese determinado tiempo.&lt;br /&gt;
&lt;br /&gt;
-La función ''' Retroceder ''' recibe un parámetro de tiempo y el Butiá retrocede ese determinado tiempo.&lt;br /&gt;
&lt;br /&gt;
-La función ''' Rotar ''' recibe dos parámetros, una dirección que puede ser Izquierda o Derecha y un tiempo que indica la duración de la rotación del Butiá.&lt;br /&gt;
&lt;br /&gt;
-La función ''' AvanzarHastaVerColor ''' recibe un parámetro que varia entre Blanco o Negro, el robot va a avanzar hasta detectar el color seleccionado.&lt;br /&gt;
Esta función solo se puede usar si el sensor de grises esta conectado.&lt;br /&gt;
&lt;br /&gt;
-Por ultimo, la función ''' AvanzarHastaObstaculo ''' no recibe parámetros, en este caso el Butiá va a avanzar hasta estar a unos pocos centímetros de un obstáculo.&lt;br /&gt;
Esta función solo se puede usar si el sensor de distancia esta conectado.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:FuncionesBasicas.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego se encuentra una función ''' Accion1 ''' esta función la puede definir el usuario a gusto, se puede implementar desde una función básica hasta un seguidor de líneas avanzado. La única condición que se necesita para implementar esta ''' Accion1 ''' es que no puede recibir parámetros&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Accion1.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ahora tenemos que definir el menú principal del programa, este se divide en dos funciones&lt;br /&gt;
&lt;br /&gt;
- ''' handle ''': Esta es una función predeterminada de la librería ''' simple_web_socket ''' y se llama cada vez que el servidor recibe un dato del cliente. En este caso la función crea una lista de las acciones que le llegan de la App Mobile, y las va ejecutando ordenadamente&lt;br /&gt;
&lt;br /&gt;
- ''' handle_close ''': Al igual que la función anterior, esta también es una función predeterminada de la librería ''' simple_web_socket ''' y se llama cuando el cliente se desconecta del servidor&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Screenshot from 2021-06-27 03-58-56.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Y por ultimo tenemos el dos líneas de codigo, la primera se encarga de abrir el servidor y la segunda lo mantiene abierto infinitamente&lt;br /&gt;
&lt;br /&gt;
[[Archivo:abrirServidor.png]]&lt;br /&gt;
&lt;br /&gt;
== Implementación codigo React ==&lt;br /&gt;
&lt;br /&gt;
La aplicacion movil esta implementada con React Native, ademas, se utiliza el ''framework'' [https://docs.expo.io/ Expo]. Este ''framework'' nos brinda un conjunto de herramientas que facilita el desarrollo de aplicaciones mobiles. &lt;br /&gt;
En caso de querer agregar, o modificar cualidades, es necesario proceder de la siguiente forma:&lt;br /&gt;
&lt;br /&gt;
Descargar el archivo comprimido adjunto.&lt;br /&gt;
&lt;br /&gt;
Extraerlo, posicionarse en el directorio raiz de la carpeta descomprimida, y ejecutar desde la terminal lo siguiente (tener en cuenta que es necesario tener en la maquina, el gestor de paquetes [https://docs.npmjs.com/ npm]).&lt;br /&gt;
&lt;br /&gt;
''''npm install'''' &lt;br /&gt;
&lt;br /&gt;
Esto descarga las dependencias que utiliza la aplicación, luego de esto podemos empezar a desarrollar.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para visualizar los cambios en tiempo real mientras desarrollamos, es necesario instalar la aplicación Expo Go para [https://play.google.com/store/apps/details?id=host.exp.exponent&amp;amp;hl=es_UY&amp;amp;gl=US Android] o para [https://apps.apple.com/es/app/expo-go/id982107779 iOS] según sea el caso.&lt;br /&gt;
&lt;br /&gt;
Para a visualizar la app en desarrollo desde Expo Go, procedemos de la siguiente forma:&lt;br /&gt;
Desde el directorio raíz de la aplicación ejecutamos desde la terminal lo siguiente:&lt;br /&gt;
&lt;br /&gt;
''''npm start''''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego, desde la aplicación Expo Go, con el celular conectado en la misma red local accedemos a la aplicación seleccionando lo siguiente:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Expo.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hecho esto, podemos cambiar el código de la aplicación y ver reflejados los cambios de forma casi instantánea.&lt;br /&gt;
&lt;br /&gt;
La aplicacion esta compuesta por dos pantallas, la pantalla de configuracion (''ConfigScreen.js''), donde se ingresa la direccion ip y puerto del servidor, y la pantalla principal (''MainScreen.js''), donde se lleva a cabo la programacion del robot mediante acciones.&lt;br /&gt;
&lt;br /&gt;
Esta ultima pantalla esta compuesta por los componentes ''TopList.js'' y ''BottomList.js''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Untitled presentation.png]]&lt;br /&gt;
&lt;br /&gt;
Para agregar una nueva accion al sistema, es necesario programarla en el servidor con un deteminado nombre, supondremos &amp;quot;AccionN&amp;quot;, esto resulta facil si se toma como ejemplo las acciones ya implementadas.&lt;br /&gt;
&lt;br /&gt;
En la aplicacion, esta nueva accion se agrega en el array &amp;quot;''actionsData''&amp;quot;, dicho array se encuentra en la palntalla principal, es decir en el archivo &amp;quot;''MainScreen.js''&amp;quot;, cada accion cuenta con los siguientes datos:&lt;br /&gt;
&lt;br /&gt;
-'''idAccion:''' Identificador de la accion en dicho arreglo (actionsData).&lt;br /&gt;
&lt;br /&gt;
-'''title:''': Titulo de la accion que se muetra en el panel superior.&lt;br /&gt;
&lt;br /&gt;
-'''actionId:''' Nombre identificador de la accion en el servidor.&lt;br /&gt;
&lt;br /&gt;
-'''overlay:''': ''Overlay'' que se despliega al seleccionar la accion si esta lleva un parametro, esta funcion lleva como parametro &amp;quot;''editOverlay''&amp;quot; y &amp;quot;''id''&amp;quot; (parametros que se utilizan cuando se requiere cambiar el valor del parametro de la accuion que ya fue seleccionada y se encuentra en el panel inferior), como por ejemplo pueden ser segundos en el caso de la accion &amp;quot;Avanzar&amp;quot;, o colores en el caso de &amp;quot;Avanzar hasta obstaculo&amp;quot;. Este parametro puede ser que no sea necesario, como es en el caso de la accion &amp;quot;Avanzar hasta obstaculo&amp;quot;, en este ultimo caso el valor de este campo es null.&lt;br /&gt;
&lt;br /&gt;
Ejemplo de la accion &amp;quot;Avanzar&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Screenshot from 2021-06-27 04-18-42.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ejemplo de la accion &amp;quot;Avanzar hasta obstaculo&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Screenshot_from_2021-06-27_00-28-32.png]]&lt;br /&gt;
&lt;br /&gt;
== Manual de uso de la aplicación ==&lt;br /&gt;
&lt;br /&gt;
Aunque la aplicación resulta intuitiva y fácil de usar se describe a continuación una serie de pasos para utilizarla correctamente.&lt;br /&gt;
&lt;br /&gt;
Para comenzar a utilizar la aplicación es necesario configurar la conexión de la aplicación con el servidor (recordar que ambos se deben encontrar ejecutándose en la misma red local), el servidor ejecutando en una computadora que esté conectada correctamente al butiá (con los sensores descritos anteriormente) y la aplicación ejecutándose en el celular.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Conectando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego que la conexión haya resultado exitosa, nos encontramos en la página principal. En el panel superior, como se muestra a continuación, se encuentran las aplicaciones disponibles que podemos ejecutar en el robot butiá.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Acciones.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para agregar una serie de acciones al robot, simplemente presionamos la que queramos, a continuación esta aparecerá en el panel inferior, a medida de que vayamos seleccionando acciones, estas se irán encadenando una tras otras, estas estarán prontas para ejecutarse secuencialmente, desde la parte inferior, a la parte superior, en el momento que presionemos el botón &amp;quot;Empezar&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Agregando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Como la aplicación está pensada para planificar algoritmos para resolver desafíos o ''puzzles'', es probable que nos equivoquemos y seleccionemos una acción o insertemos un parámetro incorrectamente, ¡pero no te preocupes!. Para editar el parámetro que le hayamos ingresado a una acción, simplemente mantenemos pulsado la que deseamos corregir e ingresamos el nuevo valor.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Editando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
También es posible eliminar una acción, para hacer esto, nuevamente mantenemos pulsada la acción que queremos eliminar, pero esta vez, seleccionamos la acción eliminar. A continuación la acción seleccionada desaparecerá del panel inferior. También es posible que deseemos eliminar todas las acciones que habíamos ingresado, en este caso seleccionamos el botón &amp;quot;Eliminar acciones&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Eliminando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es posible que queremos que el robot se desplace a ciertas velocidades, teniendo en cuenta que al modificar la velocidad, el robot tendrá un comportamiento totalmente diferente, debido a que gran parte de las acciones se ejecutan por un tiempo asignado, a mayor velocidad, más desplazamiento.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Velocidad.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En caso de que exista un error en la conexión, podemos intentar volver a conectar la aplicación al servidor, para esto seleccionamos la opción configuración.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:A configuracion.gif]]&lt;br /&gt;
&lt;br /&gt;
== Video de muestra ==&lt;br /&gt;
&lt;br /&gt;
== Mejoras a futuro ==&lt;br /&gt;
&lt;br /&gt;
* Implementar una forma para que las función ''' Accion1 ''' pueda recibir parámetros, para así ampliar la gama de problemas que se puedan solucionar a través de esta aplicación.&lt;br /&gt;
&lt;br /&gt;
* Implementación de código que permita añadir a través del código, una mayor cantidad de funciones genéricas a la aplicación.&lt;br /&gt;
&lt;br /&gt;
* Desarrollar una forma de comunicación bilateral entre la ''App Mobile'' y Python para mejorar el ''debug'' en tiempo de ejecución.&lt;br /&gt;
&lt;br /&gt;
== Archivos de uso ==&lt;/div&gt;</summary>
		<author><name>German.moreira</name></author>	</entry>

	<entry>
		<id>http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Archivo:Untitled_presentation.png&amp;diff=11633</id>
		<title>Archivo:Untitled presentation.png</title>
		<link rel="alternate" type="text/html" href="http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Archivo:Untitled_presentation.png&amp;diff=11633"/>
				<updated>2021-06-27T08:05:47Z</updated>
		
		<summary type="html">&lt;p&gt;German.moreira: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>German.moreira</name></author>	</entry>

	<entry>
		<id>http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Programando_el_Butia_desde_el_celular&amp;diff=11632</id>
		<title>Programando el Butia desde el celular</title>
		<link rel="alternate" type="text/html" href="http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Programando_el_Butia_desde_el_celular&amp;diff=11632"/>
				<updated>2021-06-27T07:53:02Z</updated>
		
		<summary type="html">&lt;p&gt;German.moreira: /* Objetivo y motivación */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Introducción ==&lt;br /&gt;
&lt;br /&gt;
La idea del proyecto en un principio era usar el celular como medio para controlar el robot Butiá para que resulte más atractivo para los estudiantes que no les guste la programación.&lt;br /&gt;
&lt;br /&gt;
Luego, la idea se modifico un poco debido a que descubrimos que con esta implementación, podíamos hacer mas sencilla la resolución de algunos ejercicios básicos mediante algoritmos mas simplificados, tomamos el trabajo que teníamos hecho hasta el momento y lo adaptamos a un menú con distintas acciones simples como avanzar un determinado tiempo, avanzar hasta chocar contra un objeto o rotar a la izquierda o derecha un determinado tiempo.&lt;br /&gt;
&lt;br /&gt;
Estas funciones básicas y bastante sencillas de entender más una interfaz amigable y fácil de usar, se implementaron para que el rango de edad de uso de esta aplicación vaya de 3 años en adelante.&lt;br /&gt;
&lt;br /&gt;
Como resultado obtuvimos una aplicación que se puede usar para que niños de:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- 4 / 5 / 6 años resuelvan ejercicios sencillos como puede ser llegar de un punto a otro, buscar el camino a un objeto o resolver un laberinto sencillo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- 7 / 8 / 9 años puedan resolver ejercicios un poco más complejos como puede ser resolver un laberinto del más sencillo al mas complejo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- 10 años en adelante tengan la capacidad de adaptar una parte personal de código al programa y puedan resolver cualquier ejercicio que se pueda plantear con el robot Butiá.&lt;br /&gt;
&lt;br /&gt;
== Objetivo y motivación==&lt;br /&gt;
&lt;br /&gt;
Los objetivos del proyecto eran, como dice el nombre, poder conectar remotamente el robot Butiá a un celular y buscar una abstracción de la mayor cantidad de problemas que puedan ser resueltos con el robot Butiá.&lt;br /&gt;
&lt;br /&gt;
Esto, para poder crear un método de uso del robot Butiá más dinámico y con funciones que permiten realizar, mediante algoritmos mas sencillos, la solución de la mayor cantidad de puzles particulares, abstrayéndose de la programación directa, lo que puede ser tedioso o abrumador para personas que tienen su primer acercamiento a la programación.&lt;br /&gt;
&lt;br /&gt;
Al hacer esto, el nivel de uso en aulas del robot Butiá, puede simplificarse hasta clases desde 3 años de jardinera en adelante, debido a que la aplicación simplifica la parte de codificación y los algoritmos de solución de ejercicios se convierten simplemente en una serie de pasos básicos a ejecutar linealmente.&lt;br /&gt;
&lt;br /&gt;
Lo que se busca con este proyecto, es despertar la curiosidad e interés en niños y adolescentes en el área de la programación, de una forma didáctica en la que estos pueden experimentar directamente con el robot y potenciar la creatividad para resolver problemas. &lt;br /&gt;
&lt;br /&gt;
La aplicación esta inspirada en el lenguaje &amp;quot;Sratch&amp;quot;, el cual es un lenguaje ideal como primera aproximación a la programación. &lt;br /&gt;
&lt;br /&gt;
Este ''software'' permite ademas, introducir conceptos como, instrucciones, secuencialidad de código, algoritmos, secuencias de control, estructuras de repetición, etc. Como ejercicio, se puede plantear por ejemplo, hacer el pasaje de algoritmos diseñados en la aplicación en el Python.&lt;br /&gt;
&lt;br /&gt;
== Armado del Butiá ==&lt;br /&gt;
&lt;br /&gt;
* Paso 1: Armar el Butiá a partir de esta [https://www.fing.edu.uy/inco/proyectos/butia/files/docs_butia2/armando_paso_a_paso_motores_CC_rev1.pdf guía oficial]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Paso 2: Instalar el sensor de grises&lt;br /&gt;
&lt;br /&gt;
1:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP1.jpeg]] &lt;br /&gt;
&lt;br /&gt;
2:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP2.jpeg]]&lt;br /&gt;
&lt;br /&gt;
3:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP3.jpeg]]&lt;br /&gt;
&lt;br /&gt;
4:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP4.jpeg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Paso 3: Instalar el sensor de distancia&lt;br /&gt;
&lt;br /&gt;
1:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP1.png]]&lt;br /&gt;
&lt;br /&gt;
2:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP2.png]]&lt;br /&gt;
&lt;br /&gt;
3:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP3.png]]&lt;br /&gt;
&lt;br /&gt;
4:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP4.png]]&lt;br /&gt;
&lt;br /&gt;
== Protocolo de comunicación ==&lt;br /&gt;
El protocolo de comunicaron diseñado para la comunicación entre Servidor y Aplicación ''Mobile'' es el siguiente:&lt;br /&gt;
&lt;br /&gt;
'''''Accion0-S0\nAccion1-S1\nAccion2-S2\nAccion3\nAccion4-S4\nVelocidad'''''&lt;br /&gt;
&lt;br /&gt;
Donde, este ''string'' representa la serie encadenada de acciones que el servidor recibe para ejecutar en el robot desde la aplicación.&lt;br /&gt;
Cada acción esta separada de la que se encuentra a continuación por el símbolo &amp;quot;''\n''&amp;quot;.&lt;br /&gt;
Podemos diferenciar dos tipos de acciones, las que requieren parámetro y las que no, estas se comunican de la siguiente forma:&lt;br /&gt;
'''Acción con parámetro''': NombreAccion-Parametro&lt;br /&gt;
&lt;br /&gt;
'''Acción sin parámetro''': NombreAccion&lt;br /&gt;
&lt;br /&gt;
== Implementación código Python ==&lt;br /&gt;
&lt;br /&gt;
Antes de empezar a programar o usar el código, es necesario instalar las librerías a usar, esto se puede hacer escribiendo &lt;br /&gt;
&lt;br /&gt;
'''''pip install [nombre de la librería]''''' en el interprete de comandos del sistema.&lt;br /&gt;
&lt;br /&gt;
Entonces instalamos la librería a utilizar, en este caso:&lt;br /&gt;
&lt;br /&gt;
'''''pip install simple_websocket_server'''''&lt;br /&gt;
&lt;br /&gt;
Una vez instalada la librería, hay que empezar a escribir el código.&lt;br /&gt;
&lt;br /&gt;
El encabezado del código es el siguiente&lt;br /&gt;
El uso de cada librería se explica con detalle mas adelante&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Encabezado.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A partir de la librería '''sys''' se define el camino del sistema para utilizar los plugin Butiá.&lt;br /&gt;
En nuestro caso, la ruta es ''' '/home/trerb/TurtleBots.activity/plugins/butia' ''', eso se tiene que modificar dependiendo de donde se encuentren el directorio ''' TurtleBots.activity/ ''' en su sistema de archivos&lt;br /&gt;
&lt;br /&gt;
[[Archivo:UsoPluginButia.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego se encuentra la función ''' clearConsole ''',&lt;br /&gt;
Esta función sirve únicamente para limpiar el interprete de Python usando la librería ''' os ''' y tener una ejecución mas limpia&lt;br /&gt;
&lt;br /&gt;
[[Archivo:clearConsole().png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
El siguiente código utiliza la librería ''' socket ''' para conectarse a la web y preguntar la ip del ordenador que ejecuta el archivo y la muestra en pantalla, esto se usa para facilitar la conexión con la App Mobile&lt;br /&gt;
&lt;br /&gt;
[[Archivo:conexionSocket.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Las siguientes líneas de código preguntan al usuario que puerto va a utilizar para la conexión, este código verifica que se ingrese un dato numérico, dentro del rango de los puertos, y que el puerto este disponible.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:tryPuerto.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego se declaran las variables: ''' Speed, Puerto_Gris y Puerto_Distancia ''', se verifica que los sensores de distancia y de grises estén conectados y asigna el puerto en el que estén conectados a las variables ''' Puerto_Distancia ''' y ''' Puerto_Gris ''' respectivamente. La variable ''' Speed ''' es una variable global que se lee al inicio de cada cadena de acciones y la utiliza para todos los movimientos del Butiá de esa cadena.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:declaracionVariables.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Seguimos con la declaración de las funciones básicas del Butiá, en este caso son ''' Avanzar, Rotar, AvanzarHastaVerColor y AvanzarHastaObstaculo ''' &lt;br /&gt;
&lt;br /&gt;
-La función ''' Avanzar ''' recibe un parámetro de tiempo y el Butiá avanza ese determinado tiempo.&lt;br /&gt;
&lt;br /&gt;
-La función ''' Retroceder ''' recibe un parámetro de tiempo y el Butiá retrocede ese determinado tiempo.&lt;br /&gt;
&lt;br /&gt;
-La función ''' Rotar ''' recibe dos parámetros, una dirección que puede ser Izquierda o Derecha y un tiempo que indica la duración de la rotación del Butiá.&lt;br /&gt;
&lt;br /&gt;
-La función ''' AvanzarHastaVerColor ''' recibe un parámetro que varia entre Blanco o Negro, el robot va a avanzar hasta detectar el color seleccionado.&lt;br /&gt;
Esta función solo se puede usar si el sensor de grises esta conectado.&lt;br /&gt;
&lt;br /&gt;
-Por ultimo, la función ''' AvanzarHastaObstaculo ''' no recibe parámetros, en este caso el Butiá va a avanzar hasta estar a unos pocos centímetros de un obstáculo.&lt;br /&gt;
Esta función solo se puede usar si el sensor de distancia esta conectado.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:FuncionesBasicas.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego se encuentra una función ''' Accion1 ''' esta función la puede definir el usuario a gusto, se puede implementar desde una función básica hasta un seguidor de líneas avanzado. La única condición que se necesita para implementar esta ''' Accion1 ''' es que no puede recibir parámetros&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Accion1.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ahora tenemos que definir el menú principal del programa, este se divide en dos funciones&lt;br /&gt;
&lt;br /&gt;
- ''' handle ''': Esta es una función predeterminada de la librería ''' simple_web_socket ''' y se llama cada vez que el servidor recibe un dato del cliente. En este caso la función crea una lista de las acciones que le llegan de la App Mobile, y las va ejecutando ordenadamente&lt;br /&gt;
&lt;br /&gt;
- ''' handle_close ''': Al igual que la función anterior, esta también es una función predeterminada de la librería ''' simple_web_socket ''' y se llama cuando el cliente se desconecta del servidor&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Screenshot from 2021-06-27 03-58-56.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Y por ultimo tenemos el dos líneas de codigo, la primera se encarga de abrir el servidor y la segunda lo mantiene abierto infinitamente&lt;br /&gt;
&lt;br /&gt;
[[Archivo:abrirServidor.png]]&lt;br /&gt;
&lt;br /&gt;
== Implementación codigo React ==&lt;br /&gt;
&lt;br /&gt;
La aplicacion movil esta implementada con React Native, ademas, se utiliza el ''framework'' [https://docs.expo.io/ Expo]. Este ''framework'' nos brinda un conjunto de herramientas que facilita el desarrollo de aplicaciones mobiles. &lt;br /&gt;
En caso de querer agregar, o modificar cualidades, es necesario proceder de la siguiente forma:&lt;br /&gt;
&lt;br /&gt;
Descargar el archivo comprimido adjunto.&lt;br /&gt;
&lt;br /&gt;
Extraerlo, posicionarse en el directorio raiz de la carpeta descomprimida, y ejecutar desde la terminal lo siguiente (tener en cuenta que es necesario tener en la maquina, el gestor de paquetes [https://docs.npmjs.com/ npm]).&lt;br /&gt;
&lt;br /&gt;
''''npm install'''' &lt;br /&gt;
&lt;br /&gt;
Esto descarga las dependencias que utiliza la aplicación, luego de esto podemos empezar a desarrollar.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para visualizar los cambios en tiempo real mientras desarrollamos, es necesario instalar la aplicación Expo Go para [https://play.google.com/store/apps/details?id=host.exp.exponent&amp;amp;hl=es_UY&amp;amp;gl=US Android] o para [https://apps.apple.com/es/app/expo-go/id982107779 iOS] según sea el caso.&lt;br /&gt;
&lt;br /&gt;
Para a visualizar la app en desarrollo desde Expo Go, procedemos de la siguiente forma:&lt;br /&gt;
Desde el directorio raíz de la aplicación ejecutamos desde la terminal lo siguiente:&lt;br /&gt;
&lt;br /&gt;
''''npm start''''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego, desde la aplicación Expo Go, con el celular conectado en la misma red local accedemos a la aplicación seleccionando lo siguiente:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Expo.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hecho esto, podemos cambiar el código de la aplicación y ver reflejados los cambios de forma casi instantánea.&lt;br /&gt;
&lt;br /&gt;
La aplicacion esta compuesta por dos pantallas, la pantalla de configuracion (''ConfigScreen.js''), donde se ingresa la direccion ip y puerto del servidor, y la pantalla principal (''MainScreen.js''), donde se lleva a cabo la programacion del robot mediante acciones.&lt;br /&gt;
&lt;br /&gt;
Esta ultima pantalla esta compuesta por los componentes ''TopList.js'' y ''BoottomList.js''.&lt;br /&gt;
&lt;br /&gt;
Para agregar una nueva accion al sistema, es necesario programarla en el servidor con un deteminado nombre, supondremos &amp;quot;AccionN&amp;quot;, esto resulta facil si se toma como ejemplo las acciones ya implementadas.&lt;br /&gt;
&lt;br /&gt;
En la aplicacion, esta nueva accion se agrega en el array &amp;quot;''actionsData''&amp;quot;, dicho array se encuentra en la palntalla principal, es decir en el archivo &amp;quot;''MainScreen.js''&amp;quot;, cada accion cuenta con los siguientes datos:&lt;br /&gt;
&lt;br /&gt;
-'''idAccion:''' Identificador de la accion en dicho arreglo (actionsData).&lt;br /&gt;
&lt;br /&gt;
-'''title:''': Titulo de la accion que se muetra en el panel superior.&lt;br /&gt;
&lt;br /&gt;
-'''actionId:''' Nombre identificador de la accion en el servidor.&lt;br /&gt;
&lt;br /&gt;
-'''overlay:''': ''Overlay'' que se despliega al seleccionar la accion si esta lleva un parametro, esta funcion lleva como parametro &amp;quot;''editOverlay''&amp;quot; y &amp;quot;''id''&amp;quot; (parametros que se utilizan cuando se requiere cambiar el valor del parametro de la accuion que ya fue seleccionada y se encuentra en el panel inferior), como por ejemplo pueden ser segundos en el caso de la accion &amp;quot;Avanzar&amp;quot;, o colores en el caso de &amp;quot;Avanzar hasta obstaculo&amp;quot;. Este parametro puede ser que no sea necesario, como es en el caso de la accion &amp;quot;Avanzar hasta obstaculo&amp;quot;, en este ultimo caso el valor de este campo es null.&lt;br /&gt;
&lt;br /&gt;
Ejemplo de la accion &amp;quot;Avanzar&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Screenshot from 2021-06-27 04-18-42.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ejemplo de la accion &amp;quot;Avanzar hasta obstaculo&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Screenshot_from_2021-06-27_00-28-32.png]]&lt;br /&gt;
&lt;br /&gt;
== Manual de uso de la aplicación ==&lt;br /&gt;
&lt;br /&gt;
Aunque la aplicación resulta intuitiva y fácil de usar se describe a continuación una serie de pasos para utilizarla correctamente.&lt;br /&gt;
&lt;br /&gt;
Para comenzar a utilizar la aplicación es necesario configurar la conexión de la aplicación con el servidor (recordar que ambos se deben encontrar ejecutándose en la misma red local), el servidor ejecutando en una computadora que esté conectada correctamente al butiá (con los sensores descritos anteriormente) y la aplicación ejecutándose en el celular.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Conectando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego que la conexión haya resultado exitosa, nos encontramos en la página principal. En el panel superior, como se muestra a continuación, se encuentran las aplicaciones disponibles que podemos ejecutar en el robot butiá.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Acciones.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para agregar una serie de acciones al robot, simplemente presionamos la que queramos, a continuación esta aparecerá en el panel inferior, a medida de que vayamos seleccionando acciones, estas se irán encadenando una tras otras, estas estarán prontas para ejecutarse secuencialmente, desde la parte inferior, a la parte superior, en el momento que presionemos el botón &amp;quot;Empezar&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Agregando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Como la aplicación está pensada para planificar algoritmos para resolver desafíos o ''puzzles'', es probable que nos equivoquemos y seleccionemos una acción o insertemos un parámetro incorrectamente, ¡pero no te preocupes!. Para editar el parámetro que le hayamos ingresado a una acción, simplemente mantenemos pulsado la que deseamos corregir e ingresamos el nuevo valor.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Editando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
También es posible eliminar una acción, para hacer esto, nuevamente mantenemos pulsada la acción que queremos eliminar, pero esta vez, seleccionamos la acción eliminar. A continuación la acción seleccionada desaparecerá del panel inferior. También es posible que deseemos eliminar todas las acciones que habíamos ingresado, en este caso seleccionamos el botón &amp;quot;Eliminar acciones&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Eliminando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es posible que queremos que el robot se desplace a ciertas velocidades, teniendo en cuenta que al modificar la velocidad, el robot tendrá un comportamiento totalmente diferente, debido a que gran parte de las acciones se ejecutan por un tiempo asignado, a mayor velocidad, más desplazamiento.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Velocidad.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En caso de que exista un error en la conexión, podemos intentar volver a conectar la aplicación al servidor, para esto seleccionamos la opción configuración.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:A configuracion.gif]]&lt;br /&gt;
&lt;br /&gt;
== Video de muestra ==&lt;br /&gt;
&lt;br /&gt;
== Mejoras a futuro ==&lt;br /&gt;
&lt;br /&gt;
* Implementar una forma para que las función ''' Accion1 ''' pueda recibir parámetros, para así ampliar la gama de problemas que se puedan solucionar a través de esta aplicación.&lt;br /&gt;
&lt;br /&gt;
* Implementación de código que permita añadir a través del código, una mayor cantidad de funciones genéricas a la aplicación.&lt;br /&gt;
&lt;br /&gt;
* Desarrollar una forma de comunicación bilateral entre la ''App Mobile'' y Python para mejorar el ''debug'' en tiempo de ejecución.&lt;br /&gt;
&lt;br /&gt;
== Archivos de uso ==&lt;/div&gt;</summary>
		<author><name>German.moreira</name></author>	</entry>

	<entry>
		<id>http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Programando_el_Butia_desde_el_celular&amp;diff=11631</id>
		<title>Programando el Butia desde el celular</title>
		<link rel="alternate" type="text/html" href="http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Programando_el_Butia_desde_el_celular&amp;diff=11631"/>
				<updated>2021-06-27T07:47:47Z</updated>
		
		<summary type="html">&lt;p&gt;German.moreira: /* Armado del Butiá */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Introducción ==&lt;br /&gt;
&lt;br /&gt;
La idea del proyecto en un principio era usar el celular como medio para controlar el robot Butiá para que resulte más atractivo para los estudiantes que no les guste la programación.&lt;br /&gt;
&lt;br /&gt;
Luego, la idea se modifico un poco debido a que descubrimos que con esta implementación, podíamos hacer mas sencilla la resolución de algunos ejercicios básicos mediante algoritmos mas simplificados, tomamos el trabajo que teníamos hecho hasta el momento y lo adaptamos a un menú con distintas acciones simples como avanzar un determinado tiempo, avanzar hasta chocar contra un objeto o rotar a la izquierda o derecha un determinado tiempo.&lt;br /&gt;
&lt;br /&gt;
Estas funciones básicas y bastante sencillas de entender más una interfaz amigable y fácil de usar, se implementaron para que el rango de edad de uso de esta aplicación vaya de 3 años en adelante.&lt;br /&gt;
&lt;br /&gt;
Como resultado obtuvimos una aplicación que se puede usar para que niños de:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- 4 / 5 / 6 años resuelvan ejercicios sencillos como puede ser llegar de un punto a otro, buscar el camino a un objeto o resolver un laberinto sencillo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- 7 / 8 / 9 años puedan resolver ejercicios un poco más complejos como puede ser resolver un laberinto del más sencillo al mas complejo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- 10 años en adelante tengan la capacidad de adaptar una parte personal de código al programa y puedan resolver cualquier ejercicio que se pueda plantear con el robot Butiá.&lt;br /&gt;
&lt;br /&gt;
== Objetivo y motivación==&lt;br /&gt;
&lt;br /&gt;
Los objetivos del proyecto eran, como dice el nombre, poder conectar remotamente el robot Butiá a un celular y buscar una abstracción de la mayor cantidad de problemas que puedan ser resueltos con el robot Butiá.&lt;br /&gt;
&lt;br /&gt;
Esto, para poder crear un método de uso del robot Butiá más dinámico y con funciones que permiten realizar, mediante algoritmos mas sencillos, la solución de la mayor cantidad de puzles particulares, abstrayéndose de la programación directa, lo que puede ser tedioso o abrumador para personas que tienen su primer acercamiento a la programación.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Al hacer esto el nivel de uso en aulas del robot Butiá, puede simplificarse hasta clases desde 3 años de jardinera en adelante, debido a que la aplicación simplifica la parte de codificación y los algoritmos de solución de ejercicios se convierten simplemente en una serie de pasos básicos a ejecutar linealmente.&lt;br /&gt;
&lt;br /&gt;
Lo que se busca con este proyecto, es despertar la curiosidad e interés en niños y adolescentes en el área de la programación de una forma didáctica en la que los alumnos pueden experimentar directamente con el robot y potenciar la creatividad para resolver problemas. &lt;br /&gt;
&lt;br /&gt;
La aplicación esta inspirada en el lenguaje &amp;quot;Sratch&amp;quot;, el cual es un lenguaje ideal como primera aproximación a la programación. &lt;br /&gt;
&lt;br /&gt;
Este ''software'' ademas permite ademas, introducir conceptos como, instrucciones, secuencialidad de código, algoritmos, secuencias de control, estructuras de repetición etc.&lt;br /&gt;
&lt;br /&gt;
== Armado del Butiá ==&lt;br /&gt;
&lt;br /&gt;
* Paso 1: Armar el Butiá a partir de esta [https://www.fing.edu.uy/inco/proyectos/butia/files/docs_butia2/armando_paso_a_paso_motores_CC_rev1.pdf guía oficial]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Paso 2: Instalar el sensor de grises&lt;br /&gt;
&lt;br /&gt;
1:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP1.jpeg]] &lt;br /&gt;
&lt;br /&gt;
2:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP2.jpeg]]&lt;br /&gt;
&lt;br /&gt;
3:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP3.jpeg]]&lt;br /&gt;
&lt;br /&gt;
4:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP4.jpeg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Paso 3: Instalar el sensor de distancia&lt;br /&gt;
&lt;br /&gt;
1:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP1.png]]&lt;br /&gt;
&lt;br /&gt;
2:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP2.png]]&lt;br /&gt;
&lt;br /&gt;
3:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP3.png]]&lt;br /&gt;
&lt;br /&gt;
4:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP4.png]]&lt;br /&gt;
&lt;br /&gt;
== Protocolo de comunicación ==&lt;br /&gt;
El protocolo de comunicaron diseñado para la comunicación entre Servidor y Aplicación ''Mobile'' es el siguiente:&lt;br /&gt;
&lt;br /&gt;
'''''Accion0-S0\nAccion1-S1\nAccion2-S2\nAccion3\nAccion4-S4\nVelocidad'''''&lt;br /&gt;
&lt;br /&gt;
Donde, este ''string'' representa la serie encadenada de acciones que el servidor recibe para ejecutar en el robot desde la aplicación.&lt;br /&gt;
Cada acción esta separada de la que se encuentra a continuación por el símbolo &amp;quot;''\n''&amp;quot;.&lt;br /&gt;
Podemos diferenciar dos tipos de acciones, las que requieren parámetro y las que no, estas se comunican de la siguiente forma:&lt;br /&gt;
'''Acción con parámetro''': NombreAccion-Parametro&lt;br /&gt;
&lt;br /&gt;
'''Acción sin parámetro''': NombreAccion&lt;br /&gt;
&lt;br /&gt;
== Implementación código Python ==&lt;br /&gt;
&lt;br /&gt;
Antes de empezar a programar o usar el código, es necesario instalar las librerías a usar, esto se puede hacer escribiendo &lt;br /&gt;
&lt;br /&gt;
'''''pip install [nombre de la librería]''''' en el interprete de comandos del sistema.&lt;br /&gt;
&lt;br /&gt;
Entonces instalamos la librería a utilizar, en este caso:&lt;br /&gt;
&lt;br /&gt;
'''''pip install simple_websocket_server'''''&lt;br /&gt;
&lt;br /&gt;
Una vez instalada la librería, hay que empezar a escribir el código.&lt;br /&gt;
&lt;br /&gt;
El encabezado del código es el siguiente&lt;br /&gt;
El uso de cada librería se explica con detalle mas adelante&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Encabezado.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A partir de la librería '''sys''' se define el camino del sistema para utilizar los plugin Butiá.&lt;br /&gt;
En nuestro caso, la ruta es ''' '/home/trerb/TurtleBots.activity/plugins/butia' ''', eso se tiene que modificar dependiendo de donde se encuentren el directorio ''' TurtleBots.activity/ ''' en su sistema de archivos&lt;br /&gt;
&lt;br /&gt;
[[Archivo:UsoPluginButia.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego se encuentra la función ''' clearConsole ''',&lt;br /&gt;
Esta función sirve únicamente para limpiar el interprete de Python usando la librería ''' os ''' y tener una ejecución mas limpia&lt;br /&gt;
&lt;br /&gt;
[[Archivo:clearConsole().png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
El siguiente código utiliza la librería ''' socket ''' para conectarse a la web y preguntar la ip del ordenador que ejecuta el archivo y la muestra en pantalla, esto se usa para facilitar la conexión con la App Mobile&lt;br /&gt;
&lt;br /&gt;
[[Archivo:conexionSocket.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Las siguientes líneas de código preguntan al usuario que puerto va a utilizar para la conexión, este código verifica que se ingrese un dato numérico, dentro del rango de los puertos, y que el puerto este disponible.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:tryPuerto.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego se declaran las variables: ''' Speed, Puerto_Gris y Puerto_Distancia ''', se verifica que los sensores de distancia y de grises estén conectados y asigna el puerto en el que estén conectados a las variables ''' Puerto_Distancia ''' y ''' Puerto_Gris ''' respectivamente. La variable ''' Speed ''' es una variable global que se lee al inicio de cada cadena de acciones y la utiliza para todos los movimientos del Butiá de esa cadena.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:declaracionVariables.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Seguimos con la declaración de las funciones básicas del Butiá, en este caso son ''' Avanzar, Rotar, AvanzarHastaVerColor y AvanzarHastaObstaculo ''' &lt;br /&gt;
&lt;br /&gt;
-La función ''' Avanzar ''' recibe un parámetro de tiempo y el Butiá avanza ese determinado tiempo.&lt;br /&gt;
&lt;br /&gt;
-La función ''' Retroceder ''' recibe un parámetro de tiempo y el Butiá retrocede ese determinado tiempo.&lt;br /&gt;
&lt;br /&gt;
-La función ''' Rotar ''' recibe dos parámetros, una dirección que puede ser Izquierda o Derecha y un tiempo que indica la duración de la rotación del Butiá.&lt;br /&gt;
&lt;br /&gt;
-La función ''' AvanzarHastaVerColor ''' recibe un parámetro que varia entre Blanco o Negro, el robot va a avanzar hasta detectar el color seleccionado.&lt;br /&gt;
Esta función solo se puede usar si el sensor de grises esta conectado.&lt;br /&gt;
&lt;br /&gt;
-Por ultimo, la función ''' AvanzarHastaObstaculo ''' no recibe parámetros, en este caso el Butiá va a avanzar hasta estar a unos pocos centímetros de un obstáculo.&lt;br /&gt;
Esta función solo se puede usar si el sensor de distancia esta conectado.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:FuncionesBasicas.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego se encuentra una función ''' Accion1 ''' esta función la puede definir el usuario a gusto, se puede implementar desde una función básica hasta un seguidor de líneas avanzado. La única condición que se necesita para implementar esta ''' Accion1 ''' es que no puede recibir parámetros&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Accion1.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ahora tenemos que definir el menú principal del programa, este se divide en dos funciones&lt;br /&gt;
&lt;br /&gt;
- ''' handle ''': Esta es una función predeterminada de la librería ''' simple_web_socket ''' y se llama cada vez que el servidor recibe un dato del cliente. En este caso la función crea una lista de las acciones que le llegan de la App Mobile, y las va ejecutando ordenadamente&lt;br /&gt;
&lt;br /&gt;
- ''' handle_close ''': Al igual que la función anterior, esta también es una función predeterminada de la librería ''' simple_web_socket ''' y se llama cuando el cliente se desconecta del servidor&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Screenshot from 2021-06-27 03-58-56.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Y por ultimo tenemos el dos líneas de codigo, la primera se encarga de abrir el servidor y la segunda lo mantiene abierto infinitamente&lt;br /&gt;
&lt;br /&gt;
[[Archivo:abrirServidor.png]]&lt;br /&gt;
&lt;br /&gt;
== Implementación codigo React ==&lt;br /&gt;
&lt;br /&gt;
La aplicacion movil esta implementada con React Native, ademas, se utiliza el ''framework'' [https://docs.expo.io/ Expo]. Este ''framework'' nos brinda un conjunto de herramientas que facilita el desarrollo de aplicaciones mobiles. &lt;br /&gt;
En caso de querer agregar, o modificar cualidades, es necesario proceder de la siguiente forma:&lt;br /&gt;
&lt;br /&gt;
Descargar el archivo comprimido adjunto.&lt;br /&gt;
&lt;br /&gt;
Extraerlo, posicionarse en el directorio raiz de la carpeta descomprimida, y ejecutar desde la terminal lo siguiente (tener en cuenta que es necesario tener en la maquina, el gestor de paquetes [https://docs.npmjs.com/ npm]).&lt;br /&gt;
&lt;br /&gt;
''''npm install'''' &lt;br /&gt;
&lt;br /&gt;
Esto descarga las dependencias que utiliza la aplicación, luego de esto podemos empezar a desarrollar.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para visualizar los cambios en tiempo real mientras desarrollamos, es necesario instalar la aplicación Expo Go para [https://play.google.com/store/apps/details?id=host.exp.exponent&amp;amp;hl=es_UY&amp;amp;gl=US Android] o para [https://apps.apple.com/es/app/expo-go/id982107779 iOS] según sea el caso.&lt;br /&gt;
&lt;br /&gt;
Para a visualizar la app en desarrollo desde Expo Go, procedemos de la siguiente forma:&lt;br /&gt;
Desde el directorio raíz de la aplicación ejecutamos desde la terminal lo siguiente:&lt;br /&gt;
&lt;br /&gt;
''''npm start''''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego, desde la aplicación Expo Go, con el celular conectado en la misma red local accedemos a la aplicación seleccionando lo siguiente:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Expo.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hecho esto, podemos cambiar el código de la aplicación y ver reflejados los cambios de forma casi instantánea.&lt;br /&gt;
&lt;br /&gt;
La aplicacion esta compuesta por dos pantallas, la pantalla de configuracion (''ConfigScreen.js''), donde se ingresa la direccion ip y puerto del servidor, y la pantalla principal (''MainScreen.js''), donde se lleva a cabo la programacion del robot mediante acciones.&lt;br /&gt;
&lt;br /&gt;
Esta ultima pantalla esta compuesta por los componentes ''TopList.js'' y ''BoottomList.js''.&lt;br /&gt;
&lt;br /&gt;
Para agregar una nueva accion al sistema, es necesario programarla en el servidor con un deteminado nombre, supondremos &amp;quot;AccionN&amp;quot;, esto resulta facil si se toma como ejemplo las acciones ya implementadas.&lt;br /&gt;
&lt;br /&gt;
En la aplicacion, esta nueva accion se agrega en el array &amp;quot;''actionsData''&amp;quot;, dicho array se encuentra en la palntalla principal, es decir en el archivo &amp;quot;''MainScreen.js''&amp;quot;, cada accion cuenta con los siguientes datos:&lt;br /&gt;
&lt;br /&gt;
-'''idAccion:''' Identificador de la accion en dicho arreglo (actionsData).&lt;br /&gt;
&lt;br /&gt;
-'''title:''': Titulo de la accion que se muetra en el panel superior.&lt;br /&gt;
&lt;br /&gt;
-'''actionId:''' Nombre identificador de la accion en el servidor.&lt;br /&gt;
&lt;br /&gt;
-'''overlay:''': ''Overlay'' que se despliega al seleccionar la accion si esta lleva un parametro, esta funcion lleva como parametro &amp;quot;''editOverlay''&amp;quot; y &amp;quot;''id''&amp;quot; (parametros que se utilizan cuando se requiere cambiar el valor del parametro de la accuion que ya fue seleccionada y se encuentra en el panel inferior), como por ejemplo pueden ser segundos en el caso de la accion &amp;quot;Avanzar&amp;quot;, o colores en el caso de &amp;quot;Avanzar hasta obstaculo&amp;quot;. Este parametro puede ser que no sea necesario, como es en el caso de la accion &amp;quot;Avanzar hasta obstaculo&amp;quot;, en este ultimo caso el valor de este campo es null.&lt;br /&gt;
&lt;br /&gt;
Ejemplo de la accion &amp;quot;Avanzar&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Screenshot from 2021-06-27 04-18-42.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ejemplo de la accion &amp;quot;Avanzar hasta obstaculo&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Screenshot_from_2021-06-27_00-28-32.png]]&lt;br /&gt;
&lt;br /&gt;
== Manual de uso de la aplicación ==&lt;br /&gt;
&lt;br /&gt;
Aunque la aplicación resulta intuitiva y fácil de usar se describe a continuación una serie de pasos para utilizarla correctamente.&lt;br /&gt;
&lt;br /&gt;
Para comenzar a utilizar la aplicación es necesario configurar la conexión de la aplicación con el servidor (recordar que ambos se deben encontrar ejecutándose en la misma red local), el servidor ejecutando en una computadora que esté conectada correctamente al butiá (con los sensores descritos anteriormente) y la aplicación ejecutándose en el celular.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Conectando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego que la conexión haya resultado exitosa, nos encontramos en la página principal. En el panel superior, como se muestra a continuación, se encuentran las aplicaciones disponibles que podemos ejecutar en el robot butiá.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Acciones.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para agregar una serie de acciones al robot, simplemente presionamos la que queramos, a continuación esta aparecerá en el panel inferior, a medida de que vayamos seleccionando acciones, estas se irán encadenando una tras otras, estas estarán prontas para ejecutarse secuencialmente, desde la parte inferior, a la parte superior, en el momento que presionemos el botón &amp;quot;Empezar&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Agregando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Como la aplicación está pensada para planificar algoritmos para resolver desafíos o ''puzzles'', es probable que nos equivoquemos y seleccionemos una acción o insertemos un parámetro incorrectamente, ¡pero no te preocupes!. Para editar el parámetro que le hayamos ingresado a una acción, simplemente mantenemos pulsado la que deseamos corregir e ingresamos el nuevo valor.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Editando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
También es posible eliminar una acción, para hacer esto, nuevamente mantenemos pulsada la acción que queremos eliminar, pero esta vez, seleccionamos la acción eliminar. A continuación la acción seleccionada desaparecerá del panel inferior. También es posible que deseemos eliminar todas las acciones que habíamos ingresado, en este caso seleccionamos el botón &amp;quot;Eliminar acciones&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Eliminando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es posible que queremos que el robot se desplace a ciertas velocidades, teniendo en cuenta que al modificar la velocidad, el robot tendrá un comportamiento totalmente diferente, debido a que gran parte de las acciones se ejecutan por un tiempo asignado, a mayor velocidad, más desplazamiento.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Velocidad.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En caso de que exista un error en la conexión, podemos intentar volver a conectar la aplicación al servidor, para esto seleccionamos la opción configuración.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:A configuracion.gif]]&lt;br /&gt;
&lt;br /&gt;
== Video de muestra ==&lt;br /&gt;
&lt;br /&gt;
== Mejoras a futuro ==&lt;br /&gt;
&lt;br /&gt;
* Implementar una forma para que las función ''' Accion1 ''' pueda recibir parámetros, para así ampliar la gama de problemas que se puedan solucionar a través de esta aplicación.&lt;br /&gt;
&lt;br /&gt;
* Implementación de código que permita añadir a través del código, una mayor cantidad de funciones genéricas a la aplicación.&lt;br /&gt;
&lt;br /&gt;
* Desarrollar una forma de comunicación bilateral entre la ''App Mobile'' y Python para mejorar el ''debug'' en tiempo de ejecución.&lt;br /&gt;
&lt;br /&gt;
== Archivos de uso ==&lt;/div&gt;</summary>
		<author><name>German.moreira</name></author>	</entry>

	<entry>
		<id>http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Programando_el_Butia_desde_el_celular&amp;diff=11630</id>
		<title>Programando el Butia desde el celular</title>
		<link rel="alternate" type="text/html" href="http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Programando_el_Butia_desde_el_celular&amp;diff=11630"/>
				<updated>2021-06-27T07:46:40Z</updated>
		
		<summary type="html">&lt;p&gt;German.moreira: /* Objetivo */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Introducción ==&lt;br /&gt;
&lt;br /&gt;
La idea del proyecto en un principio era usar el celular como medio para controlar el robot Butiá para que resulte más atractivo para los estudiantes que no les guste la programación.&lt;br /&gt;
&lt;br /&gt;
Luego, la idea se modifico un poco debido a que descubrimos que con esta implementación, podíamos hacer mas sencilla la resolución de algunos ejercicios básicos mediante algoritmos mas simplificados, tomamos el trabajo que teníamos hecho hasta el momento y lo adaptamos a un menú con distintas acciones simples como avanzar un determinado tiempo, avanzar hasta chocar contra un objeto o rotar a la izquierda o derecha un determinado tiempo.&lt;br /&gt;
&lt;br /&gt;
Estas funciones básicas y bastante sencillas de entender más una interfaz amigable y fácil de usar, se implementaron para que el rango de edad de uso de esta aplicación vaya de 3 años en adelante.&lt;br /&gt;
&lt;br /&gt;
Como resultado obtuvimos una aplicación que se puede usar para que niños de:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- 4 / 5 / 6 años resuelvan ejercicios sencillos como puede ser llegar de un punto a otro, buscar el camino a un objeto o resolver un laberinto sencillo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- 7 / 8 / 9 años puedan resolver ejercicios un poco más complejos como puede ser resolver un laberinto del más sencillo al mas complejo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- 10 años en adelante tengan la capacidad de adaptar una parte personal de código al programa y puedan resolver cualquier ejercicio que se pueda plantear con el robot Butiá.&lt;br /&gt;
&lt;br /&gt;
== Objetivo y motivación==&lt;br /&gt;
&lt;br /&gt;
Los objetivos del proyecto eran, como dice el nombre, poder conectar remotamente el robot Butiá a un celular y buscar una abstracción de la mayor cantidad de problemas que puedan ser resueltos con el robot Butiá.&lt;br /&gt;
&lt;br /&gt;
Esto, para poder crear un método de uso del robot Butiá más dinámico y con funciones que permiten realizar, mediante algoritmos mas sencillos, la solución de la mayor cantidad de puzles particulares, abstrayéndose de la programación directa, lo que puede ser tedioso o abrumador para personas que tienen su primer acercamiento a la programación.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Al hacer esto el nivel de uso en aulas del robot Butiá, puede simplificarse hasta clases desde 3 años de jardinera en adelante, debido a que la aplicación simplifica la parte de codificación y los algoritmos de solución de ejercicios se convierten simplemente en una serie de pasos básicos a ejecutar linealmente.&lt;br /&gt;
&lt;br /&gt;
Lo que se busca con este proyecto, es despertar la curiosidad e interés en niños y adolescentes en el área de la programación de una forma didáctica en la que los alumnos pueden experimentar directamente con el robot y potenciar la creatividad para resolver problemas. &lt;br /&gt;
&lt;br /&gt;
La aplicación esta inspirada en el lenguaje &amp;quot;Sratch&amp;quot;, el cual es un lenguaje ideal como primera aproximación a la programación. &lt;br /&gt;
&lt;br /&gt;
Este ''software'' ademas permite ademas, introducir conceptos como, instrucciones, secuencialidad de código, algoritmos, secuencias de control, estructuras de repetición etc.&lt;br /&gt;
&lt;br /&gt;
== Armado del Butiá ==&lt;br /&gt;
&lt;br /&gt;
* Paso 1: Armar el Butiá a partir de esta [https://www.fing.edu.uy/inco/proyectos/butia/files/docs_butia2/armando_paso_a_paso_motores_CC_rev1.pdf guía oficial]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''' Los siguientes pasos son opcionales '''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Paso 2: Instalar el sensor de grises&lt;br /&gt;
&lt;br /&gt;
1:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP1.jpeg]] &lt;br /&gt;
&lt;br /&gt;
2:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP2.jpeg]]&lt;br /&gt;
&lt;br /&gt;
3:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP3.jpeg]]&lt;br /&gt;
&lt;br /&gt;
4:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP4.jpeg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Paso 3: Instalar el sensor de distancia&lt;br /&gt;
&lt;br /&gt;
1:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP1.png]]&lt;br /&gt;
&lt;br /&gt;
2:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP2.png]]&lt;br /&gt;
&lt;br /&gt;
3:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP3.png]]&lt;br /&gt;
&lt;br /&gt;
4:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP4.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Protocolo de comunicación ==&lt;br /&gt;
El protocolo de comunicaron diseñado para la comunicación entre Servidor y Aplicación ''Mobile'' es el siguiente:&lt;br /&gt;
&lt;br /&gt;
'''''Accion0-S0\nAccion1-S1\nAccion2-S2\nAccion3\nAccion4-S4\nVelocidad'''''&lt;br /&gt;
&lt;br /&gt;
Donde, este ''string'' representa la serie encadenada de acciones que el servidor recibe para ejecutar en el robot desde la aplicación.&lt;br /&gt;
Cada acción esta separada de la que se encuentra a continuación por el símbolo &amp;quot;''\n''&amp;quot;.&lt;br /&gt;
Podemos diferenciar dos tipos de acciones, las que requieren parámetro y las que no, estas se comunican de la siguiente forma:&lt;br /&gt;
'''Acción con parámetro''': NombreAccion-Parametro&lt;br /&gt;
&lt;br /&gt;
'''Acción sin parámetro''': NombreAccion&lt;br /&gt;
&lt;br /&gt;
== Implementación código Python ==&lt;br /&gt;
&lt;br /&gt;
Antes de empezar a programar o usar el código, es necesario instalar las librerías a usar, esto se puede hacer escribiendo &lt;br /&gt;
&lt;br /&gt;
'''''pip install [nombre de la librería]''''' en el interprete de comandos del sistema.&lt;br /&gt;
&lt;br /&gt;
Entonces instalamos la librería a utilizar, en este caso:&lt;br /&gt;
&lt;br /&gt;
'''''pip install simple_websocket_server'''''&lt;br /&gt;
&lt;br /&gt;
Una vez instalada la librería, hay que empezar a escribir el código.&lt;br /&gt;
&lt;br /&gt;
El encabezado del código es el siguiente&lt;br /&gt;
El uso de cada librería se explica con detalle mas adelante&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Encabezado.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A partir de la librería '''sys''' se define el camino del sistema para utilizar los plugin Butiá.&lt;br /&gt;
En nuestro caso, la ruta es ''' '/home/trerb/TurtleBots.activity/plugins/butia' ''', eso se tiene que modificar dependiendo de donde se encuentren el directorio ''' TurtleBots.activity/ ''' en su sistema de archivos&lt;br /&gt;
&lt;br /&gt;
[[Archivo:UsoPluginButia.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego se encuentra la función ''' clearConsole ''',&lt;br /&gt;
Esta función sirve únicamente para limpiar el interprete de Python usando la librería ''' os ''' y tener una ejecución mas limpia&lt;br /&gt;
&lt;br /&gt;
[[Archivo:clearConsole().png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
El siguiente código utiliza la librería ''' socket ''' para conectarse a la web y preguntar la ip del ordenador que ejecuta el archivo y la muestra en pantalla, esto se usa para facilitar la conexión con la App Mobile&lt;br /&gt;
&lt;br /&gt;
[[Archivo:conexionSocket.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Las siguientes líneas de código preguntan al usuario que puerto va a utilizar para la conexión, este código verifica que se ingrese un dato numérico, dentro del rango de los puertos, y que el puerto este disponible.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:tryPuerto.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego se declaran las variables: ''' Speed, Puerto_Gris y Puerto_Distancia ''', se verifica que los sensores de distancia y de grises estén conectados y asigna el puerto en el que estén conectados a las variables ''' Puerto_Distancia ''' y ''' Puerto_Gris ''' respectivamente. La variable ''' Speed ''' es una variable global que se lee al inicio de cada cadena de acciones y la utiliza para todos los movimientos del Butiá de esa cadena.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:declaracionVariables.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Seguimos con la declaración de las funciones básicas del Butiá, en este caso son ''' Avanzar, Rotar, AvanzarHastaVerColor y AvanzarHastaObstaculo ''' &lt;br /&gt;
&lt;br /&gt;
-La función ''' Avanzar ''' recibe un parámetro de tiempo y el Butiá avanza ese determinado tiempo.&lt;br /&gt;
&lt;br /&gt;
-La función ''' Retroceder ''' recibe un parámetro de tiempo y el Butiá retrocede ese determinado tiempo.&lt;br /&gt;
&lt;br /&gt;
-La función ''' Rotar ''' recibe dos parámetros, una dirección que puede ser Izquierda o Derecha y un tiempo que indica la duración de la rotación del Butiá.&lt;br /&gt;
&lt;br /&gt;
-La función ''' AvanzarHastaVerColor ''' recibe un parámetro que varia entre Blanco o Negro, el robot va a avanzar hasta detectar el color seleccionado.&lt;br /&gt;
Esta función solo se puede usar si el sensor de grises esta conectado.&lt;br /&gt;
&lt;br /&gt;
-Por ultimo, la función ''' AvanzarHastaObstaculo ''' no recibe parámetros, en este caso el Butiá va a avanzar hasta estar a unos pocos centímetros de un obstáculo.&lt;br /&gt;
Esta función solo se puede usar si el sensor de distancia esta conectado.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:FuncionesBasicas.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego se encuentra una función ''' Accion1 ''' esta función la puede definir el usuario a gusto, se puede implementar desde una función básica hasta un seguidor de líneas avanzado. La única condición que se necesita para implementar esta ''' Accion1 ''' es que no puede recibir parámetros&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Accion1.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ahora tenemos que definir el menú principal del programa, este se divide en dos funciones&lt;br /&gt;
&lt;br /&gt;
- ''' handle ''': Esta es una función predeterminada de la librería ''' simple_web_socket ''' y se llama cada vez que el servidor recibe un dato del cliente. En este caso la función crea una lista de las acciones que le llegan de la App Mobile, y las va ejecutando ordenadamente&lt;br /&gt;
&lt;br /&gt;
- ''' handle_close ''': Al igual que la función anterior, esta también es una función predeterminada de la librería ''' simple_web_socket ''' y se llama cuando el cliente se desconecta del servidor&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Screenshot from 2021-06-27 03-58-56.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Y por ultimo tenemos el dos líneas de codigo, la primera se encarga de abrir el servidor y la segunda lo mantiene abierto infinitamente&lt;br /&gt;
&lt;br /&gt;
[[Archivo:abrirServidor.png]]&lt;br /&gt;
&lt;br /&gt;
== Implementación codigo React ==&lt;br /&gt;
&lt;br /&gt;
La aplicacion movil esta implementada con React Native, ademas, se utiliza el ''framework'' [https://docs.expo.io/ Expo]. Este ''framework'' nos brinda un conjunto de herramientas que facilita el desarrollo de aplicaciones mobiles. &lt;br /&gt;
En caso de querer agregar, o modificar cualidades, es necesario proceder de la siguiente forma:&lt;br /&gt;
&lt;br /&gt;
Descargar el archivo comprimido adjunto.&lt;br /&gt;
&lt;br /&gt;
Extraerlo, posicionarse en el directorio raiz de la carpeta descomprimida, y ejecutar desde la terminal lo siguiente (tener en cuenta que es necesario tener en la maquina, el gestor de paquetes [https://docs.npmjs.com/ npm]).&lt;br /&gt;
&lt;br /&gt;
''''npm install'''' &lt;br /&gt;
&lt;br /&gt;
Esto descarga las dependencias que utiliza la aplicación, luego de esto podemos empezar a desarrollar.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para visualizar los cambios en tiempo real mientras desarrollamos, es necesario instalar la aplicación Expo Go para [https://play.google.com/store/apps/details?id=host.exp.exponent&amp;amp;hl=es_UY&amp;amp;gl=US Android] o para [https://apps.apple.com/es/app/expo-go/id982107779 iOS] según sea el caso.&lt;br /&gt;
&lt;br /&gt;
Para a visualizar la app en desarrollo desde Expo Go, procedemos de la siguiente forma:&lt;br /&gt;
Desde el directorio raíz de la aplicación ejecutamos desde la terminal lo siguiente:&lt;br /&gt;
&lt;br /&gt;
''''npm start''''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego, desde la aplicación Expo Go, con el celular conectado en la misma red local accedemos a la aplicación seleccionando lo siguiente:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Expo.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hecho esto, podemos cambiar el código de la aplicación y ver reflejados los cambios de forma casi instantánea.&lt;br /&gt;
&lt;br /&gt;
La aplicacion esta compuesta por dos pantallas, la pantalla de configuracion (''ConfigScreen.js''), donde se ingresa la direccion ip y puerto del servidor, y la pantalla principal (''MainScreen.js''), donde se lleva a cabo la programacion del robot mediante acciones.&lt;br /&gt;
&lt;br /&gt;
Esta ultima pantalla esta compuesta por los componentes ''TopList.js'' y ''BoottomList.js''.&lt;br /&gt;
&lt;br /&gt;
Para agregar una nueva accion al sistema, es necesario programarla en el servidor con un deteminado nombre, supondremos &amp;quot;AccionN&amp;quot;, esto resulta facil si se toma como ejemplo las acciones ya implementadas.&lt;br /&gt;
&lt;br /&gt;
En la aplicacion, esta nueva accion se agrega en el array &amp;quot;''actionsData''&amp;quot;, dicho array se encuentra en la palntalla principal, es decir en el archivo &amp;quot;''MainScreen.js''&amp;quot;, cada accion cuenta con los siguientes datos:&lt;br /&gt;
&lt;br /&gt;
-'''idAccion:''' Identificador de la accion en dicho arreglo (actionsData).&lt;br /&gt;
&lt;br /&gt;
-'''title:''': Titulo de la accion que se muetra en el panel superior.&lt;br /&gt;
&lt;br /&gt;
-'''actionId:''' Nombre identificador de la accion en el servidor.&lt;br /&gt;
&lt;br /&gt;
-'''overlay:''': ''Overlay'' que se despliega al seleccionar la accion si esta lleva un parametro, esta funcion lleva como parametro &amp;quot;''editOverlay''&amp;quot; y &amp;quot;''id''&amp;quot; (parametros que se utilizan cuando se requiere cambiar el valor del parametro de la accuion que ya fue seleccionada y se encuentra en el panel inferior), como por ejemplo pueden ser segundos en el caso de la accion &amp;quot;Avanzar&amp;quot;, o colores en el caso de &amp;quot;Avanzar hasta obstaculo&amp;quot;. Este parametro puede ser que no sea necesario, como es en el caso de la accion &amp;quot;Avanzar hasta obstaculo&amp;quot;, en este ultimo caso el valor de este campo es null.&lt;br /&gt;
&lt;br /&gt;
Ejemplo de la accion &amp;quot;Avanzar&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Screenshot from 2021-06-27 04-18-42.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ejemplo de la accion &amp;quot;Avanzar hasta obstaculo&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Screenshot_from_2021-06-27_00-28-32.png]]&lt;br /&gt;
&lt;br /&gt;
== Manual de uso de la aplicación ==&lt;br /&gt;
&lt;br /&gt;
Aunque la aplicación resulta intuitiva y fácil de usar se describe a continuación una serie de pasos para utilizarla correctamente.&lt;br /&gt;
&lt;br /&gt;
Para comenzar a utilizar la aplicación es necesario configurar la conexión de la aplicación con el servidor (recordar que ambos se deben encontrar ejecutándose en la misma red local), el servidor ejecutando en una computadora que esté conectada correctamente al butiá (con los sensores descritos anteriormente) y la aplicación ejecutándose en el celular.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Conectando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego que la conexión haya resultado exitosa, nos encontramos en la página principal. En el panel superior, como se muestra a continuación, se encuentran las aplicaciones disponibles que podemos ejecutar en el robot butiá.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Acciones.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para agregar una serie de acciones al robot, simplemente presionamos la que queramos, a continuación esta aparecerá en el panel inferior, a medida de que vayamos seleccionando acciones, estas se irán encadenando una tras otras, estas estarán prontas para ejecutarse secuencialmente, desde la parte inferior, a la parte superior, en el momento que presionemos el botón &amp;quot;Empezar&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Agregando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Como la aplicación está pensada para planificar algoritmos para resolver desafíos o ''puzzles'', es probable que nos equivoquemos y seleccionemos una acción o insertemos un parámetro incorrectamente, ¡pero no te preocupes!. Para editar el parámetro que le hayamos ingresado a una acción, simplemente mantenemos pulsado la que deseamos corregir e ingresamos el nuevo valor.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Editando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
También es posible eliminar una acción, para hacer esto, nuevamente mantenemos pulsada la acción que queremos eliminar, pero esta vez, seleccionamos la acción eliminar. A continuación la acción seleccionada desaparecerá del panel inferior. También es posible que deseemos eliminar todas las acciones que habíamos ingresado, en este caso seleccionamos el botón &amp;quot;Eliminar acciones&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Eliminando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es posible que queremos que el robot se desplace a ciertas velocidades, teniendo en cuenta que al modificar la velocidad, el robot tendrá un comportamiento totalmente diferente, debido a que gran parte de las acciones se ejecutan por un tiempo asignado, a mayor velocidad, más desplazamiento.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Velocidad.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En caso de que exista un error en la conexión, podemos intentar volver a conectar la aplicación al servidor, para esto seleccionamos la opción configuración.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:A configuracion.gif]]&lt;br /&gt;
&lt;br /&gt;
== Video de muestra ==&lt;br /&gt;
&lt;br /&gt;
== Mejoras a futuro ==&lt;br /&gt;
&lt;br /&gt;
* Implementar una forma para que las función ''' Accion1 ''' pueda recibir parámetros, para así ampliar la gama de problemas que se puedan solucionar a través de esta aplicación.&lt;br /&gt;
&lt;br /&gt;
* Implementación de código que permita añadir a través del código, una mayor cantidad de funciones genéricas a la aplicación.&lt;br /&gt;
&lt;br /&gt;
* Desarrollar una forma de comunicación bilateral entre la ''App Mobile'' y Python para mejorar el ''debug'' en tiempo de ejecución.&lt;br /&gt;
&lt;br /&gt;
== Archivos de uso ==&lt;/div&gt;</summary>
		<author><name>German.moreira</name></author>	</entry>

	<entry>
		<id>http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Programando_el_Butia_desde_el_celular&amp;diff=11629</id>
		<title>Programando el Butia desde el celular</title>
		<link rel="alternate" type="text/html" href="http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Programando_el_Butia_desde_el_celular&amp;diff=11629"/>
				<updated>2021-06-27T07:35:21Z</updated>
		
		<summary type="html">&lt;p&gt;German.moreira: /* Manual de uso de la aplicación */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Introducción ==&lt;br /&gt;
&lt;br /&gt;
La idea del proyecto en un principio era usar el celular como medio para controlar el robot Butiá para que resulte más atractivo para los estudiantes que no les guste la programación.&lt;br /&gt;
&lt;br /&gt;
Luego, la idea se modifico un poco debido a que descubrimos que con esta implementación, podíamos hacer mas sencilla la resolución de algunos ejercicios básicos mediante algoritmos mas simplificados, tomamos el trabajo que teníamos hecho hasta el momento y lo adaptamos a un menú con distintas acciones simples como avanzar un determinado tiempo, avanzar hasta chocar contra un objeto o rotar a la izquierda o derecha un determinado tiempo.&lt;br /&gt;
&lt;br /&gt;
Estas funciones básicas y bastante sencillas de entender más una interfaz amigable y fácil de usar, se implementaron para que el rango de edad de uso de esta aplicación vaya de 3 años en adelante.&lt;br /&gt;
&lt;br /&gt;
Como resultado obtuvimos una aplicación que se puede usar para que niños de:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- 4 / 5 / 6 años resuelvan ejercicios sencillos como puede ser llegar de un punto a otro, buscar el camino a un objeto o resolver un laberinto sencillo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- 7 / 8 / 9 años puedan resolver ejercicios un poco más complejos como puede ser resolver un laberinto del más sencillo al mas complejo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- 10 años en adelante tengan la capacidad de adaptar una parte personal de código al programa y puedan resolver cualquier ejercicio que se pueda plantear con el robot Butiá.&lt;br /&gt;
&lt;br /&gt;
== Objetivo ==&lt;br /&gt;
&lt;br /&gt;
Los objetivos del proyecto eran, como dice el nombre, poder conectar remotamente el robot Butiá a un celular y buscar una abstracción de la mayor cantidad de problemas que puedan ser resueltos con el robot Butiá.&lt;br /&gt;
&lt;br /&gt;
Esto para poder crear un método de uso del robot Butiá más dinámico y con funciones que permiten realizar, mediante algoritmos mas sencillos, la solución de la mayor cantidad de puzles particulares.&lt;br /&gt;
&lt;br /&gt;
Al hacer esto el nivel de uso en aulas del robot Butiá, puede simplificarse hasta clases desde 3 años de jardinera en adelante, debido a que la aplicación simplifica la parte de codificación y los algoritmos de solución de ejercicios se convierten simplemente en una serie de pasos básicos a ejecutar linealmente.&lt;br /&gt;
&lt;br /&gt;
== Armado del Butiá ==&lt;br /&gt;
&lt;br /&gt;
* Paso 1: Armar el Butiá a partir de esta [https://www.fing.edu.uy/inco/proyectos/butia/files/docs_butia2/armando_paso_a_paso_motores_CC_rev1.pdf guía oficial]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''' Los siguientes pasos son opcionales '''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Paso 2: Instalar el sensor de grises&lt;br /&gt;
&lt;br /&gt;
1:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP1.jpeg]] &lt;br /&gt;
&lt;br /&gt;
2:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP2.jpeg]]&lt;br /&gt;
&lt;br /&gt;
3:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP3.jpeg]]&lt;br /&gt;
&lt;br /&gt;
4:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP4.jpeg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Paso 3: Instalar el sensor de distancia&lt;br /&gt;
&lt;br /&gt;
1:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP1.png]]&lt;br /&gt;
&lt;br /&gt;
2:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP2.png]]&lt;br /&gt;
&lt;br /&gt;
3:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP3.png]]&lt;br /&gt;
&lt;br /&gt;
4:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP4.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Protocolo de comunicación ==&lt;br /&gt;
El protocolo de comunicaron diseñado para la comunicación entre Servidor y Aplicación ''Mobile'' es el siguiente:&lt;br /&gt;
&lt;br /&gt;
'''''Accion0-S0\nAccion1-S1\nAccion2-S2\nAccion3\nAccion4-S4\nVelocidad'''''&lt;br /&gt;
&lt;br /&gt;
Donde, este ''string'' representa la serie encadenada de acciones que el servidor recibe para ejecutar en el robot desde la aplicación.&lt;br /&gt;
Cada acción esta separada de la que se encuentra a continuación por el símbolo &amp;quot;''\n''&amp;quot;.&lt;br /&gt;
Podemos diferenciar dos tipos de acciones, las que requieren parámetro y las que no, estas se comunican de la siguiente forma:&lt;br /&gt;
'''Acción con parámetro''': NombreAccion-Parametro&lt;br /&gt;
&lt;br /&gt;
'''Acción sin parámetro''': NombreAccion&lt;br /&gt;
&lt;br /&gt;
== Implementación código Python ==&lt;br /&gt;
&lt;br /&gt;
Antes de empezar a programar o usar el código, es necesario instalar las librerías a usar, esto se puede hacer escribiendo &lt;br /&gt;
&lt;br /&gt;
'''''pip install [nombre de la librería]''''' en el interprete de comandos del sistema.&lt;br /&gt;
&lt;br /&gt;
Entonces instalamos la librería a utilizar, en este caso:&lt;br /&gt;
&lt;br /&gt;
'''''pip install simple_websocket_server'''''&lt;br /&gt;
&lt;br /&gt;
Una vez instalada la librería, hay que empezar a escribir el código.&lt;br /&gt;
&lt;br /&gt;
El encabezado del código es el siguiente&lt;br /&gt;
El uso de cada librería se explica con detalle mas adelante&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Encabezado.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A partir de la librería '''sys''' se define el camino del sistema para utilizar los plugin Butiá.&lt;br /&gt;
En nuestro caso, la ruta es ''' '/home/trerb/TurtleBots.activity/plugins/butia' ''', eso se tiene que modificar dependiendo de donde se encuentren el directorio ''' TurtleBots.activity/ ''' en su sistema de archivos&lt;br /&gt;
&lt;br /&gt;
[[Archivo:UsoPluginButia.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego se encuentra la función ''' clearConsole ''',&lt;br /&gt;
Esta función sirve únicamente para limpiar el interprete de Python usando la librería ''' os ''' y tener una ejecución mas limpia&lt;br /&gt;
&lt;br /&gt;
[[Archivo:clearConsole().png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
El siguiente código utiliza la librería ''' socket ''' para conectarse a la web y preguntar la ip del ordenador que ejecuta el archivo y la muestra en pantalla, esto se usa para facilitar la conexión con la App Mobile&lt;br /&gt;
&lt;br /&gt;
[[Archivo:conexionSocket.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Las siguientes líneas de código preguntan al usuario que puerto va a utilizar para la conexión, este código verifica que se ingrese un dato numérico, dentro del rango de los puertos, y que el puerto este disponible.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:tryPuerto.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego se declaran las variables: ''' Speed, Puerto_Gris y Puerto_Distancia ''', se verifica que los sensores de distancia y de grises estén conectados y asigna el puerto en el que estén conectados a las variables ''' Puerto_Distancia ''' y ''' Puerto_Gris ''' respectivamente. La variable ''' Speed ''' es una variable global que se lee al inicio de cada cadena de acciones y la utiliza para todos los movimientos del Butiá de esa cadena.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:declaracionVariables.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Seguimos con la declaración de las funciones básicas del Butiá, en este caso son ''' Avanzar, Rotar, AvanzarHastaVerColor y AvanzarHastaObstaculo ''' &lt;br /&gt;
&lt;br /&gt;
-La función ''' Avanzar ''' recibe un parámetro de tiempo y el Butiá avanza ese determinado tiempo.&lt;br /&gt;
&lt;br /&gt;
-La función ''' Retroceder ''' recibe un parámetro de tiempo y el Butiá retrocede ese determinado tiempo.&lt;br /&gt;
&lt;br /&gt;
-La función ''' Rotar ''' recibe dos parámetros, una dirección que puede ser Izquierda o Derecha y un tiempo que indica la duración de la rotación del Butiá.&lt;br /&gt;
&lt;br /&gt;
-La función ''' AvanzarHastaVerColor ''' recibe un parámetro que varia entre Blanco o Negro, el robot va a avanzar hasta detectar el color seleccionado.&lt;br /&gt;
Esta función solo se puede usar si el sensor de grises esta conectado.&lt;br /&gt;
&lt;br /&gt;
-Por ultimo, la función ''' AvanzarHastaObstaculo ''' no recibe parámetros, en este caso el Butiá va a avanzar hasta estar a unos pocos centímetros de un obstáculo.&lt;br /&gt;
Esta función solo se puede usar si el sensor de distancia esta conectado.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:FuncionesBasicas.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego se encuentra una función ''' Accion1 ''' esta función la puede definir el usuario a gusto, se puede implementar desde una función básica hasta un seguidor de líneas avanzado. La única condición que se necesita para implementar esta ''' Accion1 ''' es que no puede recibir parámetros&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Accion1.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ahora tenemos que definir el menú principal del programa, este se divide en dos funciones&lt;br /&gt;
&lt;br /&gt;
- ''' handle ''': Esta es una función predeterminada de la librería ''' simple_web_socket ''' y se llama cada vez que el servidor recibe un dato del cliente. En este caso la función crea una lista de las acciones que le llegan de la App Mobile, y las va ejecutando ordenadamente&lt;br /&gt;
&lt;br /&gt;
- ''' handle_close ''': Al igual que la función anterior, esta también es una función predeterminada de la librería ''' simple_web_socket ''' y se llama cuando el cliente se desconecta del servidor&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Screenshot from 2021-06-27 03-58-56.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Y por ultimo tenemos el dos líneas de codigo, la primera se encarga de abrir el servidor y la segunda lo mantiene abierto infinitamente&lt;br /&gt;
&lt;br /&gt;
[[Archivo:abrirServidor.png]]&lt;br /&gt;
&lt;br /&gt;
== Implementación codigo React ==&lt;br /&gt;
&lt;br /&gt;
La aplicacion movil esta implementada con React Native, ademas, se utiliza el ''framework'' [https://docs.expo.io/ Expo]. Este ''framework'' nos brinda un conjunto de herramientas que facilita el desarrollo de aplicaciones mobiles. &lt;br /&gt;
En caso de querer agregar, o modificar cualidades, es necesario proceder de la siguiente forma:&lt;br /&gt;
&lt;br /&gt;
Descargar el archivo comprimido adjunto.&lt;br /&gt;
&lt;br /&gt;
Extraerlo, posicionarse en el directorio raiz de la carpeta descomprimida, y ejecutar desde la terminal lo siguiente (tener en cuenta que es necesario tener en la maquina, el gestor de paquetes [https://docs.npmjs.com/ npm]).&lt;br /&gt;
&lt;br /&gt;
''''npm install'''' &lt;br /&gt;
&lt;br /&gt;
Esto descarga las dependencias que utiliza la aplicación, luego de esto podemos empezar a desarrollar.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para visualizar los cambios en tiempo real mientras desarrollamos, es necesario instalar la aplicación Expo Go para [https://play.google.com/store/apps/details?id=host.exp.exponent&amp;amp;hl=es_UY&amp;amp;gl=US Android] o para [https://apps.apple.com/es/app/expo-go/id982107779 iOS] según sea el caso.&lt;br /&gt;
&lt;br /&gt;
Para a visualizar la app en desarrollo desde Expo Go, procedemos de la siguiente forma:&lt;br /&gt;
Desde el directorio raíz de la aplicación ejecutamos desde la terminal lo siguiente:&lt;br /&gt;
&lt;br /&gt;
''''npm start''''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego, desde la aplicación Expo Go, con el celular conectado en la misma red local accedemos a la aplicación seleccionando lo siguiente:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Expo.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hecho esto, podemos cambiar el código de la aplicación y ver reflejados los cambios de forma casi instantánea.&lt;br /&gt;
&lt;br /&gt;
La aplicacion esta compuesta por dos pantallas, la pantalla de configuracion (''ConfigScreen.js''), donde se ingresa la direccion ip y puerto del servidor, y la pantalla principal (''MainScreen.js''), donde se lleva a cabo la programacion del robot mediante acciones.&lt;br /&gt;
&lt;br /&gt;
Esta ultima pantalla esta compuesta por los componentes ''TopList.js'' y ''BoottomList.js''.&lt;br /&gt;
&lt;br /&gt;
Para agregar una nueva accion al sistema, es necesario programarla en el servidor con un deteminado nombre, supondremos &amp;quot;AccionN&amp;quot;, esto resulta facil si se toma como ejemplo las acciones ya implementadas.&lt;br /&gt;
&lt;br /&gt;
En la aplicacion, esta nueva accion se agrega en el array &amp;quot;''actionsData''&amp;quot;, dicho array se encuentra en la palntalla principal, es decir en el archivo &amp;quot;''MainScreen.js''&amp;quot;, cada accion cuenta con los siguientes datos:&lt;br /&gt;
&lt;br /&gt;
-'''idAccion:''' Identificador de la accion en dicho arreglo (actionsData).&lt;br /&gt;
&lt;br /&gt;
-'''title:''': Titulo de la accion que se muetra en el panel superior.&lt;br /&gt;
&lt;br /&gt;
-'''actionId:''' Nombre identificador de la accion en el servidor.&lt;br /&gt;
&lt;br /&gt;
-'''overlay:''': ''Overlay'' que se despliega al seleccionar la accion si esta lleva un parametro, esta funcion lleva como parametro &amp;quot;''editOverlay''&amp;quot; y &amp;quot;''id''&amp;quot; (parametros que se utilizan cuando se requiere cambiar el valor del parametro de la accuion que ya fue seleccionada y se encuentra en el panel inferior), como por ejemplo pueden ser segundos en el caso de la accion &amp;quot;Avanzar&amp;quot;, o colores en el caso de &amp;quot;Avanzar hasta obstaculo&amp;quot;. Este parametro puede ser que no sea necesario, como es en el caso de la accion &amp;quot;Avanzar hasta obstaculo&amp;quot;, en este ultimo caso el valor de este campo es null.&lt;br /&gt;
&lt;br /&gt;
Ejemplo de la accion &amp;quot;Avanzar&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Screenshot from 2021-06-27 04-18-42.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ejemplo de la accion &amp;quot;Avanzar hasta obstaculo&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Screenshot_from_2021-06-27_00-28-32.png]]&lt;br /&gt;
&lt;br /&gt;
== Manual de uso de la aplicación ==&lt;br /&gt;
&lt;br /&gt;
Aunque la aplicación resulta intuitiva y fácil de usar se describe a continuación una serie de pasos para utilizarla correctamente.&lt;br /&gt;
&lt;br /&gt;
Para comenzar a utilizar la aplicación es necesario configurar la conexión de la aplicación con el servidor (recordar que ambos se deben encontrar ejecutándose en la misma red local), el servidor ejecutando en una computadora que esté conectada correctamente al butiá (con los sensores descritos anteriormente) y la aplicación ejecutándose en el celular.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Conectando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego que la conexión haya resultado exitosa, nos encontramos en la página principal. En el panel superior, como se muestra a continuación, se encuentran las aplicaciones disponibles que podemos ejecutar en el robot butiá.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Acciones.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para agregar una serie de acciones al robot, simplemente presionamos la que queramos, a continuación esta aparecerá en el panel inferior, a medida de que vayamos seleccionando acciones, estas se irán encadenando una tras otras, estas estarán prontas para ejecutarse secuencialmente, desde la parte inferior, a la parte superior, en el momento que presionemos el botón &amp;quot;Empezar&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Agregando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Como la aplicación está pensada para planificar algoritmos para resolver desafíos o ''puzzles'', es probable que nos equivoquemos y seleccionemos una acción o insertemos un parámetro incorrectamente, ¡pero no te preocupes!. Para editar el parámetro que le hayamos ingresado a una acción, simplemente mantenemos pulsado la que deseamos corregir e ingresamos el nuevo valor.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Editando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
También es posible eliminar una acción, para hacer esto, nuevamente mantenemos pulsada la acción que queremos eliminar, pero esta vez, seleccionamos la acción eliminar. A continuación la acción seleccionada desaparecerá del panel inferior. También es posible que deseemos eliminar todas las acciones que habíamos ingresado, en este caso seleccionamos el botón &amp;quot;Eliminar acciones&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Eliminando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es posible que queremos que el robot se desplace a ciertas velocidades, teniendo en cuenta que al modificar la velocidad, el robot tendrá un comportamiento totalmente diferente, debido a que gran parte de las acciones se ejecutan por un tiempo asignado, a mayor velocidad, más desplazamiento.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Velocidad.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En caso de que exista un error en la conexión, podemos intentar volver a conectar la aplicación al servidor, para esto seleccionamos la opción configuración.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:A configuracion.gif]]&lt;br /&gt;
&lt;br /&gt;
== Video de muestra ==&lt;br /&gt;
&lt;br /&gt;
== Mejoras a futuro ==&lt;br /&gt;
&lt;br /&gt;
* Implementar una forma para que las función ''' Accion1 ''' pueda recibir parámetros, para así ampliar la gama de problemas que se puedan solucionar a través de esta aplicación.&lt;br /&gt;
&lt;br /&gt;
* Implementación de código que permita añadir a través del código, una mayor cantidad de funciones genéricas a la aplicación.&lt;br /&gt;
&lt;br /&gt;
* Desarrollar una forma de comunicación bilateral entre la ''App Mobile'' y Python para mejorar el ''debug'' en tiempo de ejecución.&lt;br /&gt;
&lt;br /&gt;
== Archivos de uso ==&lt;/div&gt;</summary>
		<author><name>German.moreira</name></author>	</entry>

	<entry>
		<id>http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Programando_el_Butia_desde_el_celular&amp;diff=11628</id>
		<title>Programando el Butia desde el celular</title>
		<link rel="alternate" type="text/html" href="http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Programando_el_Butia_desde_el_celular&amp;diff=11628"/>
				<updated>2021-06-27T07:30:17Z</updated>
		
		<summary type="html">&lt;p&gt;German.moreira: /* Mejoras a futuro */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Introducción ==&lt;br /&gt;
&lt;br /&gt;
La idea del proyecto en un principio era usar el celular como medio para controlar el robot Butiá para que resulte más atractivo para los estudiantes que no les guste la programación.&lt;br /&gt;
&lt;br /&gt;
Luego, la idea se modifico un poco debido a que descubrimos que con esta implementación, podíamos hacer mas sencilla la resolución de algunos ejercicios básicos mediante algoritmos mas simplificados, tomamos el trabajo que teníamos hecho hasta el momento y lo adaptamos a un menú con distintas acciones simples como avanzar un determinado tiempo, avanzar hasta chocar contra un objeto o rotar a la izquierda o derecha un determinado tiempo.&lt;br /&gt;
&lt;br /&gt;
Estas funciones básicas y bastante sencillas de entender más una interfaz amigable y fácil de usar, se implementaron para que el rango de edad de uso de esta aplicación vaya de 3 años en adelante.&lt;br /&gt;
&lt;br /&gt;
Como resultado obtuvimos una aplicación que se puede usar para que niños de:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- 4 / 5 / 6 años resuelvan ejercicios sencillos como puede ser llegar de un punto a otro, buscar el camino a un objeto o resolver un laberinto sencillo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- 7 / 8 / 9 años puedan resolver ejercicios un poco más complejos como puede ser resolver un laberinto del más sencillo al mas complejo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- 10 años en adelante tengan la capacidad de adaptar una parte personal de código al programa y puedan resolver cualquier ejercicio que se pueda plantear con el robot Butiá.&lt;br /&gt;
&lt;br /&gt;
== Objetivo ==&lt;br /&gt;
&lt;br /&gt;
Los objetivos del proyecto eran, como dice el nombre, poder conectar remotamente el robot Butiá a un celular y buscar una abstracción de la mayor cantidad de problemas que puedan ser resueltos con el robot Butiá.&lt;br /&gt;
&lt;br /&gt;
Esto para poder crear un método de uso del robot Butiá más dinámico y con funciones que permiten realizar, mediante algoritmos mas sencillos, la solución de la mayor cantidad de puzles particulares.&lt;br /&gt;
&lt;br /&gt;
Al hacer esto el nivel de uso en aulas del robot Butiá, puede simplificarse hasta clases desde 3 años de jardinera en adelante, debido a que la aplicación simplifica la parte de codificación y los algoritmos de solución de ejercicios se convierten simplemente en una serie de pasos básicos a ejecutar linealmente.&lt;br /&gt;
&lt;br /&gt;
== Armado del Butiá ==&lt;br /&gt;
&lt;br /&gt;
* Paso 1: Armar el Butiá a partir de esta [https://www.fing.edu.uy/inco/proyectos/butia/files/docs_butia2/armando_paso_a_paso_motores_CC_rev1.pdf guía oficial]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''' Los siguientes pasos son opcionales '''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Paso 2: Instalar el sensor de grises&lt;br /&gt;
&lt;br /&gt;
1:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP1.jpeg]] &lt;br /&gt;
&lt;br /&gt;
2:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP2.jpeg]]&lt;br /&gt;
&lt;br /&gt;
3:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP3.jpeg]]&lt;br /&gt;
&lt;br /&gt;
4:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP4.jpeg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Paso 3: Instalar el sensor de distancia&lt;br /&gt;
&lt;br /&gt;
1:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP1.png]]&lt;br /&gt;
&lt;br /&gt;
2:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP2.png]]&lt;br /&gt;
&lt;br /&gt;
3:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP3.png]]&lt;br /&gt;
&lt;br /&gt;
4:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP4.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Protocolo de comunicación ==&lt;br /&gt;
El protocolo de comunicaron diseñado para la comunicación entre Servidor y Aplicación ''Mobile'' es el siguiente:&lt;br /&gt;
&lt;br /&gt;
'''''Accion0-S0\nAccion1-S1\nAccion2-S2\nAccion3\nAccion4-S4\nVelocidad'''''&lt;br /&gt;
&lt;br /&gt;
Donde, este ''string'' representa la serie encadenada de acciones que el servidor recibe para ejecutar en el robot desde la aplicación.&lt;br /&gt;
Cada acción esta separada de la que se encuentra a continuación por el símbolo &amp;quot;''\n''&amp;quot;.&lt;br /&gt;
Podemos diferenciar dos tipos de acciones, las que requieren parámetro y las que no, estas se comunican de la siguiente forma:&lt;br /&gt;
'''Acción con parámetro''': NombreAccion-Parametro&lt;br /&gt;
&lt;br /&gt;
'''Acción sin parámetro''': NombreAccion&lt;br /&gt;
&lt;br /&gt;
== Implementación código Python ==&lt;br /&gt;
&lt;br /&gt;
Antes de empezar a programar o usar el código, es necesario instalar las librerías a usar, esto se puede hacer escribiendo &lt;br /&gt;
&lt;br /&gt;
'''''pip install [nombre de la librería]''''' en el interprete de comandos del sistema.&lt;br /&gt;
&lt;br /&gt;
Entonces instalamos la librería a utilizar, en este caso:&lt;br /&gt;
&lt;br /&gt;
'''''pip install simple_websocket_server'''''&lt;br /&gt;
&lt;br /&gt;
Una vez instalada la librería, hay que empezar a escribir el código.&lt;br /&gt;
&lt;br /&gt;
El encabezado del código es el siguiente&lt;br /&gt;
El uso de cada librería se explica con detalle mas adelante&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Encabezado.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A partir de la librería '''sys''' se define el camino del sistema para utilizar los plugin Butiá.&lt;br /&gt;
En nuestro caso, la ruta es ''' '/home/trerb/TurtleBots.activity/plugins/butia' ''', eso se tiene que modificar dependiendo de donde se encuentren el directorio ''' TurtleBots.activity/ ''' en su sistema de archivos&lt;br /&gt;
&lt;br /&gt;
[[Archivo:UsoPluginButia.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego se encuentra la función ''' clearConsole ''',&lt;br /&gt;
Esta función sirve únicamente para limpiar el interprete de Python usando la librería ''' os ''' y tener una ejecución mas limpia&lt;br /&gt;
&lt;br /&gt;
[[Archivo:clearConsole().png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
El siguiente código utiliza la librería ''' socket ''' para conectarse a la web y preguntar la ip del ordenador que ejecuta el archivo y la muestra en pantalla, esto se usa para facilitar la conexión con la App Mobile&lt;br /&gt;
&lt;br /&gt;
[[Archivo:conexionSocket.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Las siguientes líneas de código preguntan al usuario que puerto va a utilizar para la conexión, este código verifica que se ingrese un dato numérico, dentro del rango de los puertos, y que el puerto este disponible.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:tryPuerto.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego se declaran las variables: ''' Speed, Puerto_Gris y Puerto_Distancia ''', se verifica que los sensores de distancia y de grises estén conectados y asigna el puerto en el que estén conectados a las variables ''' Puerto_Distancia ''' y ''' Puerto_Gris ''' respectivamente. La variable ''' Speed ''' es una variable global que se lee al inicio de cada cadena de acciones y la utiliza para todos los movimientos del Butiá de esa cadena.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:declaracionVariables.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Seguimos con la declaración de las funciones básicas del Butiá, en este caso son ''' Avanzar, Rotar, AvanzarHastaVerColor y AvanzarHastaObstaculo ''' &lt;br /&gt;
&lt;br /&gt;
-La función ''' Avanzar ''' recibe un parámetro de tiempo y el Butiá avanza ese determinado tiempo.&lt;br /&gt;
&lt;br /&gt;
-La función ''' Retroceder ''' recibe un parámetro de tiempo y el Butiá retrocede ese determinado tiempo.&lt;br /&gt;
&lt;br /&gt;
-La función ''' Rotar ''' recibe dos parámetros, una dirección que puede ser Izquierda o Derecha y un tiempo que indica la duración de la rotación del Butiá.&lt;br /&gt;
&lt;br /&gt;
-La función ''' AvanzarHastaVerColor ''' recibe un parámetro que varia entre Blanco o Negro, el robot va a avanzar hasta detectar el color seleccionado.&lt;br /&gt;
Esta función solo se puede usar si el sensor de grises esta conectado.&lt;br /&gt;
&lt;br /&gt;
-Por ultimo, la función ''' AvanzarHastaObstaculo ''' no recibe parámetros, en este caso el Butiá va a avanzar hasta estar a unos pocos centímetros de un obstáculo.&lt;br /&gt;
Esta función solo se puede usar si el sensor de distancia esta conectado.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:FuncionesBasicas.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego se encuentra una función ''' Accion1 ''' esta función la puede definir el usuario a gusto, se puede implementar desde una función básica hasta un seguidor de líneas avanzado. La única condición que se necesita para implementar esta ''' Accion1 ''' es que no puede recibir parámetros&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Accion1.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ahora tenemos que definir el menú principal del programa, este se divide en dos funciones&lt;br /&gt;
&lt;br /&gt;
- ''' handle ''': Esta es una función predeterminada de la librería ''' simple_web_socket ''' y se llama cada vez que el servidor recibe un dato del cliente. En este caso la función crea una lista de las acciones que le llegan de la App Mobile, y las va ejecutando ordenadamente&lt;br /&gt;
&lt;br /&gt;
- ''' handle_close ''': Al igual que la función anterior, esta también es una función predeterminada de la librería ''' simple_web_socket ''' y se llama cuando el cliente se desconecta del servidor&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Screenshot from 2021-06-27 03-58-56.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Y por ultimo tenemos el dos líneas de codigo, la primera se encarga de abrir el servidor y la segunda lo mantiene abierto infinitamente&lt;br /&gt;
&lt;br /&gt;
[[Archivo:abrirServidor.png]]&lt;br /&gt;
&lt;br /&gt;
== Implementación codigo React ==&lt;br /&gt;
&lt;br /&gt;
La aplicacion movil esta implementada con React Native, ademas, se utiliza el ''framework'' [https://docs.expo.io/ Expo]. Este ''framework'' nos brinda un conjunto de herramientas que facilita el desarrollo de aplicaciones mobiles. &lt;br /&gt;
En caso de querer agregar, o modificar cualidades, es necesario proceder de la siguiente forma:&lt;br /&gt;
&lt;br /&gt;
Descargar el archivo comprimido adjunto.&lt;br /&gt;
&lt;br /&gt;
Extraerlo, posicionarse en el directorio raiz de la carpeta descomprimida, y ejecutar desde la terminal lo siguiente (tener en cuenta que es necesario tener en la maquina, el gestor de paquetes [https://docs.npmjs.com/ npm]).&lt;br /&gt;
&lt;br /&gt;
''''npm install'''' &lt;br /&gt;
&lt;br /&gt;
Esto descarga las dependencias que utiliza la aplicación, luego de esto podemos empezar a desarrollar.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para visualizar los cambios en tiempo real mientras desarrollamos, es necesario instalar la aplicación Expo Go para [https://play.google.com/store/apps/details?id=host.exp.exponent&amp;amp;hl=es_UY&amp;amp;gl=US Android] o para [https://apps.apple.com/es/app/expo-go/id982107779 iOS] según sea el caso.&lt;br /&gt;
&lt;br /&gt;
Para a visualizar la app en desarrollo desde Expo Go, procedemos de la siguiente forma:&lt;br /&gt;
Desde el directorio raíz de la aplicación ejecutamos desde la terminal lo siguiente:&lt;br /&gt;
&lt;br /&gt;
''''npm start''''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego, desde la aplicación Expo Go, con el celular conectado en la misma red local accedemos a la aplicación seleccionando lo siguiente:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Expo.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hecho esto, podemos cambiar el código de la aplicación y ver reflejados los cambios de forma casi instantánea.&lt;br /&gt;
&lt;br /&gt;
La aplicacion esta compuesta por dos pantallas, la pantalla de configuracion (''ConfigScreen.js''), donde se ingresa la direccion ip y puerto del servidor, y la pantalla principal (''MainScreen.js''), donde se lleva a cabo la programacion del robot mediante acciones.&lt;br /&gt;
&lt;br /&gt;
Esta ultima pantalla esta compuesta por los componentes ''TopList.js'' y ''BoottomList.js''.&lt;br /&gt;
&lt;br /&gt;
Para agregar una nueva accion al sistema, es necesario programarla en el servidor con un deteminado nombre, supondremos &amp;quot;AccionN&amp;quot;, esto resulta facil si se toma como ejemplo las acciones ya implementadas.&lt;br /&gt;
&lt;br /&gt;
En la aplicacion, esta nueva accion se agrega en el array &amp;quot;''actionsData''&amp;quot;, dicho array se encuentra en la palntalla principal, es decir en el archivo &amp;quot;''MainScreen.js''&amp;quot;, cada accion cuenta con los siguientes datos:&lt;br /&gt;
&lt;br /&gt;
-'''idAccion:''' Identificador de la accion en dicho arreglo (actionsData).&lt;br /&gt;
&lt;br /&gt;
-'''title:''': Titulo de la accion que se muetra en el panel superior.&lt;br /&gt;
&lt;br /&gt;
-'''actionId:''' Nombre identificador de la accion en el servidor.&lt;br /&gt;
&lt;br /&gt;
-'''overlay:''': ''Overlay'' que se despliega al seleccionar la accion si esta lleva un parametro, esta funcion lleva como parametro &amp;quot;''editOverlay''&amp;quot; y &amp;quot;''id''&amp;quot; (parametros que se utilizan cuando se requiere cambiar el valor del parametro de la accuion que ya fue seleccionada y se encuentra en el panel inferior), como por ejemplo pueden ser segundos en el caso de la accion &amp;quot;Avanzar&amp;quot;, o colores en el caso de &amp;quot;Avanzar hasta obstaculo&amp;quot;. Este parametro puede ser que no sea necesario, como es en el caso de la accion &amp;quot;Avanzar hasta obstaculo&amp;quot;, en este ultimo caso el valor de este campo es null.&lt;br /&gt;
&lt;br /&gt;
Ejemplo de la accion &amp;quot;Avanzar&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Screenshot from 2021-06-27 04-18-42.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ejemplo de la accion &amp;quot;Avanzar hasta obstaculo&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Screenshot_from_2021-06-27_00-28-32.png]]&lt;br /&gt;
&lt;br /&gt;
== Manual de uso de la aplicación ==&lt;br /&gt;
&lt;br /&gt;
Aunque la aplicación resulta intuitiva y fácil de usar se describe a continuación una serie de pasos para utilizarla correctamente.&lt;br /&gt;
&lt;br /&gt;
Para comenzar a utilizar la aplicación es necesario configurar la coneccion de la aplicación con el servidor (recordar que ambos se deben encontrar ejecutándose en la misma red local), el servidor ejecutando en una computadora que esté conectada correctamente al butiá (con los sensores descritos anteriormente) y la aplicación ejecutándose en el celular.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Conectando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego que la conexión haya resultado exitosa, nos encontramos en la página principal. En el panel superior, como se muestra a continuación, se encuentran las aplicaciones disponibles que podemos ejecutar en el robot butiá.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Acciones.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para agregar una serie de acciones al robot, simplemente presionamos la que queramos, a continuación esta aparecerá en el panel inferior, a medida de que vayamos seleccionando acciones, estas se irán encadenando una tras otras, estas estarán prontas para ejecutarse secuencialmente, desde la parte inferior a la parte superior, en el momento que presionemos el botón &amp;quot;Empezar&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Agregando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Como la aplicación está pensada para planificar algoritmos para resolver problemas, como puzzles, es probable que nos equivoquemos y seleccionemos una acción o insertemos un parámetro incorrectamente, ¡pero no te preocupes!. Para editar el parámetro que le hayamos ingresado a una acción, simplemente mantenemos pulsado la que deseamos corregir e ingresamos el nuevo valor.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Editando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
También es posible eliminar una acción, para hacer esto, nuevamente mantenemos pulsada la acción que queremos eliminar, pero esta vez, seleccionamos la acción eliminar. A continuación la acción seleccionada desaparecerá del panel inferior. También es posible que deseemos eliminar todas las acciones que habíamos ingresado, en este caso seleccionamos el botón &amp;quot;Eliminar acciones&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Eliminando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es posible que queremos que el robot se desplace a ciertas velocidades, teniendo en cuenta que al modificar la velocidad, el robot tendrá un comportamiento totalmente diferente, debido a que gran parte de las acciones se ejecutan por un tiempo asignado, a mayor velocidad, más desplazamiento.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Velocidad.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En caso de que exista un error en la coneccion, podemos intentar volver a conectar la aplicacion al servidor, para esto seleccionamos la opción configuración.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:A configuracion.gif]]&lt;br /&gt;
&lt;br /&gt;
== Video de muestra ==&lt;br /&gt;
&lt;br /&gt;
== Mejoras a futuro ==&lt;br /&gt;
&lt;br /&gt;
* Implementar una forma para que las función ''' Accion1 ''' pueda recibir parámetros, para así ampliar la gama de problemas que se puedan solucionar a través de esta aplicación.&lt;br /&gt;
&lt;br /&gt;
* Implementación de código que permita añadir a través del código, una mayor cantidad de funciones genéricas a la aplicación.&lt;br /&gt;
&lt;br /&gt;
* Desarrollar una forma de comunicación bilateral entre la ''App Mobile'' y Python para mejorar el ''debug'' en tiempo de ejecución.&lt;br /&gt;
&lt;br /&gt;
== Archivos de uso ==&lt;/div&gt;</summary>
		<author><name>German.moreira</name></author>	</entry>

	<entry>
		<id>http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Programando_el_Butia_desde_el_celular&amp;diff=11627</id>
		<title>Programando el Butia desde el celular</title>
		<link rel="alternate" type="text/html" href="http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Programando_el_Butia_desde_el_celular&amp;diff=11627"/>
				<updated>2021-06-27T07:29:06Z</updated>
		
		<summary type="html">&lt;p&gt;German.moreira: /* Mejoras a futuro */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Introducción ==&lt;br /&gt;
&lt;br /&gt;
La idea del proyecto en un principio era usar el celular como medio para controlar el robot Butiá para que resulte más atractivo para los estudiantes que no les guste la programación.&lt;br /&gt;
&lt;br /&gt;
Luego, la idea se modifico un poco debido a que descubrimos que con esta implementación, podíamos hacer mas sencilla la resolución de algunos ejercicios básicos mediante algoritmos mas simplificados, tomamos el trabajo que teníamos hecho hasta el momento y lo adaptamos a un menú con distintas acciones simples como avanzar un determinado tiempo, avanzar hasta chocar contra un objeto o rotar a la izquierda o derecha un determinado tiempo.&lt;br /&gt;
&lt;br /&gt;
Estas funciones básicas y bastante sencillas de entender más una interfaz amigable y fácil de usar, se implementaron para que el rango de edad de uso de esta aplicación vaya de 3 años en adelante.&lt;br /&gt;
&lt;br /&gt;
Como resultado obtuvimos una aplicación que se puede usar para que niños de:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- 4 / 5 / 6 años resuelvan ejercicios sencillos como puede ser llegar de un punto a otro, buscar el camino a un objeto o resolver un laberinto sencillo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- 7 / 8 / 9 años puedan resolver ejercicios un poco más complejos como puede ser resolver un laberinto del más sencillo al mas complejo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- 10 años en adelante tengan la capacidad de adaptar una parte personal de código al programa y puedan resolver cualquier ejercicio que se pueda plantear con el robot Butiá.&lt;br /&gt;
&lt;br /&gt;
== Objetivo ==&lt;br /&gt;
&lt;br /&gt;
Los objetivos del proyecto eran, como dice el nombre, poder conectar remotamente el robot Butiá a un celular y buscar una abstracción de la mayor cantidad de problemas que puedan ser resueltos con el robot Butiá.&lt;br /&gt;
&lt;br /&gt;
Esto para poder crear un método de uso del robot Butiá más dinámico y con funciones que permiten realizar, mediante algoritmos mas sencillos, la solución de la mayor cantidad de puzles particulares.&lt;br /&gt;
&lt;br /&gt;
Al hacer esto el nivel de uso en aulas del robot Butiá, puede simplificarse hasta clases desde 3 años de jardinera en adelante, debido a que la aplicación simplifica la parte de codificación y los algoritmos de solución de ejercicios se convierten simplemente en una serie de pasos básicos a ejecutar linealmente.&lt;br /&gt;
&lt;br /&gt;
== Armado del Butiá ==&lt;br /&gt;
&lt;br /&gt;
* Paso 1: Armar el Butiá a partir de esta [https://www.fing.edu.uy/inco/proyectos/butia/files/docs_butia2/armando_paso_a_paso_motores_CC_rev1.pdf guía oficial]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''' Los siguientes pasos son opcionales '''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Paso 2: Instalar el sensor de grises&lt;br /&gt;
&lt;br /&gt;
1:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP1.jpeg]] &lt;br /&gt;
&lt;br /&gt;
2:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP2.jpeg]]&lt;br /&gt;
&lt;br /&gt;
3:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP3.jpeg]]&lt;br /&gt;
&lt;br /&gt;
4:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP4.jpeg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Paso 3: Instalar el sensor de distancia&lt;br /&gt;
&lt;br /&gt;
1:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP1.png]]&lt;br /&gt;
&lt;br /&gt;
2:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP2.png]]&lt;br /&gt;
&lt;br /&gt;
3:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP3.png]]&lt;br /&gt;
&lt;br /&gt;
4:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP4.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Protocolo de comunicación ==&lt;br /&gt;
El protocolo de comunicaron diseñado para la comunicación entre Servidor y Aplicación ''Mobile'' es el siguiente:&lt;br /&gt;
&lt;br /&gt;
'''''Accion0-S0\nAccion1-S1\nAccion2-S2\nAccion3\nAccion4-S4\nVelocidad'''''&lt;br /&gt;
&lt;br /&gt;
Donde, este ''string'' representa la serie encadenada de acciones que el servidor recibe para ejecutar en el robot desde la aplicación.&lt;br /&gt;
Cada acción esta separada de la que se encuentra a continuación por el símbolo &amp;quot;''\n''&amp;quot;.&lt;br /&gt;
Podemos diferenciar dos tipos de acciones, las que requieren parámetro y las que no, estas se comunican de la siguiente forma:&lt;br /&gt;
'''Acción con parámetro''': NombreAccion-Parametro&lt;br /&gt;
&lt;br /&gt;
'''Acción sin parámetro''': NombreAccion&lt;br /&gt;
&lt;br /&gt;
== Implementación código Python ==&lt;br /&gt;
&lt;br /&gt;
Antes de empezar a programar o usar el código, es necesario instalar las librerías a usar, esto se puede hacer escribiendo &lt;br /&gt;
&lt;br /&gt;
'''''pip install [nombre de la librería]''''' en el interprete de comandos del sistema.&lt;br /&gt;
&lt;br /&gt;
Entonces instalamos la librería a utilizar, en este caso:&lt;br /&gt;
&lt;br /&gt;
'''''pip install simple_websocket_server'''''&lt;br /&gt;
&lt;br /&gt;
Una vez instalada la librería, hay que empezar a escribir el código.&lt;br /&gt;
&lt;br /&gt;
El encabezado del código es el siguiente&lt;br /&gt;
El uso de cada librería se explica con detalle mas adelante&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Encabezado.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A partir de la librería '''sys''' se define el camino del sistema para utilizar los plugin Butiá.&lt;br /&gt;
En nuestro caso, la ruta es ''' '/home/trerb/TurtleBots.activity/plugins/butia' ''', eso se tiene que modificar dependiendo de donde se encuentren el directorio ''' TurtleBots.activity/ ''' en su sistema de archivos&lt;br /&gt;
&lt;br /&gt;
[[Archivo:UsoPluginButia.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego se encuentra la función ''' clearConsole ''',&lt;br /&gt;
Esta función sirve únicamente para limpiar el interprete de Python usando la librería ''' os ''' y tener una ejecución mas limpia&lt;br /&gt;
&lt;br /&gt;
[[Archivo:clearConsole().png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
El siguiente código utiliza la librería ''' socket ''' para conectarse a la web y preguntar la ip del ordenador que ejecuta el archivo y la muestra en pantalla, esto se usa para facilitar la conexión con la App Mobile&lt;br /&gt;
&lt;br /&gt;
[[Archivo:conexionSocket.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Las siguientes líneas de código preguntan al usuario que puerto va a utilizar para la conexión, este código verifica que se ingrese un dato numérico, dentro del rango de los puertos, y que el puerto este disponible.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:tryPuerto.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego se declaran las variables: ''' Speed, Puerto_Gris y Puerto_Distancia ''', se verifica que los sensores de distancia y de grises estén conectados y asigna el puerto en el que estén conectados a las variables ''' Puerto_Distancia ''' y ''' Puerto_Gris ''' respectivamente. La variable ''' Speed ''' es una variable global que se lee al inicio de cada cadena de acciones y la utiliza para todos los movimientos del Butiá de esa cadena.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:declaracionVariables.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Seguimos con la declaración de las funciones básicas del Butiá, en este caso son ''' Avanzar, Rotar, AvanzarHastaVerColor y AvanzarHastaObstaculo ''' &lt;br /&gt;
&lt;br /&gt;
-La función ''' Avanzar ''' recibe un parámetro de tiempo y el Butiá avanza ese determinado tiempo.&lt;br /&gt;
&lt;br /&gt;
-La función ''' Retroceder ''' recibe un parámetro de tiempo y el Butiá retrocede ese determinado tiempo.&lt;br /&gt;
&lt;br /&gt;
-La función ''' Rotar ''' recibe dos parámetros, una dirección que puede ser Izquierda o Derecha y un tiempo que indica la duración de la rotación del Butiá.&lt;br /&gt;
&lt;br /&gt;
-La función ''' AvanzarHastaVerColor ''' recibe un parámetro que varia entre Blanco o Negro, el robot va a avanzar hasta detectar el color seleccionado.&lt;br /&gt;
Esta función solo se puede usar si el sensor de grises esta conectado.&lt;br /&gt;
&lt;br /&gt;
-Por ultimo, la función ''' AvanzarHastaObstaculo ''' no recibe parámetros, en este caso el Butiá va a avanzar hasta estar a unos pocos centímetros de un obstáculo.&lt;br /&gt;
Esta función solo se puede usar si el sensor de distancia esta conectado.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:FuncionesBasicas.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego se encuentra una función ''' Accion1 ''' esta función la puede definir el usuario a gusto, se puede implementar desde una función básica hasta un seguidor de líneas avanzado. La única condición que se necesita para implementar esta ''' Accion1 ''' es que no puede recibir parámetros&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Accion1.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ahora tenemos que definir el menú principal del programa, este se divide en dos funciones&lt;br /&gt;
&lt;br /&gt;
- ''' handle ''': Esta es una función predeterminada de la librería ''' simple_web_socket ''' y se llama cada vez que el servidor recibe un dato del cliente. En este caso la función crea una lista de las acciones que le llegan de la App Mobile, y las va ejecutando ordenadamente&lt;br /&gt;
&lt;br /&gt;
- ''' handle_close ''': Al igual que la función anterior, esta también es una función predeterminada de la librería ''' simple_web_socket ''' y se llama cuando el cliente se desconecta del servidor&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Screenshot from 2021-06-27 03-58-56.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Y por ultimo tenemos el dos líneas de codigo, la primera se encarga de abrir el servidor y la segunda lo mantiene abierto infinitamente&lt;br /&gt;
&lt;br /&gt;
[[Archivo:abrirServidor.png]]&lt;br /&gt;
&lt;br /&gt;
== Implementación codigo React ==&lt;br /&gt;
&lt;br /&gt;
La aplicacion movil esta implementada con React Native, ademas, se utiliza el ''framework'' [https://docs.expo.io/ Expo]. Este ''framework'' nos brinda un conjunto de herramientas que facilita el desarrollo de aplicaciones mobiles. &lt;br /&gt;
En caso de querer agregar, o modificar cualidades, es necesario proceder de la siguiente forma:&lt;br /&gt;
&lt;br /&gt;
Descargar el archivo comprimido adjunto.&lt;br /&gt;
&lt;br /&gt;
Extraerlo, posicionarse en el directorio raiz de la carpeta descomprimida, y ejecutar desde la terminal lo siguiente (tener en cuenta que es necesario tener en la maquina, el gestor de paquetes [https://docs.npmjs.com/ npm]).&lt;br /&gt;
&lt;br /&gt;
''''npm install'''' &lt;br /&gt;
&lt;br /&gt;
Esto descarga las dependencias que utiliza la aplicación, luego de esto podemos empezar a desarrollar.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para visualizar los cambios en tiempo real mientras desarrollamos, es necesario instalar la aplicación Expo Go para [https://play.google.com/store/apps/details?id=host.exp.exponent&amp;amp;hl=es_UY&amp;amp;gl=US Android] o para [https://apps.apple.com/es/app/expo-go/id982107779 iOS] según sea el caso.&lt;br /&gt;
&lt;br /&gt;
Para a visualizar la app en desarrollo desde Expo Go, procedemos de la siguiente forma:&lt;br /&gt;
Desde el directorio raíz de la aplicación ejecutamos desde la terminal lo siguiente:&lt;br /&gt;
&lt;br /&gt;
''''npm start''''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego, desde la aplicación Expo Go, con el celular conectado en la misma red local accedemos a la aplicación seleccionando lo siguiente:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Expo.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hecho esto, podemos cambiar el código de la aplicación y ver reflejados los cambios de forma casi instantánea.&lt;br /&gt;
&lt;br /&gt;
La aplicacion esta compuesta por dos pantallas, la pantalla de configuracion (''ConfigScreen.js''), donde se ingresa la direccion ip y puerto del servidor, y la pantalla principal (''MainScreen.js''), donde se lleva a cabo la programacion del robot mediante acciones.&lt;br /&gt;
&lt;br /&gt;
Esta ultima pantalla esta compuesta por los componentes ''TopList.js'' y ''BoottomList.js''.&lt;br /&gt;
&lt;br /&gt;
Para agregar una nueva accion al sistema, es necesario programarla en el servidor con un deteminado nombre, supondremos &amp;quot;AccionN&amp;quot;, esto resulta facil si se toma como ejemplo las acciones ya implementadas.&lt;br /&gt;
&lt;br /&gt;
En la aplicacion, esta nueva accion se agrega en el array &amp;quot;''actionsData''&amp;quot;, dicho array se encuentra en la palntalla principal, es decir en el archivo &amp;quot;''MainScreen.js''&amp;quot;, cada accion cuenta con los siguientes datos:&lt;br /&gt;
&lt;br /&gt;
-'''idAccion:''' Identificador de la accion en dicho arreglo (actionsData).&lt;br /&gt;
&lt;br /&gt;
-'''title:''': Titulo de la accion que se muetra en el panel superior.&lt;br /&gt;
&lt;br /&gt;
-'''actionId:''' Nombre identificador de la accion en el servidor.&lt;br /&gt;
&lt;br /&gt;
-'''overlay:''': ''Overlay'' que se despliega al seleccionar la accion si esta lleva un parametro, esta funcion lleva como parametro &amp;quot;''editOverlay''&amp;quot; y &amp;quot;''id''&amp;quot; (parametros que se utilizan cuando se requiere cambiar el valor del parametro de la accuion que ya fue seleccionada y se encuentra en el panel inferior), como por ejemplo pueden ser segundos en el caso de la accion &amp;quot;Avanzar&amp;quot;, o colores en el caso de &amp;quot;Avanzar hasta obstaculo&amp;quot;. Este parametro puede ser que no sea necesario, como es en el caso de la accion &amp;quot;Avanzar hasta obstaculo&amp;quot;, en este ultimo caso el valor de este campo es null.&lt;br /&gt;
&lt;br /&gt;
Ejemplo de la accion &amp;quot;Avanzar&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Screenshot from 2021-06-27 04-18-42.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ejemplo de la accion &amp;quot;Avanzar hasta obstaculo&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Screenshot_from_2021-06-27_00-28-32.png]]&lt;br /&gt;
&lt;br /&gt;
== Manual de uso de la aplicación ==&lt;br /&gt;
&lt;br /&gt;
Aunque la aplicación resulta intuitiva y fácil de usar se describe a continuación una serie de pasos para utilizarla correctamente.&lt;br /&gt;
&lt;br /&gt;
Para comenzar a utilizar la aplicación es necesario configurar la coneccion de la aplicación con el servidor (recordar que ambos se deben encontrar ejecutándose en la misma red local), el servidor ejecutando en una computadora que esté conectada correctamente al butiá (con los sensores descritos anteriormente) y la aplicación ejecutándose en el celular.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Conectando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego que la conexión haya resultado exitosa, nos encontramos en la página principal. En el panel superior, como se muestra a continuación, se encuentran las aplicaciones disponibles que podemos ejecutar en el robot butiá.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Acciones.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para agregar una serie de acciones al robot, simplemente presionamos la que queramos, a continuación esta aparecerá en el panel inferior, a medida de que vayamos seleccionando acciones, estas se irán encadenando una tras otras, estas estarán prontas para ejecutarse secuencialmente, desde la parte inferior a la parte superior, en el momento que presionemos el botón &amp;quot;Empezar&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Agregando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Como la aplicación está pensada para planificar algoritmos para resolver problemas, como puzzles, es probable que nos equivoquemos y seleccionemos una acción o insertemos un parámetro incorrectamente, ¡pero no te preocupes!. Para editar el parámetro que le hayamos ingresado a una acción, simplemente mantenemos pulsado la que deseamos corregir e ingresamos el nuevo valor.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Editando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
También es posible eliminar una acción, para hacer esto, nuevamente mantenemos pulsada la acción que queremos eliminar, pero esta vez, seleccionamos la acción eliminar. A continuación la acción seleccionada desaparecerá del panel inferior. También es posible que deseemos eliminar todas las acciones que habíamos ingresado, en este caso seleccionamos el botón &amp;quot;Eliminar acciones&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Eliminando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es posible que queremos que el robot se desplace a ciertas velocidades, teniendo en cuenta que al modificar la velocidad, el robot tendrá un comportamiento totalmente diferente, debido a que gran parte de las acciones se ejecutan por un tiempo asignado, a mayor velocidad, más desplazamiento.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Velocidad.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En caso de que exista un error en la coneccion, podemos intentar volver a conectar la aplicacion al servidor, para esto seleccionamos la opción configuración.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:A configuracion.gif]]&lt;br /&gt;
&lt;br /&gt;
== Video de muestra ==&lt;br /&gt;
&lt;br /&gt;
== Mejoras a futuro ==&lt;br /&gt;
&lt;br /&gt;
* Implementar una forma para que las función ''' Accion1 ''' pueda recibir parámetros, para así ampliar la gama de problemas que se puedan solucionar a través de esta aplicación.&lt;br /&gt;
&lt;br /&gt;
* Implementación de código que permita añadir a través del código, una mayor cantidad de funciones genéricas a la aplicación.&lt;br /&gt;
&lt;br /&gt;
* Desarrollar una forma de comunicación bilateral entre la ''App Mobile'' y Python para mejorar el debug en tiempo de ejecución.&lt;br /&gt;
&lt;br /&gt;
== Archivos de uso ==&lt;/div&gt;</summary>
		<author><name>German.moreira</name></author>	</entry>

	<entry>
		<id>http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Programando_el_Butia_desde_el_celular&amp;diff=11626</id>
		<title>Programando el Butia desde el celular</title>
		<link rel="alternate" type="text/html" href="http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Programando_el_Butia_desde_el_celular&amp;diff=11626"/>
				<updated>2021-06-27T07:28:27Z</updated>
		
		<summary type="html">&lt;p&gt;German.moreira: /* Protocolo de comunicación */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Introducción ==&lt;br /&gt;
&lt;br /&gt;
La idea del proyecto en un principio era usar el celular como medio para controlar el robot Butiá para que resulte más atractivo para los estudiantes que no les guste la programación.&lt;br /&gt;
&lt;br /&gt;
Luego, la idea se modifico un poco debido a que descubrimos que con esta implementación, podíamos hacer mas sencilla la resolución de algunos ejercicios básicos mediante algoritmos mas simplificados, tomamos el trabajo que teníamos hecho hasta el momento y lo adaptamos a un menú con distintas acciones simples como avanzar un determinado tiempo, avanzar hasta chocar contra un objeto o rotar a la izquierda o derecha un determinado tiempo.&lt;br /&gt;
&lt;br /&gt;
Estas funciones básicas y bastante sencillas de entender más una interfaz amigable y fácil de usar, se implementaron para que el rango de edad de uso de esta aplicación vaya de 3 años en adelante.&lt;br /&gt;
&lt;br /&gt;
Como resultado obtuvimos una aplicación que se puede usar para que niños de:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- 4 / 5 / 6 años resuelvan ejercicios sencillos como puede ser llegar de un punto a otro, buscar el camino a un objeto o resolver un laberinto sencillo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- 7 / 8 / 9 años puedan resolver ejercicios un poco más complejos como puede ser resolver un laberinto del más sencillo al mas complejo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- 10 años en adelante tengan la capacidad de adaptar una parte personal de código al programa y puedan resolver cualquier ejercicio que se pueda plantear con el robot Butiá.&lt;br /&gt;
&lt;br /&gt;
== Objetivo ==&lt;br /&gt;
&lt;br /&gt;
Los objetivos del proyecto eran, como dice el nombre, poder conectar remotamente el robot Butiá a un celular y buscar una abstracción de la mayor cantidad de problemas que puedan ser resueltos con el robot Butiá.&lt;br /&gt;
&lt;br /&gt;
Esto para poder crear un método de uso del robot Butiá más dinámico y con funciones que permiten realizar, mediante algoritmos mas sencillos, la solución de la mayor cantidad de puzles particulares.&lt;br /&gt;
&lt;br /&gt;
Al hacer esto el nivel de uso en aulas del robot Butiá, puede simplificarse hasta clases desde 3 años de jardinera en adelante, debido a que la aplicación simplifica la parte de codificación y los algoritmos de solución de ejercicios se convierten simplemente en una serie de pasos básicos a ejecutar linealmente.&lt;br /&gt;
&lt;br /&gt;
== Armado del Butiá ==&lt;br /&gt;
&lt;br /&gt;
* Paso 1: Armar el Butiá a partir de esta [https://www.fing.edu.uy/inco/proyectos/butia/files/docs_butia2/armando_paso_a_paso_motores_CC_rev1.pdf guía oficial]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''' Los siguientes pasos son opcionales '''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Paso 2: Instalar el sensor de grises&lt;br /&gt;
&lt;br /&gt;
1:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP1.jpeg]] &lt;br /&gt;
&lt;br /&gt;
2:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP2.jpeg]]&lt;br /&gt;
&lt;br /&gt;
3:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP3.jpeg]]&lt;br /&gt;
&lt;br /&gt;
4:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP4.jpeg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Paso 3: Instalar el sensor de distancia&lt;br /&gt;
&lt;br /&gt;
1:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP1.png]]&lt;br /&gt;
&lt;br /&gt;
2:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP2.png]]&lt;br /&gt;
&lt;br /&gt;
3:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP3.png]]&lt;br /&gt;
&lt;br /&gt;
4:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP4.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Protocolo de comunicación ==&lt;br /&gt;
El protocolo de comunicaron diseñado para la comunicación entre Servidor y Aplicación ''Mobile'' es el siguiente:&lt;br /&gt;
&lt;br /&gt;
'''''Accion0-S0\nAccion1-S1\nAccion2-S2\nAccion3\nAccion4-S4\nVelocidad'''''&lt;br /&gt;
&lt;br /&gt;
Donde, este ''string'' representa la serie encadenada de acciones que el servidor recibe para ejecutar en el robot desde la aplicación.&lt;br /&gt;
Cada acción esta separada de la que se encuentra a continuación por el símbolo &amp;quot;''\n''&amp;quot;.&lt;br /&gt;
Podemos diferenciar dos tipos de acciones, las que requieren parámetro y las que no, estas se comunican de la siguiente forma:&lt;br /&gt;
'''Acción con parámetro''': NombreAccion-Parametro&lt;br /&gt;
&lt;br /&gt;
'''Acción sin parámetro''': NombreAccion&lt;br /&gt;
&lt;br /&gt;
== Implementación código Python ==&lt;br /&gt;
&lt;br /&gt;
Antes de empezar a programar o usar el código, es necesario instalar las librerías a usar, esto se puede hacer escribiendo &lt;br /&gt;
&lt;br /&gt;
'''''pip install [nombre de la librería]''''' en el interprete de comandos del sistema.&lt;br /&gt;
&lt;br /&gt;
Entonces instalamos la librería a utilizar, en este caso:&lt;br /&gt;
&lt;br /&gt;
'''''pip install simple_websocket_server'''''&lt;br /&gt;
&lt;br /&gt;
Una vez instalada la librería, hay que empezar a escribir el código.&lt;br /&gt;
&lt;br /&gt;
El encabezado del código es el siguiente&lt;br /&gt;
El uso de cada librería se explica con detalle mas adelante&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Encabezado.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A partir de la librería '''sys''' se define el camino del sistema para utilizar los plugin Butiá.&lt;br /&gt;
En nuestro caso, la ruta es ''' '/home/trerb/TurtleBots.activity/plugins/butia' ''', eso se tiene que modificar dependiendo de donde se encuentren el directorio ''' TurtleBots.activity/ ''' en su sistema de archivos&lt;br /&gt;
&lt;br /&gt;
[[Archivo:UsoPluginButia.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego se encuentra la función ''' clearConsole ''',&lt;br /&gt;
Esta función sirve únicamente para limpiar el interprete de Python usando la librería ''' os ''' y tener una ejecución mas limpia&lt;br /&gt;
&lt;br /&gt;
[[Archivo:clearConsole().png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
El siguiente código utiliza la librería ''' socket ''' para conectarse a la web y preguntar la ip del ordenador que ejecuta el archivo y la muestra en pantalla, esto se usa para facilitar la conexión con la App Mobile&lt;br /&gt;
&lt;br /&gt;
[[Archivo:conexionSocket.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Las siguientes líneas de código preguntan al usuario que puerto va a utilizar para la conexión, este código verifica que se ingrese un dato numérico, dentro del rango de los puertos, y que el puerto este disponible.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:tryPuerto.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego se declaran las variables: ''' Speed, Puerto_Gris y Puerto_Distancia ''', se verifica que los sensores de distancia y de grises estén conectados y asigna el puerto en el que estén conectados a las variables ''' Puerto_Distancia ''' y ''' Puerto_Gris ''' respectivamente. La variable ''' Speed ''' es una variable global que se lee al inicio de cada cadena de acciones y la utiliza para todos los movimientos del Butiá de esa cadena.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:declaracionVariables.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Seguimos con la declaración de las funciones básicas del Butiá, en este caso son ''' Avanzar, Rotar, AvanzarHastaVerColor y AvanzarHastaObstaculo ''' &lt;br /&gt;
&lt;br /&gt;
-La función ''' Avanzar ''' recibe un parámetro de tiempo y el Butiá avanza ese determinado tiempo.&lt;br /&gt;
&lt;br /&gt;
-La función ''' Retroceder ''' recibe un parámetro de tiempo y el Butiá retrocede ese determinado tiempo.&lt;br /&gt;
&lt;br /&gt;
-La función ''' Rotar ''' recibe dos parámetros, una dirección que puede ser Izquierda o Derecha y un tiempo que indica la duración de la rotación del Butiá.&lt;br /&gt;
&lt;br /&gt;
-La función ''' AvanzarHastaVerColor ''' recibe un parámetro que varia entre Blanco o Negro, el robot va a avanzar hasta detectar el color seleccionado.&lt;br /&gt;
Esta función solo se puede usar si el sensor de grises esta conectado.&lt;br /&gt;
&lt;br /&gt;
-Por ultimo, la función ''' AvanzarHastaObstaculo ''' no recibe parámetros, en este caso el Butiá va a avanzar hasta estar a unos pocos centímetros de un obstáculo.&lt;br /&gt;
Esta función solo se puede usar si el sensor de distancia esta conectado.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:FuncionesBasicas.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego se encuentra una función ''' Accion1 ''' esta función la puede definir el usuario a gusto, se puede implementar desde una función básica hasta un seguidor de líneas avanzado. La única condición que se necesita para implementar esta ''' Accion1 ''' es que no puede recibir parámetros&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Accion1.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ahora tenemos que definir el menú principal del programa, este se divide en dos funciones&lt;br /&gt;
&lt;br /&gt;
- ''' handle ''': Esta es una función predeterminada de la librería ''' simple_web_socket ''' y se llama cada vez que el servidor recibe un dato del cliente. En este caso la función crea una lista de las acciones que le llegan de la App Mobile, y las va ejecutando ordenadamente&lt;br /&gt;
&lt;br /&gt;
- ''' handle_close ''': Al igual que la función anterior, esta también es una función predeterminada de la librería ''' simple_web_socket ''' y se llama cuando el cliente se desconecta del servidor&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Screenshot from 2021-06-27 03-58-56.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Y por ultimo tenemos el dos líneas de codigo, la primera se encarga de abrir el servidor y la segunda lo mantiene abierto infinitamente&lt;br /&gt;
&lt;br /&gt;
[[Archivo:abrirServidor.png]]&lt;br /&gt;
&lt;br /&gt;
== Implementación codigo React ==&lt;br /&gt;
&lt;br /&gt;
La aplicacion movil esta implementada con React Native, ademas, se utiliza el ''framework'' [https://docs.expo.io/ Expo]. Este ''framework'' nos brinda un conjunto de herramientas que facilita el desarrollo de aplicaciones mobiles. &lt;br /&gt;
En caso de querer agregar, o modificar cualidades, es necesario proceder de la siguiente forma:&lt;br /&gt;
&lt;br /&gt;
Descargar el archivo comprimido adjunto.&lt;br /&gt;
&lt;br /&gt;
Extraerlo, posicionarse en el directorio raiz de la carpeta descomprimida, y ejecutar desde la terminal lo siguiente (tener en cuenta que es necesario tener en la maquina, el gestor de paquetes [https://docs.npmjs.com/ npm]).&lt;br /&gt;
&lt;br /&gt;
''''npm install'''' &lt;br /&gt;
&lt;br /&gt;
Esto descarga las dependencias que utiliza la aplicación, luego de esto podemos empezar a desarrollar.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para visualizar los cambios en tiempo real mientras desarrollamos, es necesario instalar la aplicación Expo Go para [https://play.google.com/store/apps/details?id=host.exp.exponent&amp;amp;hl=es_UY&amp;amp;gl=US Android] o para [https://apps.apple.com/es/app/expo-go/id982107779 iOS] según sea el caso.&lt;br /&gt;
&lt;br /&gt;
Para a visualizar la app en desarrollo desde Expo Go, procedemos de la siguiente forma:&lt;br /&gt;
Desde el directorio raíz de la aplicación ejecutamos desde la terminal lo siguiente:&lt;br /&gt;
&lt;br /&gt;
''''npm start''''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego, desde la aplicación Expo Go, con el celular conectado en la misma red local accedemos a la aplicación seleccionando lo siguiente:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Expo.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hecho esto, podemos cambiar el código de la aplicación y ver reflejados los cambios de forma casi instantánea.&lt;br /&gt;
&lt;br /&gt;
La aplicacion esta compuesta por dos pantallas, la pantalla de configuracion (''ConfigScreen.js''), donde se ingresa la direccion ip y puerto del servidor, y la pantalla principal (''MainScreen.js''), donde se lleva a cabo la programacion del robot mediante acciones.&lt;br /&gt;
&lt;br /&gt;
Esta ultima pantalla esta compuesta por los componentes ''TopList.js'' y ''BoottomList.js''.&lt;br /&gt;
&lt;br /&gt;
Para agregar una nueva accion al sistema, es necesario programarla en el servidor con un deteminado nombre, supondremos &amp;quot;AccionN&amp;quot;, esto resulta facil si se toma como ejemplo las acciones ya implementadas.&lt;br /&gt;
&lt;br /&gt;
En la aplicacion, esta nueva accion se agrega en el array &amp;quot;''actionsData''&amp;quot;, dicho array se encuentra en la palntalla principal, es decir en el archivo &amp;quot;''MainScreen.js''&amp;quot;, cada accion cuenta con los siguientes datos:&lt;br /&gt;
&lt;br /&gt;
-'''idAccion:''' Identificador de la accion en dicho arreglo (actionsData).&lt;br /&gt;
&lt;br /&gt;
-'''title:''': Titulo de la accion que se muetra en el panel superior.&lt;br /&gt;
&lt;br /&gt;
-'''actionId:''' Nombre identificador de la accion en el servidor.&lt;br /&gt;
&lt;br /&gt;
-'''overlay:''': ''Overlay'' que se despliega al seleccionar la accion si esta lleva un parametro, esta funcion lleva como parametro &amp;quot;''editOverlay''&amp;quot; y &amp;quot;''id''&amp;quot; (parametros que se utilizan cuando se requiere cambiar el valor del parametro de la accuion que ya fue seleccionada y se encuentra en el panel inferior), como por ejemplo pueden ser segundos en el caso de la accion &amp;quot;Avanzar&amp;quot;, o colores en el caso de &amp;quot;Avanzar hasta obstaculo&amp;quot;. Este parametro puede ser que no sea necesario, como es en el caso de la accion &amp;quot;Avanzar hasta obstaculo&amp;quot;, en este ultimo caso el valor de este campo es null.&lt;br /&gt;
&lt;br /&gt;
Ejemplo de la accion &amp;quot;Avanzar&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Screenshot from 2021-06-27 04-18-42.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ejemplo de la accion &amp;quot;Avanzar hasta obstaculo&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Screenshot_from_2021-06-27_00-28-32.png]]&lt;br /&gt;
&lt;br /&gt;
== Manual de uso de la aplicación ==&lt;br /&gt;
&lt;br /&gt;
Aunque la aplicación resulta intuitiva y fácil de usar se describe a continuación una serie de pasos para utilizarla correctamente.&lt;br /&gt;
&lt;br /&gt;
Para comenzar a utilizar la aplicación es necesario configurar la coneccion de la aplicación con el servidor (recordar que ambos se deben encontrar ejecutándose en la misma red local), el servidor ejecutando en una computadora que esté conectada correctamente al butiá (con los sensores descritos anteriormente) y la aplicación ejecutándose en el celular.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Conectando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego que la conexión haya resultado exitosa, nos encontramos en la página principal. En el panel superior, como se muestra a continuación, se encuentran las aplicaciones disponibles que podemos ejecutar en el robot butiá.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Acciones.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para agregar una serie de acciones al robot, simplemente presionamos la que queramos, a continuación esta aparecerá en el panel inferior, a medida de que vayamos seleccionando acciones, estas se irán encadenando una tras otras, estas estarán prontas para ejecutarse secuencialmente, desde la parte inferior a la parte superior, en el momento que presionemos el botón &amp;quot;Empezar&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Agregando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Como la aplicación está pensada para planificar algoritmos para resolver problemas, como puzzles, es probable que nos equivoquemos y seleccionemos una acción o insertemos un parámetro incorrectamente, ¡pero no te preocupes!. Para editar el parámetro que le hayamos ingresado a una acción, simplemente mantenemos pulsado la que deseamos corregir e ingresamos el nuevo valor.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Editando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
También es posible eliminar una acción, para hacer esto, nuevamente mantenemos pulsada la acción que queremos eliminar, pero esta vez, seleccionamos la acción eliminar. A continuación la acción seleccionada desaparecerá del panel inferior. También es posible que deseemos eliminar todas las acciones que habíamos ingresado, en este caso seleccionamos el botón &amp;quot;Eliminar acciones&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Eliminando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es posible que queremos que el robot se desplace a ciertas velocidades, teniendo en cuenta que al modificar la velocidad, el robot tendrá un comportamiento totalmente diferente, debido a que gran parte de las acciones se ejecutan por un tiempo asignado, a mayor velocidad, más desplazamiento.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Velocidad.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En caso de que exista un error en la coneccion, podemos intentar volver a conectar la aplicacion al servidor, para esto seleccionamos la opción configuración.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:A configuracion.gif]]&lt;br /&gt;
&lt;br /&gt;
== Video de muestra ==&lt;br /&gt;
&lt;br /&gt;
== Mejoras a futuro ==&lt;br /&gt;
&lt;br /&gt;
* Implementar una forma para que las función ''' Accion1 ''' pueda recibir parámetros, para así ampliar la gama de problemas que se puedan solucionar a través de esta aplicación.&lt;br /&gt;
&lt;br /&gt;
* Implementación de código que permita añadir a través del código, una mayor cantidad de funciones genéricas a la aplicación.&lt;br /&gt;
&lt;br /&gt;
* Desarrollar una forma de comunicación bilateral entre la App Mobile y Python para mejorar el debug en tiempo de ejecución.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Archivos de uso ==&lt;/div&gt;</summary>
		<author><name>German.moreira</name></author>	</entry>

	<entry>
		<id>http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Programando_el_Butia_desde_el_celular&amp;diff=11625</id>
		<title>Programando el Butia desde el celular</title>
		<link rel="alternate" type="text/html" href="http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Programando_el_Butia_desde_el_celular&amp;diff=11625"/>
				<updated>2021-06-27T07:28:13Z</updated>
		
		<summary type="html">&lt;p&gt;German.moreira: /* Protocolo de comunicación */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Introducción ==&lt;br /&gt;
&lt;br /&gt;
La idea del proyecto en un principio era usar el celular como medio para controlar el robot Butiá para que resulte más atractivo para los estudiantes que no les guste la programación.&lt;br /&gt;
&lt;br /&gt;
Luego, la idea se modifico un poco debido a que descubrimos que con esta implementación, podíamos hacer mas sencilla la resolución de algunos ejercicios básicos mediante algoritmos mas simplificados, tomamos el trabajo que teníamos hecho hasta el momento y lo adaptamos a un menú con distintas acciones simples como avanzar un determinado tiempo, avanzar hasta chocar contra un objeto o rotar a la izquierda o derecha un determinado tiempo.&lt;br /&gt;
&lt;br /&gt;
Estas funciones básicas y bastante sencillas de entender más una interfaz amigable y fácil de usar, se implementaron para que el rango de edad de uso de esta aplicación vaya de 3 años en adelante.&lt;br /&gt;
&lt;br /&gt;
Como resultado obtuvimos una aplicación que se puede usar para que niños de:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- 4 / 5 / 6 años resuelvan ejercicios sencillos como puede ser llegar de un punto a otro, buscar el camino a un objeto o resolver un laberinto sencillo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- 7 / 8 / 9 años puedan resolver ejercicios un poco más complejos como puede ser resolver un laberinto del más sencillo al mas complejo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- 10 años en adelante tengan la capacidad de adaptar una parte personal de código al programa y puedan resolver cualquier ejercicio que se pueda plantear con el robot Butiá.&lt;br /&gt;
&lt;br /&gt;
== Objetivo ==&lt;br /&gt;
&lt;br /&gt;
Los objetivos del proyecto eran, como dice el nombre, poder conectar remotamente el robot Butiá a un celular y buscar una abstracción de la mayor cantidad de problemas que puedan ser resueltos con el robot Butiá.&lt;br /&gt;
&lt;br /&gt;
Esto para poder crear un método de uso del robot Butiá más dinámico y con funciones que permiten realizar, mediante algoritmos mas sencillos, la solución de la mayor cantidad de puzles particulares.&lt;br /&gt;
&lt;br /&gt;
Al hacer esto el nivel de uso en aulas del robot Butiá, puede simplificarse hasta clases desde 3 años de jardinera en adelante, debido a que la aplicación simplifica la parte de codificación y los algoritmos de solución de ejercicios se convierten simplemente en una serie de pasos básicos a ejecutar linealmente.&lt;br /&gt;
&lt;br /&gt;
== Armado del Butiá ==&lt;br /&gt;
&lt;br /&gt;
* Paso 1: Armar el Butiá a partir de esta [https://www.fing.edu.uy/inco/proyectos/butia/files/docs_butia2/armando_paso_a_paso_motores_CC_rev1.pdf guía oficial]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''' Los siguientes pasos son opcionales '''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Paso 2: Instalar el sensor de grises&lt;br /&gt;
&lt;br /&gt;
1:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP1.jpeg]] &lt;br /&gt;
&lt;br /&gt;
2:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP2.jpeg]]&lt;br /&gt;
&lt;br /&gt;
3:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP3.jpeg]]&lt;br /&gt;
&lt;br /&gt;
4:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP4.jpeg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Paso 3: Instalar el sensor de distancia&lt;br /&gt;
&lt;br /&gt;
1:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP1.png]]&lt;br /&gt;
&lt;br /&gt;
2:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP2.png]]&lt;br /&gt;
&lt;br /&gt;
3:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP3.png]]&lt;br /&gt;
&lt;br /&gt;
4:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP4.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Protocolo de comunicación ==&lt;br /&gt;
El protocolo de comunicaron diseñado para la comunicación entre Servidor y Aplicación ''Mobile'' es el siguiente:&lt;br /&gt;
&lt;br /&gt;
''Accion0-S0\nAccion1-S1\nAccion2-S2\nAccion3\nAccion4-S4\nVelocidad''&lt;br /&gt;
&lt;br /&gt;
Donde, este ''string'' representa la serie encadenada de acciones que el servidor recibe para ejecutar en el robot desde la aplicación.&lt;br /&gt;
Cada acción esta separada de la que se encuentra a continuación por el símbolo &amp;quot;''\n''&amp;quot;.&lt;br /&gt;
Podemos diferenciar dos tipos de acciones, las que requieren parámetro y las que no, estas se comunican de la siguiente forma:&lt;br /&gt;
'''Acción con parámetro''': NombreAccion-Parametro&lt;br /&gt;
&lt;br /&gt;
'''Acción sin parámetro''': NombreAccion&lt;br /&gt;
&lt;br /&gt;
== Implementación código Python ==&lt;br /&gt;
&lt;br /&gt;
Antes de empezar a programar o usar el código, es necesario instalar las librerías a usar, esto se puede hacer escribiendo &lt;br /&gt;
&lt;br /&gt;
'''''pip install [nombre de la librería]''''' en el interprete de comandos del sistema.&lt;br /&gt;
&lt;br /&gt;
Entonces instalamos la librería a utilizar, en este caso:&lt;br /&gt;
&lt;br /&gt;
'''''pip install simple_websocket_server'''''&lt;br /&gt;
&lt;br /&gt;
Una vez instalada la librería, hay que empezar a escribir el código.&lt;br /&gt;
&lt;br /&gt;
El encabezado del código es el siguiente&lt;br /&gt;
El uso de cada librería se explica con detalle mas adelante&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Encabezado.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A partir de la librería '''sys''' se define el camino del sistema para utilizar los plugin Butiá.&lt;br /&gt;
En nuestro caso, la ruta es ''' '/home/trerb/TurtleBots.activity/plugins/butia' ''', eso se tiene que modificar dependiendo de donde se encuentren el directorio ''' TurtleBots.activity/ ''' en su sistema de archivos&lt;br /&gt;
&lt;br /&gt;
[[Archivo:UsoPluginButia.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego se encuentra la función ''' clearConsole ''',&lt;br /&gt;
Esta función sirve únicamente para limpiar el interprete de Python usando la librería ''' os ''' y tener una ejecución mas limpia&lt;br /&gt;
&lt;br /&gt;
[[Archivo:clearConsole().png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
El siguiente código utiliza la librería ''' socket ''' para conectarse a la web y preguntar la ip del ordenador que ejecuta el archivo y la muestra en pantalla, esto se usa para facilitar la conexión con la App Mobile&lt;br /&gt;
&lt;br /&gt;
[[Archivo:conexionSocket.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Las siguientes líneas de código preguntan al usuario que puerto va a utilizar para la conexión, este código verifica que se ingrese un dato numérico, dentro del rango de los puertos, y que el puerto este disponible.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:tryPuerto.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego se declaran las variables: ''' Speed, Puerto_Gris y Puerto_Distancia ''', se verifica que los sensores de distancia y de grises estén conectados y asigna el puerto en el que estén conectados a las variables ''' Puerto_Distancia ''' y ''' Puerto_Gris ''' respectivamente. La variable ''' Speed ''' es una variable global que se lee al inicio de cada cadena de acciones y la utiliza para todos los movimientos del Butiá de esa cadena.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:declaracionVariables.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Seguimos con la declaración de las funciones básicas del Butiá, en este caso son ''' Avanzar, Rotar, AvanzarHastaVerColor y AvanzarHastaObstaculo ''' &lt;br /&gt;
&lt;br /&gt;
-La función ''' Avanzar ''' recibe un parámetro de tiempo y el Butiá avanza ese determinado tiempo.&lt;br /&gt;
&lt;br /&gt;
-La función ''' Retroceder ''' recibe un parámetro de tiempo y el Butiá retrocede ese determinado tiempo.&lt;br /&gt;
&lt;br /&gt;
-La función ''' Rotar ''' recibe dos parámetros, una dirección que puede ser Izquierda o Derecha y un tiempo que indica la duración de la rotación del Butiá.&lt;br /&gt;
&lt;br /&gt;
-La función ''' AvanzarHastaVerColor ''' recibe un parámetro que varia entre Blanco o Negro, el robot va a avanzar hasta detectar el color seleccionado.&lt;br /&gt;
Esta función solo se puede usar si el sensor de grises esta conectado.&lt;br /&gt;
&lt;br /&gt;
-Por ultimo, la función ''' AvanzarHastaObstaculo ''' no recibe parámetros, en este caso el Butiá va a avanzar hasta estar a unos pocos centímetros de un obstáculo.&lt;br /&gt;
Esta función solo se puede usar si el sensor de distancia esta conectado.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:FuncionesBasicas.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego se encuentra una función ''' Accion1 ''' esta función la puede definir el usuario a gusto, se puede implementar desde una función básica hasta un seguidor de líneas avanzado. La única condición que se necesita para implementar esta ''' Accion1 ''' es que no puede recibir parámetros&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Accion1.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ahora tenemos que definir el menú principal del programa, este se divide en dos funciones&lt;br /&gt;
&lt;br /&gt;
- ''' handle ''': Esta es una función predeterminada de la librería ''' simple_web_socket ''' y se llama cada vez que el servidor recibe un dato del cliente. En este caso la función crea una lista de las acciones que le llegan de la App Mobile, y las va ejecutando ordenadamente&lt;br /&gt;
&lt;br /&gt;
- ''' handle_close ''': Al igual que la función anterior, esta también es una función predeterminada de la librería ''' simple_web_socket ''' y se llama cuando el cliente se desconecta del servidor&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Screenshot from 2021-06-27 03-58-56.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Y por ultimo tenemos el dos líneas de codigo, la primera se encarga de abrir el servidor y la segunda lo mantiene abierto infinitamente&lt;br /&gt;
&lt;br /&gt;
[[Archivo:abrirServidor.png]]&lt;br /&gt;
&lt;br /&gt;
== Implementación codigo React ==&lt;br /&gt;
&lt;br /&gt;
La aplicacion movil esta implementada con React Native, ademas, se utiliza el ''framework'' [https://docs.expo.io/ Expo]. Este ''framework'' nos brinda un conjunto de herramientas que facilita el desarrollo de aplicaciones mobiles. &lt;br /&gt;
En caso de querer agregar, o modificar cualidades, es necesario proceder de la siguiente forma:&lt;br /&gt;
&lt;br /&gt;
Descargar el archivo comprimido adjunto.&lt;br /&gt;
&lt;br /&gt;
Extraerlo, posicionarse en el directorio raiz de la carpeta descomprimida, y ejecutar desde la terminal lo siguiente (tener en cuenta que es necesario tener en la maquina, el gestor de paquetes [https://docs.npmjs.com/ npm]).&lt;br /&gt;
&lt;br /&gt;
''''npm install'''' &lt;br /&gt;
&lt;br /&gt;
Esto descarga las dependencias que utiliza la aplicación, luego de esto podemos empezar a desarrollar.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para visualizar los cambios en tiempo real mientras desarrollamos, es necesario instalar la aplicación Expo Go para [https://play.google.com/store/apps/details?id=host.exp.exponent&amp;amp;hl=es_UY&amp;amp;gl=US Android] o para [https://apps.apple.com/es/app/expo-go/id982107779 iOS] según sea el caso.&lt;br /&gt;
&lt;br /&gt;
Para a visualizar la app en desarrollo desde Expo Go, procedemos de la siguiente forma:&lt;br /&gt;
Desde el directorio raíz de la aplicación ejecutamos desde la terminal lo siguiente:&lt;br /&gt;
&lt;br /&gt;
''''npm start''''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego, desde la aplicación Expo Go, con el celular conectado en la misma red local accedemos a la aplicación seleccionando lo siguiente:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Expo.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hecho esto, podemos cambiar el código de la aplicación y ver reflejados los cambios de forma casi instantánea.&lt;br /&gt;
&lt;br /&gt;
La aplicacion esta compuesta por dos pantallas, la pantalla de configuracion (''ConfigScreen.js''), donde se ingresa la direccion ip y puerto del servidor, y la pantalla principal (''MainScreen.js''), donde se lleva a cabo la programacion del robot mediante acciones.&lt;br /&gt;
&lt;br /&gt;
Esta ultima pantalla esta compuesta por los componentes ''TopList.js'' y ''BoottomList.js''.&lt;br /&gt;
&lt;br /&gt;
Para agregar una nueva accion al sistema, es necesario programarla en el servidor con un deteminado nombre, supondremos &amp;quot;AccionN&amp;quot;, esto resulta facil si se toma como ejemplo las acciones ya implementadas.&lt;br /&gt;
&lt;br /&gt;
En la aplicacion, esta nueva accion se agrega en el array &amp;quot;''actionsData''&amp;quot;, dicho array se encuentra en la palntalla principal, es decir en el archivo &amp;quot;''MainScreen.js''&amp;quot;, cada accion cuenta con los siguientes datos:&lt;br /&gt;
&lt;br /&gt;
-'''idAccion:''' Identificador de la accion en dicho arreglo (actionsData).&lt;br /&gt;
&lt;br /&gt;
-'''title:''': Titulo de la accion que se muetra en el panel superior.&lt;br /&gt;
&lt;br /&gt;
-'''actionId:''' Nombre identificador de la accion en el servidor.&lt;br /&gt;
&lt;br /&gt;
-'''overlay:''': ''Overlay'' que se despliega al seleccionar la accion si esta lleva un parametro, esta funcion lleva como parametro &amp;quot;''editOverlay''&amp;quot; y &amp;quot;''id''&amp;quot; (parametros que se utilizan cuando se requiere cambiar el valor del parametro de la accuion que ya fue seleccionada y se encuentra en el panel inferior), como por ejemplo pueden ser segundos en el caso de la accion &amp;quot;Avanzar&amp;quot;, o colores en el caso de &amp;quot;Avanzar hasta obstaculo&amp;quot;. Este parametro puede ser que no sea necesario, como es en el caso de la accion &amp;quot;Avanzar hasta obstaculo&amp;quot;, en este ultimo caso el valor de este campo es null.&lt;br /&gt;
&lt;br /&gt;
Ejemplo de la accion &amp;quot;Avanzar&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Screenshot from 2021-06-27 04-18-42.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ejemplo de la accion &amp;quot;Avanzar hasta obstaculo&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Screenshot_from_2021-06-27_00-28-32.png]]&lt;br /&gt;
&lt;br /&gt;
== Manual de uso de la aplicación ==&lt;br /&gt;
&lt;br /&gt;
Aunque la aplicación resulta intuitiva y fácil de usar se describe a continuación una serie de pasos para utilizarla correctamente.&lt;br /&gt;
&lt;br /&gt;
Para comenzar a utilizar la aplicación es necesario configurar la coneccion de la aplicación con el servidor (recordar que ambos se deben encontrar ejecutándose en la misma red local), el servidor ejecutando en una computadora que esté conectada correctamente al butiá (con los sensores descritos anteriormente) y la aplicación ejecutándose en el celular.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Conectando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego que la conexión haya resultado exitosa, nos encontramos en la página principal. En el panel superior, como se muestra a continuación, se encuentran las aplicaciones disponibles que podemos ejecutar en el robot butiá.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Acciones.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para agregar una serie de acciones al robot, simplemente presionamos la que queramos, a continuación esta aparecerá en el panel inferior, a medida de que vayamos seleccionando acciones, estas se irán encadenando una tras otras, estas estarán prontas para ejecutarse secuencialmente, desde la parte inferior a la parte superior, en el momento que presionemos el botón &amp;quot;Empezar&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Agregando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Como la aplicación está pensada para planificar algoritmos para resolver problemas, como puzzles, es probable que nos equivoquemos y seleccionemos una acción o insertemos un parámetro incorrectamente, ¡pero no te preocupes!. Para editar el parámetro que le hayamos ingresado a una acción, simplemente mantenemos pulsado la que deseamos corregir e ingresamos el nuevo valor.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Editando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
También es posible eliminar una acción, para hacer esto, nuevamente mantenemos pulsada la acción que queremos eliminar, pero esta vez, seleccionamos la acción eliminar. A continuación la acción seleccionada desaparecerá del panel inferior. También es posible que deseemos eliminar todas las acciones que habíamos ingresado, en este caso seleccionamos el botón &amp;quot;Eliminar acciones&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Eliminando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es posible que queremos que el robot se desplace a ciertas velocidades, teniendo en cuenta que al modificar la velocidad, el robot tendrá un comportamiento totalmente diferente, debido a que gran parte de las acciones se ejecutan por un tiempo asignado, a mayor velocidad, más desplazamiento.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Velocidad.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En caso de que exista un error en la coneccion, podemos intentar volver a conectar la aplicacion al servidor, para esto seleccionamos la opción configuración.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:A configuracion.gif]]&lt;br /&gt;
&lt;br /&gt;
== Video de muestra ==&lt;br /&gt;
&lt;br /&gt;
== Mejoras a futuro ==&lt;br /&gt;
&lt;br /&gt;
* Implementar una forma para que las función ''' Accion1 ''' pueda recibir parámetros, para así ampliar la gama de problemas que se puedan solucionar a través de esta aplicación.&lt;br /&gt;
&lt;br /&gt;
* Implementación de código que permita añadir a través del código, una mayor cantidad de funciones genéricas a la aplicación.&lt;br /&gt;
&lt;br /&gt;
* Desarrollar una forma de comunicación bilateral entre la App Mobile y Python para mejorar el debug en tiempo de ejecución.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Archivos de uso ==&lt;/div&gt;</summary>
		<author><name>German.moreira</name></author>	</entry>

	<entry>
		<id>http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Programando_el_Butia_desde_el_celular&amp;diff=11624</id>
		<title>Programando el Butia desde el celular</title>
		<link rel="alternate" type="text/html" href="http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Programando_el_Butia_desde_el_celular&amp;diff=11624"/>
				<updated>2021-06-27T07:27:58Z</updated>
		
		<summary type="html">&lt;p&gt;German.moreira: /* Protocolo de comunicacion */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Introducción ==&lt;br /&gt;
&lt;br /&gt;
La idea del proyecto en un principio era usar el celular como medio para controlar el robot Butiá para que resulte más atractivo para los estudiantes que no les guste la programación.&lt;br /&gt;
&lt;br /&gt;
Luego, la idea se modifico un poco debido a que descubrimos que con esta implementación, podíamos hacer mas sencilla la resolución de algunos ejercicios básicos mediante algoritmos mas simplificados, tomamos el trabajo que teníamos hecho hasta el momento y lo adaptamos a un menú con distintas acciones simples como avanzar un determinado tiempo, avanzar hasta chocar contra un objeto o rotar a la izquierda o derecha un determinado tiempo.&lt;br /&gt;
&lt;br /&gt;
Estas funciones básicas y bastante sencillas de entender más una interfaz amigable y fácil de usar, se implementaron para que el rango de edad de uso de esta aplicación vaya de 3 años en adelante.&lt;br /&gt;
&lt;br /&gt;
Como resultado obtuvimos una aplicación que se puede usar para que niños de:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- 4 / 5 / 6 años resuelvan ejercicios sencillos como puede ser llegar de un punto a otro, buscar el camino a un objeto o resolver un laberinto sencillo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- 7 / 8 / 9 años puedan resolver ejercicios un poco más complejos como puede ser resolver un laberinto del más sencillo al mas complejo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- 10 años en adelante tengan la capacidad de adaptar una parte personal de código al programa y puedan resolver cualquier ejercicio que se pueda plantear con el robot Butiá.&lt;br /&gt;
&lt;br /&gt;
== Objetivo ==&lt;br /&gt;
&lt;br /&gt;
Los objetivos del proyecto eran, como dice el nombre, poder conectar remotamente el robot Butiá a un celular y buscar una abstracción de la mayor cantidad de problemas que puedan ser resueltos con el robot Butiá.&lt;br /&gt;
&lt;br /&gt;
Esto para poder crear un método de uso del robot Butiá más dinámico y con funciones que permiten realizar, mediante algoritmos mas sencillos, la solución de la mayor cantidad de puzles particulares.&lt;br /&gt;
&lt;br /&gt;
Al hacer esto el nivel de uso en aulas del robot Butiá, puede simplificarse hasta clases desde 3 años de jardinera en adelante, debido a que la aplicación simplifica la parte de codificación y los algoritmos de solución de ejercicios se convierten simplemente en una serie de pasos básicos a ejecutar linealmente.&lt;br /&gt;
&lt;br /&gt;
== Armado del Butiá ==&lt;br /&gt;
&lt;br /&gt;
* Paso 1: Armar el Butiá a partir de esta [https://www.fing.edu.uy/inco/proyectos/butia/files/docs_butia2/armando_paso_a_paso_motores_CC_rev1.pdf guía oficial]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''' Los siguientes pasos son opcionales '''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Paso 2: Instalar el sensor de grises&lt;br /&gt;
&lt;br /&gt;
1:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP1.jpeg]] &lt;br /&gt;
&lt;br /&gt;
2:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP2.jpeg]]&lt;br /&gt;
&lt;br /&gt;
3:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP3.jpeg]]&lt;br /&gt;
&lt;br /&gt;
4:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP4.jpeg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Paso 3: Instalar el sensor de distancia&lt;br /&gt;
&lt;br /&gt;
1:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP1.png]]&lt;br /&gt;
&lt;br /&gt;
2:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP2.png]]&lt;br /&gt;
&lt;br /&gt;
3:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP3.png]]&lt;br /&gt;
&lt;br /&gt;
4:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP4.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Protocolo de comunicación ==&lt;br /&gt;
El protocolo de comunicaron diseñado para la comunicación entre Servidor y Aplicación ''Mobile'' es el siguiente:&lt;br /&gt;
&lt;br /&gt;
Accion0-S0\nAccion1-S1\nAccion2-S2\nAccion3\nAccion4-S4\nVelocidad&lt;br /&gt;
&lt;br /&gt;
Donde, este ''string'' representa la serie encadenada de acciones que el servidor recibe para ejecutar en el robot desde la aplicación.&lt;br /&gt;
Cada acción esta separada de la que se encuentra a continuación por el símbolo &amp;quot;''\n''&amp;quot;.&lt;br /&gt;
Podemos diferenciar dos tipos de acciones, las que requieren parámetro y las que no, estas se comunican de la siguiente forma:&lt;br /&gt;
'''Acción con parámetro''': NombreAccion-Parametro&lt;br /&gt;
&lt;br /&gt;
'''Acción sin parámetro''': NombreAccion&lt;br /&gt;
&lt;br /&gt;
== Implementación código Python ==&lt;br /&gt;
&lt;br /&gt;
Antes de empezar a programar o usar el código, es necesario instalar las librerías a usar, esto se puede hacer escribiendo &lt;br /&gt;
&lt;br /&gt;
'''''pip install [nombre de la librería]''''' en el interprete de comandos del sistema.&lt;br /&gt;
&lt;br /&gt;
Entonces instalamos la librería a utilizar, en este caso:&lt;br /&gt;
&lt;br /&gt;
'''''pip install simple_websocket_server'''''&lt;br /&gt;
&lt;br /&gt;
Una vez instalada la librería, hay que empezar a escribir el código.&lt;br /&gt;
&lt;br /&gt;
El encabezado del código es el siguiente&lt;br /&gt;
El uso de cada librería se explica con detalle mas adelante&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Encabezado.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A partir de la librería '''sys''' se define el camino del sistema para utilizar los plugin Butiá.&lt;br /&gt;
En nuestro caso, la ruta es ''' '/home/trerb/TurtleBots.activity/plugins/butia' ''', eso se tiene que modificar dependiendo de donde se encuentren el directorio ''' TurtleBots.activity/ ''' en su sistema de archivos&lt;br /&gt;
&lt;br /&gt;
[[Archivo:UsoPluginButia.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego se encuentra la función ''' clearConsole ''',&lt;br /&gt;
Esta función sirve únicamente para limpiar el interprete de Python usando la librería ''' os ''' y tener una ejecución mas limpia&lt;br /&gt;
&lt;br /&gt;
[[Archivo:clearConsole().png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
El siguiente código utiliza la librería ''' socket ''' para conectarse a la web y preguntar la ip del ordenador que ejecuta el archivo y la muestra en pantalla, esto se usa para facilitar la conexión con la App Mobile&lt;br /&gt;
&lt;br /&gt;
[[Archivo:conexionSocket.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Las siguientes líneas de código preguntan al usuario que puerto va a utilizar para la conexión, este código verifica que se ingrese un dato numérico, dentro del rango de los puertos, y que el puerto este disponible.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:tryPuerto.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego se declaran las variables: ''' Speed, Puerto_Gris y Puerto_Distancia ''', se verifica que los sensores de distancia y de grises estén conectados y asigna el puerto en el que estén conectados a las variables ''' Puerto_Distancia ''' y ''' Puerto_Gris ''' respectivamente. La variable ''' Speed ''' es una variable global que se lee al inicio de cada cadena de acciones y la utiliza para todos los movimientos del Butiá de esa cadena.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:declaracionVariables.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Seguimos con la declaración de las funciones básicas del Butiá, en este caso son ''' Avanzar, Rotar, AvanzarHastaVerColor y AvanzarHastaObstaculo ''' &lt;br /&gt;
&lt;br /&gt;
-La función ''' Avanzar ''' recibe un parámetro de tiempo y el Butiá avanza ese determinado tiempo.&lt;br /&gt;
&lt;br /&gt;
-La función ''' Retroceder ''' recibe un parámetro de tiempo y el Butiá retrocede ese determinado tiempo.&lt;br /&gt;
&lt;br /&gt;
-La función ''' Rotar ''' recibe dos parámetros, una dirección que puede ser Izquierda o Derecha y un tiempo que indica la duración de la rotación del Butiá.&lt;br /&gt;
&lt;br /&gt;
-La función ''' AvanzarHastaVerColor ''' recibe un parámetro que varia entre Blanco o Negro, el robot va a avanzar hasta detectar el color seleccionado.&lt;br /&gt;
Esta función solo se puede usar si el sensor de grises esta conectado.&lt;br /&gt;
&lt;br /&gt;
-Por ultimo, la función ''' AvanzarHastaObstaculo ''' no recibe parámetros, en este caso el Butiá va a avanzar hasta estar a unos pocos centímetros de un obstáculo.&lt;br /&gt;
Esta función solo se puede usar si el sensor de distancia esta conectado.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:FuncionesBasicas.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego se encuentra una función ''' Accion1 ''' esta función la puede definir el usuario a gusto, se puede implementar desde una función básica hasta un seguidor de líneas avanzado. La única condición que se necesita para implementar esta ''' Accion1 ''' es que no puede recibir parámetros&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Accion1.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ahora tenemos que definir el menú principal del programa, este se divide en dos funciones&lt;br /&gt;
&lt;br /&gt;
- ''' handle ''': Esta es una función predeterminada de la librería ''' simple_web_socket ''' y se llama cada vez que el servidor recibe un dato del cliente. En este caso la función crea una lista de las acciones que le llegan de la App Mobile, y las va ejecutando ordenadamente&lt;br /&gt;
&lt;br /&gt;
- ''' handle_close ''': Al igual que la función anterior, esta también es una función predeterminada de la librería ''' simple_web_socket ''' y se llama cuando el cliente se desconecta del servidor&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Screenshot from 2021-06-27 03-58-56.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Y por ultimo tenemos el dos líneas de codigo, la primera se encarga de abrir el servidor y la segunda lo mantiene abierto infinitamente&lt;br /&gt;
&lt;br /&gt;
[[Archivo:abrirServidor.png]]&lt;br /&gt;
&lt;br /&gt;
== Implementación codigo React ==&lt;br /&gt;
&lt;br /&gt;
La aplicacion movil esta implementada con React Native, ademas, se utiliza el ''framework'' [https://docs.expo.io/ Expo]. Este ''framework'' nos brinda un conjunto de herramientas que facilita el desarrollo de aplicaciones mobiles. &lt;br /&gt;
En caso de querer agregar, o modificar cualidades, es necesario proceder de la siguiente forma:&lt;br /&gt;
&lt;br /&gt;
Descargar el archivo comprimido adjunto.&lt;br /&gt;
&lt;br /&gt;
Extraerlo, posicionarse en el directorio raiz de la carpeta descomprimida, y ejecutar desde la terminal lo siguiente (tener en cuenta que es necesario tener en la maquina, el gestor de paquetes [https://docs.npmjs.com/ npm]).&lt;br /&gt;
&lt;br /&gt;
''''npm install'''' &lt;br /&gt;
&lt;br /&gt;
Esto descarga las dependencias que utiliza la aplicación, luego de esto podemos empezar a desarrollar.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para visualizar los cambios en tiempo real mientras desarrollamos, es necesario instalar la aplicación Expo Go para [https://play.google.com/store/apps/details?id=host.exp.exponent&amp;amp;hl=es_UY&amp;amp;gl=US Android] o para [https://apps.apple.com/es/app/expo-go/id982107779 iOS] según sea el caso.&lt;br /&gt;
&lt;br /&gt;
Para a visualizar la app en desarrollo desde Expo Go, procedemos de la siguiente forma:&lt;br /&gt;
Desde el directorio raíz de la aplicación ejecutamos desde la terminal lo siguiente:&lt;br /&gt;
&lt;br /&gt;
''''npm start''''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego, desde la aplicación Expo Go, con el celular conectado en la misma red local accedemos a la aplicación seleccionando lo siguiente:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Expo.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hecho esto, podemos cambiar el código de la aplicación y ver reflejados los cambios de forma casi instantánea.&lt;br /&gt;
&lt;br /&gt;
La aplicacion esta compuesta por dos pantallas, la pantalla de configuracion (''ConfigScreen.js''), donde se ingresa la direccion ip y puerto del servidor, y la pantalla principal (''MainScreen.js''), donde se lleva a cabo la programacion del robot mediante acciones.&lt;br /&gt;
&lt;br /&gt;
Esta ultima pantalla esta compuesta por los componentes ''TopList.js'' y ''BoottomList.js''.&lt;br /&gt;
&lt;br /&gt;
Para agregar una nueva accion al sistema, es necesario programarla en el servidor con un deteminado nombre, supondremos &amp;quot;AccionN&amp;quot;, esto resulta facil si se toma como ejemplo las acciones ya implementadas.&lt;br /&gt;
&lt;br /&gt;
En la aplicacion, esta nueva accion se agrega en el array &amp;quot;''actionsData''&amp;quot;, dicho array se encuentra en la palntalla principal, es decir en el archivo &amp;quot;''MainScreen.js''&amp;quot;, cada accion cuenta con los siguientes datos:&lt;br /&gt;
&lt;br /&gt;
-'''idAccion:''' Identificador de la accion en dicho arreglo (actionsData).&lt;br /&gt;
&lt;br /&gt;
-'''title:''': Titulo de la accion que se muetra en el panel superior.&lt;br /&gt;
&lt;br /&gt;
-'''actionId:''' Nombre identificador de la accion en el servidor.&lt;br /&gt;
&lt;br /&gt;
-'''overlay:''': ''Overlay'' que se despliega al seleccionar la accion si esta lleva un parametro, esta funcion lleva como parametro &amp;quot;''editOverlay''&amp;quot; y &amp;quot;''id''&amp;quot; (parametros que se utilizan cuando se requiere cambiar el valor del parametro de la accuion que ya fue seleccionada y se encuentra en el panel inferior), como por ejemplo pueden ser segundos en el caso de la accion &amp;quot;Avanzar&amp;quot;, o colores en el caso de &amp;quot;Avanzar hasta obstaculo&amp;quot;. Este parametro puede ser que no sea necesario, como es en el caso de la accion &amp;quot;Avanzar hasta obstaculo&amp;quot;, en este ultimo caso el valor de este campo es null.&lt;br /&gt;
&lt;br /&gt;
Ejemplo de la accion &amp;quot;Avanzar&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Screenshot from 2021-06-27 04-18-42.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ejemplo de la accion &amp;quot;Avanzar hasta obstaculo&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Screenshot_from_2021-06-27_00-28-32.png]]&lt;br /&gt;
&lt;br /&gt;
== Manual de uso de la aplicación ==&lt;br /&gt;
&lt;br /&gt;
Aunque la aplicación resulta intuitiva y fácil de usar se describe a continuación una serie de pasos para utilizarla correctamente.&lt;br /&gt;
&lt;br /&gt;
Para comenzar a utilizar la aplicación es necesario configurar la coneccion de la aplicación con el servidor (recordar que ambos se deben encontrar ejecutándose en la misma red local), el servidor ejecutando en una computadora que esté conectada correctamente al butiá (con los sensores descritos anteriormente) y la aplicación ejecutándose en el celular.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Conectando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego que la conexión haya resultado exitosa, nos encontramos en la página principal. En el panel superior, como se muestra a continuación, se encuentran las aplicaciones disponibles que podemos ejecutar en el robot butiá.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Acciones.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para agregar una serie de acciones al robot, simplemente presionamos la que queramos, a continuación esta aparecerá en el panel inferior, a medida de que vayamos seleccionando acciones, estas se irán encadenando una tras otras, estas estarán prontas para ejecutarse secuencialmente, desde la parte inferior a la parte superior, en el momento que presionemos el botón &amp;quot;Empezar&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Agregando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Como la aplicación está pensada para planificar algoritmos para resolver problemas, como puzzles, es probable que nos equivoquemos y seleccionemos una acción o insertemos un parámetro incorrectamente, ¡pero no te preocupes!. Para editar el parámetro que le hayamos ingresado a una acción, simplemente mantenemos pulsado la que deseamos corregir e ingresamos el nuevo valor.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Editando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
También es posible eliminar una acción, para hacer esto, nuevamente mantenemos pulsada la acción que queremos eliminar, pero esta vez, seleccionamos la acción eliminar. A continuación la acción seleccionada desaparecerá del panel inferior. También es posible que deseemos eliminar todas las acciones que habíamos ingresado, en este caso seleccionamos el botón &amp;quot;Eliminar acciones&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Eliminando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es posible que queremos que el robot se desplace a ciertas velocidades, teniendo en cuenta que al modificar la velocidad, el robot tendrá un comportamiento totalmente diferente, debido a que gran parte de las acciones se ejecutan por un tiempo asignado, a mayor velocidad, más desplazamiento.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Velocidad.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En caso de que exista un error en la coneccion, podemos intentar volver a conectar la aplicacion al servidor, para esto seleccionamos la opción configuración.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:A configuracion.gif]]&lt;br /&gt;
&lt;br /&gt;
== Video de muestra ==&lt;br /&gt;
&lt;br /&gt;
== Mejoras a futuro ==&lt;br /&gt;
&lt;br /&gt;
* Implementar una forma para que las función ''' Accion1 ''' pueda recibir parámetros, para así ampliar la gama de problemas que se puedan solucionar a través de esta aplicación.&lt;br /&gt;
&lt;br /&gt;
* Implementación de código que permita añadir a través del código, una mayor cantidad de funciones genéricas a la aplicación.&lt;br /&gt;
&lt;br /&gt;
* Desarrollar una forma de comunicación bilateral entre la App Mobile y Python para mejorar el debug en tiempo de ejecución.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Archivos de uso ==&lt;/div&gt;</summary>
		<author><name>German.moreira</name></author>	</entry>

	<entry>
		<id>http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Programando_el_Butia_desde_el_celular&amp;diff=11623</id>
		<title>Programando el Butia desde el celular</title>
		<link rel="alternate" type="text/html" href="http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Programando_el_Butia_desde_el_celular&amp;diff=11623"/>
				<updated>2021-06-27T07:22:25Z</updated>
		
		<summary type="html">&lt;p&gt;German.moreira: /* Implementación código Python */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Introducción ==&lt;br /&gt;
&lt;br /&gt;
La idea del proyecto en un principio era usar el celular como medio para controlar el robot Butiá para que resulte más atractivo para los estudiantes que no les guste la programación.&lt;br /&gt;
&lt;br /&gt;
Luego, la idea se modifico un poco debido a que descubrimos que con esta implementación, podíamos hacer mas sencilla la resolución de algunos ejercicios básicos mediante algoritmos mas simplificados, tomamos el trabajo que teníamos hecho hasta el momento y lo adaptamos a un menú con distintas acciones simples como avanzar un determinado tiempo, avanzar hasta chocar contra un objeto o rotar a la izquierda o derecha un determinado tiempo.&lt;br /&gt;
&lt;br /&gt;
Estas funciones básicas y bastante sencillas de entender más una interfaz amigable y fácil de usar, se implementaron para que el rango de edad de uso de esta aplicación vaya de 3 años en adelante.&lt;br /&gt;
&lt;br /&gt;
Como resultado obtuvimos una aplicación que se puede usar para que niños de:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- 4 / 5 / 6 años resuelvan ejercicios sencillos como puede ser llegar de un punto a otro, buscar el camino a un objeto o resolver un laberinto sencillo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- 7 / 8 / 9 años puedan resolver ejercicios un poco más complejos como puede ser resolver un laberinto del más sencillo al mas complejo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- 10 años en adelante tengan la capacidad de adaptar una parte personal de código al programa y puedan resolver cualquier ejercicio que se pueda plantear con el robot Butiá.&lt;br /&gt;
&lt;br /&gt;
== Objetivo ==&lt;br /&gt;
&lt;br /&gt;
Los objetivos del proyecto eran, como dice el nombre, poder conectar remotamente el robot Butiá a un celular y buscar una abstracción de la mayor cantidad de problemas que puedan ser resueltos con el robot Butiá.&lt;br /&gt;
&lt;br /&gt;
Esto para poder crear un método de uso del robot Butiá más dinámico y con funciones que permiten realizar, mediante algoritmos mas sencillos, la solución de la mayor cantidad de puzles particulares.&lt;br /&gt;
&lt;br /&gt;
Al hacer esto el nivel de uso en aulas del robot Butiá, puede simplificarse hasta clases desde 3 años de jardinera en adelante, debido a que la aplicación simplifica la parte de codificación y los algoritmos de solución de ejercicios se convierten simplemente en una serie de pasos básicos a ejecutar linealmente.&lt;br /&gt;
&lt;br /&gt;
== Armado del Butiá ==&lt;br /&gt;
&lt;br /&gt;
* Paso 1: Armar el Butiá a partir de esta [https://www.fing.edu.uy/inco/proyectos/butia/files/docs_butia2/armando_paso_a_paso_motores_CC_rev1.pdf guía oficial]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''' Los siguientes pasos son opcionales '''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Paso 2: Instalar el sensor de grises&lt;br /&gt;
&lt;br /&gt;
1:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP1.jpeg]] &lt;br /&gt;
&lt;br /&gt;
2:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP2.jpeg]]&lt;br /&gt;
&lt;br /&gt;
3:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP3.jpeg]]&lt;br /&gt;
&lt;br /&gt;
4:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP4.jpeg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Paso 3: Instalar el sensor de distancia&lt;br /&gt;
&lt;br /&gt;
1:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP1.png]]&lt;br /&gt;
&lt;br /&gt;
2:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP2.png]]&lt;br /&gt;
&lt;br /&gt;
3:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP3.png]]&lt;br /&gt;
&lt;br /&gt;
4:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP4.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Protocolo de comunicacion ==&lt;br /&gt;
&lt;br /&gt;
== Implementación código Python ==&lt;br /&gt;
&lt;br /&gt;
Antes de empezar a programar o usar el código, es necesario instalar las librerías a usar, esto se puede hacer escribiendo &lt;br /&gt;
&lt;br /&gt;
'''''pip install [nombre de la librería]''''' en el interprete de comandos del sistema.&lt;br /&gt;
&lt;br /&gt;
Entonces instalamos la librería a utilizar, en este caso:&lt;br /&gt;
&lt;br /&gt;
'''''pip install simple_websocket_server'''''&lt;br /&gt;
&lt;br /&gt;
Una vez instalada la librería, hay que empezar a escribir el código.&lt;br /&gt;
&lt;br /&gt;
El encabezado del código es el siguiente&lt;br /&gt;
El uso de cada librería se explica con detalle mas adelante&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Encabezado.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A partir de la librería '''sys''' se define el camino del sistema para utilizar los plugin Butiá.&lt;br /&gt;
En nuestro caso, la ruta es ''' '/home/trerb/TurtleBots.activity/plugins/butia' ''', eso se tiene que modificar dependiendo de donde se encuentren el directorio ''' TurtleBots.activity/ ''' en su sistema de archivos&lt;br /&gt;
&lt;br /&gt;
[[Archivo:UsoPluginButia.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego se encuentra la función ''' clearConsole ''',&lt;br /&gt;
Esta función sirve únicamente para limpiar el interprete de Python usando la librería ''' os ''' y tener una ejecución mas limpia&lt;br /&gt;
&lt;br /&gt;
[[Archivo:clearConsole().png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
El siguiente código utiliza la librería ''' socket ''' para conectarse a la web y preguntar la ip del ordenador que ejecuta el archivo y la muestra en pantalla, esto se usa para facilitar la conexión con la App Mobile&lt;br /&gt;
&lt;br /&gt;
[[Archivo:conexionSocket.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Las siguientes líneas de código preguntan al usuario que puerto va a utilizar para la conexión, este código verifica que se ingrese un dato numérico, dentro del rango de los puertos, y que el puerto este disponible.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:tryPuerto.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego se declaran las variables: ''' Speed, Puerto_Gris y Puerto_Distancia ''', se verifica que los sensores de distancia y de grises estén conectados y asigna el puerto en el que estén conectados a las variables ''' Puerto_Distancia ''' y ''' Puerto_Gris ''' respectivamente. La variable ''' Speed ''' es una variable global que se lee al inicio de cada cadena de acciones y la utiliza para todos los movimientos del Butiá de esa cadena.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:declaracionVariables.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Seguimos con la declaración de las funciones básicas del Butiá, en este caso son ''' Avanzar, Rotar, AvanzarHastaVerColor y AvanzarHastaObstaculo ''' &lt;br /&gt;
&lt;br /&gt;
-La función ''' Avanzar ''' recibe un parámetro de tiempo y el Butiá avanza ese determinado tiempo.&lt;br /&gt;
&lt;br /&gt;
-La función ''' Retroceder ''' recibe un parámetro de tiempo y el Butiá retrocede ese determinado tiempo.&lt;br /&gt;
&lt;br /&gt;
-La función ''' Rotar ''' recibe dos parámetros, una dirección que puede ser Izquierda o Derecha y un tiempo que indica la duración de la rotación del Butiá.&lt;br /&gt;
&lt;br /&gt;
-La función ''' AvanzarHastaVerColor ''' recibe un parámetro que varia entre Blanco o Negro, el robot va a avanzar hasta detectar el color seleccionado.&lt;br /&gt;
Esta función solo se puede usar si el sensor de grises esta conectado.&lt;br /&gt;
&lt;br /&gt;
-Por ultimo, la función ''' AvanzarHastaObstaculo ''' no recibe parámetros, en este caso el Butiá va a avanzar hasta estar a unos pocos centímetros de un obstáculo.&lt;br /&gt;
Esta función solo se puede usar si el sensor de distancia esta conectado.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:FuncionesBasicas.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego se encuentra una función ''' Accion1 ''' esta función la puede definir el usuario a gusto, se puede implementar desde una función básica hasta un seguidor de líneas avanzado. La única condición que se necesita para implementar esta ''' Accion1 ''' es que no puede recibir parámetros&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Accion1.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ahora tenemos que definir el menú principal del programa, este se divide en dos funciones&lt;br /&gt;
&lt;br /&gt;
- ''' handle ''': Esta es una función predeterminada de la librería ''' simple_web_socket ''' y se llama cada vez que el servidor recibe un dato del cliente. En este caso la función crea una lista de las acciones que le llegan de la App Mobile, y las va ejecutando ordenadamente&lt;br /&gt;
&lt;br /&gt;
- ''' handle_close ''': Al igual que la función anterior, esta también es una función predeterminada de la librería ''' simple_web_socket ''' y se llama cuando el cliente se desconecta del servidor&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Screenshot from 2021-06-27 03-58-56.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Y por ultimo tenemos el dos líneas de codigo, la primera se encarga de abrir el servidor y la segunda lo mantiene abierto infinitamente&lt;br /&gt;
&lt;br /&gt;
[[Archivo:abrirServidor.png]]&lt;br /&gt;
&lt;br /&gt;
== Implementación codigo React ==&lt;br /&gt;
&lt;br /&gt;
La aplicacion movil esta implementada con React Native, ademas, se utiliza el ''framework'' [https://docs.expo.io/ Expo]. Este ''framework'' nos brinda un conjunto de herramientas que facilita el desarrollo de aplicaciones mobiles. &lt;br /&gt;
En caso de querer agregar, o modificar cualidades, es necesario proceder de la siguiente forma:&lt;br /&gt;
&lt;br /&gt;
Descargar el archivo comprimido adjunto.&lt;br /&gt;
&lt;br /&gt;
Extraerlo, posicionarse en el directorio raiz de la carpeta descomprimida, y ejecutar desde la terminal lo siguiente (tener en cuenta que es necesario tener en la maquina, el gestor de paquetes [https://docs.npmjs.com/ npm]).&lt;br /&gt;
&lt;br /&gt;
''''npm install'''' &lt;br /&gt;
&lt;br /&gt;
Esto descarga las dependencias que utiliza la aplicación, luego de esto podemos empezar a desarrollar.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para visualizar los cambios en tiempo real mientras desarrollamos, es necesario instalar la aplicación Expo Go para [https://play.google.com/store/apps/details?id=host.exp.exponent&amp;amp;hl=es_UY&amp;amp;gl=US Android] o para [https://apps.apple.com/es/app/expo-go/id982107779 iOS] según sea el caso.&lt;br /&gt;
&lt;br /&gt;
Para a visualizar la app en desarrollo desde Expo Go, procedemos de la siguiente forma:&lt;br /&gt;
Desde el directorio raíz de la aplicación ejecutamos desde la terminal lo siguiente:&lt;br /&gt;
&lt;br /&gt;
''''npm start''''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego, desde la aplicación Expo Go, con el celular conectado en la misma red local accedemos a la aplicación seleccionando lo siguiente:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Expo.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hecho esto, podemos cambiar el código de la aplicación y ver reflejados los cambios de forma casi instantánea.&lt;br /&gt;
&lt;br /&gt;
La aplicacion esta compuesta por dos pantallas, la pantalla de configuracion (''ConfigScreen.js''), donde se ingresa la direccion ip y puerto del servidor, y la pantalla principal (''MainScreen.js''), donde se lleva a cabo la programacion del robot mediante acciones.&lt;br /&gt;
&lt;br /&gt;
Esta ultima pantalla esta compuesta por los componentes ''TopList.js'' y ''BoottomList.js''.&lt;br /&gt;
&lt;br /&gt;
Para agregar una nueva accion al sistema, es necesario programarla en el servidor con un deteminado nombre, supondremos &amp;quot;AccionN&amp;quot;, esto resulta facil si se toma como ejemplo las acciones ya implementadas.&lt;br /&gt;
&lt;br /&gt;
En la aplicacion, esta nueva accion se agrega en el array &amp;quot;''actionsData''&amp;quot;, dicho array se encuentra en la palntalla principal, es decir en el archivo &amp;quot;''MainScreen.js''&amp;quot;, cada accion cuenta con los siguientes datos:&lt;br /&gt;
&lt;br /&gt;
-'''idAccion:''' Identificador de la accion en dicho arreglo (actionsData).&lt;br /&gt;
&lt;br /&gt;
-'''title:''': Titulo de la accion que se muetra en el panel superior.&lt;br /&gt;
&lt;br /&gt;
-'''actionId:''' Nombre identificador de la accion en el servidor.&lt;br /&gt;
&lt;br /&gt;
-'''overlay:''': ''Overlay'' que se despliega al seleccionar la accion si esta lleva un parametro, esta funcion lleva como parametro &amp;quot;''editOverlay''&amp;quot; y &amp;quot;''id''&amp;quot; (parametros que se utilizan cuando se requiere cambiar el valor del parametro de la accuion que ya fue seleccionada y se encuentra en el panel inferior), como por ejemplo pueden ser segundos en el caso de la accion &amp;quot;Avanzar&amp;quot;, o colores en el caso de &amp;quot;Avanzar hasta obstaculo&amp;quot;. Este parametro puede ser que no sea necesario, como es en el caso de la accion &amp;quot;Avanzar hasta obstaculo&amp;quot;, en este ultimo caso el valor de este campo es null.&lt;br /&gt;
&lt;br /&gt;
Ejemplo de la accion &amp;quot;Avanzar&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Screenshot from 2021-06-27 04-18-42.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ejemplo de la accion &amp;quot;Avanzar hasta obstaculo&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Screenshot_from_2021-06-27_00-28-32.png]]&lt;br /&gt;
&lt;br /&gt;
== Manual de uso de la aplicación ==&lt;br /&gt;
&lt;br /&gt;
Aunque la aplicación resulta intuitiva y fácil de usar se describe a continuación una serie de pasos para utilizarla correctamente.&lt;br /&gt;
&lt;br /&gt;
Para comenzar a utilizar la aplicación es necesario configurar la coneccion de la aplicación con el servidor (recordar que ambos se deben encontrar ejecutándose en la misma red local), el servidor ejecutando en una computadora que esté conectada correctamente al butiá (con los sensores descritos anteriormente) y la aplicación ejecutándose en el celular.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Conectando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego que la conexión haya resultado exitosa, nos encontramos en la página principal. En el panel superior, como se muestra a continuación, se encuentran las aplicaciones disponibles que podemos ejecutar en el robot butiá.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Acciones.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para agregar una serie de acciones al robot, simplemente presionamos la que queramos, a continuación esta aparecerá en el panel inferior, a medida de que vayamos seleccionando acciones, estas se irán encadenando una tras otras, estas estarán prontas para ejecutarse secuencialmente, desde la parte inferior a la parte superior, en el momento que presionemos el botón &amp;quot;Empezar&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Agregando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Como la aplicación está pensada para planificar algoritmos para resolver problemas, como puzzles, es probable que nos equivoquemos y seleccionemos una acción o insertemos un parámetro incorrectamente, ¡pero no te preocupes!. Para editar el parámetro que le hayamos ingresado a una acción, simplemente mantenemos pulsado la que deseamos corregir e ingresamos el nuevo valor.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Editando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
También es posible eliminar una acción, para hacer esto, nuevamente mantenemos pulsada la acción que queremos eliminar, pero esta vez, seleccionamos la acción eliminar. A continuación la acción seleccionada desaparecerá del panel inferior. También es posible que deseemos eliminar todas las acciones que habíamos ingresado, en este caso seleccionamos el botón &amp;quot;Eliminar acciones&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Eliminando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es posible que queremos que el robot se desplace a ciertas velocidades, teniendo en cuenta que al modificar la velocidad, el robot tendrá un comportamiento totalmente diferente, debido a que gran parte de las acciones se ejecutan por un tiempo asignado, a mayor velocidad, más desplazamiento.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Velocidad.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En caso de que exista un error en la coneccion, podemos intentar volver a conectar la aplicacion al servidor, para esto seleccionamos la opción configuración.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:A configuracion.gif]]&lt;br /&gt;
&lt;br /&gt;
== Video de muestra ==&lt;br /&gt;
&lt;br /&gt;
== Mejoras a futuro ==&lt;br /&gt;
&lt;br /&gt;
* Implementar una forma para que las función ''' Accion1 ''' pueda recibir parámetros, para así ampliar la gama de problemas que se puedan solucionar a través de esta aplicación.&lt;br /&gt;
&lt;br /&gt;
* Implementación de código que permita añadir a través del código, una mayor cantidad de funciones genéricas a la aplicación.&lt;br /&gt;
&lt;br /&gt;
* Desarrollar una forma de comunicación bilateral entre la App Mobile y Python para mejorar el debug en tiempo de ejecución.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Archivos de uso ==&lt;/div&gt;</summary>
		<author><name>German.moreira</name></author>	</entry>

	<entry>
		<id>http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Programando_el_Butia_desde_el_celular&amp;diff=11622</id>
		<title>Programando el Butia desde el celular</title>
		<link rel="alternate" type="text/html" href="http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Programando_el_Butia_desde_el_celular&amp;diff=11622"/>
				<updated>2021-06-27T07:21:35Z</updated>
		
		<summary type="html">&lt;p&gt;German.moreira: /* Implementación codigo React */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Introducción ==&lt;br /&gt;
&lt;br /&gt;
La idea del proyecto en un principio era usar el celular como medio para controlar el robot Butiá para que resulte más atractivo para los estudiantes que no les guste la programación.&lt;br /&gt;
&lt;br /&gt;
Luego, la idea se modifico un poco debido a que descubrimos que con esta implementación, podíamos hacer mas sencilla la resolución de algunos ejercicios básicos mediante algoritmos mas simplificados, tomamos el trabajo que teníamos hecho hasta el momento y lo adaptamos a un menú con distintas acciones simples como avanzar un determinado tiempo, avanzar hasta chocar contra un objeto o rotar a la izquierda o derecha un determinado tiempo.&lt;br /&gt;
&lt;br /&gt;
Estas funciones básicas y bastante sencillas de entender más una interfaz amigable y fácil de usar, se implementaron para que el rango de edad de uso de esta aplicación vaya de 3 años en adelante.&lt;br /&gt;
&lt;br /&gt;
Como resultado obtuvimos una aplicación que se puede usar para que niños de:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- 4 / 5 / 6 años resuelvan ejercicios sencillos como puede ser llegar de un punto a otro, buscar el camino a un objeto o resolver un laberinto sencillo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- 7 / 8 / 9 años puedan resolver ejercicios un poco más complejos como puede ser resolver un laberinto del más sencillo al mas complejo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- 10 años en adelante tengan la capacidad de adaptar una parte personal de código al programa y puedan resolver cualquier ejercicio que se pueda plantear con el robot Butiá.&lt;br /&gt;
&lt;br /&gt;
== Objetivo ==&lt;br /&gt;
&lt;br /&gt;
Los objetivos del proyecto eran, como dice el nombre, poder conectar remotamente el robot Butiá a un celular y buscar una abstracción de la mayor cantidad de problemas que puedan ser resueltos con el robot Butiá.&lt;br /&gt;
&lt;br /&gt;
Esto para poder crear un método de uso del robot Butiá más dinámico y con funciones que permiten realizar, mediante algoritmos mas sencillos, la solución de la mayor cantidad de puzles particulares.&lt;br /&gt;
&lt;br /&gt;
Al hacer esto el nivel de uso en aulas del robot Butiá, puede simplificarse hasta clases desde 3 años de jardinera en adelante, debido a que la aplicación simplifica la parte de codificación y los algoritmos de solución de ejercicios se convierten simplemente en una serie de pasos básicos a ejecutar linealmente.&lt;br /&gt;
&lt;br /&gt;
== Armado del Butiá ==&lt;br /&gt;
&lt;br /&gt;
* Paso 1: Armar el Butiá a partir de esta [https://www.fing.edu.uy/inco/proyectos/butia/files/docs_butia2/armando_paso_a_paso_motores_CC_rev1.pdf guía oficial]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''' Los siguientes pasos son opcionales '''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Paso 2: Instalar el sensor de grises&lt;br /&gt;
&lt;br /&gt;
1:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP1.jpeg]] &lt;br /&gt;
&lt;br /&gt;
2:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP2.jpeg]]&lt;br /&gt;
&lt;br /&gt;
3:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP3.jpeg]]&lt;br /&gt;
&lt;br /&gt;
4:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP4.jpeg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Paso 3: Instalar el sensor de distancia&lt;br /&gt;
&lt;br /&gt;
1:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP1.png]]&lt;br /&gt;
&lt;br /&gt;
2:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP2.png]]&lt;br /&gt;
&lt;br /&gt;
3:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP3.png]]&lt;br /&gt;
&lt;br /&gt;
4:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP4.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Implementación código Python ==&lt;br /&gt;
&lt;br /&gt;
Antes de empezar a programar o usar el código, es necesario instalar las librerías a usar, esto se puede hacer escribiendo &lt;br /&gt;
&lt;br /&gt;
'''''pip install [nombre de la librería]''''' en el interprete de comandos del sistema.&lt;br /&gt;
&lt;br /&gt;
Entonces instalamos la librería a utilizar, en este caso:&lt;br /&gt;
&lt;br /&gt;
'''''pip install simple_websocket_server'''''&lt;br /&gt;
&lt;br /&gt;
Una vez instalada la librería, hay que empezar a escribir el código.&lt;br /&gt;
&lt;br /&gt;
El encabezado del código es el siguiente&lt;br /&gt;
El uso de cada librería se explica con detalle mas adelante&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Encabezado.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A partir de la librería '''sys''' se define el camino del sistema para utilizar los plugin Butiá.&lt;br /&gt;
En nuestro caso, la ruta es ''' '/home/trerb/TurtleBots.activity/plugins/butia' ''', eso se tiene que modificar dependiendo de donde se encuentren el directorio ''' TurtleBots.activity/ ''' en su sistema de archivos&lt;br /&gt;
&lt;br /&gt;
[[Archivo:UsoPluginButia.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego se encuentra la función ''' clearConsole ''',&lt;br /&gt;
Esta función sirve únicamente para limpiar el interprete de Python usando la librería ''' os ''' y tener una ejecución mas limpia&lt;br /&gt;
&lt;br /&gt;
[[Archivo:clearConsole().png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
El siguiente código utiliza la librería ''' socket ''' para conectarse a la web y preguntar la ip del ordenador que ejecuta el archivo y la muestra en pantalla, esto se usa para facilitar la conexión con la App Mobile&lt;br /&gt;
&lt;br /&gt;
[[Archivo:conexionSocket.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Las siguientes líneas de código preguntan al usuario que puerto va a utilizar para la conexión, este código verifica que se ingrese un dato numérico, dentro del rango de los puertos, y que el puerto este disponible.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:tryPuerto.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego se declaran las variables: ''' Speed, Puerto_Gris y Puerto_Distancia ''', se verifica que los sensores de distancia y de grises estén conectados y asigna el puerto en el que estén conectados a las variables ''' Puerto_Distancia ''' y ''' Puerto_Gris ''' respectivamente. La variable ''' Speed ''' es una variable global que se lee al inicio de cada cadena de acciones y la utiliza para todos los movimientos del Butiá de esa cadena.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:declaracionVariables.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Seguimos con la declaración de las funciones básicas del Butiá, en este caso son ''' Avanzar, Rotar, AvanzarHastaVerColor y AvanzarHastaObstaculo ''' &lt;br /&gt;
&lt;br /&gt;
-La función ''' Avanzar ''' recibe un parámetro de tiempo y el Butiá avanza ese determinado tiempo.&lt;br /&gt;
&lt;br /&gt;
-La función ''' Retroceder ''' recibe un parámetro de tiempo y el Butiá retrocede ese determinado tiempo.&lt;br /&gt;
&lt;br /&gt;
-La función ''' Rotar ''' recibe dos parámetros, una dirección que puede ser Izquierda o Derecha y un tiempo que indica la duración de la rotación del Butiá.&lt;br /&gt;
&lt;br /&gt;
-La función ''' AvanzarHastaVerColor ''' recibe un parámetro que varia entre Blanco o Negro, el robot va a avanzar hasta detectar el color seleccionado.&lt;br /&gt;
Esta función solo se puede usar si el sensor de grises esta conectado.&lt;br /&gt;
&lt;br /&gt;
-Por ultimo, la función ''' AvanzarHastaObstaculo ''' no recibe parámetros, en este caso el Butiá va a avanzar hasta estar a unos pocos centímetros de un obstáculo.&lt;br /&gt;
Esta función solo se puede usar si el sensor de distancia esta conectado.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:FuncionesBasicas.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego se encuentra una función ''' Accion1 ''' esta función la puede definir el usuario a gusto, se puede implementar desde una función básica hasta un seguidor de líneas avanzado. La única condición que se necesita para implementar esta ''' Accion1 ''' es que no puede recibir parámetros&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Accion1.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ahora tenemos que definir el menú principal del programa, este se divide en dos funciones&lt;br /&gt;
&lt;br /&gt;
- ''' handle ''': Esta es una función predeterminada de la librería ''' simple_web_socket ''' y se llama cada vez que el servidor recibe un dato del cliente. En este caso la función crea una lista de las acciones que le llegan de la App Mobile, y las va ejecutando ordenadamente&lt;br /&gt;
&lt;br /&gt;
- ''' handle_close ''': Al igual que la función anterior, esta también es una función predeterminada de la librería ''' simple_web_socket ''' y se llama cuando el cliente se desconecta del servidor&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Screenshot from 2021-06-27 03-58-56.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Y por ultimo tenemos el dos líneas de codigo, la primera se encarga de abrir el servidor y la segunda lo mantiene abierto infinitamente&lt;br /&gt;
&lt;br /&gt;
[[Archivo:abrirServidor.png]]&lt;br /&gt;
&lt;br /&gt;
== Implementación codigo React ==&lt;br /&gt;
&lt;br /&gt;
La aplicacion movil esta implementada con React Native, ademas, se utiliza el ''framework'' [https://docs.expo.io/ Expo]. Este ''framework'' nos brinda un conjunto de herramientas que facilita el desarrollo de aplicaciones mobiles. &lt;br /&gt;
En caso de querer agregar, o modificar cualidades, es necesario proceder de la siguiente forma:&lt;br /&gt;
&lt;br /&gt;
Descargar el archivo comprimido adjunto.&lt;br /&gt;
&lt;br /&gt;
Extraerlo, posicionarse en el directorio raiz de la carpeta descomprimida, y ejecutar desde la terminal lo siguiente (tener en cuenta que es necesario tener en la maquina, el gestor de paquetes [https://docs.npmjs.com/ npm]).&lt;br /&gt;
&lt;br /&gt;
''''npm install'''' &lt;br /&gt;
&lt;br /&gt;
Esto descarga las dependencias que utiliza la aplicación, luego de esto podemos empezar a desarrollar.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para visualizar los cambios en tiempo real mientras desarrollamos, es necesario instalar la aplicación Expo Go para [https://play.google.com/store/apps/details?id=host.exp.exponent&amp;amp;hl=es_UY&amp;amp;gl=US Android] o para [https://apps.apple.com/es/app/expo-go/id982107779 iOS] según sea el caso.&lt;br /&gt;
&lt;br /&gt;
Para a visualizar la app en desarrollo desde Expo Go, procedemos de la siguiente forma:&lt;br /&gt;
Desde el directorio raíz de la aplicación ejecutamos desde la terminal lo siguiente:&lt;br /&gt;
&lt;br /&gt;
''''npm start''''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego, desde la aplicación Expo Go, con el celular conectado en la misma red local accedemos a la aplicación seleccionando lo siguiente:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Expo.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hecho esto, podemos cambiar el código de la aplicación y ver reflejados los cambios de forma casi instantánea.&lt;br /&gt;
&lt;br /&gt;
La aplicacion esta compuesta por dos pantallas, la pantalla de configuracion (''ConfigScreen.js''), donde se ingresa la direccion ip y puerto del servidor, y la pantalla principal (''MainScreen.js''), donde se lleva a cabo la programacion del robot mediante acciones.&lt;br /&gt;
&lt;br /&gt;
Esta ultima pantalla esta compuesta por los componentes ''TopList.js'' y ''BoottomList.js''.&lt;br /&gt;
&lt;br /&gt;
Para agregar una nueva accion al sistema, es necesario programarla en el servidor con un deteminado nombre, supondremos &amp;quot;AccionN&amp;quot;, esto resulta facil si se toma como ejemplo las acciones ya implementadas.&lt;br /&gt;
&lt;br /&gt;
En la aplicacion, esta nueva accion se agrega en el array &amp;quot;''actionsData''&amp;quot;, dicho array se encuentra en la palntalla principal, es decir en el archivo &amp;quot;''MainScreen.js''&amp;quot;, cada accion cuenta con los siguientes datos:&lt;br /&gt;
&lt;br /&gt;
-'''idAccion:''' Identificador de la accion en dicho arreglo (actionsData).&lt;br /&gt;
&lt;br /&gt;
-'''title:''': Titulo de la accion que se muetra en el panel superior.&lt;br /&gt;
&lt;br /&gt;
-'''actionId:''' Nombre identificador de la accion en el servidor.&lt;br /&gt;
&lt;br /&gt;
-'''overlay:''': ''Overlay'' que se despliega al seleccionar la accion si esta lleva un parametro, esta funcion lleva como parametro &amp;quot;''editOverlay''&amp;quot; y &amp;quot;''id''&amp;quot; (parametros que se utilizan cuando se requiere cambiar el valor del parametro de la accuion que ya fue seleccionada y se encuentra en el panel inferior), como por ejemplo pueden ser segundos en el caso de la accion &amp;quot;Avanzar&amp;quot;, o colores en el caso de &amp;quot;Avanzar hasta obstaculo&amp;quot;. Este parametro puede ser que no sea necesario, como es en el caso de la accion &amp;quot;Avanzar hasta obstaculo&amp;quot;, en este ultimo caso el valor de este campo es null.&lt;br /&gt;
&lt;br /&gt;
Ejemplo de la accion &amp;quot;Avanzar&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Screenshot from 2021-06-27 04-18-42.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ejemplo de la accion &amp;quot;Avanzar hasta obstaculo&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Screenshot_from_2021-06-27_00-28-32.png]]&lt;br /&gt;
&lt;br /&gt;
== Manual de uso de la aplicación ==&lt;br /&gt;
&lt;br /&gt;
Aunque la aplicación resulta intuitiva y fácil de usar se describe a continuación una serie de pasos para utilizarla correctamente.&lt;br /&gt;
&lt;br /&gt;
Para comenzar a utilizar la aplicación es necesario configurar la coneccion de la aplicación con el servidor (recordar que ambos se deben encontrar ejecutándose en la misma red local), el servidor ejecutando en una computadora que esté conectada correctamente al butiá (con los sensores descritos anteriormente) y la aplicación ejecutándose en el celular.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Conectando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego que la conexión haya resultado exitosa, nos encontramos en la página principal. En el panel superior, como se muestra a continuación, se encuentran las aplicaciones disponibles que podemos ejecutar en el robot butiá.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Acciones.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para agregar una serie de acciones al robot, simplemente presionamos la que queramos, a continuación esta aparecerá en el panel inferior, a medida de que vayamos seleccionando acciones, estas se irán encadenando una tras otras, estas estarán prontas para ejecutarse secuencialmente, desde la parte inferior a la parte superior, en el momento que presionemos el botón &amp;quot;Empezar&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Agregando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Como la aplicación está pensada para planificar algoritmos para resolver problemas, como puzzles, es probable que nos equivoquemos y seleccionemos una acción o insertemos un parámetro incorrectamente, ¡pero no te preocupes!. Para editar el parámetro que le hayamos ingresado a una acción, simplemente mantenemos pulsado la que deseamos corregir e ingresamos el nuevo valor.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Editando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
También es posible eliminar una acción, para hacer esto, nuevamente mantenemos pulsada la acción que queremos eliminar, pero esta vez, seleccionamos la acción eliminar. A continuación la acción seleccionada desaparecerá del panel inferior. También es posible que deseemos eliminar todas las acciones que habíamos ingresado, en este caso seleccionamos el botón &amp;quot;Eliminar acciones&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Eliminando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es posible que queremos que el robot se desplace a ciertas velocidades, teniendo en cuenta que al modificar la velocidad, el robot tendrá un comportamiento totalmente diferente, debido a que gran parte de las acciones se ejecutan por un tiempo asignado, a mayor velocidad, más desplazamiento.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Velocidad.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En caso de que exista un error en la coneccion, podemos intentar volver a conectar la aplicacion al servidor, para esto seleccionamos la opción configuración.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:A configuracion.gif]]&lt;br /&gt;
&lt;br /&gt;
== Video de muestra ==&lt;br /&gt;
&lt;br /&gt;
== Mejoras a futuro ==&lt;br /&gt;
&lt;br /&gt;
* Implementar una forma para que las función ''' Accion1 ''' pueda recibir parámetros, para así ampliar la gama de problemas que se puedan solucionar a través de esta aplicación.&lt;br /&gt;
&lt;br /&gt;
* Implementación de código que permita añadir a través del código, una mayor cantidad de funciones genéricas a la aplicación.&lt;br /&gt;
&lt;br /&gt;
* Desarrollar una forma de comunicación bilateral entre la App Mobile y Python para mejorar el debug en tiempo de ejecución.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Archivos de uso ==&lt;/div&gt;</summary>
		<author><name>German.moreira</name></author>	</entry>

	<entry>
		<id>http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Programando_el_Butia_desde_el_celular&amp;diff=11621</id>
		<title>Programando el Butia desde el celular</title>
		<link rel="alternate" type="text/html" href="http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Programando_el_Butia_desde_el_celular&amp;diff=11621"/>
				<updated>2021-06-27T07:21:13Z</updated>
		
		<summary type="html">&lt;p&gt;German.moreira: /* Implementación codigo React */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Introducción ==&lt;br /&gt;
&lt;br /&gt;
La idea del proyecto en un principio era usar el celular como medio para controlar el robot Butiá para que resulte más atractivo para los estudiantes que no les guste la programación.&lt;br /&gt;
&lt;br /&gt;
Luego, la idea se modifico un poco debido a que descubrimos que con esta implementación, podíamos hacer mas sencilla la resolución de algunos ejercicios básicos mediante algoritmos mas simplificados, tomamos el trabajo que teníamos hecho hasta el momento y lo adaptamos a un menú con distintas acciones simples como avanzar un determinado tiempo, avanzar hasta chocar contra un objeto o rotar a la izquierda o derecha un determinado tiempo.&lt;br /&gt;
&lt;br /&gt;
Estas funciones básicas y bastante sencillas de entender más una interfaz amigable y fácil de usar, se implementaron para que el rango de edad de uso de esta aplicación vaya de 3 años en adelante.&lt;br /&gt;
&lt;br /&gt;
Como resultado obtuvimos una aplicación que se puede usar para que niños de:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- 4 / 5 / 6 años resuelvan ejercicios sencillos como puede ser llegar de un punto a otro, buscar el camino a un objeto o resolver un laberinto sencillo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- 7 / 8 / 9 años puedan resolver ejercicios un poco más complejos como puede ser resolver un laberinto del más sencillo al mas complejo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- 10 años en adelante tengan la capacidad de adaptar una parte personal de código al programa y puedan resolver cualquier ejercicio que se pueda plantear con el robot Butiá.&lt;br /&gt;
&lt;br /&gt;
== Objetivo ==&lt;br /&gt;
&lt;br /&gt;
Los objetivos del proyecto eran, como dice el nombre, poder conectar remotamente el robot Butiá a un celular y buscar una abstracción de la mayor cantidad de problemas que puedan ser resueltos con el robot Butiá.&lt;br /&gt;
&lt;br /&gt;
Esto para poder crear un método de uso del robot Butiá más dinámico y con funciones que permiten realizar, mediante algoritmos mas sencillos, la solución de la mayor cantidad de puzles particulares.&lt;br /&gt;
&lt;br /&gt;
Al hacer esto el nivel de uso en aulas del robot Butiá, puede simplificarse hasta clases desde 3 años de jardinera en adelante, debido a que la aplicación simplifica la parte de codificación y los algoritmos de solución de ejercicios se convierten simplemente en una serie de pasos básicos a ejecutar linealmente.&lt;br /&gt;
&lt;br /&gt;
== Armado del Butiá ==&lt;br /&gt;
&lt;br /&gt;
* Paso 1: Armar el Butiá a partir de esta [https://www.fing.edu.uy/inco/proyectos/butia/files/docs_butia2/armando_paso_a_paso_motores_CC_rev1.pdf guía oficial]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''' Los siguientes pasos son opcionales '''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Paso 2: Instalar el sensor de grises&lt;br /&gt;
&lt;br /&gt;
1:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP1.jpeg]] &lt;br /&gt;
&lt;br /&gt;
2:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP2.jpeg]]&lt;br /&gt;
&lt;br /&gt;
3:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP3.jpeg]]&lt;br /&gt;
&lt;br /&gt;
4:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP4.jpeg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Paso 3: Instalar el sensor de distancia&lt;br /&gt;
&lt;br /&gt;
1:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP1.png]]&lt;br /&gt;
&lt;br /&gt;
2:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP2.png]]&lt;br /&gt;
&lt;br /&gt;
3:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP3.png]]&lt;br /&gt;
&lt;br /&gt;
4:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP4.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Implementación código Python ==&lt;br /&gt;
&lt;br /&gt;
Antes de empezar a programar o usar el código, es necesario instalar las librerías a usar, esto se puede hacer escribiendo &lt;br /&gt;
&lt;br /&gt;
'''''pip install [nombre de la librería]''''' en el interprete de comandos del sistema.&lt;br /&gt;
&lt;br /&gt;
Entonces instalamos la librería a utilizar, en este caso:&lt;br /&gt;
&lt;br /&gt;
'''''pip install simple_websocket_server'''''&lt;br /&gt;
&lt;br /&gt;
Una vez instalada la librería, hay que empezar a escribir el código.&lt;br /&gt;
&lt;br /&gt;
El encabezado del código es el siguiente&lt;br /&gt;
El uso de cada librería se explica con detalle mas adelante&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Encabezado.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A partir de la librería '''sys''' se define el camino del sistema para utilizar los plugin Butiá.&lt;br /&gt;
En nuestro caso, la ruta es ''' '/home/trerb/TurtleBots.activity/plugins/butia' ''', eso se tiene que modificar dependiendo de donde se encuentren el directorio ''' TurtleBots.activity/ ''' en su sistema de archivos&lt;br /&gt;
&lt;br /&gt;
[[Archivo:UsoPluginButia.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego se encuentra la función ''' clearConsole ''',&lt;br /&gt;
Esta función sirve únicamente para limpiar el interprete de Python usando la librería ''' os ''' y tener una ejecución mas limpia&lt;br /&gt;
&lt;br /&gt;
[[Archivo:clearConsole().png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
El siguiente código utiliza la librería ''' socket ''' para conectarse a la web y preguntar la ip del ordenador que ejecuta el archivo y la muestra en pantalla, esto se usa para facilitar la conexión con la App Mobile&lt;br /&gt;
&lt;br /&gt;
[[Archivo:conexionSocket.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Las siguientes líneas de código preguntan al usuario que puerto va a utilizar para la conexión, este código verifica que se ingrese un dato numérico, dentro del rango de los puertos, y que el puerto este disponible.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:tryPuerto.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego se declaran las variables: ''' Speed, Puerto_Gris y Puerto_Distancia ''', se verifica que los sensores de distancia y de grises estén conectados y asigna el puerto en el que estén conectados a las variables ''' Puerto_Distancia ''' y ''' Puerto_Gris ''' respectivamente. La variable ''' Speed ''' es una variable global que se lee al inicio de cada cadena de acciones y la utiliza para todos los movimientos del Butiá de esa cadena.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:declaracionVariables.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Seguimos con la declaración de las funciones básicas del Butiá, en este caso son ''' Avanzar, Rotar, AvanzarHastaVerColor y AvanzarHastaObstaculo ''' &lt;br /&gt;
&lt;br /&gt;
-La función ''' Avanzar ''' recibe un parámetro de tiempo y el Butiá avanza ese determinado tiempo.&lt;br /&gt;
&lt;br /&gt;
-La función ''' Retroceder ''' recibe un parámetro de tiempo y el Butiá retrocede ese determinado tiempo.&lt;br /&gt;
&lt;br /&gt;
-La función ''' Rotar ''' recibe dos parámetros, una dirección que puede ser Izquierda o Derecha y un tiempo que indica la duración de la rotación del Butiá.&lt;br /&gt;
&lt;br /&gt;
-La función ''' AvanzarHastaVerColor ''' recibe un parámetro que varia entre Blanco o Negro, el robot va a avanzar hasta detectar el color seleccionado.&lt;br /&gt;
Esta función solo se puede usar si el sensor de grises esta conectado.&lt;br /&gt;
&lt;br /&gt;
-Por ultimo, la función ''' AvanzarHastaObstaculo ''' no recibe parámetros, en este caso el Butiá va a avanzar hasta estar a unos pocos centímetros de un obstáculo.&lt;br /&gt;
Esta función solo se puede usar si el sensor de distancia esta conectado.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:FuncionesBasicas.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego se encuentra una función ''' Accion1 ''' esta función la puede definir el usuario a gusto, se puede implementar desde una función básica hasta un seguidor de líneas avanzado. La única condición que se necesita para implementar esta ''' Accion1 ''' es que no puede recibir parámetros&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Accion1.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ahora tenemos que definir el menú principal del programa, este se divide en dos funciones&lt;br /&gt;
&lt;br /&gt;
- ''' handle ''': Esta es una función predeterminada de la librería ''' simple_web_socket ''' y se llama cada vez que el servidor recibe un dato del cliente. En este caso la función crea una lista de las acciones que le llegan de la App Mobile, y las va ejecutando ordenadamente&lt;br /&gt;
&lt;br /&gt;
- ''' handle_close ''': Al igual que la función anterior, esta también es una función predeterminada de la librería ''' simple_web_socket ''' y se llama cuando el cliente se desconecta del servidor&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Screenshot from 2021-06-27 03-58-56.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Y por ultimo tenemos el dos líneas de codigo, la primera se encarga de abrir el servidor y la segunda lo mantiene abierto infinitamente&lt;br /&gt;
&lt;br /&gt;
[[Archivo:abrirServidor.png]]&lt;br /&gt;
&lt;br /&gt;
== Implementación codigo React ==&lt;br /&gt;
&lt;br /&gt;
La aplicacion movil esta implementada con React Native, ademas, se utiliza el ''framework'' [https://docs.expo.io/ Expo]. Este ''framework'' nos brinda un conjunto de herramientas que facilita el desarrollo de aplicaciones mobiles. &lt;br /&gt;
En caso de querer agregar, o modificar cualidades, es necesario proceder de la siguiente forma:&lt;br /&gt;
&lt;br /&gt;
Descargar el archivo comprimido adjunto.&lt;br /&gt;
&lt;br /&gt;
Extraerlo, posicionarse en el directorio raiz de la carpeta descomprimida, y ejecutar desde la terminal lo siguiente (tener en cuenta que es necesario tener en la maquina, el gestor de paquetes [https://docs.npmjs.com/ npm]).&lt;br /&gt;
&lt;br /&gt;
''''npm install'''' &lt;br /&gt;
&lt;br /&gt;
Esto descarga las dependencias que utiliza la aplicación, luego de esto podemos empezar a desarrollar.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para visualizar los cambios en tiempo real mientras desarrollamos, es necesario instalar la aplicación Expo Go para [https://play.google.com/store/apps/details?id=host.exp.exponent&amp;amp;hl=es_UY&amp;amp;gl=US Android] o para [https://apps.apple.com/es/app/expo-go/id982107779 iOS] según sea el caso.&lt;br /&gt;
&lt;br /&gt;
Para a visualizar la app en desarrollo desde Expo Go, procedemos de la siguiente forma:&lt;br /&gt;
Desde el directorio raíz de la aplicación ejecutamos desde la terminal lo siguiente:&lt;br /&gt;
&lt;br /&gt;
''''npm start''''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego, desde la aplicación Expo Go, con el celular conectado en la misma red local accedemos a la aplicación seleccionando lo siguiente:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Expo.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hecho esto, podemos cambiar el código de la aplicación y ver reflejados los cambios de forma casi instantánea.&lt;br /&gt;
&lt;br /&gt;
La aplicacion esta compuesta por dos pantallas, la pantalla de configuracion (''ConfigScreen.js''), donde se ingresa la direccion ip y puerto del servidor, y la pantalla principal (''MainScreen.js''), donde se lleva a cabo la programacion del robot mediante acciones.&lt;br /&gt;
&lt;br /&gt;
Esta ultima pantalla esta compuesta por los componentes ''TopList.js'' y ''BoottomList.js''.&lt;br /&gt;
&lt;br /&gt;
Para agregar una nueva accion al sistema, es necesario programarla en el servidor con un deteminado nombre, supondremos &amp;quot;AccionN&amp;quot;, esto resulta facil si se toma como ejemplo las acciones ya implementadas.&lt;br /&gt;
&lt;br /&gt;
En la aplicacion, esta nueva accion se agrega en el array &amp;quot;''actionsData''&amp;quot;, dicho array se encuentra en la palntalla principal, es decir en el archivo &amp;quot;''MainScreen.js''&amp;quot;, cada accion cuenta con los siguientes datos:&lt;br /&gt;
&lt;br /&gt;
-'''idAccion:''' Identificador de la accion en dicho arreglo (actionsData).&lt;br /&gt;
&lt;br /&gt;
-'''title:''': Titulo de la accion que se muetra en el panel superior.&lt;br /&gt;
&lt;br /&gt;
-'''actionId:''' Nombre identificador de la accion en el servidor.&lt;br /&gt;
&lt;br /&gt;
-'''overlay:''': ''Overlay'' que se despliega al seleccionar la accion si esta lleva un parametro, esta funcion lleva como parametro &amp;quot;''editOverlay''&amp;quot; y &amp;quot;''id''&amp;quot; (parametros que se utilizan cuando se requiere cambiar el valor del parametro de la accuion que ya fue seleccionada y se encuentra en el panel inferior), como por ejemplo pueden ser segundos en el caso de la accion &amp;quot;Avanzar&amp;quot;, o colores en el caso de &amp;quot;Avanzar hasta obstaculo&amp;quot;. Este parametro puede ser que no sea necesario, como es en el caso de la accion &amp;quot;Avanzar hasta obstaculo&amp;quot;, en este ultimo caso el valor de este campo es null.&lt;br /&gt;
&lt;br /&gt;
Ejemplo de la accion &amp;quot;Avanzar&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Screenshot from 2021-06-27 04-18-42.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ejemplo de la accion &amp;quot;Avanzar hasta obstaculo&amp;quot;:&lt;br /&gt;
[[Archivo:Screenshot_from_2021-06-27_00-28-32.png]]&lt;br /&gt;
&lt;br /&gt;
== Manual de uso de la aplicación ==&lt;br /&gt;
&lt;br /&gt;
Aunque la aplicación resulta intuitiva y fácil de usar se describe a continuación una serie de pasos para utilizarla correctamente.&lt;br /&gt;
&lt;br /&gt;
Para comenzar a utilizar la aplicación es necesario configurar la coneccion de la aplicación con el servidor (recordar que ambos se deben encontrar ejecutándose en la misma red local), el servidor ejecutando en una computadora que esté conectada correctamente al butiá (con los sensores descritos anteriormente) y la aplicación ejecutándose en el celular.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Conectando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego que la conexión haya resultado exitosa, nos encontramos en la página principal. En el panel superior, como se muestra a continuación, se encuentran las aplicaciones disponibles que podemos ejecutar en el robot butiá.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Acciones.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para agregar una serie de acciones al robot, simplemente presionamos la que queramos, a continuación esta aparecerá en el panel inferior, a medida de que vayamos seleccionando acciones, estas se irán encadenando una tras otras, estas estarán prontas para ejecutarse secuencialmente, desde la parte inferior a la parte superior, en el momento que presionemos el botón &amp;quot;Empezar&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Agregando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Como la aplicación está pensada para planificar algoritmos para resolver problemas, como puzzles, es probable que nos equivoquemos y seleccionemos una acción o insertemos un parámetro incorrectamente, ¡pero no te preocupes!. Para editar el parámetro que le hayamos ingresado a una acción, simplemente mantenemos pulsado la que deseamos corregir e ingresamos el nuevo valor.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Editando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
También es posible eliminar una acción, para hacer esto, nuevamente mantenemos pulsada la acción que queremos eliminar, pero esta vez, seleccionamos la acción eliminar. A continuación la acción seleccionada desaparecerá del panel inferior. También es posible que deseemos eliminar todas las acciones que habíamos ingresado, en este caso seleccionamos el botón &amp;quot;Eliminar acciones&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Eliminando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es posible que queremos que el robot se desplace a ciertas velocidades, teniendo en cuenta que al modificar la velocidad, el robot tendrá un comportamiento totalmente diferente, debido a que gran parte de las acciones se ejecutan por un tiempo asignado, a mayor velocidad, más desplazamiento.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Velocidad.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En caso de que exista un error en la coneccion, podemos intentar volver a conectar la aplicacion al servidor, para esto seleccionamos la opción configuración.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:A configuracion.gif]]&lt;br /&gt;
&lt;br /&gt;
== Video de muestra ==&lt;br /&gt;
&lt;br /&gt;
== Mejoras a futuro ==&lt;br /&gt;
&lt;br /&gt;
* Implementar una forma para que las función ''' Accion1 ''' pueda recibir parámetros, para así ampliar la gama de problemas que se puedan solucionar a través de esta aplicación.&lt;br /&gt;
&lt;br /&gt;
* Implementación de código que permita añadir a través del código, una mayor cantidad de funciones genéricas a la aplicación.&lt;br /&gt;
&lt;br /&gt;
* Desarrollar una forma de comunicación bilateral entre la App Mobile y Python para mejorar el debug en tiempo de ejecución.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Archivos de uso ==&lt;/div&gt;</summary>
		<author><name>German.moreira</name></author>	</entry>

	<entry>
		<id>http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Archivo:Screenshot_from_2021-06-27_04-18-42.png&amp;diff=11620</id>
		<title>Archivo:Screenshot from 2021-06-27 04-18-42.png</title>
		<link rel="alternate" type="text/html" href="http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Archivo:Screenshot_from_2021-06-27_04-18-42.png&amp;diff=11620"/>
				<updated>2021-06-27T07:19:29Z</updated>
		
		<summary type="html">&lt;p&gt;German.moreira: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>German.moreira</name></author>	</entry>

	<entry>
		<id>http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Programando_el_Butia_desde_el_celular&amp;diff=11619</id>
		<title>Programando el Butia desde el celular</title>
		<link rel="alternate" type="text/html" href="http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Programando_el_Butia_desde_el_celular&amp;diff=11619"/>
				<updated>2021-06-27T07:18:49Z</updated>
		
		<summary type="html">&lt;p&gt;German.moreira: /* Implementación codigo React */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Introducción ==&lt;br /&gt;
&lt;br /&gt;
La idea del proyecto en un principio era usar el celular como medio para controlar el robot Butiá para que resulte más atractivo para los estudiantes que no les guste la programación.&lt;br /&gt;
&lt;br /&gt;
Luego, la idea se modifico un poco debido a que descubrimos que con esta implementación, podíamos hacer mas sencilla la resolución de algunos ejercicios básicos mediante algoritmos mas simplificados, tomamos el trabajo que teníamos hecho hasta el momento y lo adaptamos a un menú con distintas acciones simples como avanzar un determinado tiempo, avanzar hasta chocar contra un objeto o rotar a la izquierda o derecha un determinado tiempo.&lt;br /&gt;
&lt;br /&gt;
Estas funciones básicas y bastante sencillas de entender más una interfaz amigable y fácil de usar, se implementaron para que el rango de edad de uso de esta aplicación vaya de 3 años en adelante.&lt;br /&gt;
&lt;br /&gt;
Como resultado obtuvimos una aplicación que se puede usar para que niños de:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- 4 / 5 / 6 años resuelvan ejercicios sencillos como puede ser llegar de un punto a otro, buscar el camino a un objeto o resolver un laberinto sencillo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- 7 / 8 / 9 años puedan resolver ejercicios un poco más complejos como puede ser resolver un laberinto del más sencillo al mas complejo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- 10 años en adelante tengan la capacidad de adaptar una parte personal de código al programa y puedan resolver cualquier ejercicio que se pueda plantear con el robot Butiá.&lt;br /&gt;
&lt;br /&gt;
== Objetivo ==&lt;br /&gt;
&lt;br /&gt;
Los objetivos del proyecto eran, como dice el nombre, poder conectar remotamente el robot Butiá a un celular y buscar una abstracción de la mayor cantidad de problemas que puedan ser resueltos con el robot Butiá.&lt;br /&gt;
&lt;br /&gt;
Esto para poder crear un método de uso del robot Butiá más dinámico y con funciones que permiten realizar, mediante algoritmos mas sencillos, la solución de la mayor cantidad de puzles particulares.&lt;br /&gt;
&lt;br /&gt;
Al hacer esto el nivel de uso en aulas del robot Butiá, puede simplificarse hasta clases desde 3 años de jardinera en adelante, debido a que la aplicación simplifica la parte de codificación y los algoritmos de solución de ejercicios se convierten simplemente en una serie de pasos básicos a ejecutar linealmente.&lt;br /&gt;
&lt;br /&gt;
== Armado del Butiá ==&lt;br /&gt;
&lt;br /&gt;
* Paso 1: Armar el Butiá a partir de esta [https://www.fing.edu.uy/inco/proyectos/butia/files/docs_butia2/armando_paso_a_paso_motores_CC_rev1.pdf guía oficial]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''' Los siguientes pasos son opcionales '''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Paso 2: Instalar el sensor de grises&lt;br /&gt;
&lt;br /&gt;
1:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP1.jpeg]] &lt;br /&gt;
&lt;br /&gt;
2:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP2.jpeg]]&lt;br /&gt;
&lt;br /&gt;
3:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP3.jpeg]]&lt;br /&gt;
&lt;br /&gt;
4:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP4.jpeg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Paso 3: Instalar el sensor de distancia&lt;br /&gt;
&lt;br /&gt;
1:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP1.png]]&lt;br /&gt;
&lt;br /&gt;
2:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP2.png]]&lt;br /&gt;
&lt;br /&gt;
3:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP3.png]]&lt;br /&gt;
&lt;br /&gt;
4:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP4.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Implementación código Python ==&lt;br /&gt;
&lt;br /&gt;
Antes de empezar a programar o usar el código, es necesario instalar las librerías a usar, esto se puede hacer escribiendo &lt;br /&gt;
&lt;br /&gt;
'''''pip install [nombre de la librería]''''' en el interprete de comandos del sistema.&lt;br /&gt;
&lt;br /&gt;
Entonces instalamos la librería a utilizar, en este caso:&lt;br /&gt;
&lt;br /&gt;
'''''pip install simple_websocket_server'''''&lt;br /&gt;
&lt;br /&gt;
Una vez instalada la librería, hay que empezar a escribir el código.&lt;br /&gt;
&lt;br /&gt;
El encabezado del código es el siguiente&lt;br /&gt;
El uso de cada librería se explica con detalle mas adelante&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Encabezado.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A partir de la librería '''sys''' se define el camino del sistema para utilizar los plugin Butiá.&lt;br /&gt;
En nuestro caso, la ruta es ''' '/home/trerb/TurtleBots.activity/plugins/butia' ''', eso se tiene que modificar dependiendo de donde se encuentren el directorio ''' TurtleBots.activity/ ''' en su sistema de archivos&lt;br /&gt;
&lt;br /&gt;
[[Archivo:UsoPluginButia.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego se encuentra la función ''' clearConsole ''',&lt;br /&gt;
Esta función sirve únicamente para limpiar el interprete de Python usando la librería ''' os ''' y tener una ejecución mas limpia&lt;br /&gt;
&lt;br /&gt;
[[Archivo:clearConsole().png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
El siguiente código utiliza la librería ''' socket ''' para conectarse a la web y preguntar la ip del ordenador que ejecuta el archivo y la muestra en pantalla, esto se usa para facilitar la conexión con la App Mobile&lt;br /&gt;
&lt;br /&gt;
[[Archivo:conexionSocket.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Las siguientes líneas de código preguntan al usuario que puerto va a utilizar para la conexión, este código verifica que se ingrese un dato numérico, dentro del rango de los puertos, y que el puerto este disponible.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:tryPuerto.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego se declaran las variables: ''' Speed, Puerto_Gris y Puerto_Distancia ''', se verifica que los sensores de distancia y de grises estén conectados y asigna el puerto en el que estén conectados a las variables ''' Puerto_Distancia ''' y ''' Puerto_Gris ''' respectivamente. La variable ''' Speed ''' es una variable global que se lee al inicio de cada cadena de acciones y la utiliza para todos los movimientos del Butiá de esa cadena.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:declaracionVariables.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Seguimos con la declaración de las funciones básicas del Butiá, en este caso son ''' Avanzar, Rotar, AvanzarHastaVerColor y AvanzarHastaObstaculo ''' &lt;br /&gt;
&lt;br /&gt;
-La función ''' Avanzar ''' recibe un parámetro de tiempo y el Butiá avanza ese determinado tiempo.&lt;br /&gt;
&lt;br /&gt;
-La función ''' Retroceder ''' recibe un parámetro de tiempo y el Butiá retrocede ese determinado tiempo.&lt;br /&gt;
&lt;br /&gt;
-La función ''' Rotar ''' recibe dos parámetros, una dirección que puede ser Izquierda o Derecha y un tiempo que indica la duración de la rotación del Butiá.&lt;br /&gt;
&lt;br /&gt;
-La función ''' AvanzarHastaVerColor ''' recibe un parámetro que varia entre Blanco o Negro, el robot va a avanzar hasta detectar el color seleccionado.&lt;br /&gt;
Esta función solo se puede usar si el sensor de grises esta conectado.&lt;br /&gt;
&lt;br /&gt;
-Por ultimo, la función ''' AvanzarHastaObstaculo ''' no recibe parámetros, en este caso el Butiá va a avanzar hasta estar a unos pocos centímetros de un obstáculo.&lt;br /&gt;
Esta función solo se puede usar si el sensor de distancia esta conectado.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:FuncionesBasicas.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego se encuentra una función ''' Accion1 ''' esta función la puede definir el usuario a gusto, se puede implementar desde una función básica hasta un seguidor de líneas avanzado. La única condición que se necesita para implementar esta ''' Accion1 ''' es que no puede recibir parámetros&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Accion1.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ahora tenemos que definir el menú principal del programa, este se divide en dos funciones&lt;br /&gt;
&lt;br /&gt;
- ''' handle ''': Esta es una función predeterminada de la librería ''' simple_web_socket ''' y se llama cada vez que el servidor recibe un dato del cliente. En este caso la función crea una lista de las acciones que le llegan de la App Mobile, y las va ejecutando ordenadamente&lt;br /&gt;
&lt;br /&gt;
- ''' handle_close ''': Al igual que la función anterior, esta también es una función predeterminada de la librería ''' simple_web_socket ''' y se llama cuando el cliente se desconecta del servidor&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Screenshot from 2021-06-27 03-58-56.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Y por ultimo tenemos el dos líneas de codigo, la primera se encarga de abrir el servidor y la segunda lo mantiene abierto infinitamente&lt;br /&gt;
&lt;br /&gt;
[[Archivo:abrirServidor.png]]&lt;br /&gt;
&lt;br /&gt;
== Implementación codigo React ==&lt;br /&gt;
&lt;br /&gt;
La aplicacion movil esta implementada con React Native, ademas, se utiliza el ''framework'' [https://docs.expo.io/ Expo]. Este ''framework'' nos brinda un conjunto de herramientas que facilita el desarrollo de aplicaciones mobiles. &lt;br /&gt;
En caso de querer agregar, o modificar cualidades, es necesario proceder de la siguiente forma:&lt;br /&gt;
&lt;br /&gt;
Descargar el archivo comprimido adjunto.&lt;br /&gt;
&lt;br /&gt;
Extraerlo, posicionarse en el directorio raiz de la carpeta descomprimida, y ejecutar desde la terminal lo siguiente (tener en cuenta que es necesario tener en la maquina, el gestor de paquetes [https://docs.npmjs.com/ npm]).&lt;br /&gt;
&lt;br /&gt;
''''npm install'''' &lt;br /&gt;
&lt;br /&gt;
Esto descarga las dependencias que utiliza la aplicación, luego de esto podemos empezar a desarrollar.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para visualizar los cambios en tiempo real mientras desarrollamos, es necesario instalar la aplicación Expo Go para [https://play.google.com/store/apps/details?id=host.exp.exponent&amp;amp;hl=es_UY&amp;amp;gl=US Android] o para [https://apps.apple.com/es/app/expo-go/id982107779 iOS] según sea el caso.&lt;br /&gt;
&lt;br /&gt;
Para a visualizar la app en desarrollo desde Expo Go, procedemos de la siguiente forma:&lt;br /&gt;
Desde el directorio raíz de la aplicación ejecutamos desde la terminal lo siguiente:&lt;br /&gt;
&lt;br /&gt;
''''npm start''''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego, desde la aplicación Expo Go, con el celular conectado en la misma red local accedemos a la aplicación seleccionando lo siguiente:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Expo.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hecho esto, podemos cambiar el código de la aplicación y ver reflejados los cambios de forma casi instantánea.&lt;br /&gt;
&lt;br /&gt;
La aplicacion esta compuesta por dos pantallas, la pantalla de configuracion (''ConfigScreen.js''), donde se ingresa la direccion ip y puerto del servidor, y la pantalla principal (''MainScreen.js''), donde se lleva a cabo la programacion del robot mediante acciones.&lt;br /&gt;
&lt;br /&gt;
Esta ultima pantalla esta compuesta por los componentes ''TopList.js'' y ''BoottomList.js''.&lt;br /&gt;
&lt;br /&gt;
Para agregar una nueva accion al sistema, es necesario programarla en el servidor con un deteminado nombre, supondremos &amp;quot;AccionN&amp;quot;, esto resulta facil si se toma como ejemplo las acciones ya implementadas.&lt;br /&gt;
&lt;br /&gt;
En la aplicacion, esta nueva accion se agrega en el array &amp;quot;''actionsData''&amp;quot;, dicho array se encuentra en la palntalla principal, es decir en el archivo &amp;quot;''MainScreen.js''&amp;quot;, cada accion cuenta con los siguientes datos:&lt;br /&gt;
&lt;br /&gt;
-'''idAccion:''' Identificador de la accion en dicho arreglo (actionsData).&lt;br /&gt;
-'''title:''': Titulo de la accion que se muetra en el panel superior.&lt;br /&gt;
-'''actionId:''' Nombre identificador de la accion en el servidor.&lt;br /&gt;
-'''overlay:''': ''Overlay'' que se despliega al seleccionar la accion si esta lleva un parametro, esta funcion lleva como parametro &amp;quot;''editOverlay''&amp;quot; y &amp;quot;''id''&amp;quot; (parametros que se utilizan cuando se requiere cambiar el valor del parametro de la accuion que ya fue seleccionada y se encuentra en el panel inferior), como por ejemplo pueden ser segundos en el caso de la accion &amp;quot;Avanzar&amp;quot;, o colores en el caso de &amp;quot;Avanzar hasta obstaculo&amp;quot;. Este parametro puede ser que no sea necesario, como es en el caso de la accion &amp;quot;Avanzar hasta obstaculo&amp;quot;, en este ultimo caso el valor de este campo es null.&lt;br /&gt;
&lt;br /&gt;
Ejemplo de la accion Iquierda:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Screenshot from 2021-06-27 00-29-39.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ejemplo de la accion &amp;quot;Avanzar hasta obstaculo&amp;quot;&lt;br /&gt;
[[Archivo:Screenshot_from_2021-06-27_00-28-32.png]]&lt;br /&gt;
&lt;br /&gt;
== Manual de uso de la aplicación ==&lt;br /&gt;
&lt;br /&gt;
Aunque la aplicación resulta intuitiva y fácil de usar se describe a continuación una serie de pasos para utilizarla correctamente.&lt;br /&gt;
&lt;br /&gt;
Para comenzar a utilizar la aplicación es necesario configurar la coneccion de la aplicación con el servidor (recordar que ambos se deben encontrar ejecutándose en la misma red local), el servidor ejecutando en una computadora que esté conectada correctamente al butiá (con los sensores descritos anteriormente) y la aplicación ejecutándose en el celular.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Conectando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego que la conexión haya resultado exitosa, nos encontramos en la página principal. En el panel superior, como se muestra a continuación, se encuentran las aplicaciones disponibles que podemos ejecutar en el robot butiá.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Acciones.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para agregar una serie de acciones al robot, simplemente presionamos la que queramos, a continuación esta aparecerá en el panel inferior, a medida de que vayamos seleccionando acciones, estas se irán encadenando una tras otras, estas estarán prontas para ejecutarse secuencialmente, desde la parte inferior a la parte superior, en el momento que presionemos el botón &amp;quot;Empezar&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Agregando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Como la aplicación está pensada para planificar algoritmos para resolver problemas, como puzzles, es probable que nos equivoquemos y seleccionemos una acción o insertemos un parámetro incorrectamente, ¡pero no te preocupes!. Para editar el parámetro que le hayamos ingresado a una acción, simplemente mantenemos pulsado la que deseamos corregir e ingresamos el nuevo valor.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Editando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
También es posible eliminar una acción, para hacer esto, nuevamente mantenemos pulsada la acción que queremos eliminar, pero esta vez, seleccionamos la acción eliminar. A continuación la acción seleccionada desaparecerá del panel inferior. También es posible que deseemos eliminar todas las acciones que habíamos ingresado, en este caso seleccionamos el botón &amp;quot;Eliminar acciones&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Eliminando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es posible que queremos que el robot se desplace a ciertas velocidades, teniendo en cuenta que al modificar la velocidad, el robot tendrá un comportamiento totalmente diferente, debido a que gran parte de las acciones se ejecutan por un tiempo asignado, a mayor velocidad, más desplazamiento.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Velocidad.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En caso de que exista un error en la coneccion, podemos intentar volver a conectar la aplicacion al servidor, para esto seleccionamos la opción configuración.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:A configuracion.gif]]&lt;br /&gt;
&lt;br /&gt;
== Video de muestra ==&lt;br /&gt;
&lt;br /&gt;
== Mejoras a futuro ==&lt;br /&gt;
&lt;br /&gt;
* Implementar una forma para que las función ''' Accion1 ''' pueda recibir parámetros, para así ampliar la gama de problemas que se puedan solucionar a través de esta aplicación.&lt;br /&gt;
&lt;br /&gt;
* Implementación de código que permita añadir a través del código, una mayor cantidad de funciones genéricas a la aplicación.&lt;br /&gt;
&lt;br /&gt;
* Desarrollar una forma de comunicación bilateral entre la App Mobile y Python para mejorar el debug en tiempo de ejecución.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Archivos de uso ==&lt;/div&gt;</summary>
		<author><name>German.moreira</name></author>	</entry>

	<entry>
		<id>http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Programando_el_Butia_desde_el_celular&amp;diff=11618</id>
		<title>Programando el Butia desde el celular</title>
		<link rel="alternate" type="text/html" href="http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Programando_el_Butia_desde_el_celular&amp;diff=11618"/>
				<updated>2021-06-27T07:00:35Z</updated>
		
		<summary type="html">&lt;p&gt;German.moreira: /* Implementación código Python */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Introducción ==&lt;br /&gt;
&lt;br /&gt;
La idea del proyecto en un principio era usar el celular como medio para controlar el robot Butiá para que resulte más atractivo para los estudiantes que no les guste la programación.&lt;br /&gt;
&lt;br /&gt;
Luego, la idea se modifico un poco debido a que descubrimos que con esta implementación, podíamos hacer mas sencilla la resolución de algunos ejercicios básicos mediante algoritmos mas simplificados, tomamos el trabajo que teníamos hecho hasta el momento y lo adaptamos a un menú con distintas acciones simples como avanzar un determinado tiempo, avanzar hasta chocar contra un objeto o rotar a la izquierda o derecha un determinado tiempo.&lt;br /&gt;
&lt;br /&gt;
Estas funciones básicas y bastante sencillas de entender más una interfaz amigable y fácil de usar, se implementaron para que el rango de edad de uso de esta aplicación vaya de 3 años en adelante.&lt;br /&gt;
&lt;br /&gt;
Como resultado obtuvimos una aplicación que se puede usar para que niños de:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- 4 / 5 / 6 años resuelvan ejercicios sencillos como puede ser llegar de un punto a otro, buscar el camino a un objeto o resolver un laberinto sencillo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- 7 / 8 / 9 años puedan resolver ejercicios un poco más complejos como puede ser resolver un laberinto del más sencillo al mas complejo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- 10 años en adelante tengan la capacidad de adaptar una parte personal de código al programa y puedan resolver cualquier ejercicio que se pueda plantear con el robot Butiá.&lt;br /&gt;
&lt;br /&gt;
== Objetivo ==&lt;br /&gt;
&lt;br /&gt;
Los objetivos del proyecto eran, como dice el nombre, poder conectar remotamente el robot Butiá a un celular y buscar una abstracción de la mayor cantidad de problemas que puedan ser resueltos con el robot Butiá.&lt;br /&gt;
&lt;br /&gt;
Esto para poder crear un método de uso del robot Butiá más dinámico y con funciones que permiten realizar, mediante algoritmos mas sencillos, la solución de la mayor cantidad de puzles particulares.&lt;br /&gt;
&lt;br /&gt;
Al hacer esto el nivel de uso en aulas del robot Butiá, puede simplificarse hasta clases desde 3 años de jardinera en adelante, debido a que la aplicación simplifica la parte de codificación y los algoritmos de solución de ejercicios se convierten simplemente en una serie de pasos básicos a ejecutar linealmente.&lt;br /&gt;
&lt;br /&gt;
== Armado del Butiá ==&lt;br /&gt;
&lt;br /&gt;
* Paso 1: Armar el Butiá a partir de esta [https://www.fing.edu.uy/inco/proyectos/butia/files/docs_butia2/armando_paso_a_paso_motores_CC_rev1.pdf guía oficial]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''' Los siguientes pasos son opcionales '''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Paso 2: Instalar el sensor de grises&lt;br /&gt;
&lt;br /&gt;
1:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP1.jpeg]] &lt;br /&gt;
&lt;br /&gt;
2:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP2.jpeg]]&lt;br /&gt;
&lt;br /&gt;
3:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP3.jpeg]]&lt;br /&gt;
&lt;br /&gt;
4:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP4.jpeg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Paso 3: Instalar el sensor de distancia&lt;br /&gt;
&lt;br /&gt;
1:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP1.png]]&lt;br /&gt;
&lt;br /&gt;
2:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP2.png]]&lt;br /&gt;
&lt;br /&gt;
3:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP3.png]]&lt;br /&gt;
&lt;br /&gt;
4:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP4.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Implementación código Python ==&lt;br /&gt;
&lt;br /&gt;
Antes de empezar a programar o usar el código, es necesario instalar las librerías a usar, esto se puede hacer escribiendo &lt;br /&gt;
&lt;br /&gt;
'''''pip install [nombre de la librería]''''' en el interprete de comandos del sistema.&lt;br /&gt;
&lt;br /&gt;
Entonces instalamos la librería a utilizar, en este caso:&lt;br /&gt;
&lt;br /&gt;
'''''pip install simple_websocket_server'''''&lt;br /&gt;
&lt;br /&gt;
Una vez instalada la librería, hay que empezar a escribir el código.&lt;br /&gt;
&lt;br /&gt;
El encabezado del código es el siguiente&lt;br /&gt;
El uso de cada librería se explica con detalle mas adelante&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Encabezado.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A partir de la librería '''sys''' se define el camino del sistema para utilizar los plugin Butiá.&lt;br /&gt;
En nuestro caso, la ruta es ''' '/home/trerb/TurtleBots.activity/plugins/butia' ''', eso se tiene que modificar dependiendo de donde se encuentren el directorio ''' TurtleBots.activity/ ''' en su sistema de archivos&lt;br /&gt;
&lt;br /&gt;
[[Archivo:UsoPluginButia.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego se encuentra la función ''' clearConsole ''',&lt;br /&gt;
Esta función sirve únicamente para limpiar el interprete de Python usando la librería ''' os ''' y tener una ejecución mas limpia&lt;br /&gt;
&lt;br /&gt;
[[Archivo:clearConsole().png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
El siguiente código utiliza la librería ''' socket ''' para conectarse a la web y preguntar la ip del ordenador que ejecuta el archivo y la muestra en pantalla, esto se usa para facilitar la conexión con la App Mobile&lt;br /&gt;
&lt;br /&gt;
[[Archivo:conexionSocket.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Las siguientes líneas de código preguntan al usuario que puerto va a utilizar para la conexión, este código verifica que se ingrese un dato numérico, dentro del rango de los puertos, y que el puerto este disponible.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:tryPuerto.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego se declaran las variables: ''' Speed, Puerto_Gris y Puerto_Distancia ''', se verifica que los sensores de distancia y de grises estén conectados y asigna el puerto en el que estén conectados a las variables ''' Puerto_Distancia ''' y ''' Puerto_Gris ''' respectivamente. La variable ''' Speed ''' es una variable global que se lee al inicio de cada cadena de acciones y la utiliza para todos los movimientos del Butiá de esa cadena.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:declaracionVariables.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Seguimos con la declaración de las funciones básicas del Butiá, en este caso son ''' Avanzar, Rotar, AvanzarHastaVerColor y AvanzarHastaObstaculo ''' &lt;br /&gt;
&lt;br /&gt;
-La función ''' Avanzar ''' recibe un parámetro de tiempo y el Butiá avanza ese determinado tiempo.&lt;br /&gt;
&lt;br /&gt;
-La función ''' Retroceder ''' recibe un parámetro de tiempo y el Butiá retrocede ese determinado tiempo.&lt;br /&gt;
&lt;br /&gt;
-La función ''' Rotar ''' recibe dos parámetros, una dirección que puede ser Izquierda o Derecha y un tiempo que indica la duración de la rotación del Butiá.&lt;br /&gt;
&lt;br /&gt;
-La función ''' AvanzarHastaVerColor ''' recibe un parámetro que varia entre Blanco o Negro, el robot va a avanzar hasta detectar el color seleccionado.&lt;br /&gt;
Esta función solo se puede usar si el sensor de grises esta conectado.&lt;br /&gt;
&lt;br /&gt;
-Por ultimo, la función ''' AvanzarHastaObstaculo ''' no recibe parámetros, en este caso el Butiá va a avanzar hasta estar a unos pocos centímetros de un obstáculo.&lt;br /&gt;
Esta función solo se puede usar si el sensor de distancia esta conectado.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:FuncionesBasicas.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego se encuentra una función ''' Accion1 ''' esta función la puede definir el usuario a gusto, se puede implementar desde una función básica hasta un seguidor de líneas avanzado. La única condición que se necesita para implementar esta ''' Accion1 ''' es que no puede recibir parámetros&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Accion1.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ahora tenemos que definir el menú principal del programa, este se divide en dos funciones&lt;br /&gt;
&lt;br /&gt;
- ''' handle ''': Esta es una función predeterminada de la librería ''' simple_web_socket ''' y se llama cada vez que el servidor recibe un dato del cliente. En este caso la función crea una lista de las acciones que le llegan de la App Mobile, y las va ejecutando ordenadamente&lt;br /&gt;
&lt;br /&gt;
- ''' handle_close ''': Al igual que la función anterior, esta también es una función predeterminada de la librería ''' simple_web_socket ''' y se llama cuando el cliente se desconecta del servidor&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Screenshot from 2021-06-27 03-58-56.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Y por ultimo tenemos el dos líneas de codigo, la primera se encarga de abrir el servidor y la segunda lo mantiene abierto infinitamente&lt;br /&gt;
&lt;br /&gt;
[[Archivo:abrirServidor.png]]&lt;br /&gt;
&lt;br /&gt;
== Implementación codigo React ==&lt;br /&gt;
&lt;br /&gt;
La aplicacion movil esta implementada con React Native, ademas, se utiliza el ''framework'' [https://docs.expo.io/ Expo]. Este ''framework'' nos brinda un conjunto de herramientas que facilita el desarrollo de aplicaciones mobiles. &lt;br /&gt;
En caso de querer agregar, o modificar cualidades, es necesario proceder de la siguiente forma:&lt;br /&gt;
&lt;br /&gt;
Descargar el archivo comprimido adjunto.&lt;br /&gt;
&lt;br /&gt;
Extraerlo, posicionarse en el directorio raiz de la carpeta descomprimida, y ejecutar desde la terminal lo siguiente (tener en cuenta que es necesario tener en la maquina, el gestor de paquetes [https://docs.npmjs.com/ npm]).&lt;br /&gt;
&lt;br /&gt;
''''npm install'''' &lt;br /&gt;
&lt;br /&gt;
Esto descarga las dependencias que utiliza la aplicación, luego de esto podemos empezar a desarrollar.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para visualizar los cambios en tiempo real mientras desarrollamos, es necesario instalar la aplicación Expo Go para [https://play.google.com/store/apps/details?id=host.exp.exponent&amp;amp;hl=es_UY&amp;amp;gl=US Android] o para [https://apps.apple.com/es/app/expo-go/id982107779 iOS] según sea el caso.&lt;br /&gt;
&lt;br /&gt;
Para a visualizar la app en desarrollo desde Expo Go, procedemos de la siguiente forma:&lt;br /&gt;
Desde el directorio raíz de la aplicación ejecutamos desde la terminal lo siguiente:&lt;br /&gt;
&lt;br /&gt;
''''npm start''''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego, desde la aplicación Expo Go, con el celular conectado en la misma red local accedemos a la aplicación seleccionando lo siguiente:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Expo.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hecho esto, podemos cambiar el código de la aplicación y ver reflejados los cambios de forma casi instantánea.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Screenshot_from_2021-06-27_00-28-32.png]]&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Screenshot from 2021-06-27 00-29-39.png]]&lt;br /&gt;
&lt;br /&gt;
== Manual de uso de la aplicación ==&lt;br /&gt;
&lt;br /&gt;
Aunque la aplicación resulta intuitiva y fácil de usar se describe a continuación una serie de pasos para utilizarla correctamente.&lt;br /&gt;
&lt;br /&gt;
Para comenzar a utilizar la aplicación es necesario configurar la coneccion de la aplicación con el servidor (recordar que ambos se deben encontrar ejecutándose en la misma red local), el servidor ejecutando en una computadora que esté conectada correctamente al butiá (con los sensores descritos anteriormente) y la aplicación ejecutándose en el celular.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Conectando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego que la conexión haya resultado exitosa, nos encontramos en la página principal. En el panel superior, como se muestra a continuación, se encuentran las aplicaciones disponibles que podemos ejecutar en el robot butiá.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Acciones.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para agregar una serie de acciones al robot, simplemente presionamos la que queramos, a continuación esta aparecerá en el panel inferior, a medida de que vayamos seleccionando acciones, estas se irán encadenando una tras otras, estas estarán prontas para ejecutarse secuencialmente, desde la parte inferior a la parte superior, en el momento que presionemos el botón &amp;quot;Empezar&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Agregando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Como la aplicación está pensada para planificar algoritmos para resolver problemas, como puzzles, es probable que nos equivoquemos y seleccionemos una acción o insertemos un parámetro incorrectamente, ¡pero no te preocupes!. Para editar el parámetro que le hayamos ingresado a una acción, simplemente mantenemos pulsado la que deseamos corregir e ingresamos el nuevo valor.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Editando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
También es posible eliminar una acción, para hacer esto, nuevamente mantenemos pulsada la acción que queremos eliminar, pero esta vez, seleccionamos la acción eliminar. A continuación la acción seleccionada desaparecerá del panel inferior. También es posible que deseemos eliminar todas las acciones que habíamos ingresado, en este caso seleccionamos el botón &amp;quot;Eliminar acciones&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Eliminando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es posible que queremos que el robot se desplace a ciertas velocidades, teniendo en cuenta que al modificar la velocidad, el robot tendrá un comportamiento totalmente diferente, debido a que gran parte de las acciones se ejecutan por un tiempo asignado, a mayor velocidad, más desplazamiento.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Velocidad.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En caso de que exista un error en la coneccion, podemos intentar volver a conectar la aplicacion al servidor, para esto seleccionamos la opción configuración.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:A configuracion.gif]]&lt;br /&gt;
&lt;br /&gt;
== Video de muestra ==&lt;br /&gt;
&lt;br /&gt;
== Mejoras a futuro ==&lt;br /&gt;
&lt;br /&gt;
* Implementar una forma para que las función ''' Accion1 ''' pueda recibir parámetros, para así ampliar la gama de problemas que se puedan solucionar a través de esta aplicación.&lt;br /&gt;
&lt;br /&gt;
* Implementación de código que permita añadir a través del código, una mayor cantidad de funciones genéricas a la aplicación.&lt;br /&gt;
&lt;br /&gt;
* Desarrollar una forma de comunicación bilateral entre la App Mobile y Python para mejorar el debug en tiempo de ejecución.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Archivos de uso ==&lt;/div&gt;</summary>
		<author><name>German.moreira</name></author>	</entry>

	<entry>
		<id>http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Programando_el_Butia_desde_el_celular&amp;diff=11617</id>
		<title>Programando el Butia desde el celular</title>
		<link rel="alternate" type="text/html" href="http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Programando_el_Butia_desde_el_celular&amp;diff=11617"/>
				<updated>2021-06-27T06:59:49Z</updated>
		
		<summary type="html">&lt;p&gt;German.moreira: /* Implementación código Python */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Introducción ==&lt;br /&gt;
&lt;br /&gt;
La idea del proyecto en un principio era usar el celular como medio para controlar el robot Butiá para que resulte más atractivo para los estudiantes que no les guste la programación.&lt;br /&gt;
&lt;br /&gt;
Luego, la idea se modifico un poco debido a que descubrimos que con esta implementación, podíamos hacer mas sencilla la resolución de algunos ejercicios básicos mediante algoritmos mas simplificados, tomamos el trabajo que teníamos hecho hasta el momento y lo adaptamos a un menú con distintas acciones simples como avanzar un determinado tiempo, avanzar hasta chocar contra un objeto o rotar a la izquierda o derecha un determinado tiempo.&lt;br /&gt;
&lt;br /&gt;
Estas funciones básicas y bastante sencillas de entender más una interfaz amigable y fácil de usar, se implementaron para que el rango de edad de uso de esta aplicación vaya de 3 años en adelante.&lt;br /&gt;
&lt;br /&gt;
Como resultado obtuvimos una aplicación que se puede usar para que niños de:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- 4 / 5 / 6 años resuelvan ejercicios sencillos como puede ser llegar de un punto a otro, buscar el camino a un objeto o resolver un laberinto sencillo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- 7 / 8 / 9 años puedan resolver ejercicios un poco más complejos como puede ser resolver un laberinto del más sencillo al mas complejo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- 10 años en adelante tengan la capacidad de adaptar una parte personal de código al programa y puedan resolver cualquier ejercicio que se pueda plantear con el robot Butiá.&lt;br /&gt;
&lt;br /&gt;
== Objetivo ==&lt;br /&gt;
&lt;br /&gt;
Los objetivos del proyecto eran, como dice el nombre, poder conectar remotamente el robot Butiá a un celular y buscar una abstracción de la mayor cantidad de problemas que puedan ser resueltos con el robot Butiá.&lt;br /&gt;
&lt;br /&gt;
Esto para poder crear un método de uso del robot Butiá más dinámico y con funciones que permiten realizar, mediante algoritmos mas sencillos, la solución de la mayor cantidad de puzles particulares.&lt;br /&gt;
&lt;br /&gt;
Al hacer esto el nivel de uso en aulas del robot Butiá, puede simplificarse hasta clases desde 3 años de jardinera en adelante, debido a que la aplicación simplifica la parte de codificación y los algoritmos de solución de ejercicios se convierten simplemente en una serie de pasos básicos a ejecutar linealmente.&lt;br /&gt;
&lt;br /&gt;
== Armado del Butiá ==&lt;br /&gt;
&lt;br /&gt;
* Paso 1: Armar el Butiá a partir de esta [https://www.fing.edu.uy/inco/proyectos/butia/files/docs_butia2/armando_paso_a_paso_motores_CC_rev1.pdf guía oficial]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''' Los siguientes pasos son opcionales '''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Paso 2: Instalar el sensor de grises&lt;br /&gt;
&lt;br /&gt;
1:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP1.jpeg]] &lt;br /&gt;
&lt;br /&gt;
2:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP2.jpeg]]&lt;br /&gt;
&lt;br /&gt;
3:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP3.jpeg]]&lt;br /&gt;
&lt;br /&gt;
4:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP4.jpeg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Paso 3: Instalar el sensor de distancia&lt;br /&gt;
&lt;br /&gt;
1:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP1.png]]&lt;br /&gt;
&lt;br /&gt;
2:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP2.png]]&lt;br /&gt;
&lt;br /&gt;
3:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP3.png]]&lt;br /&gt;
&lt;br /&gt;
4:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP4.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Implementación código Python ==&lt;br /&gt;
&lt;br /&gt;
Antes de empezar a programar o usar el código, es necesario instalar las librerías a usar, esto se puede hacer escribiendo &lt;br /&gt;
&lt;br /&gt;
'''''pip install [nombre de la librería]''''' en el interprete de comandos del sistema.&lt;br /&gt;
&lt;br /&gt;
Entonces instalamos la librería a utilizar, en este caso:&lt;br /&gt;
&lt;br /&gt;
'''''pip install simple_websocket_server'''''&lt;br /&gt;
&lt;br /&gt;
Una vez instalada la librería, hay que empezar a escribir el código.&lt;br /&gt;
&lt;br /&gt;
El encabezado del código es el siguiente&lt;br /&gt;
El uso de cada librería se explica con detalle mas adelante&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Encabezado.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A partir de la librería '''sys''' se define el camino del sistema para utilizar los plugin Butiá.&lt;br /&gt;
En nuestro caso, la ruta es ''' '/home/trerb/TurtleBots.activity/plugins/butia' ''', eso se tiene que modificar dependiendo de donde se encuentren el directorio ''' TurtleBots.activity/ ''' en su sistema de archivos&lt;br /&gt;
&lt;br /&gt;
[[Archivo:UsoPluginButia.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego se encuentra la función ''' clearConsole ''',&lt;br /&gt;
Esta función sirve únicamente para limpiar el interprete de Python usando la librería ''' os ''' y tener una ejecución mas limpia&lt;br /&gt;
&lt;br /&gt;
[[Archivo:clearConsole().png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
El siguiente código utiliza la librería ''' socket ''' para conectarse a la web y preguntar la ip del ordenador que ejecuta el archivo y la muestra en pantalla, esto se usa para facilitar la conexión con la App Mobile&lt;br /&gt;
&lt;br /&gt;
[[Archivo:conexionSocket.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Las siguientes líneas de código preguntan al usuario que puerto va a utilizar para la conexión, este código verifica que se ingrese un dato numérico, dentro del rango de los puertos, y que el puerto este disponible.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:tryPuerto.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego se declaran las variables: ''' Speed, Puerto_Gris y Puerto_Distancia ''', se verifica que los sensores de distancia y de grises estén conectados y asigna el puerto en el que estén conectados a las variables ''' Puerto_Distancia ''' y ''' Puerto_Gris ''' respectivamente. La variable ''' Speed ''' es una variable global que se lee al inicio de cada cadena de acciones y la utiliza para todos los movimientos del Butiá de esa cadena.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:declaracionVariables.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Seguimos con la declaración de las funciones básicas del Butiá, en este caso son ''' Avanzar, Rotar, AvanzarHastaVerColor y AvanzarHastaObstaculo ''' &lt;br /&gt;
&lt;br /&gt;
-La función ''' Avanzar ''' recibe un parámetro de tiempo y el Butiá avanza ese determinado tiempo.&lt;br /&gt;
&lt;br /&gt;
-La función ''' Rotar ''' recibe dos parámetros, una dirección que puede ser Izquierda o Derecha y un tiempo que indica la duración de la rotación del Butiá.&lt;br /&gt;
&lt;br /&gt;
-La función ''' AvanzarHastaVerColor ''' recibe un parámetro que varia entre Blanco o Negro, el robot va a avanzar hasta detectar el color seleccionado.&lt;br /&gt;
Esta función solo se puede usar si el sensor de grises esta conectado.&lt;br /&gt;
&lt;br /&gt;
-Por ultimo, la función ''' AvanzarHastaObstaculo ''' no recibe parámetros, en este caso el Butiá va a avanzar hasta estar a unos pocos centímetros de un obstáculo.&lt;br /&gt;
Esta función solo se puede usar si el sensor de distancia esta conectado.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:FuncionesBasicas.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego se encuentra una función ''' Accion1 ''' esta función la puede definir el usuario a gusto, se puede implementar desde una función básica hasta un seguidor de líneas avanzado. La única condición que se necesita para implementar esta ''' Accion1 ''' es que no puede recibir parámetros&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Accion1.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ahora tenemos que definir el menú principal del programa, este se divide en dos funciones&lt;br /&gt;
&lt;br /&gt;
- ''' handle ''': Esta es una función predeterminada de la librería ''' simple_web_socket ''' y se llama cada vez que el servidor recibe un dato del cliente. En este caso la función crea una lista de las acciones que le llegan de la App Mobile, y las va ejecutando ordenadamente&lt;br /&gt;
&lt;br /&gt;
- ''' handle_close ''': Al igual que la función anterior, esta también es una función predeterminada de la librería ''' simple_web_socket ''' y se llama cuando el cliente se desconecta del servidor&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Screenshot from 2021-06-27 03-58-56.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Y por ultimo tenemos el dos líneas de codigo, la primera se encarga de abrir el servidor y la segunda lo mantiene abierto infinitamente&lt;br /&gt;
&lt;br /&gt;
[[Archivo:abrirServidor.png]]&lt;br /&gt;
&lt;br /&gt;
== Implementación codigo React ==&lt;br /&gt;
&lt;br /&gt;
La aplicacion movil esta implementada con React Native, ademas, se utiliza el ''framework'' [https://docs.expo.io/ Expo]. Este ''framework'' nos brinda un conjunto de herramientas que facilita el desarrollo de aplicaciones mobiles. &lt;br /&gt;
En caso de querer agregar, o modificar cualidades, es necesario proceder de la siguiente forma:&lt;br /&gt;
&lt;br /&gt;
Descargar el archivo comprimido adjunto.&lt;br /&gt;
&lt;br /&gt;
Extraerlo, posicionarse en el directorio raiz de la carpeta descomprimida, y ejecutar desde la terminal lo siguiente (tener en cuenta que es necesario tener en la maquina, el gestor de paquetes [https://docs.npmjs.com/ npm]).&lt;br /&gt;
&lt;br /&gt;
''''npm install'''' &lt;br /&gt;
&lt;br /&gt;
Esto descarga las dependencias que utiliza la aplicación, luego de esto podemos empezar a desarrollar.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para visualizar los cambios en tiempo real mientras desarrollamos, es necesario instalar la aplicación Expo Go para [https://play.google.com/store/apps/details?id=host.exp.exponent&amp;amp;hl=es_UY&amp;amp;gl=US Android] o para [https://apps.apple.com/es/app/expo-go/id982107779 iOS] según sea el caso.&lt;br /&gt;
&lt;br /&gt;
Para a visualizar la app en desarrollo desde Expo Go, procedemos de la siguiente forma:&lt;br /&gt;
Desde el directorio raíz de la aplicación ejecutamos desde la terminal lo siguiente:&lt;br /&gt;
&lt;br /&gt;
''''npm start''''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego, desde la aplicación Expo Go, con el celular conectado en la misma red local accedemos a la aplicación seleccionando lo siguiente:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Expo.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hecho esto, podemos cambiar el código de la aplicación y ver reflejados los cambios de forma casi instantánea.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Screenshot_from_2021-06-27_00-28-32.png]]&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Screenshot from 2021-06-27 00-29-39.png]]&lt;br /&gt;
&lt;br /&gt;
== Manual de uso de la aplicación ==&lt;br /&gt;
&lt;br /&gt;
Aunque la aplicación resulta intuitiva y fácil de usar se describe a continuación una serie de pasos para utilizarla correctamente.&lt;br /&gt;
&lt;br /&gt;
Para comenzar a utilizar la aplicación es necesario configurar la coneccion de la aplicación con el servidor (recordar que ambos se deben encontrar ejecutándose en la misma red local), el servidor ejecutando en una computadora que esté conectada correctamente al butiá (con los sensores descritos anteriormente) y la aplicación ejecutándose en el celular.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Conectando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego que la conexión haya resultado exitosa, nos encontramos en la página principal. En el panel superior, como se muestra a continuación, se encuentran las aplicaciones disponibles que podemos ejecutar en el robot butiá.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Acciones.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para agregar una serie de acciones al robot, simplemente presionamos la que queramos, a continuación esta aparecerá en el panel inferior, a medida de que vayamos seleccionando acciones, estas se irán encadenando una tras otras, estas estarán prontas para ejecutarse secuencialmente, desde la parte inferior a la parte superior, en el momento que presionemos el botón &amp;quot;Empezar&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Agregando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Como la aplicación está pensada para planificar algoritmos para resolver problemas, como puzzles, es probable que nos equivoquemos y seleccionemos una acción o insertemos un parámetro incorrectamente, ¡pero no te preocupes!. Para editar el parámetro que le hayamos ingresado a una acción, simplemente mantenemos pulsado la que deseamos corregir e ingresamos el nuevo valor.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Editando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
También es posible eliminar una acción, para hacer esto, nuevamente mantenemos pulsada la acción que queremos eliminar, pero esta vez, seleccionamos la acción eliminar. A continuación la acción seleccionada desaparecerá del panel inferior. También es posible que deseemos eliminar todas las acciones que habíamos ingresado, en este caso seleccionamos el botón &amp;quot;Eliminar acciones&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Eliminando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es posible que queremos que el robot se desplace a ciertas velocidades, teniendo en cuenta que al modificar la velocidad, el robot tendrá un comportamiento totalmente diferente, debido a que gran parte de las acciones se ejecutan por un tiempo asignado, a mayor velocidad, más desplazamiento.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Velocidad.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En caso de que exista un error en la coneccion, podemos intentar volver a conectar la aplicacion al servidor, para esto seleccionamos la opción configuración.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:A configuracion.gif]]&lt;br /&gt;
&lt;br /&gt;
== Video de muestra ==&lt;br /&gt;
&lt;br /&gt;
== Mejoras a futuro ==&lt;br /&gt;
&lt;br /&gt;
* Implementar una forma para que las función ''' Accion1 ''' pueda recibir parámetros, para así ampliar la gama de problemas que se puedan solucionar a través de esta aplicación.&lt;br /&gt;
&lt;br /&gt;
* Implementación de código que permita añadir a través del código, una mayor cantidad de funciones genéricas a la aplicación.&lt;br /&gt;
&lt;br /&gt;
* Desarrollar una forma de comunicación bilateral entre la App Mobile y Python para mejorar el debug en tiempo de ejecución.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Archivos de uso ==&lt;/div&gt;</summary>
		<author><name>German.moreira</name></author>	</entry>

	<entry>
		<id>http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Archivo:Screenshot_from_2021-06-27_03-58-56.png&amp;diff=11616</id>
		<title>Archivo:Screenshot from 2021-06-27 03-58-56.png</title>
		<link rel="alternate" type="text/html" href="http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Archivo:Screenshot_from_2021-06-27_03-58-56.png&amp;diff=11616"/>
				<updated>2021-06-27T06:59:25Z</updated>
		
		<summary type="html">&lt;p&gt;German.moreira: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>German.moreira</name></author>	</entry>

	<entry>
		<id>http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Programando_el_Butia_desde_el_celular&amp;diff=11615</id>
		<title>Programando el Butia desde el celular</title>
		<link rel="alternate" type="text/html" href="http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Programando_el_Butia_desde_el_celular&amp;diff=11615"/>
				<updated>2021-06-27T06:57:31Z</updated>
		
		<summary type="html">&lt;p&gt;German.moreira: /* Implementación codigo React */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Introducción ==&lt;br /&gt;
&lt;br /&gt;
La idea del proyecto en un principio era usar el celular como medio para controlar el robot Butiá para que resulte más atractivo para los estudiantes que no les guste la programación.&lt;br /&gt;
&lt;br /&gt;
Luego, la idea se modifico un poco debido a que descubrimos que con esta implementación, podíamos hacer mas sencilla la resolución de algunos ejercicios básicos mediante algoritmos mas simplificados, tomamos el trabajo que teníamos hecho hasta el momento y lo adaptamos a un menú con distintas acciones simples como avanzar un determinado tiempo, avanzar hasta chocar contra un objeto o rotar a la izquierda o derecha un determinado tiempo.&lt;br /&gt;
&lt;br /&gt;
Estas funciones básicas y bastante sencillas de entender más una interfaz amigable y fácil de usar, se implementaron para que el rango de edad de uso de esta aplicación vaya de 3 años en adelante.&lt;br /&gt;
&lt;br /&gt;
Como resultado obtuvimos una aplicación que se puede usar para que niños de:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- 4 / 5 / 6 años resuelvan ejercicios sencillos como puede ser llegar de un punto a otro, buscar el camino a un objeto o resolver un laberinto sencillo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- 7 / 8 / 9 años puedan resolver ejercicios un poco más complejos como puede ser resolver un laberinto del más sencillo al mas complejo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- 10 años en adelante tengan la capacidad de adaptar una parte personal de código al programa y puedan resolver cualquier ejercicio que se pueda plantear con el robot Butiá.&lt;br /&gt;
&lt;br /&gt;
== Objetivo ==&lt;br /&gt;
&lt;br /&gt;
Los objetivos del proyecto eran, como dice el nombre, poder conectar remotamente el robot Butiá a un celular y buscar una abstracción de la mayor cantidad de problemas que puedan ser resueltos con el robot Butiá.&lt;br /&gt;
&lt;br /&gt;
Esto para poder crear un método de uso del robot Butiá más dinámico y con funciones que permiten realizar, mediante algoritmos mas sencillos, la solución de la mayor cantidad de puzles particulares.&lt;br /&gt;
&lt;br /&gt;
Al hacer esto el nivel de uso en aulas del robot Butiá, puede simplificarse hasta clases desde 3 años de jardinera en adelante, debido a que la aplicación simplifica la parte de codificación y los algoritmos de solución de ejercicios se convierten simplemente en una serie de pasos básicos a ejecutar linealmente.&lt;br /&gt;
&lt;br /&gt;
== Armado del Butiá ==&lt;br /&gt;
&lt;br /&gt;
* Paso 1: Armar el Butiá a partir de esta [https://www.fing.edu.uy/inco/proyectos/butia/files/docs_butia2/armando_paso_a_paso_motores_CC_rev1.pdf guía oficial]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''' Los siguientes pasos son opcionales '''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Paso 2: Instalar el sensor de grises&lt;br /&gt;
&lt;br /&gt;
1:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP1.jpeg]] &lt;br /&gt;
&lt;br /&gt;
2:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP2.jpeg]]&lt;br /&gt;
&lt;br /&gt;
3:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP3.jpeg]]&lt;br /&gt;
&lt;br /&gt;
4:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP4.jpeg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Paso 3: Instalar el sensor de distancia&lt;br /&gt;
&lt;br /&gt;
1:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP1.png]]&lt;br /&gt;
&lt;br /&gt;
2:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP2.png]]&lt;br /&gt;
&lt;br /&gt;
3:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP3.png]]&lt;br /&gt;
&lt;br /&gt;
4:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP4.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Implementación código Python ==&lt;br /&gt;
&lt;br /&gt;
Antes de empezar a programar o usar el código, es necesario instalar las librerías a usar, esto se puede hacer escribiendo &lt;br /&gt;
&lt;br /&gt;
'''''pip install [nombre de la librería]''''' en el interprete de comandos del sistema.&lt;br /&gt;
&lt;br /&gt;
Entonces instalamos la librería a utilizar, en este caso:&lt;br /&gt;
&lt;br /&gt;
'''''pip install simple_websocket_server'''''&lt;br /&gt;
&lt;br /&gt;
Una vez instalada la librería, hay que empezar a escribir el código.&lt;br /&gt;
&lt;br /&gt;
El encabezado del código es el siguiente&lt;br /&gt;
El uso de cada librería se explica con detalle mas adelante&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Encabezado.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A partir de la librería '''sys''' se define el camino del sistema para utilizar los plugin Butiá.&lt;br /&gt;
En nuestro caso, la ruta es ''' '/home/trerb/TurtleBots.activity/plugins/butia' ''', eso se tiene que modificar dependiendo de donde se encuentren el directorio ''' TurtleBots.activity/ ''' en su sistema de archivos&lt;br /&gt;
&lt;br /&gt;
[[Archivo:UsoPluginButia.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego se encuentra la función ''' clearConsole ''',&lt;br /&gt;
Esta función sirve únicamente para limpiar el interprete de Python usando la librería ''' os ''' y tener una ejecución mas limpia&lt;br /&gt;
&lt;br /&gt;
[[Archivo:clearConsole().png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
El siguiente código utiliza la librería ''' socket ''' para conectarse a la web y preguntar la ip del ordenador que ejecuta el archivo y la muestra en pantalla, esto se usa para facilitar la conexión con la App Mobile&lt;br /&gt;
&lt;br /&gt;
[[Archivo:conexionSocket.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Las siguientes líneas de código preguntan al usuario que puerto va a utilizar para la conexión, este código verifica que se ingrese un dato numérico, dentro del rango de los puertos, y que el puerto este disponible.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:tryPuerto.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego se declaran las variables: ''' Speed, Puerto_Gris y Puerto_Distancia ''', se verifica que los sensores de distancia y de grises estén conectados y asigna el puerto en el que estén conectados a las variables ''' Puerto_Distancia ''' y ''' Puerto_Gris ''' respectivamente. La variable ''' Speed ''' es una variable global que se lee al inicio de cada cadena de acciones y la utiliza para todos los movimientos del Butiá de esa cadena.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:declaracionVariables.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Seguimos con la declaración de las funciones básicas del Butiá, en este caso son ''' Avanzar, Rotar, AvanzarHastaVerColor y AvanzarHastaObstaculo ''' &lt;br /&gt;
&lt;br /&gt;
-La función ''' Avanzar ''' recibe un parámetro de tiempo y el Butiá avanza ese determinado tiempo.&lt;br /&gt;
&lt;br /&gt;
-La función ''' Rotar ''' recibe dos parámetros, una dirección que puede ser Izquierda o Derecha y un tiempo que indica la duración de la rotación del Butiá.&lt;br /&gt;
&lt;br /&gt;
-La función ''' AvanzarHastaVerColor ''' recibe un parámetro que varia entre Blanco o Negro, el robot va a avanzar hasta detectar el color seleccionado.&lt;br /&gt;
Esta función solo se puede usar si el sensor de grises esta conectado.&lt;br /&gt;
&lt;br /&gt;
-Por ultimo, la función ''' AvanzarHastaObstaculo ''' no recibe parámetros, en este caso el Butiá va a avanzar hasta estar a unos pocos centímetros de un obstáculo.&lt;br /&gt;
Esta función solo se puede usar si el sensor de distancia esta conectado.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:FuncionesBasicas.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego se encuentra una función ''' Accion1 ''' esta función la puede definir el usuario a gusto, se puede implementar desde una función básica hasta un seguidor de líneas avanzado. La única condición que se necesita para implementar esta ''' Accion1 ''' es que no puede recibir parámetros&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Accion1.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ahora tenemos que definir el menú principal del programa, este se divide en dos funciones&lt;br /&gt;
&lt;br /&gt;
- ''' handle ''': Esta es una función predeterminada de la librería ''' simple_web_socket ''' y se llama cada vez que el servidor recibe un dato del cliente. En este caso la función crea una lista de las acciones que le llegan de la App Mobile, y las va ejecutando ordenadamente&lt;br /&gt;
&lt;br /&gt;
- ''' handle_close ''': Al igual que la función anterior, esta también es una función predeterminada de la librería ''' simple_web_socket ''' y se llama cuando el cliente se desconecta del servidor&lt;br /&gt;
&lt;br /&gt;
[[Archivo:mainPy.jpeg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Y por ultimo tenemos el dos líneas de codigo, la primera se encarga de abrir el servidor y la segunda lo mantiene abierto infinitamente&lt;br /&gt;
&lt;br /&gt;
[[Archivo:abrirServidor.png]]&lt;br /&gt;
== Implementación codigo React ==&lt;br /&gt;
&lt;br /&gt;
La aplicacion movil esta implementada con React Native, ademas, se utiliza el ''framework'' [https://docs.expo.io/ Expo]. Este ''framework'' nos brinda un conjunto de herramientas que facilita el desarrollo de aplicaciones mobiles. &lt;br /&gt;
En caso de querer agregar, o modificar cualidades, es necesario proceder de la siguiente forma:&lt;br /&gt;
&lt;br /&gt;
Descargar el archivo comprimido adjunto.&lt;br /&gt;
&lt;br /&gt;
Extraerlo, posicionarse en el directorio raiz de la carpeta descomprimida, y ejecutar desde la terminal lo siguiente (tener en cuenta que es necesario tener en la maquina, el gestor de paquetes [https://docs.npmjs.com/ npm]).&lt;br /&gt;
&lt;br /&gt;
''''npm install'''' &lt;br /&gt;
&lt;br /&gt;
Esto descarga las dependencias que utiliza la aplicación, luego de esto podemos empezar a desarrollar.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para visualizar los cambios en tiempo real mientras desarrollamos, es necesario instalar la aplicación Expo Go para [https://play.google.com/store/apps/details?id=host.exp.exponent&amp;amp;hl=es_UY&amp;amp;gl=US Android] o para [https://apps.apple.com/es/app/expo-go/id982107779 iOS] según sea el caso.&lt;br /&gt;
&lt;br /&gt;
Para a visualizar la app en desarrollo desde Expo Go, procedemos de la siguiente forma:&lt;br /&gt;
Desde el directorio raíz de la aplicación ejecutamos desde la terminal lo siguiente:&lt;br /&gt;
&lt;br /&gt;
''''npm start''''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego, desde la aplicación Expo Go, con el celular conectado en la misma red local accedemos a la aplicación seleccionando lo siguiente:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Expo.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hecho esto, podemos cambiar el código de la aplicación y ver reflejados los cambios de forma casi instantánea.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Screenshot_from_2021-06-27_00-28-32.png]]&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Screenshot from 2021-06-27 00-29-39.png]]&lt;br /&gt;
&lt;br /&gt;
== Manual de uso de la aplicación ==&lt;br /&gt;
&lt;br /&gt;
Aunque la aplicación resulta intuitiva y fácil de usar se describe a continuación una serie de pasos para utilizarla correctamente.&lt;br /&gt;
&lt;br /&gt;
Para comenzar a utilizar la aplicación es necesario configurar la coneccion de la aplicación con el servidor (recordar que ambos se deben encontrar ejecutándose en la misma red local), el servidor ejecutando en una computadora que esté conectada correctamente al butiá (con los sensores descritos anteriormente) y la aplicación ejecutándose en el celular.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Conectando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego que la conexión haya resultado exitosa, nos encontramos en la página principal. En el panel superior, como se muestra a continuación, se encuentran las aplicaciones disponibles que podemos ejecutar en el robot butiá.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Acciones.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para agregar una serie de acciones al robot, simplemente presionamos la que queramos, a continuación esta aparecerá en el panel inferior, a medida de que vayamos seleccionando acciones, estas se irán encadenando una tras otras, estas estarán prontas para ejecutarse secuencialmente, desde la parte inferior a la parte superior, en el momento que presionemos el botón &amp;quot;Empezar&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Agregando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Como la aplicación está pensada para planificar algoritmos para resolver problemas, como puzzles, es probable que nos equivoquemos y seleccionemos una acción o insertemos un parámetro incorrectamente, ¡pero no te preocupes!. Para editar el parámetro que le hayamos ingresado a una acción, simplemente mantenemos pulsado la que deseamos corregir e ingresamos el nuevo valor.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Editando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
También es posible eliminar una acción, para hacer esto, nuevamente mantenemos pulsada la acción que queremos eliminar, pero esta vez, seleccionamos la acción eliminar. A continuación la acción seleccionada desaparecerá del panel inferior. También es posible que deseemos eliminar todas las acciones que habíamos ingresado, en este caso seleccionamos el botón &amp;quot;Eliminar acciones&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Eliminando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es posible que queremos que el robot se desplace a ciertas velocidades, teniendo en cuenta que al modificar la velocidad, el robot tendrá un comportamiento totalmente diferente, debido a que gran parte de las acciones se ejecutan por un tiempo asignado, a mayor velocidad, más desplazamiento.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Velocidad.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En caso de que exista un error en la coneccion, podemos intentar volver a conectar la aplicacion al servidor, para esto seleccionamos la opción configuración.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:A configuracion.gif]]&lt;br /&gt;
&lt;br /&gt;
== Video de muestra ==&lt;br /&gt;
&lt;br /&gt;
== Mejoras a futuro ==&lt;br /&gt;
&lt;br /&gt;
* Implementar una forma para que las función ''' Accion1 ''' pueda recibir parámetros, para así ampliar la gama de problemas que se puedan solucionar a través de esta aplicación.&lt;br /&gt;
&lt;br /&gt;
* Implementación de código que permita añadir a través del código, una mayor cantidad de funciones genéricas a la aplicación.&lt;br /&gt;
&lt;br /&gt;
* Desarrollar una forma de comunicación bilateral entre la App Mobile y Python para mejorar el debug en tiempo de ejecución.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Archivos de uso ==&lt;/div&gt;</summary>
		<author><name>German.moreira</name></author>	</entry>

	<entry>
		<id>http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Archivo:Expo.gif&amp;diff=11614</id>
		<title>Archivo:Expo.gif</title>
		<link rel="alternate" type="text/html" href="http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Archivo:Expo.gif&amp;diff=11614"/>
				<updated>2021-06-27T06:56:16Z</updated>
		
		<summary type="html">&lt;p&gt;German.moreira: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>German.moreira</name></author>	</entry>

	<entry>
		<id>http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Programando_el_Butia_desde_el_celular&amp;diff=11613</id>
		<title>Programando el Butia desde el celular</title>
		<link rel="alternate" type="text/html" href="http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Programando_el_Butia_desde_el_celular&amp;diff=11613"/>
				<updated>2021-06-27T06:55:59Z</updated>
		
		<summary type="html">&lt;p&gt;German.moreira: /* Implementación codigo React */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Introducción ==&lt;br /&gt;
&lt;br /&gt;
La idea del proyecto en un principio era usar el celular como medio para controlar el robot Butiá para que resulte más atractivo para los estudiantes que no les guste la programación.&lt;br /&gt;
&lt;br /&gt;
Luego, la idea se modifico un poco debido a que descubrimos que con esta implementación, podíamos hacer mas sencilla la resolución de algunos ejercicios básicos mediante algoritmos mas simplificados, tomamos el trabajo que teníamos hecho hasta el momento y lo adaptamos a un menú con distintas acciones simples como avanzar un determinado tiempo, avanzar hasta chocar contra un objeto o rotar a la izquierda o derecha un determinado tiempo.&lt;br /&gt;
&lt;br /&gt;
Estas funciones básicas y bastante sencillas de entender más una interfaz amigable y fácil de usar, se implementaron para que el rango de edad de uso de esta aplicación vaya de 3 años en adelante.&lt;br /&gt;
&lt;br /&gt;
Como resultado obtuvimos una aplicación que se puede usar para que niños de:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- 4 / 5 / 6 años resuelvan ejercicios sencillos como puede ser llegar de un punto a otro, buscar el camino a un objeto o resolver un laberinto sencillo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- 7 / 8 / 9 años puedan resolver ejercicios un poco más complejos como puede ser resolver un laberinto del más sencillo al mas complejo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- 10 años en adelante tengan la capacidad de adaptar una parte personal de código al programa y puedan resolver cualquier ejercicio que se pueda plantear con el robot Butiá.&lt;br /&gt;
&lt;br /&gt;
== Objetivo ==&lt;br /&gt;
&lt;br /&gt;
Los objetivos del proyecto eran, como dice el nombre, poder conectar remotamente el robot Butiá a un celular y buscar una abstracción de la mayor cantidad de problemas que puedan ser resueltos con el robot Butiá.&lt;br /&gt;
&lt;br /&gt;
Esto para poder crear un método de uso del robot Butiá más dinámico y con funciones que permiten realizar, mediante algoritmos mas sencillos, la solución de la mayor cantidad de puzles particulares.&lt;br /&gt;
&lt;br /&gt;
Al hacer esto el nivel de uso en aulas del robot Butiá, puede simplificarse hasta clases desde 3 años de jardinera en adelante, debido a que la aplicación simplifica la parte de codificación y los algoritmos de solución de ejercicios se convierten simplemente en una serie de pasos básicos a ejecutar linealmente.&lt;br /&gt;
&lt;br /&gt;
== Armado del Butiá ==&lt;br /&gt;
&lt;br /&gt;
* Paso 1: Armar el Butiá a partir de esta [https://www.fing.edu.uy/inco/proyectos/butia/files/docs_butia2/armando_paso_a_paso_motores_CC_rev1.pdf guía oficial]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''' Los siguientes pasos son opcionales '''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Paso 2: Instalar el sensor de grises&lt;br /&gt;
&lt;br /&gt;
1:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP1.jpeg]] &lt;br /&gt;
&lt;br /&gt;
2:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP2.jpeg]]&lt;br /&gt;
&lt;br /&gt;
3:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP3.jpeg]]&lt;br /&gt;
&lt;br /&gt;
4:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP4.jpeg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Paso 3: Instalar el sensor de distancia&lt;br /&gt;
&lt;br /&gt;
1:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP1.png]]&lt;br /&gt;
&lt;br /&gt;
2:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP2.png]]&lt;br /&gt;
&lt;br /&gt;
3:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP3.png]]&lt;br /&gt;
&lt;br /&gt;
4:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP4.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Implementación código Python ==&lt;br /&gt;
&lt;br /&gt;
Antes de empezar a programar o usar el código, es necesario instalar las librerías a usar, esto se puede hacer escribiendo &lt;br /&gt;
&lt;br /&gt;
'''''pip install [nombre de la librería]''''' en el interprete de comandos del sistema.&lt;br /&gt;
&lt;br /&gt;
Entonces instalamos la librería a utilizar, en este caso:&lt;br /&gt;
&lt;br /&gt;
'''''pip install simple_websocket_server'''''&lt;br /&gt;
&lt;br /&gt;
Una vez instalada la librería, hay que empezar a escribir el código.&lt;br /&gt;
&lt;br /&gt;
El encabezado del código es el siguiente&lt;br /&gt;
El uso de cada librería se explica con detalle mas adelante&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Encabezado.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A partir de la librería '''sys''' se define el camino del sistema para utilizar los plugin Butiá.&lt;br /&gt;
En nuestro caso, la ruta es ''' '/home/trerb/TurtleBots.activity/plugins/butia' ''', eso se tiene que modificar dependiendo de donde se encuentren el directorio ''' TurtleBots.activity/ ''' en su sistema de archivos&lt;br /&gt;
&lt;br /&gt;
[[Archivo:UsoPluginButia.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego se encuentra la función ''' clearConsole ''',&lt;br /&gt;
Esta función sirve únicamente para limpiar el interprete de Python usando la librería ''' os ''' y tener una ejecución mas limpia&lt;br /&gt;
&lt;br /&gt;
[[Archivo:clearConsole().png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
El siguiente código utiliza la librería ''' socket ''' para conectarse a la web y preguntar la ip del ordenador que ejecuta el archivo y la muestra en pantalla, esto se usa para facilitar la conexión con la App Mobile&lt;br /&gt;
&lt;br /&gt;
[[Archivo:conexionSocket.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Las siguientes líneas de código preguntan al usuario que puerto va a utilizar para la conexión, este código verifica que se ingrese un dato numérico, dentro del rango de los puertos, y que el puerto este disponible.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:tryPuerto.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego se declaran las variables: ''' Speed, Puerto_Gris y Puerto_Distancia ''', se verifica que los sensores de distancia y de grises estén conectados y asigna el puerto en el que estén conectados a las variables ''' Puerto_Distancia ''' y ''' Puerto_Gris ''' respectivamente. La variable ''' Speed ''' es una variable global que se lee al inicio de cada cadena de acciones y la utiliza para todos los movimientos del Butiá de esa cadena.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:declaracionVariables.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Seguimos con la declaración de las funciones básicas del Butiá, en este caso son ''' Avanzar, Rotar, AvanzarHastaVerColor y AvanzarHastaObstaculo ''' &lt;br /&gt;
&lt;br /&gt;
-La función ''' Avanzar ''' recibe un parámetro de tiempo y el Butiá avanza ese determinado tiempo.&lt;br /&gt;
&lt;br /&gt;
-La función ''' Rotar ''' recibe dos parámetros, una dirección que puede ser Izquierda o Derecha y un tiempo que indica la duración de la rotación del Butiá.&lt;br /&gt;
&lt;br /&gt;
-La función ''' AvanzarHastaVerColor ''' recibe un parámetro que varia entre Blanco o Negro, el robot va a avanzar hasta detectar el color seleccionado.&lt;br /&gt;
Esta función solo se puede usar si el sensor de grises esta conectado.&lt;br /&gt;
&lt;br /&gt;
-Por ultimo, la función ''' AvanzarHastaObstaculo ''' no recibe parámetros, en este caso el Butiá va a avanzar hasta estar a unos pocos centímetros de un obstáculo.&lt;br /&gt;
Esta función solo se puede usar si el sensor de distancia esta conectado.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:FuncionesBasicas.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego se encuentra una función ''' Accion1 ''' esta función la puede definir el usuario a gusto, se puede implementar desde una función básica hasta un seguidor de líneas avanzado. La única condición que se necesita para implementar esta ''' Accion1 ''' es que no puede recibir parámetros&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Accion1.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ahora tenemos que definir el menú principal del programa, este se divide en dos funciones&lt;br /&gt;
&lt;br /&gt;
- ''' handle ''': Esta es una función predeterminada de la librería ''' simple_web_socket ''' y se llama cada vez que el servidor recibe un dato del cliente. En este caso la función crea una lista de las acciones que le llegan de la App Mobile, y las va ejecutando ordenadamente&lt;br /&gt;
&lt;br /&gt;
- ''' handle_close ''': Al igual que la función anterior, esta también es una función predeterminada de la librería ''' simple_web_socket ''' y se llama cuando el cliente se desconecta del servidor&lt;br /&gt;
&lt;br /&gt;
[[Archivo:mainPy.jpeg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Y por ultimo tenemos el dos líneas de codigo, la primera se encarga de abrir el servidor y la segunda lo mantiene abierto infinitamente&lt;br /&gt;
&lt;br /&gt;
[[Archivo:abrirServidor.png]]&lt;br /&gt;
== Implementación codigo React ==&lt;br /&gt;
&lt;br /&gt;
La aplicacion movil esta implementada con React Native, ademas, se utiliza el ''framework'' [https://docs.expo.io/ Expo]. Este ''framework'' nos brinda un conjunto de herramientas que facilita el desarrollo de aplicaciones mobiles. &lt;br /&gt;
En caso de querer agregar, o modificar cualidades, es necesario proceder de la siguiente forma:&lt;br /&gt;
&lt;br /&gt;
Descargar el archivo comprimido adjunto.&lt;br /&gt;
&lt;br /&gt;
Extraerlo, posicionarse en el directorio raiz de la carpeta descomprimida, y ejecutar desde la terminal lo siguiente (tener en cuenta que es necesario tener en la maquina, el gestor de paquetes [https://docs.npmjs.com/ npm]).&lt;br /&gt;
&lt;br /&gt;
''''npm install'''' &lt;br /&gt;
&lt;br /&gt;
Esto descarga las dependencias que utiliza la aplicación, luego de esto podemos empezar a desarrollar.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para visualizar los cambios en tiempo real mientras desarrollamos, es necesario instalar la aplicación Expo Go para [https://play.google.com/store/apps/details?id=host.exp.exponent&amp;amp;hl=es_UY&amp;amp;gl=US Android] o para [https://apps.apple.com/es/app/expo-go/id982107779 iOS] según sea el caso.&lt;br /&gt;
&lt;br /&gt;
Para a visualizar la app en desarrollo desde Expo Go, procedemos de la siguiente forma:&lt;br /&gt;
Desde el directorio raíz de la aplicación ejecutamos desde la terminal lo siguiente:&lt;br /&gt;
&lt;br /&gt;
''''npm start''''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego, desde la aplicación Expo Go, con el celular conectado en la misma red local accedemos a la aplicación seleccionando lo siguiente:&lt;br /&gt;
&lt;br /&gt;
Hecho esto, podemos cambiar el código de la aplicación y ver reflejados los cambios de forma casi instantánea.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Screenshot_from_2021-06-27_00-28-32.png]]&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Screenshot from 2021-06-27 00-29-39.png]]&lt;br /&gt;
&lt;br /&gt;
== Manual de uso de la aplicación ==&lt;br /&gt;
&lt;br /&gt;
Aunque la aplicación resulta intuitiva y fácil de usar se describe a continuación una serie de pasos para utilizarla correctamente.&lt;br /&gt;
&lt;br /&gt;
Para comenzar a utilizar la aplicación es necesario configurar la coneccion de la aplicación con el servidor (recordar que ambos se deben encontrar ejecutándose en la misma red local), el servidor ejecutando en una computadora que esté conectada correctamente al butiá (con los sensores descritos anteriormente) y la aplicación ejecutándose en el celular.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Conectando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego que la conexión haya resultado exitosa, nos encontramos en la página principal. En el panel superior, como se muestra a continuación, se encuentran las aplicaciones disponibles que podemos ejecutar en el robot butiá.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Acciones.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para agregar una serie de acciones al robot, simplemente presionamos la que queramos, a continuación esta aparecerá en el panel inferior, a medida de que vayamos seleccionando acciones, estas se irán encadenando una tras otras, estas estarán prontas para ejecutarse secuencialmente, desde la parte inferior a la parte superior, en el momento que presionemos el botón &amp;quot;Empezar&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Agregando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Como la aplicación está pensada para planificar algoritmos para resolver problemas, como puzzles, es probable que nos equivoquemos y seleccionemos una acción o insertemos un parámetro incorrectamente, ¡pero no te preocupes!. Para editar el parámetro que le hayamos ingresado a una acción, simplemente mantenemos pulsado la que deseamos corregir e ingresamos el nuevo valor.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Editando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
También es posible eliminar una acción, para hacer esto, nuevamente mantenemos pulsada la acción que queremos eliminar, pero esta vez, seleccionamos la acción eliminar. A continuación la acción seleccionada desaparecerá del panel inferior. También es posible que deseemos eliminar todas las acciones que habíamos ingresado, en este caso seleccionamos el botón &amp;quot;Eliminar acciones&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Eliminando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es posible que queremos que el robot se desplace a ciertas velocidades, teniendo en cuenta que al modificar la velocidad, el robot tendrá un comportamiento totalmente diferente, debido a que gran parte de las acciones se ejecutan por un tiempo asignado, a mayor velocidad, más desplazamiento.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Velocidad.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En caso de que exista un error en la coneccion, podemos intentar volver a conectar la aplicacion al servidor, para esto seleccionamos la opción configuración.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:A configuracion.gif]]&lt;br /&gt;
&lt;br /&gt;
== Video de muestra ==&lt;br /&gt;
&lt;br /&gt;
== Mejoras a futuro ==&lt;br /&gt;
&lt;br /&gt;
* Implementar una forma para que las función ''' Accion1 ''' pueda recibir parámetros, para así ampliar la gama de problemas que se puedan solucionar a través de esta aplicación.&lt;br /&gt;
&lt;br /&gt;
* Implementación de código que permita añadir a través del código, una mayor cantidad de funciones genéricas a la aplicación.&lt;br /&gt;
&lt;br /&gt;
* Desarrollar una forma de comunicación bilateral entre la App Mobile y Python para mejorar el debug en tiempo de ejecución.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Archivos de uso ==&lt;/div&gt;</summary>
		<author><name>German.moreira</name></author>	</entry>

	<entry>
		<id>http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Programando_el_Butia_desde_el_celular&amp;diff=11612</id>
		<title>Programando el Butia desde el celular</title>
		<link rel="alternate" type="text/html" href="http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Programando_el_Butia_desde_el_celular&amp;diff=11612"/>
				<updated>2021-06-27T06:50:04Z</updated>
		
		<summary type="html">&lt;p&gt;German.moreira: /* Implementación codigo React */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Introducción ==&lt;br /&gt;
&lt;br /&gt;
La idea del proyecto en un principio era usar el celular como medio para controlar el robot Butiá para que resulte más atractivo para los estudiantes que no les guste la programación.&lt;br /&gt;
&lt;br /&gt;
Luego, la idea se modifico un poco debido a que descubrimos que con esta implementación, podíamos hacer mas sencilla la resolución de algunos ejercicios básicos mediante algoritmos mas simplificados, tomamos el trabajo que teníamos hecho hasta el momento y lo adaptamos a un menú con distintas acciones simples como avanzar un determinado tiempo, avanzar hasta chocar contra un objeto o rotar a la izquierda o derecha un determinado tiempo.&lt;br /&gt;
&lt;br /&gt;
Estas funciones básicas y bastante sencillas de entender más una interfaz amigable y fácil de usar, se implementaron para que el rango de edad de uso de esta aplicación vaya de 3 años en adelante.&lt;br /&gt;
&lt;br /&gt;
Como resultado obtuvimos una aplicación que se puede usar para que niños de:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- 4 / 5 / 6 años resuelvan ejercicios sencillos como puede ser llegar de un punto a otro, buscar el camino a un objeto o resolver un laberinto sencillo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- 7 / 8 / 9 años puedan resolver ejercicios un poco más complejos como puede ser resolver un laberinto del más sencillo al mas complejo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- 10 años en adelante tengan la capacidad de adaptar una parte personal de código al programa y puedan resolver cualquier ejercicio que se pueda plantear con el robot Butiá.&lt;br /&gt;
&lt;br /&gt;
== Objetivo ==&lt;br /&gt;
&lt;br /&gt;
Los objetivos del proyecto eran, como dice el nombre, poder conectar remotamente el robot Butiá a un celular y buscar una abstracción de la mayor cantidad de problemas que puedan ser resueltos con el robot Butiá.&lt;br /&gt;
&lt;br /&gt;
Esto para poder crear un método de uso del robot Butiá más dinámico y con funciones que permiten realizar, mediante algoritmos mas sencillos, la solución de la mayor cantidad de puzles particulares.&lt;br /&gt;
&lt;br /&gt;
Al hacer esto el nivel de uso en aulas del robot Butiá, puede simplificarse hasta clases desde 3 años de jardinera en adelante, debido a que la aplicación simplifica la parte de codificación y los algoritmos de solución de ejercicios se convierten simplemente en una serie de pasos básicos a ejecutar linealmente.&lt;br /&gt;
&lt;br /&gt;
== Armado del Butiá ==&lt;br /&gt;
&lt;br /&gt;
* Paso 1: Armar el Butiá a partir de esta [https://www.fing.edu.uy/inco/proyectos/butia/files/docs_butia2/armando_paso_a_paso_motores_CC_rev1.pdf guía oficial]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''' Los siguientes pasos son opcionales '''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Paso 2: Instalar el sensor de grises&lt;br /&gt;
&lt;br /&gt;
1:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP1.jpeg]] &lt;br /&gt;
&lt;br /&gt;
2:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP2.jpeg]]&lt;br /&gt;
&lt;br /&gt;
3:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP3.jpeg]]&lt;br /&gt;
&lt;br /&gt;
4:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP4.jpeg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Paso 3: Instalar el sensor de distancia&lt;br /&gt;
&lt;br /&gt;
1:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP1.png]]&lt;br /&gt;
&lt;br /&gt;
2:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP2.png]]&lt;br /&gt;
&lt;br /&gt;
3:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP3.png]]&lt;br /&gt;
&lt;br /&gt;
4:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP4.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Implementación código Python ==&lt;br /&gt;
&lt;br /&gt;
Antes de empezar a programar o usar el código, es necesario instalar las librerías a usar, esto se puede hacer escribiendo &lt;br /&gt;
&lt;br /&gt;
'''''pip install [nombre de la librería]''''' en el interprete de comandos del sistema.&lt;br /&gt;
&lt;br /&gt;
Entonces instalamos la librería a utilizar, en este caso:&lt;br /&gt;
&lt;br /&gt;
'''''pip install simple_websocket_server'''''&lt;br /&gt;
&lt;br /&gt;
Una vez instalada la librería, hay que empezar a escribir el código.&lt;br /&gt;
&lt;br /&gt;
El encabezado del código es el siguiente&lt;br /&gt;
El uso de cada librería se explica con detalle mas adelante&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Encabezado.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A partir de la librería '''sys''' se define el camino del sistema para utilizar los plugin Butiá.&lt;br /&gt;
En nuestro caso, la ruta es ''' '/home/trerb/TurtleBots.activity/plugins/butia' ''', eso se tiene que modificar dependiendo de donde se encuentren el directorio ''' TurtleBots.activity/ ''' en su sistema de archivos&lt;br /&gt;
&lt;br /&gt;
[[Archivo:UsoPluginButia.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego se encuentra la función ''' clearConsole ''',&lt;br /&gt;
Esta función sirve únicamente para limpiar el interprete de Python usando la librería ''' os ''' y tener una ejecución mas limpia&lt;br /&gt;
&lt;br /&gt;
[[Archivo:clearConsole().png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
El siguiente código utiliza la librería ''' socket ''' para conectarse a la web y preguntar la ip del ordenador que ejecuta el archivo y la muestra en pantalla, esto se usa para facilitar la conexión con la App Mobile&lt;br /&gt;
&lt;br /&gt;
[[Archivo:conexionSocket.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Las siguientes líneas de código preguntan al usuario que puerto va a utilizar para la conexión, este código verifica que se ingrese un dato numérico, dentro del rango de los puertos, y que el puerto este disponible.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:tryPuerto.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego se declaran las variables: ''' Speed, Puerto_Gris y Puerto_Distancia ''', se verifica que los sensores de distancia y de grises estén conectados y asigna el puerto en el que estén conectados a las variables ''' Puerto_Distancia ''' y ''' Puerto_Gris ''' respectivamente. La variable ''' Speed ''' es una variable global que se lee al inicio de cada cadena de acciones y la utiliza para todos los movimientos del Butiá de esa cadena.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:declaracionVariables.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Seguimos con la declaración de las funciones básicas del Butiá, en este caso son ''' Avanzar, Rotar, AvanzarHastaVerColor y AvanzarHastaObstaculo ''' &lt;br /&gt;
&lt;br /&gt;
-La función ''' Avanzar ''' recibe un parámetro de tiempo y el Butiá avanza ese determinado tiempo.&lt;br /&gt;
&lt;br /&gt;
-La función ''' Rotar ''' recibe dos parámetros, una dirección que puede ser Izquierda o Derecha y un tiempo que indica la duración de la rotación del Butiá.&lt;br /&gt;
&lt;br /&gt;
-La función ''' AvanzarHastaVerColor ''' recibe un parámetro que varia entre Blanco o Negro, el robot va a avanzar hasta detectar el color seleccionado.&lt;br /&gt;
Esta función solo se puede usar si el sensor de grises esta conectado.&lt;br /&gt;
&lt;br /&gt;
-Por ultimo, la función ''' AvanzarHastaObstaculo ''' no recibe parámetros, en este caso el Butiá va a avanzar hasta estar a unos pocos centímetros de un obstáculo.&lt;br /&gt;
Esta función solo se puede usar si el sensor de distancia esta conectado.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:FuncionesBasicas.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego se encuentra una función ''' Accion1 ''' esta función la puede definir el usuario a gusto, se puede implementar desde una función básica hasta un seguidor de líneas avanzado. La única condición que se necesita para implementar esta ''' Accion1 ''' es que no puede recibir parámetros&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Accion1.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ahora tenemos que definir el menú principal del programa, este se divide en dos funciones&lt;br /&gt;
&lt;br /&gt;
- ''' handle ''': Esta es una función predeterminada de la librería ''' simple_web_socket ''' y se llama cada vez que el servidor recibe un dato del cliente. En este caso la función crea una lista de las acciones que le llegan de la App Mobile, y las va ejecutando ordenadamente&lt;br /&gt;
&lt;br /&gt;
- ''' handle_close ''': Al igual que la función anterior, esta también es una función predeterminada de la librería ''' simple_web_socket ''' y se llama cuando el cliente se desconecta del servidor&lt;br /&gt;
&lt;br /&gt;
[[Archivo:mainPy.jpeg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Y por ultimo tenemos el dos líneas de codigo, la primera se encarga de abrir el servidor y la segunda lo mantiene abierto infinitamente&lt;br /&gt;
&lt;br /&gt;
[[Archivo:abrirServidor.png]]&lt;br /&gt;
== Implementación codigo React ==&lt;br /&gt;
&lt;br /&gt;
La aplicacion movil esta implementada con React Native, ademas, se utiliza el ''framework'' [https://docs.expo.io/ Expo]. Este ''framework'' nos brinda un conjunto de herramientas que facilita el desarrollo de aplicaciones mobiles. &lt;br /&gt;
En caso de querer agregar o modificar cualidades es necesario proceder de la siguiente forma:&lt;br /&gt;
&lt;br /&gt;
Descargar el archivo comprimido adjunto.&lt;br /&gt;
&lt;br /&gt;
Extraerlo, posicionarse en el directorio raiz de la carpeta descomprimida y ejecutar desde la terminal lo siguiente (tener en cuenta que es necesario tener en la maquina, el gesto de paquetes [https://docs.npmjs.com/ npm]).&lt;br /&gt;
&lt;br /&gt;
''''npm install'''' &lt;br /&gt;
&lt;br /&gt;
Esto descarga las dependencias que utiliza la aplicacion, luego de esto podemos empezar a desarrollar.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para visualizar los cambios en tiempo real mientras desarrollamos, es necesario instalar la aplicacion Expo Go para [https://play.google.com/store/apps/details?id=host.exp.exponent&amp;amp;hl=es_UY&amp;amp;gl=US Android] o para [https://apps.apple.com/es/app/expo-go/id982107779 iOS] segun sea el caso.&lt;br /&gt;
&lt;br /&gt;
Para a visualizar la app en desarollo desde Expo Go, procedemos de la siguiente forma:&lt;br /&gt;
Desde el directorio raiz de la aplicacion ejecutamos desde la terminal lo siguiente:&lt;br /&gt;
&lt;br /&gt;
''''npm start''''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego, desde la aplicion Expo Go, con el celular conectado en la misma red local accedemos a la aplicacion seleccionando lo siguiente:&lt;br /&gt;
&lt;br /&gt;
Hecho esto podemos cambiar el codigo de la aplicacion y ver los cambios de forma casi instantanea.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Screenshot_from_2021-06-27_00-28-32.png]]&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Screenshot from 2021-06-27 00-29-39.png]]&lt;br /&gt;
&lt;br /&gt;
== Manual de uso de la aplicación ==&lt;br /&gt;
&lt;br /&gt;
Aunque la aplicación resulta intuitiva y fácil de usar se describe a continuación una serie de pasos para utilizarla correctamente.&lt;br /&gt;
&lt;br /&gt;
Para comenzar a utilizar la aplicación es necesario configurar la coneccion de la aplicación con el servidor (recordar que ambos se deben encontrar ejecutándose en la misma red local), el servidor ejecutando en una computadora que esté conectada correctamente al butiá (con los sensores descritos anteriormente) y la aplicación ejecutándose en el celular.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Conectando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego que la conexión haya resultado exitosa, nos encontramos en la página principal. En el panel superior, como se muestra a continuación, se encuentran las aplicaciones disponibles que podemos ejecutar en el robot butiá.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Acciones.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para agregar una serie de acciones al robot, simplemente presionamos la que queramos, a continuación esta aparecerá en el panel inferior, a medida de que vayamos seleccionando acciones, estas se irán encadenando una tras otras, estas estarán prontas para ejecutarse secuencialmente, desde la parte inferior a la parte superior, en el momento que presionemos el botón &amp;quot;Empezar&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Agregando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Como la aplicación está pensada para planificar algoritmos para resolver problemas, como puzzles, es probable que nos equivoquemos y seleccionemos una acción o insertemos un parámetro incorrectamente, ¡pero no te preocupes!. Para editar el parámetro que le hayamos ingresado a una acción, simplemente mantenemos pulsado la que deseamos corregir e ingresamos el nuevo valor.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Editando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
También es posible eliminar una acción, para hacer esto, nuevamente mantenemos pulsada la acción que queremos eliminar, pero esta vez, seleccionamos la acción eliminar. A continuación la acción seleccionada desaparecerá del panel inferior. También es posible que deseemos eliminar todas las acciones que habíamos ingresado, en este caso seleccionamos el botón &amp;quot;Eliminar acciones&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Eliminando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es posible que queremos que el robot se desplace a ciertas velocidades, teniendo en cuenta que al modificar la velocidad, el robot tendrá un comportamiento totalmente diferente, debido a que gran parte de las acciones se ejecutan por un tiempo asignado, a mayor velocidad, más desplazamiento.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Velocidad.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En caso de que exista un error en la coneccion, podemos intentar volver a conectar la aplicacion al servidor, para esto seleccionamos la opción configuración.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:A configuracion.gif]]&lt;br /&gt;
&lt;br /&gt;
== Video de muestra ==&lt;br /&gt;
&lt;br /&gt;
== Mejoras a futuro ==&lt;br /&gt;
&lt;br /&gt;
* Implementar una forma para que las función ''' Accion1 ''' pueda recibir parámetros, para así ampliar la gama de problemas que se puedan solucionar a través de esta aplicación.&lt;br /&gt;
&lt;br /&gt;
* Implementación de código que permita añadir a través del código, una mayor cantidad de funciones genéricas a la aplicación.&lt;br /&gt;
&lt;br /&gt;
* Desarrollar una forma de comunicación bilateral entre la App Mobile y Python para mejorar el debug en tiempo de ejecución.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Archivos de uso ==&lt;/div&gt;</summary>
		<author><name>German.moreira</name></author>	</entry>

	<entry>
		<id>http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Programando_el_Butia_desde_el_celular&amp;diff=11611</id>
		<title>Programando el Butia desde el celular</title>
		<link rel="alternate" type="text/html" href="http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Programando_el_Butia_desde_el_celular&amp;diff=11611"/>
				<updated>2021-06-27T05:56:12Z</updated>
		
		<summary type="html">&lt;p&gt;German.moreira: /* Implementación codigo React */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Introducción ==&lt;br /&gt;
&lt;br /&gt;
La idea del proyecto en un principio era usar el celular como medio para controlar el robot Butiá para que resulte más atractivo para los estudiantes que no les guste la programación.&lt;br /&gt;
&lt;br /&gt;
Luego, la idea se modifico un poco debido a que descubrimos que con esta implementación, podíamos hacer mas sencilla la resolución de algunos ejercicios básicos mediante algoritmos mas simplificados, tomamos el trabajo que teníamos hecho hasta el momento y lo adaptamos a un menú con distintas acciones simples como avanzar un determinado tiempo, avanzar hasta chocar contra un objeto o rotar a la izquierda o derecha un determinado tiempo.&lt;br /&gt;
&lt;br /&gt;
Estas funciones básicas y bastante sencillas de entender más una interfaz amigable y fácil de usar, se implementaron para que el rango de edad de uso de esta aplicación vaya de 3 años en adelante.&lt;br /&gt;
&lt;br /&gt;
Como resultado obtuvimos una aplicación que se puede usar para que niños de:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- 4 / 5 / 6 años resuelvan ejercicios sencillos como puede ser llegar de un punto a otro, buscar el camino a un objeto o resolver un laberinto sencillo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- 7 / 8 / 9 años puedan resolver ejercicios un poco más complejos como puede ser resolver un laberinto del más sencillo al mas complejo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- 10 años en adelante tengan la capacidad de adaptar una parte personal de código al programa y puedan resolver cualquier ejercicio que se pueda plantear con el robot Butiá.&lt;br /&gt;
&lt;br /&gt;
== Objetivo ==&lt;br /&gt;
&lt;br /&gt;
Los objetivos del proyecto eran, como dice el nombre, poder conectar remotamente el robot Butiá a un celular y buscar una abstracción de la mayor cantidad de problemas que puedan ser resueltos con el robot Butiá.&lt;br /&gt;
&lt;br /&gt;
Esto para poder crear un método de uso del robot Butiá más dinámico y con funciones que permiten realizar, mediante algoritmos mas sencillos, la solución de la mayor cantidad de puzles particulares.&lt;br /&gt;
&lt;br /&gt;
Al hacer esto el nivel de uso en aulas del robot Butiá, puede simplificarse hasta clases desde 3 años de jardinera en adelante, debido a que la aplicación simplifica la parte de codificación y los algoritmos de solución de ejercicios se convierten simplemente en una serie de pasos básicos a ejecutar linealmente.&lt;br /&gt;
&lt;br /&gt;
== Armado del Butiá ==&lt;br /&gt;
&lt;br /&gt;
* Paso 1: Armar el Butiá a partir de esta [https://www.fing.edu.uy/inco/proyectos/butia/files/docs_butia2/armando_paso_a_paso_motores_CC_rev1.pdf guía oficial]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''' Los siguientes pasos son opcionales '''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Paso 2: Instalar el sensor de grises&lt;br /&gt;
&lt;br /&gt;
1:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP1.jpeg]] &lt;br /&gt;
&lt;br /&gt;
2:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP2.jpeg]]&lt;br /&gt;
&lt;br /&gt;
3:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP3.jpeg]]&lt;br /&gt;
&lt;br /&gt;
4:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:GrisesP4.jpeg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Paso 3: Instalar el sensor de distancia&lt;br /&gt;
&lt;br /&gt;
1:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP1.png]]&lt;br /&gt;
&lt;br /&gt;
2:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP2.png]]&lt;br /&gt;
&lt;br /&gt;
3:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP3.png]]&lt;br /&gt;
&lt;br /&gt;
4:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:DistanciaP4.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Implementación código Python ==&lt;br /&gt;
&lt;br /&gt;
Antes de empezar a programar o usar el código, es necesario instalar las librerías a usar, esto se puede hacer escribiendo &lt;br /&gt;
&lt;br /&gt;
'''''pip install [nombre de la librería]''''' en el interprete de comandos del sistema.&lt;br /&gt;
&lt;br /&gt;
Entonces instalamos la librería a utilizar, en este caso:&lt;br /&gt;
&lt;br /&gt;
'''''pip install simple_websocket_server'''''&lt;br /&gt;
&lt;br /&gt;
Una vez instalada la librería, hay que empezar a escribir el código.&lt;br /&gt;
&lt;br /&gt;
El encabezado del código es el siguiente&lt;br /&gt;
El uso de cada librería se explica con detalle mas adelante&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Encabezado.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A partir de la librería '''sys''' se define el camino del sistema para utilizar los plugin Butiá.&lt;br /&gt;
En nuestro caso, la ruta es ''' '/home/trerb/TurtleBots.activity/plugins/butia' ''', eso se tiene que modificar dependiendo de donde se encuentren el directorio ''' TurtleBots.activity/ ''' en su sistema de archivos&lt;br /&gt;
&lt;br /&gt;
[[Archivo:UsoPluginButia.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego se encuentra la función ''' clearConsole ''',&lt;br /&gt;
Esta función sirve únicamente para limpiar el interprete de Python usando la librería ''' os ''' y tener una ejecución mas limpia&lt;br /&gt;
&lt;br /&gt;
[[Archivo:clearConsole().png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
El siguiente código utiliza la librería ''' socket ''' para conectarse a la web y preguntar la ip del ordenador que ejecuta el archivo y la muestra en pantalla, esto se usa para facilitar la conexión con la App Mobile&lt;br /&gt;
&lt;br /&gt;
[[Archivo:conexionSocket.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Las siguientes líneas de código preguntan al usuario que puerto va a utilizar para la conexión, este código verifica que se ingrese un dato numérico, dentro del rango de los puertos, y que el puerto este disponible.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:tryPuerto.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego se declaran las variables: ''' Speed, Puerto_Gris y Puerto_Distancia ''', se verifica que los sensores de distancia y de grises estén conectados y asigna el puerto en el que estén conectados a las variables ''' Puerto_Distancia ''' y ''' Puerto_Gris ''' respectivamente. La variable ''' Speed ''' es una variable global que se lee al inicio de cada cadena de acciones y la utiliza para todos los movimientos del Butiá de esa cadena.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:declaracionVariables.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Seguimos con la declaración de las funciones básicas del Butiá, en este caso son ''' Avanzar, Rotar, AvanzarHastaVerColor y AvanzarHastaObstaculo ''' &lt;br /&gt;
&lt;br /&gt;
-La función ''' Avanzar ''' recibe un parámetro de tiempo y el Butiá avanza ese determinado tiempo.&lt;br /&gt;
&lt;br /&gt;
-La función ''' Rotar ''' recibe dos parámetros, una dirección que puede ser Izquierda o Derecha y un tiempo que indica la duración de la rotación del Butiá.&lt;br /&gt;
&lt;br /&gt;
-La función ''' AvanzarHastaVerColor ''' recibe un parámetro que varia entre Blanco o Negro, el robot va a avanzar hasta detectar el color seleccionado.&lt;br /&gt;
Esta función solo se puede usar si el sensor de grises esta conectado.&lt;br /&gt;
&lt;br /&gt;
-Por ultimo, la función ''' AvanzarHastaObstaculo ''' no recibe parámetros, en este caso el Butiá va a avanzar hasta estar a unos pocos centímetros de un obstáculo.&lt;br /&gt;
Esta función solo se puede usar si el sensor de distancia esta conectado.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:FuncionesBasicas.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego se encuentra una función ''' Accion1 ''' esta función la puede definir el usuario a gusto, se puede implementar desde una función básica hasta un seguidor de líneas avanzado. La única condición que se necesita para implementar esta ''' Accion1 ''' es que no puede recibir parámetros&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Accion1.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ahora tenemos que definir el menú principal del programa, este se divide en dos funciones&lt;br /&gt;
&lt;br /&gt;
- ''' handle ''': Esta es una función predeterminada de la librería ''' simple_web_socket ''' y se llama cada vez que el servidor recibe un dato del cliente. En este caso la función crea una lista de las acciones que le llegan de la App Mobile, y las va ejecutando ordenadamente&lt;br /&gt;
&lt;br /&gt;
- ''' handle_close ''': Al igual que la función anterior, esta también es una función predeterminada de la librería ''' simple_web_socket ''' y se llama cuando el cliente se desconecta del servidor&lt;br /&gt;
&lt;br /&gt;
[[Archivo:mainPy.jpeg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Y por ultimo tenemos el dos líneas de codigo, la primera se encarga de abrir el servidor y la segunda lo mantiene abierto infinitamente&lt;br /&gt;
&lt;br /&gt;
[[Archivo:abrirServidor.png]]&lt;br /&gt;
== Implementación codigo React ==&lt;br /&gt;
&lt;br /&gt;
La aplicacion movil esta implementada con React Native, ademas, se utiliza el ''framework'' [https://docs.expo.io/ Expo]. Este ''framework'' nos brinda un conjunto de herramientas que facilita el desarrollo de aplicaciones mobiles. &lt;br /&gt;
En caso de querer agregar o modificar cualidades es necesario proceder de la siguiente forma:&lt;br /&gt;
&lt;br /&gt;
Descargar el archivo comprimido adjunto.&lt;br /&gt;
&lt;br /&gt;
Extraerlo, posicionarse en el directorio raiz de la carpeta descomprimida y ejecutar desde la terminal lo siguiente.&lt;br /&gt;
&lt;br /&gt;
''''npm install'''' &lt;br /&gt;
&lt;br /&gt;
Esto descarga las dependencias que utiliza la aplicacion, luego de esto podemos empezar a desarrollar.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para visualizar los cambios en tiempo real mientras desarrollamos, es necesario instalar la aplicacion Expo Go para [https://play.google.com/store/apps/details?id=host.exp.exponent&amp;amp;hl=es_UY&amp;amp;gl=US Android] o para [https://apps.apple.com/es/app/expo-go/id982107779 iOS] segun sea el caso.&lt;br /&gt;
&lt;br /&gt;
Para a visualizar la app en desarollo desde Expo Go, procedemos de la siguiente forma:&lt;br /&gt;
Desde el directorio raiz de la aplicacion ejecutamos desde la terminal lo siguiente:&lt;br /&gt;
&lt;br /&gt;
''''npm start''''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego, desde la aplicion Expo Go, con el celular conectado en la misma red local accedemos a la aplicacion seleccionando lo siguiente:&lt;br /&gt;
&lt;br /&gt;
Hecho esto podemos cambiar el codigo de la aplicacion y ver los cambios de forma casi instantanea.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Screenshot_from_2021-06-27_00-28-32.png]]&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Screenshot from 2021-06-27 00-29-39.png]]&lt;br /&gt;
&lt;br /&gt;
== Manual de uso de la aplicación ==&lt;br /&gt;
&lt;br /&gt;
Aunque la aplicación resulta intuitiva y fácil de usar se describe a continuación una serie de pasos para utilizarla correctamente.&lt;br /&gt;
&lt;br /&gt;
Para comenzar a utilizar la aplicación es necesario configurar la coneccion de la aplicación con el servidor (recordar que ambos se deben encontrar ejecutándose en la misma red local), el servidor ejecutando en una computadora que esté conectada correctamente al butiá (con los sensores descritos anteriormente) y la aplicación ejecutándose en el celular.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Conectando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego que la conexión haya resultado exitosa, nos encontramos en la página principal. En el panel superior, como se muestra a continuación, se encuentran las aplicaciones disponibles que podemos ejecutar en el robot butiá.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Acciones.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para agregar una serie de acciones al robot, simplemente presionamos la que queramos, a continuación esta aparecerá en el panel inferior, a medida de que vayamos seleccionando acciones, estas se irán encadenando una tras otras, estas estarán prontas para ejecutarse secuencialmente, desde la parte inferior a la parte superior, en el momento que presionemos el botón &amp;quot;Empezar&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Agregando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Como la aplicación está pensada para planificar algoritmos para resolver problemas, como puzzles, es probable que nos equivoquemos y seleccionemos una acción o insertemos un parámetro incorrectamente, ¡pero no te preocupes!. Para editar el parámetro que le hayamos ingresado a una acción, simplemente mantenemos pulsado la que deseamos corregir e ingresamos el nuevo valor.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Editando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
También es posible eliminar una acción, para hacer esto, nuevamente mantenemos pulsada la acción que queremos eliminar, pero esta vez, seleccionamos la acción eliminar. A continuación la acción seleccionada desaparecerá del panel inferior. También es posible que deseemos eliminar todas las acciones que habíamos ingresado, en este caso seleccionamos el botón &amp;quot;Eliminar acciones&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Eliminando.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es posible que queremos que el robot se desplace a ciertas velocidades, teniendo en cuenta que al modificar la velocidad, el robot tendrá un comportamiento totalmente diferente, debido a que gran parte de las acciones se ejecutan por un tiempo asignado, a mayor velocidad, más desplazamiento.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Velocidad.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En caso de que exista un error en la coneccion, podemos intentar volver a conectar la aplicacion al servidor, para esto seleccionamos la opción configuración.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:A configuracion.gif]]&lt;br /&gt;
&lt;br /&gt;
== Video de muestra ==&lt;br /&gt;
&lt;br /&gt;
== Mejoras a futuro ==&lt;br /&gt;
&lt;br /&gt;
* Implementar una forma para que las función ''' Accion1 ''' pueda recibir parámetros, para así ampliar la gama de problemas que se puedan solucionar a través de esta aplicación.&lt;br /&gt;
&lt;br /&gt;
* Implementación de código que permita añadir a través del código, una mayor cantidad de funciones genéricas a la aplicación.&lt;br /&gt;
&lt;br /&gt;
* Desarrollar una forma de comunicación bilateral entre la App Mobile y Python para mejorar el debug en tiempo de ejecución.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Archivos de uso ==&lt;/div&gt;</summary>
		<author><name>German.moreira</name></author>	</entry>

	</feed>