pocitacova mys ryba reprobedny letadlo cip
header

Cómo hacer un Arduino inalámbrico de bajo consumo

27 de junio de 2016

Lang: cs en de es

Cómo hacer un Arduino inalámbrico con extra bajo consumo.

Cómo hacer un Arduino inalámbrico de bajo consumo

Warduxere es un dispositivo programable para comunicación inalámbrica con un bitrate bajo, consumo extra bajo y la opción de alimentarlo con batería. Es una base pensada para usarse en el desarrollo de proyectos inalámbricos.

Especificaciones

  • Alimentación: DC 3,4–6 V
  • Frecuencia de la comunicación inalámbrica: 433 MHz
  • Alcance: hasta 900 m
  • Consumo: modo de marcha 5 mA; emisión 10 mA; sueño 10 µA
  • Dimensiones: 25 × 25 mm
  • Interfaz de comunicación: línea serie, 3,3 V
  • El desarrollo es posible en cualquier SO y también en PC que no sean x86

Modelos 3D de los dispositivos:
Warduxere

Motivación

Hoy en día los dispositivos modernos incluyen periféricos inalámbricos y la conexión inalámbrica se está convirtiendo poco a poco en algo habitual.
Estos dispositivos siempre constan de un microprocesador y una parte inalámbrica.
Ya he usado soluciones comerciales para estos fines, pero no quedé satisfecho y ni siquiera en internet encontré una adecuada que cumpliera todos mis requisitos. Por eso decidí crear una plataforma que se pueda reutilizar en la implementación de distintos proyectos inalámbricos.

Criterios para el dispositivo:

  • El compilador debe ser: gratuito, multiplataforma, sin condiciones, soportado por el fabricante del procesador.
  • Herramientas de desarrollo multiplataforma (IDE).
  • Hardware y software estandarizados para programar.
  • Fácil de desarrollar: lenguaje de programación de alto nivel, disponibilidad de bibliotecas y dispositivos enchufables.
  • Solución abierta.
  • Un dispositivo pequeño.
  • Equipo eficiente energéticamente que dure mucho con batería.
  • Medición precisa de la batería.
  • Comunicación inalámbrica.
  • La posibilidad de conectar diversos periféricos.
  • Trabajo estándar con la memoria = DMA.
  • Gran número de componentes básicos y una gran comunidad de usuarios.

Arduino inalámbrico

Elección del hardware

Existe un proyecto Arduino muy famoso y exitoso. Arduino se basa en procesadores de 8 bits de la empresa Atmel, que participa activamente en el desarrollo de herramientas de código abierto para desarrolladores, por ejemplo el compilador GNU GCC para AVR. Estas herramientas de desarrollo funcionan en todos los sistemas operativos de distintas arquitecturas de ordenador. Para Arduino está desarrollado el Arduino IDE, que es multiplataforma. Ni siquiera hace falta un hardware especial, un programador de software especial ni un controlador especial para programar. Todo el dispositivo se puede arrancar y usar de inmediato, sin ninguna instalación. Arduino usa como lenguaje principal de programación Wiring, que es similar a C++. Sigue haciendo falta saber programar, pero gracias a Wiring se puede aprender fácilmente con Arduino. (Puede encontrar información más detallada sobre Arduino en PE / AR 2009/1).

Por eso decidí usar Arduino como base y así los microcontroladores AVR de Atmel. En un principio pensé que usaría componentes de prototipo existentes, pero resultó que tenía que desarrollar mi propio dispositivo. Porque por ejemplo la versión Arduino Pro Mini contiene un diodo de alimentación y un estabilizador derrochador, que juntos crean un consumo grande y totalmente innecesario, y por tanto no sirve para la alimentación prolongada con batería.
He creado un dispositivo con un procesador AVR que es eficiente energéticamente y además contiene varios componentes más. Al mismo tiempo el dispositivo es compatible con Arduino. Y como la parte más importante es la parte inalámbrica, llamé al dispositivo Warduxere.
Gracias a la compatibilidad con Arduino puede usar herramientas de desarrollo ya existentes y probadas: Arduino IDE, bibliotecas, etc. También se pueden conectar muchos otros dispositivos que ya tienen sus bibliotecas API.

