Diferencia entre revisiones de «Encoder»

De Proyecto Butiá
Saltar a: navegación, buscar
 
(No se muestran 56 ediciones intermedias del mismo usuario)
Línea 13: Línea 13:
 
== '''Introducción''' ==
 
== '''Introducción''' ==
  
El presente trabajo tiene como objetivo principal extender las capacidades del butiá en lo que a movimiento refiere, permitiendole realizar desplazamientos y giros mas precisos.
+
El presente trabajo tiene como objetivo principal extender las capacidades del butiá en lo que a movimiento refiere, permitiendole realizar desplazamientos y giros mas precisos. Ademas de poder determinar que el butia se desplace una distancia a cierta velocidad.
  
 
== '''Objetivo''' ==
 
== '''Objetivo''' ==
Línea 29: Línea 29:
  
 
*''Algoritmo flujo óptico'': Este algoritmo lo que hace es tomar datos del entorno mediante la cámara y comparar el desfazaje entre imágenes sucesivas.
 
*''Algoritmo flujo óptico'': Este algoritmo lo que hace es tomar datos del entorno mediante la cámara y comparar el desfazaje entre imágenes sucesivas.
Esta opción fue descartada porque era bastante complejo saber que pixeles entre las imágenes habÍa que comparar.
+
La complejidad de este algoritmo esta dada por averiguar que pixeles entre imágenes consecutivas comparar y como determinar una distancia a partir de los cambios en los mismos. Para este caso el ambiente por el cual se mueve el robot es vasto y diverso lo cual resulta mas difícil el como interpretar las imágenes. Por otro lado creímos que la curva de aprendizaje sobre el algoritmo era grande como para terminar la solución en tiempo y forma.  
  
 
*''Utilizar Mouse Óptico Como Sensor'': La idea consiste en ir sensando con un mouse óptico ubicado en la parte inferior del butiá y de acuerdo a las coordenadas x e y determinar el movimiento.
 
*''Utilizar Mouse Óptico Como Sensor'': La idea consiste en ir sensando con un mouse óptico ubicado en la parte inferior del butiá y de acuerdo a las coordenadas x e y determinar el movimiento.
Línea 38: Línea 38:
  
 
*''Sensor de Gris y Marcas en una Rueda'': Esta idea consiste en marcar una rueda e ir sensando con un sensor de grises las marcas. Estas marcas las utilizamos para medir la distancia recorrida, dichas marcas se encuentran equidistantes en la rueda.
 
*''Sensor de Gris y Marcas en una Rueda'': Esta idea consiste en marcar una rueda e ir sensando con un sensor de grises las marcas. Estas marcas las utilizamos para medir la distancia recorrida, dichas marcas se encuentran equidistantes en la rueda.
Esta fue la solución elegida, porque nos permitió aplicar los conocimientos adquiridos en el curso.
 
  
== Posibles mejoras ==
+
== Solución ==
Como posible trabajo futuro, se puede integrar el sensor de grises al motor que ya está en el butiá. Así como que el sensor esté conectado directamente con la placa y liberar un puerto.
+
También aislar el sensor para reducir el ruido producido por la iluminación ambiente.
+
  
== Trabajos futuros ==
+
La solución elegida es la de utilizar el sensor de grises con la rueda marcada. Se decidió realizar esta implementación debido a que se podia realizar con un bajo costo, ademas el algoritmo realizado se puede utilizar para implementar la solución de Motores CC sin escobillas cambiando el sensado de los grises por el sensado de los campos magnéticos.
  
 +
[[Archivo:20150629_171226.jpg]] 
  
 +
[[Archivo:20150629_170942.jpg ]]
  
== Anatomía del brazo. ==
+
El diametro de la rueda es de 7.8 cm, por lo que el perimetro es d * Pi = 7.8 cm * Pi = 24.7 cm. En base al perimetro, se intento dividir la rueda en la mayor cantidad de divisiones posibles (para disminuir el error), tomando en cuenta que la lectura del sensor de grises pueda determinar un cambio de color (negro, blanco) correctamente.
 +
