Pular para o conteúdo principal

Visão geral de hardware

O Wio WM1110 Dev Kit é uma plataforma de código aberto para criar projetos de IoT. Ele fornece conexão de rede LoRa de baixo consumo de energia e uma gama completa de serviços de cobertura de localização. Este kit também inclui uma variedade de sensores e periféricos, tornando-o uma plataforma versátil para construir projetos de IoT.

Neste tutorial, vamos apresentar a visão geral do hardware e como desenvolver sua própria aplicação!

Visão geral de hardware

O Wio-WM1110 Dev Kit é baseado no Wio-WM1110 Module, integra o transceptor LoRa® da Semtech e um front-end de rádio multiuso para geolocalização, a placa possui um sensor de temperatura e um acelerômetro de 3 eixos integrados, além de fornecer opções de conectividade para uma variedade de periféricos.

pir

Pinout

pir

Comunicação LoRaWAN®

Configure as chaves

Antes que um dispositivo possa se comunicar via NS, precisamos registrá-lo com as 3 chaves.

O Wio-WM1110 DK permite que os usuários definam o DevEUI, AppEUI e AppKey, então você pode configurar seus próprios parâmetros no arquivo 'lorawan_key_config.h' e depois gravá-lo no DK.

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

pir

Exemplo LoRa Basics Modem LoRaWAN® Classe A/C

O aplicativo iniciará automaticamente um procedimento para ingressar em uma rede LoRaWAN, consulte lorawan_key_config.h

Quando uma rede é ingressada (ou seja, quando o evento correspondente é acionado), uplinks são enviados periodicamente. Esta ação periódica é baseada na funcionalidade de alarme do LoRa Basics Modem. Cada vez que o evento relacionado ao alarme é acionado, o aplicativo solicita um uplink.

O conteúdo do uplink é o valor lido do contador de carga chamando smtc_modem_get_charge().

O aplicativo também é capaz de exibir dados e metadados de um downlink recebido.

Configuração

Vários parâmetros podem ser atualizados no arquivo de cabeçalho main_lorawan.h:

ConstanteDescrição
LORAWAN_APP_PORTFPort LoRaWAN® usado para as mensagens de uplink
LORAWAN_CONFIRMED_MSG_ONSolicita uma confirmação do LNS de que a mensagem de uplink foi recebida
APP_TX_DUTYCYCLEAtraso, em segundos, entre dois uplinks

Posicionamento

GNSS

Capturando uma pequena porção do sinal transmitido pelos satélites GNSS e extraindo as informações necessárias para calcular a posição do dispositivo - as pseudo-distâncias. Essas informações são agregadas em uma mensagem NAV que pode ser enviada para um sistema de back-end para calcular a posição do dispositivo.

pir

O scanner GNSS do Wio-WM1110 possui dois modos de operação: autônomo e assistido.

Modo GNSS autônomo: Não requer nenhum dado de localização de assistência ou almanaque, e tem como objetivo detectar sinais fortes de satélite. Portanto, é adequado para condições externas com boa visibilidade do céu.

Modo GNSS assistido:Permite a geolocalização GNSS mais eficiente. As informações de assistência podem construir uma lista dos satélites visíveis no momento e local atuais, a fim de reduzir o espaço de busca dos satélites GNSS e, portanto, otimizar o tempo e a energia gastos na geolocalização. As informações de assistência são adaptadas a uma rede LPWAN, limitando os dados enviados, especialmente o tamanho e a frequência dos downlinks. Ela consiste em:

  • Posição aproximada do LR1110
  • Hora atual
  • Informações de Almanaque atualizadas e de tamanho reduzido (menos de 3 meses)

Exemplo de Geolocalização GNSS

Este exemplo ilustra o procedimento de varredura GNSS:

  • configuração da biblioteca LoRa Basics Modem; e
  • execução do recurso de GNSS scan & send usando o middleware de geolocalização GNSS.

Configuração relacionada à demonstração GNSS

O arquivo de cabeçalho main_geolocation_gnss.h define várias constantes para configurar os parâmetros de geolocalização.

ConstanteComentáriosValores possíveisValor padrão
MODEM_EXAMPLE_ASSISTANCE_POSITION_AUTOSe definido como true: configura o aplicativo para obter automaticamente uma posição de assistênciafalsetrue

Se o modo manual for selecionado para a posição de assistência, as seguintes constantes definem a posição a ser usada.

ConstanteComentáriosValores possíveisValor padrão
MODEM_EXAMPLE_ASSISTANCE_POSITION_LATA latitude a ser usada para a varredura GNSS Assistida (grau decimal)Qualquer float em [-90, 90]45.181454
MODEM_EXAMPLE_ASSISTANCE_POSITION_LONGA longitude a ser usada para a varredura GNSS Assistida (grau decimal)Qualquer float em [-180, 180]5.720893
MODEM_EXAMPLE_ASSISTANCE_POSITION_TEXTUma representação em texto da posição de assistência, apenas para impressão de informaçõesQualquer c-string constante"Grenoble, FRANCE"

