Construir un dispositivo LoRa. Parte1.

LoRa4808

En estas entradas del blog vamos a hablar sobre como construir un dispositivo LoRa, un dispositivo realizado para el taller de IoT (internet de las cosas) de la asociación maker de Alicante. Veremos el hardware necesario para construirlo, las dos principales redes LoRaWAN a las que conectarlo, y las librerías y herramientas software necesarias para ello.

A continuación, después de una breve introducción sobre LoRa, hablaremos en esta primera entrada del blog sobre el hardware necesario para crear un dispositivo LoRa.

Si todavía no has oído hablar sobre LoRa, solo decir que es una tecnología de radio desarrollada por Semtech hace unos pocos años, que permite comunicaciones de bajo ancho de banda y larga distancia entre dispositivos que van a tener un consumo de batería mínimo.

Las redes LoRaWAN están pensandas para que un dispositivo alimentado por una pequeña batería, pueda mandar (y recibir) datos a través de una radio LoRa a una gateway/pasarela que los subirá a internet, pudiendo estar ese gateway situado a varios cientos de metros del dispositivo en un entorno urbano o a varios kilómetros en entornos no urbanos.

Ese gateway puede comunicarse con miles de dispositivos conectados a él, dispositivos que pueden recibir y mandar datos varias veces al día alimentados desde una pequeña batería (una pila AA por ejemplo), y esa batería en las condiciones anteriores tendrá una duración de meses o de varios años. Todo ello a coste cero de transmisiones entre dispositivos-gateway si usamos una red LoRaWAN propia (o una red de terceros con restricciones), o a un coste muy bajo si usamos una red LoRaWAN de terceros.

Resumiendo, LoRa nos permite tener dispositivos mandando datos varias veces al día a un gateway (que los subirá a internet) situado a cientos de metros o kilómetros del dispositivo, a un coste cero (gratuito) o muy bajo de las transmisiones, y esos dispositivos en las condiciones anteriores pueden tener una autonomía de varios años con una pequeña batería.

Para mi LoRa es la tecnología más interesante en esto del IoT ahora mismo y diría que va a tener un uso masivo en los próximos años. Si quieres aprender más sobre LoRa puedes hacer los cursos gratuitos de Semtech.

Vamos a ver el hardware necesario para constuir un dispositivo LoRa sencillo, mostrando para ello la placa LoRa que hemos construido para los talleres IoT de la Asociación Maker de Alicante (poner link a su web cuando esté lista).

LoRa4808

Placa LoRa para el taller IoT de la asociación Maker de Alicante.

En la imagen superior vemos una placa de pequeño tamaño, con los componentes electrónicos necesarios para crear un dispositivo que poder conectar a una red LoRaWAN, pensada para ser usada en una protoboard conectandola a distintos sensores, componentes electrónicos, etc..,  para poder aprender comunicandonos con las redes LoRaWAN el funcionamiento de estas.

Componentes_LoRa4808

Componentes placa LoRa para el taller IoT de la asociación Maker de Alicante.

En la imagen superior (click para mayor tamaño) podemos ver los componentes electrónicos que tiene la placa LoRa. Como mínimo todo dispositivo LoRa tendrá un microcontrolador (en rojo), una radio LoRa (en amarillo a la derecha) y luego puede tener otros componentes adicionales como sensores, reguladores de tensión, temporizadores, actuadores, etc… En este caso nuestra placa lleva un temporizador (en azul a la izquierda), componentes para proteger la entrada de alimentación (en verde a la izquierda), y conectores para interactuar con el mundo exterior (en morado en la parte superior e inferior).

El esquema de la placa es el siguiente:

Esquema

Esquema de la placa.

A continuación explicamos el esquema/circuito y la función de cada una de las partes (en el siguiente enlace se pueden encontrar el esquema y los ficheros de fabricación de la placa):

Circuito del microcontrolador.

Uno de los componentes más importantes a la hora de diseñar la placa LoRa es elegir el microcontrolador que vamos a usar, queremos que este cumpla los siguientes requisitos:

  • Ser compatible con Arduino. Estamos realizando una placa para un taller a nivel de aficionado, y esto hoy en día suele ser sinónimo de usar Arduino, por lo que eligiremos un microcontrolador compatible con el entorno de Arduino.
  • Ha de tener la suficiente memoria RAM y Flash para soportar el stack/librerías de LoRaWAN que vayamos a usar, a ser posible es conveniente que tenga también memoria EEPROM para unas variables (contadores) que pueden requerirse (en el caso de que se usen) ser guardadas en memoria no volátil por el stack de LoRaWAN.
  • Ha de tener un consumo bajo cuando está durmiendo, idealmente la batería de nuestro dispositivo ha de durar años.
  • Ha de ser barato, sencillo de usar y de soldar, ya que estamos realizando una placa de un taller de iniciación en una asociación sin ánimo de lucro y que fabricaremos en esta, por lo que si puede ser barata mejor.