Para realizar esto se dividió la rueda en 24 partes iguales. El arco de cada parte es de 1.03 cm. Como el rango de valores entre el color blanco y el negro para el sensor de grises es bastante grande, siempre cuenta correctamente las marcas, el problema con la precisión esta dado por el ambiente sobre el cual se desplaza, a la vez de la mecánica de las ruedas. Suponiendo un ambiente optimo y las ruedas correctamente posicionadas, el margen de error es de +/- 1.03 cm.
  
La anatomía de un brazo robótico se refiere a la construcción física. La mayoría de los Brazos robóticos utilizados en las fábricas actuales están montados sobre una base que está sujeta al suelo. Los brazos robóticos están disponibles en una amplia gama de tamaños, formas y configuraciones físicas. La gran mayoría de los brazos comerciales disponibles en la actualidad tienen una de estas cuatro configuraciones básicas:
+
El diseño de la rueda es el siguiente:
  
* '''Configuración polar''': Usados en la manipulación en máquinas herramientas, soldadura por punto, fundición a presión, máquinas de desbarbado, soldadura por gas y por arco. Es un robot cuyos ejes forman un sistema polar de coordenadas.
 
  
* '''Configuración cilíndrica''': Usado para trabajos de “pick and place” (tomar y colocar), aplicación de impermeabilizantes, operaciones de ensamblado, manipulación de máquinas herramientas y soldadura por arco.
+
[[Archivo:Imagen butia.png]]
  
* '''Configuración de coordenadas cartesianas''': Usado para trabajos de “pick and place” (tomar y colocar), aplicación de impermeabilizantes, operaciones de ensamblado, manipulación de máquinas herramientas y soldadura por arco.
 
  
* '''Configuración de brazo articulado''': Usado para operaciones de ensamblaje, fundición a presión, máquinas de desbarbado, soldadura a gas, soldadura por arco, y pintado en spray. Es un robot cuyo brazo tiene como mínimo tres articulaciones rotatorias.
+
Diseño pieza de acrilico:
  
 +
Para poder ubicar el sensor de grises de una forma correcta, se modifico el diseño de la pieza de acrílico que se encarga de sostener la rueda.
 +
[[Media:PiezaSensor.svg]]
  
== Motores (Info y Presupuesto) ==
+
  
Los dos tipos de motores más utilizados para la construcción de brazos robóticos son:
 
  
'''SERVOMOTORES'''
+
Para poder implementar el modulo de velocidad se calcula dinamicamente que distancia se desplaza por tiempo entre marca y marca. Si la velocidad es menor al rango objetivo (velocidad objetivo +/- (velocidad objetivo)*0.1) se aumenta la potencia de los motores y si es mayor se disminuye. Este comportamiento esta descripto en la siguiente maquina de estados.
  
Son motores con capacidad de ubicarse en cualquier posición dentro de su rango de operación, y mantenerse estable en dicha posición.
+
[[Archivo:Maq_est.png]]
   
+
Los servomotores hacen uso de la modulación por ancho de pulsos (PWM) para controlar la dirección o posición de los motores de corriente continua.
+
  
La mayoría trabaja en la frecuencia de los cincuenta hertz, así las señales PWM tendrán un periodo de veinte milisegundos. La electrónica dentro del servomotor responderá al ancho de la señal modulada. Si los circuitos dentro del servomotor reciben una señal de entre 0,5 a 1,4 milisegundos, éste se moverá en sentido horario; entre 1,6 a 2 milisegundos moverá el servomotor en sentido antihorario; 1,5 milisegundos representa un estado neutro para los servomotores estándares. A continuación se exponen ejemplos de cada caso:
+
== Posibles mejoras ==
 +
Como posible trabajo futuro, se puede integrar el sensor de grises al motor que ya está en el butiá. Así como que el sensor esté conectado directamente con la placa y liberar un puerto.
 +
También aislar el sensor para reducir el ruido producido por la iluminación ambiente.
  
 +
== ''' Paleta de Turtlebots ''' ==
  
* '''''Señal de ancho de pulso modulado''''':
+
Se agregan los siguientes bloques de funciones para el programa Turtlebots en el codigo fuente butia.py:
  
  [[Archivo:PWM1.png]]
+
* ''Forward distance'': Este bloque sirve para determinar que el butia avance cierta distancia con una cierta potencia configurable por el usuario.  
 +
* ''Backward distance'':Este bloque es igual al Forward distance distance solo que en vez de avanzar retrocede.
 +