Nota: A posição de assistência predefinida deve estar dentro de um raio de 150 km da localização real.

ConstanteComentáriosValores possíveisValor padrão
GNSS_SCAN_GROUP_PERIODDefine a duração entre o final de uma sequência de varredura e envio e o início da próxima sequênciauint32_t30
GNSS_SCAN_MODEDefine o modo de varredura GNSS (estático ou móvel) a ser usado para as sequências de varredura e envio.Valor em gnss_mw_mode_tGNSS_MW_MODE_STATIC

O modo de varredura GNSS selecionado por padrão é GNSS_MW_MODE_STATIC, o que significa que este exemplo de aplicação tem como alvo objetos não móveis.

Wi-Fi

Descobrindo os pontos de acesso Wi-Fi b/g/n disponíveis nas proximidades do dispositivo e extraindo endereços MAC que permitem geolocalizar o dispositivo. O objetivo é obter pelo menos 2 endereços MAC, que podem ser usados para posicionar o dispositivo depois de terem sido enviados para um serviço online de busca de Wi-Fi.

pir

Exemplo de Geolocalização Wi-Fi

Este aplicativo demonstra o uso do middleware de geolocalização Wi-Fi e como o LoRa Basics Modem deve ser configurado para atender aos pré-requisitos para Este exemplo ilustra o procedimento de varredura Wi-Fi:

  • configuração da biblioteca LoRa Basics Modem; e
  • execução do recurso de Wi-Fi scan & send usando o middleware de geolocalização Wi-Fi.

Configuração relacionada à demonstração Wi-Fi

O arquivo de cabeçalho main_geolocation_wifi.h define várias constantes que podem ser definidas para configurar os parâmetros configuráveis do aplicativo.

ConstanteComentáriosValores possíveisValor padrão
WIFI_SCAN_PERIODDefine a duração entre o final de uma sequência de varredura e envio e o início da próxima sequênciauint32_t30

GNSS e Wi-Fi

Exemplo de Geolocalização GNSS e Wi-Fi Este exemplo ilustra a combinação dos procedimentos de varredura GNSS e Wi-Fi:

  • configuração da biblioteca LoRa Basics Modem; e
  • execução concorrente dos recursos GNSS e Wi-Fi scan & send usando o middleware de geolocalização GNSS e o middleware de geolocalização Wi-Fi.

Configuração relacionada à demonstração de geolocalização

O arquivo de cabeçalho main_geolocation_gnss_wifi.h define várias constantes para configurar os parâmetros de geolocalização.

ConstanteComentáriosValores possíveisValor padrão
MODEM_EXAMPLE_ASSISTANCE_POSITION_AUTOSe definido como true: configura o aplicativo para obter automaticamente uma posição de assistênciafalsefalse

Se o modo manual for selecionado para a posição de assistência, as seguintes constantes definem a posição a ser usada.

ConstanteComentáriosValores possíveisValor padrão
MODEM_EXAMPLE_ASSISTANCE_POSITION_LATA latitude a ser usada para a varredura GNSS Assistida (grau decimal)Qualquer float em [-90, 90]45.181454
MODEM_EXAMPLE_ASSISTANCE_POSITION_LONGA longitude a ser usada para a varredura GNSS Assistida (grau decimal)Qualquer float em [-180, 180]5.720893
MODEM_EXAMPLE_ASSISTANCE_POSITION_TEXTUma representação em texto da posição de assistência, apenas para impressão de informaçõesQualquer c-string constante"Grenoble, FRANCE"

Nota: A posição de assistência predefinida deve estar dentro de um raio de 150 km da localização real.

ConstanteComentáriosValores possíveisValor padrão
GNSS_SCAN_GROUP_PERIODDefine a duração entre o fim de uma sequência de varredura e envio e o início da próximauint32_t30
GNSS_SCAN_MODEDefine o modo de varredura GNSS (estático ou móvel) a ser usado para sequências de varredura e envio.Valor em gnss_mw_mode_tGNSS_MW_MODE_MOBILE

O modo de varredura GNSS selecionado por padrão é GNSS_MW_MODE_MOBILE, o que significa que este exemplo de aplicação é voltado para objetos móveis.

BLE

Bluetooth Low Energy (BLE), também conhecido como Bluetooth de Baixa Energia, é uma tecnologia de comunicação sem fio projetada para fornecer um método de comunicação de baixa potência e baixa complexidade para dispositivos que exigem fonte de alimentação de longo prazo, baixas taxas de transferência de dados e curtas distâncias de comunicação. Otimizado com base na tecnologia Bluetooth, o BLE possui menor consumo de energia e uma pilha de protocolos mais simples, tornando-o adequado para aplicações de baixo consumo de energia e de Internet das Coisas (IoT).

