Skip to main content

Descripción General del Hardware

El Wio WM1110 Dev Kit es una plataforma de código abierto para construir proyectos IoT. Proporciona conexión de red LoRa de bajo consumo y una gama completa de servicios de cobertura de ubicación. Este kit también incluye una variedad de sensores y periféricos, convirtiéndolo en una plataforma versátil para construir proyectos IoT.

En este tutorial, presentaremos la descripción general del hardware y cómo desarrollar tu propia aplicación!

Descripción General del Hardware

El Wio-WM1110 Dev Kit está basado en el Módulo Wio-WM1110, integra el transceptor LoRa® de Semtech y un front-end de radio multipropósito para geolocalización, la placa tiene un sensor TH integrado y un acelerómetro de 3 ejes, también proporciona opciones de conectividad para una variedad de periféricos.

pir

Diagrama de Pines

pir

Comunicación LoRaWAN®

Configurar las claves

Antes de que un dispositivo pueda comunicarse a través del NS, necesitamos registrarlo con las 3 claves.

El Wio-WM1110 DK permite a los usuarios configurar el DevEUI, AppEUI y AppKey, por lo que puedes configurar nuestros propios parámetros en el archivo 'lorawan_key_config.h', luego grabarlo en el DK.

...\Seeed_Wio_WM1110_Dev_Board\apps\common\lorawan_key_config.h

pir

Ejemplo de LoRa Basics Modem LoRaWAN® Clase A/C

La aplicación iniciará automáticamente un procedimiento para unirse a una red LoRaWAN, consulte lorawan_key_config.h

Una vez que se une a una red (es decir, cuando se activa el evento correspondiente), los uplinks se envían periódicamente. Esta acción periódica se basa en la funcionalidad de alarma de LoRa Basics Modem. Cada vez que se activa el evento relacionado con la alarma, la aplicación solicita un uplink.

El contenido del uplink es el valor leído del contador de carga llamando a smtc_modem_get_charge().

La aplicación también es capaz de mostrar datos y metadatos de un downlink recibido.

Configuración

Varios parámetros pueden actualizarse en el archivo de cabecera main_lorawan.h:

ConstanteDescripción
LORAWAN_APP_PORTFPort de LoRaWAN® utilizado para los mensajes de uplink
LORAWAN_CONFIRMED_MSG_ONSolicitar una confirmación del LNS de que el mensaje de uplink ha sido recibido
APP_TX_DUTYCYCLERetraso en segundos entre dos uplinks

Posicionamiento

GNSS

Al capturar una porción corta de la señal transmitida por los satélites GNSS, y extraer la información requerida para calcular la posición del dispositivo - los pseudo-rangos. Esta información se agrega en un mensaje NAV que puede ser enviado a un sistema de back-end para calcular la posición del dispositivo.

pir

El escáner GNSS del Wio-WM1110 tiene dos modos de operación: autónomo y asistido.

Modo autónomo GNSS: No requiere ninguna ubicación de asistencia o datos de almanaque, y tiene como objetivo detectar señales de satélite fuertes. Por lo tanto, es adecuado para condiciones exteriores con buena visibilidad del cielo.

Modo asistido GNSS:Permite la geolocalización GNSS más eficiente. La información de asistencia puede construir una lista de los satélites a la vista en el tiempo y ubicación actuales, con el fin de reducir el espacio de búsqueda de satélites GNSS, y por lo tanto optimizar el tiempo y energía gastados en la geolocalización. La información de asistencia está adaptada a una red LPWAN, limitando los datos enviados, especialmente el tamaño y frecuencia del enlace descendente. Consiste en:

  • Posición aproximada del LR1110
  • Tiempo actual
  • Información de almanaque de tamaño reducido actualizada (menos de 3 meses de antigüedad)

Ejemplo de Geolocalización GNSS

Este ejemplo ilustra el procedimiento de escaneo GNSS:

  • configuración de la biblioteca LoRa Basics Modem; y
  • ejecución de la función escanear y enviar GNSS usando el middleware de geolocalización GNSS.

Configuración relacionada con la demostración GNSS