* ''Left degree'': Este bloque esta hecho para poder determinar cuantos grados gira a la izquierda el robot con una cierta potencia.
 +
* ''Right degree'': Este bloque esta hecho para poder determinar cuantos grados gira a la derecha el robot con una cierta potencia.
 +
* ''Calibrate grey'': Este bloque realiza un giro completo de la rueda modificada para poder determinar el valor del sensor de grises para los colores blanco y negro. Evitando que la calibracion la realice el usuario.
 +
* ''DistanceSpeed'': Este bloque se utiliza para que el butia se desplace a una velocidad determinada en una distancia dada
  
* '''''Motor en sentido horario (ejemplo 0,7 ms)''''':
+
[[Archivo:Paleta_encoder.png]]
  
[[Archivo:PWM2.png]]
+
Video demostrativo:
  
* '''''Motor neutral (1,5ms)''''':
+
https://www.youtube.com/watch?v=MduiTJ4rryA&feature=youtu.be
  
[[Archivo:PWM3.png]]
 
  
* '''''Motor en sentido antihorario (ejemplo 1,8ms)''''':
+
== ''' Pruebas de velocidad ''' ==
  
[[Archivo:PWM4.png]]
+
Para validar que el modulo de velocidad funciona correctamente, se graficaron las velocidades obtenidas a lo largo del tiempo para distintas velocidades.
  
 +
Velocidad 7 cm/s
  
 +
[[Archivo:Vel7.PNG]]
  
'''El precio de mercado de un servomotor es aproximadamente 18 U$S.'''
+
Velocidad 10 cm/s
  
 +
[[Archivo:Vel10.PNG]]
  
'''DINAMIXEL AX12:'''
+
Velocidad 13 cm/s
  
El Dinamyxel AX-12+ es un un servo digital “inteligente”, fabricado por la empresa coreana Robotis e incluido en sus kits robóticos Bioloid es lo que podría llamarse un “superservo”.
+
[[Archivo:Vel13.PNG]]
  
Algunas de sus características:
+
Velocidad 16 cm/s
  
* Usa un microcontrolador integrado
+
[[Archivo:Vel16.PNG]]
* Soporta rotación continua y modo servo standard
+
* Velocidad y torque ajustables
+
* Velocidad máxima: 300 grados/seg. Torque máximo: 16Kg/cm
+
* Comunicación serial a 1Mb/s, half duplex. Se pueden conectar varios motores en cadena a un mismo bus.
+
* Feedback de todo tipo de información: posición angular, temperatura, voltaje, fuerza, velocidad, sobrecarga, errores, etc.  a través del bus serial, y posee además un led de notificación.
+
  
 +
Velocidad 19 cm/s
  
'''El precio de mercado de un motor AX12 es aproximadamente 50 U$S.'''
+
[[Archivo:Vel19.PNG]]
  
 +
Velocidad 22 cm/s
  
 +
[[Archivo:Vel22.PNG]]
  
 +
En todos los casos se puede observar que la velocidad obtenida se encuentra fluctuando alrededor de la velocidad objetivo, este comportamiento se da porque el algoritmo funciona aumentando la velocidad hasta que se pasa cierto umbral superior y luego bajándola hasta que llega al umbral inferior.
  
'''''* Dada la diferencia de precios entre los tipos de motor, se decidió utilizar Servomotores para la realización del proyecto.'''''
+
Velocidad 22 cm/s Larga duración
  
=='''Diseño de la mecánica'''==
+
[[Archivo:largo22.PNG]]
  
'''Grados de libertad'''
+
En este caso se configuro el butia para que vaya a una velocidad de 22 cm/s hasta que se le gaste la batería. Se calculo el promedio de todas las medidas y se mantiene en 21,6057.  
 
+
En la gráfica se puede observar que se mantiene fluctuando bien, mostrando algunos picos, hasta llegar al final de la gráfica en donde la baja batería ocasionó que las medidas se mantuvieran por debajo de la velocidad esperada. Subiendo la velocidad en todo momento hasta que la batería no brindo la potencia suficiente para llegar a la velocidad esperada.
Se manejó la posibilidad de construir un brazo robótico con 3 grados de libertad, uno por cada eje axial, lo cual implica 3 motores servos, más uno extra para el efector (Mano, o pinza), o sea, 4 servomotores.
+
 