Con todo lo anterior en mente elegimos un ATmega4808 soportado por Arduino. El circuito del microcontrolador con los componentes necesarios para su funcionamiento es el siguiente:

microcontrolador

Circuito del microcontrolador ATmega4808.

El circuito del microcontrolador es muy sencillo. Incluye el microcontrolador con sus condensadores de desacoplo en sus pines de alimentación, condensadores que reducen el ruido/emisiones en la línea de alimentación cuando el microcontrolador cambia su consumo de corriente debido a su funcionamiento interno. La alimentación analógica del microcontrolador la filtramos a través de una ferrita L1 y sus condensadores, reduciendo el ruido en la parte analógica en el caso de que usemos algún sensor de este tipo conectado a la placa.

No vemos un cristal en el circuito, ya que el microcontrolador no tiene pines para conectar un cristal/oscilador externo para generar su señal de reloj, el microcontrolador incluye un oscilador interno configurable a 16 o 20 MHz.

El microcontrolador mediante sus pines de entrada salida se comunica con: la radio LoRa por un bus SPI, con el timer, con los conectores de entrada/salida de la placa, y con un conector de programación en el que conectaremos un programador UPDI para descargar programas a la placa. A este conector también llevaremos uno de los puertos serie del microcontrolador que usaremos para poder comunicarnos con la placa desde el entorno de programación de Arduino.

Cicuito de la radio LoRa.

modulo_lora

Circuito módulo LoRa RFM95W.

Como radio LoRa vamos a usar un módulo RFM95, un módulo económico y que funciona muy bien, este se comunica por un bus SPI con el microcontrolador para enviar o recibir datos por radio.

La frecuencia de la radio LoRa que tenemos que usar depende de la región en la que estemos, para Europa (por normativa) debemos usar una radio de 868 MHz, a la hora de usar esta radio LoRa debemos respetar las restricciones que la normativa establece en cada país.

Añadimos el módulo de la radio con un par de condensadores cerca de sus pines de alimentación, que le proporcionan los picos de corriente que necesita para su funcionamiento reduciendo el ruido en la líneas de alimentación. Ruido debido a la inductancia de los cables y las pistas del PCB que encontramos entre los pines de alimentación del módulo y de nuestra fuente de energía la batería, mismo caso que los condensadores de desacoplo del microcontrolador.

Por último en el módulo de radio LoRa debemos de conectar a uno de sus pines una antena, podemos comprar una antena de 868 MHz (y añadir su conector al PCB) o simplemente usar un cable de longitud 8.2 cm soldado al pin de antena del módulo de radio.

Circuito del timer o temporizador.

El timer es un circuito integrado de muy bajo consumo que tiene dos funciones: despertar al microcontrolador de su estado dormido (donde el microcontrolador para su funcionamiento para reducir el consumo) cada X tiempo de manera periódica, y resetear al microcontrolador si el programa de este no funciona correctamente y se queda colgado.

Como timer vamos a usar un TPL5010, en la imagen inferior podemos ver su circuito.

temprizador

Temporizador TPL5010.

El funcionamiento del timer es sencillo, este genera un pulso periódico cada X segundos en su pin de Wake, el periodo puede estar comprendido entre 1 segundo y 2 horas y se configura con el valor de la resistencia R7 de la imagen superior.

Este pulso de Wake lo conectamos a uno de los pines del microcontrolador, de tal forma que cuando el microcontrolador esté durmiendo y reciba el pulso el microcontrolador se despierta mediante una interrupción.

Cuando el microcontrolador recibe el pulso del timer y se despierta, este ejecuta lo que programemos en él y en ese programa le tiene que mandar otro pulso de vuelta al timer conectando uno de los pines de salida del microcontrolador al pin de Done del timer. Si el timer no recibe el pulso de Done enviado desde el micrcocontrolador (es porque el programa no ha funcionado correctamente y se ha colgado) el timer resetea al microcontrolador, para ello conectamos el pin de RSTn del timer al pin de Reset del microcontrolador.