El archivo de cabecera main_geolocation_gnss.h define varias constantes para configurar los parámetros de geolocalización.

ConstanteComentariosValores posiblesValor por defecto
MODEM_EXAMPLE_ASSISTANCE_POSITION_AUTOSi se establece en true: configura la aplicación para obtener autónomamente una posición de asistenciafalsetrue

Si se selecciona el modo manual para la posición de asistencia, las siguientes constantes definen la posición a utilizar.

ConstanteComentariosValores posiblesValor por defecto
MODEM_EXAMPLE_ASSISTANCE_POSITION_LATLa latitud a usar para el escaneo GNSS Asistido (grado decimal)Cualquier float en [-90, 90]45.181454
MODEM_EXAMPLE_ASSISTANCE_POSITION_LONGLa longitud a usar para el escaneo GNSS Asistido (grado decimal)Cualquier float en [-180, 180]5.720893
MODEM_EXAMPLE_ASSISTANCE_POSITION_TEXTUna representación de texto de la posición de asistencia, solo para impresión de informaciónCualquier cadena c constante"Grenoble, FRANCE"

Nota: La posición de asistencia predefinida debe estar dentro de un rango de 150 km de la ubicación real.

ConstanteComentariosValores posiblesValor por defecto
GNSS_SCAN_GROUP_PERIODDefine la duración entre el final de una secuencia de escaneo y envío y el inicio de la siguiente secuenciauint32_t30
GNSS_SCAN_MODEDefine el modo de escaneo GNSS (estático o móvil) a utilizar para las secuencias de escaneo y envío.Valor en gnss_mw_mode_tGNSS_MW_MODE_STATIC

El modo de escaneo GNSS seleccionado por defecto es GNSS_MW_MODE_STATIC, lo que significa que este ejemplo de aplicación está dirigido a objetos no móviles.

Wi-Fi

Al descubrir los puntos de acceso Wi-Fi b/g/n disponibles en las proximidades del dispositivo, y extraer direcciones MAC que permiten geolocalizar el dispositivo. El objetivo es obtener al menos 2 direcciones MAC, que pueden ser utilizadas para posicionar el dispositivo, después de que hayan sido enviadas a un servicio de búsqueda Wi-Fi en línea

pir

Ejemplo de Geolocalización Wi-Fi

Esta aplicación demuestra el uso del middleware de geolocalización Wi-Fi y cómo debe configurarse el LoRa Basics Modem para cumplir con los requisitos previos para Este ejemplo ilustra el procedimiento de escaneo Wi-Fi:

  • configuración de la biblioteca LoRa Basics Modem; y
  • ejecución de la función escanear y enviar Wi-Fi utilizando el middleware de geolocalización Wi-Fi.

Configuración relacionada con la demostración Wi-Fi

El archivo de cabecera main_geolocation_wifi.h define varias constantes que pueden ser establecidas para definir los parámetros configurables de la aplicación.

ConstanteComentariosValores posiblesValor por defecto
WIFI_SCAN_PERIODDefine la duración entre el final de una secuencia de escaneo y envío y el inicio de la siguiente secuenciauint32_t30

GNSS y Wi-Fi

Ejemplo de geolocalización GNSS y Wi-Fi Este ejemplo ilustra la combinación de procedimientos de escaneo GNSS y Wi-Fi:

  • configuración de la biblioteca LoRa Basics Modem; y
  • ejecución concurrente de las funciones de escaneo y envío de GNSS y Wi-Fi utilizando el middleware de geolocalización GNSS y el middleware de geolocalización Wi-Fi.

Configuración relacionada con la demostración de geolocalización

El archivo de cabecera main_geolocation_gnss_wifi.h define varias constantes para configurar los parámetros de geolocalización.

ConstanteComentariosValores posiblesValor por defecto
MODEM_EXAMPLE_ASSISTANCE_POSITION_AUTOSi se establece en true: configura la aplicación para obtener autónomamente una posición de asistenciafalsefalse

Si se selecciona el modo manual para la posición de asistencia, las siguientes constantes definen la posición a utilizar.