Procesador

El dispositivo lo controla un microprocesador ATmega 328P en encapsulado TQFP. En el microprocesador hay cargado un bootloader, que sirve para cargar el programa cómodamente por línea serie. Para la conexión al PC lo mejor es usar un convertidor USB-UART, que además alimenta el Warduxere. Uso un convertidor con el chip FTDI 232RL o el chip CP2102. También se puede conectar el dispositivo al puerto paralelo del ordenador, pero hay que proporcionar la alimentación y usar un convertidor de tensión, por ejemplo en conexión con el chip MAX232 (ya descrito en el artículo de PE / AR 2010/12).
Tras conectar Warduxere al convertidor USB no hace falta más electrónica y se puede conectar Warduxere al PC y usarlo junto con Arduino IDE. La conexión se ve en la imagen de abajo; es necesario conectar correctamente RX con TX.
conexión del arduino inalámbrico
En ordenadores como Raspberry PI y Banana PI se puede conectar Warduxere directamente, sin electrónica adicional, porque estos ordenadores tienen líneas serie hardware con niveles de tensión de 3,3 V.
Para subir el programa al procesador está el botón «upload» en el entorno de desarrollo. Primero el IDE reinicia el procesador usando la salida DTR (RTS). Tras el reset se arranca el bootloader y espera un rato a que se cargue el programa.

Parte inalámbrica

En el mercado se pueden comprar distintos chips inalámbricos, normalmente incluso como módulos ya preparados. Algunos comunican solo en un sentido, algunos pueden usar también WiFi, ZigBee u otros estándares. Difieren en la frecuencia y en la interfaz por la que se pueden conectar a un microprocesador. Elegí el chip SI4432. Este chip puede transmitir y recibir. Con el procesador se comunica por el bus SPI y trabaja en frecuencias 240–930 MHz, tiene un gran alcance y una potencia de salida de +20 dBm. También tiene una tensión de alimentación baja de 1,8 a 3,6 V y un consumo bajo. He comprado el módulo pequeño DRF4432F20 ya preparado, que contiene el chip SI4432 y está listo para trabajar a la frecuencia de 433 MHz.
Para Arduino hay bibliotecas para trabajar con este chip, concretamente la biblioteca Radiohead RF22.

Parámetros del módulo inalámbrico DRF4432F20 con chip SI4432:

  • Tensión de alimentación: 1,8 ~ 3,6 V
  • Frecuencia de trabajo: 433 MHz o 868 MHz
  • Modulación: FSK / GFSK / OOK
  • Interfaz SPI
  • Sensibilidad: −121 dBm
  • Potencia de salida: +20 dBm
  • Velocidad de transferencia: 0,123 ~ 256 kbps
  • RSSI digital
  • Temporizador de despertar
  • 64 bytes de FIFOs TX / RX
  • Regulador de tensión integrado
  • Frequency hopping
  • Sensor de temperatura y ADC de 8 bits
  • Temperatura de funcionamiento: −20 °C ~ +60 °C
  • consumo en espera: ≤ 1 µA

Los pines del módulo inalámbrico están conectados a las entradas de la CPU 6→16, 7→15, 8→17, 9→14, 10→32. El módulo se alimenta con una tensión estabilizada de 3,3 V. Los pines 11 y 12 del módulo inalámbrico están conectados a masa. El pin 5 está conectado a 3,3 V.

La disposición de los pines del módulo DRF4432F20, véase la figura:

El módulo inalámbrico se suministra incluyendo la antena, que se conecta al pin n.º 13.

Construcción

Todo está elegido pensando en el tamaño y sobre todo en la eficiencia energética. Por eso el procesador y todo el dispositivo funcionan a 3,3 voltios y la frecuencia de reloj del procesador está puesta a 8 MHz. Se usa un oscilador interno, lo que ahorra espacio en la PCB y la estructura es más sencilla. Se prevé usar una celda LiPo como fuente de alimentación. Estas baterías tienen una tensión adecuada, gran capacidad y pequeño tamaño. Además, a diferencia de las baterías NiMH, no sufren autodescarga, lo que es importante en el uso a largo plazo. Tras la carga, la tensión en la celda LiPo alcanza 4,2 V (según el tipo de batería y el ajuste del programa de carga). Al descargarse, estas baterías siguen manteniendo una tensión de trabajo suficiente, que no debería bajar de 3,3 V. Cuando baja a 3,6 V conviene volver a cargar la batería. Por eso estos parámetros hacen de las celdas LiPo una candidata adecuada como fuente de energía.
Para reducir el consumo, Warduxere no tiene diodo de alimentación.