El timer es un circuito que para funcionar consume unos pocos nanoAmperios y nos permite que el microcontrolador se ponga a dormir en su estado de mínimo consumo (con todos sus relojes apagados) delegando la tarea de despertarlo al timer. Si no usasemos un timer podríamos poner a dormir al microcontrolador también, pero si queremos que este se despierte de manera periódica deberíamos dejar alguno de los relojes internos del microcontrolador funcionando, reloj interno que incrementaría notablemente el consumo de corriente del microcontrolador cuando duerme, en comparación con el caso anterior de apagar sus relojes internos y usar un timer externo para despertarse.

Luego el objeto de añadir un timer a la placa es alargar la vida de las baterías reduciendo al máximo el consumo de corriente del microcontrolador cuando este duerme. Durmiendo con sus relojes apagados el microcontrolador consume sobre 0.6-1 uA (no lo he mirado) y despierto sobre 1-4 mA (en función de la frecuencia del reloj).

Además el timer nos proporciona la función de watchdog sin incrementar el consumo de la placa.

Consumo

Consumo de la placa durmiendo.

En la imagen superior vemos el consumo de la placa de 0.94uA @ 3V cuando el microcontrolador y el módulo de radio duermen. Para máximizar la vida de la batería la mayor parte del tiempo la placa estará durmiendo, despertandose solo para realizar la tarea asignada y volver lo más rápido posible a dormirse.

Usando la combinación de ATmega4808 + RFM95W + TPL5010 podemos construir un dispositivo de bajo consumo, alimentandose desde un par de pilas AAA obtendrá una autonomía de varios años mandando datos al gateway varias veces al día.

Circuito de protección de la alimentación.

A la entrada de la batería encontramos el siguiente circuito:

Proteccion

Circuito para proteger la entrada de alimentación.

En el circuito anterior tenemos dos componentes principales: un fusible que se romperá y evitará que se caliente la batería si hacemos un cortocircuito en la placa, y un Mosfet de canal P que evita dañar la placa si la batería se conecta con la polaridad incorrecta. En lugar de un fusible podríamos usar un PTC (o fusible rearmable), pero es más didáctico tener que cambiar el fusible cada vez que se hace un corto.

Cuando seleccionamos componentes para añadir a nuestra placa de bajo consumo, tenemos que pensar que todo componente electrónico que tenga un pin conectado a la tierra del circuito va a consumir corriente. Por ejemplo el condensador C7 tendrá una pequeña corriente de fuga, está será del orden de nA-pA y podemos considerarla despreciable ya que apuntamos a un consumo de uA, pero con otros componentes como los Mosfets que usamos para proteger alimentaciones o encender cargas o partes de la electrónica, tenemos que prestar más atención a su datasheet para ver si sus corrientes de fuga pueden ser significativas para la vida de la batería. Por ejemplo una primera nota de aplicación: “AN90009 Leakage of small-signal MOSFETs” que ha salido googleando sobre el tema.

En esta placa la batería alimenta directamente a toda la electrónica, por lo que los componentes que usamos en la placa tenemos que asegurarnos que funcionan dentro del rango de alimentación de la batería.

Por ejemplo si usamos 2 pilas AAA para alimentar la placa, la tensión de la batería a lo largo de su vida útil va a variar entre 3.2V cuando esta nueva hasta a aproximadamente 2-2.3V antes de gastarse, por lo que si en nuestra placa añadimos un componente que su tensión de alimentación mínima es 2.7V, no estaremos usando toda la capacidad de la batería posiblemente acortando la autonomía del dispositivo.

Si nuestra placa para su funcionamiento necesita una alimentación mayor que el rango de tensiones que va a proporcionar la batería a lo largo de su vida (y nos interesa aprovechar esta al completo), deberemos añadir al circuito un pequeño regulador conmutado que proporcione a la placa un valor de tensión constante independientemente del valor de tensión de la batería. Este regulador para su propio funcionamiento tendrá un consumo de corriente, y en la placa anterior si en lugar de alimentar directamente toda la electrónica desde la batería usasemos un regulador conmutado, estaríamos hablando de un consumo de la placa durmiendo de 15-30 uA en lugar de 1 uA.

En esta entrada del blog se habla de distintos circuitos de alimentación para dispositivos conectados a baterías.

Conectores de entrada y salida de la placa.

Lo último del esquema que nos queda ver son los conectores de entrada y salida de la placa.

