martes, 14 de abril de 2020

Proyecto descubriendo los principios básicos de LoRa


Principios básicos de LORA(LOng RAnge)


Objetivo: 

Aprender los principios básicos de LORA, y realizar un proyecto con la tarjeta ESP32 para IoT(Internet de las cosas) usando Arduino IDE. Aprenderemos a crear un simple LoRa Emisor(Sender) y LoRa Receptor(Receiver) con nuestro Heltec Lora stick.

Introduciendo LoRa: ¿Qué es LoRa? LoRa es una tecnología de comunicación inalámbrica que usa técnicas de modulación de radio, es decir a través de radiofrecuencias, y fue desarrollado por Semtech, concretamente con sus chips LoRa transceiver.


Esta técnica de modulación nos permite comunicaciones a larga distancia, pero transmitiendo pocos datos (por ejemplo, no es recomendado para video streaming), es decir poco ancho de banda, pero alta inmunidad a las interferencias lo cual minimiza el consumo. Entonces tenemos largas distancias, poco ancho de banda (pocos datos), resistente a la interferencia y bajo consumo de potencia.


Frecuencias LoRa

LoRa usa frecuencias libres (es decir sin licencias) del espectro de radiofrecuencias disponible, por lo tanto, depende del país o más concretamente de la zona de radiofrecuencias. Así nos encontramos que estás son:

   868 MHz para Europa

   915 MHz para Norte América

   433 MHz para Asia

Puesto que estas frecuencias son libres, cualquiera puede usarlas, o por el contrario obtener una licencia de una determinada frecuencia. Por país podemos ver la regulación existente en este enlace https://www.thethingsnetwork.org/docs/lorawan/frequencies-by-country.html
La regla del 1%

Otra característica nueva. En Europa la banda 868 MHz tiene un par de limitaciones. La primera es la potencia de emisión: 25 mW, que no nos preocupa mucho ya que los módulos que utilizaremos no llegan a tanta. Pero la segunda sí que es importante y debemos estar al loro para no violar la regulación.

Esta regla simplificadamente lo que dice es que no podemos transmitir más que el 1% del tiempo. Es decir, si por ejemplo enviar un paquete nos lleva 10 ms, tendremos que mantenernos calladitos por 990 ms.

Como norma general, no envíes más de una vez cada 3 minutos y cumplirás la reglamentación. Si quieres enviar más a menudo, existen calculadoras para obtener los tiempos entre envío mínimos. Para LoRaWAN (explicado más adelante), revisa la Fair access policy.

Los canales de LoRa

Dentro de las bandas del anterior apartado, se definen canales de frecuencias concretas. Es complicado recordar las frecuencias de todos los canales, pero normalmente las librerías que utilizaremos ya se encargan de facilitarnos esta tarea. Quédate con que para la banda de 868 MHz hay 10 canales y para la de 915 MHz hasta 64.

Aplicaciones LoRa

Las características que hemos visto de LoRa (largas distancias, y bajos consumos) es perfecto para aplicaciones con sensores de baja potencia para:

   Internet de las cosas (IoT)

   Domicilios inteligentes, domótica (Smart home)

   Comunicación M-M (Machine-to-machine)

   Y muchas más…

Por lo tanto, es una buena elección para el uso de sensores con baterías pequeñas o placas solares, para transmitir pequeñas cantidades de datos.




Hay que tener en cuenta que LoRa no es recomendable para proyectos que:

   Requieran un volumen alto transmisión de datos
  
   Que necesiten transmisión de altas frecuencias
   O para grandes redes de usuarios.


LoRa topología
Puedes utilizar Lora como:





-Comunicación Punto a Punto:

En la comunicación punto a punto se necesitan dos dispositivos LoRa emitiendo y recibiendo. Es decir, cada dispositivo debe ser emisor y receptor. Por ejemplo, entre dos tarjetas ESP32 equipadas con el chip LoRa en un entorno sin Wifi.




Con Wifi o Bluetooth solo puede establecer comunicación a corta distancia, sin embargo, con LoRa podemos transmitir a distancias superiores a 200 metros. De hecho y dependiendo del entorno y las características del chip LoRa, se han registrado distancias de 30Km. Es decir podríamos utilizar la tecnología LoRa allí donde no llega Wifi o Bluetooth y aunque hubiera cobertura 4G o 5G(necesitaríamos una tarjeta SIM para cada dispositivo), la tecnología LoRa es mucho más barata y con un consumo prácticamente insignificante. Luego podríamos ubicar sensores varios, en zonas diversas que envíen información con un gasto muy reducido.

-En red (LoRaWan)

También podemos crear una red basada en comunicación LoRa usando lo que se denomina LoRaWan