El dispositivo incluye el estabilizador de tensión MCP1700, que tiene un consumo propio pequeño. La elección del estabilizador define la tensión de entrada, que puede ser como máximo 6 V. Concretamente es el estabilizador MCP1700T-3302/TT.
Estos son sus valores según la documentación:

  1. corriente de reposo típica de 1,6 µA
  2. corriente de salida máxima de 250 mA
  3. caída de 178 mV a 250 mA
Aunque la caída de tensión en el estabilizador es pequeña, hay que tenerla en cuenta. En caso de pérdida máxima es necesario cambiar la batería como muy tarde a 3,47 V, de lo contrario el procesador y el módulo inalámbrico tendrían menos de los 3,3 V requeridos. Sin embargo el consumo del dispositivo depende también de otros componentes y suele ser mucho menor que el máximo posible, así que la pérdida en el estabilizador probablemente será menor.

El dispositivo incluye el amplificador operacional MCP6042, que según la documentación tiene una corriente de reposo de 600 nA. Si la eficiencia energética no es crucial, se puede sustituir el amplificador operacional por un tipo más barato y asequible, por ejemplo MCP6002 o MCP6L02.

Para un consumo bajo hay que elegir resistencias grandes (R5, R6) en el divisor para la medición de la batería, por ejemplo de valor 1 MΩ.

Placa de circuito impreso

La PCB está diseñada para poder montarse sin problema incluso en casa. Por eso los componentes usados van en encapsulados SMD 1206 grandes, colocados de forma que se puedan soldar con facilidad. Es una placa de circuito impreso de doble cara con taladros metalizados. En una placa bien fabricada sin máscara antisoldante se puede soldar fácilmente incluso un procesador en encapsulado TQFP. El módulo inalámbrico hay que soldarlo el último; el orden de soldadura de los demás componentes no importa.

Montaje y puesta en marcha

La puesta en marcha del dispositivo consta de los siguientes pasos:

  1. Soldadura de la CPU y del resto de componentes salvo el módulo inalámbrico
  2. Grabado del bootloader
  3. Prueba con el programa de parpadeo
  4. Soldadura del módulo inalámbrico
  5. Prueba del módulo inalámbrico

Al montar los componentes, empiece soldando el procesador (IC2), que colocará en su sitio con precisión y con la orientación correcta usando las pinzas, y suelde primero dos pines en esquinas opuestas. Tras comprobar que la posición es precisa, suelde el resto de pines del procesador. Luego suelde el estabilizador U1. Después suelde fácilmente el resto de componentes de este lado de la PCB. Solo asegúrese de orientar bien el LED. En el otro lado empiece soldando el amplificador operacional (OP1). Cuide la orientación correcta y proceda como con el procesador. Luego suelde el resto de componentes de este lado de la placa.

Bootloader

Lo más fácil es soldar el procesador con el bootloader ya preprogramado, pero también se puede programar el procesador después de soldarlo a la placa, porque hay pads preparados para ello.

Para subir el bootloader hace falta un programador de hardware y de software. Por ejemplo se puede usar el puerto paralelo del ordenador y el software pony-STK200 y Avrdude. Cada uno usará probablemente los recursos de programación con los que ya esté familiarizado. Como programador se puede usar el propio Arduino. Se carga el software ArduinoISP en Arduino y, tras conectar ambos dispositivos, se lanza el grabado del bootloader directamente desde Arduino IDE.
Las salidas del programador hay que conectarlas a los pads de K1. Los pines de la CPU van de izquierda a derecha: 15 MOSI, 16 MISO, 17 SCK. Estos pines hay que conectarlos al programador. En el caso de Arduino ISP son D11 (MOSI), D12 (MISO), D13 (SCK). Luego hay que conectar la alimentación (mientras el estabilizador no esté soldado se puede usar un pad de la resistencia R4) y GND. El último es el reset del procesador, que se puede conectar por ejemplo al pad del condensador C3. Como reset en Arduino ISP se usa el pin D10.
Ahora se puede grabar el bootloader.

