quarta-feira, 2 de março de 2022

U-BLOX NINA B302 (ARDUINO BLE 33 SENSE) - MANDANDO MENSAGEM VIA LoRaWAN LOM204 - MODO CLI

U-BLOX NINA B302 (ARDUINO BLE 33 SENSE) - MANDANDO MENSAGEM VIA LoRaWAN LOM204 - MODO CLI


O objetivo deste BLOG é mostrar como é possível programar o U-BLOX NINA B302 com o VISUINO para que possa ter utilizado como um ARDUINO BLE 33 SENSE, mas com um custo reduzido, ou seja, você não precisa colocar todos os sensores. Foi modificado (VISUINO) para que você possa ter acesso a mais GPIOS do U-BLOX NINA B302.

Tenha então acesso por Software aos seguintes sensores/atuadores:

LSM9DS1-9: O LSM9DS1-9chip possui um sensor de aceleração linear digital 3D, um sensor de taxa angular digital 3D e um sensor magnético digital 3D. E é usado para medir a aceleração linear, velocidade angular e força do campo magnético, respectivamente, nos três eixos. A taxa máxima de atualização para o acelerômetro e giroscópio é de 952Hz e até 80 Hz para o magnetômetro.

HTS221: O HTS221 é um sensor ultracompacto para umidade relativa e temperatura. Ele vem com um elemento de sensoriamento e um ASIC de sinal misto (Circuito Integrado Específico de Aplicação) a fim de fornecer informações sobre o ambiente externo através de interfaces seriais digitais.

LPS22HB: O LPS22HB é um sensor de pressão absoluta piezo resistive ultracompacto que funciona como um barômetro de saída digital. O chip vem com um elemento de sensoriamento e uma interface IC que se comunica através da interface I2C ou SPI para a placa Nano.

MP34DT05-A: O MP34DT05-A é um microfone MEMS ultracompacto, de baixa potência, omnidirecional e digital construído com um elemento capacitivo e uma interface IC. O microfone é capaz de detectar ondas acústicas, é fabricado usando um processo especializado de micromaquinação de silício dedicado à produção de sensor de áudio.

No exemplo será enviado a cada 10 segundos a mensagem HELLO para o servidor LoRaWAN (TTN).

VISUINO

Visuino é o mais recente software inovador da Mitov Software. Um ambiente de programação visual que permite programar suas placas Arduino. ... Os componentes encontrados no software Visuino representam seus componentes de hardware e você poderá criar e projetar facilmente seus programas usando arrastar e soltar.

http://www.visuino.com/


Dentro do VISUINO, escolha o BLE 33 SENSE


Como podes observar, o módulo já tem a INTERFACE para os sensores do BLE NANO 33 SENSE, basta ligá-los, seguindo o esquema 



Como transferir o programa para o seu U-BLOX NINA B302 ?

Montamos então uma placa com U-BLOX NINA B302 conforme figura abaixo:


O esquema elétrico é este



Algumas características do Kit

-Botão de RESET;
-Botão de BOOTLOADER (W102/W106);
-Plugável no PROTOBOARD;
-Acesso às várias GPIOS.

Pequena 
72mmX21mm
Muito fácil de utilizar.

Use o gravador SEGGER JLINK para gravar o BREAKOUT com módulo U-BLOX NINA B112 e U-BLOX NINA B302, conecte nos pinos do SWCLK (pino 7) e SWDIO (pino 9) do SEGGER JLINK nos pinos  SWDCLK e SWDIO do BREAKOUT (pinos nas laterais, próximo à antena). Não esquecer de ligar os GND do BREAKOUT no GND do SEGGER JTAG, bem como alimentar o BREAKOUT com 3.3V.



Ligue os pinos SWD DIO e CLK ...
...nestes pinos da placa BREAKOUT

Você pode também usar o ST-LINK V2



Com o software da SEGGER, gravei o BOOTLOADER do NINA BLE 33 SENSE.




Conecte na USB o U-BLOX NINA B302 e você verá uma COMM virtual


Aqui tem-se um projeto no VISUINO que manda um Hello!!! a cada 1 segundo pela UART (USB)


Compilando (seja paciente, é baseado no Mbed compiler)


Gravando

Executando



Altere o 
variant.cpp 
C:\Users\Usuario\AppData\Local\Arduino15\packages\arduino\hardware\mbed\2.6.1\variants\ARDUINO_NANO33BLE
para