El protocolo LoRaWan utiliza la especificación de la tecnología estandarizada por LoRa Alliance, (LPWAN) Low Power Wide Area Nerwork (red de áreas extensa de baja potencia). Podemos explorar más información en LoRa Alliance y en The Things Network.




Para entenderlo, tenemos una red de sensores conectados por ejemplo a unas tarjetas ESP32 con LoRa(nos pueden medir geolocalización, medidas de caudal de gas, de agua, nivel de llenado de contenedores de basura, detección de fuego…), que trasmiten sus datos, utilizando LoRa hasta unos concentradores (hub) o Gateway, estos a su vez suben estos datos a servidores en Internet y entonces desde cualquier ordenador o móvil podemos acceder a esa información que está en Internet.

Hardware a utilizar

Vamos a utiliza la tarjeta ESP32 de la casa Heltec de la serie “Heltec Lora”, concretamente la Wireless Stick. Sus características principales son las siguiente:

- Una tarjeta con microprocessor: ESP32 (dual-core 32-bit MCU + ULP core), con chip LoRa SX1276/SX1278;
El chip ESP32, que ha sustituido al ESP8266, es un tipo de microprocesador con características específicas para realizar proyectos relacionados con IoT (internet de las cosas) y para ello viene ya con un gran número de prestaciones. Posee integrado, wifi y bluetooth además de soportar un gran número de protocolos de comunicación.


En esta comparativa con un Arduino Uno podemos ver algunas características más concretas.


Más información en: Heltec Wireless Stick, también podemos ver este video https://youtu.be/Mq1YhgS5VkY.


En la página de Heltec tenemos toda la información técnica de la tarjeta.

Technical Parameters

source
parameter
MCU
ESP32( 240MHz Tensilica LX6 dual-core + 1 ULP, 600 DMIPS, 520KB SRAM, Wi-Fi, dual mode Bluetooth)
LoRa chip
SX1276
LoRa bands
EU_433, CN_470_510, EU_863_870, US_902_928 four bands optional
LoRa maximum output power
18dB ± 2dB
Hardware resources
UART x 3; SPI x 2; I2C x 2; I2S x 1
12 – bits ADC; 8 – bits DAC
29 general GPIO
Display
0.49 inch 64*32 OLED display
FLASH
4MB(32M-bits) SPI FLASH
interface
Micro USB x 1; LoRa antenna interface(IPEX) x 1
Size
50.2 x 25.5 x 9.74 mm
USB to UART Bridge
CP2102
Battery Type
3.7V LithiumSH1.25 x 2
Battery detection circuit
External device power controlVext
Low power design
Deep Sleep 800uA


Y de consumo eléctrico:

Electrical characteristics


 Electrical characteristics