+
Dado que el robot butiá puede desplazarse en dos dimensiones, y la idea es que el brazo se use conjuntamente con este, se decidió que sería suficiente si el brazo trabajara en una sola dimensión, lo cual puede realizarse con 2 servomotores, minimizando de esta forma el costo en este sentido.
+
 
+
Se decide, por lo tanto, que el brazo tendrá forma de grúa, es decir será un brazo robótico cartesiano con un grado de libertad.
+
 
+
 
+
'''Efector'''
+
 
+
Como efector se utilizará un a pinza de diseño gratuito, descargada de el sitio thingiverse.com. Ésta será cortada en acrilico, adaptada a un tamaño compatible con los tornillos y tuercas utilizados en la plataforma Butiá.
+
 
+
Para el manejo de la pinza se utilizará un “miniservo”.
+
Modelo utilizado: http://www.thingiverse.com/thing:2415
+
 
+
  [[Archivo:pinza.jpg]]
+
 
+
 
+
'''Estructura'''
+
 
+
La grúa consistirá en 2 partes; Una torre (o mástil) donde se encontrará un motor para enrollar/desenrollar la cuerda de la que colgará la pinza. Y un brazo (a modo de pluma) unido a éste, en cuyo extremo irá añadida una roldana, que girará libremente, sobre la cual pasará la cuerda que sostendrá a la pinza.
+
 
+
  [[Archivo:Estructura.jpg]]
+
 
+
'''Materiales'''
+
 
+
Como en el laboratorio de robótica hay muchas “sobras” y recortes de acrilico de viejos robots Butiá, éstos se utilizarán para la construcción de la torre y el brazo.
+
La pinza se cortará en acrílico de 6mm.
+
Además se utilizaran tornillos, tuercas y fichas de ensamblaje pertenecientes al kit butiá.
+
 
+
Esta decisión tiene como ventaja que la grúa quedará mejor integrada a la plataforma butiá, además de que las piezas utilizadas son casi enteramente del kit butiá (el brazo utiliza dos barandas ligeramente modificadas para la tarea), por lo que no será necesario fabricar piezas personalizadas, a excepción de la pinza.
+
 
+
  [[Archivo:materiales.jpg]]
+
 
+
== ''' Conexión con la placa USB4Butia ''' ==
+
 
+
'''USB4All y módulos de usuario'''
+
 
+
Para mover los motores es preciso comunicarse con los mismos a través de PWM, es decir enviando pulsos de una determinada duración.
+
Sería necesario, entonces, crear un módulo de usuario para llevar a cabo esta tarea.
+
Afortunadamente, el firmware usb4all cuenta con un módulo de usuario para controlar el shield de los motores de corriente continua del Butiá (la señal PWM es generada a través de software), de modo que se re-utilizará esta funcionalidad para controlar los servomotores.
+
 
+
'''Configuración'''
+
 
+
Para utilizar los motores de ésta forma es necesario “hacer creer” a la placa que se ha conectado el shield de los motores de CC. Para esto se utilizan los “hackpines”, con la siguiente configuración.
+
 
+
Pin 09 - Gnd
+
Pin 10 - Gnd
+
Pin 11 - 5v
+
 
+
Los cables de datos se conectaron en los pines 6 y 7.
+
 
+
[[Archivo:conexion.jpg]]
+
 
+
De esta forma los motores pueden ser movidos con las funciones para mover los motores existentes en pybot (setMotorSpeed() y set2MotorSeed()).
+
 
+
 
+
== ''' Paleta de Turtlebots ''' ==
+
 
+
Se agregan los siguientes bloques de funciones para el programa Turtlebots:
+
 
