Proyecto de Programación Orientada a objetos
Control de un auto a control remoto
Integrantes:
Italo Salgado
Luciano Muñoz
Javier Quiroga
Contenidos
Contextualizando a grandes rasgros, desde la perspectiva del cliente, se nos ha pedido construir una aplicación que permita el movimiento de un auto de juguete.
Desde nuestra perspectiva (la de quien implementa) se nos pide controlar una arduino, a travéz de una conexión bluetooth. Esta debe lograr mover un servo o una maquina de corriente continua en respuesta a solicitudes del usuario.
Este proyecto plantea ser un inicio para uno mas extenso desarrollado por uno de nuestros integrantes. Entonces, este extiende una problemática, por lo que debe ser transferible a otro equipo para su posterior desarrollo.
Requisitos de diseño del cliente:
Multiplataforma: La aplicación debe funcionar bajo cualquier plataforma movil (iOS y Android), cubriendo casi todos los telefonos inteligentes disponibles en el mercado.
Escalabilidad: El cliente nos pide que la implementación sea en sofware orientado a la velocidad de desarrollo y puntero (tanto visual como en lógica), ya que su desarrollo se extendera a un proyecto mayor que tomará mas tiempo.
El entorno de desarrollo elegido fue Flutter, framework de Android Studio que se programa en Dart, un refrito de Java, orientado a objetos.
Para contextualizar un poco el porqué de esta elección, en primer lugar debemos hablar un poco sobre que es Flutter.
Como ya se mencionó, Flutter es un SDK para desarrollo de aplicaciones móviles multiplataforma, es decir que con el mismo código fuente podemos crear apps para Android y para iOS. Estas aplicaciones son 100% nativas, no híbridas, no pseudo nativas. Serán apps que se compilan directamente para el procesador del dispositivo. Para desarrollar con Flutter debemos usar el lenguaje de programación Dart. Las principales características del entorno son:
Los widgets son soluciones preconstruidas de la interfaz, asi se puede crear interfaces rápidamente utilizando widgets en lugar de escribirlas desde cero. Además, Flutter tiene una característica llamada Hot Reload que permite ver los cambios "en caliente" sin necesidad de esperar a recompilar. Asi en lugar de esperar hasta dos minutos por cambio, los podemos ver al instante.
Los widgets de Flutter permiten construir interfaces muy rápido, además que son altamente personalizables e incluyen widget exclusivos para Material Design (Android) y Cupertino Style (iOS).
Los widgets añaden las personalizaciones para iOS y Android como navegación, scrolling, iconos, fuentes etc. Así no tienes que preocuparte de las peculiaridades de cada sistema, Flutter lo hace sin intervención del programador. Además compila a código nativo del procesador ofreciendo la mejor experiencia a los usuarios.
Los siguientes son casos de usos para la aplicación diseñada. Estos estubieron sujetos a solo utilizar el SO Android, que era el único disponible entre los desarrolladores (nosotros!)
CU-01 |
Establecer Conexión Bluetooth en Android |
Version |
1.0 - 23/08/2019 |
Dependencias |
El usuario debe usar el SO Android. |
Precondición |
El usuario ha abierto la aplicación satisfactoriamente. Debe haber entablado una conexión al menos una vez con el bluetooth de arduino para tener registrado este en sus dispositivos amigos. |
Descripción |
La aplicación logra satisfactoriamente conectarse a un periférico bluetooth de arduino, a travéz de Android. |
Secuencia Normal |
El usuario inicia la aplicación en el entorno , con el bluetooth encendido. Debe poder apagar o prender éste desde el menú de la app. Luego, puede acceder al menú de busqueda de bluetooth e identificar a otros dispositivos con el bluetooth encendido. El usuario se conecta al bluetooth de arduino satisfactoriamente |
Post-Condición |
La conexión Bluetooth está entablada con el arduino. Esta parpadea mas lentamente, indicando una conexión satisfactoria. La aplicación cambia la barra de título de a “Conectado con [id bluetooth] |
Excepciones |
A veces no puede realizarse una conexión. Debe reiniciarse la aplicación. |
Comentarios |
|
CU-02 |
Enviar posición del Mando de la Aplicación por Bluetooth. Indicar movimiento de la dirección. |
Version |
1.0 - 23/08/2019 |
Dependencias |
El usuario debe usar el SO Android |
Precondición |
El usuario ha abierto la aplicación satisfactoriamente. Debe haber entablado una conexión con el dispositivo Arduino y tenerla activa. |
Descripción |
La aplicación logra satisfactoriamente enviar un requerimiento de movimiento del giro del mando (movimiento horizontal-vertical) a la arduino. |
Secuencia Normal |
El usuario inicia la aplicación en el entorno , con el bluetooth encendido y se emparenta con la arduino. Accede al menú de movimiento de la App, Mueve el mando de la app hacia la izquierda. Luego, lo mueve hacia la derecha (movimiento solo horizontal). |
Post-Condición |
La arduino muestra el movimiento del servo, en directa correlación a lo que se le indique al mando. |
Excepciones |
Verificar conexiones del servo. |
Comentarios |
|
CU-03 |
Enviar posición del Mando de la Aplicación por Bluetooth. Indicar avance o retroceso. |
Version |
1.0 - 29/08/2019 |
Dependencias |
El usuario debe tener una conexión bluetooth activa. |
Precondición |
El usuario ha abierto la aplicación satisfactoriamente. Debe haber entablado una conexión con el dispositivo Arduino y tenerla activa. |
Descripción |
La aplicación logra satisfactoriamente conectarse a un periférico bluetooth de arduino y envia la petición de movimiento a travéz de la aplicación. La arduino mueve un motor de cc que hace avanzar o retroceder al auto. |
Secuencia Normal |
El usuario inicia la aplicación en el entorno, con el bluetooth encendido. Se emparenta con la arduino. Luego, puede acceder al menú de busqueda de bluetooth e identificar a otros dispositivos con el bluetooth encendido. El usuario se conecta al bluetooth de arduino satisfactoriamente |
Post-Condición |
La arduino muestra el movimiento del motor de corriente continua, en directa correlación a lo que se le indique al mando. |
Excepciones |
Verificar conexiones, fuentes de poder y cables. El motor de cc es sensible a las conexiones. |
Comentarios |
El motor de cc es requiere potencia extra que debe ser otorgada a travez de una fuente de poder externa a la arduino. |
Diagramade clases: Presentamos los principales clases de la aplicación
Diagrama de secuencia:El siguiente diagrama presenta los prinicipales casos de interacción, ya implementados
Dado que nuestro proyecto se basa en hardware, las demostraciones deben realizarse en las presentaciones, donde el profesor y los asistentes seran ministros de fe de la correcta implementación. Los casos de uso reflejan el hecho de que todas las post condiciones estan relacionadas con respuestas en hardware.
Adjuntamos entonces imágenes que reflejan la implementación hecha, junto con el caso de uso de conexión bluetooth, que es posible mostrar en imágenes.
Los pasos para realizar una conexión bluetooth son:
a) Este es el menú principal.
b) Seleccionamos la primera opción. Buscamos los dispositivos disponibles. Aqui solo podemos verlos (esto es por precaucion, verificamos mas rapido los dispositivos disponibles).
c) En el menú de conexión (segunda opción), nos conectamos por bluetooth.
d) Cuando se esta estableciendo la conexión, se entra en el menú de mando.
Desde este menú, con el objeto de mando mostrado en la ultima imagen, podemos enviar solicitudes de movimiento a la arduino.
Aqui notamos la implementación de la arduino, donde se denota: bluetooth, motor de cc y servo:
Algunas peculiaridades en el desarrollo de la aplicación:
1) Se pensó desarrollar en proyecto Android Studio con Java, y al haber implementado la primera parte del proyecto, se procedio a cambiar a flutter. Pese a que el control de autos de juguete con arduino esta muy desarrollado en arduino, programar dos veces hubiese sido muy incomodo del lado del programador.
2) La implementación física con el arduino tiene muchas peculariedades en el ambito físico. Hay que tener un perfil que conozca de circuitos, para no quedar estancado en las conexiones físicas.
3) Se tuvo que implementar un mini-protocolo de comunicación entre la arduino-bluetooth y la App (muy rudimentario).
4) La arduino tiene muchas limitaciones de cálculo, en especial de CPU. Hacer un Split de un String o implementar una librería de C era muy pesado para la arduino y eso dió problemas en algunos casos.
5) Flutter es un software soportado por Google, lanzado hace muy poco (fines del 2015). Hay pocos ejemplos en la internet, por lo que las peripecias intrínsecas a la programación (Stack Overflow!) no están tan documentadas como en otros lenguajes.
El SDK de iOS, de Apple fue lanzado en 2008 y el SDK de Android, de Google en 2009. Estos dos SDK estaban basados en lenguajes diferentes: Objective-C y Java, respectivamente.
La aplicación se comunica con la plataforma para crear widgets o acceder a servicios como la cámara. Los widgets se muestran en un canvas de pantalla, y los eventos se devuelven a los widgets. Esta es una arquitectura simple, pero hay que crear aplicaciones separadas para cada plataforma porque los widgets son diferentes, por no hablar de los lenguajes nativos.
Flutter tiene un enfoque diferente para evitar los problemas de rendimiento causados por la necesidad de un puente JavaScript (multiplataforma lento) mediante el uso de un lenguaje de programación compilado. Usando Dart, el programa se compila “por adelantado” (AOT) en código nativo para múltiples plataformas. Esto permite que Flutter se comunique con la plataforma sin pasar por un puente JavaScript que hace un cambio de contexto. La compilación a código nativo también mejora los tiempos de inicio de la aplicación.
Click aquí
para descargar