LoPy© & Pysense©

LoPy© & Pysense©

Programa en MicroPython para leer los sensores de la placa Pysense con el controlador LOPY4, ambos de la compañía Pycom. Por un lado, tenemos el controlador LoPy4 con la placa Pysense, ambos podemos verlos en la imagen siguiente:

Estructura del proyecto

El proyecto tiene la siguiente estructura:

README.md(este fichero): describe el proyecto en sí.

pymakr.conf: fichero de configuración para el plug-in Pymakr de Atom o Visual Code.

code/: Contiene los ficheros necesarios para la aplicación a desarrollar para el microcontrolador LoPy©

code/lib/: Directorio con todas librerías y módulos en MicroPython que pueden ser necesarios importar en nuestro programa.

code/boot.py: Programa ejecutado en primer lugar por el micro-controlador LoPy© cuando arranca. Básicamente configura los parámetros de comunicación por el puerto serie y llama a la ejecución del programa main.py

code/main.py: Fichero con todo el código fuente. (a continuación )

Explicación de código

Para estos dispositivos LoPy4 programaremos en MicroPython. Es una adaptación de Python muy usada para la programación de Microcontroladores, con gran parte de las funciones de Python. En la Referencia, dejaré enlaces a Python y MicroPython.

Todo el código se encuentra en el archivo main.py, un poco más abajo, y el proyecto completo con todas las librerías, también en el enlace a un repositorio gitlab, al final. A continuación la explicación paso a paso:

El programa lanza 6 Threats (Hilos) cada uno con un temporizador, para ir devolviendo indefinidamente, por consola los valores de los sensores de Pysense: Luminosidad, Temperatura, Humedad, Presión, Altitud y Acelerometro (pitch, roll , x, y, z). Peculiaridad: Si la luminosidad baja de un rango (50) el led se enciende en color rojo.

Para ello usamos las librerías: LIS2HH12, LTR329ALS01, MPL3115A2, SI7006A20, incorporadas en directorio lib.

En primer lugar, importamos la librerías necesarias y definimos las variables, cada variable corresponde a un tipo de sensor, en el caso concreto de Altitud y Presión se leen de la misma librería. Las 3 primeras son librerías propias de MicroPython, (pycom, time, _thread) y no es necesario incluirlas en el proyecto. Las siguientes son librerías especificas para la programación con LoPy4, se adjuntan en el proyecto git.

import pycom
import time
import _thread  

from pysense import Pysense
from SI7006A20 import SI7006A20
from LTR329ALS01 import LTR329ALS01
from MPL3115A2 import MPL3115A2,ALTITUDE,PRESSURE
from LIS2HH12 import LIS2HH12

# ----- -----  INICIALIZAR   ----- ----- 
py = Pysense()    # OBJETO A PLACA PYSENS
si = SI7006A20(py)  # SENSOR DE TEMPERATURA y Humedad
li = LTR329ALS01(py)  # SENSOR DE LUMINOSIDAD
mplA = MPL3115A2(py, mode=ALTITUDE) # SENSOR DE ALTITUDE
mplP = MPL3115A2(py, mode=PRESSURE) # SENSOR DE PRESION
acc = LIS2HH12(py)

time1 = time

Cada función lanzada tiene la estructura siguiente, se le pasa un valor que haga de timer para retardar la lectura, y se muestra la lectura del sensor correspondiente por la consola de pymakr.

def fun_LeerPresion(delay,id):
       while True:
              time1.sleep(delay)
              Presion= mplP.pressure()
              print(id + " Presion: " + str(Presion))  

Esta última función lee el valor de la luminosidad, como las anteriores y si esta es baja (50) enciende el led de LoPy4 en color RGB rojo.

def fun_LeerLuminosidad(delay,id):
       while True:
              time2.sleep(delay)
              luminosidad= li.light()
              
              print(id + " Luminosidad AZUL: %0.2f, ROJO: %0.2f" % (luminosidad[0],luminosidad[1]))
              if (luminosidad[0] < 50) and (luminosidad[1] < 50):
                       print("¡Luminosidad BAJA!")                       
                       pycom.heartbeat(False)
                       pycom.rgbled(0xff0000)                      
              else:
                     pycom.heartbeat(False) # VUELVO A OFF EL LED si se encendió

El código lanzado se encuentra en la parte final, lanzamos cada función en un hilo distinto, el objetivo es que si uno de los hilos no lee por algún motivo su sensor, este se interrumpe, pero los demás siguen funcionando indefinidamente. En la primera línea podemos ver además el apagado del Led nada más iniciarse el programa, en la siguientes se lanzan los hilos con un temporizador, para que no se acumulen las lecturas y sea mas fácilmente leídas en la consola pymakr.

# ----- -----  CUERPO DEL PROGRAMA   ----- -----

pycom.heartbeat(False)  #Apagar el led al principio
 
_thread.start_new_thread(fun_LeerLuminosidad,(13,"h1"))
_thread.start_new_thread(fun_LeerTemperatura,(15,"h2"))
_thread.start_new_thread(fun_LeerHumedad,(17,"h3"))
_thread.start_new_thread(fun_LeerPresion,(21,"h4"))
_thread.start_new_thread(fun_LeerAltitud,(23,"h5"))
_thread.start_new_thread(fun_LeerAccelerometro,(2,"h6"))