Conectores

Conectores entrada/salida de la placa.

Los conectores de entrada y salida de la placa conectan los pines del microcontrolador a la protoboard, no hay mucho que decir aquí, solo mencionar que cuando se tiene espacio y se pueda es conveniente que cada pin de señal tenga un pin de tierra a su lado, ya que de esta forma minimizamos el ruido y las emisiones.

Una señal eléctrica está formada por dos caminos, el de ida y el de vuelta, cuanto menor sea el área entre el camino de ida y el de vuelta, es decir más pegada este la tierra por la que vuelve la señal a su pista de ida, menor será el área que ambas forman y menor serán las emisiones y el ruido que crea o recibe esa señal.

Si solo tuvieramos un pin de tierra en la placa, todas las señales que salen de la protoboard volverían por el mismo pin de tierra, la corriente de cada señal generaría una pequeña caída de tensión (I*R del camino de vuelta común) en el voltaje que ve la carga conectada al resto de señales, ya que todas las señales comparten el camino de vuelta común, y ese camino de vuelta tiene una pequeña resistencia que genera una caída de tensión por cada corriente de señal que pasa por él.

El programador UPDI.

Para descargar un programa en la placa vamos a usar un programador UPDI externo, podemos usar uno comercial de Microchip (Atmel) pero el que más nos interesa usar es el SerialUPDI programmer que podemos comprar en tindie.

programador

Programador “SerialUPDI programmer” conectado al conector de programación de la placa.

La ventaja de usar este programador respecto a uno de Atmel, es que lleva un puerto serie que usaremos para que la placa mande y reciba mensajes al monitor serie del entorno de programación de Arduino.

El programador también tiene la capacidad de proporcionar alimentación a la placa, si lo hacemos debemos seleccionar la alimentación de 3V en el programador, ya que si seleccionamos la de 5V podemos dañar el módulo de radio.

La ventaja de usar un programador externo con la placa (a diferencia de muchos Arduinos que llevan el interfaz de programación en cada placa) es que es más barata de fabricar, ocupa menos espacio, y lo más importante reducimos el consumo de corriente ya que como hemos dicho todo componente que pongamos en el PCB conectado a tierra tendrá un consumo de corriente (despreciable o no).

Diseño del PCB.

Una vez visto el esquema del PCB y las consideraciones principales de este vamos a ver como rutear el PCB.

Lo primero es decidir el número de capas que necesita el PCB, este PCB lo podríamos hacer en 2 capas pero vamos a elegir 4 capas en su lugar, ya que la diferencia de coste es mínima y las propiedades eléctricas (ruido, emisiones, facilidad de ruteo, ancho de pistas con impedancia controlada, etc..) del PCB de 4 capas son mucho mejores que las del PCB de 2 capas.

A no ser que tengamos una restricción en costes muy alta hoy en día lo recomendable es irse directamente a mínimo un PCB de 4 capas.

El ruteado de cada capa del PCB sería el siguiente (click en la imagen para mayor tamaño):

ruteado

Capas del PCB.

En la imagen superior vemos que el ruteado del PCB es muy sencillo, la capa superior e inferior del PCB las usamos para las pistas de señal y para la pista de alimentación de la batería. Mientras que las dos caras interiores del PCB las usamos para poner un plano de tierra continuo en cada una de ellas.

No debemos preocuparnos de la longitud de las pistas de la señales, debido a que al ser un PCB muy pequeño estas son muy cortas y el tiempo de subida de las señales es alto. Como regla rápida (se puede ser más restrictivo) cuando la longitud de una pista en pulgadas es mayor que el tiempo de subida/bajada de la señal que va por ella en nanosegundos, debemos preocuparnos de como afecta la pista del PCB en la propagación de la señal, de su impedancia y de añadir terminaciones si se requieren.