El cargador es el bootloader estándar de Arduino. El procesador está configurado a 8 MHz con oscilación interna.
Antes de grabar el bootloader hay que seleccionar en Arduino IDE el tipo correcto de dispositivo, que define sus parámetros. Simplemente añada el siguiente texto al archivo arduino/hardware/arduino/boards.txt:

atmega328Wb.name=Warduxere by www.xeres.cz
atmega328Wb.upload.protocol=stk500
atmega328Wb.upload.maximum_size=30720
atmega328Wb.upload.speed=57600
atmega328Wb.bootloader.low_fuses=0xE2
atmega328Wb.bootloader.high_fuses=0xDA
atmega328Wb.bootloader.extended_fuses=0x05
atmega328Wb.bootloader.path=atmega
atmega328Wb.bootloader.file=warduxere.hex
atmega328Wb.bootloader.unlock_bits=0x3F
atmega328Wb.bootloader.lock_bits=0x0F
atmega328Wb.build.mcu=atmega328p
atmega328Wb.build.f_cpu=8000000L
atmega328Wb.build.core=arduino
atmega328Wb.build.variant=standard

Estos valores definen toda la configuración del dispositivo para subir el bootloader, los ajustes del procesador (lock bits), la compilación del programa y la velocidad de subida. El archivo warduxere.hex con el bootloader incluyendo un software de LED parpadeante está disponible para descargar en el sitio web de la revista PE / AR.

Tras conectar el convertidor USB-UART a los pines del conector P1 se pueden subir programas al procesador y probar la funcionalidad básica con el parpadeo del LED. Las salidas van en este orden: GND, NONE, VCC, TX, RX, DTR. Recuerde que es necesario conectar el RX de la CPU al TX del convertidor y viceversa.

Por último suelde el módulo inalámbrico. Por si acaso pegue una tira de cinta aislante en la parte inferior del módulo inalámbrico. Suéldelo de modo que toque el procesador; eso reducirá considerablemente la eventual tensión mecánica en las uniones. Luego verifique el funcionamiento subiendo un programa de ejemplo. Si por ejemplo el módulo está mal soldado, el programa de ejemplo enviará por la línea serie un mensaje sobre el problema con su inicialización.

Ahora tiene el dispositivo listo y puede empezar a crear redes de sensores inalámbricas sencillas, pero también amplias…

Consumo

He medido de forma aproximada el consumo del módulo inalámbrico a una tensión de 3,3 V; los valores fueron los siguientes: 9 mA al emitir; 1,4 mA en reposo, según la documentación 1 µA en sueño. El procesador a 5 V en sueño consume 0,16 mA; tras apagar el ADC consume aproximadamente 1–2 µA. Tras optimizar para minimizar el consumo y al conectar solo el procesador y el módulo inalámbrico medí un consumo de 3,4 mA en reposo y durante el sueño del procesador y del módulo inalámbrico medí 5 µA. Aproximadamente, si se desprecian otros efectos, Warduxere podría funcionar varios años alimentado por una sola celda LiPo, como las de los teléfonos. En el uso real, sin embargo, depende sobre todo de la aplicación concreta, y eso determina la autonomía real con batería. Otra cosa son los periféricos conectados, que tienen que estar dormidos o ser eficientes.

En un Warduxere completamente montado en estado de sueño medí un consumo de menos de 10 µA.

Aplicación

Para trabajar con el dispositivo basta con descargar de internet Arduino IDE, que contiene todo lo necesario. Solo hay que descomprimir el archivo descargado, no hace falta instalar nada. Además de todos los componentes necesarios, Arduino IDE contiene numerosos ejemplos para el propio Arduino y para las placas de expansión habituales (shields).
Warduxere lleva montada una resistencia y pads de soldadura para el bus one-wire, un divisor resistivo para medir la batería, resistencia y pads de soldadura para un sensor analógico (p. ej. fotorresistencia).
Saqué otros pines del procesador a pads de soldadura, para poder conectar al procesador otros dispositivos y periféricos, como distintos tipos de pantallas LCD, Ethernet, módulos GSM.