Código completo main.py


#       =====================================================
#       =========    main.py (1)             ================
#      =====================================================

import pycom
import time
import _thread  

from pysense import Pysense
from SI7006A20 import SI7006A20
from LTR329ALS01 import LTR329ALS01
from MPL3115A2 import MPL3115A2,ALTITUDE,PRESSURE
from LIS2HH12 import LIS2HH12

# ----- -----  Variables  ----- -----  
# ----- -----  INICIALIZAR   ----- ----- 
py = Pysense()    # OBJETO A PLACA PYSENS
si = SI7006A20(py)  # SENSOR DE TEMPERATURA y Humedad
li = LTR329ALS01(py)  # SENSOR DE LUMINOSIDAD
mplA = MPL3115A2(py, mode=ALTITUDE) # SENSOR DE ALTITUDE
mplP = MPL3115A2(py, mode=PRESSURE) # SENSOR DE PRESION
acc = LIS2HH12(py)

time1 = time
 
# ----- -----  FUNCIONES  ----- ----- 
def fun_LeerTemperatura(delay,id):
       while True:
              time1.sleep(delay)
              temperatura= si.temperature()
              print(id + " Temperatura: " + str(temperatura))             

def fun_LeerHumedad(delay,id):
       while True:
              time1.sleep(delay)
              Humedad= si.humidity()
              print(id + " Humedad: " + str(Humedad))    

def fun_LeerAltitud(delay,id):
       while True:
              time1.sleep(delay)
              Altitud= mplA.altitude()
              print(id + " Altitud: " + str(Altitud))    

def fun_LeerPresion(delay,id):
       while True:
              time1.sleep(delay)
              Presion= mplP.pressure()
              print(id + " Presion: " + str(Presion))    

def fun_LeerAccelerometro(delay,id):
       while True:
              time1.sleep(delay)
              vPitch= acc.pitch()
              vRoll= acc.roll()
              accel= acc.acceleration()
              print(id + " Pitch: " + str(vPitch) + "  - Roll: " + str(vRoll))
              print(id + " Acelormetro: x:%0.2f, y:%0.2f, z:%0.2f," % (accel[0],accel[1],accel[2]))  


def fun_LeerLuminosidad(delay,id):
       while True:
              time1.sleep(delay)
              luminosidad= li.light()
              
              print(id + " Luminosidad AZUL: %0.2f, ROJO: %0.2f" % (luminosidad[0],luminosidad[1]))
              if (luminosidad[0] < 50) and (luminosidad[1] < 50):
                       print("¡Luminosidad BAJA!")                       
                       pycom.heartbeat(False)
                       pycom.rgbled(0xff0000)                      
              else:
                     pycom.heartbeat(False) # VUELVO A OFF EL LED si se encendió
  

# ----- -----  CUERPO DEL PROGRAMA   ----- -----

pycom.heartbeat(False)  #Apagar el led al principio
 
_thread.start_new_thread(fun_LeerLuminosidad,(13,"h1"))
_thread.start_new_thread(fun_LeerTemperatura,(15,"h2"))
_thread.start_new_thread(fun_LeerHumedad,(17,"h3"))
_thread.start_new_thread(fun_LeerPresion,(21,"h4"))
_thread.start_new_thread(fun_LeerAltitud,(23,"h5"))
_thread.start_new_thread(fun_LeerAccelerometro,(2,"h6"))

Puesta en marcha

Se utilizará el editor Visual Code o Atom, en ambos es compatible la librería Pymakr.

En el caso de Visual Code la podemos instalar directamente desde su instalador de plugins buscándola como Pymakr.

Una vez instalado Pymakr y desde el raiz del proyecto, conectamos Lopy4 por usb y nos lo reconocerá inmediátemente.

NOTA: en el archivo pymakr.conf la primera linea: «address»: «COM4» sustituir COM4 por el puerto en el que detecte la librería pymakr al controlador LOPY4.

En visual Code aparecerá una barra de estado Pymakr en el pie del editor, con las comandos de Pymakr para ejecutar y cargar el código en Lopy4.

Mediante el comando RUN podemos lanzar el código a Lopy4. Mediante el comando Upload lanzamos el código a la memoria flash de Lopy4.

Para parar un proyecto en marcha:

CTRL-C: Stop any running code

CTRL-D: soft reset


PROYECTO COMPLETO

https://gitlab.com/alqaid/microcontrolador-lopy4

REFERENCIAS

Fabricante Pycom, microcontrolador LoPy4 y placa sensores Pysense: https://pycom.io/

Cómo programar en Python y posibilidad de practicar online: https://www.w3schools.com/python/

Referencia de MicroPython, (aunque la gran mayoría de funciones usadas para programar con microcontroladores, son soportadas por MicroPyton: https://docs.micropython.org/en/latest/

También podemos ver las funcionalidades distintas entre Micropython y Python: https://docs.micropython.org/en/latest/genrst/index.html

Web online entrenador Micropython: https://micropython.org/unicorn/

[Total_Soft_Poll id=»3″]

Deja una respuesta