+
* ''Bajar Grúa'': Enciende el motor de la torre para que se mueva en dirección horaria, de modo que la grúa baje, durante la cantidad de segundos indicada. Si es 0, el motor queda encendido hasta que se lo detenga.
+
* ''Subir Grúa'': Enciende el motor de la torre para que se mueva en dirección anti-horaria, de modo que la grúa suba, durante la cantidad de segundos indicada. Si es 0, el motor queda encendido hasta que se lo detenga.
+
* ''Detener Grúa'': Detiene el motor de la torre.
+
* ''Abrir Pinza'': Enciende el motor de la pinza durante 0.5 segundos y lo detiene, de modo que la pinza se abre.
+
* ''Cerrar Pinza'': Enciende el motor de la pinza durante 2 segundos y lo detiene, de modo que la pinza se cierra (esta diferencia de tiempos es debido a inconsistencias en el PWM, ver ‘Conclusiones’).
+
* ''Apretar Pinza'':Enciende el motor de la pinza de modo que esta se cierra, el motor continúa encendido, ejerciendo presión, hasta que se ejecute la función Abrir Pinza, o Cerrar Pinza.
+
 
+
Siguiendo con el concepto de integrar la Grúa al robot butiá, se decide agregar los bloques a la paleta Extra de Butiá.
+
 
+
[[Archivo:Paletabrazo.PNG]]
+
 
+
Ejemplo de programa básico (usado en el video demostrativo):
+
 
+
[[Archivo:Programabrazo.PNG]]
+
 
+
Video demostrativo:
+
 
+
* https://www.youtube.com/watch?v=ESTjCkeqaFY
+
  
 
== '''Conclusiones''' ==
 
== '''Conclusiones''' ==
  
Si bien el brazo robótico construido cumple con los requerimientos suficientes, mucho se puede mejorar todavía, especialmente en lo relacionado al control del mismo.
+
Si bien se logro construir un algoritmo el cual permite al butia realizar movimientos precisos, el mismo se puede mejorar para que el procesamiento de las distintas marcas no bloquee otras acciones del butia, este comportamiento se produce porque el calculo se realiza en el código de turtlebots y no en la placa. Lo mismo sucede en cuanto al giro y la velocidad, se tiene el comportamiento esperado pero tiene el mismo problema con el calculo.  
 
+
En nuestro proyecto, se buscó minimizar el costo todo lo posible para que el brazo fuera funcional, tal vez por un costo un poco mayor se podría construir un brazo con más grados de libertad. Pero esto presentaría nuevos retos, pues uno de los problemas en que incurrimos, en la etapa de codificación, fué que la señal PWM enviada a un motor se ve afectada cuando se intenta controlar un segundo motor al mismo tiempo. Por ejemplo: En nuestro modelo, la potencia de la pinza se ve disminuida cuando, al mismo tiempo, se sube la pinza.
+
Esto puede deberse a que el PWM es generado registrando eventos periódicos, y tal vez la presencia de más de uno de estos eventos afecte la performance del controlador, lo cual puede afectar la frecuencia de dichos eventos, afectando a su vez el ancho de la señal.
+
 
+
Por lo tanto, para agregar más grados de libertad, se deberá solucionar ese problema, modificando los módulos de usuario existentes, o bien creando un circuito PWM para controlar los motores, que sea manejable desde la placa USB4Butia.
+
 
+
Queda como trabajo pendiente la creación de una interfaz para conectar ambos motores a los hackpines sin depender de un protoboard.
+
 
+
 
+
== '''Fuentes citadas''' ==
+
  
https://es.wikipedia.org/wiki/Servomotor
+
Cabe recalcar que el costo para la realización del proyecto fue mínimo en comparación a las otras posibles soluciones(las mencionadas mas arriba), los únicos materiales utilizados son los que se detallan mas abajo. Por lo tanto es una funcionalidad que se puede agregar fácilmente.
https://en.wikipedia.org/wiki/DYNAMIXEL
+
https://es.wikipedia.org/wiki/Brazo_rob%C3%B3tico
+
  
 +
'''Materiales utilizados para el proyecto:'''
  
== '''Agradecimientos''' ==
+
* 1 Sensor de grises
Quedamos agradecidos con los integrantes del proyecto butiá, especialmente a los docentes:
+
* 1 Adhesivo con el diseño para la rueda
 +
* 1 Pieza de acrílico para colocar el sensor de grises cerca de la rueda
  
* Mercedes Marzoa
+
== '''Código''' ==
* Federico Andrade
+
* Rodrigo Dearmas
+
* Gonzalo Tejera
+
  
Sin sus consejos y sabiduría este proyecto no habría sido posible.
+
[[Media:ButiaEncoder.zip‎ ]]