Ruteamos el PCB con las siguientes consideraciones:

  • Los condensadores de desacoplo de cada integrado del circuito los colocaremos siempre lo más cerca posible de los pines de alimentación de estos, reduciendo la impedancia añadida por la pista del PCB entre el condensador y el pin de alimentación, usando pistas de alimentación lo más anchas posibles (o suficiente) para reducir la impedancia de estas. Siempre intentaremos añadir un condensador por cada pin de alimentación positivo.
  • Las dos capas interiores del PCB las usaremos como planos de tierra continuos. Las capas interiores del PCB están a 0.2 mm de las capas exteriores, por lo que al trazar un plano de tierra en cada una de ellas todas las pistas que van por las caras exteriores tendrán su retorno de señal justo debajo de ellas, minimizando el área que forma la señal con su retorno. No trazaremos pistas en estos planos interiores ni tendrán discontinuidades.
  • Siempre que una pista de señal cambia de la cara superior a la inferior usando una via, intentaremos añadir otra via de tierra junto a la via de la señal. Al cambiar la señal de cara exterior, el camino de vuelta de la señal que va por el plano de tierra que queda justo debajo de la pista también ha de cambiar de plano en las capas interiores, añadiendo una via justo al lado de la via de señal reducimos el area que tiene que hacer la corriente de vuelta para cambiar de un plano de tierra de las capas interiores al otro.
  • La pista de la antena ha de tener una impedancia característica de 50 Ohmios, aunque es una pista muy corta no cuesta nada cálcular el ancho de pista para la impedancia deseada. Para cálculos aproximados de impedancias, anchos de pista, etc.. podemos usar Saturn PCB que nos dirá el ancho de pista que necesitamos para la impedancia buscada según las características de nuestro PCB.
  • El PCB tiene su parte digital y analógica, se pueden hacer planos de tierra digitales y analógicos, pero lo que mejor resultado suele dar es hacer planos de tierra continuos en el PCB y colocar las distintas partes de la electrónica (analógica, digital, potencia, RF, etc..) cada una en una zona, sin que señales digitales por ejemplo atraviesen la zona donde están los componentes analógicos.

Una vez que ruteamos el PCB generamos los gerbers y lo mandamos a nuestro fabricante de PCBs favoritos (cómo pedir un PCB?).

Para los PCBs del Maker suelo usar JLCPCB seleccionando el envío barato por correos que suele tardar sobre 2 semanas, seleccionando que los gastos de aduanas sean pagados por JLCPCB y evitando cualquier trámite de aduanas que se tenga que hacer en España a través de Correos. Si tenemos mala suerte el paquete puede tardar meses en salir de la gestión de aduanas de Correos, para pedidos grandes o caros de PCBs siempre es aconsejable usar servicios como DHL o similares.

Soldadura del PCB.

Recibidos los PCBs y habiendo comprado sus componentes (aquí donde comparlos) lo siguiente es soldarlos. Para ello en el PCB todos los componentes llevan patitas y son fáciles de soldar, solo necesitaremos un soldador a ser posible con varias puntas, flux, pinzas y una buena luz como se explica en esta entrada del blog.

Si vamos a montar varias placas lo aconsejable es pedir un stencil con los PCBs y soldarlos con un horno de soldadura o con un “hot plate”, lo que reducirá notablemente el proceso de montar las placas como también se explica en esta otra entrada del blog.

Una vez soldada las placas es importante limpiarlas, ya que si dejamos residuos estos pueden incrementar el consumo de corriente cuando el PCB está durmiendo, estamos hablando de un consumo por debajo del microamperio.

Placas

Placas listas para el taller de IoT de MakerAlc.

Todos los ficheros para fabricar las placas se encuentran en el repositorio de la asociación, hasta donde hemos probado la placa todo ha funcionado correctamente, pero nos quedan cosas por probar de ella. Así que si te animas a montar la placa que hemos puesto aquí QUIZÁS funcione correctamente, verifica antes de mandarla a fabricar los archivos y que todo esté correcto :). Pongo lo anterior porque el tiempo que saco para estas cosas es muy poco y la placa se diseñó, ruteó y envío a fabricar en un par de ratos, por lo que no pude repasar todo como debería haberlo hecho.

El coste de pedir y montar las placas para un pedido de 10 unidades está sobre los 15-20 euros por unidad, por lo que es una alternativa a las placas comerciales y en una asociación Maker siempre es mejor hacer electrónica que consumirla ;).

En las siguientes entradas del blog recopilaré el trabajo que han hecho los asistentes al taller de IoT de la Asociación Maker de Alicante explicando: cómo instalar las herramientas software necesarias para usar la placa y el programador con las librerías de Arduino, cómo configurar y usar el microcontrolador para poder usarlo en la placa, cómo conectar la placa LoRa a las redes LoRaWAN de Helium y de The Thing Networks, mandaremos los datos de un sensor de temperatura y humedad a estas redes y los visualizaremos en la consola de Cayenne mydevices.

Si ha leído hasta aquí gracias, espero que haya sido útil.