O Wio-WM1110 possui Bluetooth Low Energy baseado no chip nRF52840.

Teste com a rotina de Bluetooth

Há um exemplo 'Bluetooth: Peripheral UART' no SDK. O teste exige que você tenha se conectado ao exemplo e tenha o emulador de terminal conectado aberto.

A demonstração de BLE está localizada em: nRF5_SDK_17.1.0_ddde560/examples/ble_peripheral/ble_app_uart/pca10056/s140/ses/

Sensores Embarcados

Sensor de Temperatura e Umidade (SHT41)

O SHT41 é um sensor digital de umidade e temperatura, que se comunica com um microcontrolador ou outro dispositivo digital através de uma interface I2C.

O sensor SHT41 é comumente utilizado em uma ampla gama de aplicações, incluindo sistemas HVAC, estações meteorológicas, monitoramento da qualidade do ar interno e controle de processos industriais. Seu tamanho reduzido, baixo consumo de energia e alta precisão o tornam uma escolha popular para muitos tipos diferentes de projetos.

FaixaPrecisão
Temperatura-40~125°C0.2°C
Umidade0~100%RH1.8%RH

Código:

Este exemplo fornece funções para inicializar o sensor, ler valores de temperatura e umidade e definir a unidade de temperatura.

Aqui está um breve resumo das funções definidas neste código:

SHT41Init: uma função que inicializa o sensor, redefinindo-o e aguardando 1 ms antes de prosseguir.

SHT41GetTemperature, SHT41GetHumidity e SHT41GetTempAndHumi: funções para ler valores de temperatura e/ou umidade do sensor. Essas funções convertem os valores brutos do sensor em um valor float em graus Celsius ou Fahrenheit, dependendo da configuração atual da unidade de temperatura.

SHT41SetTemperatureUnit e SHT41GetTemperatureUnit: funções para definir e obter a unidade de temperatura. crc8: uma função interna que calcula o checksum CRC-8 de um array de bytes.

Acelerômetro de 3 eixos (LIS3DHTR)

O LIS3DHTR é um sensor de alto desempenho que mede a aceleração em três dimensões e fornece leituras precisas e confiáveis.

O sensor LIS3DHTR se comunica com um microcontrolador ou outro dispositivo digital por meio de uma interface I2C ou SPI. Ele também inclui recursos avançados, como interrupções programáveis e uma ampla variedade de modos de economia de energia para ajudar a minimizar o consumo de energia.

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

Grove

Há 3 interfaces Grove no DK, que podem ser conectadas a mais de 400 módulos Grove e suportam os protocolos de transmissão ADC/UART e IIC.

pir

Grove IIC

Há uma porta Grove IIC no DK, com SDA no pino 27 e SCL no pino 26.

pir

Para conectar a um módulo Grove IIC, a alimentação do sensor deve ser ativada: I2C_PWR (pino 7). Este pino controla a tensão de pull-up na linha de sinal IIC:

#define IIC_POWER          7

O TWI precisa ser habilitado no arquivo sdk_config.h antes do 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 exemplo

Este exemplo lê o valor do sensor de Temperatura e Umidade SHT41 através da interface IIC e o imprime no monitor serial.

#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);
}

}

Então você obterá os valores de temperatura e umidade:

pir

Grove UART

O Wio-WM1110 DK possui dois periféricos UART, uart0 e uart1. Os pinos de uart0 são conectados ao CH340C para fins de depuração, enquanto uart1 serve como uma porta Grove UART.

pir

De acordo com o esquemático, TXD está localizado no pino 8 e RXD está no pino 6.

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

Exceto para interfaces analógicas como ADC, o chip nRF52840 possui pinos fixos para outros periféricos digitais. No entanto, outros periféricos digitais podem ser remapeados para qualquer pino. Por exemplo, as configurações dos pinos RXD e TXD podem ser trocadas.

O UART precisa ser habilitado no arquivo sdk_config.h antes do 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 exemplo

O código de exemplo a seguir implementa as funções de transmissão e recepção da porta serial com retorno.

#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

Existem oito periféricos ADC (0~7) no DK, ADC6 e ADC7 são usados como a porta Grove ADCT.

pir

Nota

Os pinos ADC são fixos e não podem ser remapeados.

Os relacionamentos correspondentes para os pinos ADC são mostrados na tabela abaixo:

ADC0ADC1ADC2ADC3ADC4ADC5ADC6ADC7
234528293031

SAADC precisa ser habilitado no arquivo sdk_config.h antes do 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 exemplo

Este é um programa de exemplo para o ADC6, que implementa a função de ler o valor de entrada analógica de um único canal do pino ADC6 e de enviar o valor medido do ADC pela 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

Suporte Técnico

Precisa de ajuda com o seu Wio-WM1110 Dev Kit? Estamos aqui para ajudar você!

Loading Comments...