Revisión actual del 11:30 25 nov 2015

Integrantes

  • Pablo Anzorena anzorena.fing@gmail.com
  • Sebastián Lorenzo sebastianlorenzo88@gmail.com
  • Manuel Laguarda lag.manuel@gmail.com
  • Bruno Olivera bruno.olivera.dev@gmail.com

Tutor

  • Gonzalo Tejera - gtejera@fing.edu.uy.

Introducción

El presente trabajo tiene como objetivo principal extender las capacidades del butiá en lo que a movimiento refiere, permitiendole realizar desplazamientos y giros mas precisos. Ademas de poder determinar que el butia se desplace una distancia a cierta velocidad.

Objetivo

El objetivo del proyecto es dotar al butiá con la capacidad de conocer en cada instante de tiempo, cual fue su desplazamiento. Hasta el momento para mover el butiá, existe un comando que setea el valor de potencia de los motores. Quedando a cargo del “programador” la lógica de movimiento. Por ejemplo para avanzar una cierta distancia, hay que accionar los motores por un cierto tiempo a una potencia determinada.


Motivación

Extender las capacidades del kit butiá, permitiendo tener más precisión en los movimientos. Vimos que existía un problema al momento de programar un movimiento con precisión solamente con la potencia de los motores y esperas, por eso es que nos interesó mejorar este aspecto.

Investigación

Posibles soluciones:

  • Algoritmo flujo óptico: Este algoritmo lo que hace es tomar datos del entorno mediante la cámara y comparar el desfazaje entre imágenes sucesivas.

La complejidad de este algoritmo esta dada por averiguar que pixeles entre imágenes consecutivas comparar y como determinar una distancia a partir de los cambios en los mismos. Para este caso el ambiente por el cual se mueve el robot es vasto y diverso lo cual resulta mas difícil el como interpretar las imágenes. Por otro lado creímos que la curva de aprendizaje sobre el algoritmo era grande como para terminar la solución en tiempo y forma.

  • Utilizar Mouse Óptico Como Sensor: La idea consiste en ir sensando con un mouse óptico ubicado en la parte inferior del butiá y de acuerdo a las coordenadas x e y determinar el movimiento.

En esta etapa decidimos descartar esta opción ya que para hacer el giro sobre el eje, las coordenadas x e y se mantienen.

  • Motores CC sin escobillas: Los motores de corriente continua tienen sensores de hall para determinar la posición en donde se encuentra la rueda mediante la medición de campos magnéticos, pudiendo mediante esto establecer la distancia recorrida y el sentido del giro.

Al momento de hacer el proyecto no habÍan estos motores, por lo que no pudimos probarlos, pero usamos el mismo tipo de algoritmo para la solución.

  • Sensor de Gris y Marcas en una Rueda: Esta idea consiste en marcar una rueda e ir sensando con un sensor de grises las marcas. Estas marcas las utilizamos para medir la distancia recorrida, dichas marcas se encuentran equidistantes en la rueda.

Solución

La solución elegida es la de utilizar el sensor de grises con la rueda marcada. Se decidió realizar esta implementación debido a que se podia realizar con un bajo costo, ademas el algoritmo realizado se puede utilizar para implementar la solución de Motores CC sin escobillas cambiando el sensado de los grises por el sensado de los campos magnéticos.

20150629 171226.jpg

20150629 170942.jpg

El diametro de la rueda es de 7.8 cm, por lo que el perimetro es d * Pi = 7.8 cm * Pi = 24.7 cm. En base al perimetro, se intento dividir la rueda en la mayor cantidad de divisiones posibles (para disminuir el error), tomando en cuenta que la lectura del sensor de grises pueda determinar un cambio de color (negro, blanco) correctamente. Para realizar esto se dividió la rueda en 24 partes iguales. El arco de cada parte es de 1.03 cm. Como el rango de valores entre el color blanco y el negro para el sensor de grises es bastante grande, siempre cuenta correctamente las marcas, el problema con la precisión esta dado por el ambiente sobre el cual se desplaza, a la vez de la mecánica de las ruedas. Suponiendo un ambiente optimo y las ruedas correctamente posicionadas, el margen de error es de +/- 1.03 cm.

El diseño de la rueda es el siguiente:


Imagen butia.png