ConstanteComentariosValores posiblesValor por defecto
MODEM_EXAMPLE_ASSISTANCE_POSITION_LATLa latitud a usar para el escaneo GNSS Asistido (grado decimal)Cualquier float en [-90, 90]45.181454
MODEM_EXAMPLE_ASSISTANCE_POSITION_LONGLa longitud a usar para el escaneo GNSS Asistido (grado decimal)Cualquier float en [-180, 180]5.720893
MODEM_EXAMPLE_ASSISTANCE_POSITION_TEXTUna representación de texto de la posición de asistencia, solo para impresión de informaciónCualquier cadena c constante"Grenoble, FRANCE"

Nota: La posición de asistencia predefinida debe estar dentro de un rango de 150 km de la ubicación real.

ConstanteComentariosValores posiblesValor por defecto
GNSS_SCAN_GROUP_PERIODDefine la duración entre el final de una secuencia de escaneo y envío y el inicio de la siguiente secuenciauint32_t30
GNSS_SCAN_MODEDefine el modo de escaneo GNSS (estático o móvil) a utilizar para las secuencias de escaneo y envío.Valor en gnss_mw_mode_tGNSS_MW_MODE_MOBILE

El modo de escaneo GNSS seleccionado por defecto es GNSS_MW_MODE_MOBILE, lo que significa que este ejemplo de aplicación está dirigido a objetos móviles.

BLE

Bluetooth de Baja Energía (BLE), también conocido como Bluetooth Low Energy, es una tecnología de comunicación inalámbrica diseñada para proporcionar un método de comunicación de baja potencia y baja complejidad para dispositivos que requieren alimentación a largo plazo, bajas tasas de transferencia de datos y distancias de comunicación cortas. Optimizado basándose en la tecnología Bluetooth, BLE tiene menor consumo de energía y una pila de protocolos más simple, haciéndolo adecuado para aplicaciones de baja potencia e Internet de las Cosas (IoT).

El Wio-WM1110 tiene un Bluetooth de Baja Energía basado en el chip nRF52840.

Pruebas con la rutina Bluetooth

Hay una muestra de 'Bluetooth: Peripheral UART' en el SDK. La prueba requiere que te hayas conectado a la muestra y tengas abierto el emulador de terminal conectado.

La demostración BLE se encuentra en: nRF5_SDK_17.1.0_ddde560/examples/ble_peripheral/ble_app_uart/pca10056/s140/ses/

Sensores Integrados

Sensor TH(SHT41)

SHT41 es un sensor digital de humedad y temperatura, se comunica con un microcontrolador u otro dispositivo digital a través de una interfaz I2C.

El sensor SHT41 se usa comúnmente en una amplia gama de aplicaciones, incluyendo sistemas HVAC, estaciones meteorológicas, monitoreo de calidad del aire interior y control de procesos industriales. Su tamaño pequeño, bajo consumo de energía y alta precisión lo convierten en una opción popular para muchos tipos diferentes de proyectos.

RangoPrecisión
Temperatura-40~125°C0.2°C
Humedad0~100%RH1.8%RH

Código:

Este ejemplo proporciona funciones para inicializar el sensor, leer valores de temperatura y humedad, y establecer la unidad de temperatura.

Aquí hay un breve resumen de las funciones definidas en este código:

SHT41Init: una función que inicializa el sensor reiniciándolo y esperando 1ms antes de continuar.

SHT41GetTemperature, SHT41GetHumidity, y SHT41GetTempAndHumi: funciones para leer valores de temperatura y/o humedad del sensor. Estas funciones convierten los valores brutos del sensor a un valor flotante en grados Celsius o Fahrenheit, dependiendo de la configuración actual de la unidad de temperatura.

SHT41SetTemperatureUnit y SHT41GetTemperatureUnit: funciones para establecer y obtener la unidad de temperatura. crc8: una función interna que calcula la suma de verificación CRC-8 de un arreglo de bytes.

Acelerómetro de 3 ejes(LIS3DHTR)

El LIS3DHTR es un sensor de alto rendimiento que mide la aceleración en tres dimensiones y proporciona lecturas precisas y confiables.