#include "Arduino.h" #include "pinDefinitions.h" /* wiring_analog variables definition */ /* Flag to indicate whether the ADC config has been changed from the default one */ bool isAdcConfigChanged = false; /* * Configuration used for all the active ADC channels, it is initialized with the mbed default values * When it is changed, all the ADC channels are reconfigured accordingly */ analogin_config_t adcCurrentConfig = { .resistor_p = NRF_SAADC_RESISTOR_DISABLED, .resistor_n = NRF_SAADC_RESISTOR_DISABLED, .gain = NRF_SAADC_GAIN1_4, .reference = NRF_SAADC_REFERENCE_VDD4, .acq_time = NRF_SAADC_ACQTIME_10US, .mode = NRF_SAADC_MODE_SINGLE_ENDED, .burst = NRF_SAADC_BURST_DISABLED, .pin_p = NRF_SAADC_INPUT_DISABLED, .pin_n = NRF_SAADC_INPUT_DISABLED }; void analogReference(uint8_t mode) { nrf_saadc_reference_t reference = NRF_SAADC_REFERENCE_VDD4; nrf_saadc_gain_t gain = NRF_SAADC_GAIN1_4; if (mode == AR_VDD) { reference = NRF_SAADC_REFERENCE_VDD4; gain = NRF_SAADC_GAIN1_4; } else if (mode == AR_INTERNAL) { reference = NRF_SAADC_REFERENCE_INTERNAL; gain = NRF_SAADC_GAIN1; } else if (mode == AR_INTERNAL1V2) { reference = NRF_SAADC_REFERENCE_INTERNAL; gain = NRF_SAADC_GAIN1_2; } else if (mode == AR_INTERNAL2V4) { reference = NRF_SAADC_REFERENCE_INTERNAL; gain = NRF_SAADC_GAIN1_4; } adcCurrentConfig.reference = reference; adcCurrentConfig.gain = gain; analogUpdate(); } void analogAcquisitionTime(uint8_t time) { nrf_saadc_acqtime_t acqTime = NRF_SAADC_ACQTIME_10US; if (time == AT_3_US) { acqTime = NRF_SAADC_ACQTIME_3US; } else if (time == AT_5_US) { acqTime = NRF_SAADC_ACQTIME_5US; } else if (time == AT_10_US) { acqTime = NRF_SAADC_ACQTIME_10US; } else if (time == AT_15_US) { acqTime = NRF_SAADC_ACQTIME_15US; } else if (time == AT_20_US) { acqTime = NRF_SAADC_ACQTIME_20US; } else if (time == AT_40_US) { acqTime = NRF_SAADC_ACQTIME_40US; } adcCurrentConfig.acq_time = acqTime; analogUpdate(); } AnalogPinDescription g_AAnalogPinDescription[] = { // A0 - A7 { P0_4, NULL }, // A0 { P0_5, NULL }, // A1 { P0_30, NULL }, // A2 { P0_29, NULL }, // A3 { P0_31, NULL }, // A4/SDA { P0_2, NULL }, // A5/SCL { P0_28, NULL }, // A6 { P0_3, NULL } // A7 }; PinDescription g_APinDescription[] = { // D0 - D7 { P1_3, NULL, NULL, NULL }, // D0/TX { P1_10, NULL, NULL, NULL }, // D1/RX { P1_11, NULL, NULL, NULL }, // D2 { P1_12, NULL, NULL, NULL }, // D3 { P1_15, NULL, NULL, NULL }, // D4 { P1_13, NULL, NULL, NULL }, // D5 { P1_14, NULL, NULL, NULL }, // D6 { P0_23, NULL, NULL, NULL }, // D7 // D8 - D13 { P0_21, NULL, NULL, NULL }, // D8 { P0_27, NULL, NULL, NULL }, // D9 { P1_2, NULL, NULL, NULL }, // D10 { P1_1, NULL, NULL, NULL }, // D11/MOSI { P1_8, NULL, NULL, NULL }, // D12/MISO { P0_13, NULL, NULL, NULL }, // D13/SCK/LED // A0 - A7 { P0_4, NULL, NULL, NULL }, // A0 { P0_5, NULL, NULL, NULL }, // A1 { P0_30, NULL, NULL, NULL }, // A2 { P0_29, NULL, NULL, NULL }, // A3 { P0_31, NULL, NULL, NULL }, // A4/SDA { P0_2, NULL, NULL, NULL }, // A5/SCL { P0_28, NULL, NULL, NULL }, // A6 { P0_3, NULL, NULL, NULL }, // A7 // LEDs { P0_24, NULL, NULL, NULL }, // LED R { P0_16, NULL, NULL, NULL }, // LED G { P0_6, NULL, NULL, NULL }, // LED B { P1_9, NULL, NULL, NULL }, // LED PWR { P0_19, NULL, NULL, NULL }, // INT APDS // PDM { P0_17, NULL, NULL, NULL }, // PDM PWR { P0_26, NULL, NULL, NULL }, // PDM CLK { P0_25, NULL, NULL, NULL }, // PDM DIN // Internal I2C { P0_14, NULL, NULL, NULL }, // SDA2 { P0_15, NULL, NULL, NULL }, // SCL2 // Internal I2C { P1_0, NULL, NULL, NULL }, // I2C_PULL { P0_22, NULL, NULL, NULL }, // VDD_ENV_ENABLE // Extras Gpios { P0_23, NULL, NULL, NULL }, //IO47 { P0_21, NULL, NULL, NULL }, //IO48 { P0_20, NULL, NULL, NULL }, //IO50 { P0_7, NULL, NULL, NULL }, //IO45 { P0_12, NULL, NULL, NULL }, //IO46 { P0_11, NULL, NULL, NULL } //IO32 }; extern "C" { unsigned int PINCOUNT_fn() { return (sizeof(g_APinDescription) / sizeof(g_APinDescription[0])); } } #include "nrf_rtc.h" #include "nrf_uarte.h" #include "nrf_uart.h"
void initVariant() { // turn power LED on pinMode(LED_PWR, OUTPUT); digitalWrite(LED_PWR, HIGH); // Errata Nano33BLE - I2C pullup is controlled by the SWO pin. // Configure the TRACEMUX to disable routing SWO signal to pin. NRF_CLOCK->TRACECONFIG = 0; // FIXME: bootloader enables interrupt on COMPARE[0], which we don't handle // Disable it here to avoid getting stuck when OVERFLOW irq is triggered nrf_rtc_event_disable(NRF_RTC1, NRF_RTC_INT_COMPARE0_MASK); nrf_rtc_int_disable(NRF_RTC1, NRF_RTC_INT_COMPARE0_MASK); // FIXME: always enable I2C pullup and power @startup // Change for maximum powersave pinMode(PIN_ENABLE_SENSORS_3V3, OUTPUT); pinMode(PIN_ENABLE_I2C_PULLUP, OUTPUT); digitalWrite(PIN_ENABLE_SENSORS_3V3, HIGH); digitalWrite(PIN_ENABLE_I2C_PULLUP, HIGH); // Disable UARTE0 which is initially enabled by the bootloader nrf_uarte_task_trigger(NRF_UARTE0, NRF_UARTE_TASK_STOPRX); while (!nrf_uarte_event_check(NRF_UARTE0, NRF_UARTE_EVENT_RXTO)) ; NRF_UARTE0->ENABLE = 0; NRF_UART0->ENABLE = 0; NRF_PWM_Type* PWM[] = { NRF_PWM0, NRF_PWM1, NRF_PWM2 #ifdef NRF_PWM3 ,NRF_PWM3 #endif }; for (unsigned int i = 0; i < (sizeof(PWM)/sizeof(PWM[0])); i++) { PWM[i]->ENABLE = 0; PWM[i]->PSEL.OUT[0] = 0xFFFFFFFFUL; } } #ifdef SERIAL_CDC static void utox8(uint32_t val, uint8_t* s) { for (int i = 0; i < 16; i=i+2) { int d = val & 0XF; val = (val >> 4); s[15 - i -1] = d > 9 ? 'A' + d - 10 : '0' + d; s[15 - i] = '\0'; } } uint8_t getUniqueSerialNumber(uint8_t* name) { #define SERIAL_NUMBER_WORD_0 NRF_FICR->DEVICEADDR[1] #define SERIAL_NUMBER_WORD_1 NRF_FICR->DEVICEADDR[0] utox8(SERIAL_NUMBER_WORD_0, &name[0]); utox8(SERIAL_NUMBER_WORD_1, &name[16]); return 32; } void _ontouch1200bps_() { __disable_irq(); NRF_POWER->GPREGRET = DFU_MAGIC_SERIAL_ONLY_RESET; NVIC_SystemReset(); }