Diseño pieza de acrilico:

Para poder ubicar el sensor de grises de una forma correcta, se modifico el diseño de la pieza de acrílico que se encarga de sostener la rueda. Media:PiezaSensor.svg



Para poder implementar el modulo de velocidad se calcula dinamicamente que distancia se desplaza por tiempo entre marca y marca. Si la velocidad es menor al rango objetivo (velocidad objetivo +/- (velocidad objetivo)*0.1) se aumenta la potencia de los motores y si es mayor se disminuye. Este comportamiento esta descripto en la siguiente maquina de estados.

Maq est.png

Posibles mejoras

Como posible trabajo futuro, se puede integrar el sensor de grises al motor que ya está en el butiá. Así como que el sensor esté conectado directamente con la placa y liberar un puerto. También aislar el sensor para reducir el ruido producido por la iluminación ambiente.

Paleta de Turtlebots

Se agregan los siguientes bloques de funciones para el programa Turtlebots en el codigo fuente butia.py:

  • Forward distance: Este bloque sirve para determinar que el butia avance cierta distancia con una cierta potencia configurable por el usuario.
  • Backward distance:Este bloque es igual al Forward distance distance solo que en vez de avanzar retrocede.
  • Left degree: Este bloque esta hecho para poder determinar cuantos grados gira a la izquierda el robot con una cierta potencia.
  • Right degree: Este bloque esta hecho para poder determinar cuantos grados gira a la derecha el robot con una cierta potencia.
  • Calibrate grey: Este bloque realiza un giro completo de la rueda modificada para poder determinar el valor del sensor de grises para los colores blanco y negro. Evitando que la calibracion la realice el usuario.
  • DistanceSpeed: Este bloque se utiliza para que el butia se desplace a una velocidad determinada en una distancia dada

Paleta encoder.png

Video demostrativo:

https://www.youtube.com/watch?v=MduiTJ4rryA&feature=youtu.be


Pruebas de velocidad

Para validar que el modulo de velocidad funciona correctamente, se graficaron las velocidades obtenidas a lo largo del tiempo para distintas velocidades.

Velocidad 7 cm/s

Vel7.PNG

Velocidad 10 cm/s

Vel10.PNG

Velocidad 13 cm/s

Vel13.PNG

Velocidad 16 cm/s

Vel16.PNG

Velocidad 19 cm/s

Vel19.PNG

Velocidad 22 cm/s

Vel22.PNG

En todos los casos se puede observar que la velocidad obtenida se encuentra fluctuando alrededor de la velocidad objetivo, este comportamiento se da porque el algoritmo funciona aumentando la velocidad hasta que se pasa cierto umbral superior y luego bajándola hasta que llega al umbral inferior.

Velocidad 22 cm/s Larga duración

Largo22.PNG

En este caso se configuro el butia para que vaya a una velocidad de 22 cm/s hasta que se le gaste la batería. Se calculo el promedio de todas las medidas y se mantiene en 21,6057. En la gráfica se puede observar que se mantiene fluctuando bien, mostrando algunos picos, hasta llegar al final de la gráfica en donde la baja batería ocasionó que las medidas se mantuvieran por debajo de la velocidad esperada. Subiendo la velocidad en todo momento hasta que la batería no brindo la potencia suficiente para llegar a la velocidad esperada.

Conclusiones

Si bien se logro construir un algoritmo el cual permite al butia realizar movimientos precisos, el mismo se puede mejorar para que el procesamiento de las distintas marcas no bloquee otras acciones del butia, este comportamiento se produce porque el calculo se realiza en el código de turtlebots y no en la placa. Lo mismo sucede en cuanto al giro y la velocidad, se tiene el comportamiento esperado pero tiene el mismo problema con el calculo.

Cabe recalcar que el costo para la realización del proyecto fue mínimo en comparación a las otras posibles soluciones(las mencionadas mas arriba), los únicos materiales utilizados son los que se detallan mas abajo. Por lo tanto es una funcionalidad que se puede agregar fácilmente.

Materiales utilizados para el proyecto:

  • 1 Sensor de grises
  • 1 Adhesivo con el diseño para la rueda
  • 1 Pieza de acrílico para colocar el sensor de grises cerca de la rueda

Código

Media:ButiaEncoder.zip‎