El sensor LIS3DHTR se comunica con un microcontrolador u otro dispositivo digital a través de una interfaz I2C o SPI. También incluye características avanzadas como interrupciones programables y una amplia gama de modos de ahorro de energía para ayudar a minimizar el consumo de energía.

RangoAncho de bandaSensibilidad(LSB/g)
±2g, 4g, 8g, 16g0.5Hz ~ 625Hz1000 (±2g) ~ 83 (±16g)

Grove

Hay 3 interfaces Grove en el DK, que pueden conectarse a más de 400 módulos Grove, y soporta protocolos de transmisión ADC/UART e IIC.

pir

Grove IIC

Hay un puerto Grove IIC en el DK, con SDA en el pin 27 y SCL en el pin 26.

pir

Para conectar a un módulo Grove IIC, la alimentación del sensor debe estar habilitada:I2C_PWR (pin 7). Este pin controla el voltaje de pull-up en la línea de señal IIC:

#define IIC_POWER          7

TWI necesita ser habilitado en el archivo sdk_config.h antes de su uso.

// <e> TWI_ENABLED - nrf_drv_twi - TWI/TWIM peripheral driver - legacy layer
//==========================================================
#ifndef TWI_ENABLED
#define TWI_ENABLED 1
#endif
// <e> TWI0_ENABLED - Enable TWI0 instance
//==========================================================
#ifndef TWI0_ENABLED
#define TWI0_ENABLED 1
#endif
// <q> TWI0_USE_EASY_DMA - Use EasyDMA (if present)
#ifndef TWI0_USE_EASY_DMA
#define TWI0_USE_EASY_DMA 1
#endif
// </e>
// <e> TWI1_ENABLED - Enable TWI1 instance
//==========================================================
#ifndef TWI1_ENABLED
#define TWI1_ENABLED 1
#endif
// <q> TWI1_USE_EASY_DMA - Use EasyDMA (if present)
#ifndef TWI1_USE_EASY_DMA
#define TWI1_USE_EASY_DMA 1
#endif

Código de ejemplo

Este ejemplo lee el valor del sensor de temperatura y humedad SHT41 a través de la interfaz IIC, y lo imprime en el monitor serie.

#include "nrf_gpio.h"
#include "nrf_gpiote.h"
#include "nrf_drv_gpiote.h"
#include "nrf_delay.h"
#include "app_error.h"
#include "sht41.h"
#include "nrf_drv_twi.h"

int main(void)
{
float temp = 0;
float humi = 0;
hal_i2c_master_init( );
hal_gpio_init_out( SENSOR_POWER, HAL_GPIO_SET );
nrf_delay_ms(10);

SHT41Init();

while(1){
SHT41GetTempAndHumi(&temp,&humi);
nrf_delay_ms(1000);
printf("temperature:%.3f humidity:%.3f\n",temp,humi);
}

}

Entonces obtendrás los valores de temperatura y humedad:

pir

Grove UART

El Wio-WM1110 DK tiene dos periféricos UART, a saber uart0 y uart1. Los pines de uart0 están conectados al CH340C para propósitos de depuración, mientras que uart1 sirve como Puerto Grove UART.

pir

Refiriéndose al esquemático, TXD está ubicado en el pin 8 y RXD está en el pin 6.

#define     LED1                      13
#define LED2 14
#define TXD 8
#define RXD 6
#define UART_TX_RX_BUF_SIZE 256
Nota

Excepto para las interfaces analógicas como ADC, el chip nRF52840 tiene pines fijos para otros periféricos digitales. Sin embargo, otros periféricos digitales pueden ser remapeados a cualquier pin. Por ejemplo, las configuraciones de los pines RXD y TXD pueden intercambiarse.

UART necesita ser habilitado en el archivo sdk_config.h antes de su uso:

/ <e> NRFX_UARTE_ENABLED - nrfx_uarte - UARTE peripheral driver
//==========================================================
#ifndef NRFX_UARTE_ENABLED
#define NRFX_UARTE_ENABLED 1
#endif
// <o> NRFX_UARTE0_ENABLED - Enable UARTE0 instance
#ifndef NRFX_UARTE0_ENABLED
#define NRFX_UARTE0_ENABLED 1
#endif