El uso concreto dependerá sobre todo de las ideas de cada diseñador. A continuación describo las propiedades que distinguen a Warduxere de Arduino. Antes de usar las bibliotecas mencionadas en los párrafos siguientes hay que descomprimirlas en la carpeta arduino/libraries/.


LED

La funcionalidad del dispositivo se puede probar simplemente con el parpadeo del LED. Normalmente el diodo está en el pin 17 de la CPU (en Arduino se suele denominar D13), pero ahí está conectado el módulo inalámbrico. Por eso en Warduxere el LED está conectado al pin 32 (Arduino D2). Véase el programa de ejemplo Blink.

Comunicación inalámbrica

Las opciones de configuración de la comunicación inalámbrica son amplias. Lo más importante es que la comunicación está orientada a paquetes con un búfer de 64 bytes. La velocidad de comunicación puede ser de 0,123 hasta 256 kbps, la modulación: FSK, GFSK y OOK. Se pueden operar incluso redes MESH extensas.
Como ejemplo mencionaré solo el tipo de comunicación más básico, con el que se puede verificar el funcionamiento del dispositivo. Véase los programas de ejemplo Wireless-client y Wireless-server. Otros ejemplos prácticos de uso del chip SI4432 con la biblioteca Radiohead RF22 los encontrará el lector en la documentación en internet.

Modos de bajo consumo

El procesador puede hacer varios modos de ahorro de energía. El modo más ahorrador de la CPU es el sueño; para ahorrar aún más hay que poner a dormir también partes individuales del procesador, como el convertidor A/D y el Brown-out Detector (BOD). A menudo basta con dejar solo el watchdog en marcha, que generará una interrupción para despertar. También hay que poner a dormir los periféricos; en este caso solo el módulo inalámbrico, que puede dormir bajo demanda. Al suspender el sistema hay que poner a dormir por tanto el propio procesador y la parte inalámbrica. Para un programa sencillo de suspensión véase el programa Sleep.
Quien no quiera ocuparse él mismo de los ajustes de suspensión puede usar la biblioteca Low-Power.

Batería

El estado de la batería se detecta midiendo la tensión 1:1 en el divisor con el convertidor analógico de la CPU. Con esta conexión se mide la tensión real en la batería. Así se pueden conectar por ejemplo tres celdas NiMH o una celda LiPo u otros tipos de baterías y, ajustando el software, lograr fácilmente las necesidades concretas de supervisión del estado de la batería. En otras soluciones, donde la tensión de la batería se mide detrás del estabilizador de 3 V, había un problema sobre todo al usar baterías LiPo.
Para una medición precisa de la batería también hace falta un divisor preciso. Las series básicas de resistencias tienen una tolerancia de ±5 %, pero esas resistencias menos precisas pueden causar un error considerable de medición. En el peor caso hasta ±10 %, lo que en una batería de 4 V significa 0,4 V, y eso es realmente mucho. Eso es inaceptable al medir el estado de baterías LiPo. Por eso es necesario usar resistencias precisas con tolerancia de ±0,1 %, eventualmente ±0,5 %. Pero no hace falta comprar de inmediato resistencias precisas caras. Para fabricar varios dispositivos basta con medir las resistencias y formar pares de igual valor.
La medición de la tensión de la batería está en el programa de ejemplo Battery.

Puede probar fácilmente todos los ejemplos si tiene un Arduino Pro Mini 3,3 V 8 MHz o un microprocesador ATmega 328P y los conecta al módulo inalámbrico DRF4432F20 u otro con chip SI4432. Se puede probar todo con solo unos pocos componentes tras el cableado según el esquema.

Notas

La información sobre el uso de Arduino IDE se aplica a la versión 1.0.6.
La PCB está diseñada en el software KiCad.

Lista de componentes:

