En la definición de objetivos seleccionamos la comunicación con Lora por ser la selección más adecuada como red inalámbrica de largo alcance y bajo consumo. Para las pruebas he comprado ujn par de transceivers de diferentes fabricantes, pero empezaremos las pruebas con el RF95W, en este enlace está el datasheet.
Para poder utilizar el RFM95W he utilizado otra PCB como la que he utilizado para el ESP8266 a la que le he quitado las resistencias. Como antena he utilizado u trozo de cable de 82 milímetros y lo he soldado directamente en el pad correspondiente. El resto de pines lo he conectado inicialmente de la misma forma que se detalla en este artículo.
RFM95 | LMIC | ESP8266 pins | Notes |
DIO5 | Leave open | ||
DIO4 | Leave open | ||
DIO3 | Leave open | ||
DIO2 | .dio[2] | D3, GPIO3 | Does not work standalone as D3 is used to select boot=up. Only works with UART connected and flashing. |
Leave open! | |||
DIO1 | .dio[1] | D2, GPIO4 | Must be connected |
DIO0 | .dio[0] | D1, GPIO5 | Must be connected |
MISO | D6, GPIO12 | ||
MOSI | D7, GPIO13 | ||
SCK | D5, GPIO14, CLK | ||
NSS | .nss | D8, GPIO15 | |
RESET | .rst | D0, GPIO16 | No interrupt support (which is OK) |
Son un montón de pines, de hecho no nos solo nos quedan libres en el ESP8266 el GPIO2. Nuestro dispositivo debe de llevar un sensor de ultrasonidos (dos pines), un relé reed para interactuar con el usuario y me gustaría poner un led y un sensor de temperatura para hacer la compensación de temperatura del medidor de ultrasonidos.
Es un problema tener solo un GPIO libre y necesitar cuatro, pero es un problema que vamos a dejar para más adelante.
Una vez hecho el cableado vamos a por el software, la librería que utilizaremos es la LMIC de IBM. hay un poco de lío, varias versiones, algunas funcionan en el entorno Arduino y otras noy algunas no funcionan con ESP8266, despues de la búsqueda esta es la librería que he utilizado.
Está muy bien documentada, en la carpeta de la librería hay un fichero settings.h en el que le configuraremos la frecuencia en función de la zona en la que lo utilizemos y alguna cosilla más. Otra cosa importante es el pin mapping, que lo configuraremos en nuestro programa:
lmic_pinmap lmic_pins = {
.nss = 15,
.rxtx = LMIC_UNUSED_PIN,
.rst = LMIC_UNUSED_PIN, //Porque lo hemos conectado al GPIO16 que está conectado al reset
.dio = {5, 4, LMIC_UNUSED_PIN},
};
Ya nos hemos ahorrado el primer pin (aunque el GPIO3 no es un gran ahorro al ser el pin RX del ESP8266), el motivo de que no usemos el DIO2 es porque solo se usa en la modulación FSK y nosotros vamos a utilizar Lora.
Generalmente si hay algún problema en el cableado la librería da un error, por lo que os sugiero que si el programa os da un error repaseis el cableado.
La librería tiene dos ejemplos OTAA y ABP. En principio se recomienda OTAA, la diferencia entre una y otra es que en OTAA, a partir de los identificadores de red y de aplicación de LoraWan el nodo hará el Join en la red y recibirá una respuesta para calcular las claves de encriptación de la red y de la aplicación, es mas segura que la segunda opción, ABP. Con ABP las claves se escriben directamente en el programa lo cual lo convierte en un sistema menos seguro y menos flexible. Yo he empezado con ABP.
¿Porqué ABP para empezar?
Mi primera prueba fué con OTAA , sin ningún problema (más adelante explico como hacerlo con TTN) pero siguiendo el ejemplo cada vez que duermo el circuito y lo despierto tengo que hacer un Join en la red. Esto es un problema, no necesariamente las respuestas son rápidas y no es una opción recomendada, de hecho es una mala práctica. Hasta que no me familiarice voy a utilizar ABP, aunque ya tengo un plan para acabar pasando a OTAA.
Así que lo que os recomiendo es que utilicéis inicialmente el ejemplo de ABP si tenéis pensado hacer un nodo que funcione con deep sleep. El ejemplo de la librería, como pasa habitualmente, es el mejor punto de partida.
En este punto tenemos el ESP funcionando con el modo de deep sleep, la radio RFM95W conectada físicamente y hemos probado la librería LMIC con el ejemplo ABP. Ya estamos intercambiando información con la red.