// <o> NRFX_UARTE1_ENABLED - Enable UARTE1 instance
#ifndef NRFX_UARTE1_ENABLED
#define NRFX_UARTE1_ENABLED 1
#endif

// <e> UART_ENABLED - nrf_drv_uart - UART/UARTE peripheral driver - legacy layer
//==========================================================
#ifndef UART_ENABLED
#define UART_ENABLED 1
#endif

Código de ejemplo

El siguiente código de muestra implementa las funciones de transmisión y recepción del puerto serie con retroalimentación.

#include "nrf_gpio.h"
#include "nrf_gpiote.h"
#include "nrf_drv_gpiote.h"
#include "nrf_delay.h"
#include "smtc_hal.h"
#include "app_uart.h"
#include "app_error.h"
#include "nrf_uart.h"
#include "nrf_drv_uart.h"

static void uart_handleEvent( app_uart_evt_t *pEvent );

APP_UART_DEF( uart, 0, UART_TX_RX_BUF_SIZE, uart_handleEvent );

static app_uart_comm_params_t const commParams =
{
.rx_pin_no = RXD,
.tx_pin_no = TXD,
.rts_pin_no = NRF_UART_PSEL_DISCONNECTED,
.cts_pin_no = NRF_UART_PSEL_DISCONNECTED,
.flow_control = APP_UART_FLOW_CONTROL_DISABLED,
.use_parity = false,
.baud_rate = NRF_UART_BAUDRATE_115200
};

void uart_tx( uint8_t* buff, uint16_t len )
{
for( uint16_t i = 0; i < len; i++ )
{
app_uart_put( &uart, buff[i] );
}
}


int main(void)
{
uint32_t err_code;
uart.comm_params = &commParams;
uint8_t arr[] = "hello world\n";
nrf_gpio_cfg_output(LED1);
nrf_gpio_cfg_output(LED2);
nrf_gpio_pin_clear(LED1);
nrf_gpio_pin_clear(LED2);
app_uart_init( &uart, &uart_buffers, APP_IRQ_PRIORITY_LOWEST );


while( 1 )
{
nrf_delay_ms(1000);
nrf_gpio_pin_toggle(LED2);
uart_tx(arr,strlen(arr));
}
}

void uart_handleEvent(app_uart_evt_t * p_event)
{
uint8_t dat;
if (p_event->evt_type == APP_UART_COMMUNICATION_ERROR)
{
APP_ERROR_HANDLER(p_event->data.error_communication);
}
else if (p_event->evt_type == APP_UART_FIFO_ERROR)
{
APP_ERROR_HANDLER(p_event->data.error_code);
}

else if (p_event->evt_type == APP_UART_DATA_READY)
{
app_uart_get(&uart,&dat);
app_uart_put(&uart,dat);
}
else if (p_event->evt_type == APP_UART_TX_EMPTY)
{
nrf_gpio_pin_toggle(LED1);
}
}

Grove ADC

Hay ocho periféricos ADC (0~7) en el DK, ADC6 y ADC7 se utilizan como Puerto ADCT Grove.

pir

Nota

Los pines ADC están fijos y no se pueden remapear.

Las relaciones correspondientes para los pines ADC se muestran en la tabla a continuación:

ADC0ADC1ADC2ADC3ADC4ADC5ADC6ADC7
234528293031

SAADC necesita ser habilitado en el archivo sdk_config.h antes de su uso:

// <e> SAADC_ENABLED - nrf_drv_saadc - SAADC peripheral driver - legacy layer
//==========================================================
#ifndef SAADC_ENABLED
#define SAADC_ENABLED 1
#endif
// <e> NRFX_SAADC_ENABLED - nrfx_saadc - SAADC peripheral driver
//==========================================================
#ifndef NRFX_SAADC_ENABLED
#define NRFX_SAADC_ENABLED 1
#endif
// <o> SAADC_CONFIG_RESOLUTION - Resolution

