Diferencia entre revisiones de «Seguidor de Luz»

De Proyecto Butiá
Saltar a: navegación, buscar
(Trabajo a futuro)
(Posibles Fallas)
 
(No se muestran 35 ediciones intermedias del mismo usuario)
Línea 1: Línea 1:
 
==Introducción==
 
==Introducción==
  
 +
En la actualidad el cambio de la matriz energética es sin lugar a dudas un temas considerados en la agenda de la mayoría de los países del mundo. En el caso de Uruguay se está  desarrollando un [http://www.eficienciaenergetica.gub.uy/documents/20182/22654/Plan_Nacional_de_Eficiencia_Energetica.pdf/2e21a8c6-3492-4c7d-b6ba-33b138632a85 Plan de Nacional de Eficiencia Energética] que culminaría en 2024 donde se considera la energía solar térmica como una de las herramientas para lograr este objetivo. En este contexto resulta importante que se promueve la educación acerca del conocimiento y uso de las fuentes renovables de energía.
 +
 +
Este proyecto se presenta un modelo a escala de un mecanismo capaz de orientar los paneles solares de forma que éstos permanezcan aproximadamente perpendiculares a los rayos solares optimizando el rendimiento de estos.
 +
 +
Está dirigido a estudiantes de últimos años de nivel escolar o primeros de secundaria.
 +
 +
También se podría contextualizar el modelo relacionando al movimiento de lagunas de las plantas como el girasol que poseen el comportamiento de seguir movimiento del sol al transcurrir el día.
 +
 +
[[Archivo:IntroSeguidorLuz.jpg]]
  
 
==Materiales==
 
==Materiales==
Línea 8: Línea 17:
 
*Carton sueco o similares.
 
*Carton sueco o similares.
 
*Cinta Aisladora.
 
*Cinta Aisladora.
 +
*Cinta doble faz
 
*XO/pc con TurtleBots y el Plugin de Butia.
 
*XO/pc con TurtleBots y el Plugin de Butia.
  
Línea 13: Línea 23:
 
Paso 1: Retirar la rueda derecha del Kit butia junto a su soporte.  
 
Paso 1: Retirar la rueda derecha del Kit butia junto a su soporte.  
  
Paso 2: Unir dos barras de encastre en forma de L y con dos tornillos fijarlas a la rueda.
+
[[Archivo:Paso1SeguidorLuz.jpg]]
 +
 
 +
 
 +
Paso 2: Recortar un soporte auxiliar para el motor y con cinta aisladora unirlo al la rueda izquierda del robot Butiá.
 +
 
 +
[[Archivo:Paso2SeguidorLuz.jpg]]
 +
 
 +
 
 +
Paso 3: Tomar dos barras de encastre unidas en forma de L y con la ayuda de otra barra de encastre fijarla con dos tornillos a la rueda del segundo motor.
 +
 
 +
[[Archivo:Paso3SeguidorLuz.jpg]]
  
Paso 3: Recortar un soporte auxiliar para el motor y con cinta aisladora unirlo al la rueda izquierda del robot Butiá.
 
  
 
Paso 4:  Cortar un Cuadrado de cartón de 25 cm de lado, realizarle los agujeros correspondientes y con dos tornillos unirlo a la L de barras de encastre.
 
Paso 4:  Cortar un Cuadrado de cartón de 25 cm de lado, realizarle los agujeros correspondientes y con dos tornillos unirlo a la L de barras de encastre.
  
Paso 5:  Tomar media esfera de espuma Plast y pegar con cinta doble faz los cuatro sensores de luz.
+
[[Archivo:Paso4SeguidorLuz.jpg]]
 +
 
 +
 
 +
Paso 5:  Tomar media esfera de espuma Plast y pegarla al cuadrado de cartón.
 +
 
 +
[[Archivo:Paso5SeguidorLuz.jpg]]
 +
 
 +
 
 +
Paso 6:  Pegar con cinta doble faz los cuatro sensores de luz a la media esfera de espuma Plast.
 +
 
 +
[[Archivo:Paso6SeguidorLuz.jpg]]
 +
 
 +
 
 +
Paso 7: Conectar los sensores a los respectivo puertos de la placa Butiá.  En este ejemplo : 1 - Arriba, 3 - Abajo, 5 - Izquierda, 6 Derecha.
 +
 
 +
[[Archivo:Paso7SeguidorLuz.jpg]]
 +
 
  
Paso 6: Conectar los sensores a los respectivo puertos de la placa Butiá.  En este ejemplo : 1 - Arriba, 3 - Abajo, 5 - Izquierda, 6 Derecha.
+
Paso 8: Cortar dos soportes en cartón para que el robot Butiá permanezca en forma vertical y unirlos al robot.
  
Paso 7: Recortar dos soportes en cartón para que el robot Butiá permanezca en forma vertical y unirlos al robot.
+
[[Archivo:Paso8SeguidorLuz.jpg]]
  
 
==Implementación==
 
==Implementación==
  
 +
La implementación del seguidor de luz fue realizada en Python utilizando la librería [[PyBot]]. El codigo comleto esta disponible en el siguiente [https://github.com/fabriciog09/seguidor-luz.git Repositorio].
  
 +
 +
 +
'''Comencemos!!!'''
  
 
Importamos la librería PyBot  
 
Importamos la librería PyBot  
Línea 47: Línea 86:
 
         return (num1 - tolerance)>num2
 
         return (num1 - tolerance)>num2
  
Para eliminar las diferencias en las mediciones de los sensores provocadas por la luz ambiente almacenamos
+
Definimos las funciones que retornan el valor de cada uno de los 4 sensores de luz.
el valor inicial y para eliminar errores de medición de los sensores utilizamos el promedio de 10 mediciones
+
 
 +
Para eliminar las diferencias en las mediciones de los sensores provocadas por la luz ambiente almacenamos el valor inicial de cada sensor y para eliminar errores de medición de los sensores utilizamos el promedio de 10 mediciones.
  
 
     acumulateTopLight = 0
 
     acumulateTopLight = 0
Línea 54: Línea 94:
 
         acumulateTopLight += robot.getLight(1)  
 
         acumulateTopLight += robot.getLight(1)  
 
     topLight_init = acumulateTopLight / 10
 
     topLight_init = acumulateTopLight / 10
 
+
        acumulateBottomLight = 0
    acumulateBottomLight = 0
+
 
     for i in range(10):
 
     for i in range(10):
 
         acumulateBottomLight += robot.getLight(3)
 
         acumulateBottomLight += robot.getLight(3)
 
     bottomLight_init =  acumulateBottomLight / 10
 
     bottomLight_init =  acumulateBottomLight / 10
 
+
        acumulateLeftLight = 0
    acumulateLeftLight = 0
+
 
     for i in range(10):
 
     for i in range(10):
 
         acumulateLeftLight += robot.getLight(5)
 
         acumulateLeftLight += robot.getLight(5)
 
     leftLight_init = acumulateLeftLight / 10
 
     leftLight_init = acumulateLeftLight / 10
 
+
        acumulateRightLight = 0
    acumulateRightLight = 0
+
 
     for i in range(10):
 
     for i in range(10):
 
         acumulateRightLight += robot.getLight(6)
 
         acumulateRightLight += robot.getLight(6)
     rightLight_init = acumulateRightLight /10
+
     rightLight_init = acumulateRightLight /10  
 
+
    # Importamos la librería time
+
    import time
+
 
+
    # Importamos la librería PyBot
+
    import sys
+
    sys.path.insert(0, '/home/olpc/Activities/TurtleBots.activity/plugins/butia')
+
 
+
    sys.path.insert(0, "/usr/share/sugar/activities/TurtleBots.activity/plugins/butia")
+
 
+
    # Importamos el módulo de pybot
+
    from pybot import usb4butia
+
 
+
    # Generamos una instancia de la placa USB4Butia
+
    robot = usb4butia.USB4Butia()
+
    robot.refresh()
+
 
+
 
+
    # Definimos una comprador de dos números aplicando un tolerancia
+
    tolerance = 5000
+
    def isBigger(num1, num2, tolerance):
+
        return (num1 - tolerance)>num2
+
 
+
 
+
    Para eliminar las diferencias en las mediciones de los sensores provocadas por la luz ambiente almacenamos
+
    el valor inicial y para eliminar errores de medición de los sensores utilizamos el promedio de 10 mediciones
+
 
+
        acumulateTopLight = 0
+
        for i in range(10):
+
            acumulateTopLight += robot.getLight(1)
+
        topLight_init = acumulateTopLight / 10
+
 
+
        acumulateBottomLight = 0
+
        for i in range(10):
+
            acumulateBottomLight += robot.getLight(3)
+
        bottomLight_init =  acumulateBottomLight / 10
+
 
+
        acumulateLeftLight = 0
+
        for i in range(10):
+
            acumulateLeftLight += robot.getLight(5)
+
        leftLight_init = acumulateLeftLight / 10
+
 
+
        acumulateRightLight = 0
+
        for i in range(10):
+
            acumulateRightLight += robot.getLight(6)
+
        rightLight_init = acumulateRightLight /10
+
 
+
 
+
    # Para evitar errores en los sensores cada vez que tomamos un promedio de 10 mediciones
+
    # y luego le restamos el valor inicial
+
  
 
     def getTopLight():
 
     def getTopLight():
Línea 131: Línea 118:
 
             acumulateBottomLight += robot.getLight(3)
 
             acumulateBottomLight += robot.getLight(3)
 
         return (acumulateBottomLight/10) - bottomLight_init
 
         return (acumulateBottomLight/10) - bottomLight_init
 
  
 
     def getLeftLight():
 
     def getLeftLight():
Línea 138: Línea 124:
 
             acumulateLeftLight += robot.getLight(5)
 
             acumulateLeftLight += robot.getLight(5)
 
         return (acumulateLeftLight/10) - leftLight_init
 
         return (acumulateLeftLight/10) - leftLight_init
 
  
 
     def getRightLight():
 
     def getRightLight():
Línea 146: Línea 131:
 
         return (acumulateRightLight/10) - rightLight_init
 
         return (acumulateRightLight/10) - rightLight_init
  
 +
Definimos las funciones para el desplazamiento de los motores.
 +
Debido a que el movimiento hacia arriba exige mayor esfuerzo del motor aumentamos el valor de la velocidad de este
  
 
    # Definimos las funciones para el desplazamiento de los motores.
 
 
     def goRight():
 
     def goRight():
 
         robot.set2MotorSpeed(1, 200, 0, 0)
 
         robot.set2MotorSpeed(1, 200, 0, 0)
Línea 157: Línea 142:
 
         print("goLeft")
 
         print("goLeft")
  
    # Debido a que el movimiento hacia arriba exige mayor esfuerzo
 
    # del moto aumentamos el valor de la velocidad de este
 
 
     def goUp():
 
     def goUp():
 
         robot.set2MotorSpeed(0, 0, 0, 500)
 
         robot.set2MotorSpeed(0, 0, 0, 500)
Línea 164: Línea 147:
  
 
     def goDown():
 
     def goDown():
         robot.set2MotorSpeed(0, 0, 1, 100)
+
         robot.set2MotorSpeed(0, 0, 1, 200)
 
         print("goDown")
 
         print("goDown")
  
Línea 170: Línea 153:
 
         robot.set2MotorSpeed(0, 0, 0, 0)
 
         robot.set2MotorSpeed(0, 0, 0, 0)
 
         print("stop")
 
         print("stop")
 
+
En cada interacción comparamos las mediciones de los sensores y desplazamos los motores según corresponda
    # En cada interacción comparamos las mediciones de los sensores y desplazamos los motores según corresponda
+
Primero se realiza el movimiento vertical y cuando la ubicación vertical es las deseada se realiza el desplazamiento horizontal
    # Primero se realiza el movimiento vertical y cuando la ubicación vertical es las deseada se realiza el  
+
*Si el valor del sensor superior es mayor al inferior se realiza un movimiento hacia arriba
    # desplazamiento horizontal
+
*Si el valor del sensor inferior es mayor al superior se realiza un movimiento hacia abajo
 +
*Si el valor del sensor izquierdo es mayor al derecho se realiza un movimiento hacia la izquierda
 +
*Si el valor del sensor derecho es mayor al izquierdo se realiza un movimiento hacia la derecha
 +
   
 
     while (True):
 
     while (True):
 
         topLight = getTopLight()
 
         topLight = getTopLight()
Línea 179: Línea 165:
 
         bottomLight = getBottomLight()
 
         bottomLight = getBottomLight()
 
         print( "Botom Light", bottomLight)
 
         print( "Botom Light", bottomLight)
        # Si el valor del sensor superior es mayor al inferior se realiza un movimiento hacia arriba
+
         if isBigger(topLight,bottomLight, tolerance) :  
         if isBigger(topLight,bottomLight, tolerance * 2) :  
+
 
             goUp()
 
             goUp()
        # Si el valor del sensor inferior es mayor al superior se realiza un movimiento hacia abajo
+
         elif isBigger(bottomLight,topLight, tolerance) :  
         elif isBigger(bottomLight,topLight, 0) :  
+
 
             goDown()
 
             goDown()
 
         else:
 
         else:
Línea 190: Línea 174:
 
             rightLight = getRightLight()
 
             rightLight = getRightLight()
 
             print( "Right Light", rightLight)
 
             print( "Right Light", rightLight)
            # Si el valor del sensor izquierdo es mayor al derecho se realiza un movimiento hacia la izquierda
 
 
             if isBigger(leftLight,rightLight, tolerance) :  
 
             if isBigger(leftLight,rightLight, tolerance) :  
 
                 goLeft()
 
                 goLeft()
            # Si el valor del sensor derecho es mayor al izquierdo se realiza un movimiento hacia la derecha
 
 
             elif isBigger(rightLight,leftLight, tolerance) :  
 
             elif isBigger(rightLight,leftLight, tolerance) :  
 
                 goRight()
 
                 goRight()
        # Cada movimiento se realiza con un segundo de duración
 
 
         time.sleep(1)
 
         time.sleep(1)
 
         stop()
 
         stop()
 
         time.sleep(1)
 
         time.sleep(1)
 +
 +
==En acción==
 +
En el siguiente video se puede ver como elrobot sigue el flash de la camara.
 +
 +
<br>
 +
 +
<youtube>FYwNQolM58A</youtube> <br>
 +
 +
[[Archivo:GaleriaSeguidorLuz1.jpg]]
 +
 +
<br>
 +
 +
[[Archivo:GaleriaSeguidorLuz2.jpg]]
 +
 +
==Posibles Fallas==
 +
 +
 +
'''El seguidor nunca llega a una posición de equilibrio'''
 +
 +
Esto puede suceder cuando la tolerancia almacenada en la variable ''"tolerance"'' es muy pequeña y nunca se considera que la luz está llegando en igual medida a los 4 sensores. La solución es aumentar el valor de la tolerancia.
 +
 +
 +
'''El seguidor no logra realizar un desplazamiento hacia arriba'''
 +
 +
Debido a que el movimiento hacia arriba es contra la gravedad requiere más esfuerzo del motor por lo tanto una solución a este problema es aumentar la velocidad asignada al motor en la función ''goUp''.
 +
 +
 +
'''El desplazamiento hacia abajo es muy rápido'''
 +
 +
Debido a que el movimiento hacia abajo es en el mismo sentido que la gravedad requiere menos esfuerzo del motor por lo tanto una solución a este problema es disminuir la velocidad asignada al motor en la función ''goDown''.

Revisión actual del 18:42 28 jun 2020

Introducción

En la actualidad el cambio de la matriz energética es sin lugar a dudas un temas considerados en la agenda de la mayoría de los países del mundo. En el caso de Uruguay se está desarrollando un Plan de Nacional de Eficiencia Energética que culminaría en 2024 donde se considera la energía solar térmica como una de las herramientas para lograr este objetivo. En este contexto resulta importante que se promueve la educación acerca del conocimiento y uso de las fuentes renovables de energía.

Este proyecto se presenta un modelo a escala de un mecanismo capaz de orientar los paneles solares de forma que éstos permanezcan aproximadamente perpendiculares a los rayos solares optimizando el rendimiento de estos.

Está dirigido a estudiantes de últimos años de nivel escolar o primeros de secundaria.

También se podría contextualizar el modelo relacionando al movimiento de lagunas de las plantas como el girasol que poseen el comportamiento de seguir movimiento del sol al transcurrir el día.

IntroSeguidorLuz.jpg

Materiales

  • Kit Robótico Butia.
  • 4 sensores de luz.
  • Esfera de Espuma Plast.
  • Carton sueco o similares.
  • Cinta Aisladora.
  • Cinta doble faz
  • XO/pc con TurtleBots y el Plugin de Butia.

Construcción

Paso 1: Retirar la rueda derecha del Kit butia junto a su soporte.

Paso1SeguidorLuz.jpg


Paso 2: Recortar un soporte auxiliar para el motor y con cinta aisladora unirlo al la rueda izquierda del robot Butiá.

Paso2SeguidorLuz.jpg


Paso 3: Tomar dos barras de encastre unidas en forma de L y con la ayuda de otra barra de encastre fijarla con dos tornillos a la rueda del segundo motor.

Paso3SeguidorLuz.jpg


Paso 4: Cortar un Cuadrado de cartón de 25 cm de lado, realizarle los agujeros correspondientes y con dos tornillos unirlo a la L de barras de encastre.

Paso4SeguidorLuz.jpg


Paso 5: Tomar media esfera de espuma Plast y pegarla al cuadrado de cartón.

Paso5SeguidorLuz.jpg


Paso 6: Pegar con cinta doble faz los cuatro sensores de luz a la media esfera de espuma Plast.

Paso6SeguidorLuz.jpg


Paso 7: Conectar los sensores a los respectivo puertos de la placa Butiá. En este ejemplo : 1 - Arriba, 3 - Abajo, 5 - Izquierda, 6 Derecha.

Paso7SeguidorLuz.jpg


Paso 8: Cortar dos soportes en cartón para que el robot Butiá permanezca en forma vertical y unirlos al robot.

Paso8SeguidorLuz.jpg

Implementación

La implementación del seguidor de luz fue realizada en Python utilizando la librería PyBot. El codigo comleto esta disponible en el siguiente Repositorio.


Comencemos!!!

Importamos la librería PyBot

   sys.path.insert(0, '/home/olpc/Activities/TurtleBots.activity/plugins/butia')
   sys.path.insert(0, "/usr/share/sugar/activities/TurtleBots.activity/plugins/butia")

Importamos el módulo de pybot

   from pybot import usb4butia

Generamos una instancia de la placa USB4Butia

   robot = usb4butia.USB4Butia()
   robot.refresh()


Definimos una comprador de dos números aplicando un tolerancia

   tolerance = 5000
   def isBigger(num1, num2, tolerance):
       return (num1 - tolerance)>num2

Definimos las funciones que retornan el valor de cada uno de los 4 sensores de luz.

Para eliminar las diferencias en las mediciones de los sensores provocadas por la luz ambiente almacenamos el valor inicial de cada sensor y para eliminar errores de medición de los sensores utilizamos el promedio de 10 mediciones.

   acumulateTopLight = 0
   for i in range(10):
       acumulateTopLight += robot.getLight(1) 
   topLight_init = acumulateTopLight / 10
       acumulateBottomLight = 0
   for i in range(10):
       acumulateBottomLight += robot.getLight(3)
   bottomLight_init =  acumulateBottomLight / 10
       acumulateLeftLight = 0
   for i in range(10):
       acumulateLeftLight += robot.getLight(5)
   leftLight_init = acumulateLeftLight / 10
       acumulateRightLight = 0
   for i in range(10):
       acumulateRightLight += robot.getLight(6)
   rightLight_init = acumulateRightLight /10    
   def getTopLight():
       acumulateTopLight = 0
       for i in range(10):
           acumulateTopLight += robot.getLight(1) 
       return (acumulateTopLight/10) - topLight_init
   def getBottomLight():
       acumulateBottomLight = 0
       for i in range(10):
           acumulateBottomLight += robot.getLight(3)
       return (acumulateBottomLight/10) - bottomLight_init
   def getLeftLight():
       acumulateLeftLight = 0
       for i in range(10):
           acumulateLeftLight += robot.getLight(5)
       return (acumulateLeftLight/10) - leftLight_init
   def getRightLight():
       acumulateRightLight = 0
       for i in range(10):
           acumulateRightLight += robot.getLight(6)
       return (acumulateRightLight/10) - rightLight_init

Definimos las funciones para el desplazamiento de los motores. Debido a que el movimiento hacia arriba exige mayor esfuerzo del motor aumentamos el valor de la velocidad de este

   def goRight():
       robot.set2MotorSpeed(1, 200, 0, 0)
       print("goRight")
   def goLeft():
       robot.set2MotorSpeed(0, 200, 0, 0)
       print("goLeft")
   def goUp():
       robot.set2MotorSpeed(0, 0, 0, 500)
       print("goUp")
   def goDown():
       robot.set2MotorSpeed(0, 0, 1, 200)
       print("goDown")
   def stop():
       robot.set2MotorSpeed(0, 0, 0, 0)
       print("stop")

En cada interacción comparamos las mediciones de los sensores y desplazamos los motores según corresponda Primero se realiza el movimiento vertical y cuando la ubicación vertical es las deseada se realiza el desplazamiento horizontal

  • Si el valor del sensor superior es mayor al inferior se realiza un movimiento hacia arriba
  • Si el valor del sensor inferior es mayor al superior se realiza un movimiento hacia abajo
  • Si el valor del sensor izquierdo es mayor al derecho se realiza un movimiento hacia la izquierda
  • Si el valor del sensor derecho es mayor al izquierdo se realiza un movimiento hacia la derecha
   while (True):
       topLight = getTopLight()
       print( "Top Light",topLight)
       bottomLight = getBottomLight()
       print( "Botom Light", bottomLight)
       if isBigger(topLight,bottomLight, tolerance) : 
           goUp()
       elif isBigger(bottomLight,topLight, tolerance) : 
           goDown()
       else:
           leftLight = getLeftLight()
           print( "Left Light",leftLight)
           rightLight = getRightLight()
           print( "Right Light", rightLight)
           if isBigger(leftLight,rightLight, tolerance) : 
               goLeft()
           elif isBigger(rightLight,leftLight, tolerance) : 
               goRight()
       time.sleep(1)
       stop()
       time.sleep(1)

En acción

En el siguiente video se puede ver como elrobot sigue el flash de la camara.



GaleriaSeguidorLuz1.jpg


GaleriaSeguidorLuz2.jpg

Posibles Fallas

El seguidor nunca llega a una posición de equilibrio

Esto puede suceder cuando la tolerancia almacenada en la variable "tolerance" es muy pequeña y nunca se considera que la luz está llegando en igual medida a los 4 sensores. La solución es aumentar el valor de la tolerancia.


El seguidor no logra realizar un desplazamiento hacia arriba

Debido a que el movimiento hacia arriba es contra la gravedad requiere más esfuerzo del motor por lo tanto una solución a este problema es aumentar la velocidad asignada al motor en la función goUp.


El desplazamiento hacia abajo es muy rápido

Debido a que el movimiento hacia abajo es en el mismo sentido que la gravedad requiere menos esfuerzo del motor por lo tanto una solución a este problema es disminuir la velocidad asignada al motor en la función goDown.