condition
Minimum
Typical
Maximum
Power Supply
USB powered≥500mA
4.7V
5V
6V 
Lithium powered≥250mA
3.3V
3.7V
4.2V
3.3Vpinpowered≥150mA
2.7V
3.3V
3.5V
5Vpinpowered≥500mA
4.7V
5V
6V
Power consumption(mA)
WIFI scan
115mA
WIFI AP
135mA
LoRa 10dB emission
50mA
LoRa 12dB emission
60mA
LoRa 15dB emission
110mA
LoRa 20dB emission
130mA
Output
3.3V pin output
500mA
5V pin output USB powered only
Equal to the input current
External device power control (Vext 3.3V


Desde documentos y recursos podemos descargar un diagrama de la configuración de la tarjeta como la siguiente:


También encontramos una guía de cómo preparar el IDE de Arduino para trabajar con esta tarjeta en el este sitio http://www.heltec.cn/wifi_kit_install/, aquí podemos elegir entre utilizar la instalación de GitHub (descargando e instalando) o a través de repositorio como indica en este sitio https://docs.heltec.cn/#/en/user_manual/how_to_install_esp32_Arduino


Pasos que hemos seguido

Paso1. Descargar Arduino ESP32 Support

Lo primero sería conseguir la última versión del Arduino IDE, en nuestro caso no es el último, pero no podemos actualizarlo, ya que los ordenadores del centro siguen una estricta política de actualizaciones utilizando repositorios seguros que se ubican en ordenadores de la Junta de Extremadura. A día de hoy 23 de enero de 2020, no tiene la última versión, pero hemos hecho pruebas y funciona correctamente.

Abrimos Arduino IDE, y hacemos click en Archivo->Peferencias->Ajustes







Introducir en Gestores adicionales de tarjeta una URL

Actualmente el último administrador de tarjeta se haya en la URL: https://docs.heltec.cn/download/package_heltec_esp32_index.json



Click en Herramientas->Placa->Gestor de tarjetas (Tools->Board:->Boards Manager...,) y buscar Heltec ESP32 en la lista, entonces hacer click en instalar







El código fuente de Heltec Heltec ESP series (ESP32 & ESP8266) framework está disponible aquí https://github.com/Heltec-Aaron-Lee/WiFi_Kit_series

Paso 2. Descargamos la librería Heltec ESP32 Library

Abrir Arduino IDE, entonces seleccionar programa->Incluir librería->Administrar biblioteca(Sketch->Include Library->Manage Libraries...) buscar Heltec ESP32 e instalar








El código fuente de la librería Heltec ESP32 está también disponible aquí: https://github.com/HelTecAutomation/Heltec_ESP32

Ejemplo
Esta sección es para ver si puedes programar con Arduino o no. Ahora hemos conectado el cable USB a la tarjeta Heltec ESP32, seleccionamos el puerto serie al cual está conectado la tarjeta.

Seleccionamos un ejemplo demo e intentamos compilarlo y subirlo a la tarjeta.

1. Ejecuta un ejemplo como “FactoryTest.ino”.

Selecciona la tarjeta que tienes conectada a tu ordenador y especifica el puerto serie. Por ejemplo, Wireless_Stick, COM3(si en tu PC es el COM3).




Y ahora vamos a seleccionar un programa ejemplo como FactoryTest.ino



Lo subimos pulsando la siguiente imagen.



Hemos observado como las dos tarjetas se comunican perfectamente y se envían datos mutuamente. El resultado se ve en los display de las tarjetas y las salidas serie de los ordenadores, donde hemos comprobado que todo funciona correctamente.

Bueno hemos instalado todo el hardware y funciona, ahora vamos a aprender funciones básicas de LoRa para realizar pequeños programas de comunicación


API DE LORA

Una vez instaladas todas las librerías necesarias para poder utilizar nuestra tarjeta, podemos acceder, y descargar a nuestro ordenador si queremos (no es necesario), al GitHub donde tenemos todas las librerías que hemos instalado incluido los ejemplos https://github.com/HelTecAutomation/Heltec_ESP32. Y más concretamente en este sitio podemos acceder a la API de LoRa donde nos explica cómo funciona https://github.com/HelTecAutomation/Heltec_ESP32/blob/master/src/lora/API.md.

A modo de resumen vamos a ver las funciones más importantes:

Nuestras librerías traen consigo una, elaborada por la propia casa para facilitarnos la inicialización de las funciones LoRa. Luego en un principio debemos incluir esta librería en nuestro código (heltec.h) de la siguiente manera:


         #include “heltec.h”
Esta librería ya se encarga de incluir las librerías necesarias de Lora (como lora.h) y el display.
En nuestro programa y dentro de la parte de la función “setup()” debemos inicializar LoRa de esta forma:


Heltec.begin(true /*DisplayEnable Enable*/, true /*Heltec.Heltec.Heltec.LoRa Disable*/, true /*Serial Enable*/, true /*PABOOST Enable*/, 868E6 /*long BAND*/);
Luego nuestros programas que utilizan LoRa siempre deben contener para inicializar la tarjeta el siguiente código:



Enviar un mensaje.
Iniciamos la secuencia de envío llamando a la siguiente función de la librería Lora.


     Lora.beginPacket();
Esta función devuelve 1 si todo va bien o 0 si hay un error.
A continuación, vamos a confeccionar el mensaje, escribiendo datos en el packet así:


     Lora.write(byte);
     Lora.write(buffer, length);
     Lora.print(byte);
     Lora.print(buffer, length);

Cualquiera de las cuatro funciones es válida, donde pone “byte” podemos introducir un texto, por ejemplo, Lora.write(“hola”), o si utilizamos las otras podemos poner un mensaje ya guardado especificando su longitud.
Por último, para enviar el mensaje debemos llamar a la función:


      Lora.endPacket();
Que devuelve 1 si ha tenido existo y 0 si hay algún error.

Un ejemplo sencillo de un programa que envíe constantemente un mensaje por Lora es el siguiente.


Recibir un mensaje.

Ahora vamos a ver cómo se recibe un mensaje Lora.

Leemos el tamaño del paquete enviado en el mensaje entrante usando:


     LoRa.parsePacket();
esta función devuelve un número entero (int) que es el tamaño en bytes del mensaje. Si cuando ejecutemos la función devuelve un tamaño igual a cero, entonces no hemos recibido ningún mensaje.

A continuación, tras verificar que hemos recibido algo, porque el tamaño es mayor que cero, comenzamos a leer carácter a carácter con la función:


      LoRa.read();
Teniendo en cuenta que cada vez que leemos desaparece del packet lo leído. Así que para saber cuándo acabar de leer hay que saber si hay disponible mensaje todavía. Utilizamos la siguiente función para ver si queda mensaje disponible:


      Lora.avilable();
Otra función interesante es obtener la potencia con la que se ha recibido el mensaje. Este parámetro se conoce como RSSI y se define así:
El indicador de fuerza de la señal recibida (RSSI por las siglas del inglés Received Signal Strength Indicator), es una escala de referencia (en relación a 1 mW) para medir el nivel de potencia de las señales recibidas por un dispositivo en las redes inalámbricas.


     LoRa.packetRssi();
Un ejemplo:



Recibir un mensaje utilizando una interrupción.

Hasta ahora para recibir un mensaje, debíamos estar constantemente sondeando la red LoRa y ocupados viendo si llegaba algo. Esto nos obligaba a bloquear el programa sin poder realizar otra cosa. Pero existe una forma de que podamos realizar una programación de la tarjeta aparte, por ejemplo obtener la temperatura a partir de un sensor de temperatura. Y a su vez, como en un segundo nivel, LoRa está sondeando para ver si recibe algo. Esto lo hace utilizando lo que se llama una interrupción del chip ESP32 utilizando la siguiente función:


                      LoRa.onReceive(onReceive);
Cuando reciba algo llamará a la función “sehaRecibido()”, o a la que pongamos nosotros entre los paréntesis. Luego debemos crearla:


                         Void onReceive(int packetSize) {
                             ….aqui dentro ponemos el código que lee el paquete                         }
Otra función importante es la que pone en modo de recepción a la tarjeta, para que esté escuchando:


       LoRa.receive();
Un ejemplo de un receptor de mensajes Lora utilizando interrupción es:



Ahora vamos a realizar distintas mediciones de comunicación entre dos tarjetas ESP32 utilizando LoRa e iremos incrementando las distancias.



Llegado hasta aquí y debido a la situación de la pandemia ocasionada por la enfermedad producida por el coronavirus covid-19, se suspendieron las clases.
Ya lo único que resta para finalizar el proyecto sería que una tarjeta ESP32 se le conectara un sensor (por ejemplo de temperatura y humedad DH11 o DHT22)siguiendo el manual https://randomnerdtutorials.com/esp32-dht11-dht22-temperature-humidity-sensor-arduino-ide/ ,  y realizar un programa para transmitir la información del sensor a distintas distancias y a través de LoRa hasta la tarjeta receptora.

Como conclusión el proyecto no se ha llegado a finalizar por completo, pero los alumnos han conocido LoRa, cómo trasmitir y recibir distintas información en áreas donde puede ser la única forma o por lo menos más fiable y económica. De hecho sabemos que se está empezando a utilizar en la agricultura junto con IoT.
A partir de aquí y en colaboración con Norbasky, para futuros proyectos se podría platear poder enviar telemetría (altura, presión, temperatura, posición...)utilizando LoRa. Se me ocurre como un medio idóneo ya que a la altura que puede alcanzar un prototipo de satélite no hay ni Wifi, Bluetooth, ni datos móviles. Pero esto sería en otro proyecto.


Bibliografía:


ESP32 Series DataSheet, Version 3.2, Espressif Systems
Kolban's Book on ESP32 (Neil Kolban)September 2018
https://github.com/HelTecAutomation/Heltec_ESP32
https://www.youtube.com/user/prevideos3gp/playlists
https://randomnerdtutorials.com
https://www.instructables.com/id/ESP32-Lora-Changing-Frequency/
https://randomnerdtutorials.com/esp32-dht11-dht22-temperature-humidity-sensor-arduino-ide/

lunes, 13 de abril de 2020

NORBA LANDERS - 2º ESO: actividades propuestas



Este año, lamentablemente, los alumnos de 2º ESO de Tecnología no hemos podido participar realizando una parte del proyecto “Norba Landers”. Se trataría del montaje y puesta en funcionamiento de vehículos motorizados.

Durante el curso 2019-2020 estamos en la Fase II del proyecto y nuestro cometido era añadir sensores a los vehículos y controlarlos de manera remota. En su lugar y para poder llevar a cabo la fase III el curso próximo hemos planteado tres actividades que nos permitirán conectar con el proyecto NorbaSky y que a su vez se pueden realizar desde casa. Con estas actividades se pretende reforzar los contenidos de la materia de Tecnología estudiados en 2º ESO durante el presente curso 2019-2020.

Os mostramos a continuación las tres propuestas:

domingo, 12 de abril de 2020

NORBA LANDERS - 2º ESO: resumen realizado durante el confinamiento

Con esta presentación Candela nos muestra la información seleccionada sobre los vehículos programados. Esperamos que os guste y que nos sirva para el curso próximo. Os añadiremos más trabajos de los alumnos de 2º ESO sobre los Norba Lander.