// <0=> 8 bit
// <1=> 10 bit
// <2=> 12 bit
// <3=> 14 bit

#ifndef SAADC_CONFIG_RESOLUTION
#define SAADC_CONFIG_RESOLUTION 2
#endif

Código de ejemplo

Este es un programa de ejemplo para ADC6, que implementa la función de leer el valor de entrada analógica de un solo canal del pin ADC6 y enviar el valor ADC medido a través del UART:

#include "nrf_gpio.h"
#include "nrf_gpiote.h"
#include "nrf_drv_gpiote.h"
#include "nrf_delay.h"
#include "app_uart.h"
#include "app_error.h"
#include "nrf_uart.h"
#include "nrf_drv_uart.h"
#include "nrf_drv_saadc.h"
#define LED1 13
#define LED2 14
#define TXD 8
#define RXD 6
#define UART_TX_RX_BUF_SIZE 256

static void uart_handleEvent( app_uart_evt_t *pEvent );

APP_UART_DEF( uart, 0, UART_TX_RX_BUF_SIZE, uart_handleEvent );

static app_uart_comm_params_t const commParams =
{
.rx_pin_no = RXD,
.tx_pin_no = TXD,
.rts_pin_no = NRF_UART_PSEL_DISCONNECTED,
.cts_pin_no = NRF_UART_PSEL_DISCONNECTED,
.flow_control = APP_UART_FLOW_CONTROL_DISABLED,
.use_parity = false,
.baud_rate = NRF_UART_BAUDRATE_115200
};

void uart_tx( uint8_t* buff, uint16_t len )
{
for( uint16_t i = 0; i < len; i++ )
{
app_uart_put( &uart, buff[i] );
}
}

void ADC_Interrupt(nrfx_saadc_evt_t const *p_event){

}

void uart_handleEvent(app_uart_evt_t * p_event)
{
uint8_t dat;
if (p_event->evt_type == APP_UART_COMMUNICATION_ERROR)
{
APP_ERROR_HANDLER(p_event->data.error_communication);
}
else if (p_event->evt_type == APP_UART_FIFO_ERROR)
{
APP_ERROR_HANDLER(p_event->data.error_code);
}

else if (p_event->evt_type == APP_UART_DATA_READY)
{
app_uart_get(&uart,&dat);
//app_uart_put(&uart,dat);
}
else if (p_event->evt_type == APP_UART_TX_EMPTY)
{
//nrf_gpio_pin_toggle(LED1);
}
}

int main(void)
{
nrf_saadc_value_t saadc_val = 0;
uint8_t arr[32];
nrf_saadc_channel_config_t channel_config =
{
.resistor_p = NRF_SAADC_RESISTOR_DISABLED,
.resistor_n = NRF_SAADC_RESISTOR_DISABLED,
.gain = NRF_SAADC_GAIN1_6,
.reference = NRF_SAADC_REFERENCE_INTERNAL,
.acq_time = NRF_SAADC_ACQTIME_10US,
.mode = NRF_SAADC_MODE_SINGLE_ENDED,
.burst = NRF_SAADC_BURST_DISABLED,
.pin_p = NRF_SAADC_INPUT_AIN6,
.pin_n = NRF_SAADC_INPUT_DISABLED
};

nrf_drv_saadc_init(NULL, ADC_Interrupt);
nrf_drv_saadc_channel_init(0, &channel_config);

uart.comm_params = &commParams;
app_uart_init( &uart, &uart_buffers, APP_IRQ_PRIORITY_LOWEST );

nrf_gpio_cfg_output(LED2);
while( 1 )
{
nrf_drv_saadc_sample_convert (0,&saadc_val);
sprintf(arr,"value:%d\n",saadc_val);
uart_tx(arr,strlen(arr));
nrf_delay_ms(1000);
nrf_gpio_pin_toggle(LED2);
}
}

Recursos

Seeed_Wio_WM1110_Dev_Board

nRF5-SDK

Soporte Técnico

¿Necesitas ayuda con tu Wio-WM1110 Dev Kit? ¡Estamos aquí para asistirte!

Loading Comments...