C1, C2, C3 100n
C4 10u
D1 LED
IC2 ATmega328P-AU
OP1 MCP6042 (MCP6002, MCP6L02)
R1 330R
R3 4k7
R2, R4 10k
R5, R6 1M − ±0,5 %
U1 MCP1700T-3302/TT
WIRELESS1 DRF4432F20 - SI4432

Conclusión

He alcanzado todos los puntos fijados, incluido el tamaño pequeño y el largo tiempo de funcionamiento con batería. Gracias a construir sobre soluciones de código abierto, el desarrollo fue incluso más fluido y rápido de lo que imaginaba con optimismo. Incluso después de alcanzar el objetivo definido quedan otras posibilidades de mejorar el dispositivo. Se podría optimizar de varias maneras. Por ejemplo reducir aún más el tamaño y, idealmente, producirlo de una pieza con el procesador y el chip inalámbrico montados en una sola PCB. O sacar los pines de la CPU a un rail.
Libero el esquema de conexión creado en KiCad y los programas de ejemplo bajo la licencia Creative Commons Attribution ShareAlike 3.0.

Tengo disponibles varias PCB restantes por si le interesa, y también puedo ofrecer otros servicios.

Lista de anexos

  • warduxere.hex – bootloader
  • boards.txt – configuración para Arduino IDE
  • Low-Power.zip
  • RadioHead-1.37.zip
  • Programa Blink
  • Programas Wireless-client y Wireless-server
  • Programa Sleep
  • Programa Battery
  • Imágenes PNG de la PCB y de la configuración
Todos estos archivos están disponibles para descargar en https://github.com/josefjebavy/warduxere

Autor

Autor del artículo y del dispositivo: desarrollador SW&HW Bc. Josef Jebavý
Puede contactar al autor

Primera implementación del dispositivo.
Lado con el amplificador operacional:
warduxere-bottom.jpg
Lado con el procesador:
warduxere-cpu.jpg
El dispositivo terminado tras soldar el módulo inalámbrico:
warduxere-wireless.jpg

Artículos sobre un tema similar

Vibecoding: Cómo programar una buena aplicación con IA
Cómo acelerar la web
Rector: actualización de la aplicación PHP
Lenguaje de programación Go
Análisis de la asignación y fijación de precios del desarrollo de proyectos de software
Programa Python para controlar Docker mediante la API
Cómo utilizar MailCatcher para probar correos electrónicos
API OpenAI de Python
Creación de una aplicación web WebSocket y configuración de un proxy
Gestión de proyectos: desarrollo ágil de software
Cómo ejecutar aplicaciones PHP antiguas
Lo que debe saber un buen programador
Lenguaje de programación Rust
NodeJS: desarrollo, configuración del servidor
Fallo de seguridad de Nette CVE-2020-15227
¿Cómo comparar dos bases de datos iguales?
API REST: API de plataforma
Alojamiento web y de correo personalizado con el software ISP Config
Programación en SQL: PostgreSQL, MySQL/MariaDB
HTTPS: web segura
Base de datos NoSQL Mongo DB
Connecting to Microsoft SQL Server from Linux
¿Cuál es la descripción del trabajo de un programador?
Localización de aplicaciones Python
Qué correo y alojamiento web elegir
Digispark - Programar microcontrolador Atmel ATtiny con Arduino IDE
Programa Ruleta
Desarrollo para procesadores ARM con Arduino IDE
Arduino inalámbrico de bajo consumo
Cómo programar el procesador WiFi ESP8266
Comparación IQRF vs Arduino inalámbrico
¿Qué plataforma debo elegir para mi tienda electrónica? Por ejemplo, Prestashop
Kits de desarrollo y pasarelas para la plataforma inalámbrica IQRF
Kits de desarrollo y pasarelas para la plataforma inalámbrica IQRF

OpenStreetMap y rutas GPS en el mapa de la web
Quickplay
Tarjetas con chip, tanto de contacto como sin contacto, Java Card OpenPlatform
Smartphone abierto con Linux - Openmoko Neo FreeRunner
Desarrollo para módulos inalámbricos con procesador PIC bajo GNU/Linux - IQRF

Boletin informativo

Si está interesado en recibir noticias puntuales por correo electrónico.
Puedes registrarte rellenando tu email suscripción de noticias.


+