Control de un auto a control remoto

Proyecto de Programación Orientada a objetos

Control de un auto a control remoto



Integrantes:

Italo Salgado

Luciano Muñoz

Javier Quiroga



Contenidos

  1. Descripción y Requisitos del cliente
  2. Análisis del problema
  3. Casos de uso
  4. Diagramas UML
  5. Resultados, Pruebas y otros menesteres de testeo
  6. Peculiaridades y problemas de implementación
  7. Extras: Breve Contexto de la Arquitectura
  8. Descargas

Descripción y Requisitos del cliente

 

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.




Análisis del problema

 

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:

Desarrollo rápido

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.

Interfaz flexible y expresiva

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).

Rendimiento nativo multiplataforma

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.




Casos de Uso.

      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.


Diagramas UML

 



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

 


Resultados, Pruebas y otros menesteres de testeo

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:



 

Peculiaridades y problemas de implementación

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.






 

Extras: Breve Contexto de la Arquitectura


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.

 

 

 

 


Descargas

A continuacion se adjunta el codigo de fuente usado.

Click aquí
para descargar